[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\n# don't trim whitespace within (say) a Pkl multiline string\ntrim_trailing_whitespace = false\ninsert_final_newline = true\nmax_line_length = 100\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# Auto-format Kotlin code\n816cd483c8adf4c04e14236c173a1dc6bd2579ea\n"
  },
  {
    "path": ".gitattributes",
    "content": "# linguist-generated would suppress files in diffs\n**/src/test/files/** linguist-vendored\n.github/workflows/* linguist-generated\n\n/docs/** linguist-documentation\n\n*.pcf linguist-language=Pkl\nPklProject linguist-language=Pkl\n\n* text eol=lf\n*.bat text eol=crlf\n\n*.gif binary\n*.jar binary\n*.woff2 binary\n*.pem binary\n*.png binary\n"
  },
  {
    "path": ".githooks/pre-commit",
    "content": "#!/bin/sh\n\nfiles=`git diff --cached --name-status`\n\nif [[ $files =~ .github/* ]]; then\n  pkl eval --project-dir .github/ -m .github .github/index.pkl\n  git add .github/workflows/\nfi\n"
  },
  {
    "path": ".github/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"pkl.impl.ghactions\"] {\n    uri = \"package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@1.5.0\"\n  }\n  [\"gha\"] {\n    uri = \"package://pkg.pkl-lang.org/pkl-pantry/com.github.actions@1.2.0\"\n  }\n}\n"
  },
  {
    "path": ".github/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://pkg.pkl-lang.org/pkl-pantry/com.github.actions@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://pkg.pkl-lang.org/pkl-pantry/com.github.actions@1.3.1\",\n      \"checksums\": {\n        \"sha256\": \"fd515da685ea126678c3ec684e84a4f992d43481cc1d75cb866cd55775f675f9\"\n      }\n    },\n    \"package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.ghactions@1.5.0\",\n      \"checksums\": {\n        \"sha256\": \"2c1e0d9efcd65b3c3207bf535c325ebc0ec2ab169187b324c4bb70821cac0e51\"\n      }\n    },\n    \"package://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.deepToTyped@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://pkg.pkl-lang.org/pkl-pantry/pkl.experimental.deepToTyped@1.2.0\",\n      \"checksums\": {\n        \"sha256\": \"84c7feb391f4ac273a99dc89b8fd51dbcd21dbda4ce640f6908527f83acdd4d6\"\n      }\n    },\n    \"package://pkg.pkl-lang.org/pkl-pantry/pkl.github.dependabotManagedActions@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://pkg.pkl-lang.org/pkl-pantry/pkl.github.dependabotManagedActions@1.0.3\",\n      \"checksums\": {\n        \"sha256\": \"d368900942efb88ed51a98f9614748b06c74ba43423f045fcd6dedb5dbdc0bea\"\n      }\n    },\n    \"package://pkg.pkl-lang.org/pkl-pantry/com.github.dependabot@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://pkg.pkl-lang.org/pkl-pantry/com.github.dependabot@1.0.0\",\n      \"checksums\": {\n        \"sha256\": \"02ef6f25bfca5b1d095db73ea15de79d2d2c6832ebcab61e6aba90554382abcb\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: github-actions\n  directory: /\n  ignore:\n  - dependency-name: '*'\n    update-types:\n    - version-update:semver-major\n  schedule:\n    interval: weekly\n"
  },
  {
    "path": ".github/index.pkl",
    "content": "amends \"@pkl.impl.ghactions/PklCI.pkl\"\n\nimport \"@gha/Workflow.pkl\"\n\nimport \"jobs/BuildJavaExecutableJob.pkl\"\nimport \"jobs/BuildNativeJob.pkl\"\nimport \"jobs/DeployJob.pkl\"\nimport \"jobs/GithubRelease.pkl\"\nimport \"jobs/GradleJob.pkl\"\nimport \"jobs/PklJob.pkl\"\nimport \"jobs/SimpleGradleJob.pkl\"\n\ntriggerDocsBuild = \"both\"\n\ntestReports {\n  junit {\n    \"**/build/test-results/**/*.xml\"\n  }\n  html {\n    \"**/build/reports/tests/**/*\"\n  }\n  excludeJobs {\n    \"bench\"\n    \"github-release\"\n    Regex(\"deploy-.*\")\n  }\n}\n\nlocal baseGradleCheck: SimpleGradleJob = new {\n  isRelease = false\n  command = \"check\"\n  fetchDepth = 0\n}\n\nlocal gradleCheck = (baseGradleCheck) {\n  os = \"linux\"\n}\n\nlocal gradleCheckWindows = (baseGradleCheck) {\n  os = \"windows\"\n}\n\nlocal typealias PklJobs = Mapping<String, PklJob>\n\nlocal toWorkflowJobs: (PklJobs) -> Workflow.Jobs = (it) -> new Workflow.Jobs {\n  for (k, v in it) {\n    [k] = v.job\n  }\n}\n\nlocal gradleCheckJobs: PklJobs = new {\n  [\"gradle-check\"] = gradleCheck\n  [\"gradle-check-windows\"] = gradleCheckWindows\n}\n\nlocal buildNativeJobs: Mapping<String, BuildNativeJob> = new {\n  for (_dist in List(\"release\", \"snapshot\")) {\n    for (_project in List(\"pkl-cli\", \"pkl-doc\")) {\n      for (_arch in List(\"amd64\", \"aarch64\")) {\n        for (_os in List(\"macOS\", \"linux\")) {\n          [\"\\(_project)-\\(_os)-\\(_arch)-\\(_dist)\"] {\n            arch = _arch\n            os = _os\n            isRelease = _dist == \"release\"\n            project = _project\n          }\n        }\n      }\n      [\"\\(_project)-alpine-linux-amd64-\\(_dist)\"] {\n        arch = \"amd64\"\n        os = \"linux\"\n        musl = true\n        isRelease = _dist == \"release\"\n        project = _project\n      }\n      [\"\\(_project)-windows-amd64-\\(_dist)\"] {\n        arch = \"amd64\"\n        os = \"windows\"\n        isRelease = _dist == \"release\"\n        project = _project\n      }\n    }\n  }\n}\n\nlocal buildNativeSnapshots = buildNativeJobs.toMap().filter((key, _) -> key.endsWith(\"snapshot\"))\n\nlocal buildNativeReleases = buildNativeJobs.toMap().filter((key, _) -> key.endsWith(\"release\"))\n\nlocal benchmarkJob: SimpleGradleJob = new { command = \"bench:jmh\" }\n\nlocal gradleCompatibilityJob: SimpleGradleJob = new {\n  command = \":pkl-gradle:build :pkl-gradle:compatibilityTestReleases\"\n  fetchDepth = 0\n}\n\nlocal buildJavaExecutableJob: BuildJavaExecutableJob = new {\n  fetchDepth = 0\n}\n\nlocal buildAndTestJobs: PklJobs = new {\n  ...gradleCheckJobs\n  [\"bench\"] = benchmarkJob\n  [\"gradle-compatibility\"] = gradleCompatibilityJob\n  [\"java-executables-snapshot\"] = (buildJavaExecutableJob) { isRelease = false }\n  ...buildNativeSnapshots\n}\n\nlocal releaseJobs: PklJobs = new {\n  ...gradleCheckJobs\n  [\"bench\"] = benchmarkJob\n  [\"gradle-compatibility\"] = gradleCompatibilityJob\n  [\"java-executables-release\"] = (buildJavaExecutableJob) { isRelease = true }\n  ...buildNativeReleases\n}\n\n// By default, just run ./gradlew check on linux.\n// Trigger other checks based on GitHub PR description. Examples:\n//\n//    * [windows]                     -- Test on Windows\n//    * [native]                      -- Test all native builds\n//    * [native-pkl-cli]              -- Test all pkl-cli os/arch pairs\n//    * [native-pkl-cli-macos]        -- Test pkl-cli on macOS\nprb {\n  local prbJobs: Mapping<String, GradleJob> = new {\n    [\"gradle-check\"] = gradleCheck\n    [\"gradle-check-windows\"] = (gradleCheckWindows) {\n      `if` = \"contains(github.event.pull_request.body, '[windows]')\"\n    }\n    for (jobName, job in buildNativeSnapshots) {\n      [jobName] = (job) {\n        local tags = new Listing {\n          \"[native]\"\n          \"[native-\\(job.project)]\"\n          \"[native-\\(job.project)-\\(job.os)]\"\n          \"[native-\\(job.project)-\\(job.os)-\\(job.arch)]\"\n          \"[native-\\(job.project)-\\(job.os)-\\(job.arch)]\"\n          when (job.musl) {\n            \"[native-\\(job.project)-alpine-\\(job.os)-\\(job.arch)]\"\n          }\n        }\n        `if` =\n          tags\n            .toList()\n            .map((it) -> \"contains(github.event.pull_request.body, '\\(it)')\")\n            .join(\" || \")\n      }\n    }\n  }\n  local prbJobs2 = (prbJobs) {\n    [[true]] {\n      // better SLA when not running on nightly\n      nightlyMacOS = false\n    }\n  }\n  jobs = prbJobs2 |> toWorkflowJobs\n}\n\nbuild {\n  jobs = buildAndTestJobs |> toWorkflowJobs\n}\n\nmain {\n  jobs =\n    (buildAndTestJobs) {\n      [\"deploy-snapshot\"] = (\n        new DeployJob {\n          extraGradleArgs {\n            \"--no-parallel\"\n          }\n          command = \"publishToSonatype\"\n        }\n      ) {\n        needs = buildAndTestJobs.keys.toListing()\n      }\n    } |> toWorkflowJobs\n}\n\nreleaseBranch {\n  jobs = releaseJobs |> toWorkflowJobs\n}\n\nrelease {\n  jobs =\n    (releaseJobs) {\n      [\"deploy-release\"] = (\n        new DeployJob {\n          isRelease = true\n          command = \"publishToSonatype closeAndReleaseSonatypeStagingRepository\"\n        }\n      ) {\n        needs = releaseJobs.keys.toListing()\n      }\n      [\"github-release\"] = new GithubRelease {\n        needs = \"deploy-release\"\n      }\n    } |> toWorkflowJobs\n}\n"
  },
  {
    "path": ".github/jobs/BuildJavaExecutableJob.pkl",
    "content": "extends \"GradleJob.pkl\"\n\nimport \"@gha/catalog.pkl\"\n\n// Keep this in sync with projects that build java executables\nlocal projects: List<String> = List(\"pkl-doc\", \"pkl-cli\", \"pkl-codegen-java\", \"pkl-codegen-kotlin\")\n\nlocal command =\n  new Listing<String> {\n    \"./gradlew\"\n    module.gradleArgs\n    for (project in projects) {\n      // NOTE: `build` doesn't build native executables\n      \"\\(project):build\"\n    }\n  }.join(\" \")\n\nsteps {\n  catalog.`actions/checkout@v6`\n  new {\n    name = \"gradle build java executables\"\n    shell = \"bash\"\n    run = command\n  }\n  (catalog.`actions/upload-artifact@v5`) {\n    name = \"Upload executable artifacts\"\n    with {\n      name = \"executable-java\"\n      path = \"*/build/executable/**/*\"\n    }\n  }\n}\n"
  },
  {
    "path": ".github/jobs/BuildNativeJob.pkl",
    "content": "extends \"GradleJob.pkl\"\n\nimport \"@gha/catalog.pkl\"\nimport \"@gha/context.pkl\"\n\n/// Whether to link to musl. Otherwise, links to glibc.\nmusl: Boolean(implies(module.os == \"linux\")) = false\n\n/// The Gradle project under which to generate the executable\nproject: String\n\nextraGradleArgs {\n  when (os == \"macOS\" && arch == \"amd64\") {\n    \"-Dpkl.targetArch=\\(module.arch)\"\n    #\"\"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\"\"#\n  }\n  when (musl) {\n    \"-Dpkl.musl=true\"\n  }\n}\n\npreSteps {\n  when (os == \"linux\" && !musl) {\n    new {\n      name = \"Install deps\"\n      run = \"dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\"\n    }\n  }\n}\n\nsteps {\n  when (musl) {\n    new {\n      name = \"Install musl and zlib\"\n      run = read(\"../scripts/install_musl.sh\").text\n    }\n  }\n  // workaround for https://github.com/actions/checkout/issues/1048\n  when (os == \"linux\" && !musl) {\n    new {\n      name = \"Fix git ownership\"\n      // language=bash\n      run = #\"git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\"#\n    }\n  }\n  new {\n    name = \"gradle buildNative\"\n    shell = \"bash\"\n    run = \"./gradlew \\(module.gradleArgs) \\(project):buildNative\"\n  }\n  (catalog.`actions/upload-artifact@v5`) {\n    name = \"Upload executable artifacts\"\n    with {\n      name =\n        if (musl)\n          \"executable-\\(project)-alpine-\\(module.os)-\\(module.arch)\"\n        else\n          \"executable-\\(project)-\\(module.os)-\\(module.arch)\"\n      // Need to insert a wildcard to make actions/upload-artifact preserve the folder hierarchy.\n      // See https://github.com/actions/upload-artifact/issues/206\n      path = \"\\(project)*/build/executable/**/*\"\n    }\n  }\n}\n\nfixed job {\n  when (os == \"linux\" && !musl) {\n    container {\n      image = \"redhat/ubi8:8.10\"\n    }\n  }\n}\n"
  },
  {
    "path": ".github/jobs/DeployJob.pkl",
    "content": "extends \"GradleJob.pkl\"\n\nimport \"@gha/catalog.pkl\"\nimport \"@gha/Workflow.pkl\"\nimport \"@pkl.impl.ghactions/helpers.pkl\"\n\nlocal self = this\n\ncommand: String\n\narch = \"amd64\"\n\nos = \"linux\"\n\nsteps {\n  catalog.`actions/checkout@v6`\n  (catalog.`actions/download-artifact@v6`) {\n    with {\n      pattern = \"executable-**\"\n      `merge-multiple` = true\n    }\n  }\n  new Workflow.Step {\n    run = \"./gradlew \\(self.gradleArgs) \\(module.command)\"\n  }\n    |> helpers.withMavenPublishSecrets\n}\n\nfixed job {\n  environment = \"maven-release\"\n}\n"
  },
  {
    "path": ".github/jobs/GithubRelease.pkl",
    "content": "module GithubRelease\n\nextends \"PklJob.pkl\"\n\nimport \"@gha/catalog.pkl\"\nimport \"@gha/context.pkl\"\n\nfixed job {\n  `runs-on` = \"ubuntu-latest\"\n  permissions {\n    contents = \"write\"\n  }\n  needs = \"deploy-release\"\n  steps {\n    (catalog.`actions/download-artifact@v6`) {\n      with {\n        pattern = \"executable-**\"\n        `merge-multiple` = true\n      }\n    }\n    new {\n      name = \"Publish release on GitHub\"\n      env {\n        [\"GH_TOKEN\"] = context.github.token\n        [\"TAG_NAME\"] = context.github.refName\n        [\"GIT_SHA\"] = context.github.sha\n        [\"GH_REPO\"] = context.github.repository\n      }\n      // language=bash\n      run =\n        #\"\"\"\n        # exclude build_artifacts.txt from publish\n        rm -f */build/executable/*.build_artifacts.txt\n        find */build/executable/* -type d | xargs rm -rf\n        gh release create ${TAG_NAME} \\\n          --title \"${TAG_NAME}\" \\\n          --target \"${GIT_SHA}\" \\\n          --verify-tag \\\n          --notes \"Release notes: https://pkl-lang.org/main/current/release-notes/changelog.html#release-${TAG_NAME}\" \\\n          */build/executable/*\n        \"\"\"#\n    }\n  }\n}\n"
  },
  {
    "path": ".github/jobs/GradleJob.pkl",
    "content": "abstract module GradleJob\n\nextends \"PklJob.pkl\"\n\nimport \"@gha/Workflow.pkl\"\nimport \"@pkl.impl.ghactions/catalog.pkl\"\n\n/// Whether this is a release build or not.\nisRelease: Boolean = false\n\n/// The architecture to use\narch: \"amd64\" | \"aarch64\" = \"amd64\"\n\n/// The OS to run on.\nos: \"macOS\" | \"linux\" | \"windows\" = \"linux\"\n\n// TODO flip this to `true` when nightly macOS is available\n/// Whether to run on nightly macOS.\nnightlyMacOS: Boolean(implies(os == \"macOS\")) = false\n\nextraGradleArgs: Listing<String>\n\nsteps: Listing<Workflow.Step>\n\npreSteps: Listing<Workflow.Step>\n\n/// The fetch depth to use when doing a git checkout.\nfetchDepth: Int?\n\nfixed gradleArgs =\n  new Listing {\n    \"--info\"\n    \"--stacktrace\"\n    \"--no-daemon\"\n    \"-DpklMultiJdkTesting=true\"\n    when (isRelease) {\n      \"-DreleaseBuild=true\"\n    }\n    ...extraGradleArgs\n  }.join(\" \")\n\nfixed job {\n  env {\n    [\"LANG\"] = \"en_US.UTF-8\"\n    when (os == \"windows\") {\n      [\"JAVA_HOME\"] = \"/jdk\"\n    }\n  }\n  when (os == \"macOS\") {\n    `if` =\n      let (cond = \"github.repository_owner == 'apple'\")\n        if (super.`if` != null)\n          \"(\\(super.`if`)) && \\(cond)\"\n        else\n          cond\n  }\n  `runs-on` =\n    if (os == \"linux\" && arch == \"amd64\")\n      \"ubuntu-latest\"\n    else if (os == \"linux\" && arch == \"aarch64\")\n      \"ubuntu-24.04-arm\"\n    else if (os == \"windows\")\n      \"windows-latest\"\n    else\n      new Listing {\n        \"self-hosted\"\n        \"macos\"\n        when (nightlyMacOS) {\n          \"nightly\"\n        }\n      }\n  steps {\n    ...preSteps\n    // full checkout (needed for spotless)\n    (catalog.`actions/checkout@v6`) {\n      when (fetchDepth != null) {\n        with {\n          `fetch-depth` = fetchDepth\n        }\n      }\n    }\n    (catalog.`actions/setup-java@v5`) {\n      with {\n        `java-version` = \"21\"\n        distribution = \"temurin\"\n        architecture =\n          if (arch == \"amd64\")\n            \"x64\"\n          else\n            \"aarch64\"\n      }\n    }\n    catalog.`gradle/actions/setup-gradle@v5`\n    ...module.steps\n  }\n}\n"
  },
  {
    "path": ".github/jobs/PklJob.pkl",
    "content": "abstract module PklJob\n\nextends \"@pkl.impl.ghactions/jobs/PklJob.pkl\"\n\n/// Identify any jobs that must complete successfully before this job will run.\n///\n/// It can be a string or array of strings.\n/// If a job fails or is skipped, all jobs that need it are skipped unless the jobs use a conditional expression that\n/// causes the job to continue.\n/// If a run contains a series of jobs that need each other, a failure or skip applies to all jobs in the dependency\n/// chain from the point of failure or skip onwards. If you would like a job to run even if a job it is dependent on\n/// did not succeed, use the `always()` conditional expression in `jobs.<job_id>.if`.\n///\n/// See: <https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds>\nneeds: (String | *Listing<String>)?\n\n/// A conditional to prevent a job from running unless a condition is met.\n///\n/// You can use any supported context and expression to create a conditional.\n/// For more information on which contexts are supported in this key, see\n/// [Contexts reference](https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#context-availability).\n@SourceCode { language = \"GithubExpressionLanguage\" }\n`if`: String?\n\n/// The underlying workflow job\nfixed job {\n  `if` = module.`if`\n  needs = module.needs\n}\n"
  },
  {
    "path": ".github/jobs/SimpleGradleJob.pkl",
    "content": "extends \"GradleJob.pkl\"\n\nname: String = command\n\ncommand: String\n\nos = \"linux\"\n\nsteps {\n  new {\n    name = module.name\n    shell = \"bash\"\n    run =\n      \"\"\"\n      ./gradlew \\(module.gradleArgs) \\(module.command)\n      \"\"\"\n  }\n}\n"
  },
  {
    "path": ".github/scripts/cc_macos_amd64.sh",
    "content": "#!/usr/bin/env bash\nclang -arch x86_64 \"$@\"\n"
  },
  {
    "path": ".github/scripts/install_musl.sh",
    "content": "set -e\nmkdir -p ~/staticdeps/\n\nZLIB_VERSION=\"1.2.13\"\nMUSL_VERSION=\"1.2.5\"\n\n# install zlib\nif [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n  # Download zlib tarball and signature\n  curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n  curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n  # Import zlib GPG key\n  gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n  # Verify GPG signature\n  echo \"Verifying zlib GPG signature...\"\n  gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n  mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n  cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n  # shellcheck disable=SC2002\n  cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n  echo \"zlib-${ZLIB_VERSION}: configure...\" \n  ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n  echo \"zlib-${ZLIB_VERSION}: make...\" \n  make -s -j4\n\n  echo \"zlib-${ZLIB_VERSION}: make install...\" \n  make -s install\n\n  rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\nfi\n\n# install musl\nif [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n  # Download musl tarball and signature\n  curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n  curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n  # Import musl GPG key\n  gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n  # Verify GPG signature\n  echo \"Verifying musl GPG signature...\"\n  gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n  mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n  cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n  # shellcheck disable=SC2002\n  cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n  echo \"musl-${MUSL_VERSION}: configure...\" \n  ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n  echo \"musl-${MUSL_VERSION}: make...\" \n  make -s -j4\n\n  echo \"musl-${MUSL_VERSION}: make install...\" \n  make -s install\n\n  rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n  # native-image expects to find an executable at this path.\n  ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\nfi\n\necho \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n"
  },
  {
    "path": ".github/workflows/__lockfile__.yml",
    "content": "#file: noinspection MandatoryParamsAbsent,UndefinedAction\n# This is a fake workflow that never runs.\n# It's used to pin actions to specific git SHAs when generating actual workflows.\n# It also gets updated by dependabot (see .github/dependabot.yml).\n# Generated from Workflow.pkl. DO NOT EDIT.\nname: __lockfile__\n'on':\n  push:\n    branches-ignore:\n    - '**'\n    tags-ignore:\n    - '**'\npermissions: {}\njobs:\n  locks:\n    if: 'false'\n    runs-on: nothing\n    steps:\n    - name: EnricoMi/publish-unit-test-result-action@v2\n      uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # v2\n    - name: actions/checkout@v6\n      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n    - name: actions/create-github-app-token@v2\n      uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2\n    - name: actions/download-artifact@v6\n      uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n    - name: actions/setup-java@v5\n      uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n    - name: actions/upload-artifact@v5\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n    - name: dawidd6/action-download-artifact@v11\n      uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11\n    - name: gradle/actions/setup-gradle@v5\n      uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "# Generated from Workflow.pkl. DO NOT EDIT.\nname: Build\n'on':\n  push:\n    branches-ignore:\n    - main\n    - release/*\n    - dependabot/**\n    tags-ignore:\n    - '**'\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: false\npermissions:\n  contents: read\njobs:\n  gradle-check:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  gradle-check-windows:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check-windows\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check-windows\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  bench:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: bench:jmh\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true bench:jmh\n  gradle-compatibility:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-compatibility\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-compatibility\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  java-executables-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - name: gradle build java executables\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:build pkl-cli:build pkl-codegen-java:build pkl-codegen-kotlin:build\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-java\n        path: '*/build/executable/**/*'\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-java-executables-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-java-executables-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-macOS-amd64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-macOS-aarch64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-aarch64-snapshot:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-alpine-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-alpine-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-windows-amd64-snapshot:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-windows-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-macOS-amd64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-macOS-aarch64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-aarch64-snapshot:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-alpine-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-alpine-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-windows-amd64-snapshot:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-windows-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  publish-test-results:\n    if: '!cancelled()'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - gradle-compatibility\n    - java-executables-snapshot\n    - pkl-cli-macOS-amd64-snapshot\n    - pkl-cli-linux-amd64-snapshot\n    - pkl-cli-macOS-aarch64-snapshot\n    - pkl-cli-linux-aarch64-snapshot\n    - pkl-cli-alpine-linux-amd64-snapshot\n    - pkl-cli-windows-amd64-snapshot\n    - pkl-doc-macOS-amd64-snapshot\n    - pkl-doc-linux-amd64-snapshot\n    - pkl-doc-macOS-aarch64-snapshot\n    - pkl-doc-linux-aarch64-snapshot\n    - pkl-doc-alpine-linux-amd64-snapshot\n    - pkl-doc-windows-amd64-snapshot\n    permissions:\n      checks: write\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: test-results-xml-*\n    - name: Publish test results\n      if: '!cancelled()'\n      uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # v2\n      with:\n        comment_mode: 'off'\n        files: test-results-xml-*/**/*.xml\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-publish-test-results\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "# Generated from Workflow.pkl. DO NOT EDIT.\nname: Build (main)\n'on':\n  push:\n    branches:\n    - main\n    tags-ignore:\n    - '**'\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: false\npermissions:\n  contents: read\njobs:\n  gradle-check:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  gradle-check-windows:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check-windows\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check-windows\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  bench:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: bench:jmh\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true bench:jmh\n  gradle-compatibility:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-compatibility\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-compatibility\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  java-executables-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - name: gradle build java executables\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:build pkl-cli:build pkl-codegen-java:build pkl-codegen-kotlin:build\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-java\n        path: '*/build/executable/**/*'\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-java-executables-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-java-executables-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-macOS-amd64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-macOS-aarch64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-aarch64-snapshot:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-alpine-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-alpine-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-windows-amd64-snapshot:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-windows-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-macOS-amd64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-macOS-aarch64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-aarch64-snapshot:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-alpine-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-alpine-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-windows-amd64-snapshot:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-windows-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  deploy-snapshot:\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - bench\n    - gradle-compatibility\n    - java-executables-snapshot\n    - pkl-cli-macOS-amd64-snapshot\n    - pkl-cli-linux-amd64-snapshot\n    - pkl-cli-macOS-aarch64-snapshot\n    - pkl-cli-linux-aarch64-snapshot\n    - pkl-cli-alpine-linux-amd64-snapshot\n    - pkl-cli-windows-amd64-snapshot\n    - pkl-doc-macOS-amd64-snapshot\n    - pkl-doc-linux-amd64-snapshot\n    - pkl-doc-macOS-aarch64-snapshot\n    - pkl-doc-linux-aarch64-snapshot\n    - pkl-doc-alpine-linux-amd64-snapshot\n    - pkl-doc-windows-amd64-snapshot\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    environment: maven-release\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: executable-**\n        merge-multiple: true\n    - env:\n        ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGKEYID }}\n        ORG_GRADLE_PROJECT_signingKey: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGKEY }}\n        ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGPASSWORD }}\n        ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPEPASSWORD }}\n        ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPEUSERNAME }}\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true --no-parallel publishToSonatype\n  publish-test-results:\n    if: '!cancelled()'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - gradle-compatibility\n    - java-executables-snapshot\n    - pkl-cli-macOS-amd64-snapshot\n    - pkl-cli-linux-amd64-snapshot\n    - pkl-cli-macOS-aarch64-snapshot\n    - pkl-cli-linux-aarch64-snapshot\n    - pkl-cli-alpine-linux-amd64-snapshot\n    - pkl-cli-windows-amd64-snapshot\n    - pkl-doc-macOS-amd64-snapshot\n    - pkl-doc-linux-amd64-snapshot\n    - pkl-doc-macOS-aarch64-snapshot\n    - pkl-doc-linux-aarch64-snapshot\n    - pkl-doc-alpine-linux-amd64-snapshot\n    - pkl-doc-windows-amd64-snapshot\n    permissions:\n      checks: write\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: test-results-xml-*\n    - name: Publish test results\n      if: '!cancelled()'\n      uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # v2\n      with:\n        comment_mode: 'off'\n        files: test-results-xml-*/**/*.xml\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-publish-test-results\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  trigger-downstream-builds:\n    if: github.repository_owner == 'apple'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - bench\n    - gradle-compatibility\n    - java-executables-snapshot\n    - pkl-cli-macOS-amd64-snapshot\n    - pkl-cli-linux-amd64-snapshot\n    - pkl-cli-macOS-aarch64-snapshot\n    - pkl-cli-linux-aarch64-snapshot\n    - pkl-cli-alpine-linux-amd64-snapshot\n    - pkl-cli-windows-amd64-snapshot\n    - pkl-doc-macOS-amd64-snapshot\n    - pkl-doc-linux-amd64-snapshot\n    - pkl-doc-macOS-aarch64-snapshot\n    - pkl-doc-linux-aarch64-snapshot\n    - pkl-doc-alpine-linux-amd64-snapshot\n    - pkl-doc-windows-amd64-snapshot\n    - deploy-snapshot\n    - publish-test-results\n    runs-on: ubuntu-latest\n    steps:\n    - name: Create app token\n      id: app-token\n      uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2\n      with:\n        app-id: ${{ secrets.PKL_CI_CLIENT_ID }}\n        private-key: ${{ secrets.PKL_CI }}\n        owner: ${{ github.repository_owner }}\n    - name: Trigger pkl-lang.org build\n      env:\n        GH_TOKEN: ${{ steps.app-token.outputs.token }}\n        SOURCE_RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\n      run: |-\n        gh workflow run \\\n          --repo apple/pkl-lang.org \\\n          --ref main \\\n          --field source_run=\"${SOURCE_RUN}\" \\\n          main.yml\n"
  },
  {
    "path": ".github/workflows/prb.yml",
    "content": "# Generated from Workflow.pkl. DO NOT EDIT.\nname: Pull Request\n'on':\n  pull_request: {}\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\npermissions:\n  contents: read\njobs:\n  gradle-check:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  gradle-check-windows:\n    if: contains(github.event.pull_request.body, '[windows]')\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check-windows\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check-windows\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-macOS-amd64-snapshot:\n    if: (contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-cli]') || contains(github.event.pull_request.body, '[native-pkl-cli-macOS]') || contains(github.event.pull_request.body, '[native-pkl-cli-macOS-amd64]') || contains(github.event.pull_request.body, '[native-pkl-cli-macOS-amd64]')) && github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-amd64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-cli]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux-amd64]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux-amd64]')\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-macOS-aarch64-snapshot:\n    if: (contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-cli]') || contains(github.event.pull_request.body, '[native-pkl-cli-macOS]') || contains(github.event.pull_request.body, '[native-pkl-cli-macOS-aarch64]') || contains(github.event.pull_request.body, '[native-pkl-cli-macOS-aarch64]')) && github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-aarch64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-cli]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux-aarch64]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux-aarch64]')\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-alpine-linux-amd64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-cli]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux-amd64]') || contains(github.event.pull_request.body, '[native-pkl-cli-linux-amd64]') || contains(github.event.pull_request.body, '[native-pkl-cli-alpine-linux-amd64]')\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-alpine-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-windows-amd64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-cli]') || contains(github.event.pull_request.body, '[native-pkl-cli-windows]') || contains(github.event.pull_request.body, '[native-pkl-cli-windows-amd64]') || contains(github.event.pull_request.body, '[native-pkl-cli-windows-amd64]')\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-windows-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-macOS-amd64-snapshot:\n    if: (contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-doc]') || contains(github.event.pull_request.body, '[native-pkl-doc-macOS]') || contains(github.event.pull_request.body, '[native-pkl-doc-macOS-amd64]') || contains(github.event.pull_request.body, '[native-pkl-doc-macOS-amd64]')) && github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-amd64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-doc]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux-amd64]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux-amd64]')\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-macOS-aarch64-snapshot:\n    if: (contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-doc]') || contains(github.event.pull_request.body, '[native-pkl-doc-macOS]') || contains(github.event.pull_request.body, '[native-pkl-doc-macOS-aarch64]') || contains(github.event.pull_request.body, '[native-pkl-doc-macOS-aarch64]')) && github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-aarch64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-doc]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux-aarch64]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux-aarch64]')\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-alpine-linux-amd64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-doc]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux-amd64]') || contains(github.event.pull_request.body, '[native-pkl-doc-linux-amd64]') || contains(github.event.pull_request.body, '[native-pkl-doc-alpine-linux-amd64]')\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-alpine-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-windows-amd64-snapshot:\n    if: contains(github.event.pull_request.body, '[native]') || contains(github.event.pull_request.body, '[native-pkl-doc]') || contains(github.event.pull_request.body, '[native-pkl-doc-windows]') || contains(github.event.pull_request.body, '[native-pkl-doc-windows-amd64]') || contains(github.event.pull_request.body, '[native-pkl-doc-windows-amd64]')\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-windows-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n        if-no-files-found: ignore\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  upload-event-file:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Upload event file\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-event-file\n        path: ${{ github.event_path }}\n  check-pkl-github-actions:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - name: Setup Pkl\n      id: setup-pkl\n      env:\n        PKL_VERSION: 0.30.0\n        PKL_FILENAME: pkl\n        PKL_DOWNLOAD_URL: https://github.com/apple/pkl/releases/download/0.30.0/pkl-linux-amd64\n      shell: bash\n      run: |-\n        DIR=\"$(mktemp -d /tmp/pkl-$PKL_VERSION-XXXXXX)\"\n        PKL_EXEC=\"$DIR/$PKL_FILENAME\"\n        curl -sfL -o $PKL_EXEC \"$PKL_DOWNLOAD_URL\"\n        chmod +x $PKL_EXEC\n        echo \"$DIR\" >> \"$GITHUB_PATH\"\n        echo \"pkl_exec=$PKL_EXEC\" >> \"$GITHUB_OUTPUT\"\n    - shell: bash\n      run: rm -rf .github/**/[a-z]*.yml\n    - shell: bash\n      run: pkl eval -m .github/ --project-dir .github/ .github/index.pkl\n    - name: check git status\n      shell: bash\n      run: |-\n        if [ -n \"$(git status --porcelain)\" ]; then\n          echo \"Running pkl resulted in a diff! You likely need to run 'pkl eval' and commit the changes.\"\n          git diff --name-only\n          exit 1\n        fi\n"
  },
  {
    "path": ".github/workflows/release-branch.yml",
    "content": "# Generated from Workflow.pkl. DO NOT EDIT.\nname: Build (release branch)\n'on':\n  push:\n    branches:\n    - release/*\n    tags-ignore:\n    - '**'\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\npermissions:\n  contents: read\njobs:\n  gradle-check:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  gradle-check-windows:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check-windows\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check-windows\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  bench:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: bench:jmh\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true bench:jmh\n  gradle-compatibility:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-compatibility\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-compatibility\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  java-executables-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - name: gradle build java executables\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:build pkl-cli:build pkl-codegen-java:build pkl-codegen-kotlin:build\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-java\n        path: '*/build/executable/**/*'\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-java-executables-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-java-executables-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-macOS-amd64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-macOS-aarch64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-aarch64-snapshot:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-alpine-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-alpine-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-windows-amd64-snapshot:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-windows-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-macOS-amd64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-macOS-aarch64-snapshot:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-aarch64-snapshot:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-aarch64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-alpine-linux-amd64-snapshot:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -Dpkl.musl=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-alpine-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-alpine-linux-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-windows-amd64-snapshot:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-windows-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-windows-amd64-snapshot\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-windows-amd64-snapshot\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  publish-test-results:\n    if: '!cancelled()'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - gradle-compatibility\n    - java-executables-snapshot\n    - pkl-cli-macOS-amd64-snapshot\n    - pkl-cli-linux-amd64-snapshot\n    - pkl-cli-macOS-aarch64-snapshot\n    - pkl-cli-linux-aarch64-snapshot\n    - pkl-cli-alpine-linux-amd64-snapshot\n    - pkl-cli-windows-amd64-snapshot\n    - pkl-doc-macOS-amd64-snapshot\n    - pkl-doc-linux-amd64-snapshot\n    - pkl-doc-macOS-aarch64-snapshot\n    - pkl-doc-linux-aarch64-snapshot\n    - pkl-doc-alpine-linux-amd64-snapshot\n    - pkl-doc-windows-amd64-snapshot\n    permissions:\n      checks: write\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: test-results-xml-*\n    - name: Publish test results\n      if: '!cancelled()'\n      uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # v2\n      with:\n        comment_mode: 'off'\n        files: test-results-xml-*/**/*.xml\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-publish-test-results\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  trigger-downstream-builds:\n    if: github.repository_owner == 'apple'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - bench\n    - gradle-compatibility\n    - java-executables-snapshot\n    - pkl-cli-macOS-amd64-snapshot\n    - pkl-cli-linux-amd64-snapshot\n    - pkl-cli-macOS-aarch64-snapshot\n    - pkl-cli-linux-aarch64-snapshot\n    - pkl-cli-alpine-linux-amd64-snapshot\n    - pkl-cli-windows-amd64-snapshot\n    - pkl-doc-macOS-amd64-snapshot\n    - pkl-doc-linux-amd64-snapshot\n    - pkl-doc-macOS-aarch64-snapshot\n    - pkl-doc-linux-aarch64-snapshot\n    - pkl-doc-alpine-linux-amd64-snapshot\n    - pkl-doc-windows-amd64-snapshot\n    - publish-test-results\n    runs-on: ubuntu-latest\n    steps:\n    - name: Create app token\n      id: app-token\n      uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2\n      with:\n        app-id: ${{ secrets.PKL_CI_CLIENT_ID }}\n        private-key: ${{ secrets.PKL_CI }}\n        owner: ${{ github.repository_owner }}\n    - name: Trigger pkl-lang.org build\n      env:\n        GH_TOKEN: ${{ steps.app-token.outputs.token }}\n        SOURCE_RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\n      run: |-\n        gh workflow run \\\n          --repo apple/pkl-lang.org \\\n          --ref main \\\n          --field source_run=\"${SOURCE_RUN}\" \\\n          main.yml\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "# Generated from Workflow.pkl. DO NOT EDIT.\nname: Release\n'on':\n  push:\n    branches-ignore:\n    - '**'\n    tags:\n    - '**'\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: false\npermissions:\n  contents: read\njobs:\n  gradle-check:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  gradle-check-windows:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: check\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true check\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-check-windows\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-check-windows\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  bench:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: bench:jmh\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true bench:jmh\n  gradle-compatibility:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true :pkl-gradle:build :pkl-gradle:compatibilityTestReleases\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-gradle-compatibility\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-gradle-compatibility\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  java-executables-release:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n        fetch-depth: 0\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - name: gradle build java executables\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-doc:build pkl-cli:build pkl-codegen-java:build pkl-codegen-kotlin:build\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-java\n        path: '*/build/executable/**/*'\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-java-executables-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-java-executables-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-macOS-amd64-release:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-amd64-release:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-macOS-aarch64-release:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-macOS-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-macOS-aarch64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-macOS-aarch64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-linux-aarch64-release:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-linux-aarch64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-linux-aarch64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-linux-aarch64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-cli-alpine-linux-amd64-release:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true -Dpkl.musl=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-alpine-linux-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-alpine-linux-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-alpine-linux-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-cli-windows-amd64-release:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-cli:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-cli-windows-amd64\n        path: pkl-cli*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-cli-windows-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-cli-windows-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-macOS-amd64-release:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true -Dpkl.targetArch=amd64 \"-Dpkl.native--native-compiler-path=${GITHUB_WORKSPACE}/.github/scripts/cc_macos_amd64.sh\" pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-amd64-release:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-macOS-aarch64-release:\n    if: github.repository_owner == 'apple'\n    runs-on:\n    - self-hosted\n    - macos\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-macOS-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-macOS-aarch64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-macOS-aarch64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-linux-aarch64-release:\n    runs-on: ubuntu-24.04-arm\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - name: Install deps\n      run: dnf install -y git binutils gcc glibc-devel zlib-devel libstdc++-static glibc-langpack-en\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: aarch64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Fix git ownership\n      run: git status || git config --system --add safe.directory \"$GITHUB_WORKSPACE\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-linux-aarch64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-linux-aarch64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-linux-aarch64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n    container:\n      image: redhat/ubi8:8.10\n  pkl-doc-alpine-linux-amd64-release:\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: Install musl and zlib\n      run: |\n        set -e\n        mkdir -p ~/staticdeps/\n\n        ZLIB_VERSION=\"1.2.13\"\n        MUSL_VERSION=\"1.2.5\"\n\n        # install zlib\n        if [[ ! -f ~/staticdeps/include/zlib.h ]]; then\n          # Download zlib tarball and signature\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz\" -o /tmp/zlib.tar.gz\n          curl -Lf \"https://github.com/madler/zlib/releases/download/v${ZLIB_VERSION}/zlib-${ZLIB_VERSION}.tar.gz.asc\" -o /tmp/zlib.tar.gz.asc\n\n          # Import zlib GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 5ED46A6721D365587791E2AA783FCD8E58BCAFBA\n\n          # Verify GPG signature\n          echo \"Verifying zlib GPG signature...\"\n          gpg --verify /tmp/zlib.tar.gz.asc /tmp/zlib.tar.gz\n\n          mkdir -p \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          cd \"/tmp/dep_zlib-${ZLIB_VERSION}\"\n          # shellcheck disable=SC2002\n          cat /tmp/zlib.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"zlib-${ZLIB_VERSION}: configure...\" \n          ./configure --static --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"zlib-${ZLIB_VERSION}: make...\" \n          make -s -j4\n\n          echo \"zlib-${ZLIB_VERSION}: make install...\" \n          make -s install\n\n          rm -rf /tmp/dep_zlib-${ZLIB_VERSION}\n        fi\n\n        # install musl\n        if [[ ! -f ~/staticdeps/bin/x86_64-linux-musl-gcc ]]; then\n          # Download musl tarball and signature\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz\" -o /tmp/musl.tar.gz\n          curl -Lf \"https://musl.libc.org/releases/musl-${MUSL_VERSION}.tar.gz.asc\" -o /tmp/musl.tar.gz.asc\n\n          # Import musl GPG key\n          gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 836489290BB6B70F99FFDA0556BCDB593020450F\n\n          # Verify GPG signature\n          echo \"Verifying musl GPG signature...\"\n          gpg --verify /tmp/musl.tar.gz.asc /tmp/musl.tar.gz\n\n          mkdir -p \"/tmp/dep_musl-${MUSL_VERSION}\"\n          cd \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # shellcheck disable=SC2002\n          cat /tmp/musl.tar.gz | tar --strip-components=1 -xzC .\n\n          echo \"musl-${MUSL_VERSION}: configure...\" \n          ./configure --disable-shared --prefix=\"$HOME\"/staticdeps > /dev/null\n\n          echo \"musl-${MUSL_VERSION}: make...\" \n          make -s -j4\n\n          echo \"musl-${MUSL_VERSION}: make install...\" \n          make -s install\n\n          rm -rf \"/tmp/dep_musl-${MUSL_VERSION}\"\n\n          # native-image expects to find an executable at this path.\n          ln -s ~/staticdeps/bin/musl-gcc ~/staticdeps/bin/x86_64-linux-musl-gcc\n        fi\n\n        echo \"${HOME}/staticdeps/bin\" >> \"$GITHUB_PATH\"\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true -Dpkl.musl=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-alpine-linux-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-alpine-linux-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-alpine-linux-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  pkl-doc-windows-amd64-release:\n    runs-on: windows-latest\n    env:\n      LANG: en_US.UTF-8\n      JAVA_HOME: /jdk\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - name: gradle buildNative\n      shell: bash\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true pkl-doc:buildNative\n    - name: Upload executable artifacts\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: executable-pkl-doc-windows-amd64\n        path: pkl-doc*/build/executable/**/*\n    - name: Upload Test Result XML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-xml-pkl-doc-windows-amd64-release\n        path: '**/build/test-results/**/*.xml'\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-pkl-doc-windows-amd64-release\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  deploy-release:\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - bench\n    - gradle-compatibility\n    - java-executables-release\n    - pkl-cli-macOS-amd64-release\n    - pkl-cli-linux-amd64-release\n    - pkl-cli-macOS-aarch64-release\n    - pkl-cli-linux-aarch64-release\n    - pkl-cli-alpine-linux-amd64-release\n    - pkl-cli-windows-amd64-release\n    - pkl-doc-macOS-amd64-release\n    - pkl-doc-linux-amd64-release\n    - pkl-doc-macOS-aarch64-release\n    - pkl-doc-linux-aarch64-release\n    - pkl-doc-alpine-linux-amd64-release\n    - pkl-doc-windows-amd64-release\n    runs-on: ubuntu-latest\n    env:\n      LANG: en_US.UTF-8\n    environment: maven-release\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n      with:\n        java-version: '21'\n        distribution: temurin\n        architecture: x64\n    - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5\n      with: {}\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n      with:\n        persist-credentials: false\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: executable-**\n        merge-multiple: true\n    - env:\n        ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGKEYID }}\n        ORG_GRADLE_PROJECT_signingKey: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGKEY }}\n        ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGPASSWORD }}\n        ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPEPASSWORD }}\n        ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPEUSERNAME }}\n      run: ./gradlew --info --stacktrace --no-daemon -DpklMultiJdkTesting=true -DreleaseBuild=true publishToSonatype closeAndReleaseSonatypeStagingRepository\n  github-release:\n    needs: deploy-release\n    permissions:\n      contents: write\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: executable-**\n        merge-multiple: true\n    - name: Publish release on GitHub\n      env:\n        GH_TOKEN: ${{ github.token }}\n        TAG_NAME: ${{ github.ref_name }}\n        GIT_SHA: ${{ github.sha }}\n        GH_REPO: ${{ github.repository }}\n      run: |-\n        # exclude build_artifacts.txt from publish\n        rm -f */build/executable/*.build_artifacts.txt\n        find */build/executable/* -type d | xargs rm -rf\n        gh release create ${TAG_NAME} \\\n          --title \"${TAG_NAME}\" \\\n          --target \"${GIT_SHA}\" \\\n          --verify-tag \\\n          --notes \"Release notes: https://pkl-lang.org/main/current/release-notes/changelog.html#release-${TAG_NAME}\" \\\n          */build/executable/*\n  publish-test-results:\n    if: '!cancelled()'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - gradle-compatibility\n    - java-executables-release\n    - pkl-cli-macOS-amd64-release\n    - pkl-cli-linux-amd64-release\n    - pkl-cli-macOS-aarch64-release\n    - pkl-cli-linux-aarch64-release\n    - pkl-cli-alpine-linux-amd64-release\n    - pkl-cli-windows-amd64-release\n    - pkl-doc-macOS-amd64-release\n    - pkl-doc-linux-amd64-release\n    - pkl-doc-macOS-aarch64-release\n    - pkl-doc-linux-aarch64-release\n    - pkl-doc-alpine-linux-amd64-release\n    - pkl-doc-windows-amd64-release\n    permissions:\n      checks: write\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6\n      with:\n        pattern: test-results-xml-*\n    - name: Publish test results\n      if: '!cancelled()'\n      uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # v2\n      with:\n        comment_mode: 'off'\n        files: test-results-xml-*/**/*.xml\n    - name: Upload Test Result HTML\n      if: '!cancelled()'\n      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5\n      with:\n        name: test-results-html-publish-test-results\n        path: '**/build/reports/tests/**/*'\n        if-no-files-found: ignore\n  trigger-downstream-builds:\n    if: github.repository_owner == 'apple'\n    needs:\n    - gradle-check\n    - gradle-check-windows\n    - bench\n    - gradle-compatibility\n    - java-executables-release\n    - pkl-cli-macOS-amd64-release\n    - pkl-cli-linux-amd64-release\n    - pkl-cli-macOS-aarch64-release\n    - pkl-cli-linux-aarch64-release\n    - pkl-cli-alpine-linux-amd64-release\n    - pkl-cli-windows-amd64-release\n    - pkl-doc-macOS-amd64-release\n    - pkl-doc-linux-amd64-release\n    - pkl-doc-macOS-aarch64-release\n    - pkl-doc-linux-aarch64-release\n    - pkl-doc-alpine-linux-amd64-release\n    - pkl-doc-windows-amd64-release\n    - deploy-release\n    - github-release\n    - publish-test-results\n    runs-on: ubuntu-latest\n    steps:\n    - name: Create app token\n      id: app-token\n      uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2\n      with:\n        app-id: ${{ secrets.PKL_CI_CLIENT_ID }}\n        private-key: ${{ secrets.PKL_CI }}\n        owner: ${{ github.repository_owner }}\n    - name: Trigger pkl-lang.org build\n      env:\n        GH_TOKEN: ${{ steps.app-token.outputs.token }}\n        SOURCE_RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\n      run: |-\n        gh workflow run \\\n          --repo apple/pkl-lang.org \\\n          --ref main \\\n          --field source_run=\"${SOURCE_RUN}\" \\\n          main.yml\n"
  },
  {
    "path": ".github/workflows/test_report.yml",
    "content": "# Generated from Workflow.pkl. DO NOT EDIT.\nname: PR Test Reports\n'on':\n  workflow_run:\n    types:\n    - completed\n    workflows:\n    - Pull Request\npermissions:\n  contents: read\njobs:\n  test-results:\n    name: Test Results\n    if: github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure'\n    permissions:\n      actions: read\n      checks: write\n    runs-on: ubuntu-latest\n    steps:\n    - name: Download artifacts\n      uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11\n      with:\n        path: artifacts\n        name: test-results-.*\n        name_is_regexp: true\n        run_id: ${{ github.event.workflow_run.id }}\n    - name: Publish test results\n      uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040 # v2\n      with:\n        commit: ${{ github.event.workflow_run.head_sha }}\n        comment_mode: 'off'\n        files: artifacts/**/*.xml\n        event_file: artifacts/test-results-event-file/event.json\n        event_name: ${{ github.event.workflow_run.event }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# macOS\n.DS_STORE\n\n# Gradle\n.gradle/\nbuild/\ngenerated/\ntestgenerated/\n\n# IntelliJ\n.idea/\n!.idea/icon.svg\n!.idea/codestyles/\n!.idea/inspectionProfiles/\n!.idea/runConfigurations/\n!.idea/scopes/\n!.idea/vcs.xml\n.intellijPlatform/\n\n.vscode/\n\n.pkl-lsp/\n\n.kotlin/\n"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": ".java-version",
    "content": "21\n"
  },
  {
    "path": ".mailmap",
    "content": "Jen Basch <421772+HT154@users.noreply.github.com>\nJen Basch <jbasch@apple.com>\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "## Code of Conduct\n\n### Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our\nproject and our community a harassment-free experience for everyone,\nregardless of age, body size, disability, ethnicity, sex\ncharacteristics, gender identity and expression, level of experience,\neducation, socio-economic status, nationality, personal appearance,\nrace, religion, or sexual identity and orientation.\n\n### Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual\nattention or advances\n* Trolling, insulting/derogatory comments, and personal or political\nattacks\n* Public or private harassment\n* Publishing others’ private information, such as a physical or\nelectronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\nprofessional setting\n\n### Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of\nacceptable behavior and are expected to take appropriate and fair\ncorrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit,\nor reject comments, commits, code, wiki edits, issues, and other\ncontributions that are not aligned to this Code of Conduct, or to ban\ntemporarily or permanently any contributor for other behaviors that they\ndeem inappropriate, threatening, offensive, or harmful.\n\n### Scope\n\nThis Code of Conduct applies within all project spaces, and it also\napplies when an individual is representing the project or its community\nin public spaces. Examples of representing a project or community\ninclude using an official project e-mail address, posting via an\nofficial social media account, or acting as an appointed representative\nat an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n### Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may\nbe reported by contacting the open source team at\nopensource-conduct@group.apple.com. All complaints will be reviewed and\ninvestigated and will result in a response that is deemed necessary and\nappropriate to the circumstances. The project team is obligated to\nmaintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted\nseparately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in\ngood faith may face temporary or permanent repercussions as determined\nby other members of the project’s leadership.\n\n### Attribution\n\nThis Code of Conduct is adapted from the\n[Contributor Covenant](https://www.contributor-covenant.org), version 1.4, \navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n"
  },
  {
    "path": "CONTRIBUTING.adoc",
    "content": ":uri-github-discussion: https://github.com/apple/pkl/discussions\n:uri-github-issue-pkl: https://github.com/apple/pkl/issues/new\n:uri-seven-rules: https://cbea.ms/git-commit/#seven-rules\n\n= Pkl Contributor's Guide\n\nWelcome to the Pkl community, and thank you for contributing!\nThis guide explains how to get involved.\n\n* <<Licensing>>\n* <<Issue Tracking>>\n* <<Pull Requests>>\n\n== Licensing\n\nPkl is released under the Apache 2.0 license.\nThis is why we require that, by submitting a pull request, you acknowledge that you have the right to license your contribution to Apple and the community, and agree that your contribution is licensed under the Apache 2.0 license.\n\n== Issue Tracking\n\nTo file a bug or feature request, use {uri-github-issue-pkl}[GitHub].\nBe sure to include the following information:\n\n* Context\n** What are/were you trying to achieve?\n** What's the impact of this bug/feature?\n\nFor bug reports, additionally include the following information:\n\n* The output of `pkl --version`.\n* The complete error message.\n* The simplest possible steps to reproduce.\n\n== Pull Requests\n\nWhen preparing a pull request, follow this checklist:\n\n* Imitate the conventions of surrounding code.\n* Format code with `./gradlew spotlessApply` (otherwise the build will fail).\n* Verify that both the JVM build (`./gradlew build`) and native build (`./gradlew buildNative`) succeed.\n* Follow the {uri-seven-rules}[seven rules] of great Git commit messages:\n** Separate subject from body with a blank line.\n** Limit the subject line to 50 characters.footnote:not-enforced[This rule is not enforced in the Pkl project.]\n** Capitalize the subject line.\n** Do not end the subject line with a period.\n** Use the imperative mood in the subject line.\n** Wrap the body at 72 characters.footnote:not-enforced[]\n** Use the body to explain what and why vs. how.\n\nIMPORTANT: If you plan to make substantial changes or add new features, \nwe encourage you to first discuss them with the wider Pkl developer community.\nYou can do this by filing a {uri-github-issue-pkl}[GitHub Issue] or by starting\n{uri-github-discussion}[GitHub Discussion].\nThis will save time and increases the chance of your pull request being accepted.\n\n== Maintainers\n\nThe project’s maintainers (those with write access to the upstream repository) are listed in link:MAINTAINERS.adoc[].\n"
  },
  {
    "path": "DEVELOPMENT.adoc",
    "content": "= Development\n:uri-gng: https://gng.dsun.org\n:uri-jenv: https://www.jenv.be\n:uri-intellij: https://www.jetbrains.com/idea/download/\n:uri-native-prerequisites-linux: https://www.graalvm.org/latest/getting-started/linux/#prerequisites-for-native-image-on-linux\n:uri-native-prerequisites-windows: https://www.graalvm.org/latest/getting-started/windows/#prerequisites-for-native-image-on-windows\n\n== Setup\n\n. (mandatory) Install a JDK (JDK 21+ required).\n. (recommended) Install {uri-intellij}[IntelliJ IDEA] +\nTo import the project into IntelliJ, go to File->Open and select the project's root directory.\nIf the project is opened but not imported, look for a popup in the lower right corner\nand click its \"Import Gradle Project\" link.\n. (recommended) Install {uri-gng}[gng] +\n_gng_ enables you to run Gradle commands with `gw` (instead of `./gradlew`) from any subdirectory.\n. (recommended) Set up Git ignore-revs +\n`git config blame.ignoreRevsFile .git-blame-ignore-revs`\n. (recommended) Install {uri-jenv}[jenv] and plugins +\n_jenv_ uses specific JDK versions in certain subdirectories. _Pkl_ comes with a `.java-version` file specifying JDK 21. +\nEnable _jenv_ plugins for better handling by `gradle`:\n+\n[source,shell]\n----\njenv enable-plugin gradle\njenv enable-plugin export\n----\n. (optional) If you've named the original apple/pkl git repository something other than `origin`, set env var `PKL_ORIGINAL_REMOTE_NAME` to that name in your `.bashrc`, `.zshrc`, `config.fish` or however you manage your local environment.\n+\nThis will allow spotless to pick the correct starting branch when formatting source code files.\nOtherwise, you might see that _every_ file has its copyright year updated.\n\n=== Additional Linux Setup\n. (optional) To build the native executable (`./gradlew buildNative`),\ninstall {uri-native-prerequisites-linux}[Prerequisites For Native Image on Linux].\n\n=== Additional Windows Setup\n. (optional) Go to `System->For developers` and enable `Developer Mode`.\nOtherwise, some tests may fail due to insufficient file system privileges.\n. (optional) To build the native executable (`./gradlew buildNative`), \ninstall {uri-native-prerequisites-windows}[Prerequisites For Native Image on Windows].\n\n== Common Build Commands\n\n[source,shell]\n----\ngw clean\ngw test                 # run all tests except native executable tests\ngw spotlessApply        # fix code formatting\ngw build                # build everything except native executables\ngw pkl-cli:testNative   # run native executable tests\ngw pkl-cli:buildNative  # build native executable for current platform\n\npkl-cli/build/executable/jpkl                   # run Java executable\npkl-cli/build/executable/pkl-macos-aarch64      # run Mac executable\npkl-cli/build/executable/pkl-macos-amd64        # run Intel Mac executable\npkl-cli/build/executable/pkl-linux-amd64        # run Linux executable\npkl-cli/build/executable/pkl-alpine-linux-amd64 # run Alpine Linux executable \npkl-cli/build/executable/pkl-windows-amd64.exe  # run Windows executable \n----\n\n== Update Gradle\n\n. Go to https://gradle.org/release-checksums/ and copy the checksum for the new Gradle version\n. Run the following command *twice* (until it prints UP-TO-DATE):\n+\n[source,shell]\n----\ngw wrapper --gradle-version [version] --gradle-distribution-sha256-sum [sha]\n----\n. Commit the updated wrapper files\n\n== Update Dependencies\n\n. (optional) Update _gradle/libs.version.toml_\nbased on version information from https://search.maven.org, https://plugins.gradle.org, and GitHub repos\n. Run `gw updateDependencyLocks`\n. Validate changes with `gw build buildNative`\n. Review and commit the updated dependency lock files\n\n== Code Generation\n\n* Truffle code generation is performed by Truffle's annotation processor, which runs as part of task `:pkl-core:compileJava`\n** Output dir is `generated/truffle/`\n\n== Remote JVM Debugging\n\nTo enable remote JVM debugging when running Gradle tasks (e.g. test), add the flag `-Djvmdebug=true`.\nThis will listen on port 5005.\n\nExample: `./gradlew test -Djvmdebug=true`\n\n== Snippet Test Plugin\n\nThere is an IntelliJ plugin meant for development on the Pkl project itself.\nThis plugin provides a split pane window when viewing snippet tests such as LanguageSnippetTests and FormatterSnippetTests.\n\nTo install:\n\n1. Run `./gradlew pkl-internal-intellij-plugin:buildPlugin`.\n2. Within IntelliJ, run the action \"Install Plugin From Disk...\".\n3. Select the zip file within `pkl-internal-intellij-plugin/build/distributions`.\n\n== Resources\n\nFor automated build setup examples see our https://github.com/apple/pkl/blob/main/.github/[GitHub Actions] jobs like our https://github.com/apple/pkl/blob/main/.github/jobs/BuildNativeJob.pkl[BuildNativeJob.pkl], where we build Pkl automatically.\n\n=== Truffle\n\n* http://ssw.jku.at/Research/Projects/JVM/Truffle.html[Homepage]\n* https://github.com/graalvm/truffle[GitHub]\n* http://lafo.ssw.uni-linz.ac.at/javadoc/truffle/latest/[Javadoc]\n* https://mail.openjdk.org/pipermail/graal-dev/[Mailing List]\n* https://medium.com/@octskyward/graal-truffle-134d8f28fb69#.2db370y2g[Graal & Truffle (Article)]\n* https://comserv.cs.ut.ee/home/files/Pool_ComputerScience_2016.pdf?study=ATILoputoo&reference=6319668E7151D556131810BC3F4A627D7FEF5F3B[Truffle Overview (see chapter 1)]\n* https://gist.github.com/smarr/d1f8f2101b5cc8e14e12[Truffle: Languages and Material]\n* https://github.com/smarr/truffle-notes[Truffle Notes]\n* https://www.graalvm.org/latest/graalvm-as-a-platform/language-implementation-framework/[Truffle Language Implementation Framework]\n\n=== Other Config Languages\n\n* https://github.com/google/jsonnet[Jsonnet]\n* https://github.com/dhall-lang/dhall-lang[Dhall]\n* https://cuelang.org[CUE]\n* https://nickel-lang.org[Nickel]\n* https://kcl-lang.io[KCL]\n* https://github.com/google/skylark[Skylark]\n* https://github.com/typesafehub/config[Typesafe Config]\n* https://www.flabbergast.org[Flabbergast]\n(defunct, http://artefacts.masella.name/2015-srecon-andre_masella.pdf[paper])\n* https://medium.com/@MrJamesFisher/nix-by-example-a0063a1a4c55[Nix by example: The Nix expression language]\n* http://lethalman.blogspot.co.at/2014/07/nix-pill-4-basics-of-language.html[Nix pill 4: the basics of the language]\n* https://docs.puppetlabs.com/puppet/latest/reference/lang_summary.html[Puppet Configuration Language]\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "MAINTAINERS.adoc",
    "content": "= MAINTAINERS\n\nThis page lists all active Maintainers of this repository.\n\nSee link:CONTRIBUTING.adoc[] for general contribution guidelines.\n\n== Maintainers (in alphabetical order)\n\n* https://github.com/bioball[Daniel Chao]\n* https://github.com/stackoverflow[Islon Scherer]\n* https://github.com/HT154[Jen Basch]\n* https://github.com/holzensp[Philip Hölzenspies]\n"
  },
  {
    "path": "NOTICE.txt",
    "content": "Copyright © 2024-2025 Apple Inc. and the Pkl project authors\n\n\nPortions of this software were originally based on 'SnakeYAML' developed by Andrey Somov.\n(https://bitbucket.org/asomov/snakeyaml-engine/)\n\nThe Apache License\nCopyright © 2008-2010 Andrey Somov\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\nPortions of this software were originally based on 'jline3' developed by the JLine authors.\n(https://github.com/jline/jline3)\n\nCopyright (c) 2002-2023, the original author(s)\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following\nconditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nNeither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this\nsoftware without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\nOF THE POSSIBILITY OF SUCH DAMAGE.\n\nPortions of this software were originally based on 'minimal-json' developed by EclipseSource.\n(https://github.com/ralfstx/minimal-json)\n\nCopyright (c) 2015, 2016 EclipseSource.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nPortions of this software were originally based on 'gson' developed by the Google Inc.\n(https://github.com/google/gson)\n\nThe Apache License\nCopyright © 2008 Google Inc\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\nPortions of this software were originally based on 'guava' developed by Google Inc.\n(https://github.com/google/guava)\n\nThe Apache License\nCopyright © 2009 The Guava Authors\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\nPortions of this software were originally based on 'java-string-similarity' developed by Thibault Debatty.\n(https://github.com/tdebatty/java-string-similarity)\n\nCopyright 2015 Thibault Debatty\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nPortions of this software were originally based on 'xerxes2-j' developed by the Apache Software Foundation.\n(https://github.com/apache/xerces2-j)\n\nThe Apache License\nCopyright © 1999-2018 The Apache Software Foundation\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\nPortions of this software were originally based on 'scroll-into-view-if-needed' developed by Cody Olsen.\n(https://github.com/scroll-into-view/scroll-into-view-if-needed)\n\n\nCopyright (c) 2023 Cody Olsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nThis product ships with third party licenses that may be distributed under a different license.\nThis information is detailed in THIRD-PARTY-NOTICES.txt.\n\nPortions of this software includes code from \"Gradle\" by Gradle, Inc.\n\nCopyright 2015 the original author or authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n     https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "README.adoc",
    "content": "= image:.idea/icon.svg[Pkl,30] Pkl \n\n:uri-homepage: https://pkl-lang.org\n:uri-docs: {uri-homepage}/main/current\n:uri-docs-introduction: {uri-docs}/introduction\n:uri-docs-release-notes: {uri-docs}/release-notes\n:uri-docs-language: {uri-docs}/language\n:uri-docs-tools: {uri-docs}/tools\n:uri-github-issue: https://github.com/apple/pkl/issues\n:uri-github-discussions: https://github.com/apple/pkl/discussions\n:uri-pkl-examples: https://pkl-lang.org/main/current/examples.html\n:uri-installation: https://pkl-lang.org/main/current/pkl-cli/index.html#installation\n:uri-lang-reference: https://pkl-lang.org/main/current/language-reference/index.html\n:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/\n:uri-ci-pipeline: https://github.com/apple/pkl/actions\n\nA configuration as code language with rich validation and tooling.\n\n== Quick Links\n\n* {uri-installation}[Installation]\n* {uri-lang-reference}[Language Reference]\n\n== Documentation\n\n* {uri-homepage}[Home Page]\n** {uri-docs-introduction}[Introduction]\n** {uri-docs-language}[Language]\n** {uri-docs-tools}[Tools]\n** {uri-pkl-examples}[Examples]\n** {uri-docs-release-notes}[Release Notes]\n\n== Community\n\nWe'd love to hear from you!\n\n* Create an {uri-github-issue}[issue]\n* Ask a question on {uri-github-discussions}[GitHub Discussions]\n\n== Development\n\nimage:https://github.com/apple/pkl/actions/workflows/main.yml/badge.svg?style=svg[\"Build (main)\", link=\"https://github.com/apple/pkl/actions/workflows/main.yml\"]\n\n* link:CONTRIBUTING.adoc[] for tips on pull requests and filing issues\n* link:DEVELOPMENT.adoc[] for build instructions\n* {uri-ci-artifacts}[Sonatype Repository] for the artifacts/binaries built by our {uri-ci-pipeline}[CI pipelines] (and those of our other tools and packages repositories).\n\n== Pkl GitHub Repositories\n\n[%autowidth]\n|===\n|Name |Description\n\n|`apple/pkl`\n|A configuration as code language with rich validation and tooling.\n\n|https://github.com/apple/pkl-evolution[`apple/pkl-evolution`]\n|Suggested Pkl Improvements, Changes, or Enhancements (SPICEs)\n\n|https://github.com/apple/pkl-go[`apple/pkl-go`]\n|Pkl bindings for the Go programming language\n\n|https://github.com/apple/pkl-go-examples[`apple/pkl-go-examples`]\n|Examples for using Pkl within Go applications\n\n|https://github.com/apple/highlightjs-pkl[`apple/highlightjs-pkl`]\n|Highlight.js syntax highlighting for Pkl\n\n|https://github.com/apple/pkl-intellij[`apple/pkl-intellij`]\n|JetBrains editor plugins providing Pkl language support\n\n|https://github.com/apple/pkl-jvm-examples[`apple/pkl-jvm-examples`]\n|Examples for using Pkl within JVM applications\n\n|https://github.com/apple/pkl-k8s[`apple/pkl-k8s`]\n|Templates for using Pkl with Kubernetes\n\n|https://github.com/apple/pkl-k8s-examples[`apple/pkl-k8s-examples`]\n|Examples for using Pkl with Kubernetes\n\n|https://github.com/apple/pkl-lang.org[`apple/pkl-lang.org`]\n|The pkl-lang.org website\n\n|https://github.com/apple/pkl-lsp[`apple/pkl-lsp`]\n|Language server for Pkl, implementing the server-side of the Language Server Protocol\n\n|https://github.com/apple/pkl-neovim[`apple/pkl-neovim`]\n|Pkl language support for Neovim\n\n|https://github.com/apple/pkl-package-docs[`apple/pkl-package-docs`]\n|Documentation for Pkl packages\n\n|https://github.com/apple/pkl-pantry[`apple/pkl-pantry`]\n|Shared Pkl packages\n\n|https://github.com/apple/pkl-project-commons[`apple/pkl-project-commons`]\n|Utility libraries for Pkl\n\n|https://github.com/apple/pkl-readers[`apple/pkl-readers`]\n|Shared Pkl https://pkl-lang.org/main/current/language-reference/index.html#external-readers[external reader] tools\n\n|https://github.com/apple/pkl-spring[`apple/pkl-spring`]\n|Spring Boot extension for configuring Boot apps with Pkl\n\n|https://github.com/apple/pkl-swift[`apple/pkl-swift`]\n|Pkl bindings for the Swift programming language\n\n|https://github.com/apple/pkl-swift-examples[`apple/pkl-swift-examples`]\n|Examples for using Pkl within Swift applications\n\n|https://github.com/apple/pkl-vscode[`apple/pkl-vscode`]\n|Pkl language support for VS Code\n\n|https://github.com/apple/pkl.tmbundle[`apple/pkl.tmbundle`]\n|TextMate bundle for Pkl\n\n|https://github.com/apple/tree-sitter-pkl[`apple/tree-sitter-pkl`]\n|Tree-sitter parser for Pkl\n\n|https://github.com/apple/rules_pkl[`apple/rules_pkl`]\n|Bazel build rules for Pkl\n|===\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security\n\nFor the protection of our community, the Pkl team does not disclose, discuss, or confirm security issues until our investigation is complete and any necessary updates are generally available.\n\n## Reporting a security vulnerability\n\nIf you have discovered a security vulnerability within the Pkl project, please report it to us.\nWe welcome reports from everyone, including security researchers, developers, and users.\n\nSecurity vulnerabilities may be reported on the [Report a vulnerability](https://security.apple.com/submit) form.\nWhen submitting a vulnerability, select \"Apple Devices and Software\" as the affected platform, and \"Open Source\" as the affected area.\n\nFor more information, see https://pkl-lang.org/security.html.\n"
  },
  {
    "path": "THIRD-PARTY-NOTICES.txt",
    "content": "Pkl ships with third-party libraries that may be distributed under a different license than\nPkl's own license.\nThese libraries and their licenses are listed below:\n\n1) Clikt (https://github.com/ajalt/clikt)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2018 AJ Alt\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n2) JavaPoet (http://github.com/square/javapoet/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2015 Square, Inc.\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n3) KotlinPoet (https://github.com/square/kotlinpoet)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2017 Square, Inc.\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n4) GeantyRef (https://github.com/leangen/geantyref)\nManifest license URL: https://www.apache.org/licenses/LICENSE-2.0\n\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2017 Kaqqao\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n5) commonmark-java core\nPOM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause\n\nEmbedded license: \n\n                    ****************************************                    \n\nCopyright (c) 2015, Atlassian Pty Ltd\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n6) commonmark-java extension for tables\nPOM License: The 2-Clause BSD License - https://opensource.org/licenses/BSD-2-Clause\n\nEmbedded license: \n\n                    ****************************************                    \n\nCopyright (c) 2015, Atlassian Pty Ltd\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n7) jansi (http://fusesource.com/)\nManifest license URL: https://www.apache.org/licenses/LICENSE-2.0\n\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © Fusesource 2023\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n8) Graal Sdk (https://github.com/oracle/graal)\nPOM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL\n\n9) Truffle API (http://openjdk.java.net/projects/graal)\nPOM License: Universal Permissive License, Version 1.0 - http://opensource.org/licenses/UPL\n\n10) IntelliJ IDEA Annotations (http://www.jetbrains.org)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © Jetbrains 2023\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n11) kotlin-reflect (https://kotlinlang.org/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © Wuseal 2018\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n12) kotlin-stdlib (https://kotlinlang.org/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributor\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n13) kotlin-stdlib-common (https://kotlinlang.org/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2023 Kotlin Team\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n14) kotlin-stdlib-jdk7 (https://kotlinlang.org/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2023 Kotlin Team\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n15) kotlin-stdlib-jdk8 (https://kotlinlang.org/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2023 Kotlin Team\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n16) kotlinx.html (https://github.com/Kotlin/kotlinx.html)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2017 Yole\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n17) kotlinx-serialization-core (https://github.com/Kotlin/kotlinx.serialization)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\n2017-2019 JetBrains s.r.o and respective authors and developers\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n18) kotlinx-serialization-json (https://github.com/Kotlin/kotlinx.serialization)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\n2017-2019 JetBrains s.r.o and respective authors and developers\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n19) JLine Reader\nManifest license URL: https://opensource.org/licenses/BSD-3-Clause\n\nPOM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause\n\nCopyright (c) 2002-2023, the original author(s)\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following\nconditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nNeither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this\nsoftware without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n20) JLine Terminal\nManifest license URL: https://opensource.org/licenses/BSD-3-Clause\n\nPOM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause\n\nCopyright (c) 2002-2023, the original author(s)\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following\nconditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nNeither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this\nsoftware without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n21) JLine JANSI Terminal\nManifest license URL: https://opensource.org/licenses/BSD-3-Clause\n\nPOM License: The 3-Clause BSD License - https://opensource.org/licenses/BSD-3-Clause\n\nCopyright (c) 2002-2023, the original author(s)\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following\nconditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nNeither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this\nsoftware without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n22) msgpack-core (https://msgpack.org/)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2016 Sadayuki Furuhashi, Muga Nishizawa, Taro L. Saito, Mitsunori Komatsu, Ozawa Tsuyoshi\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. \n\n23) Paguro (https://github.com/GlenKPeterson/Paguro)\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2021 Glen K. Peterson\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\nPOM License: Eclipse Public License - v 1.0 - http://www.eclipse.org/legal/epl-v10.html\n\nNOTE: The files in this project that came from Clojure (Persistent...) MUST only be used under the Eclipse 1.0 license.\nAt the user's choice, any other files in this project can be used under Eclipse 1.0 or the Apache 2.0 license.\n\nEclipse Public License - v 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (\"AGREEMENT\").\nANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\na) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and\n\nb) in the case of each subsequent Contributor:\n\ni) changes to the Program, and\n\nii) additions to the Program;\n\nwhere such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.\n\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this Agreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement, including all Contributors.\n\n2. GRANT OF RIGHTS\n\na) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.\n\nb) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.\n\nc) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.\n\nd) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.\n\n3. REQUIREMENTS\n\nA Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:\n\na) it complies with the terms and conditions of this Agreement; and\n\nb) its license agreement:\n\ni) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;\n\nii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;\n\niii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and\n\niv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.\n\nWhen the Program is made available in source code form:\n\na) it must be made available under this Agreement; and\n\nb) a copy of this Agreement must be included with each copy of the Program.\n\nContributors may not remove or alter any copyright notices contained within the Program.\n\nEach Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (\"Commercial Contributor\") hereby agrees to defend and indemnify every other Contributor (\"Indemnified Contributor\") against any losses, damages and costs (collectively \"Losses\") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.\n\n24) SnakeYAML Engine (http://www.snakeyaml.org)\nManifest license URL: https://www.apache.org/licenses/LICENSE-2.0\n\nPOM License: Apache License, Version 2.0 - https://www.apache.org/licenses/LICENSE-2.0\n\nThe Apache License\nCopyright © 2008-2010 Andrey Somov\nLicensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n\n"
  },
  {
    "path": "bench/bench.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklJavaLibrary\n  id(\"me.champeau.jmh\")\n}\n\nval truffle: Configuration by configurations.creating\nval graal: Configuration by configurations.creating\n\ndependencies {\n  jmh(projects.pklCore)\n  jmh(projects.pklCommonsTest)\n  jmh(projects.pklParser)\n  truffle(libs.truffleApi)\n  graal(libs.graalCompiler)\n}\n\njmh {\n  // include = [\"fib_class_java\"]\n  // include = [\"fib_class_constrained1\", \"fib_class_constrained2\"]\n  jmhVersion.set(libs.versions.jmh)\n  // jvmArgsAppend = \"-Dgraal.TruffleCompilationExceptionsAreFatal=true \" +\n  //  \"-Dgraal.Dump=Truffle,TruffleTree -Dgraal.TraceTruffleCompilation=true \" +\n  //  \"-Dgraal.TruffleFunctionInlining=false\"\n  jvm.set(\"${buildInfo.graalVmAmd64.baseDir}/bin/java\")\n  // see:\n  // https://docs.oracle.com/en/graalvm/enterprise/20/docs/graalvm-as-a-platform/implement-language/#disable-class-path-separation\n  jvmArgs.set(\n    listOf(\n      // one JVM arg per list element doesn't work, but the following does\n      \"-Dgraalvm.locatorDisabled=true --module-path=${truffle.asPath} --upgrade-module-path=${graal.asPath}\"\n    )\n  )\n  includeTests.set(false)\n  // threads = Runtime.runtime.availableProcessors() / 2 + 1\n  // synchronizeIterations = false\n}\n\ntasks.named(\"jmh\") { dependsOn(\":installGraalVmAmd64\") }\n\n// Prevent this error which occurs when building in IntelliJ:\n// \"Entry org/pkl/core/fib_class_typed.pkl is a duplicate but no duplicate handling strategy has\n// been set.\"\ntasks.processJmhResources { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }\n"
  },
  {
    "path": "bench/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.sf.jopt-simple:jopt-simple:5.0.4=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.apache.commons:commons-math3:3.6.1=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=jmhCompileClasspath,jmhImplementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=jmh,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.compiler:compiler:25.0.0=graal\norg.graalvm.polyglot:polyglot:25.0.0=jmh,jmhRuntimeClasspath,truffle\norg.graalvm.sdk:collections:25.0.0=graal,jmh,jmhRuntimeClasspath,truffle\norg.graalvm.sdk:graal-sdk:25.0.0=jmh,jmhRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=jmh,jmhRuntimeClasspath,truffle\norg.graalvm.sdk:word:25.0.0=graal,jmh,jmhRuntimeClasspath,truffle\norg.graalvm.truffle:truffle-api:25.0.0=jmh,jmhRuntimeClasspath,truffle\norg.graalvm.truffle:truffle-compiler:25.0.0=graal\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=jmh,jmhCompileClasspath,jmhRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJmh,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=jmh,jmhRuntimeClasspath\norg.openjdk.jmh:jmh-core:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.openjdk.jmh:jmh-generator-asm:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.openjdk.jmh:jmh-generator-bytecode:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.openjdk.jmh:jmh-generator-reflection:1.37=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=jmh,jmhRuntimeClasspath\norg.ow2.asm:asm:9.0=jmh,jmhCompileClasspath,jmhImplementationDependenciesMetadata,jmhRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=jmh,jmhRuntimeClasspath\nempty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,jmhAnnotationProcessor,jmhApiDependenciesMetadata,jmhCompileOnlyDependenciesMetadata,jmhIntransitiveDependenciesMetadata,jmhKotlinScriptDefExtensions,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,runtimeClasspath,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "bench/src/jmh/java/org/pkl/core/Fibonacci.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.concurrent.TimeUnit;\nimport org.openjdk.jmh.annotations.*;\n\n@SuppressWarnings(\"unused\")\n@Warmup(iterations = 5, time = 2)\n@Measurement(iterations = 5, time = 2)\n@OutputTimeUnit(TimeUnit.SECONDS)\n@Fork(1)\npublic class Fibonacci {\n  @Benchmark\n  public long fib_class_java() {\n    return new FibJavaImpl().fib(35);\n  }\n\n  @Benchmark\n  public long fib_class() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_class.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_class_explicitThis() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_class_explicitThis.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_class_typed() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_class_typed.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_class_constrained1() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_class_constrained1.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_class_constrained2() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_class_constrained2.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_module() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_module.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_module_explicitThis() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_module_explicitThis.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n\n  @Benchmark\n  public long fib_lambda() {\n    try (var evaluator = Evaluator.preconfigured()) {\n      var module = evaluator.evaluate(modulePath(\"org/pkl/core/fib_lambda.pkl\"));\n      return (long) module.getProperties().get(\"result\");\n    }\n  }\n}\n\n// kept similar to pkl code (class, instance method, long argument)\nclass FibJavaImpl {\n  long fib(long n) {\n    return n < 2 ? n : fib(n - 1) + fib(n - 2);\n  }\n}\n"
  },
  {
    "path": "bench/src/jmh/java/org/pkl/core/ListSort.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\nimport org.openjdk.jmh.annotations.*;\nimport org.openjdk.jmh.util.TempFile;\nimport org.openjdk.jmh.util.TempFileManager;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.repl.ReplRequest;\nimport org.pkl.core.repl.ReplResponse;\nimport org.pkl.core.repl.ReplServer;\nimport org.pkl.core.resource.ResourceReaders;\nimport org.pkl.core.util.IoUtils;\n\n@Warmup(iterations = 5, time = 2)\n@Measurement(iterations = 5, time = 2)\n@OutputTimeUnit(TimeUnit.SECONDS)\n@Fork(1)\n@SuppressWarnings(\"unused\")\npublic class ListSort {\n  private static final ReplServer repl =\n      new ReplServer(\n          SecurityManagers.defaultManager,\n          HttpClient.dummyClient(),\n          Loggers.stdErr(),\n          List.of(ModuleKeyFactories.standardLibrary),\n          List.of(ResourceReaders.file()),\n          Map.of(),\n          Map.of(),\n          null,\n          null,\n          null,\n          IoUtils.getCurrentWorkingDir(),\n          StackFrameTransformers.defaultTransformer,\n          false,\n          TraceMode.COMPACT);\n  private static final List<Object> list = new ArrayList<>(100000);\n\n  static {\n    var random = new Random(2786433088656064171L);\n    for (var i = 0; i < 100000; i++) {\n      list.add(random.nextLong());\n    }\n\n    TempFile tempFile;\n    try {\n      tempFile = new TempFileManager().create(\"bench-nums.txt\");\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n    try (var fw = new FileWriter(tempFile.getAbsolutePath())) {\n      for (var elem : list) {\n        fw.append(elem.toString()).append('\\n');\n      }\n      fw.flush();\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n\n    var responses =\n        repl.handleRequest(\n            new ReplRequest.Eval(\n                \"setup\",\n                \"import \\\"pkl:test\\\"\\n\"\n                    + \"random = test.random\\n\"\n                    + \"nums = read(\\\"file://\"\n                    + tempFile.getAbsolutePath()\n                    + \"\\\").text.split(\\\"\\\\n\\\").dropLast(1).map((it) -> it.toInt())\\n\"\n                    + \"cmp = (x, y) -> if (x < y) -1 else if (x == y) 0 else 1\",\n                false,\n                false));\n    if (!responses.isEmpty()) {\n      throw new AssertionError(responses.get(0));\n    }\n  }\n\n  @Benchmark\n  public String sortPkl() {\n    var response =\n        repl.handleRequest(\n                // append `.length` to avoid rendering the list\n                new ReplRequest.Eval(\"sort\", \"nums.sort().length\", false, false))\n            .get(0);\n    if (!(response instanceof ReplResponse.EvalSuccess)) {\n      throw new AssertionError(response);\n    }\n    return ((ReplResponse.EvalSuccess) response).getResult();\n  }\n\n  @Benchmark\n  public String sortWithPkl() {\n    var response =\n        repl.handleRequest(\n                // append `.length` to avoid rendering the list\n                new ReplRequest.Eval(\"sort\", \"nums.sortWith(cmp).length\", false, false))\n            .get(0);\n    if (!(response instanceof ReplResponse.EvalSuccess success)) {\n      throw new AssertionError(response);\n    }\n    return success.getResult();\n  }\n\n  // note that this is an uneven comparison\n  // (timsort vs. merge sort, java.util.ArrayList vs. persistent vector\n  @Benchmark\n  public List<Object> sortJava() {\n    return sort(list);\n  }\n\n  private List<Object> sort(List<Object> self) {\n    var array = self.toArray();\n    Arrays.sort(array);\n    return Arrays.asList(array);\n  }\n\n  // note that this is an uneven comparison\n  // (timsort vs. merge sort, java.util.ArrayList vs. persistent vector\n  @Benchmark\n  public List<Object> sortWithJava() {\n    return sortWith(list, Comparator.comparingLong(x -> (long) x));\n  }\n\n  private List<Object> sortWith(List<Object> self, Comparator<Object> comparator) {\n    var array = self.toArray();\n    Arrays.sort(array, comparator);\n    return Arrays.asList(array);\n  }\n}\n"
  },
  {
    "path": "bench/src/jmh/java/org/pkl/core/parser/ParserBenchmark.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.parser;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.nio.file.Files;\nimport java.util.concurrent.TimeUnit;\nimport org.openjdk.jmh.annotations.*;\nimport org.pkl.commons.test.FileTestUtils;\nimport org.pkl.commons.test.FileTestUtilsKt;\nimport org.pkl.core.Release;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.parser.Parser;\nimport org.pkl.parser.ParserError;\n\n@SuppressWarnings(\"unused\")\n@Warmup(iterations = 5, time = 2)\n@Measurement(iterations = 5, time = 2)\n@OutputTimeUnit(TimeUnit.SECONDS)\n@Fork(1)\npublic class ParserBenchmark {\n  @Benchmark\n  public void parseStdlib() {\n    for (var stdlibModule : Release.current().standardLibrary().modules()) {\n      try {\n        var moduleSource =\n            IoUtils.readClassPathResourceAsString(\n                getClass(), \"/org/pkl/core/stdlib/%s.pkl\".formatted(stdlibModule.substring(4)));\n        new Parser().parseModule(moduleSource);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n  }\n\n  @Benchmark\n  public void parseSnippetTests() {\n    var snippetTestDir =\n        FileTestUtils.getRootProjectDir()\n            .resolve(\"pkl-core/src/test/files/LanguageSnippetTests/input\");\n    for (var snippet : FileTestUtilsKt.listFilesRecursively(snippetTestDir)) {\n      try {\n        var moduleSource = Files.readString(snippet);\n        new Parser().parseModule(moduleSource);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      } catch (ParserError ignore) {\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_class.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nclass Fibonacci {\n  function fib(n) = if (n < 2) n else fib(n - 1) + fib(n - 2)\n}\nresult = new Fibonacci {}.fib(35)\n"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_class_constrained1.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nclass Fibonacci {\n  function fib(n: Int(this >= 0)): Int(this >= 0) = if (n < 2) n else fib(n - 1) + fib(n - 2)\n}\nresult = new Fibonacci {}.fib(35)\n"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_class_constrained2.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nclass Fibonacci {\n  function fib(n: Int(isPositive)): Int(isPositive) = if (n < 2) n else fib(n - 1) + fib(n - 2)\n}\nresult = new Fibonacci {}.fib(35)\n"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_class_explicitThis.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nclass Fibonacci {\n  function fib(n) = if (n < 2) n else this.fib(n - 1) + this.fib(n - 2)\n}\nresult = new Fibonacci {}.fib(35)\n"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_class_typed.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nclass Fibonacci {\n  function fib(n: Int): Int = if (n < 2) n else fib(n - 1) + fib(n - 2)\n}\nresult = new Fibonacci {}.fib(35)\n"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_lambda.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nhidden fib = (n) -> if (n < 2) n else fib.apply(n - 1) + fib.apply(n - 2)\n\nresult = fib.apply(35)"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_module.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nfunction fib(n) = if (n < 2) n else fib(n - 1) + fib(n - 2)\nresult = fib(35)"
  },
  {
    "path": "bench/src/jmh/resources/org/pkl/core/fib_module_explicitThis.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\nfunction fib(n) = if (n < 2) n else this.fib(n - 1) + this.fib(n - 2)\nresult = fib(35)"
  },
  {
    "path": "build.gradle.kts",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// https://youtrack.jetbrains.com/issue/KTIJ-19369\nimport org.jetbrains.gradle.ext.ActionDelegationConfig\nimport org.jetbrains.gradle.ext.ActionDelegationConfig.TestRunner.PLATFORM\nimport org.jetbrains.gradle.ext.ProjectSettings\n\nplugins {\n  pklAllProjects\n  pklGraalVm\n\n  alias(libs.plugins.ideaExt)\n  alias(libs.plugins.jmh) apply false\n  alias(libs.plugins.nexusPublish)\n}\n\nnexusPublishing {\n  repositories {\n    sonatype {\n      nexusUrl.set(uri(\"https://ossrh-staging-api.central.sonatype.com/service/local/\"))\n      snapshotRepositoryUrl.set(uri(\"https://central.sonatype.com/repository/maven-snapshots/\"))\n    }\n  }\n}\n\nidea {\n  project {\n    this as ExtensionAware\n    configure<ProjectSettings> {\n      this as ExtensionAware\n      configure<ActionDelegationConfig> {\n        delegateBuildRunToGradle = true\n        testRunner = PLATFORM\n      }\n    }\n  }\n}\n\nval clean by tasks.existing { delete(layout.buildDirectory) }\n\nval printVersion by tasks.registering { doFirst { println(buildInfo.pklVersion) } }\n\nval message =\n  \"\"\"\n====\nGradle version : ${gradle.gradleVersion}\nJava version   : ${System.getProperty(\"java.version\")}\nisParallel     : ${gradle.startParameter.isParallelProjectExecutionEnabled}\nmaxWorkerCount : ${gradle.startParameter.maxWorkerCount}\nArchitecture   : ${buildInfo.arch}\n\nProject Version        : ${project.version}\nPkl Version            : ${buildInfo.pklVersion}\nPkl Non-Unique Version : ${buildInfo.pklVersionNonUnique}\nGit Commit ID          : ${buildInfo.commitId}\n====\n\"\"\"\n\nval formattedMessage =\n  message.replace(\"\\n====\", \"\\n\" + \"=\".repeat(message.lines().maxByOrNull { it.length }!!.length))\n\nlogger.info(formattedMessage)\n"
  },
  {
    "path": "buildSrc/build.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n  `kotlin-dsl`\n  `jvm-toolchains`\n}\n\n// Keep this in sync with the constants in `BuildInfo.kt` (those are not addressable here).\nval toolchainVersion = 21\n\ndependencies {\n  implementation(libs.downloadTaskPlugin)\n  implementation(libs.spotlessPlugin)\n  implementation(libs.kotlinPlugin) { exclude(module = \"kotlin-android-extensions\") }\n  implementation(libs.shadowPlugin)\n\n  // fix from the Gradle team: makes version catalog symbols available in build scripts\n  // see here for more: https://github.com/gradle/gradle/issues/15383\n  implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))\n}\n\njava {\n  toolchain {\n    languageVersion = JavaLanguageVersion.of(toolchainVersion)\n    vendor = JvmVendorSpec.ADOPTIUM\n  }\n}\n\ntasks.withType<JavaCompile>().configureEach { options.release = toolchainVersion }\n\nkotlin {\n  jvmToolchain(toolchainVersion)\n  compilerOptions {\n    jvmTarget = JvmTarget.fromTarget(toolchainVersion.toString())\n    freeCompilerArgs.add(\"-Xjdk-release=$toolchainVersion\")\n  }\n}\n"
  },
  {
    "path": "buildSrc/settings.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"UnstableApiUsage\")\n\nrootProject.name = \"buildSrc\"\n\npluginManagement {\n  repositories {\n    mavenCentral()\n    gradlePluginPortal()\n  }\n}\n\nplugins { id(\"org.gradle.toolchains.foojay-resolver-convention\") }\n\n// makes ~/.gradle/init.gradle unnecessary and ~/.gradle/gradle.properties optional\ndependencyResolutionManagement {\n  // use same version catalog as main build\n  versionCatalogs { register(\"libs\") { from(files(\"../gradle/libs.versions.toml\")) } }\n\n  repositories {\n    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)\n    mavenCentral()\n    gradlePluginPortal()\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/BuildInfo.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\nimport java.io.File\nimport org.gradle.api.Project\nimport org.gradle.api.artifacts.VersionCatalog\nimport org.gradle.api.artifacts.VersionCatalogsExtension\nimport org.gradle.api.attributes.Category\nimport org.gradle.api.provider.Provider\nimport org.gradle.api.tasks.TaskProvider\nimport org.gradle.api.tasks.testing.Test\nimport org.gradle.internal.extensions.stdlib.capitalized\nimport org.gradle.jvm.toolchain.*\nimport org.gradle.kotlin.dsl.*\nimport org.gradle.kotlin.dsl.support.serviceOf\nimport org.gradle.process.CommandLineArgumentProvider\n\n/**\n * JVM bytecode target; this is pinned at a reasonable version, because downstream JVM projects\n * which consume Pkl will need a minimum Bytecode level at or above this one.\n *\n * Kotlin and Java need matching bytecode targets, so this is expressed as a build setting and\n * constant default. To override, pass `-DpklJdkToolchain=X` to the Gradle command line, where X is\n * a major Java version.\n */\nconst val PKL_JVM_TARGET_DEFAULT_MAXIMUM = 17\n\n/**\n * The Pkl build requires JDK 21+ to build, because JDK 17 is no longer within the default set of\n * supported JDKs for GraalVM. This is a build-time requirement, not a runtime requirement.\n */\nconst val PKL_JDK_VERSION_MIN = 21\n\n/**\n * The JDK minimum is set to match the bytecode minimum, to guarantee that fat JARs work against the\n * earliest supported bytecode target.\n */\nconst val PKL_TEST_JDK_MINIMUM = PKL_JVM_TARGET_DEFAULT_MAXIMUM\n\n/**\n * Maximum JDK version which Pkl is tested with; this should be bumped when new JDK stable releases\n * are issued. At the time of this writing, JDK 23 is the latest available release.\n */\nconst val PKL_TEST_JDK_MAXIMUM = 23\n\n/**\n * Test the full suite of JDKs between [PKL_TEST_JDK_MINIMUM] and [PKL_TEST_JDK_MAXIMUM]; if this is\n * set to `false` (or overridden on the command line), only LTS releases are tested by default.\n */\nconst val PKL_TEST_ALL_JDKS = false\n\n// `buildInfo` in main build scripts\n// `project.extensions.getByType<BuildInfo>()` in precompiled script plugins\nopen class BuildInfo(private val project: Project) {\n  inner class GraalVm(val arch: String) {\n    val homeDir: String by lazy {\n      System.getenv(\"GRAALVM_HOME\") ?: \"${System.getProperty(\"user.home\")}/.graalvm\"\n    }\n\n    val version: String by lazy { libs.findVersion(\"graalVm\").get().toString() }\n\n    val graalVmJdkVersion: String by lazy { libs.findVersion(\"graalVmJdkVersion\").get().toString() }\n\n    val osName: String by lazy {\n      when {\n        os.isMacOsX -> \"macos\"\n        os.isLinux -> \"linux\"\n        os.isWindows -> \"windows\"\n        else -> throw RuntimeException(\"${os.familyName} is not supported.\")\n      }\n    }\n\n    val baseName: String by lazy {\n      \"graalvm-community-jdk-${graalVmJdkVersion}_${osName}-${arch}_bin\"\n    }\n\n    val downloadUrl: String by lazy {\n      val extension = if (os.isWindows) \"zip\" else \"tar.gz\"\n      \"https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${graalVmJdkVersion}/$baseName.$extension\"\n    }\n\n    val downloadFile: File by lazy {\n      val extension = if (os.isWindows) \"zip\" else \"tar.gz\"\n      File(homeDir, \"${baseName}.$extension\")\n    }\n\n    val installDir: File by lazy { File(homeDir, baseName) }\n\n    val baseDir: String by lazy {\n      if (os.isMacOsX) \"$installDir/Contents/Home\" else installDir.toString()\n    }\n  }\n\n  /** The target architecture to build, defaulting to the system architecture. */\n  val targetArch by lazy { System.getProperty(\"pkl.targetArch\") ?: arch }\n\n  /** Tells if this is a cross-arch build (e.g. targeting amd64 when on an aarch64 machine). */\n  val isCrossArch by lazy { arch != targetArch }\n\n  /** Tells if cross-arch builds are supported on this machine. */\n  val isCrossArchSupported by lazy { os.isMacOsX }\n\n  /** Whether to build native executables using the musl toolchain or not. */\n  val musl: Boolean by lazy { java.lang.Boolean.getBoolean(\"pkl.musl\") }\n\n  /** Same logic as [org.gradle.internal.os.OperatingSystem#arch], which is protected. */\n  val arch: String by lazy {\n    when (val arch = System.getProperty(\"os.arch\")) {\n      \"x86\" -> \"i386\"\n      \"x86_64\" -> \"amd64\"\n      \"powerpc\" -> \"ppc\"\n      else -> arch\n    }\n  }\n\n  val graalVmAarch64: GraalVm = GraalVm(\"aarch64\")\n\n  val graalVmAmd64: GraalVm = GraalVm(\"x64\")\n\n  val isCiBuild: Boolean by lazy { System.getenv(\"CI\") != null }\n\n  val isReleaseBuild: Boolean by lazy { java.lang.Boolean.getBoolean(\"releaseBuild\") }\n\n  val isNativeArch: Boolean by lazy { java.lang.Boolean.getBoolean(\"nativeArch\") }\n\n  val jvmTarget: Int by lazy {\n    System.getProperty(\"pklJvmTarget\")?.toInt() ?: PKL_JVM_TARGET_DEFAULT_MAXIMUM\n  }\n\n  // JPMS exports for Truffle; needed on some versions of Java, and transitively within some JARs.\n  private val jpmsExports =\n    arrayOf(\n      \"org.graalvm.truffle/com.oracle.truffle.api.exception=ALL-UNNAMED\",\n      \"org.graalvm.truffle/com.oracle.truffle.api=ALL-UNNAMED\",\n      \"org.graalvm.truffle/com.oracle.truffle.api.nodes=ALL-UNNAMED\",\n      \"org.graalvm.truffle/com.oracle.truffle.api.source=ALL-UNNAMED\",\n    )\n\n  // Extra JPMS modules forced onto the module path via `--add-modules` in some cases.\n  private val jpmsAddModules = arrayOf(\"jdk.unsupported\")\n\n  // Formats `jpmsExports` for use in JAR manifest attributes.\n  val jpmsExportsForJarManifest: String by lazy {\n    jpmsExports.joinToString(\" \") { it.substringBefore(\"=\") }\n  }\n\n  // Formats `jpmsExports` for use on the command line with `--add-exports`.\n  val jpmsExportsForAddExportsFlags: Collection<String> by lazy {\n    jpmsExports.map { \"--add-exports=$it\" }\n  }\n\n  // Formats `jpmsAddModules` for use on the command line with `--add-modules`.\n  val jpmsAddModulesFlags: Collection<String> by lazy { jpmsAddModules.map { \"--add-modules=$it\" } }\n\n  // JVM properties to set during testing.\n  val testProperties =\n    mapOf<String, Any>(\n      // @TODO: this should be removed once pkl supports JPMS as a true Java Module.\n      \"polyglotimpl.DisableClassPathIsolation\" to true\n    )\n\n  val jdkVendor: JvmVendorSpec = JvmVendorSpec.ADOPTIUM\n\n  val jdkToolchainVersion: JavaLanguageVersion by lazy {\n    JavaLanguageVersion.of(System.getProperty(\"pklJdkToolchain\")?.toInt() ?: PKL_JDK_VERSION_MIN)\n  }\n\n  val jdkTestFloor: JavaLanguageVersion by lazy { JavaLanguageVersion.of(PKL_TEST_JDK_MINIMUM) }\n\n  val jdkTestCeiling: JavaLanguageVersion by lazy { JavaLanguageVersion.of(PKL_TEST_JDK_MAXIMUM) }\n\n  val testAllJdks: Boolean by lazy {\n    // By default, Pkl is tested against LTS JDK releases within the bounds of `PKL_TEST_JDK_TARGET`\n    // and `PKL_TEST_JDK_MAXIMUM`. To test against the full suite of JDK versions, past and present,\n    // set `-DpklTestAllJdks=true` on the Gradle command line. This results in non-LTS releases, old\n    // releases, and \"experimental releases\" (newer than the toolchain version) being included in\n    // the default `check` suite.\n    System.getProperty(\"pklTestAllJdks\")?.toBoolean() ?: PKL_TEST_ALL_JDKS\n  }\n\n  val testExperimentalJdks: Boolean by lazy {\n    System.getProperty(\"pklTestFutureJdks\")?.toBoolean() ?: false\n  }\n\n  val testJdkVendors: Sequence<JvmVendorSpec> by lazy {\n    // By default, only OpenJDK is tested during multi-JDK testing. Flip `-DpklTestAllVendors=true`\n    // to additionally test against a suite of JDK vendors, including Azul, Oracle, and GraalVM.\n    when (System.getProperty(\"pklTestAllVendors\")?.toBoolean()) {\n      true -> sequenceOf(JvmVendorSpec.ADOPTIUM, JvmVendorSpec.GRAAL_VM, JvmVendorSpec.ORACLE)\n      else -> sequenceOf(JvmVendorSpec.ADOPTIUM)\n    }\n  }\n\n  private val isArmWindows: Boolean\n    get() {\n      if (!os.isWindows) {\n        return false\n      }\n      // System.getProperty(\"os.arch\") returns the architecture of the JVM, not the host OS.\n      val procArch = System.getenv(\"PROCESSOR_ARCHITECTURE\")\n      return \"ARM64\".equals(procArch, ignoreCase = true)\n    }\n\n  // Assembles a collection of JDK versions which tests can be run against, considering ancillary\n  // parameters like `testAllJdks` and `testExperimentalJdks`.\n  val jdkTestRange: Collection<JavaLanguageVersion> by lazy {\n    if (isArmWindows) {\n      // Java toolchains does not work on ARM windows: https://github.com/gradle/gradle/issues/29807\n      // prevent creating tasks to test different JDKs if developing on a Windows ARM machine.\n      return@lazy listOf()\n    }\n    JavaVersionRange.inclusive(jdkTestFloor, jdkTestCeiling).toList()\n  }\n\n  val JavaLanguageVersion.isEnabled: Boolean\n    get() = isVersionEnabled(this)\n\n  fun isVersionEnabled(version: JavaLanguageVersion): Boolean {\n    return when {\n      testAllJdks -> true\n      multiJdkTesting -> JavaVersionRange.isLTS(version)\n      testExperimentalJdks -> version > jdkToolchainVersion\n      else -> false\n    }\n  }\n\n  private fun JavaToolchainSpec.pklJdkToolchain() {\n    languageVersion.set(jdkToolchainVersion)\n    vendor.set(jdkVendor)\n  }\n\n  private fun labelForVendor(vendor: JvmVendorSpec): String =\n    when (vendor) {\n      JvmVendorSpec.AZUL -> \"Zulu\"\n      JvmVendorSpec.GRAAL_VM -> \"GraalVm\"\n      JvmVendorSpec.ORACLE -> \"Oracle\"\n      JvmVendorSpec.ADOPTIUM -> \"Adoptium\"\n      else -> error(\"Unrecognized JDK vendor: $vendor\")\n    }\n\n  private fun testNamer(baseName: () -> String): (JavaLanguageVersion, JvmVendorSpec?) -> String =\n    { jdkTarget, vendor ->\n      val targetToken =\n        when (vendor) {\n          null -> \"Jdk${jdkTarget.asInt()}\"\n          else -> \"Jdk${jdkTarget.asInt()}${labelForVendor(vendor).capitalized()}\"\n        }\n      if (jdkTarget > jdkToolchainVersion) {\n        // test targets above the toolchain target are considered \"experimental\".\n        \"${baseName()}${targetToken}Experimental\"\n      } else {\n        \"${baseName()}${targetToken}\"\n      }\n    }\n\n  @Suppress(\"UnstableApiUsage\")\n  fun multiJdkTestingWith(\n    templateTask: TaskProvider<out Test>,\n    configurator: MultiJdkTestConfigurator = {},\n  ): Iterable<Provider<out Any>> =\n    with(project) {\n      val isMultiVendor = testJdkVendors.count() > 1\n      val baseNameProvider = { templateTask.get().name }\n      val namer = testNamer(baseNameProvider)\n      val applyConfig: MultiJdkTestConfigurator = { (version, jdk) ->\n        // 1) copy configurations from the template task\n        dependsOn(templateTask)\n        templateTask.get().let { template ->\n          classpath = template.classpath\n          testClassesDirs = template.testClassesDirs\n          jvmArgs.addAll(template.jvmArgs)\n          jvmArgumentProviders.addAll(template.jvmArgumentProviders)\n          forkEvery = template.forkEvery\n          maxParallelForks = template.maxParallelForks\n          minHeapSize = template.minHeapSize\n          maxHeapSize = template.maxHeapSize\n          exclude(template.excludes)\n          template.systemProperties.forEach { prop -> systemProperty(prop.key, prop.value) }\n        }\n\n        // 2) assign launcher\n        javaLauncher = jdk\n\n        // 3) dispatch the user's configurator\n        configurator(version to jdk)\n      }\n\n      serviceOf<JavaToolchainService>().let { toolchains ->\n        jdkTestRange\n          .flatMap { targetVersion ->\n            // multiply out by jdk vendor\n            testJdkVendors.map { vendor -> (targetVersion to vendor) }\n          }\n          .map { (jdkTarget, vendor) ->\n            if (jdkToolchainVersion == jdkTarget)\n              tasks.register(namer(jdkTarget, vendor)) {\n                // alias to `test`\n                dependsOn(templateTask)\n                group = Category.VERIFICATION\n                description =\n                  \"Alias for regular '${baseNameProvider()}' task, on JDK ${jdkTarget.asInt()}\"\n              }\n            else\n              tasks.register(namer(jdkTarget, vendor.takeIf { isMultiVendor }), Test::class) {\n                enabled = jdkTarget.isEnabled\n                group = Category.VERIFICATION\n                description = \"Run tests against JDK ${jdkTarget.asInt()}\"\n                applyConfig(jdkTarget to toolchains.launcherFor { languageVersion = jdkTarget })\n                // fix: on jdk17, we must force the polyglot module on to the modulepath\n                if (jdkTarget.asInt() == 17)\n                  jvmArgumentProviders.add(\n                    CommandLineArgumentProvider {\n                      buildList { listOf(\"--add-modules=org.graalvm.polyglot\") }\n                    }\n                  )\n              }\n          }\n          .toList()\n      }\n    }\n\n  val javaCompiler: Provider<JavaCompiler> by lazy {\n    project.serviceOf<JavaToolchainService>().let { toolchainService ->\n      toolchainService.compilerFor { pklJdkToolchain() }\n    }\n  }\n\n  val javaTestLauncher: Provider<JavaLauncher> by lazy {\n    project.serviceOf<JavaToolchainService>().let { toolchainService ->\n      toolchainService.launcherFor { pklJdkToolchain() }\n    }\n  }\n\n  val multiJdkTesting: Boolean by lazy {\n    // Test Pkl against a full range of JDK versions, past and present, within the\n    // supported bounds of `PKL_TEST_JDK_TARGET` and `PKL_TEST_JDK_MAXIMUM`.\n    //\n    // In CI, this defaults to `true` to catch potential cross-JDK compat regressions or other bugs.\n    // In local dev, this defaults to `false` to speed up the build and reduce contributor load.\n    System.getProperty(\"pklMultiJdkTesting\")?.toBoolean() ?: isCiBuild\n  }\n\n  val hasMuslToolchain: Boolean by lazy {\n    // see .github/scripts/install_musl.sh\n    File(System.getProperty(\"user.home\"), \"staticdeps/bin/x86_64-linux-musl-gcc\").exists()\n  }\n\n  val os: org.gradle.internal.os.OperatingSystem by lazy {\n    org.gradle.internal.os.OperatingSystem.current()\n  }\n\n  // could be `commitId: Provider<String> = project.provider { ... }`\n  val commitId: String by lazy {\n    // allow -DcommitId=abc123 for build environments that don't have git.\n    System.getProperty(\"commitId\").let { if (it != null) return@lazy it }\n    // only run command once per build invocation\n    if (project === project.rootProject) {\n      val process =\n        ProcessBuilder()\n          .command(\"git\", \"rev-parse\", \"--short\", \"HEAD\")\n          .directory(project.rootDir)\n          .start()\n      process.waitFor().also { exitCode ->\n        if (exitCode == -1) throw RuntimeException(process.errorStream.reader().readText())\n      }\n      process.inputStream.reader().readText().trim()\n    } else {\n      project.rootProject.extensions.getByType(BuildInfo::class.java).commitId\n    }\n  }\n\n  val commitish: String by lazy { if (isReleaseBuild) project.version.toString() else commitId }\n\n  val pklVersion: String by lazy {\n    if (isReleaseBuild) {\n      project.version.toString()\n    } else {\n      project.version.toString().replace(\"-SNAPSHOT\", \"-dev+$commitId\")\n    }\n  }\n\n  val pklVersionNonUnique: String by lazy {\n    if (isReleaseBuild) {\n      project.version.toString()\n    } else {\n      project.version.toString().replace(\"-SNAPSHOT\", \"-dev\")\n    }\n  }\n\n  // https://melix.github.io/blog/2021/03/version-catalogs-faq.html#_but_how_can_i_use_the_catalog_in_em_plugins_em_defined_in_code_buildsrc_code\n  val libs: VersionCatalog by lazy {\n    project.extensions.getByType<VersionCatalogsExtension>().named(\"libs\")\n  }\n\n  init {\n    if (!isReleaseBuild) {\n      project.version = \"${project.version}-SNAPSHOT\"\n    }\n  }\n}\n\n// Shape of a function which is applied to configure multi-JDK testing.\nprivate typealias MultiJdkTestConfigurator =\n  Test.(Pair<JavaLanguageVersion, Provider<JavaLauncher>>) -> Unit\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/ExecutableJar.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.file.RegularFileProperty\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.InputFile\nimport org.gradle.api.tasks.OutputFile\nimport org.gradle.api.tasks.TaskAction\n\n/**\n * Builds a self-contained Pkl CLI Jar that is directly executable on Windows, macOS, and Linux.\n *\n * For direct execution, the `java` command must be on the PATH.\n *\n * Technique borrowed from [Mill](https://mill-build.org/blog/5-executable-jars.html).\n */\nabstract class ExecutableJar : DefaultTask() {\n  @get:InputFile abstract val inJar: RegularFileProperty\n\n  @get:OutputFile abstract val outJar: RegularFileProperty\n\n  @get:Input abstract val jvmArgs: ListProperty<String>\n\n  @TaskAction\n  fun buildJar() {\n    val inFile = inJar.get().asFile\n    val outFile = outJar.get().asFile\n    val escapedJvmArgs = jvmArgs.get().joinToString(separator = \" \") { \"\\\"$it\\\"\" }\n    val unixStartScript =\n      \"\"\"\n      @ 2>/dev/null # 2>nul & echo off & goto BOF\n      :\n      exec java $escapedJvmArgs -jar \"$0\" \"$@\"\n      exit\n      \"\"\"\n        .trimIndent()\n    val windowsStartScript =\n      \"\"\"\n      :BOF\n      setlocal\n      @echo off\n      java $escapedJvmArgs -jar \"%~dpnx0\" %*\n      endlocal\n      exit /B %errorlevel%\n      \"\"\"\n        .trimIndent()\n        // need crlf endings for Windows portion of script\n        .replace(\"\\n\", \"\\r\\n\")\n    val startScript = unixStartScript + \"\\r\\n\" + windowsStartScript + \"\\r\\n\".repeat(3)\n    outFile.outputStream().use { outStream ->\n      startScript.byteInputStream().use { it.copyTo(outStream) }\n      inFile.inputStream().use { it.copyTo(outStream) }\n    }\n\n    // chmod a+x\n    outFile.setExecutable(true, false)\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/ExecutableSpec.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.api.provider.Property\n\nabstract class ExecutableSpec {\n  /** The main entrypoint Java class of the executable. */\n  abstract val mainClass: Property<String>\n\n  /**\n   * The name of the native executable.\n   *\n   * Not required if not building a native executable.\n   */\n  abstract val name: Property<String>\n\n  /** The name of the Java executable. */\n  abstract val javaName: Property<String>\n\n  /** The name of the executable that shows in the description when published to Maven. */\n  abstract val documentationName: Property<String>\n\n  /**\n   * The base name of the Maven publication.\n   *\n   * This becomes the base name of the Artifact ID, with the os and arch suffixed.\n   *\n   * For example, `pkl` becomes `pkl-macos-aarch` for the macOS/aarch64 variant.\n   */\n  abstract val publicationName: Property<String>\n\n  /** The name of the artifact ID for the Java executable. */\n  abstract val javaPublicationName: Property<String>\n\n  /** The website for this executable. */\n  abstract val website: Property<String>\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/GradlePluginTests.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.util.GradleVersion\n\nopen class GradlePluginTests {\n  lateinit var minGradleVersion: GradleVersion\n  lateinit var maxGradleVersion: GradleVersion\n  var skippedGradleVersions: List<GradleVersion> = listOf()\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/GradleVersionInfo.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport groovy.json.JsonSlurper\nimport java.net.URI\nimport org.gradle.util.GradleVersion\n\n@Suppress(\"unused\")\nclass GradleVersionInfo(json: Map<String, Any>) {\n  val version: String by json\n\n  val gradleVersion: GradleVersion by lazy { GradleVersion.version(version) }\n\n  val isReleaseVersion: Boolean by lazy {\n    // for some reason, `gradleVersion == gradleVersion.baseVersion` is a compile error\n    gradleVersion.version == gradleVersion.baseVersion.version\n  }\n\n  val buildTime: String by json\n\n  val current: Boolean by json\n\n  val snapshot: Boolean by json\n\n  val nightly: Boolean by json\n\n  val releaseNightly: Boolean by json\n\n  val activeRc: Boolean by json\n\n  val rcFor: String by json\n\n  val milestoneFor: String by json\n\n  val broken: Boolean by json\n\n  val downloadUrl: String by json\n\n  val checksumUrl: String by json\n\n  val wrapperChecksumUrl: String by json\n\n  companion object {\n    private fun fetchAll(): List<GradleVersionInfo> =\n      fetchMultiple(\"https://services.gradle.org/versions/all\")\n\n    fun fetchReleases(): List<GradleVersionInfo> = fetchAll().filter { it.isReleaseVersion }\n\n    fun fetchCurrent(): GradleVersionInfo =\n      fetchSingle(\"https://services.gradle.org/versions/current\")\n\n    fun fetchRc(): GradleVersionInfo? =\n      fetchSingleOrNull(\"https://services.gradle.org/versions/release-candidate\")\n\n    fun fetchNightly(): GradleVersionInfo =\n      fetchSingle(\"https://services.gradle.org/versions/nightly\")\n\n    private fun fetchSingle(url: String): GradleVersionInfo {\n      @Suppress(\"UNCHECKED_CAST\")\n      return GradleVersionInfo(JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>)\n    }\n\n    private fun fetchSingleOrNull(url: String): GradleVersionInfo? {\n      @Suppress(\"UNCHECKED_CAST\")\n      val json = JsonSlurper().parse(URI(url).toURL()) as Map<String, Any>\n      return if (json.isEmpty()) null else GradleVersionInfo(json)\n    }\n\n    private fun fetchMultiple(url: String): List<GradleVersionInfo> {\n      @Suppress(\"UNCHECKED_CAST\")\n      return (JsonSlurper().parse(URI(url).toURL()) as List<Map<String, Any>>).map {\n        GradleVersionInfo(it)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/HtmlValidator.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.api.Project\nimport org.gradle.api.file.FileCollection\n\nopen class HtmlValidator(project: Project) {\n  var sources: FileCollection = project.files()\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/InstallGraalVm.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.nio.file.Files\nimport java.nio.file.Paths\nimport java.nio.file.StandardCopyOption\nimport java.util.*\nimport javax.inject.Inject\nimport kotlin.io.path.createDirectories\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.internal.file.FileOperations\nimport org.gradle.api.provider.Property\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.TaskAction\nimport org.gradle.process.ExecOperations\n\nabstract class InstallGraalVm\n@Inject\nconstructor(\n  private val fileOperations: FileOperations,\n  private val execOperations: ExecOperations,\n) : DefaultTask() {\n  @get:Input abstract val graalVm: Property<BuildInfo.GraalVm>\n\n  init {\n    @Suppress(\"LeakingThis\") onlyIf(\"GraalVM not installed\") { !graalVm.get().installDir.exists() }\n  }\n\n  @TaskAction\n  @Suppress(\"unused\")\n  fun run() {\n    // minimize chance of corruption by extract-to-random-dir-and-flip-symlink\n    val distroDir = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())\n    try {\n      distroDir.createDirectories()\n      println(\"Extracting ${graalVm.get().downloadFile} into $distroDir\")\n      // faster and more reliable than Gradle's `copy { from tarTree() }`\n      execOperations.exec {\n        workingDir = distroDir.toFile()\n        executable = \"tar\"\n        args(\"--strip-components=1\", \"-xzf\", graalVm.get().downloadFile)\n      }\n\n      val os = org.gradle.internal.os.OperatingSystem.current()\n      val distroBinDir =\n        if (os.isMacOsX) distroDir.resolve(\"Contents/Home/bin\") else distroDir.resolve(\"bin\")\n\n      println(\"Installing native-image into $distroDir\")\n      val gvmVersionMajor =\n        requireNotNull(graalVm.get().version.split(\".\").first().toIntOrNull()) {\n          \"Invalid GraalVM JDK version: ${graalVm.get().graalVmJdkVersion}\"\n        }\n      if (gvmVersionMajor < 24) {\n        execOperations.exec {\n          val executableName = if (os.isWindows) \"gu.cmd\" else \"gu\"\n          executable = distroBinDir.resolve(executableName).toString()\n          args(\"install\", \"--no-progress\", \"native-image\")\n        }\n      }\n\n      println(\"Creating symlink ${graalVm.get().installDir} for $distroDir\")\n      val tempLink = Paths.get(graalVm.get().homeDir, UUID.randomUUID().toString())\n      Files.createSymbolicLink(tempLink, distroDir)\n      try {\n        Files.move(tempLink, graalVm.get().installDir.toPath(), StandardCopyOption.ATOMIC_MOVE)\n      } catch (e: Exception) {\n        try {\n          fileOperations.delete(tempLink.toFile())\n        } catch (ignored: Exception) {}\n        throw e\n      }\n    } catch (e: Exception) {\n      try {\n        fileOperations.delete(distroDir)\n      } catch (ignored: Exception) {}\n      throw e\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/JavaVersionRange.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"MemberVisibilityCanBePrivate\")\n\nimport java.util.*\nimport org.gradle.jvm.toolchain.JavaLanguageVersion\n\ntypealias JavaVersionPair = Pair<JavaLanguageVersion, JavaLanguageVersion>\n\n// All LTS releases.\nprivate val ltsReleases =\n  sortedSetOf(\n    JavaLanguageVersion.of(8),\n    JavaLanguageVersion.of(11),\n    JavaLanguageVersion.of(17),\n    JavaLanguageVersion.of(21),\n  )\n\n/** Describes an inclusive range of JVM versions, based on the [JavaLanguageVersion] type. */\n@JvmInline\nvalue class JavaVersionRange private constructor(private val bounds: JavaVersionPair) :\n  Iterable<JavaLanguageVersion> {\n  @Suppress(\"unused\")\n  companion object {\n    fun isLTS(version: JavaLanguageVersion): Boolean = version in ltsReleases\n\n    fun inclusive(floor: JavaLanguageVersion, ceiling: JavaLanguageVersion): JavaVersionRange =\n      JavaVersionRange(floor to ceiling)\n\n    fun startingAt(floor: JavaLanguageVersion): JavaVersionRange =\n      inclusive(floor, JavaLanguageVersion.of(PKL_TEST_JDK_MAXIMUM))\n\n    fun upTo(ceiling: JavaLanguageVersion): JavaVersionRange =\n      inclusive(JavaLanguageVersion.of(PKL_TEST_JDK_MINIMUM), ceiling)\n  }\n\n  operator fun contains(version: JavaLanguageVersion): Boolean =\n    version >= bounds.first && version <= bounds.second\n\n  fun asSequence(): Sequence<JavaLanguageVersion> = sequence {\n    var current = bounds.first\n    while (current <= bounds.second) {\n      yield(current)\n      current = JavaLanguageVersion.of(current.asInt() + 1)\n    }\n  }\n\n  fun asSortedSet(): SortedSet<JavaLanguageVersion> = asSequence().toSortedSet()\n\n  override fun iterator(): Iterator<JavaLanguageVersion> = asSortedSet().iterator()\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/MergeSourcesJars.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.io.File\nimport java.util.regex.Matcher\nimport java.util.regex.Pattern\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.file.ConfigurableFileCollection\nimport org.gradle.api.file.FileVisitDetails\nimport org.gradle.api.file.RegularFileProperty\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.provider.MapProperty\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.InputFiles\nimport org.gradle.api.tasks.OutputFile\nimport org.gradle.api.tasks.TaskAction\nimport org.gradle.kotlin.dsl.listProperty\nimport org.gradle.kotlin.dsl.mapProperty\n\nopen class MergeSourcesJars : DefaultTask() {\n  @get:InputFiles val inputJars: ConfigurableFileCollection = project.objects.fileCollection()\n\n  @get:InputFiles\n  val mergedBinaryJars: ConfigurableFileCollection = project.objects.fileCollection()\n\n  @get:Input val relocatedPackages: MapProperty<String, String> = project.objects.mapProperty()\n\n  @get:Input\n  var sourceFileExtensions: ListProperty<String> =\n    project.objects.listProperty<String>().convention(listOf(\".java\", \".kt\"))\n\n  @get:OutputFile val outputJar: RegularFileProperty = project.objects.fileProperty()\n\n  @TaskAction\n  @Suppress(\"unused\")\n  fun merge() {\n    val binaryPaths = collectBinaryPaths()\n\n    val relocatedPkgs = relocatedPackages.get()\n\n    val relocatedPaths =\n      relocatedPkgs.entries.associate { (key, value) -> toPath(key) to toPath(value) }\n\n    // use negative lookbehind to match any that don't precede with\n    // a word or a period character. should catch most cases.\n    val importPattern =\n      Pattern.compile(\n        \"(?<!(\\\\w|\\\\.))(\" + relocatedPkgs.keys.joinToString(\"|\") { it.replace(\".\", \"\\\\.\") } + \")\"\n      )\n\n    val sourceFileExts = sourceFileExtensions.get()\n\n    val outDir = this.temporaryDir\n\n    for (jar in inputJars) {\n      // as of Gradle 2.4, doesn't visit dirs despite the claims\n      project.zipTree(jar).visit {\n        val details = this\n        if (details.isDirectory) return@visit\n\n        var path = details.relativePath.parent!!.pathString\n        val relocatedPath = relocatedPaths.keys.find { path.startsWith(it) }\n        if (relocatedPath != null) {\n          path = path.replace(relocatedPath, relocatedPaths.getValue(relocatedPath))\n        }\n        // conservative shrinking\n        if (!binaryPaths.contains(path)) return@visit\n\n        val outFile = File(\"$outDir/$path/${details.file.name}\")\n        outFile.parentFile.mkdirs()\n\n        if (sourceFileExts.any { details.file.name.endsWith(it) }) {\n          val oldContents = details.file.readText(Charsets.UTF_8)\n          val newContents = fixImports(relocatedPkgs, details, oldContents, importPattern)\n          outFile.writeText(newContents, Charsets.UTF_8)\n        } else {\n          details.copyTo(outFile)\n        }\n      }\n    }\n\n    project.ant.invokeMethod(\"jar\", mapOf(\"basedir\" to outDir, \"destfile\" to outputJar.get()))\n  }\n\n  private fun collectBinaryPaths(): Set<String> {\n    val result = mutableSetOf<String>()\n    for (jar in mergedBinaryJars) {\n      // as of Gradle 2.4 doesn't visit dirs despite the claims\n      project.zipTree(jar).visit {\n        val details = this\n        if (details.isDirectory) return@visit // avoid adding empty dirs\n        result.add(details.relativePath.parent!!.pathString)\n      }\n    }\n    return result\n  }\n\n  private fun fixImports(\n    relocatedPkgs: Map<String, String>,\n    details: FileVisitDetails,\n    sourceText: String,\n    importPattern: Pattern,\n  ): String {\n    val matcher = importPattern.matcher(sourceText)\n    val buffer = StringBuffer()\n    logger.debug(\"Inspecting file: {}\", details.relativePath)\n    while (matcher.find()) {\n      val newStat = relocatedPkgs[matcher.group(2)]\n      logger.debug(\"Old: {}\", matcher.group())\n      logger.debug(\"New: {}\", newStat)\n      matcher.appendReplacement(buffer, Matcher.quoteReplacement(newStat))\n    }\n    matcher.appendTail(buffer)\n    return buffer.toString()\n  }\n\n  private fun toPath(packageName: String): String = packageName.replace(\".\", \"/\")\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/NativeImageBuild.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport javax.inject.Inject\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.file.ConfigurableFileCollection\nimport org.gradle.api.provider.ListProperty\nimport org.gradle.api.provider.Property\nimport org.gradle.api.provider.Provider\nimport org.gradle.api.services.BuildService\nimport org.gradle.api.services.BuildServiceParameters\nimport org.gradle.api.tasks.ClasspathNormalizer\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.InputFiles\nimport org.gradle.api.tasks.OutputFile\nimport org.gradle.api.tasks.PathSensitivity\nimport org.gradle.api.tasks.TaskAction\nimport org.gradle.kotlin.dsl.registerIfAbsent\nimport org.gradle.kotlin.dsl.withNormalizer\nimport org.gradle.process.ExecOperations\n\nenum class Architecture {\n  AMD64,\n  AARCH64,\n}\n\nabstract class NativeImageBuildService : BuildService<BuildServiceParameters.None>\n\nabstract class NativeImageBuild : DefaultTask() {\n  @get:Input abstract val imageName: Property<String>\n\n  @get:Input abstract val extraNativeImageArgs: ListProperty<String>\n\n  @get:Input abstract val arch: Property<Architecture>\n\n  @get:Input abstract val mainClass: Property<String>\n\n  @get:InputFiles abstract val classpath: ConfigurableFileCollection\n\n  private val outputDir = project.layout.buildDirectory.dir(\"executable\")\n\n  @get:OutputFile val outputFile = outputDir.flatMap { it.file(imageName) }\n\n  @get:Inject protected abstract val execOperations: ExecOperations\n\n  private val graalVm: Provider<BuildInfo.GraalVm> =\n    arch.map { a ->\n      when (a) {\n        Architecture.AMD64 -> buildInfo.graalVmAmd64\n        Architecture.AARCH64 -> buildInfo.graalVmAarch64\n      }\n    }\n\n  private val buildInfo: BuildInfo = project.extensions.getByType(BuildInfo::class.java)\n\n  private val nativeImageCommandName =\n    if (buildInfo.os.isWindows) \"native-image.cmd\" else \"native-image\"\n\n  private val nativeImageExecutable = graalVm.map { \"${it.baseDir}/bin/$nativeImageCommandName\" }\n\n  private val extraArgsFromProperties by lazy {\n    System.getProperties()\n      .filter { it.key.toString().startsWith(\"pkl.native\") }\n      .map { \"${it.key}=${it.value}\".substring(\"pkl.native\".length) }\n  }\n\n  private val buildService =\n    project.gradle.sharedServices.registerIfAbsent(\n      \"nativeImageBuildService\",\n      NativeImageBuildService::class,\n    ) {\n      maxParallelUsages.set(1)\n    }\n\n  init {\n    // ensure native-image builds run in serial (prevent `gw buildNative` from consuming all host\n    // CPU resources).\n    usesService(buildService)\n\n    group = \"build\"\n\n    inputs\n      .files(classpath)\n      .withPropertyName(\"runtimeClasspath\")\n      .withNormalizer(ClasspathNormalizer::class)\n    inputs\n      .files(nativeImageExecutable)\n      .withPropertyName(\"graalVmNativeImage\")\n      .withPathSensitivity(PathSensitivity.ABSOLUTE)\n  }\n\n  @TaskAction\n  protected fun run() {\n    execOperations.exec {\n      val exclusions =\n        listOf(buildInfo.libs.findLibrary(\"graalSdk\").get()).map { it.get().module.name }\n\n      executable = nativeImageExecutable.get()\n      workingDir(outputDir)\n\n      args = buildList {\n        // must be emitted before any experimental options are used\n        add(\"-H:+UnlockExperimentalVMOptions\")\n        // currently gives a deprecation warning, but we've been told\n        // that the \"initialize everything at build time\" *CLI* option is likely here to stay\n        add(\"--initialize-at-build-time=\")\n        // needed for messagepack-java (see https://github.com/msgpack/msgpack-java/issues/600)\n        add(\"--initialize-at-run-time=org.msgpack.core.buffer.DirectBufferAccess\")\n        add(\"--no-fallback\")\n        add(\"-H:IncludeResources=org/pkl/core/stdlib/.*\\\\.pkl\")\n        add(\"-H:IncludeResources=org/jline/utils/.*\")\n        add(\"-H:IncludeResourceBundles=org.pkl.core.errorMessages\")\n        add(\"-H:IncludeResourceBundles=org.pkl.parser.errorMessages\")\n        add(\"-H:IncludeResources=org/pkl/commons/cli/PklCARoots.pem\")\n        add(\"-H:Class=${mainClass.get()}\")\n        add(\"-o\")\n        add(imageName.get())\n        // the actual limit (currently) used by native-image is this number + 1400 (idea is to\n        // compensate for Truffle's own nodes)\n        add(\"-H:MaxRuntimeCompileMethods=1800\")\n        add(\"-H:+EnforceMaxRuntimeCompileMethods\")\n        add(\"--enable-url-protocols=http,https\")\n        add(\"-H:+ReportExceptionStackTraces\")\n        // disable automatic support for JVM CLI options (puts our main class in full control of\n        // argument parsing)\n        add(\"-H:-ParseRuntimeOptions\")\n        // quick build mode: 40% faster compilation, 20% smaller (but presumably also slower)\n        // executable\n        if (!buildInfo.isReleaseBuild) {\n          add(\"-Ob\")\n        }\n        if (buildInfo.isNativeArch) {\n          add(\"-march=native\")\n        } else {\n          add(\"-march=compatibility\")\n        }\n        // native-image rejects non-existing class path entries -> filter\n        add(\"--class-path\")\n        val pathInput =\n          classpath.filter {\n            it.exists() && !exclusions.any { exclude -> it.name.contains(exclude) }\n          }\n        add(pathInput.asPath)\n        // make sure dev machine stays responsive (15% slowdown on my laptop)\n        val processors =\n          Runtime.getRuntime().availableProcessors() /\n            if (buildInfo.os.isMacOsX && !buildInfo.isCiBuild) 4 else 1\n        add(\"-J-XX:ActiveProcessorCount=${processors}\")\n        // Pass through all `HOMEBREW_` prefixed environment variables to allow build with shimmed\n        // tools.\n        addAll(environment.keys.filter { it.startsWith(\"HOMEBREW_\") }.map { \"-E$it\" })\n        addAll(extraNativeImageArgs.get())\n        addAll(extraArgsFromProperties)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/PklFormatterSpotless.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport com.diffplug.spotless.FormatterFunc\nimport com.diffplug.spotless.FormatterStep\nimport java.io.Serial\nimport java.io.Serializable\nimport java.net.URLClassLoader\nimport org.gradle.api.artifacts.Configuration\n\nclass PklFormatterStep(@Transient private val configuration: Configuration) : Serializable {\n  companion object {\n    @Serial private const val serialVersionUID: Long = 1L\n  }\n\n  fun create(): FormatterStep {\n    return FormatterStep.createLazy(\n      \"pkl\",\n      { PklFormatterStep(configuration) },\n      { PklFormatterFunc(configuration) },\n    )\n  }\n}\n\nclass PklFormatterFunc(@Transient private val configuration: Configuration) :\n  FormatterFunc, Serializable {\n  companion object {\n    @Serial private const val serialVersionUID: Long = 1L\n  }\n\n  private val classLoader by lazy {\n    val urls = configuration.files.map { it.toURI().toURL() }\n    URLClassLoader(urls.toTypedArray())\n  }\n\n  private val formatterClass by lazy { classLoader.loadClass(\"org.pkl.formatter.Formatter\") }\n\n  private val formatMethod by lazy { formatterClass.getMethod(\"format\", String::class.java) }\n\n  private val formatterInstance by lazy { formatterClass.getConstructor().newInstance() }\n\n  override fun apply(input: String): String {\n    return formatMethod(formatterInstance, input) as String\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/PklPublishing.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.nio.charset.StandardCharsets\nimport java.util.Base64\nimport org.gradle.api.Project\nimport org.gradle.api.publish.PublishingExtension\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.publish.maven.tasks.AbstractPublishToMaven\nimport org.gradle.api.publish.maven.tasks.GenerateMavenPom\nimport org.gradle.kotlin.dsl.*\nimport org.gradle.plugins.signing.SigningExtension\n\n/** Configures common POM metadata (licenses, developers, SCM, etc.) for all Pkl publications. */\nfun Project.configurePklPomMetadata() {\n  extensions.configure<PublishingExtension> {\n    publications.withType<MavenPublication>().configureEach {\n      pom {\n        name.set(artifactId)\n        licenses {\n          license {\n            name.set(\"The Apache Software License, Version 2.0\")\n            url.set(\"https://github.com/apple/pkl/blob/main/LICENSE.txt\")\n          }\n        }\n        developers {\n          developer {\n            id.set(\"pkl-authors\")\n            name.set(\"The Pkl Authors\")\n            email.set(\"pkl-oss@group.apple.com\")\n          }\n        }\n        scm {\n          connection.set(\"scm:git:git://github.com/apple/pkl.git\")\n          developerConnection.set(\"scm:git:ssh://github.com/apple/pkl.git\")\n          val buildInfo = extensions.getByType<BuildInfo>()\n          url.set(\"https://github.com/apple/pkl/tree/${buildInfo.commitish}\")\n        }\n        issueManagement {\n          system.set(\"GitHub Issues\")\n          url.set(\"https://github.com/apple/pkl/issues\")\n        }\n        ciManagement {\n          system.set(\"GitHub Actions\")\n          url.set(\"https://github.com/apple/pkl/actions\")\n        }\n      }\n    }\n  }\n}\n\n/** Configures POM validation task to check for unresolved versions and snapshots in releases. */\nfun Project.configurePomValidation() {\n  val validatePom by\n    tasks.registering {\n      if (tasks.findByName(\"generatePomFileForLibraryPublication\") == null) {\n        return@registering\n      }\n      val generatePomFileForLibraryPublication by tasks.existing(GenerateMavenPom::class)\n      val outputFile =\n        layout.buildDirectory.file(\"validatePom\") // dummy output to satisfy up-to-date check\n\n      dependsOn(generatePomFileForLibraryPublication)\n      inputs.file(generatePomFileForLibraryPublication.get().destination)\n      outputs.file(outputFile)\n\n      doLast {\n        outputFile.get().asFile.delete()\n\n        val pomFile = generatePomFileForLibraryPublication.get().destination\n        assert(pomFile.exists())\n\n        val text = pomFile.readText()\n\n        run {\n          val unresolvedVersion = Regex(\"<version>.*[+,()\\\\[\\\\]].*</version>\")\n          val matches = unresolvedVersion.findAll(text).toList()\n          if (matches.isNotEmpty()) {\n            throw org.gradle.api.GradleException(\n              \"\"\"\n        Found unresolved version selector(s) in generated POM:\n        ${matches.joinToString(\"\\n\") { it.groupValues[0] }}\n      \"\"\"\n                .trimIndent()\n            )\n          }\n        }\n\n        val buildInfo = project.extensions.getByType<BuildInfo>()\n        if (buildInfo.isReleaseBuild) {\n          val snapshotVersion = Regex(\"<version>.*-SNAPSHOT</version>\")\n          val matches = snapshotVersion.findAll(text).toList()\n          if (matches.isNotEmpty()) {\n            throw org.gradle.api.GradleException(\n              \"\"\"\n        Found snapshot version(s) in generated POM of Pkl release version:\n        ${matches.joinToString(\"\\n\") { it.groupValues[0] }}\n      \"\"\"\n                .trimIndent()\n            )\n          }\n        }\n\n        outputFile.get().asFile.writeText(\"OK\")\n      }\n    }\n\n  tasks.named(\"publish\") { dependsOn(validatePom) }\n}\n\n/** Configures signing for Pkl publications. */\nfun Project.configurePklSigning() {\n  // Workaround for maven publish plugin not setting up dependencies correctly.\n  // Taken from https://github.com/gradle/gradle/issues/26091#issuecomment-1798137734\n  val dependsOnTasks = mutableListOf<String>()\n\n  tasks.withType<AbstractPublishToMaven>().configureEach {\n    dependsOnTasks.add(name.replace(\"publish\", \"sign\").replaceAfter(\"Publication\", \"\"))\n    dependsOn(dependsOnTasks)\n  }\n\n  extensions.configure<SigningExtension> {\n    // provided as env vars `ORG_GRADLE_PROJECT_signingKey` and\n    // `ORG_GRADLE_PROJECT_signingPassword` in CI.\n    val signingKey =\n      (findProperty(\"signingKey\") as String?)?.let {\n        Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)\n      }\n    val signingPassword = findProperty(\"signingPassword\") as String?\n    if (signingKey != null && signingPassword != null) {\n      useInMemoryPgpKeys(signingKey, signingPassword)\n    }\n    extensions.getByType<PublishingExtension>().publications.findByName(\"library\")?.let { sign(it) }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/ResolveSourcesJars.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.artifacts.Configuration\nimport org.gradle.api.artifacts.result.ResolvedArtifactResult\nimport org.gradle.api.artifacts.result.ResolvedDependencyResult\nimport org.gradle.api.file.DirectoryProperty\nimport org.gradle.api.provider.Property\nimport org.gradle.api.tasks.InputFiles\nimport org.gradle.api.tasks.OutputDirectory\nimport org.gradle.api.tasks.TaskAction\nimport org.gradle.jvm.JvmLibrary\nimport org.gradle.kotlin.dsl.property\nimport org.gradle.language.base.artifact.SourcesArtifact\n\nopen class ResolveSourcesJars : DefaultTask() {\n  @get:InputFiles val configuration: Property<Configuration> = project.objects.property()\n\n  @get:OutputDirectory val outputDir: DirectoryProperty = project.objects.directoryProperty()\n\n  @TaskAction\n  @Suppress(\"UnstableApiUsage\", \"unused\")\n  fun resolve() {\n    val componentIds =\n      configuration.get().incoming.resolutionResult.allDependencies.map {\n        (it as ResolvedDependencyResult).selected.id\n      }\n\n    val resolutionResult =\n      project.dependencies\n        .createArtifactResolutionQuery()\n        .forComponents(componentIds)\n        .withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java)\n        .execute()\n\n    val resolvedJars =\n      resolutionResult.resolvedComponents\n        .flatMap { it.getArtifacts(SourcesArtifact::class.java) }\n        .map { (it as ResolvedArtifactResult).file }\n\n    // copying to an output dir because I don't know how else to describe task outputs\n    project.sync {\n      from(resolvedJars)\n      into(outputDir)\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklAllProjects.gradle.kts",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport com.diffplug.gradle.spotless.KotlinGradleExtension\nimport org.gradle.accessors.dm.LibrariesForLibs\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\nimport org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile\n\nplugins { id(\"com.diffplug.spotless\") }\n\nval buildInfo = extensions.create<BuildInfo>(\"buildInfo\", project)\n\ndependencyLocking { lockAllConfigurations() }\n\nconfigurations {\n  val rejectedVersionSuffix = Regex(\"-alpha|-beta|-eap|-m|-rc|-snapshot\", RegexOption.IGNORE_CASE)\n  configureEach {\n    resolutionStrategy {\n      componentSelection {\n        all {\n          if (rejectedVersionSuffix.containsMatchIn(candidate.version)) {\n            reject(\n              \"Rejected dependency $candidate \" +\n                \"because it has a prelease version suffix matching `$rejectedVersionSuffix`.\"\n            )\n          }\n        }\n      }\n    }\n  }\n}\n\nconfigurations.all {\n  resolutionStrategy.eachDependency {\n    if (requested.group == \"org.jetbrains.kotlin\") {\n      // prevent transitive deps from bumping Koltin version\n      useVersion(libs.versions.kotlin.get())\n    }\n  }\n}\n\nplugins.withType(JavaPlugin::class).configureEach {\n  tasks.withType<JavaCompile>().configureEach { options.release = 17 }\n}\n\ntasks.withType<KotlinJvmCompile>().configureEach {\n  compilerOptions {\n    jvmTarget = JvmTarget.JVM_17\n    freeCompilerArgs.addAll(\"-Xjsr305=strict\", \"-Xjvm-default=all\")\n    freeCompilerArgs.add(\"-Xjdk-release=17\")\n  }\n}\n\nplugins.withType(IdeaPlugin::class).configureEach {\n  val errorMessage =\n    \"Use IntelliJ Gradle import instead of running the `idea` task. See README for more information.\"\n\n  tasks.named(\"idea\") { doFirst { throw GradleException(errorMessage) } }\n  tasks.named(\"ideaModule\") { doFirst { throw GradleException(errorMessage) } }\n  if (project == rootProject) {\n    tasks.named(\"ideaProject\") { doFirst { throw GradleException(errorMessage) } }\n  }\n}\n\nplugins.withType(MavenPublishPlugin::class).configureEach {\n  configure<PublishingExtension> {\n    // CI builds pick up artifacts from this repo.\n    // It's important that this repo is only declared once per project.\n    repositories {\n      maven {\n        name = \"projectLocal\" // affects task names\n        url = rootDir.resolve(\"build/m2\").toURI()\n      }\n    }\n    // use resolved/locked (e.g., `1.15`)\n    // instead of declared (e.g., `1.+`)\n    // dependency versions in generated POMs\n    publications {\n      withType(MavenPublication::class.java) {\n        versionMapping { allVariants { fromResolutionResult() } }\n      }\n    }\n  }\n}\n\n// settings.gradle.kts sets `--write-locks`\n// if Gradle command line contains this task name\nval updateDependencyLocks by\n  tasks.registering {\n    doLast { configurations.filter { it.isCanBeResolved }.forEach { it.resolve() } }\n  }\n\nval allDependencies by tasks.registering(DependencyReportTask::class)\n\ntasks.withType(Test::class).configureEach {\n  System.getProperty(\"testReportsDir\")?.let { reportsDir ->\n    reports.junitXml.outputLocation.set(file(reportsDir).resolve(project.name).resolve(name))\n  }\n  debugOptions {\n    enabled = System.getProperty(\"jvmdebug\")?.toBoolean() ?: false\n    @Suppress(\"UnstableApiUsage\")\n    host = \"*\"\n    port = 5005\n    suspend = true\n    server = true\n  }\n}\n\ntasks.withType(JavaExec::class).configureEach {\n  debugOptions {\n    enabled = System.getProperty(\"jvmdebug\")?.toBoolean() ?: false\n    @Suppress(\"UnstableApiUsage\")\n    host = \"*\"\n    port = 5005\n    suspend = true\n    server = true\n  }\n}\n\n// Version Catalog library symbols.\nprivate val libs = the<LibrariesForLibs>()\n\nprivate val licenseHeaderFile by lazy {\n  rootProject.file(\"buildSrc/src/main/resources/license-header.star-block.txt\")\n}\n\nprivate fun KotlinGradleExtension.configureFormatter() {\n  ktfmt(libs.versions.ktfmt.get()).googleStyle()\n  licenseHeaderFile(licenseHeaderFile, \"([a-zA-Z]|@file|//)\")\n}\n\nval originalRemoteName = System.getenv(\"PKL_ORIGINAL_REMOTE_NAME\") ?: \"origin\"\n// if we're running against a release branch (or a PR targeted at one), use that branch for\n// ratcheting\n// these env vars are set by GitHub actions:\n// https://docs.github.com/en/actions/reference/workflows-and-actions/variables#default-environment-variables\nval ratchetBranchName =\n  (System.getenv(\"GITHUB_BASE_REF\") ?: System.getenv(\"GITHUB_REF_NAME\"))?.let {\n    if (it.startsWith(\"release/\")) it else null\n  } ?: \"main\"\n\nspotless {\n  ratchetFrom = \"$originalRemoteName/$ratchetBranchName\"\n\n  // When building root project, format buildSrc files too.\n  // We need this because buildSrc is not a subproject of the root project, so a top-level\n  // `spotlessApply` will not trigger `buildSrc:spotlessApply`.\n  if (project === rootProject) {\n    kotlinGradle {\n      configureFormatter()\n      target(\"*.kts\", \"buildSrc/*.kts\", \"buildSrc/src/*/kotlin/**/*.kts\")\n    }\n    kotlin {\n      ktfmt(libs.versions.ktfmt.get()).googleStyle()\n      target(\"buildSrc/src/*/kotlin/**/*.kt\")\n      licenseHeaderFile(licenseHeaderFile)\n    }\n  } else {\n    kotlinGradle {\n      configureFormatter()\n      target(\"*.kts\")\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklFatJar.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.api.GradleException\nimport org.gradle.api.artifacts.Configuration\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.api.tasks.bundling.Jar\nimport org.gradle.api.tasks.testing.Test\nimport org.gradle.kotlin.dsl.*\n\nplugins {\n  `java-library`\n  `maven-publish`\n  id(\"com.gradleup.shadow\")\n}\n\n// make fat Jar available to other subprojects\nval fatJarConfiguration: Configuration = configurations.create(\"fatJar\")\n\nval fatJarPublication: MavenPublication = publishing.publications.create<MavenPublication>(\"fatJar\")\n\n// ideally we'd configure this automatically based on project dependencies\nval firstPartySourcesJarsConfiguration: Configuration =\n  configurations.create(\"firstPartySourcesJars\")\n\nval relocations =\n  mapOf(\n    // pkl-core dependencies\n    \"org.organicdesign.fp.\" to \"org.pkl.thirdparty.paguro.\",\n    \"org.snakeyaml.engine.\" to \"org.pkl.thirdparty.snakeyaml.engine.\",\n    \"org.msgpack.\" to \"org.pkl.thirdparty.msgpack.\",\n    \"org.w3c.dom.\" to \"org.pkl.thirdparty.w3c.dom.\",\n    \"com.oracle.svm.core.\" to \"org.pkl.thirdparty.svm.\",\n\n    // pkl-cli dependencies\n    \"org.jline.\" to \"org.pkl.thirdparty.jline.\",\n    \"com.github.ajalt.clikt.\" to \"org.pkl.thirdparty.clikt.\",\n    \"com.github.ajalt.colormath.\" to \"org.pkl.thirdparty.colormath.\",\n    \"com.github.ajalt.mordant.\" to \"org.pkl.thirdparty.mordant.\",\n    \"com.sun.jna.\" to \"org.pkl.thirdparty.jna.\",\n    \"kotlin.\" to \"org.pkl.thirdparty.kotlin.\",\n    \"kotlinx.\" to \"org.pkl.thirdparty.kotlinx.\",\n    \"org.intellij.\" to \"org.pkl.thirdparty.intellij.\",\n    \"org.fusesource.jansi.\" to \"org.pkl.thirdparty.jansi.\",\n    \"org.fusesource.hawtjni.\" to \"org.pkl.thirdparty.hawtjni.\",\n\n    // pkl-doc dependencies\n    \"org.commonmark.\" to \"org.pkl.thirdparty.commonmark.\",\n    \"org.jetbrains.\" to \"org.pkl.thirdparty.jetbrains.\",\n    \"_COROUTINE.\" to \"org.pkl.thirdparty.kotlinx._COROUTINE.\",\n\n    // pkl-config-java dependencies\n    \"io.leangen.geantyref.\" to \"org.pkl.thirdparty.geantyref.\",\n\n    // pkl-codegen-java dependencies\n    \"com.palantir.javapoet.\" to \"org.pkl.thirdparty.javapoet.\",\n\n    // pkl-codegen-kotlin dependencies\n    \"com.squareup.kotlinpoet.\" to \"org.pkl.thirdparty.kotlinpoet.\",\n  )\n\nfor ((key, value) in relocations) {\n  if (!key.endsWith(\".\")) {\n    throw GradleException(\n      \"Invalid relocation `\\\"$key\\\" to \\\"$value\\\"`: `$key` should end with a dot\"\n    )\n  }\n  if (!value.endsWith(\".\")) {\n    throw GradleException(\n      \"Invalid relocation `\\\"$key\\\" to \\\"$value\\\"`: `$value` should end with a dot\"\n    )\n  }\n}\n\nval nonRelocations = listOf(\"com/oracle/truffle/\", \"org/graalvm/\")\n\ntasks.shadowJar {\n  inputs.property(\"relocations\", relocations)\n\n  archiveClassifier.set(null as String?)\n\n  configurations = listOf(project.configurations.runtimeClasspath.get())\n\n  addMultiReleaseAttribute = true\n\n  // not required at runtime / fat JARs can't be used in native-image builds anyway\n  exclude(\"org/pkl/cli/svm/**\")\n\n  exclude(\"META-INF/maven/**\")\n  exclude(\"META-INF/upgrade/**\")\n\n  exclude(\"DebugProbesKt.bin\")\n\n  val info = project.extensions.getByType<BuildInfo>()\n  val minimumJvmTarget = JavaVersion.toVersion(info.jvmTarget)\n\n  manifest.attributes(\n    // Certain exports need to be added to the Java modulepath for Java 17 to work properly with\n    // shaded JARs. See the following link for an explanation of this syntax:\n    // https://bugs.openjdk.org/browse/JDK-8335225\n    \"Add-Exports\" to info.jpmsExportsForJarManifest\n  )\n\n  // effectively, this results in calls excluding:\n  // `META-INF/versions/{18-25}/**`\n  // at the time of this writing; multi-release JARs beyond JDK 21 break the current\n  // version of the Shadow plugin, and aren't needed for Truffle's use by Pkl.\n  JavaVersionRange.startingAt(JavaLanguageVersion.of(minimumJvmTarget.majorVersion.toInt() + 1))\n    .forEach { exclude(\"META-INF/versions/${it.asInt()}/**\") }\n\n  exclude(\"module-info.*\")\n\n  for ((from, to) in relocations) {\n    relocate(from, to)\n  }\n\n  // necessary for service files to be adapted to relocation\n  mergeServiceFiles()\n}\n\nshadow { addShadowVariantIntoJavaComponent = false }\n\nval testFatJar by\n  tasks.registering(Test::class) {\n    testClassesDirs = files(tasks.test.get().testClassesDirs)\n    classpath =\n      // compiled test classes\n      sourceSets.test.get().output +\n        // fat Jar\n        tasks.shadowJar.get().outputs.files +\n        // test-only dependencies\n        // (test dependencies that are also main dependencies must already be contained in fat Jar;\n        // to verify that, we don't want to include them here)\n        (configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())\n  }\n\ntasks.check { dependsOn(testFatJar) }\n\nval validateFatJar by\n  tasks.registering {\n    val outputFile = layout.buildDirectory.file(\"validateFatJar/result.txt\")\n    inputs.files(tasks.shadowJar)\n    inputs.property(\"nonRelocations\", nonRelocations)\n    outputs.file(outputFile)\n\n    doLast {\n      val unshadowedFiles = mutableListOf<String>()\n      zipTree(tasks.shadowJar.get().outputs.files.singleFile).visit {\n        val fileDetails = this\n        val path = fileDetails.relativePath.pathString\n        if (\n          !(fileDetails.isDirectory ||\n            path.startsWith(\"org/pkl/\") ||\n            path.startsWith(\"META-INF/\") ||\n            nonRelocations.any { path.startsWith(it) })\n        ) {\n          // don't throw exception inside `visit`\n          // as this gives a misleading \"Could not expand ZIP\" error message\n          unshadowedFiles.add(path)\n        }\n      }\n      if (unshadowedFiles.isEmpty()) {\n        outputFile.get().asFile.writeText(\"SUCCESS\")\n      } else {\n        outputFile.get().asFile.writeText(\"FAILURE\")\n        throw GradleException(\"Found unshadowed files:\\n\" + unshadowedFiles.joinToString(\"\\n\"))\n      }\n    }\n  }\n\ntasks.check { dependsOn(validateFatJar) }\n\nval resolveSourcesJars by\n  tasks.registering(ResolveSourcesJars::class) {\n    configuration.set(configurations.runtimeClasspath)\n    outputDir.set(layout.buildDirectory.dir(\"resolveSourcesJars\"))\n  }\n\nval fatSourcesJar by\n  tasks.registering(MergeSourcesJars::class) {\n    plugins.withId(\"pklJavaLibrary\") { inputJars.from(tasks.named(\"sourcesJar\")) }\n    inputJars.from(firstPartySourcesJarsConfiguration)\n    inputJars.from(resolveSourcesJars.map { fileTree(it.outputDir) })\n\n    mergedBinaryJars.from(tasks.shadowJar)\n    relocatedPackages.set(relocations)\n    outputJar.fileProvider(\n      provider {\n        file(tasks.shadowJar.get().archiveFile.get().asFile.path.replace(\".jar\", \"-sources.jar\"))\n      }\n    )\n  }\n\nartifacts { add(\"fatJar\", tasks.shadowJar) }\n\npublishing {\n  publications {\n    named<MavenPublication>(\"fatJar\") {\n      from(components[\"shadow\"])\n\n      // sources Jar is fat\n      artifact(fatSourcesJar.flatMap { it.outputJar.asFile }) { classifier = \"sources\" }\n\n      plugins.withId(\"pklJavaLibrary\") {\n        val javadocJar by tasks.existing(Jar::class)\n        // Javadoc Jar is not fat (didn't invest effort)\n        artifact(javadocJar.flatMap { it.archiveFile }) { classifier = \"javadoc\" }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklGraalVm.gradle.kts",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport de.undercouch.gradle.tasks.download.Download\nimport de.undercouch.gradle.tasks.download.Verify\n\nplugins { id(\"de.undercouch.download\") }\n\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\n// tries to minimize chance of corruption by download-to-temp-file-and-move\nval downloadGraalVmAarch64 by\n  tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAarch64) }\n\nval downloadGraalVmAmd64 by\n  tasks.registering(Download::class) { configureDownloadGraalVm(buildInfo.graalVmAmd64) }\n\nfun Download.configureDownloadGraalVm(graalvm: BuildInfo.GraalVm) {\n  onlyIf { !graalvm.installDir.exists() }\n  doLast { println(\"Downloaded GraalVm to ${graalvm.downloadFile}\") }\n\n  src(graalvm.downloadUrl)\n  dest(graalvm.downloadFile)\n  overwrite(false)\n  tempAndMove(true)\n}\n\nval verifyGraalVmAarch64 by\n  tasks.registering(Verify::class) {\n    configureVerifyGraalVm(buildInfo.graalVmAarch64)\n    dependsOn(downloadGraalVmAarch64)\n  }\n\nval verifyGraalVmAmd64 by\n  tasks.registering(Verify::class) {\n    configureVerifyGraalVm(buildInfo.graalVmAmd64)\n    dependsOn(downloadGraalVmAmd64)\n  }\n\nfun Verify.configureVerifyGraalVm(graalvm: BuildInfo.GraalVm) {\n  onlyIf { !graalvm.installDir.exists() }\n\n  src(graalvm.downloadFile)\n  checksum(\n    buildInfo.libs.findVersion(\"graalVmSha256-${graalvm.osName}-${graalvm.arch}\").get().toString()\n  )\n  algorithm(\"SHA-256\")\n}\n\n@Suppress(\"unused\")\nval installGraalVmAarch64 by\n  tasks.registering(InstallGraalVm::class) {\n    dependsOn(verifyGraalVmAarch64)\n    graalVm = buildInfo.graalVmAarch64\n  }\n\n@Suppress(\"unused\")\nval installGraalVmAmd64 by\n  tasks.registering(InstallGraalVm::class) {\n    dependsOn(verifyGraalVmAmd64)\n    graalVm = buildInfo.graalVmAmd64\n  }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklGradlePluginTest.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins { java }\n\nval gradlePluginTests = extensions.create<GradlePluginTests>(\"gradlePluginTests\")\n\ntasks.addRule(\"Pattern: compatibilityTest[All|Releases|Latest|Candidate|Nightly|<GradleVersion>]\") {\n  val taskName = this\n  val matchResult = Regex(\"compatibilityTest(.+)\").matchEntire(taskName) ?: return@addRule\n\n  when (val taskNameSuffix = matchResult.groupValues[1]) {\n    \"All\" ->\n      task(\"compatibilityTestAll\") {\n        dependsOn(\n          \"compatibilityTestReleases\",\n          \"compatibilityTestCandidate\",\n          \"compatibilityTestNightly\",\n        )\n      }\n    // releases in configured range\n    \"Releases\" ->\n      task(\"compatibilityTestReleases\") {\n        val versionInfos = GradleVersionInfo.fetchReleases()\n        val allVersions =\n          versionInfos\n            .filter { versionInfo ->\n              val v = versionInfo.gradleVersion\n              !versionInfo.broken &&\n                v in gradlePluginTests.minGradleVersion..gradlePluginTests.maxGradleVersion &&\n                v !in gradlePluginTests.skippedGradleVersions\n            }\n            .sortedBy { it.gradleVersion }\n        val versionsToTestAgainst = listOf(allVersions.first(), allVersions.last())\n\n        dependsOn(versionsToTestAgainst.map { createCompatibilityTestTask(it) })\n      }\n    // latest release (if not developing against latest)\n    \"Latest\" ->\n      task(\"compatibilityTestLatest\") {\n        val versionInfo = GradleVersionInfo.fetchCurrent()\n        if (versionInfo.version == gradle.gradleVersion) {\n          doLast {\n            println(\n              \"No new Gradle release available. \" +\n                \"(Run `gradlew test` to test against ${versionInfo.version}.)\"\n            )\n          }\n        } else {\n          dependsOn(createCompatibilityTestTask(versionInfo))\n        }\n      }\n    // active release candidate (if any)\n    \"Candidate\" ->\n      task(\"compatibilityTestCandidate\") {\n        val versionInfo = GradleVersionInfo.fetchRc()\n        if (versionInfo?.activeRc == true) {\n          dependsOn(createCompatibilityTestTask(versionInfo))\n        } else {\n          doLast { println(\"No active Gradle release candidate available.\") }\n        }\n      }\n    // latest nightly\n    \"Nightly\" ->\n      task(\"compatibilityTestNightly\") {\n        val versionInfo = GradleVersionInfo.fetchNightly()\n        dependsOn(createCompatibilityTestTask(versionInfo))\n      }\n    // explicit version\n    else ->\n      createCompatibilityTestTask(\n        taskNameSuffix,\n        \"https://services.gradle.org/distributions-snapshots/gradle-$taskNameSuffix-bin.zip\",\n      )\n  }\n}\n\nfun createCompatibilityTestTask(versionInfo: GradleVersionInfo): TaskProvider<Test> =\n  createCompatibilityTestTask(versionInfo.version, versionInfo.downloadUrl)\n\nfun createCompatibilityTestTask(version: String, downloadUrl: String): TaskProvider<Test> {\n  return tasks.register(\"compatibilityTest$version\", Test::class.java) {\n    mustRunAfter(tasks.test)\n\n    maxHeapSize = tasks.test.get().maxHeapSize\n    jvmArgs = tasks.test.get().jvmArgs\n    classpath = tasks.test.get().classpath\n    systemProperty(\"testGradleVersion\", version)\n    systemProperty(\"testGradleDistributionUrl\", downloadUrl)\n\n    doFirst {\n      if (version == gradle.gradleVersion && gradle.taskGraph.hasTask(tasks.test.get())) {\n        // don't test same version twice\n        println(\"This version has already been tested by the `test` task.\")\n        throw StopExecutionException()\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklHtmlValidator.gradle.kts",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins { base }\n\nval htmlValidator = extensions.create<HtmlValidator>(\"htmlValidator\", project)\n\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\nval validatorConfiguration: Configuration =\n  configurations.create(\"validator\") {\n    resolutionStrategy.eachDependency {\n      if (requested.group == \"log4j\" && requested.name == \"log4j\") {\n        @Suppress(\"UnstableApiUsage\") useTarget(buildInfo.libs.findLibrary(\"log4j12Api\").get())\n        because(\"mitigate critical security vulnerabilities\")\n      }\n    }\n  }\n\ndependencies {\n  @Suppress(\"UnstableApiUsage\")\n  validatorConfiguration(buildInfo.libs.findLibrary(\"nuValidator\").get()) {\n    // we only want jetty-util and jetty-util-ajax (with the right version)\n    // couldn't find a more robust way to express this\n    exclude(group = \"org.eclipse.jetty\", module = \"jetty-continuation\")\n    exclude(group = \"org.eclipse.jetty\", module = \"jetty-http\")\n    exclude(group = \"org.eclipse.jetty\", module = \"jetty-io\")\n    exclude(group = \"org.eclipse.jetty\", module = \"jetty-security\")\n    exclude(group = \"org.eclipse.jetty\", module = \"jetty-server\")\n    exclude(group = \"org.eclipse.jetty\", module = \"jetty-servlets\")\n    exclude(group = \"javax.servlet\")\n    exclude(group = \"commons-fileupload\")\n  }\n}\n\nval validateHtml by\n  tasks.registering(JavaExec::class) {\n    val resultFile = layout.buildDirectory.file(\"validateHtml/result.txt\")\n    inputs.files(htmlValidator.sources)\n    outputs.file(resultFile)\n\n    classpath = validatorConfiguration\n    mainClass.set(\"nu.validator.client.SimpleCommandLineValidator\")\n    args(\n      \"--skip-non-html\"\n    ) // --also-check-css doesn't work (still checks css as html), so limit to html files\n    args(\"--filterpattern\", \"(.*)Consider adding “lang=(.*)\")\n    args(\"--filterpattern\", \"(.*)Consider adding a “lang” attribute(.*)\")\n    args(\"--filterpattern\", \"(.*)unrecognized media “amzn-kf8”(.*)\") // kindle\n    // for debugging\n    // args \"--verbose\"\n    args(htmlValidator.sources)\n\n    // write a basic result file s.t. gradle can consider task up-to-date\n    // writing a result file in case validation fails is not easily possible with JavaExec, but also\n    // not strictly necessary\n    doFirst { project.delete(resultFile) }\n    doLast { resultFile.get().asFile.writeText(\"Success.\") }\n  }\n\ntasks.check { dependsOn(validateHtml) }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklJavaExecutable.gradle.kts",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.writeText\nimport org.gradle.kotlin.dsl.support.serviceOf\n\nplugins {\n  id(\"pklJavaLibrary\")\n  //  id(\"pklPublishLibrary\")\n  id(\"com.gradleup.shadow\")\n}\n\nval executableSpec = project.extensions.create(\"executable\", ExecutableSpec::class.java)\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\nval javaExecutable by\n  tasks.registering(ExecutableJar::class) {\n    group = \"build\"\n    dependsOn(tasks.jar)\n    inJar = tasks.shadowJar.flatMap { it.archiveFile }\n    val effectiveJavaName =\n      executableSpec.javaName.map { name -> if (buildInfo.os.isWindows) \"$name.bat\" else name }\n    outJar = layout.buildDirectory.dir(\"executable\").flatMap { it.file(effectiveJavaName) }\n\n    // uncomment for debugging\n    // jvmArgs.addAll(\"-ea\", \"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005\")\n  }\n\nfun Task.setupTestStartJavaExecutable(launcher: Provider<JavaLauncher>? = null) {\n  group = \"verification\"\n  dependsOn(javaExecutable)\n\n  // dummy output to satisfy up-to-date check\n  val outputFile = layout.buildDirectory.file(\"testStartJavaExecutable/$name\")\n  outputs.file(outputFile)\n\n  val execOutput =\n    providers.exec {\n      val executablePath = javaExecutable.get().outputs.files.singleFile\n      if (launcher?.isPresent == true) {\n        commandLine(\n          launcher.get().executablePath.asFile.absolutePath,\n          \"-jar\",\n          executablePath.absolutePath,\n          \"--version\",\n        )\n      } else {\n        commandLine(executablePath.absolutePath, \"--version\")\n      }\n    }\n\n  doLast {\n    val outputText = execOutput.standardOutput.asText.get()\n    if (!outputText.contains(buildInfo.pklVersionNonUnique)) {\n      throw GradleException(\n        \"Expected version output to contain current version (${buildInfo.pklVersionNonUnique}), but got '$outputText'\"\n      )\n    }\n    outputFile.get().asFile.toPath().apply {\n      try {\n        parent.createDirectories()\n      } catch (ignored: java.nio.file.FileAlreadyExistsException) {}\n      writeText(\"OK\")\n    }\n  }\n}\n\nval testStartJavaExecutable by tasks.registering { setupTestStartJavaExecutable() }\n\n// Setup `testStartJavaExecutable` tasks for multi-JDK testing.\nval testStartJavaExecutableOnOtherJdks =\n  buildInfo.jdkTestRange.map { jdkTarget ->\n    tasks.register(\"testStartJavaExecutableJdk${jdkTarget.asInt()}\") {\n      enabled = buildInfo.isVersionEnabled(jdkTarget)\n      val toolChainService: JavaToolchainService = serviceOf()\n      val launcher = toolChainService.launcherFor { languageVersion = jdkTarget }\n      setupTestStartJavaExecutable(launcher)\n    }\n  }\n\ntasks.assemble { dependsOn(javaExecutable) }\n\ntasks.check {\n  dependsOn(testStartJavaExecutable)\n  dependsOn(testStartJavaExecutableOnOtherJdks)\n}\n\n// publishing {\n//  publications {\n//    // need to put in `afterEvaluate` because `artifactId` cannot be set lazily.\n//    project.afterEvaluate {\n//      register<MavenPublication>(\"javaExecutable\") {\n//        artifactId = executableSpec.javaPublicationName.get()\n//\n//        artifact(javaExecutable.map { it.outputs.files.singleFile }) {\n//          classifier = null\n//          extension = \"bin\"\n//          builtBy(javaExecutable)\n//        }\n//\n//        pom {\n//          url = executableSpec.website\n//          description =\n//            executableSpec.documentationName.map { name ->\n//              \"\"\"\n//            $name executable for Java.\n//            Can be executed directly, or with `java -jar <path/to/jpkl>`.\n//            Requires Java 17 or higher.\n//            \"\"\"\n//                .trimIndent()\n//            }\n//        }\n//      }\n//    }\n//  }\n// }\n\n// signing { project.afterEvaluate { sign(publishing.publications[\"javaExecutable\"]) } }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklJavaLibrary.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"HttpUrlsUsage\", \"unused\")\n\nimport org.gradle.accessors.dm.LibrariesForLibs\n\nplugins {\n  `java-library`\n  `jvm-toolchains`\n  `jvm-test-suite`\n  id(\"pklKotlinTest\")\n  id(\"com.diffplug.spotless\")\n}\n\n// make sources Jar available to other subprojects\nval sourcesJarConfiguration: Provider<Configuration> = configurations.register(\"sourcesJar\")\n\n// Version Catalog library symbols.\nval libs = the<LibrariesForLibs>()\n\n// Build configuration.\nval info = project.extensions.getByType<BuildInfo>()\n\njava {\n  withSourcesJar() // creates `sourcesJar` task\n  withJavadocJar()\n\n  toolchain {\n    languageVersion = info.jdkToolchainVersion\n    vendor = info.jdkVendor\n  }\n}\n\nartifacts {\n  // make sources Jar available to other subprojects\n  add(\"sourcesJar\", tasks[\"sourcesJar\"])\n}\n\nspotless {\n  java {\n    googleJavaFormat(libs.versions.googleJavaFormat.get())\n    target(\"src/*/java/**/*.java\")\n    licenseHeaderFile(rootProject.file(\"buildSrc/src/main/resources/license-header.star-block.txt\"))\n  }\n  kotlin {\n    ktfmt(libs.versions.ktfmt.get()).googleStyle()\n    target(\"src/*/kotlin/**/*.kt\")\n    licenseHeaderFile(rootProject.file(\"buildSrc/src/main/resources/license-header.star-block.txt\"))\n  }\n}\n\ntasks.compileKotlin { enabled = false }\n\ntasks.jar {\n  manifest {\n    attributes +=\n      mapOf(\n        \"Automatic-Module-Name\" to \"org.${project.name.replace(\"-\", \".\")}\",\n        \"Add-Exports\" to info.jpmsExportsForJarManifest,\n      )\n  }\n}\n\ntasks.javadoc {\n  classpath = sourceSets.main.get().output + sourceSets.main.get().compileClasspath\n  source = sourceSets.main.get().allJava\n  title = \"${project.name} ${project.version} API\"\n  (options as StandardJavadocDocletOptions).addStringOption(\"Xdoclint:none\", \"-quiet\")\n}\n\nval workAroundKotlinGradlePluginBug by\n  tasks.registering {\n    doLast {\n      // Works around this problem, which sporadically appears and disappears in different\n      // subprojects:\n      // A problem was found with the configuration of task ':pkl-executor:compileJava' (type\n      // 'JavaCompile').\n      // > Directory '[...]/pkl/pkl-executor/build/classes/kotlin/main'\n      // specified for property 'compileKotlinOutputClasses' does not exist.\n      layout.buildDirectory.dir(\"classes/kotlin/main\").get().asFile.mkdirs()\n    }\n  }\n\nval truffleJavacArgs =\n  listOf(\n    // TODO: determine correct limits for Truffle specializations\n    // (see https://graalvm.slack.com/archives/CNQSB2DHD/p1712380902746829)\n    \"-Atruffle.dsl.SuppressWarnings=truffle-limit\"\n  )\n\ntasks.compileJava {\n  javaCompiler = info.javaCompiler\n  dependsOn(workAroundKotlinGradlePluginBug)\n  options.compilerArgs.addAll(truffleJavacArgs + info.jpmsAddModulesFlags)\n}\n\ntasks.withType<JavaCompile>().configureEach {\n  javaCompiler = info.javaCompiler\n  options.release = info.jvmTarget\n}\n\ntasks.withType<JavaExec>().configureEach { jvmArgs(info.jpmsAddModulesFlags) }\n\nfun Test.configureJdkTestTask(launcher: Provider<JavaLauncher>) {\n  useJUnitPlatform()\n  javaLauncher = launcher\n  systemProperties.putAll(info.testProperties)\n  jvmArgs.addAll(info.jpmsAddModulesFlags)\n}\n\ntasks.test { configureJdkTestTask(info.javaTestLauncher) }\n\n// Prepare test tasks for each JDK version which is within the test target suite for Pkl. Each task\n// uses a pinned JDK toolchain version, and is named for the major version which is tested.\n//\n// Test tasks configured in this manner are executed manually by name, e.g. `./gradlew testJdk11`,\n// and automatically as dependencies of `check`.\n//\n// We omit the current JDK from this list because it is already tested, in effect, by the default\n// `test` task.\n//\n// Pkl subprojects may elect to further configure these tasks as needed; by default, each task\n// inherits the configuration of the default `test` task (aside from an overridden launcher).\nval jdkTestTasks = info.multiJdkTestingWith(tasks.test) { (_, jdk) -> configureJdkTestTask(jdk) }\n\ntasks.check { dependsOn(jdkTestTasks) }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklKotlinLibrary.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.gradle.accessors.dm.LibrariesForLibs\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\nimport org.jetbrains.kotlin.gradle.dsl.KotlinVersion\nimport org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile\n\nplugins {\n  id(\"pklJavaLibrary\")\n  kotlin(\"jvm\")\n}\n\n// Build configuration.\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\n// Version Catalog library symbols.\nval libs = the<LibrariesForLibs>()\n\ndependencies {\n  // At least some of our kotlin APIs contain Kotlin stdlib types\n  // that aren't compiled away by kotlinc (e.g., `kotlin.Function`).\n  // So let's be conservative and default to `api` for now.\n  // For Kotlin APIs that only target Kotlin users (e.g., pkl-config-kotlin),\n  // it won't make a difference.\n  api(buildInfo.libs.findLibrary(\"kotlinStdLib\").get())\n}\n\ntasks.compileKotlin {\n  enabled = true // disabled by pklJavaLibrary\n}\n\ntasks.withType<KotlinJvmCompile>().configureEach {\n  compilerOptions {\n    languageVersion = KotlinVersion.KOTLIN_2_1\n    jvmTarget = JvmTarget.fromTarget(buildInfo.jvmTarget.toString())\n    freeCompilerArgs.addAll(\"-Xjdk-release=${buildInfo.jvmTarget}\")\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklKotlinTest.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.net.URI\nimport org.gradle.accessors.dm.LibrariesForLibs\nimport org.gradle.api.tasks.testing.logging.TestExceptionFormat\n\nplugins {\n  `jvm-test-suite`\n  kotlin(\"jvm\")\n}\n\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\nval libs = the<LibrariesForLibs>()\n\ndependencies {\n  testImplementation(libs.assertj)\n  testImplementation(libs.junitApi)\n  testImplementation(libs.junitParams)\n  testImplementation(libs.kotlinStdLib)\n\n  testRuntimeOnly(libs.junitEngine)\n  testRuntimeOnly(libs.junitLauncher)\n}\n\ntasks.withType<Test>().configureEach {\n  val testTask = this\n\n  useJUnitPlatform()\n\n  // enable checking of stdlib return types\n  systemProperty(\"org.pkl.testMode\", \"true\")\n\n  reports.named(\"html\") { enabled = true }\n\n  testLogging { exceptionFormat = TestExceptionFormat.FULL }\n\n  addTestListener(\n    object : TestListener {\n      override fun beforeSuite(suite: TestDescriptor) {}\n\n      override fun beforeTest(testDescriptor: TestDescriptor) {}\n\n      override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}\n\n      // print report link at end of task, not just at end of build\n      override fun afterSuite(descriptor: TestDescriptor, result: TestResult) {\n        if (descriptor.parent != null) return // only interested in overall result\n\n        if (result.resultType == TestResult.ResultType.FAILURE) {\n          println(\n            \"\\nThere were failing tests. See the report at: ${fixFileUri(testTask.reports.html.entryPoint.toURI())}\"\n          )\n        }\n      }\n\n      // makes links clickable on macOS\n      private fun fixFileUri(uri: URI): URI {\n        if (\"file\" == uri.scheme && !uri.schemeSpecificPart.startsWith(\"//\")) {\n          return URI.create(\"file://\" + uri.schemeSpecificPart)\n        }\n        return uri\n      }\n    }\n  )\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklNativeExecutable.gradle.kts",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.lang.Runtime.Version\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.writeText\nimport org.gradle.accessors.dm.LibrariesForLibs\n\nplugins {\n  id(\"pklGraalVm\")\n  id(\"pklJavaLibrary\")\n  id(\"pklNativeLifecycle\")\n  id(\"pklPublishLibrary\")\n  id(\"com.gradleup.shadow\")\n}\n\n// assumes that `pklJavaExecutable` is also applied\nval executableSpec = project.extensions.getByType<ExecutableSpec>()\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\nval stagedMacAmd64Executable: Configuration by configurations.creating\nval stagedMacAarch64Executable: Configuration by configurations.creating\nval stagedLinuxAmd64Executable: Configuration by configurations.creating\nval stagedLinuxAarch64Executable: Configuration by configurations.creating\nval stagedAlpineLinuxAmd64Executable: Configuration by configurations.creating\nval stagedWindowsAmd64Executable: Configuration by configurations.creating\n\nval nativeImageClasspath by\n  configurations.creating {\n    extendsFrom(configurations.runtimeClasspath.get())\n    // Ensure native-image version uses GraalVM C SDKs instead of Java FFI or JNA\n    // (comes from artifact `mordant-jvm-graal-ffi`).\n    exclude(\"com.github.ajalt.mordant\", \"mordant-jvm-ffm\")\n    exclude(\"com.github.ajalt.mordant\", \"mordant-jvm-ffm-jvm\")\n    exclude(\"com.github.ajalt.mordant\", \"mordant-jvm-jna\")\n    exclude(\"com.github.ajalt.mordant\", \"mordant-jvm-jna-jvm\")\n  }\n\nval libs = the<LibrariesForLibs>()\n\ndependencies {\n  fun executableFile(suffix: String) =\n    files(\n      layout.buildDirectory.dir(\"executable\").map { dir ->\n        dir.file(executableSpec.name.map { \"$it-$suffix\" })\n      }\n    )\n  nativeImageClasspath(libs.truffleRuntime)\n  nativeImageClasspath(libs.graalSdk)\n\n  stagedMacAarch64Executable(executableFile(\"macos-aarch64\"))\n  stagedMacAmd64Executable(executableFile(\"macos-amd64\"))\n  stagedLinuxAmd64Executable(executableFile(\"linux-amd64\"))\n  stagedLinuxAarch64Executable(executableFile(\"linux-aarch64\"))\n  stagedAlpineLinuxAmd64Executable(executableFile(\"alpine-linux-amd64\"))\n  stagedWindowsAmd64Executable(executableFile(\"windows-amd64.exe\"))\n}\n\nprivate fun NativeImageBuild.amd64() {\n  arch = Architecture.AMD64\n  dependsOn(\":installGraalVmAmd64\")\n}\n\nprivate fun NativeImageBuild.aarch64() {\n  arch = Architecture.AARCH64\n  dependsOn(\":installGraalVmAarch64\")\n}\n\nprivate fun NativeImageBuild.setClasspath() {\n  classpath.from(sourceSets.main.map { it.output })\n  classpath.from(\n    project(\":pkl-commons-cli\").extensions.getByType(SourceSetContainer::class)[\"svm\"].output\n  )\n  classpath.from(nativeImageClasspath)\n}\n\nval macExecutableAmd64 by\n  tasks.registering(NativeImageBuild::class) {\n    imageName = executableSpec.name.map { \"$it-macos-amd64\" }\n    mainClass = executableSpec.mainClass\n    amd64()\n    setClasspath()\n  }\n\nval macExecutableAarch64 by\n  tasks.registering(NativeImageBuild::class) {\n    imageName = executableSpec.name.map { \"$it-macos-aarch64\" }\n    mainClass = executableSpec.mainClass\n    aarch64()\n    setClasspath()\n  }\n\nval linuxExecutableAmd64 by\n  tasks.registering(NativeImageBuild::class) {\n    imageName = executableSpec.name.map { \"$it-linux-amd64\" }\n    mainClass = executableSpec.mainClass\n    amd64()\n    setClasspath()\n  }\n\nval linuxExecutableAarch64 by\n  tasks.registering(NativeImageBuild::class) {\n    imageName = executableSpec.name.map { \"$it-linux-aarch64\" }\n    mainClass = executableSpec.mainClass\n    aarch64()\n    setClasspath()\n    // Ensure compatibility for kernels with page size set to 4k, 16k and 64k\n    // (e.g. Raspberry Pi 5, Asahi Linux)\n    extraNativeImageArgs.add(\"-H:PageSize=65536\")\n  }\n\nval alpineExecutableAmd64 by\n  tasks.registering(NativeImageBuild::class) {\n    imageName = executableSpec.name.map { \"$it-alpine-linux-amd64\" }\n    mainClass = executableSpec.mainClass\n    amd64()\n    setClasspath()\n    extraNativeImageArgs.addAll(listOf(\"--static\", \"--libc=musl\"))\n  }\n\nval windowsExecutableAmd64 by\n  tasks.registering(NativeImageBuild::class) {\n    imageName = executableSpec.name.map { \"$it-windows-amd64\" }\n    mainClass = executableSpec.mainClass\n    amd64()\n    setClasspath()\n  }\n\nval assembleNative by tasks.existing\n\nval testStartNativeExecutable by\n  tasks.registering {\n    dependsOn(assembleNative)\n\n    // dummy file for up-to-date checking\n    val outputFile = project.layout.buildDirectory.file(\"testStartNativeExecutable/output.txt\")\n    outputs.file(outputFile)\n\n    val execOutput =\n      providers.exec { commandLine(assembleNative.get().outputs.files.singleFile, \"--version\") }\n\n    doLast {\n      val outputText = execOutput.standardOutput.asText.get()\n      if (!outputText.contains(buildInfo.pklVersionNonUnique)) {\n        throw GradleException(\n          \"Expected version output to contain current version (${buildInfo.pklVersionNonUnique}), but got '$outputText'\"\n        )\n      }\n      outputFile.get().asFile.toPath().apply {\n        try {\n          parent.createDirectories()\n        } catch (ignored: java.nio.file.FileAlreadyExistsException) {}\n        writeText(\"OK\")\n      }\n    }\n  }\n\nval requiredGlibcVersion: Version = Version.parse(\"2.17\")\n\nval checkGlibc by\n  tasks.registering {\n    enabled = buildInfo.os.isLinux && !buildInfo.musl\n    dependsOn(assembleNative)\n    doLast {\n      val exec =\n        providers.exec {\n          commandLine(\"objdump\", \"-T\", assembleNative.get().outputs.files.singleFile)\n        }\n      val output = exec.standardOutput.asText.get()\n      val minimumGlibcVersion =\n        output\n          .split(\"\\n\")\n          .mapNotNull { line ->\n            val match = Regex(\"GLIBC_([.0-9]*)\").find(line)\n            match?.groups[1]?.let { Version.parse(it.value) }\n          }\n          .maxOrNull()\n      if (minimumGlibcVersion == null) {\n        throw GradleException(\n          \"Could not determine glibc version from executable. objdump output: $output\"\n        )\n      }\n      if (minimumGlibcVersion > requiredGlibcVersion) {\n        throw GradleException(\n          \"Incorrect glibc version. Found: $minimumGlibcVersion, required: $requiredGlibcVersion\"\n        )\n      }\n    }\n  }\n\n// Expose underlying task's outputs\nprivate fun <T : Task> Task.wraps(other: TaskProvider<T>) {\n  dependsOn(other)\n  outputs.files(other)\n}\n\nval testNative by tasks.existing { dependsOn(testStartNativeExecutable, checkGlibc) }\n\nval assembleNativeMacOsAarch64 by tasks.existing { wraps(macExecutableAarch64) }\n\nval assembleNativeMacOsAmd64 by tasks.existing { wraps(macExecutableAmd64) }\n\nval assembleNativeLinuxAarch64 by tasks.existing { wraps(linuxExecutableAarch64) }\n\nval assembleNativeLinuxAmd64 by tasks.existing { wraps(linuxExecutableAmd64) }\n\nval assembleNativeAlpineLinuxAmd64 by tasks.existing { wraps(alpineExecutableAmd64) }\n\nval assembleNativeWindowsAmd64 by tasks.existing { wraps(windowsExecutableAmd64) }\n\npublishing {\n  publications {\n    // need to put in `afterEvaluate` because `artifactId` cannot be set lazily.\n    project.afterEvaluate {\n      create<MavenPublication>(\"macExecutableAmd64\") {\n        artifactId = \"${executableSpec.publicationName.get()}-macos-amd64\"\n        artifact(stagedMacAmd64Executable.singleFile) {\n          classifier = null\n          extension = \"bin\"\n          builtBy(stagedMacAmd64Executable)\n        }\n        pom {\n          name = \"${executableSpec.publicationName.get()}-macos-amd64\"\n          url = executableSpec.website\n          description =\n            executableSpec.documentationName.map { name ->\n              \"Native $name executable for macOS/amd64.\"\n            }\n        }\n      }\n\n      create<MavenPublication>(\"macExecutableAarch64\") {\n        artifactId = \"${executableSpec.publicationName.get()}-macos-aarch64\"\n        artifact(stagedMacAarch64Executable.singleFile) {\n          classifier = null\n          extension = \"bin\"\n          builtBy(stagedMacAarch64Executable)\n        }\n        pom {\n          name = \"${executableSpec.publicationName.get()}-macos-aarch64\"\n          url = executableSpec.website\n          description =\n            executableSpec.documentationName.map { name ->\n              \"Native $name executable for macOS/aarch64.\"\n            }\n        }\n      }\n\n      create<MavenPublication>(\"linuxExecutableAmd64\") {\n        artifactId = \"${executableSpec.publicationName.get()}-linux-amd64\"\n        artifact(stagedLinuxAmd64Executable.singleFile) {\n          classifier = null\n          extension = \"bin\"\n          builtBy(stagedLinuxAmd64Executable)\n        }\n        pom {\n          name = \"${executableSpec.publicationName.get()}-linux-amd64\"\n          url = executableSpec.website\n          description =\n            executableSpec.documentationName.map { name ->\n              \"Native $name executable for linux/amd64.\"\n            }\n        }\n      }\n\n      create<MavenPublication>(\"linuxExecutableAarch64\") {\n        artifactId = \"${executableSpec.publicationName.get()}-linux-aarch64\"\n        artifact(stagedLinuxAarch64Executable.singleFile) {\n          classifier = null\n          extension = \"bin\"\n          builtBy(stagedLinuxAarch64Executable)\n        }\n        pom {\n          name = \"${executableSpec.publicationName.get()}-linux-aarch64\"\n          url = executableSpec.website\n          description =\n            executableSpec.documentationName.map { name ->\n              \"Native $name executable for linux/aarch64.\"\n            }\n        }\n      }\n\n      create<MavenPublication>(\"alpineLinuxExecutableAmd64\") {\n        artifactId = \"${executableSpec.publicationName.get()}-alpine-linux-amd64\"\n        artifact(stagedAlpineLinuxAmd64Executable.singleFile) {\n          classifier = null\n          extension = \"bin\"\n          builtBy(stagedAlpineLinuxAmd64Executable)\n        }\n        pom {\n          name = \"${executableSpec.publicationName.get()}-alpine-linux-amd64\"\n          url = executableSpec.website\n          description =\n            executableSpec.documentationName.map { name ->\n              \"Native $name executable for linux/amd64 and statically linked to musl.\"\n            }\n        }\n      }\n\n      create<MavenPublication>(\"windowsExecutableAmd64\") {\n        artifactId = \"${executableSpec.publicationName.get()}-windows-amd64\"\n        artifact(stagedWindowsAmd64Executable.singleFile) {\n          classifier = null\n          extension = \"exe\"\n          builtBy(stagedWindowsAmd64Executable)\n        }\n        pom {\n          name = \"${executableSpec.publicationName.get()}-windows-amd64\"\n          url = executableSpec.website\n          description =\n            executableSpec.documentationName.map { name ->\n              \"Native $name executable for windows/amd64.\"\n            }\n        }\n      }\n    }\n  }\n}\n\nsigning {\n  project.afterEvaluate {\n    sign(publishing.publications[\"linuxExecutableAarch64\"])\n    sign(publishing.publications[\"linuxExecutableAmd64\"])\n    sign(publishing.publications[\"macExecutableAarch64\"])\n    sign(publishing.publications[\"macExecutableAmd64\"])\n    sign(publishing.publications[\"alpineLinuxExecutableAmd64\"])\n    sign(publishing.publications[\"windowsExecutableAmd64\"])\n  }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklNativeLifecycle.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nval assembleNativeMacOsAarch64 by tasks.registering { group = \"build\" }\n\nval assembleNativeMacOsAmd64 by tasks.registering { group = \"build\" }\n\nval assembleNativeLinuxAarch64 by tasks.registering { group = \"build\" }\n\nval assembleNativeLinuxAmd64 by tasks.registering { group = \"build\" }\n\nval assembleNativeAlpineLinuxAmd64 by tasks.registering { group = \"build\" }\n\nval assembleNativeWindowsAmd64 by tasks.registering { group = \"build\" }\n\nval testNativeMacOsAarch64 by tasks.registering { group = \"verification\" }\n\nval testNativeMacOsAmd64 by tasks.registering { group = \"verification\" }\n\nval testNativeLinuxAarch64 by tasks.registering { group = \"verification\" }\n\nval testNativeLinuxAmd64 by tasks.registering { group = \"verification\" }\n\nval testNativeAlpineLinuxAmd64 by tasks.registering { group = \"verification\" }\n\nval testNativeWindowsAmd64 by tasks.registering { group = \"verification\" }\n\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\nprivate fun <T : Task> Task.wraps(other: TaskProvider<T>) {\n  dependsOn(other)\n  outputs.files(other)\n}\n\nval assembleNative by\n  tasks.registering {\n    group = \"build\"\n\n    if (!buildInfo.isCrossArchSupported && buildInfo.isCrossArch) {\n      throw GradleException(\"Cross-arch builds are not supported on ${buildInfo.os.name}\")\n    }\n\n    when {\n      buildInfo.os.isMacOsX && buildInfo.targetArch == \"aarch64\" -> {\n        wraps(assembleNativeMacOsAarch64)\n      }\n      buildInfo.os.isMacOsX && buildInfo.targetArch == \"amd64\" -> {\n        wraps(assembleNativeMacOsAmd64)\n      }\n      buildInfo.os.isLinux && buildInfo.targetArch == \"aarch64\" -> {\n        wraps(assembleNativeLinuxAarch64)\n      }\n      buildInfo.os.isLinux && buildInfo.targetArch == \"amd64\" -> {\n        if (buildInfo.musl) wraps(assembleNativeAlpineLinuxAmd64)\n        else wraps(assembleNativeLinuxAmd64)\n      }\n      buildInfo.os.isWindows && buildInfo.targetArch == \"amd64\" -> {\n        wraps(assembleNativeWindowsAmd64)\n      }\n      else -> {\n        doLast {\n          throw GradleException(\n            \"Cannot build targeting ${buildInfo.os.name}/${buildInfo.targetArch} with musl=${buildInfo.musl}\"\n          )\n        }\n      }\n    }\n  }\n\nval testNative by\n  tasks.registering {\n    group = \"verification\"\n    dependsOn(assembleNative)\n\n    if (!buildInfo.isCrossArchSupported && buildInfo.isCrossArch) {\n      throw GradleException(\"Cross-arch builds are not supported on ${buildInfo.os.name}\")\n    }\n\n    when {\n      buildInfo.os.isMacOsX && buildInfo.targetArch == \"aarch64\" -> {\n        dependsOn(testNativeMacOsAarch64)\n      }\n      buildInfo.os.isMacOsX && buildInfo.targetArch == \"amd64\" -> {\n        dependsOn(testNativeMacOsAmd64)\n      }\n      buildInfo.os.isLinux && buildInfo.targetArch == \"aarch64\" -> {\n        dependsOn(testNativeLinuxAarch64)\n      }\n      buildInfo.os.isLinux && buildInfo.targetArch == \"amd64\" -> {\n        if (buildInfo.musl) dependsOn(testNativeAlpineLinuxAmd64)\n        else dependsOn(testNativeLinuxAmd64)\n      }\n      buildInfo.os.isWindows && buildInfo.targetArch == \"amd64\" -> {\n        dependsOn(testNativeWindowsAmd64)\n      }\n      else -> {\n        doLast {\n          throw GradleException(\n            \"Cannot build targeting ${buildInfo.os.name}/${buildInfo.targetArch} with musl=${buildInfo.musl}\"\n          )\n        }\n      }\n    }\n  }\n\nval checkNative by\n  tasks.registering {\n    group = \"verification\"\n    dependsOn(testNative)\n  }\n\nval buildNative by\n  tasks.registering {\n    group = \"build\"\n    dependsOn(checkNative)\n  }\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklPublishLibrary.gradle.kts",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  `maven-publish`\n  signing\n}\n\npublishing {\n  publications {\n    components.findByName(\"java\")?.let { javaComponent ->\n      create<MavenPublication>(\"library\") { from(javaComponent) }\n    }\n  }\n}\n\nconfigurePklPomMetadata()\n\nconfigurePomValidation()\n\nconfigurePklSigning()\n\nartifacts {\n  project.tasks.findByName(\"javadocJar\")?.let { archives(it) }\n  project.tasks.findByName(\"sourcesJar\")?.let { archives(it) }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/pklSpotlessFormat.gradle.kts",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins { id(\"com.diffplug.spotless\") }\n\nval pklFormatter by configurations.creating\n\ndependencies { pklFormatter(rootProject.project(\"pkl-formatter\")) }\n\nspotless {\n  format(\"pkl\") {\n    target(\"**/*.pkl\")\n    addStep(PklFormatterStep(pklFormatter).create())\n    licenseHeaderFile(\n      rootProject.file(\"buildSrc/src/main/resources/license-header.line-comment.txt\"),\n      \"/// \",\n    )\n    // disable ratcheting for Pkl sources\n    // make any change to pkl-formatter reformat the stdlib\n    ratchetFrom = null\n  }\n}\n\nfor (taskName in\n  listOf(\"spotlessPkl\", \"spotlessPklApply\", \"spotlessPklCheck\", \"spotlessPklDiagnose\")) {\n  tasks.named(taskName) { dependsOn(\":pkl-formatter:assemble\") }\n}\n"
  },
  {
    "path": "buildSrc/src/main/resources/license-header.line-comment.txt",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © $YEAR Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n"
  },
  {
    "path": "buildSrc/src/main/resources/license-header.star-block.txt",
    "content": "/*\n * Copyright © $YEAR Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"
  },
  {
    "path": "docs/antora.yml",
    "content": "name: main\ntitle: Main Project\nversion: 0.32.0-dev\nprerelease: true\nnav:\n- nav.adoc\n"
  },
  {
    "path": "docs/docs.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension\n\nplugins {\n  pklAllProjects\n  pklKotlinTest\n}\n\nsourceSets {\n  test {\n    java {\n      srcDir(file(\"modules/pkl-core/examples\"))\n      srcDir(file(\"modules/pkl-config-java/examples\"))\n      srcDir(file(\"modules/java-binding/examples\"))\n    }\n    val kotlin = project.extensions.getByType<KotlinJvmProjectExtension>().sourceSets[name].kotlin\n    kotlin.srcDir(file(\"modules/kotlin-binding/examples\"))\n  }\n}\n\ndependencies {\n  testImplementation(projects.pklCore)\n  testImplementation(projects.pklConfigJava)\n  testImplementation(projects.pklConfigKotlin)\n  testImplementation(projects.pklCommonsTest)\n  testImplementation(projects.pklParser)\n  testImplementation(libs.junitEngine)\n}\n\ntasks.test {\n  inputs\n    .files(fileTree(\"modules\").matching { include(\"**/pages/*.adoc\") })\n    .withPropertyName(\"asciiDocFiles\")\n    .withPathSensitivity(PathSensitivity.RELATIVE)\n}\n"
  },
  {
    "path": "docs/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=testRuntimeClasspath\nempty=annotationProcessor,apiDependenciesMetadata,compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,runtimeClasspath,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "docs/modules/ROOT/pages/community.adoc",
    "content": "= Community\n:uri-github-issue: https://github.com/apple/pkl/issues\n:uri-github-discussions: https://github.com/apple/pkl/discussions\n\nWe'd love to hear from you!\n\n* Create an {uri-github-issue}[issue]\n* Ask questions on {uri-github-discussions}[GitHub Discussions]\n"
  },
  {
    "path": "docs/modules/ROOT/pages/evolution-and-roadmap.adoc",
    "content": "= Evolution and Roadmap\n\n:uri-pkl-roadmap: https://github.com/orgs/apple/projects/12/views/1\n:uri-pkl-evolution: https://github.com/apple/pkl-evolution\n\n== Evolution\n\nSometimes, a change to Pkl is large enough that it makes sense to create a proposal for the change so that it can be discussed in detail and vetted.\n\nPkl has a process for managing such designs in a repository called {uri-pkl-evolution}[Pkl Evolution].\n\n== Roadmap\n\nTo discover what might be coming in future versions, reference the {uri-pkl-roadmap}[Pkl Roadmap] project on GitHub.\n\nThe roadmap describes estimates.\nThe Pkl team aims to cut a release in February, June, and October of each year.\nIf an item is not complete by the release cutoff date, the roadmap item may be bumped to the next release.\n\nAdditionally, as priorities change, it is possible that items can be moved around or backlogged.\n"
  },
  {
    "path": "docs/modules/ROOT/pages/examples.adoc",
    "content": "= Examples\n\n:uri-github-apple: https://github.com/apple\n:uri-jvm-examples: {uri-github-apple}/pkl-jvm-examples\n:uri-go-examples: {uri-github-apple}/pkl-go-examples\n:uri-swift-examples: {uri-github-apple}/pkl-swift-examples\n:uri-k8s-examples: {uri-github-apple}/pkl-k8s-examples\n\nFor ready-to-go examples with full source code, see the various repositories that are available for you.\n\n* {uri-jvm-examples}[pkl-jvm-examples] -- for using Pkl within the JVM\n* {uri-swift-examples}[pkl-swift-examples] -- for using Pkl with Swift\n* {uri-go-examples}[pkl-go-examples] -- for using Pkl with Go\n* {uri-k8s-examples}[pkl-k8s-examples] -- for using Pkl with Kubernetes\n"
  },
  {
    "path": "docs/modules/ROOT/pages/index.adoc",
    "content": "= User Manual\ninclude::../partials/component-attributes.adoc[]\n\nQuick Links:\nxref:pkl-cli:index.adoc#installation[Installation] \n| xref:language-reference:index.adoc[Language Reference]\n| https://pkl-lang.org/package-docs/pkl/current/index.html[Standard Library]\n\nPkl -- pronounced _Pickle_ -- is an embeddable configuration language which provides rich support for data templating and validation.\nIt can be used from the command line, integrated in a build pipeline, or embedded in a program.\nPkl scales from small to large, simple to complex, ad-hoc to repetitive configuration tasks.\n\nxref:introduction:index.adoc[Introduction]:: Why we created Pkl and what it can do for you.\nxref:language.adoc[Language]:: Get to know the language and standard library.\nxref:language-bindings.adoc[Bindings]:: Libraries for embedding Pkl into general-purpose languages.\nxref:tools.adoc[Tools]:: CLI, Gradle plugin, code generators, and other tools.\nlink:{uri-pkl-examples-repo}[Examples]:: Ready-to-go examples with full source code.\nxref:release-notes:index.adoc[Release Notes]:: What's new in each release.\n"
  },
  {
    "path": "docs/modules/ROOT/pages/integrations.adoc",
    "content": "= Framework Integrations\n\n* xref:spring:ROOT:index.adoc[Spring (Boot) Integration]\n"
  },
  {
    "path": "docs/modules/ROOT/pages/language-bindings.adoc",
    "content": "= Language Bindings\n\n* xref:java-binding:index.adoc[Java]\n* xref:kotlin-binding:index.adoc[Kotlin]\n* xref:swift:ROOT:index.adoc[Swift]\n* xref:go:ROOT:index.adoc[Go]\n* xref:bindings-specification:index.adoc[Specification]\n** xref:bindings-specification:message-passing-api.adoc[Message Passing API]\n** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]\n"
  },
  {
    "path": "docs/modules/ROOT/pages/language.adoc",
    "content": "= Language\n\n* xref:language-tutorial:index.adoc[Tutorial]\n* xref:language-reference:index.adoc[Language Reference]\n* xref:standard-library.adoc[Standard Library]\n"
  },
  {
    "path": "docs/modules/ROOT/pages/resources.adoc",
    "content": "= Resources\ninclude::../partials/component-attributes.adoc[]\n\nThere's more to explore!\n\n* Visit Pkl's repositories on https://github.com/apple?q=pkl[GitHub]\n* Browse the standard library's https://pkl-lang.org/package-docs/pkl/{pkl-version}/[API Docs]\n"
  },
  {
    "path": "docs/modules/ROOT/pages/standard-library.adoc",
    "content": "= Standard Library\ninclude::../partials/component-attributes.adoc[]\n\nThe standard library is a set of Pkl modules, versioned and distributed together with the language.\nIt is documented in the link:{uri-pkl-stdlib-docs-index}[API Docs].\n\nTo import a standard library module, use `import \"pkl:<identifier>\"`.\nFor example, `import \"pkl:json\"` imports the `pkl.json` module.\n\nThe `pkl.base` module defines the most fundamental properties, methods, and classes for using Pkl.\nIts members are automatically available in every module and hence, it does not need to be imported.\n\nThe default module allowlist (`--allowed-modules`) grants access to all standard library modules.\n"
  },
  {
    "path": "docs/modules/ROOT/pages/tools.adoc",
    "content": "= Tools\ninclude::ROOT:partial$component-attributes.adoc[]\n\n* xref:pkl-cli:index.adoc[CLI]\n* xref:pkl-doc:index.adoc[Pkldoc]\n* xref:pkl-gradle:index.adoc[Gradle Plugin]\n* Editor support\n** xref:intellij:ROOT:index.adoc[IntelliJ]\n** xref:vscode:ROOT:index.adoc[VSCode]\n** xref:neovim:ROOT:index.adoc[Neovim]\n"
  },
  {
    "path": "docs/modules/ROOT/partials/component-attributes.adoc",
    "content": "// TODO: move to antora.yml once supported\n\n// the following attributes must be updated immediately before a release\n\n// pkl version corresponding to current git commit without -dev suffix or git hash\n:pkl-version-no-suffix: 0.32.0\n// tells whether pkl version corresponding to current git commit\n// is a release version (:is-release-version: '') or dev version (:!is-release-version:)\n:!is-release-version:\n\n// the remaining attributes do not need to be updated regularly\n\n:pkl-version: {pkl-version-no-suffix}-dev\nifdef::is-release-version[]\n:pkl-version: {pkl-version-no-suffix}\nendif::[]\n\n// use non-unique snapshot version because we have no way to determine unique snapshot version here\n:pkl-artifact-version: {pkl-version-no-suffix}-SNAPSHOT\nifdef::is-release-version[]\n:pkl-artifact-version: {pkl-version}\nendif::[]\n\n:uri-maven-docsite: https://central.sonatype.com\n\n:uri-snapshot-repo: https://central.sonatype.com/repository/maven-snapshots\n\n:uri-maven-repo: https://central.sonatype.com/repository/maven-snapshots\nifdef::is-release-version[]\n:uri-maven-repo: https://repo1.maven.org/maven2\nendif::[]\n\n:symbolic-version-name: latest\nifdef::is-release-version[]\n:symbolic-version-name: current\nendif::[]\n:uri-pkl-docs-base: https://pkl-lang.org/package-docs\n:uri-pkl-stdlib-docs-base: {uri-pkl-docs-base}/pkl\n:uri-pkl-stdlib-docs: {uri-pkl-stdlib-docs-base}/{pkl-version}\n:uri-pkl-stdlib-docs-index: {uri-pkl-stdlib-docs}/\n\n:github-branch: main\nifdef::is-release-version[]\n:github-branch: {pkl-version-no-suffix}\nendif::[]\n:uri-github-tree: https://github.com/apple/pkl/tree/{github-branch}\n:uri-pkl-stdlib-sources: {uri-github-tree}/stdlib\n\n:github-releases-base: https://github.com/apple/pkl/releases\n:github-releases: {github-releases-base}/download/{pkl-artifact-version}\n\n:uri-pkl-core-main-sources: {uri-github-tree}/pkl-core/src/main/java/org/pkl/core\n:uri-pkl-cli-main-sources: {uri-github-tree}/pkl-cli/src/main/kotlin/org/pkl/cli\n:uri-pkl-doc-main-sources: {uri-github-tree}/pkl-doc/src/main/kotlin/org/pkl/doc\n\n// This attribute is used as language for Pkl code blocks.\n// It can then be mapped to different languages in different environments (e.g., IntelliJ vs. Antora).\n:pkl: pkl\n:pkl-expr: pkl expression\n\n:uri-pkl-examples-repo: https://github.com/apple/pkl-jvm-examples\n:uri-pkl-examples-tree: {uri-pkl-examples-repo}/tree/main\n:uri-build-eval-example: {uri-pkl-examples-tree}/build-eval\n:uri-codegen-java-example: {uri-pkl-examples-tree}/codegen-java\n:uri-codegen-kotlin-example: {uri-pkl-examples-tree}/codegen-kotlin\n:uri-config-java-example: {uri-pkl-examples-tree}/config-java\n:uri-config-kotlin-example: {uri-pkl-examples-tree}/config-kotlin\n:uri-pkldoc-example: {uri-pkl-examples-tree}/pkldoc\n\n:uri-stdlib-baseModule: {uri-pkl-stdlib-docs}/base\n:uri-stdlib-CommandModule: {uri-pkl-stdlib-docs}/Command\n:uri-stdlib-analyzeModule: {uri-pkl-stdlib-docs}/analyze\n:uri-stdlib-jsonnetModule: {uri-pkl-stdlib-docs}/jsonnet\n:uri-stdlib-reflectModule: {uri-pkl-stdlib-docs}/reflect\n:uri-stdlib-mathModule: {uri-pkl-stdlib-docs}/math\n:uri-stdlib-xmlModule: {uri-pkl-stdlib-docs}/xml\n:uri-stdlib-protobufModule: {uri-pkl-stdlib-docs}/protobuf\n:uri-stdlib-pklbinaryModule: {uri-pkl-stdlib-docs}/pklbinary\n:uri-stdlib-yamlModule: {uri-pkl-stdlib-docs}/yaml\n:uri-stdlib-YamlParser: {uri-stdlib-yamlModule}/Parser\n:uri-stdlib-evaluatorSettingsModule: {uri-pkl-stdlib-docs}/EvaluatorSettings\n:uri-stdlib-evaluatorSettingsHttpClass: {uri-stdlib-evaluatorSettingsModule}/Http\n:uri-stdlib-Boolean: {uri-stdlib-baseModule}/Boolean\n:uri-stdlib-xor: {uri-stdlib-baseModule}/Boolean#xor()\n:uri-stdlib-implies: {uri-stdlib-baseModule}/Boolean#implies()\n:uri-stdlib-Any: {uri-stdlib-baseModule}/Any\n:uri-stdlib-String: {uri-stdlib-baseModule}/String\n:uri-stdlib-Collection: {uri-stdlib-baseModule}/Collection\n:uri-stdlib-StringToInt: {uri-stdlib-baseModule}/String#toInt()\n:uri-stdlib-Int: {uri-stdlib-baseModule}/Int\n:uri-stdlib-Float: {uri-stdlib-baseModule}/Float\n:uri-stdlib-Number: {uri-stdlib-baseModule}/Number\n:uri-stdlib-NaN: {uri-stdlib-baseModule}/#NaN\n:uri-stdlib-Infinity: {uri-stdlib-baseModule}/#Infinity\n:uri-stdlib-isBetween: {uri-stdlib-baseModule}/Number#isBetween\n:uri-stdlib-isFinite: {uri-stdlib-baseModule}/Number#isFinite\n:uri-stdlib-Int8: {uri-stdlib-baseModule}/#Int8\n:uri-stdlib-Int16: {uri-stdlib-baseModule}/#Int16\n:uri-stdlib-Int32: {uri-stdlib-baseModule}/#Int32\n:uri-stdlib-UInt8: {uri-stdlib-baseModule}/#UInt8\n:uri-stdlib-UInt16: {uri-stdlib-baseModule}/#UInt16\n:uri-stdlib-UInt32: {uri-stdlib-baseModule}/#UInt32\n:uri-stdlib-UInt: {uri-stdlib-baseModule}/#UInt\n:uri-stdlib-Uri: {uri-stdlib-baseModule}/#Uri\n:uri-stdlib-matches: {uri-stdlib-baseModule}/String#matches()\n:uri-stdlib-Null: {uri-stdlib-baseModule}/Null\n:uri-stdlib-ifNonNull: {uri-stdlib-baseModule}/Null#ifNonNull()\n:uri-stdlib-List: {uri-stdlib-baseModule}/List\n:uri-stdlib-Set: {uri-stdlib-baseModule}/Set\n:uri-stdlib-Map: {uri-stdlib-baseModule}/Map\n:uri-stdlib-Listing: {uri-stdlib-baseModule}/Listing\n:uri-stdlib-Listing-default: {uri-stdlib-baseModule}/Listing#default\n:uri-stdlib-Listing-isDistinct: {uri-stdlib-baseModule}/Listing#isDistinct\n:uri-stdlib-Listing-isDistinctBy: {uri-stdlib-baseModule}/Listing#isDistinctBy()\n:uri-stdlib-Mapping: {uri-stdlib-baseModule}/Mapping\n:uri-stdlib-Mapping-default: {uri-stdlib-baseModule}/Mapping#default\n:uri-stdlib-Duration: {uri-stdlib-baseModule}/Duration\n:uri-stdlib-Duration-value: {uri-stdlib-baseModule}/Duration#value\n:uri-stdlib-Duration-unit: {uri-stdlib-baseModule}/Duration#unit\n:uri-stdlib-DurationUnit: {uri-stdlib-baseModule}/#DurationUnit\n:uri-stdlib-DataSize: {uri-stdlib-baseModule}/DataSize\n:uri-stdlib-DataSize-value: {uri-stdlib-baseModule}/DataSize#value\n:uri-stdlib-DataSize-unit: {uri-stdlib-baseModule}/DataSize#unit\n:uri-stdlib-DataSizeUnit: {uri-stdlib-baseModule}/#DataSizeUnit\n:uri-stdlib-Dynamic: {uri-stdlib-baseModule}/Dynamic\n:uri-stdlib-Dynamic-toTyped: {uri-stdlib-baseModule}/Dynamic#toTyped()\n:uri-stdlib-Typed: {uri-stdlib-baseModule}/Typed\n:uri-stdlib-Regex: {uri-stdlib-baseModule}/Regex\n:uri-stdlib-Regex-method: {uri-stdlib-baseModule}/#Regex()\n:uri-stdlib-Regex-match: {uri-stdlib-baseModule}/Regex#match\n:uri-stdlib-RegexMatch: {uri-stdlib-baseModule}/RegexMatch\n:uri-stdlib-Pair: {uri-stdlib-baseModule}/Pair\n:uri-stdlib-IntSeq: {uri-stdlib-baseModule}/IntSeq\n:uri-stdlib-Class: {uri-stdlib-baseModule}/Class\n:uri-stdlib-TypeAlias: {uri-stdlib-baseModule}/TypeAlias\n:uri-stdlib-Deprecated: {uri-stdlib-baseModule}/Deprecated\n:uri-stdlib-BaseValueRenderer: {uri-stdlib-baseModule}/BaseValueRenderer\n:uri-stdlib-ValueRenderer: {uri-stdlib-baseModule}/ValueRenderer\n:uri-stdlib-BytesRenderer: {uri-stdlib-baseModule}/BytesRenderer\n:uri-stdlib-YamlRenderer: {uri-stdlib-baseModule}/YamlRenderer\n:uri-stdlib-PcfRenderer-converters: {uri-stdlib-baseModule}/PcfRenderer#converters\n:uri-stdlib-Function: {uri-stdlib-baseModule}/Function\n:uri-stdlib-Function0: {uri-stdlib-baseModule}/Function0\n:uri-stdlib-Function1: {uri-stdlib-baseModule}/Function1\n:uri-stdlib-Function1-apply: {uri-stdlib-baseModule}/Function1#apply()\n:uri-stdlib-Function2: {uri-stdlib-baseModule}/Function2\n:uri-stdlib-Function3: {uri-stdlib-baseModule}/Function3\n:uri-stdlib-Function4: {uri-stdlib-baseModule}/Function4\n:uri-stdlib-Function5: {uri-stdlib-baseModule}/Function5\n:uri-stdlib-Bytes: {uri-stdlib-baseModule}/Bytes\n:uri-stdlib-Resource: {uri-stdlib-baseModule}/Resource\n:uri-stdlib-outputFiles: {uri-stdlib-baseModule}/ModuleOutput#files\n:uri-stdlib-FileOutput: {uri-stdlib-baseModule}/FileOutput\n:uri-stdlib-Annotation: {uri-stdlib-baseModule}/Annotation\n:uri-stdlib-ConvertProperty: {uri-stdlib-baseModule}/ConvertProperty\n:uri-stdlib-Command-Flag: {uri-stdlib-CommandModule}/Flag\n:uri-stdlib-Command-BooleanFlag: {uri-stdlib-CommandModule}/BooleanFlag\n:uri-stdlib-Command-CountedFlag: {uri-stdlib-CommandModule}/CountedFlag\n:uri-stdlib-Command-Argument: {uri-stdlib-CommandModule}/Argument\n:uri-stdlib-Command-Import: {uri-stdlib-CommandModule}/Import\n\n:uri-messagepack: https://msgpack.org/index.html\n:uri-messagepack-spec: https://github.com/msgpack/msgpack/blob/master/spec.md\n\n:uri-pkl-roadmap: https://github.com/orgs/apple/projects/12/views/1\n\n// TODO: figure out what the correct URL should be\n:uri-sonatype-snapshot-download: https://s01.oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.pkl-lang&v={pkl-artifact-version}\n"
  },
  {
    "path": "docs/modules/bindings-specification/pages/binary-encoding.adoc",
    "content": "= `pkl-binary` Encoding\ninclude::ROOT:partial$component-attributes.adoc[]\ninclude::partial$component-attributes.adoc[]\n\n:uri-pkl-core-Evaluator: {uri-pkl-core-main-sources}/Evaluator.java\n\nPkl values can be encoded into a binary format called \"pkl-binary\".\nThis format is a lossless serialization of the underlying Pkl values.\n\nPkl code can be rendered into this format using the {uri-stdlib-pklbinaryModule}[pkl:pklbinary] standard library module.\n\nAlternatively, many language bindings also provide methods to evaluate into `pkl-binary`, such as the `evaluateExpressionPklBinary` method in link:{uri-pkl-core-Evaluator}[org.pkl.core.Evaluator].\n\nThe binary format is uses link:{uri-messagepack}[MessagePack] encoding.\n\n== Primitives\n\nAll Pkl primitives turn into their respective MessagePack primitive.\n\n|===\n|Pkl Type|MessagePack format\n\n|link:{uri-stdlib-Int}[Int]\n|link:{uri-messagepack-int}[int]\n\n|link:{uri-stdlib-Float}[Float]\n|link:{uri-messagepack-float}[float]\n\n|link:{uri-stdlib-String}[String]\n|link:{uri-messagepack-str}[string]\n\n|link:{uri-stdlib-Boolean}[Boolean]\n|link:{uri-messagepack-bool}[bool]\n\n|link:{uri-stdlib-Null}[Null]\n|link:{uri-messagepack-nil}[nil]\n|===\n\nNOTE: Pkl integers are encoded into the smallest int type that the number will fit into.\nFor example, value `8` gets encoded as MessagePack `int8` format.\n\n== Non-primitives\n\nAll non-primitive values are encoded as MessagePack arrays.\nThe first slot of the array designates the value's type.\nThe remaining slots have fixed meanings depending on the type.\nAdditional slots may be added to types in future Pkl releases. Decoders *must* be designed to defensively discard values beyond the number of known slots for a type or provide meaningful error messages.\n\nThe array's length is the number of slots that are filled. For example, xref:{uri-stdlib-List}[List] is encoded as an MessagePack array with two elements.\n\n|===\n|Pkl type |Slot 1 2+|Slot 2 2+|Slot 3 2+|Slot 4\n\n||code |type |description |type |description |type |description\n\n|link:{uri-stdlib-Typed}[Typed], link:{uri-stdlib-Dynamic}[Dynamic]\n|`0x01`\n|link:{uri-messagepack-str}[str]\n|<<type-name-encoding,Class name>>\n|link:{uri-messagepack-str}[str]\n|Enclosing module URI\n|link:{uri-messagepack-array}[array]\n|Array of <<object-members,object members>>\n\n|link:{uri-stdlib-Map}[Map]\n|`0x02`\n|link:{uri-messagepack-map}[map]\n|Map of `<value>` to `<value>`\n|\n|\n|\n|\n\n|link:{uri-stdlib-Mapping}[Mapping]\n|`0x03`\n|link:{uri-messagepack-map}[map]\n|Map of `<value>` to `<value>`\n|\n|\n|\n|\n\n|link:{uri-stdlib-List}[List]\n|`0x04`\n|link:{uri-messagepack-array}[array]\n|Array of `<value>`\n|\n|\n|\n|\n\n|link:{uri-stdlib-Listing}[Listing]\n|`0x05`\n|link:{uri-messagepack-array}[array]\n|Array of `<value>`\n|\n|\n|\n|\n\n|link:{uri-stdlib-Set}[Set]\n|`0x06`\n|link:{uri-messagepack-array}[array]\n|Array of `<value>`\n|\n|\n|\n|\n\n|link:{uri-stdlib-Duration}[Duration]\n|`0x07`\n|{uri-messagepack-float}[float64]\n|Duration value\n|link:{uri-messagepack-str}[str]\n|link:{uri-stdlib-DurationUnit}[Duration unit] (`\"ns\"`, `\"ms\"`, etc.)\n|\n|\n\n|link:{uri-stdlib-DataSize}[DataSize]\n|`0x08`\n|link:{uri-messagepack-float}[float64]\n|Value (float64)\n|link:{uri-messagepack-str}[str]\n|link:{uri-stdlib-DataSizeUnit}[DataSize unit] (`\"b\"`, `\"kb\"`, etc.)\n|\n|\n\n|link:{uri-stdlib-Pair}[Pair]\n|`0x09`\n|`<value>`\n|First value\n|`<value>`\n|Second value\n|\n|\n\n|link:{uri-stdlib-IntSeq}[IntSeq]\n|`0x0A`\n|link:{uri-messagepack-int}[int]\n|Start\n|link:{uri-messagepack-int}[int]\n|End\n|link:{uri-messagepack-int}[int]\n|Step\n\n|link:{uri-stdlib-Regex}[Regex]\n|`0x0B`\n|link:{uri-messagepack-str}[str]\n|Regex string representation\n|\n|\n|\n|\n\n|link:{uri-stdlib-Class}[Class]\n|`0x0C`\n|link:{uri-messagepack-str}[str]\n|<<type-name-encoding,Class name>>\n|link:{uri-messagepack-str}[str]\n|Module URI\n|\n|\n\n|link:{uri-stdlib-TypeAlias}[TypeAlias]\n|`0x0D`\n|link:{uri-messagepack-str}[str]\n|<<type-name-encoding,TypeAlias name>>\n|link:{uri-messagepack-str}[str]\n|Module URI\n|\n|\n\n|link:{uri-stdlib-Function}[Function]\n|`0x0E`\n|\n|\n|\n|\n|\n|\n\n|link:{uri-stdlib-Bytes}[Bytes]\n|`0x0F`\n|link:{uri-messagepack-bin}[bin]\n|Binary contents\n|\n|\n|\n|\n|===\n\n[[type-name-encoding]]\n[NOTE]\n====\nType names have specific encoding rules:\n\n* When the module URI is `pkl:base`:\n** If the type name is `ModuleClass`, this type represents the module class of `pkl:base`.\n** Otherwise, the type name corresponds to a type in `pkl:base`.\n* For all other module URIs:\n** When the type name contains `\\#`, the string after the `#` character corresponds to a type in that module. The string before the `#` is the name of the module.\n** Otherwise, the type name is the name of the module and represents the class of the module.\n====\n\n[[object-members]]\n== Object Members\n\nLike non-primitive values, object members are encoded as MessagePack arrays, where the first slot designates the value's type.\n\n|===\n|Member type |Slot 1 2+|Slot 2 2+|Slot 3\n\n| |code |type |description |type |description\n\n|Property\n|`0x10`\n|link:{uri-messagepack-str}[str]\n|key\n|`<value>`\n|property value\n\n|Entry\n|`0x11`\n|`<value>`\n|entry key\n|`<value>`\n|entry value\n\n|Element\n|`0x12`\n|link:{uri-messagepack-int}[int]\n|index\n|`<value>`\n|element value\n|===\n"
  },
  {
    "path": "docs/modules/bindings-specification/pages/index.adoc",
    "content": "= Language Binding Specification\n\n:uri-pkl-go-github: https://github.com/apple/pkl-go\n:uri-pkl-swift-github: https://github.com/apple/pkl-swift\n\nPkl can be embedded within any host application.\nThe host application has access to low level controls.\nIt is able to manage the lifecycle of evaluators, as well as provide custom modules and resources to Pkl.\n\nCurrently, Pkl must be embedded as a child process, by shelling out to the CLI using the xref:pkl-cli:index.adoc#command-server[`pkl server`] command. In the future, a C library will also be provided.\n\nWhen embedded, communication between a host application and Pkl happens via message passing.\nThe message passing specification can be found in xref:message-passing-api.adoc[].\n\nFor examples of language bindings in practice, review the link:{uri-pkl-go-github}[pkl-go], or the link:{uri-pkl-swift-github}[pkl-swift] codebases.\n\nNOTE: Pkl's Java and Kotlin libraries binds to Pkl directly, and do not use message passing.\n\n== Features of a language binding\n\nA language binding for Pkl should generally have the following components:\n\n. A client that spawns `pkl server`, and talks to it using message passing.\n. A deserializer that turns xref:binary-encoding.adoc[pkl binary encoding] into a structure in the host language.\n. A code generator that transforms Pkl schemas into schemas written in the host language.\n  The code generator is mostly written in Pkl, with a lightweight executable that acts as the glue layer.\n  For examples of code generators, consult link:{uri-pkl-go-github}/tree/main/codegen[pkl-go] and link:{uri-pkl-swift-github}/tree/main/codegen[pkl-swift].\n\n== Sample flow\n\nHere is a sample flow for evaluating a module with the following contents:\n\n.\\file:///path/to/myModule.pkl\n[source,{pkl}]\n----\nmodule MyModule\n\ntheModules = import*(\"customfs:/*.pkl\")\n----\n\n. Client sends xref:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request], including `customfs` as a custom module reader.\n+\n[source,json]\n----\n[\n  0x20,\n  {\n    \"requestId\": 135,\n    \"allowedModules\": [\"pkl:\", \"repl:\", \"file:\", \"customfs:\"],\n    \"clientModuleReaders\": [\n      {\n        \"scheme\": \"customfs\",\n        \"hasHierarchicalUris\": true,\n        \"isGlobbable\": true,\n        \"isLocal\": true\n      }\n    ]\n  }\n]\n----\n. Server sends xref:message-passing-api.adoc#create-evaluator-response[Create Evaluator Response], with an evaluator id.\n+\n[source,json]\n----\n[\n  0x21,\n  {\n    \"requestId\": 135,\n    \"evaluatorId\": -135901\n  }\n]\n----\n. Client sends xref:message-passing-api.adoc#evaluate-request[Evaluate Request], providing the module's URI.\n+\n[source,json]\n----\n[\n  0x23,\n  {\n    \"requestId\": 9805131,\n    \"evaluatorId\": -13901,\n    \"moduleUri\": \"file:///path/to/myModule.pkl\"\n  }\n]\n----\n. During evaluation, server evaluates `import*(\"customfs:/*.pkl\")`, and sends xref:message-passing-api.adoc#list-modules-request[List Modules Request].\n+\n[source,json]\n----\n[\n  0x2c,\n  {\n    \"requestId\": -6478924,\n    \"evaluatorId\": -13901,\n    \"uri\": \"customfs:/\"\n  }\n]\n----\n. Client responds with xref:message-passing-api.adoc#list-modules-response[List Modules Response].\nIn our pretend scenario, there is only one file; `foo.pkl`.\n+\n[source,json]\n----\n[\n  0x2d,\n  {\n    \"requestId\": -6478924,\n    \"evaluatorId\": -13901,\n    \"pathElements\": [\n      {\n        \"name\": \"foo.pkl\",\n        \"isDirectory\": false\n      }\n    ]\n  }\n]\n----\n. Server sends xref:message-passing-api.adoc#read-module-request[Read Module Request] to read `foo.pkl`.\n+\n[source,json]\n----\n[\n  0x28,\n  {\n    \"requestId\": 36408291,\n    \"evaluatorId\": -13901,\n    \"uri\": \"customfs:/foo.pkl\"\n  }\n]\n----\n. Client responds with the module's contents\n+\n[source,json]\n----\n[\n  0x29,\n  {\n    \"requestId\": 36408291,\n    \"evaluatorId\": -13901,\n    \"contents\": \"foo = 1\"\n  }\n]\n----\n. Server finishes evaluation, and responds with the xref:message-passing-api.adoc#evaluate-response[Evaluate Response].\n+\n[source,json]\n----\n[\n  0x24,\n  {\n    \"requestId\": 9805131,\n    \"evaluatorId\": -13901,\n    \"result\": <pkl binary value>\n  }\n]\n----\n. Client sends xref:message-passing-api.adoc#close-evaluator[Close Evaluator].\n+\n[source,json]\n----\n[\n  0x22,\n  {\n    \"evaluatorId\": -13901\n  }\n]\n----\n\n== Debug logs\n\nSet the env var `PKL_DEBUG=1` to enable more verbose logging from Pkl.\nIt is recommended that clients also use this environment variable to enable debug logs of their own.\n\n"
  },
  {
    "path": "docs/modules/bindings-specification/pages/message-passing-api.adoc",
    "content": "= Message Passing API\n\ninclude::ROOT:partial$component-attributes.adoc[]\ninclude::partial$component-attributes.adoc[]\n\nAll messages are encoded in link:{uri-messagepack}[MessagePack], as an array with two elements.\n\nThe first element of the array is a code that designates the message's type, encoded as an int.\nThe second element of the array is the message body, encoded as a map.\n\nMessages are passed between the _client_ and the _server_.\nWhen hosting Pkl (for example, the Swift application when using pkl-swift), the _client_ is the host program and the _server_ is the entity that provides controls for interacting with Pkl.\nWhen implementing an xref:language-reference:index.adoc#external-readers[external reader], the _client_ is the external reader process and the _server_ is the Pkl evaluator.\n\nFor example, in JSON representation:\n\n[source,json]\n----\n[\n  1,                           // <1>\n  { \"someKey\": \"someValue\" }   // <2>\n]\n----\n<1> Code indicating message type\n<2> Message body\n\n== Message types\n\n[[client-message]]\n=== Client Message\nA message passed from the client to the server.\n\n[[server-message]]\n=== Server Message\nA message passed from the server to the client.\n\n[[request-message]]\n=== Request Message\nA message sent with a `requestId` value.\nThe `requestId` should be a unique number at the time of message send.\nThe other side is expected to respond with a <<response-message>> with the same `requestId`.\n\n[[response-message]]\n=== Response Message\nA message that is the response to a <<request-message>>.\nIt contains the same `requestId` of the request message.\n\n[[one-way-message]]\n=== One Way Message\n\nA fire-and-forget message where no response is expected.\n\n== Messages\n\nAll messages have their schema described in Pkl.\nA nullable type means that the property should be omitted (as opposed to the property's value being `nil`).\n\n[[create-evaluator-request]]\n=== Create Evaluator Request\n\nCode: `0x20` +\nType: <<client-message,Client>> <<request-message,Request>>\n\nCreate an evaluator with the provided evaluator settings.\nUpon creating the evaluator, the server sends back a <<create-evaluator-response>> message.\n\nSchema:\n[source,pkl]\n----\n/// A number identifying this request\nrequestId: Int\n\n/// Regex patterns to determine which modules are allowed for import.\n///\n/// API version of the CLI's `--allowed-modules` flag\nallowedModules: Listing<String>?\n\n/// Regex patterns to determine which resources are allowed to be read.\n///\n/// API version of the CLI's `--allowed-resources` flag\nallowedResources: Listing<String>?\n\n/// Register client-side module readers.\nclientModuleReaders: Listing<ClientModuleReader>?\n\n/// Register client-side resource readers.\nclientResourceReaders: Listing<ClientResourceReader>?\n\n/// Directories, ZIP archives, or JAR archives\n/// to search when resolving `modulepath:` URIs.\n///\n/// API version of the CLI's `--module-path` flag.\nmodulePaths: Listing<String>?\n\n/// Environment variable to set.\n///\n/// API version of the CLI's `--env-var` flag.\nenv: Mapping<String, String>?\n\n/// External properties to set.\n///\n/// API version of the CLI's `--properties` flag.\nproperties: Mapping<String, String>?\n\n/// Duration, in seconds, after which evaluation of a source module will be timed out.\n///\n/// API version of the CLI's `--timeout` flag.\ntimeoutSeconds: Int?\n\n/// Restricts access to file-based modules and resources to those located under the root directory.\nrootDir: String?\n\n/// The cache directory for storing packages.\ncacheDir: String?\n\n/// The format to generate.\n///\n/// This sets the `pkl.outputFormat` external property.\noutputFormat: String?\n\n/// The project dependency settings.\nproject: Project?\n\n/// Configuration of outgoing HTTP(s) requests.\n///\n/// Added in Pkl 0.26.0.\nhttp: Http?\n\nclass ClientResourceReader {\n  /// The URI scheme this reader is responsible for reading.\n  scheme: String\n\n  /// Tells whether the path part of this URI has a\n  /// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).\n  ///\n  /// An example of a hierarchical URI is `file:///path/to/my/file`, where\n  /// `/path/to/my/file` designates a nested path through the `/` character.\n  ///\n  /// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote\n  /// any form of hierarchy.\n  hasHierarchicalUris: Boolean\n\n  /// Tells whether this reader supports globbing.\n  isGlobbable: Boolean\n}\n\nclass ClientModuleReader {\n  /// The URI scheme this reader is responsible for reading.\n  scheme: String\n\n  /// Tells whether the path part of this URI has a\n  /// [hier-part](https://datatracker.ietf.org/doc/html/rfc3986#section-3).\n  ///\n  /// An example of a hierarchical URI is `file:///path/to/my/file`, where\n  /// `/path/to/my/file` designates a nested path through the `/` character.\n  ///\n  /// An example of a non-hierarchical URI is `pkl.base`, where the `base` does not denote\n  /// any form of hierarchy.\n  hasHierarchicalUris: Boolean\n\n  /// Tells whether this reader supports globbing.\n  isGlobbable: Boolean\n\n  /// Tells whether the module is local to the system.\n  ///\n  /// A local resource that [hasHierarchicalUris] supports triple-dot imports.\n  isLocal: Boolean\n}\n\nclass Project {\n  type: \"local\"\n\n  /// The canonical URI of this project's package\n  packageUri: String?\n\n  /// The URI pointing to the location of the project file.\n  projectFileUri: String\n\n  /// The dependencies of this project.\n  dependencies: Mapping<String, Project|RemoteDependency>\n}\n\nclass RemoteDependency {\n  type: \"remote\"\n\n  /// The canonical URI of this dependency\n  packageUri: String?\n\n  /// The checksums of this remote dependency\n  checksums: Checksums?\n}\n\nclass Checksums {\n  /// The sha-256 checksum of this dependency's metadata.\n  sha256: String\n}\n\nclass Http {\n  /// PEM format certificates to trust when making HTTP requests.\n  ///\n  /// If [null], Pkl will trust its own built-in certificates.\n  caCertificates: Bytes? // <1>\n\n  /// Configuration of the HTTP proxy to use.\n  ///\n  /// If [null], uses the operating system's proxy configuration.\n  proxy: Proxy?\n\n  /// HTTP rewrites, from source prefix to target prefix.\n  ///\n  /// Each rewrite must start with `http://` or `https://`, and must end with `/`.\n  rewrites: Mapping<String, String>?\n}\n\n/// Settings that control how Pkl talks to HTTP proxies.\nclass Proxy {\n  /// The proxy to use for HTTP(S) connections.\n  ///\n  /// At the moment, only HTTP proxies are supported.\n  ///\n  /// Example:\n  /// ```\n  /// address = \"http://my.proxy.example.com:5080\"\n  /// ```\n  address: Uri(startsWith(\"http://\"))?\n\n  /// Hosts to which all connections should bypass a proxy.\n  ///\n  /// Values can be either hostnames, or IP addresses.\n  /// IP addresses can optionally be provided using [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation).\n  ///\n  /// The only wildcard is `\"*\"`, which disables all proxying.\n  ///\n  /// A hostname matches all subdomains.\n  /// For example, `example.com` matches `foo.example.com`, but not `fooexample.com`.\n  /// A hostname that is prefixed with a dot matches the hostname itself,\n  /// so `.example.com` matches `example.com`.\n  ///\n  /// Optionally, a port can be specified.\n  /// If a port is omitted, all ports are matched.\n  ///\n  /// Example:\n  ///\n  /// ```\n  /// noProxy {\n  ///   \"127.0.0.1\"\n  ///   \"169.254.0.0/16\"\n  ///   \"example.com\"\n  ///   \"localhost:5050\"\n  /// }\n  /// ```\n  noProxy: Listing<String>(isDistinct)\n}\n----\n<1> link:{uri-messagepack-bin}[bin format]\n\nExample:\n[source,json5]\n----\n[\n  0x20,\n  {\n    \"requestId\": 193501,\n    \"allowedModules\": [\"pkl:\", \"repl:\"],\n    \"allowedResources\": [\"file:\", \"package:\", \"projectpackage:\"]\n  }\n]\n----\n\n[[create-evaluator-response]]\n=== Create Evaluator Response\n\nCode: `0x21` +\nType: <<server-message,Server>> <<response-message,Response>>\n\nThe response for a <<create-evaluator-request>>.\nIf the evaluator was created successfully, `evaluatorId` is set. Otherwise, `error` is set to the resulting error.\n\n[source,pkl]\n----\n/// A number identifying this request\nrequestId: Int\n\n/// A number identifying the created evaluator.\nevaluatorId: Int?\n\n/// A message detailing why the evaluator was not created.\nerror: String?\n----\n\n[[close-evaluator]]\n=== Close Evaluator\n\nCode: `0x22` +\nType: <<client-message,Client>> <<one-way-message,One Way>>\n\nTells the Pkl server to close an evaluator, releasing any resources it may be holding.\n\n[source,pkl]\n----\n/// A number identifying this evaluator.\nevaluatorId: Int\n----\n\n[[evaluate-request]]\n=== Evaluate Request\n\nCode: `0x23` +\nType: <<client-message,Client>> <<request-message,Request>>\n\nEvaluate a module.\n\n[source,pkl]\n----\n/// A number identifying this request\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The absolute URI of the module to be evaluated.\nmoduleUri: String\n\n/// The module's contents.\n///\n/// If [null], Pkl will load the module at runtime.\nmoduleText: String?\n\n/// The Pkl expression to be evaluated within the module.\n///\n/// If [null], evaluates the whole module.\nexpr: String?\n----\n\n[[evaluate-response]]\n=== Evaluate Response\n\nCode: `0x24` +\nType: <<server-message,Server>> <<response-message,Response>>\n\nThe server's response to <<evaluate-request>>.\nIf the evaluation is successful, the response is the Pkl value encoded in xref:binary-encoding.adoc[binary encoding].\n\n[source,pkl]\n----\n/// The requestId of the Evaluate request\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The evaluation contents, if successful.\nresult: Bytes? // <1>\n\n/// A message detailing why evaluation failed.\nerror: String?\n----\n<1> xref:binary-encoding.adoc[Pkl Binary Encoding] in link:{uri-messagepack-bin}[bin format]\n\n[[log]]\n=== Log\n\nCode: `0x25` +\nType: <<server-message,Server>> <<one-way-message,One Way>>\n\nTells the client to emit a log message, during the execution of a Pkl program.\nA log can occur through a xref:language-reference:index.adoc#debugging[trace()] expression, or through a warning (for example, when encountering a link:{uri-stdlib-Deprecated}[Deprecated] value.)\n\n[source,pkl]\n----\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// A number identifying the log level.\n///\n/// - 0: trace\n/// - 1: warn\nlevel: Int(this == 0 || this == 1)\n\n/// The message to be logged\nmessage: String\n\n/// A string representing the source location within Pkl code producing this log output.\nframeUri: String\n----\n\n[[read-resource-request]]\n=== Read Resource Request\n\nCode: `0x26` +\nType: <<server-message,Server>> <<request-message,Request>>\n\nRead a resource at the given URI.\nThis message occurs when a read expression (`read`/`read?`/`read*`) is encountered within a program, and its scheme matches a client resource reader.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The URI of the resource.\nuri: String\n----\n\n[[read-resource-response]]\n=== Read Resource Response\n\nCode: `0x27` +\nType: <<client-message,Client>> <<response-message,Response>>\n\nThe response to <<read-resource-request>>.\nIf successful, `contents` is set.\nOtherwise, `error` is set.\n\nIf neither is set, `contents` defaults to an empty byte array.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The contents of the resource.\ncontents: Bytes? // <1>\n\n/// The description of the error that occurred when reading this resource.\nerror: String?\n----\n<1> MessagePack's link:https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family[bin format family]\n\n[[read-module-request]]\n=== Read Module Request\n\nCode: `0x28` +\nType: <<server-message,Server>> <<request-message,Request>>\n\nRead a module at the given URI.\nThis message occurs during the evaluation of an import statement or expression (`import`/`import*`), when a scheme matches a client module reader.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The URI of the module.\nuri: String\n----\n\n[[read-module-response]]\n=== Read Module Response\n\nCode: `0x29` +\nType: <<client-message,Client>> <<response-message,Response>>\n\nThe response to <<read-module-request>>.\nIf successful, `contents` is set.\nOtherwise, `error` is set.\n\nIf neither is set, `contents` defaults to an empty string.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The string contents of the module.\ncontents: String?\n\n/// The description of the error that occurred when reading this resource.\nerror: String?\n----\n\n[[list-resources-request]]\n=== List Resources Request\n\nCode: `0x2a` +\nType: <<server-message,Server>> <<request-message,Request>>\n\nList resources at the specified base path.\nThis message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-reads[globbed read], when a scheme matches a client resource reader's scheme.\n\nIf the resource reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all resource elements for that scheme.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The base URI to list resources.\nuri: String\n----\n\n[[list-resources-response]]\n=== List Resources Response\n\nCode: `0x2b` +\nType: <<client-message,Client>> <<response-message,Response>>\n\nThe response to <<list-resources-request>>.\nIf successful, `pathElements` is set.\nOtherwise, `error` is set.\n\nIf neither are set, `pathElements` default to an empty list.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The elements at the provided base path.\npathElements: Listing<PathElement>?\n\n/// The description of the error that occurred when listing elements.\nerror: String?\n\nclass PathElement {\n  /// The name of the element at this path\n  name: String\n\n  /// Tells whether the element is a directory.\n  isDirectory: Boolean\n}\n----\n\n[[list-modules-request]]\n=== List Modules Request\n\nCode: `0x2c` +\nType: <<server-message,Server>> <<request-message,Request>>\n\nList modules at the specified base path.\nThis message occurs during the evaluation of a xref:language-reference:index.adoc#globbed-imports[globbed import], when a scheme matches a client resource reader's scheme.\n\nIf the module reader does not have hierarchical URIs, `dummy` is used as the path, and the response is expected to contain all module elements for that scheme.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The base URI to list modules.\nuri: String\n----\n\n[[list-modules-response]]\n=== List Modules Response\n\nCode: `0x2d` +\nType: <<client-message,Client>> <<response-message,Response>>\n\nThe response to <<list-modules-request>>.\nIf successful, `pathElements` is set.\nOtherwise, `error` is set.\n\nIf neither are set, `pathElements` default to an empty list.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// A number identifying this evaluator.\nevaluatorId: Int\n\n/// The elements at the provided base path.\npathElements: Listing<PathElement>?\n\n/// The description of the error that occurred when listing elements.\nerror: String?\n\nclass PathElement {\n  /// The name of the element at this path\n  name: String\n\n  /// Tells whether the element is a directory.\n  isDirectory: Boolean\n}\n----\n\n[[initialize-module-reader-request]]\n=== Initialize Module Reader Request\n\nCode: `0x2e` +\nType: <<server-message,Server>> <<request-message,Request>>\n\nInitialize an xref:language-reference:index.adoc#external-readers[External Module Reader].\nThis message is sent to external reader processes the first time a module scheme it is registered for is read.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// The module scheme to initialize.\nscheme: String\n----\n\n[[initialize-module-reader-response]]\n=== Initialize Module Reader Response\n\nCode: `0x2f` +\nType: <<client-message,Client>> <<response-message,Response>>\n\nReturn the requested external module reader specification.\nThe `spec` field should be set to `null` when the external process does not implement the requested module scheme.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// Client-side module reader spec.\n///\n/// Null when the external process does not implement the requested module scheme.\nspec: ClientModuleReader?\n----\n\n`ClientModuleReader` is defined above by <<create-evaluator-request,Create Evaluator Request>>.\n\n[[initialize-resource-reader-request]]\n=== Initialize Resource Reader Request\n\nCode: `0x30` +\nType: <<server-message,Server>> <<request-message,Request>>\n\nInitialize an xref:language-reference:index.adoc#external-readers[External Resource Reader].\nThis message is sent to external reader processes the first time a resource scheme it is registered for is read.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// The resource scheme to initialize.\nscheme: String\n----\n\n[[initialize-resource-reader-response]]\n=== Initialize Resource Reader Response\n\nCode: `0x31` +\nType: <<client-message,Client>> <<response-message,Response>>\n\nReturn the requested external resource reader specification.\nThe `spec` field should be set to `null` when the external process does not implement the requested resource scheme.\n\n[source,pkl]\n----\n/// A number identifying this request.\nrequestId: Int\n\n/// Client-side resource reader spec.\n///\n/// Null when the external process does not implement the requested resource scheme.\nspec: ClientResourceReader?\n----\n\n`ClientResourceReader` is defined above by <<create-evaluator-request,Create Evaluator Request>>. \n\n[[close-external-process]]\n=== Close External Process\n\nCode: `0x32` +\nType: <<server-message,Server>> <<one-way-message,One Way>> \n\nInitiate graceful shutdown of the external reader process.\n\n[source,pkl]\n----\n/// This message has no properties.\n----\n"
  },
  {
    "path": "docs/modules/bindings-specification/partials/component-attributes.adoc",
    "content": ":uri-github-binary-encoding-snippet-tests: {uri-github-tree}/pkl-server/src/test/files/SnippetTests\n:uri-messagepack-bool: {uri-messagepack-spec}#bool-format-family\n:uri-messagepack-int: {uri-messagepack-spec}#int-format-family\n:uri-messagepack-float: {uri-messagepack-spec}#float-format-family\n:uri-messagepack-str: {uri-messagepack-spec}#str-format-family\n:uri-messagepack-bin: {uri-messagepack-spec}#bin-format-family\n:uri-messagepack-array: {uri-messagepack-spec}#array-format-family\n:uri-messagepack-map: {uri-messagepack-spec}#map-format-family\n:uri-messagepack-nil: {uri-messagepack-spec}#nil-format\n"
  },
  {
    "path": "docs/modules/introduction/pages/comparison.adoc",
    "content": "= Comparison\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-jsonnet: https://jsonnet.org\n:uri-hcl: https://github.com/hashicorp/hcl\n:uri-dhall: https://dhall-lang.org\n:uri-pkl-spring: https://github.com/apple/pkl-spring\n:uri-graalvm: https://www.graalvm.org\n\nConfiguration is often described in a static configuration format or is generated with a general-purpose programming language.\nThis page lists shortcomings of these approaches and explains how Pkl addresses them.\nAlso, Pkl's strong and weak points in comparison to other configuration languages are discussed in this document.\n\n[[static-config-formats]]\n== Pkl vs. Static Config Formats\n\nStatic configuration formats such as JSON, YAML, TOML, and XML work reasonably well for simple configuration needs.\nHowever, they do have some shortcomings, including:\n\n. They are not very human-friendly to read and write. (JSON, XML)\n. They do not provide a way to split a large file into multiple smaller ones. (JSON, YAML, TOML)\n. They offer no way or very limited ways to abstract over repetitive configuration. (JSON, YAML, TOML, XML)\n. They do not offer standardized or widely available schema validators. (JSON, YAML, TOML)\n. They offer little or no schema-aware tooling. (JSON, YAML, TOML)\n\nPkl addresses these shortcomings as follows:\n\n. It has a clutter-free and familiar syntax with nestable comments.\n. Modules can import other modules from local and remote locations.\n. Every object can act as a template for other objects.\n  The standard library offers strong support for data manipulation.\n. It has strong built-in support for describing and validating configuration schemas.\n. It is designed to enable schema-aware tooling, such as REPLs and editors with code completion support.\n\n[[general-purpose-langs]]\n== Pkl vs. General-purpose Languages\n\nWhen configuration needs outgrow the capabilities of static configuration formats,\nprojects often turn to generate configuration with a general-purpose programming language such as Python.\nGiven enough effort, this approach can satisfy complex configuration needs.\nHowever, expressing configuration in a full-blown programming language does have some shortcomings, including:\n\n. Reading, writing, and debugging configuration can become as challenging as reading, writing, and debugging application code.\n. The host language may not be a good fit for describing, manipulating, and abstracting over hierarchical configuration.\n. Configuration code may not visually resemble the configuration it generates.\n. The host language may not be a good fit for defining and validating configuration schemas.\n. Development environments may offer little help for developing and validating configuration written in the host language.\n. General-purpose languages are powerful and often difficult to sandbox.\n  Are you certain your configuration script isn't erasing your hard disk or launching a rocket?\n\nPkl addresses these shortcomings as follows:\n\n. As an expression-oriented and side-effect free language, it eliminates many potential sources of errors.\n. It is specifically designed for describing, manipulating, and abstracting over hierarchical configuration.\n. Pkl code often resembles the configuration it generates.\n. It has strong built-in support for defining and validating configuration schemas.\n. It is designed to enable advanced and schema-aware tooling.\n. It is comparatively powerless and strictly sandboxed, making fatal configuration mistakes and exploits less likely.\n  Till now, we haven't spotted any Pkl script capable of erasing your hard disk.\n\n[[other-config-langs]]\n== Pkl vs. Other Config Languages\n\nCompared to open-source configuration languages such as link:{uri-jsonnet}[Jsonnet],\nlink:{uri-hcl}[HCL], and link:{uri-dhall}[Dhall], Pkl's strong points are:\n\nGeneral::\n+\n* Pkl has a clean and familiar syntax, which makes it easier to read and learn.\n* Pkl supports writing sophisticated schemas, which enables config validation, code and documentation generation, and advanced IDE support.\n  This is Pkl's most significant differentiator, and is the main reason why we created it.\n* Pkl has stronger templating capabilities than other config languages, reducing user code to the absolute minimum.\n\nEmbedding::\n+\n* Pkl is great for embedding into JVM applications.\n* Pkl offers modern xref:java-binding:pkl-config-java.adoc[JVM libraries] for runtime application configuration.\n* Pkl supports xref:java-binding:codegen.adoc[code generation] to enable statically typed access to configuration from programming languages.\n* Pkl integrates with third-party (link:{uri-pkl-spring}[Spring Boot]) JVM libraries and frameworks.\n\nTooling::\n+\n* Pkl has a polished xref:pkl-doc:index.adoc[documentation generator] that produces highly navigable and searchable documentation.\n* Pkl offers a xref:pkl-gradle:index.adoc[Gradle plugin] to easily integrate code evaluation, documentation generation, and code generation into your builds.\n* Pkl's native executables have a link:{uri-graalvm}[JIT compiler] that can speed up evaluation up to hundred times.\n\nOn the other hand, we believe that Pkl's weak points are:\n\n* Pkl's native binaries are larger than those of other config languages.\n* Pkl is less known and has a smaller community than some other config languages.\n\nWe are working towards making Pkl overcome these weakness. Please support us in reaching this goal!\n\nWe hope that you will enjoy Pkl, and that you trust us to gradually improve its weak points.\n"
  },
  {
    "path": "docs/modules/introduction/pages/concepts.adoc",
    "content": "= Concepts\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-property-list: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/UnderstandXMLPlist/UnderstandXMLPlist.html\n\nLet's get to know Pkl by discussing some of its concepts and features.\n\n[[abstraction]]\n== Abstraction\n\nConfiguration tends to grow larger and more complex over time, making it increasingly difficult to understand and maintain.\nPkl can reduce the size and complexity of configuration by\n\n* describing similar configuration elements in terms of their differences\n* introducing abstractions for common configuration elements\n* separating configuration structure from configuration data\n* computing instead of enumerating configuration\n\n[[evaluation]]\n== Evaluation\n\nPkl code lives in _modules_, a more fancy and general term for _files_.\nEvaluating a module produces an in-memory _data model_ that is roughly comparable to a JSON data model.\nIf evaluation completes successfully, the Pkl evaluator converts the data model to an external representation and terminates with the status code zero.\nOtherwise, the evaluator prints an error message and terminates with a non-zero status code.\n\n[[immutability]]\n== Immutability\n\nAll Pkl data is immutable.\nManipulating a value always returns a new value, leaving the original value unchanged.\nImmutability eliminates many potential sources of errors.\n\n[[isolation]]\n== Isolation\n\nEvaluation of Pkl code is strictly sandboxed.\nExcept for a few well-defined and well-controlled exceptions, Pkl code cannot interact with the outside world.\nLeaving aside bugs in the language implementation, the worst thing that buggy or malicious Pkl code can do is to consume CPU and memory resources until the evaluator gets killed.\nOver time, sandboxing will be further strengthened to cover fine-grained CPU and memory boxing.\n\n[[rendering]]\n== Rendering\n\nConverting a data model to an external representation is called _rendering_ the model.\nPkl ships with renderers for the following data formats:\n\n* JSON\n* Jsonnet\n* Pcf (a static subset of Pkl)\n* (Java) Properties\n* {uri-property-list}[Property List]\n* XML\n* YAML\n\nSupport for other formats can be added by writing a custom renderer in Pkl or Java.\nSee xref:language-reference:index.adoc#module-output[Module Output] and xref:pkl-core:index.adoc#value-visitor[Value Visitor] for more information.\n\n[[resemblance]]\n== Resemblance\n\nBy design, Pkl code tends to structurally and visually resemble the configuration it generates.\nThis makes the code easier to read and write.\n\n[[reuse]]\n== Reuse\n\nModules can reuse other modules by xref:language-reference:index.adoc#import-module[importing] them from local or remote locations.\nImports can also be used to split up one large module into multiple smaller ones, increasing maintainability.\nA configurable security policy helps to keep imports under control.\n\n[[schema]]\n== Schema\n\nConfiguration is structured data.\nPkl supports -- but does not require -- to express this structure as a _configuration schema_, a set of classes defining configuration properties, their defaults, types, and constraints.\nWriting and maintaining a configuration schema takes some effort but, in return, provides these benefits:\n\n* Independent evolution of configuration schema and configuration data, often by different teams (for example service providers and service consumers).\n* Automatic xref:pkl-doc:index.adoc[documentation generation].\n* Strong validation of configuration, both during development time and runtime.\n* Statically typed access to configuration from xref:java-binding:codegen.adoc[Java] and other languages through code generation.\n* Schema-aware development tools, for example REPLs and editors with code completion support.\n\n[[template]]\n== Templating\n\nPkl supports writing templates for objects and entire modules.\nTemplates can be repeatedly turned into concrete configuration by filling in the blanks, and -- when necessary -- overriding defaults.\nSharing template modules over the network can streamline complex configuration tasks for entire teams, organizations, and communities.\n\n[[usability]]\n== Usability\n\nEverybody needs a configuration solution, but nobody wants to spend a lot of time learning it.\nTo reflect this reality, Pkl has a strong focus on usability.\nFor example, error messages explain causes and possible solutions and object properties maintain definition order to avoid surprises.\nWe hope that this focus on usability will make Pkl accessible to a wide audience of occasional users, while still leaving room for expert users and advanced use cases.\n"
  },
  {
    "path": "docs/modules/introduction/pages/index.adoc",
    "content": "= Introduction\ninclude::ROOT:partial$component-attributes.adoc[]\n\nPkl -- pronounced _Pickle_ -- is a configuration-as-code language with rich validation and tooling.\nIt can be used as a command line tool, software library, or build plugin.\nPkl scales from small to large, simple to complex, ad-hoc to recurring configuration tasks.\n\nWe created Pkl because we believe that configuration is best expressed in a special-purpose configuration language;\na blend between a static configuration format, and a general-purpose programming language.\n\n* xref:use-cases.adoc[Use Cases]\n* xref:concepts.adoc[Concepts]\n* xref:comparison.adoc[Comparison]\n"
  },
  {
    "path": "docs/modules/introduction/pages/use-cases.adoc",
    "content": "= Use Cases\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-kotlin-homepage: https://kotlinlang.org\n:uri-xml-property-lists: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/UnderstandXMLPlist/UnderstandXMLPlist.html\n\nPkl is a good fit for:\n\nGenerating Static Configuration::\nAre you using a tool, service, or application that is configured with JSON, YAML, or any other static configuration format?\n+\nBy generating this configuration with Pkl, you can reduce verbosity and increase maintainability through xref:concepts.adoc#reuse[reuse], xref:concepts.adoc#template[templating], and xref:concepts.adoc#abstraction[abstraction].\nJSON, YAML, and {uri-xml-property-lists}[XML property lists] are supported out of the box; xref:concepts.adoc#rendering[renderers] for other configuration formats can be developed and shared by anyone.\nAutomatic defaults, strong validation, and sensible error messages come in reach with configuration xref:concepts.adoc#schema[schemas].\n+\nGeneration can be triggered manually, by an automation pipeline, or by the target application.\n\nApplication Runtime Configuration::\nAre you the author of a tool, service, or application that consumes configuration?\n+\nBy adopting Pkl as your \"native\" configuration solution (rather than, say, using it to generate JSON files), you benefit from a modern xref:java-binding:pkl-config-java.adoc[configuration library] that is safe, easy, and enjoyable to use.\nAt the same time, anyone configuring your application -- whether that's your users, site reliability engineers (SREs), or yourself -- benefit from a well-defined, well-documented, and scalable configuration language.\n+\nAt the time of writing, Pkl offers configuration libraries for the JVM runtime, Swift, and also for Golang.\n+\nWe maintain the following libraries:\n+\n* xref:java-binding:pkl-config-java.adoc[pkl-config-java] for Java compatible languages\n* xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin] for the {uri-kotlin-homepage}[Kotlin] language.\n* xref:swift:ROOT:index.adoc[pkl-swift] for the Swift language.\n* xref:go:ROOT:index.adoc[pkl-go] for the Go language.\n\nIn the future, we hope to add support for other popular languages and platforms, realizing our vision of a polyglot config solution based on a single config language.\n\n<Your Use Case Here>::\nWe are just getting started. Tell us about _your_ Pkl success story!\n"
  },
  {
    "path": "docs/modules/java-binding/examples/JavaConfigExample.java",
    "content": "import org.pkl.config.java.Config;\nimport org.pkl.config.java.ConfigEvaluator;\nimport org.pkl.config.java.JavaType;\nimport org.pkl.core.ModuleSource;\nimport org.junit.jupiter.api.Test;\n\n@SuppressWarnings({\"unused\", \"NewClassNamingConvention\"})\n// the pkl-jvm-examples repo has a similar example\npublic class JavaConfigExample {\n  @Test\n  public void usage() {\n    // tag::usage[]\n    Config config;\n    try (var evaluator = ConfigEvaluator.preconfigured()) { // <1>\n      config = evaluator.evaluate(\n        ModuleSource.text(\"pigeon { age = 5; diet = new Listing { \\\"Seeds\\\" } }\")); // <2>\n    }\n    var pigeon = config.get(\"pigeon\"); // <3>\n    var age = pigeon.get(\"age\").as(int.class); // <4>\n    var diet = pigeon.get(\"diet\").as(JavaType.listOf(String.class)); // <5>\n    // end::usage[]\n  }\n}\n"
  },
  {
    "path": "docs/modules/java-binding/pages/codegen.adoc",
    "content": "= Java Code Generator\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-codegen-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-codegen-java\n\n:uri-pkl-codegen-java-download: {uri-sonatype-snapshot-download}&a=pkl-cli-codegen-java&e=jar\n\nifdef::is-release-version[]\n:uri-pkl-codegen-java-download: {github-releases}/pkl-codegen-java\nendif::[]\n\nThe Java source code generator takes Pkl class definitions as an input, and generates corresponding Java classes with equally named properties.\n\nThe benefits of code generation are:\n\n* Configuration can be conveniently consumed as statically typed Java objects.\n* The entire configuration tree can be code-completed in Java IDEs.\n* Any drift between Java code and Pkl configuration structure is caught at compile time.\n\nThe generated classes are immutable and have component-wise implementations of `equals()`, `hashCode()`, and `toString()`.\n\n== Installation\n\nThe code generator is offered as Gradle plugin, Java library, and CLI.\n\n=== Gradle Plugin\n\nSee xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin chapter.\n\n[[install-library]]\n=== Java Library\n\nThe `pkl-codegen-java` library is available {uri-pkl-codegen-java-maven-module}[from Maven Central].\nIt requires Java 17 or higher.\n\nifndef::is-release-version[]\nNOTE: Snapshots are published to repository `{uri-snapshot-repo}`.\nendif::[]\n\n==== Gradle\n\nTo use the library in a Gradle project, declare the following dependency:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\ndependencies {\n  implementation(\"org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}\")\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven(url = \"{uri-sonatype}\")\nendif::[]\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\ndependencies {\n  implementation \"org.pkl-lang:pkl-codegen-java:{pkl-artifact-version}\"\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven { url \"{uri-sonatype}\" }\nendif::[]\n}\n----\n====\n\n==== Maven\n\nTo use the library in a Maven project, declare the following dependency:\n\n.pom.xml\n[source,xml,subs=\"+attributes\"]\n----\n<project>\n  <dependency>\n    <groupId>org.pkl-lang</groupId>\n    <artifactId>pkl-codegen-java</artifactId>\n    <version>{pkl-artifact-version}</version>\n  </dependency>\nifndef::is-release-version[]\n  <repositories>\n    <repository>\n      <id>sonatype-s01</id>\n      <name>Sonatype S01</name>\n      <url>{uri-sonatype}</url>\n    </repository>\n  </repositories>\nendif::[]\n</project>\n----\n\n[[install-cli]]\n=== CLI\n\nThe CLI is available as a Java executable.\n\nIt works on multiple platforms, and requires a Java 17 (or higher) runtime on the system path.\n\nTo download:\n\n[tabs]\n====\nmacOS/Linux::\n+\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl-codegen-java '{uri-pkl-codegen-java-download}'\nchmod +x pkl-codegen-java\n./pkl-codegen-java --version\n----\n\nWindows::\n+\n[source,PowerShell]\n[subs=\"+attributes\"]\n----\nInvoke-WebRequest '{uri-pkl-codegen-java-download}' -OutFile pkl-codegen-java.bat\n.\\pkl-codegen-java --version\n----\n====\n\nThis should print something similar to:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\npkl-codegen-java {pkl-version} (macOS 14.2, Java 17.0.10)\n----\n\n[[codegen-java-usage]]\n== Usage\n\nThe code generator is offered as Gradle plugin, Java library, and CLI.\n\n=== Gradle Plugin\n\nSee xref:pkl-gradle:index.adoc#java-code-gen[Java Code Generation] in the Gradle plugin chapter.\n\n=== Java Library\n\nThe Java library offers two APIs: a high-level API that corresponds to the CLI, and a lower-level API that provides additional features and control.\nThe entry points for these APIs are `org.pkl.codegen.java.CliJavaCodeGenerator` and `org.pkl.codegen.java.JavaCodeGenerator`, respectively.\nFor more information, refer to the Javadoc documentation.\n\n=== CLI\n\n*Synopsis:* `pkl-codegen-java [<options>] <modules>`\n\n`<modules>`::\nThe absolute or relative URIs of the modules to generate classes for.\nRelative URIs are resolved against the working directory.\n\n==== Options\n\n.--generate-getters\n[%collapsible]\n====\nDefault: (flag not set) +\nFlag that indicates to generate private final fields and public getter methods instead of public final fields.\n====\n\n.--generate-javadoc\n[%collapsible]\n====\nDefault: (flag not set) +\nFlag that indicates to preserve Pkl doc comments by generating corresponding Javadoc comments.\n====\n\n.--params-annotation\n[%collapsible]\n====\nDefault: `none` if `--generate-spring-boot` is set, `org.pkl.config.java.mapper.Named` otherwise +\nFully qualified name of the annotation type to use for annotating constructor parameters with their name. +\nThe specified annotation type must have a `value` parameter of type `String` or the generated code may not compile.\nIf set to `none`, constructor parameters are not annotated.\nWhether and how constructor parameters should be annotated depends on the library that instantiates the generated classes.\nFor Spring Boot applications, and for users of `pkl-config-java` compiling the generated classes with `-parameters`, no annotation is required.\n====\n\n.--non-null-annotation\n[%collapsible]\n====\nDefault: `org.pkl.config.java.mapper.NonNull` +\nFully qualified name of the annotation type to use for annotating non-null types. +\nThe specified annotation type must be annotated with `@java.lang.annotation.Target(ElementType.TYPE_USE)`\nor the generated code may not compile.\n====\n\nCommon code generator options:\n\ninclude::{partialsdir}/cli-codegen-options.adoc[]\n\nCommon CLI options:\n\ninclude::../../pkl-cli/partials/cli-common-options.adoc[]\n\n[[full-example]]\n== Full Example\n\nFor a ready-to-go example with full source code,\nsee link:{uri-codegen-java-example}[codegen-java] in the _pkl-jvm-examples_ repository.\n"
  },
  {
    "path": "docs/modules/java-binding/pages/index.adoc",
    "content": "= Integration with Java\n\nPkl provides rich integration with Java. Our integration allows you to embed the Pkl runtime into your Java program, and also provides code generation from Pkl source files.\n\n"
  },
  {
    "path": "docs/modules/java-binding/pages/pkl-config-java.adoc",
    "content": "= pkl-config-java Library\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java\n\n:uri-pkl-config-java-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-config-java-all\n:uri-pkl-config-java-main-sources: {uri-github-tree}/pkl-config-java/src/main/java/org/pkl/config/java\n:uri-pkl-config-java-test-sources: {uri-github-tree}/pkl-config-java/src/test/java/org/pkl/config/java\n:uri-pkl-config-java-test-resources: {uri-github-tree}/pkl-config-java/src/test/resources/org/pkl/config/java\n:uri-pkl-config-java-ConfigEvaluator: {uri-pkl-config-java-main-sources}/ConfigEvaluator.java\n:uri-pkl-config-java-Config: {uri-pkl-config-java-main-sources}/Config.java\n:uri-pkl-config-java-ValueMapper: {uri-pkl-config-java-main-sources}/mapper/ValueMapper.java\n:uri-pkl-config-java-Named: {uri-pkl-config-java-main-sources}/mapper/Named.java\n:uri-pkl-config-java-Conversion: {uri-pkl-config-java-main-sources}/mapper/Conversion.java\n:uri-pkl-config-java-Conversions: {uri-pkl-config-java-main-sources}/mapper/Conversions.java\n:uri-pkl-config-java-ConverterFactories: {uri-pkl-config-java-main-sources}/mapper/ConverterFactories.java\n:uri-pkl-config-java-Converter: {uri-pkl-config-java-main-sources}/mapper/Converter.java\n:uri-pkl-config-java-ConverterFactory: {uri-pkl-config-java-main-sources}/mapper/ConverterFactory.java\n:uri-pkl-config-java-PObjectToDataObjectTestJava: {uri-pkl-config-java-test-sources}/mapper/PObjectToDataObjectTest.java\n\nThe _pkl-config-java_ library builds upon xref:pkl-core:index.adoc[pkl-core].\nIt offers a higher-level API specifically designed for consuming application runtime configuration.\n\n== Installation\n\nThe _pkl-config-java_ library is available {uri-pkl-config-java-maven-module}[from Maven Central].\nIt requires Java 17 or higher.\n\n=== Gradle\n\nTo use the library in a Gradle project, declare the following dependency:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\ndependencies {\n  implementation(\"org.pkl-lang:pkl-config-java:{pkl-artifact-version}\")\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven(url = \"{uri-sonatype}\")\nendif::[]\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\ndependencies {\n  implementation \"org.pkl-lang:pkl-config-java:{pkl-artifact-version}\"\n}\n\nifdef::is-release-version[]\nrepositories {\n  mavenCentral()\n}\nendif::[]\nifndef::is-release-version[]\nrepositories {\n  maven { url \"{uri-sonatype}\" }\n}\nendif::[]\n----\n====\n\nUnlike `pkl-config-java`, `pkl-config-java__-all__` is a fat Jar with renamed third-party packages to avoid version conflicts.\n\n=== Maven\n\nTo use the library in a Maven project, declare the following dependency:\n\n.pom.xml\n[source,xml,subs=\"+attributes\"]\n----\n<project>\n  <dependency>\n    <groupId>org.pkl-lang</groupId>\n    <artifactId>pkl-config-java</artifactId>\n    <version>{pkl-artifact-version}</version>\n  </dependency>\nifndef::is-release-version[]\n  <repositories>\n    <repository>\n      <id>sonatype-s01</id>\n      <name>Sonatype S01</name>\n      <url>{uri-sonatype}</url>\n    </repository>\n  </repositories>\nendif::[]\n</project>\n----\n\nUnlike `pkl-config-java`, `pkl-config-java__-all__` is a fat Jar with renamed third-party packages to avoid version conflicts.\n\n== Usage\n\n=== Consuming Configuration\n\nThe {uri-pkl-config-java-ConfigEvaluator}[`ConfigEvaluator`] class loads and evaluates Pkl modules.\nIf evaluation succeeds, a {uri-pkl-config-java-Config}[`Config`] object is returned.\nOtherwise, a {uri-pkl-core-PklException}[`PklException`] with error details is thrown.\n\nThe returned `Config` object represents the root of the Pkl configuration tree.\nIntermediate and leaf nodes are also represented as `Config` objects.\n\n`Config` objects offer methods to\n\n* convert their Pkl value to a Java value of the specified type.\n* navigate to child nodes.\n\nLet's see this in action:\n\n[[config-evaluator-java-example]]\n[source,java,indent=0]\n----\ninclude::{examplesdir}/JavaConfigExample.java[tags=usage]\n----\n<1> Create a preconfigured `ConfigEvaluator`.\nTo create a customized evaluator, start from `ConfigEvaluatorBuilder.preconfigured()` or `ConfigEvaluatorBuilder.unconfigured()`.\nThe evaluator should be closed once it is no longer needed.\nIn this example, this is done with a try-with-resources statement.\nNote that objects returned by the evaluator remain valid after calling `close()`.\n<2> Evaluate the given text.\nOther `evaluate` methods read from files, URLs, and other sources.\nIf evaluation fails, an {uri-pkl-core-PklException}[`PklException`] is thrown.\n<3> Navigate from the config root to its `\"pigeon\"` child.\n<4> Navigate from `\"pigeon\"` to `\"age\"` and get the latter's value as an `int`.\nIf conversion to the requested type fails, a `ConversionException` is thrown.\n<5> Navigate from `\"pigeon\"` to `\"diet\"` and get the latter's value as a `List<String>`.\nNote the use of `JavaType.listOf()` for creating a parameterized type literal.\nSimilar methods exist for sets, maps, and other generic types.\n\nA `ConfigEvaluator` caches module sources and evaluation results.\nTo clear the cache, for example to evaluate the same module again, close the evaluator and create a new one.\n\nFor a ready-to-go example with full source code,\nsee link:{uri-config-java-example}[config-java] in the _pkl-jvm-examples_ repository.\n\n[[object-mapping]]\n=== Object Mapping\n\nWhen a `Config` object needs to convert its Pkl value to a Java value, it delegates the conversion to {uri-pkl-config-java-ValueMapper}[`ValueMapper`].\n`ValueMapper` can convert an entire `PModule` or any part thereof.\n\nA `ValueMapper` instance can be configured with many different Pkl-to-Java value conversions.\n`ValueMapper.preconfigured()` creates an instance configured with conversions from Pkl values to:\n\n* Number types\n* Strings\n* Enums\n* Collections\n* Arrays\n* `java.util.Optional`\n* `java.time.Duration`\n* `java.net.URI/URL`\n* etc.\n\nAdditionally, a preconfigured `ValueMapper` instance can convert Pkl objects to Java objects with equally named properties that are settable through a constructor.\nThis conversion works as follows:\n\n. Find the Java class constructor with the highest number of parameters.\n. Match constructor parameters with Pkl object properties by name.\n+\nUnmatched constructor parameters result in a conversion error.\nUnmatched Pkl object properties are ignored.\n+\n. Convert each Pkl property value to the corresponding constructor parameter's type.\n. Invoke the constructor.\n\nThe Pkl object's runtime type is irrelevant to this conversion.\nHence, typed and dynamic Pkl objects are equally supported.\n\nTo perform this conversion, `ValueMapper` needs a way to obtain the Java constructor's parameter names.\nThey need to be provided in one of the following ways:\n\n* Annotate constructor with `java.beans.ConstructorProperties`.\n* Annotate parameters with {uri-pkl-config-java-Named}[`Named`].\n* Annotate parameters with `javax.inject.Named`.\n* Set the Java compiler flag `-parameters`.\n\nFor a complete object mapping example, see:\n\n* {uri-pkl-config-java-PObjectToDataObjectTestJava}[`PObjectToDataObjectTest.java`]\n\nTIP: Together with xref:java-binding:codegen.adoc[code generation], object mapping provides a complete solution for consuming Pkl configuration as statically typed Java objects.\nJava code never drifts from the configuration structure defined in Pkl, and the entire configuration tree can be code-completed in Java IDEs.\n\n==== Value Conversions\n\nThe Pkl-to-Java value conversions that ship with the library are defined in {uri-pkl-config-java-Conversions}[`Conversions`] (for individual conversions) and {uri-pkl-config-java-ConverterFactories}[`ConverterFactories`] (for families of conversions).\nTo implement and register your own conversions, follow these steps:\n\n. For conversions from a single source type to a single target type, implement a {uri-pkl-config-java-Conversion}[`Conversion`].\n+\nExample: `Conversions.pStringToCharacter` converts a single-character `pkl.base#String` to `java.lang.Character`.\n\n. For conversions from one or multiple source types to one or multiple target types, implement a {uri-pkl-config-java-ConverterFactory}[`ConverterFactory`].\n+\nExample: `ConverterFactories.pCollectionToCollection` converts any `pkl.base#Collection` to any implementation of `java.util.Collection<E>`, for any `E`.\n+\nConverter factories are called once per combination of source type and (possibly parameterized) target type.\nThe returned `Converter`s are cached.\n\n. Create a `ValueMapperBuilder`, add all desired conversions, and build a `ValueMapper`.\n\n. Either use the `ValueMapper` directly, or connect it to a `ConfigEvaluator` through `ConfigEvaluatorBuilder`.\n\n== Further Information\n\nRefer to the Javadoc and sources published with the library, or browse the library's {uri-pkl-config-java-main-sources}[main] and {uri-pkl-config-java-test-sources}[test] sources.\n"
  },
  {
    "path": "docs/modules/java-binding/partials/cli-codegen-options.adoc",
    "content": ".--indent\n[%collapsible]\n====\nDefault: `\"  \"` (two spaces) +\nExample: `\"\\t\"` (one tab) +\nThe characters to use for indenting generated source code.\n====\n\n.-o, --output-dir\n[%collapsible]\n====\nDefault: (not set) +\nExample: `generated/` +\nThe directory where generated source code is placed.\nRelative paths are resolved against the working directory.\n====\n\n.--generate-spring-boot\n[%collapsible]\n====\nDefault: (not set) +\nFlag that indicates to generate config classes for use with Spring Boot.\n====\n\n.--implement-serializable\n[%collapsible]\n====\nDefault: (not set) +\nFlag that indicates to generate classes that implement `java.io.Serializable`.\n====\n\n.--add-generated-annotation\n[%collapsible]\n====\nDefault: (not set) +\nFlag that indicates to add the `org.pkl.config.java.Generated` annotation to generated types.\n====\n\n.--rename\n[%collapsible]\n====\nDefault: (none) +\nExample: `foo.=com.example.foo.` +\nAllows to change default class and package names (derived from Pkl module names) in the generated code.\n\nWhen you need the generated class or package names to be different from the default names derived from the Pkl module names, you can define a rename mapping, where the key is the original Pkl module name prefix, and the value is its replacement.\nWhen you do, the generated code's `package` declarations, class names, as well as file locations, will be modified according to this mapping.\n\nThe prefixes are replaced literally, which means that dots at the end are important.\nIf you want to rename packages only, in most cases, you must ensure that you have an ending dot on both sides of a mapping (except for an empty mapping, if you use it), otherwise you may get unexpected results:\n\n----\n// Assuming the following arguments:\n--rename com.foo.=x  // Dot on the left only\n--rename org.bar=y.  // Dot on the right only\n--rename net.baz=z   // No dots\n\n// The following renames will be made:\n\"com.foo.bar\" -> \"xbar\"       // Target prefix merged into the suffix\n\"org.bar.baz\" -> \"y..baz\"     // Double dot, invalid name\n\"net.baz.qux\" -> \"z.qux\"      // Looks okay, but...\n\"net.bazqux\"  -> \"zqux\"       // ...may cut the name in the middle.\n----\n\nWhen computing the appropriate target name, the longest matching prefix is used:\n\n----\n// Assuming the following arguments:\n--rename com.foo.Main=w.Main\n--rename com.foo.=x.\n--rename com.=y.\n--rename =z.\n\n// The following renames will be made:\ncom.foo.Main -> w.Main\ncom.foo.bar  -> x.bar\ncom.baz.qux  -> y.baz.qux\norg.foo.bar  -> z.org.foo.bar\n----\n\nRepeat this option to define multiple mappings.\nKeys can be arbitrary strings, including an empty string.\nValues must be valid dot-separated fully qualified class name prefixes, possibly terminated by a dot.\n====\n"
  },
  {
    "path": "docs/modules/kotlin-binding/examples/KotlinConfigExample.kt",
    "content": "@file:Suppress(\"UNUSED_VARIABLE\")\n\nimport org.pkl.config.java.ConfigEvaluator\nimport org.pkl.config.kotlin.forKotlin\nimport org.pkl.config.kotlin.to\nimport org.pkl.core.ModuleSource\nimport org.junit.jupiter.api.Test\n\n// the pkl-jvm-examples repo has a similar example\nclass KotlinConfigExample {\n  @Test\n  fun usage() {\n    // tag::usage[]\n    val evaluator = ConfigEvaluator.preconfigured().forKotlin() // <1>\n    val config = evaluator.use { // <2>\n      it.evaluate(ModuleSource.text(\"\"\"pigeon { age = 5; diet = new Listing { \"Seeds\" } }\"\"\"))\n    }\n    val pigeon = config[\"pigeon\"] // <3>\n    val age = pigeon[\"age\"].to<Int>() // <4>\n    val hobbies = pigeon[\"diet\"].to<List<String>>() // <5>\n    // end::usage[]\n  }\n  \n  @Test\n  fun nullable() {\n    // tag::nullable[]\n    val evaluator = ConfigEvaluator.preconfigured().forKotlin()\n    val config = evaluator.use {\n      it.evaluate(ModuleSource.text(\"name = null\")) // <1>\n    }\n    val name = config[\"name\"].to<String?>() // <2>\n    // end::nullable[]\n  }\n}\n"
  },
  {
    "path": "docs/modules/kotlin-binding/pages/codegen.adoc",
    "content": "= Kotlin Code Generator\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-codegen-kotlin-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-codegen-kotlin\n:uri-pkl-codegen-kotlin-download: {uri-sonatype-snapshot-download}&a=pkl-cli-codegen-kotlin&e=jar\n\nifdef::is-release-version[]\n:uri-pkl-codegen-kotlin-download: {github-releases}/pkl-codegen-kotlin\nendif::[]\n\nThe Kotlin source code generator reads Pkl classes and generates corresponding Kotlin classes with equally named properties.\n\nTogether with xref:java-binding:pkl-config-java.adoc#object-mapping[Object Mapping], code generation provides a complete solution for consuming Pkl configuration as statically typed Kotlin objects.\nKotlin code never drifts from the configuration structure defined in Pkl, and the entire configuration tree can be code-completed in Kotlin IDEs.\n\n== Installation\n\nThe code generator is offered as Gradle plugin, Java library, and CLI.\n\n=== Gradle Plugin\n\nSee xref:pkl-gradle:index.adoc#installation[Installation] in the Gradle plugin chapter.\n\n[[install-library]]\n=== Java Library\n\nThe `pkl-codegen-kotlin` library is available {uri-pkl-codegen-kotlin-maven-module}[from Maven Central].\nIt requires Java 17 or higher and Kotlin 1.3 or higher.\n\n==== Gradle\n\nTo use the library in a Gradle project, declare the following dependency:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\ndependencies {\n  implementation(\"org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}\")\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven(url = \"{uri-sonatype}\")\nendif::[]\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\ndependencies {\n  implementation \"org.pkl-lang:pkl-codegen-kotlin:{pkl-artifact-version}\"\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven { url \"{uri-sonatype}\" }\nendif::[]\n}\n----\n====\n\n==== Maven\n\nTo use the library in a Maven project, declare the following dependency:\n\n.pom.xml\n[source,xml,subs=\"+attributes\"]\n----\n<dependency>\n  <groupId>org.pkl-lang</groupId>\n  <artifactId>pkl-codegen-kotlin</artifactId>\n  <version>{pkl-artifact-version}</version>\n</dependency>\n----\n\n[[install-cli]]\n=== CLI\n\nThe CLI is available as a Java executable.\n\nIt works on multiple platforms, and requires a Java 17 (or higher) runtime on the system path.\n\nTo download:\n\n[tabs]\n====\nmacOS/Linux::\n+\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl-codegen-kotlin '{uri-pkl-codegen-kotlin-download}'\nchmod +x pkl-codegen-kotlin\n./pkl-codegen-kotlin --version\n----\n\nWindows::\n+\n[source,PowerShell]\n[subs=\"+attributes\"]\n----\nInvoke-WebRequest '{uri-pkl-codegen-kotlin-download}' -OutFile pkl-codegen-kotlin.bat\n.\\pkl-codegen-kotlin --version\n----\n====\n\nThis should print something similar to:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\npkl-codegen-kotlin {pkl-version} (macOS 14.2, Java 17.0.10)\n----\n\n[[usage]]\n== Usage\n\nThe code generator is offered as Gradle plugin, Java library, and CLI.\n\n=== Gradle Plugin\n\nSee xref:pkl-gradle:index.adoc#kotlin-code-gen[Kotlin Code Generation] in the Gradle plugin chapter.\n\n=== Java Library\n\nThe library offers two APIs: a high-level API that corresponds to the CLI, and a lower-level API that provides additional features and control.\nThe entry points for these APIs are `org.pkl.codegen.kotlin.CliKotlinCodeGenerator` and `org.pkl.codegen.kotlin.KotlinCodeGenerator`, respectively.\nFor more information, refer to the KDoc documentation.\n\n=== CLI\n\n*Synopsis:* `pkl-codegen-kotlin [<options>] <modules>`\n\n`<modules>`::\nThe absolute or relative URIs of the modules to generate classes for.\nRelative URIs are resolved against the working directory.\n\n==== Options\n\n.--generate-kdoc\n[%collapsible]\n====\nDefault: (flag not set) +\nFlag that indicates to preserve Pkl doc comments by generating corresponding KDoc comments.\n====\n\nCommon code generator options:\n\ninclude::../../java-binding/partials/cli-codegen-options.adoc[]\n\nCommon CLI options:\n\ninclude::../../pkl-cli/partials/cli-common-options.adoc[]\n\n[[full-example]]\n== Full Example\n\nFor a ready-to-go example with full source code,\nsee link:{uri-codegen-kotlin-example}[codegen-kotlin] in the _pkl-jvm-examples_ repository.\n"
  },
  {
    "path": "docs/modules/kotlin-binding/pages/index.adoc",
    "content": "= Integration with Kotlin\n\nPkl provides rich integration with Kotlin. Our integration allows you to embed the Pkl runtime into your Kotlin application, and also provides code generation for from Pkl source code.\n"
  },
  {
    "path": "docs/modules/kotlin-binding/pages/pkl-config-kotlin.adoc",
    "content": "= pkl-config-kotlin Library\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-config-kotlin-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-config-kotlin\n:uri-pkl-config-kotlin-main-sources: {uri-github-tree}/pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin\n:uri-pkl-config-kotlin-test-sources: {uri-github-tree}/pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin\n:uri-pkl-config-kotlin-ConverterFactories: {uri-pkl-config-kotlin-main-sources}/ConverterFactories.kt\n:uri-pkl-config-kotlin-ConfigExtensions: {uri-pkl-config-kotlin-main-sources}/ConfigExtensions.kt\n\nThe _pkl-config-kotlin_ library extends xref:java-binding:pkl-config-java.adoc[pkl-config-java] with Kotlin specific extension methods and object converters.\nWe recommend that Kotlin projects depend on this library instead of _pkl-config-java_.\n\n== Installation\n\nThe _pkl-config-kotlin_ library is available {uri-pkl-config-kotlin-maven-module}[from Maven Central].\nIt requires Java 17 or higher and Kotlin 1.5 or higher.\n\n=== Gradle\n\nTo use the library in a Gradle project, declare the following dependency:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\ndependencies {\n  implementation(\"org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}\")\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven(url = \"{uri-sonatype}\")\nendif::[]\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\ndependencies {\n  implementation \"org.pkl-lang:pkl-config-kotlin:{pkl-artifact-version}\"\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven { url \"{uri-sonatype}\" }\nendif::[]\n}\n----\n====\n\n=== Maven\n\nTo use the library in a Maven project, declare the following dependency:\n\n.pom.xml\n[source,xml,subs=\"+attributes\"]\n----\n<project>\n  <dependency>\n    <groupId>org.pkl-lang</groupId>\n    <artifactId>pkl-config-kotlin</artifactId>\n    <version>{pkl-artifact-version}</version>\n  </dependency>\nifndef::is-release-version[]\n  <repositories>\n    <repository>\n      <id>sonatype-s01</id>\n      <name>Sonatype S01</name>\n      <url>{uri-sonatype}</url>\n    </repository>\n  </repositories>\nendif::[]\n</project>\n----\n\n== Usage\n\nBelow is the Kotlin version of the Java xref:java-binding:pkl-config-java.adoc#config-evaluator-java-example[ConfigEvaluator] example.\nDifferences to the Java version are called out.\n\n[source,kotlin,indent=0]\n----\ninclude::{examplesdir}/KotlinConfigExample.kt[tags=usage]\n----\n<1> Use the `forKotlin()` method to preconfigure the builder with Kotlin specific conversions.\nIn particular, `forKotlin()` eliminates the need to annotate constructor parameters of Kotlin classes and Kotlin data classes with `@Named`.\n<2> The evaluator should be closed once it is no longer needed.\nHere this is done with a Kotlin `use {}` expression.\nAny data returned by the evaluator before calling `close()` remains valid.\n<3> Navigate to the `\"pigeon\"` child.\nThe subscript notation is shorthand for `config.get(\"pigeon\")`.\n<4> Convert `\"age\"` to `Int` with the `Config.to()` extension method.\nThe target type is provided as a type argument.\nAlways use `Config.to()` instead of `Config.as()` in Kotlin.\n<5> `Config.to()` makes conversions to parameterized types straightforward:\n`to<List<String>>()` instead of `as(JavaType.listOf(String::class.java))`.\n\nFor properties that are allowed to be `null`, convert to a nullable type:\n\n[source,kotlin,indent=0]\n----\ninclude::{examplesdir}/KotlinConfigExample.kt[tags=nullable]\n----\n<1> To indicate that `null` is an allowed value, convert to the nullable type `String?`.\nConverting to `String` would result in a `ConversionException`.\n\nFor a ready-to-go example with full source code,\nsee link:{uri-config-kotlin-example}[config-kotlin] in the _pkl-jvm-examples_ repository.\n\n== Further Information\n\nRefer to the Javadoc and sources published with the library, or browse the library's {uri-pkl-config-kotlin-main-sources}[main] and {uri-pkl-config-kotlin-test-sources}[test] sources.\n"
  },
  {
    "path": "docs/modules/language-reference/pages/index.adoc",
    "content": "= Language Reference\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-common-mark: https://commonmark.org/\n:uri-newspeak: https://newspeaklanguage.org\n:uri-prototypical-inheritance: https://en.wikipedia.org/wiki/Prototype-based_programming\n:uri-double-precision: https://en.wikipedia.org/wiki/Double-precision_floating-point_format\n:uri-progressive-disclosure: https://en.wikipedia.org/wiki/Progressive_disclosure\n:uri-javadoc-Pattern: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html\n:uri-github-PklLexer: {uri-github-tree}/pkl-core/src/main/java/org/pkl/core/parser/Lexer.java\n:uri-pkl-core-ModuleSchema: {uri-pkl-core-main-sources}/ModuleSchema.java\n:uri-pkl-core-SecurityManager: {uri-pkl-core-main-sources}/SecurityManager.java\n:uri-pkl-core-ResourceReader: {uri-pkl-core-main-sources}/resource/ResourceReader.java\n:uri-pkl-core-ModuleKey: {uri-pkl-core-main-sources}/module/ModuleKey.java\n:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java\n:uri-value-converters: {uri-pkl-stdlib-docs}/base/PcfRenderer#converters\n// TODO: double check this\n:uri-pkl-go-resource-reader-docs: https://github.com/apple/pkl-go/blob/main/pkl/reader.go\n:uri-pkl-swift-resource-reader-docs: https://github.com/apple/pkl-swift/blob/main/Sources/PklSwift/Reader.swift\n:uri-glob-7: https://man7.org/linux/man-pages/man7/glob.7.html\n:uri-unicode-identifier: https://unicode.org/reports/tr31/#R1-1\n:uri-semver: https://semver.org\n:uri-mvs-build-list: https://research.swtch.com/vgo-mvs#algorithm_1\n\nThe language reference provides a comprehensive description of every Pkl language feature.\n\n<<comments,Comments>> +\n<<numbers,Numbers>> +\n<<booleans,Booleans>> +\n<<strings,Strings>> +\n<<durations,Durations>> +\n<<data-sizes,Data Sizes>> +\n<<objects,Objects>> +\n<<listings,Listings>> +\n<<mappings,Mappings>> +\n<<classes,Classes>> +\n<<methods,Methods>> +\n<<modules,Modules>> +\n<<null-values,Null Values>> +\n<<if-expressions,If Expressions>> +\n<<resources,Resources>> +\n<<errors,Errors>> +\n<<debugging,Debugging>> +\n<<advanced-topics,Advanced Topics>>\n\nFor a hands-on introduction, see xref:language-tutorial:index.adoc[Tutorial].\nFor ready-to-go examples with full source code, see xref:ROOT:examples.adoc[].\nFor API documentation, see xref:ROOT:standard-library.adoc[Standard Library].\n\n[[comments]]\n== Comments\n\nPkl has three forms of comments:\n\nLine comment::\nA code comment that starts with a double-slash (`//`) and runs until the end of the line.\n+\n[source%parsed,{pkl}]\n----\n// Single-line comment\n----\n\nBlock comment::\nA nestable multiline comment, which is typically used to comment out code.\nStarts with `+/*+` and ends with `+*/+`.\n+\n[source%parsed,{pkl}]\n----\n/*\n  Multiline\n  comment\n*/\n----\n\nDoc comment::\nA user-facing comment attached to a program member.\nIt starts with a triple-slash (`///`) and runs until the end of the line.\nDoc comments on consecutive lines are merged.\n+\n[source%parsed,{pkl}]\n----\n/// A *bird* superstar.\n/// Unfortunately, extinct.\ndodo: Bird\n----\n\nDoc comments are processed by xref:pkl-doc:index.adoc[Pkldoc], Pkl's documentation generator.\nFor details on their syntax, see <<doc-comments,Doc Comments>>.\n\n[[numbers]]\n== Numbers\n\nPkl has two numeric types, link:{uri-stdlib-Int}[Int] and link:{uri-stdlib-Float}[Float].\nTheir common supertype is link:{uri-stdlib-Number}[Number].\n\n=== Integers\n\nA value of type link:{uri-stdlib-Int}[Int] is a 64-bit signed integer.\n\nInteger literals can be written in decimal, hexadecimal, binary, or octal notation:\n\n[source%tested,{pkl}]\n----\nnum1 = 123\nnum2 = 0x012AFF // <1>\nnum3 = 0b00010111 // <2>\nnum4 = 0o755 // <3>\n----\n<1> decimal: 76543\n<2> decimal: 23\n<3> decimal: 493\n\nIntegers can optionally include an underscore as a separator to improve readability.\nAn underscore does not affect the integer's value.\n\n[source%tested,{pkl}]\n----\nnum1 = 1_000_000 // <1>\nnum2 = 0x0134_64DE // <2>\nnum3 = 0b0001_0111 // <3>\nnum4 = 0o0134_6475 // <4>\n----\n<1> Equivalent to `1000000`\n<2> Equivalent to `0x013464DE`\n<3> Equivalent to `0b00010111`\n<4> Equivalent to `0o01346475`\n\nNegative integer literals start with a minus sign, as in `-123`.\n\nIntegers support the standard comparison operators:\n\n[source%tested,{pkl}]\n----\ncomparison1 = 5 == 2\ncomparison2 = 5 < 2\ncomparison3 = 5 > 2\ncomparison4 = 5 <= 2\ncomparison5 = 5 >= 2\n----\n\nIntegers support the following arithmetic operators:\n\n[source%tested,{pkl}]\n----\nnum1 = 5 + 2   // <1>\nnum2 = 5 - 2   // <2>\nnum3 = 5 * 2   // <3>\nnum4 = 5 / 2   // <4>\nnum5 = 5 ~/ 2  // <5>\nnum6 = 5 % 2   // <6>\nnum7 = 5 ** 2  // <7>\n----\n<1> addition (result: `7`)\n<2> subtraction (result: `3`)\n<3> multiplication (result: `10`)\n<4> division (result: `2.5`, always `Float`)\n<5> integer division (result: `2`, always `Int`)\n<6> remainder (result: `1`)\n<7> exponentiation (result: `25`)\n\nArithmetic overflows are caught and result in an error.\n\nTo restrict an integer's range, use one of the predefined <<predefined-type-aliases,type aliases>>\nor an link:{uri-stdlib-isBetween}[isBetween] <<type-constraints,type constraint>>:\n\n[source,{pkl}]\n----\nclientPort: UInt16\nserverPort: Int(isBetween(0, 1023))\n----\n\n=== Floats\n\nA value of type link:{uri-stdlib-Float}[Float] is a 64-bit link:{uri-double-precision}[double-precision] floating point number.\n\nFloat literals use decimal notation.\nThey consist of an integer part, decimal point, fractional part, and exponent part.\nThe integer and exponent parts are optional.\n\n[source%tested,{pkl}]\n----\nnum1 = .23\nnum2 = 1.23\nnum3 = 1.23e2 // <1>\nnum4 = 1.23e-2 // <2>\n----\n<1> result: 1.23 * 10^2^\n<2> result: 1.23 * 10^-2^\n\nNegative float literals start with a minus sign, as in `-1.23`.\n\nThe special float values _not a number_, _positive infinity_, and _negative infinity_ are written as:\n\n[source%tested,{pkl}]\n----\nnotANumber = NaN\npositiveInfinity = Infinity\nnegativeInfinity = -Infinity\n----\n\nThe link:{uri-stdlib-NaN}[NaN] and link:{uri-stdlib-Infinity}[Infinity] properties are defined in the standard library.\n\nFloats support the same comparison and arithmetic operators as integers.\nFloat literals with a fractional part of zero can be safely replaced with integer literals.\nFor example, it is safe to write `1.3 * 42` instead of `1.3 * 42.0`.\n\nFloats can also include the same underscore separator as integers. For example, `1_000.4_400` is a float whose value is equivalent to `1000.4400`.\n\nTIP: As integers are more convenient to use than floats with a fractional part of zero, we recommend requiring `x: Number` instead of `x: Float` in type annotations.\n\nTo restrict a float to a finite value, use the link:{uri-stdlib-isFinite}[isFinite] <<type-constraints,type constraint>>:\n\n[source,{pkl}]\n----\nx: Float(isFinite)\n----\n\nTo restrict a float's range, use the link:{uri-stdlib-isBetween}[isBetween] type constraint:\n\n[source,{pkl}]\n----\nx: Float(isBetween(0, 10e6))\n----\n\n[[booleans]]\n== Booleans\n\nA value of type link:{uri-stdlib-Boolean}[Boolean] is either `true` or `false`.\n\nApart from the standard logical operators, `Boolean` has\nlink:{uri-stdlib-xor}[xor] and link:{uri-stdlib-implies}[implies] methods.\n\n[source%tested,{pkl}]\n----\nres1 = true && false // <1>\nres2 = true || false // <2>\nres3 = !false // <3>\nres4 = true.xor(false) // <4>\nres5 = true.implies(false) // <5>\n----\n<1> logical conjunction (result: `false`)\n<2> logical disjunction (result: `true`)\n<3> logical negation (result: `true`)\n<4> exclusive disjunction (result: `true`)\n<5> logical implication (result: `false`)\n\n[[strings]]\n== Strings\n\nA value of type link:{uri-stdlib-String}[String] is a sequence of Unicode code points.\n\nString literals are enclosed in double quotes:\n\n[source%tested,{pkl-expr}]\n----\n\"Hello, World!\"\n----\n\nTIP: Except for a few minor differences footnote:[Pkl's string literals have fewer character escape sequences,\nhave stricter rules for line indentation in multiline strings, and do not have a line continuation character.],\nString literals have the same syntax and semantics as in Swift 5. Learn one of them, know both of them!\n\nInside a string literal, the following character escape sequences have special meaning:\n\n* `\\t` - tab\n* `\\n` - line feed\n* `\\r` - carriage return\n* `\\\"` - verbatim quote\n* `\\\\` - verbatim backslash\n\nUnicode escape sequences have the form `\\u{<codePoint>}`, where `<codePoint>` is a hexadecimal number between 0 and 10FFFF:\n\n[source%tested,{pkl-expr}]\n----\n\"\\u{26} \\u{E9} \\u{1F600}\" // <1>\n----\n<1> result: `\"& é 😀\"`\n\nTo concatenate strings, use the `+` (plus) operator, as in `\"abc\" + \"def\" + \"ghi\"`.\n\n=== String Interpolation\n\nTo embed the result of expression `<expr>` in a string, use `\\(<expr>)`:\n\n[source%tested,{pkl}]\n----\nname = \"Dodo\"\ngreeting = \"Hi, \\(name)!\" // <1>\n----\n<1> result: `\"Hi, Dodo!\"`\n\nBefore a result is inserted, it is converted to a string:\n\n[source%tested,{pkl}]\n----\nx = 42\nstr = \"\\(x + 2) plus \\(x * 2) is \\(0x80)\" // <1>\n----\n<1> result: `\"44 plus 84 is 128\"`\n\n=== Multiline Strings\n\nTo write a string that spans multiple lines, use a multiline string literal:\n\n[source%tested,{pkl-expr}]\n----\n\"\"\"\nAlthough the Dodo is extinct,\nthe species will be remembered.\n\"\"\"\n----\n\nMultiline string literals are delimited by three double quotes (`\"\"\"`).\nString content and closing delimiter must each start on a new line.\n\nThe content of a multiline string starts on the first line after the opening quotes and ends on the last line before the closing quotes.\nLine breaks are included in the string and normalized to `\\n`.\n\nThe previous multiline string is equivalent to this single-line string.\nNotice that there is no leading or trailing whitespace.\n\n[source%tested,{pkl-expr}]\n----\n\"Although the Dodo is extinct,\\nthe species will be remembered.\"\n----\n\nString interpolation, character escape sequences, and Unicode escape sequences work the same as for single-line strings:\n\n[source%tested,{pkl}]\n----\nbird = \"Dodo\"\nmessage = \"\"\"\nAlthough the \\(bird) is extinct,\nthe species will be remembered.\n\"\"\"\n----\n\nEach content line must begin with the same whitespace characters as the line containing the closing delimiter,\nwhich is not included in the string. Any further leading whitespace characters are preserved.\nIn other words, line indentation is controlled by indenting lines relative to the closing delimiter.\n\nIn the following string, lines have no leading whitespace:\n\n[source%tested,{pkl}]\n----\nstr = \"\"\"\n  Although the Dodo\n  is extinct,\n  the species\n  will be remembered.\n  \"\"\"\n----\n\nIn the following string, lines are indented between three and five spaces:\n\n[source%tested,{pkl}]\n----\nstr = \"\"\"\n     Although the Dodo\n       is extinct,\n     the species\n       will be remembered.\n  \"\"\"\n----\n\n[[custom-string-delimiters]]\n=== Custom String Delimiters\n\nSome strings contain many verbatim backslash (`\\`) or quote (`\"`) characters.\nA good example is regular expressions, which make frequent use of backslash characters for escaping.\nIn such cases, using the escape sequences `\\\\` and `\\\"` quickly becomes tedious and hampers readability.\n\nInstead, leading/closing string delimiters can be customized to start/end with a pound sign (`\\#`).\nThis also affects the escape character, which changes from `\\` to `\\#`.\n\nAll backslash and quote characters in the following string are interpreted verbatim:\n\n[source%tested,{pkl-expr}]\n----\n#\" \\\\\\\\\\ \"\"\"\"\" \"#\n----\n\nEscape sequences and string interpolation still work, and now start with `\\#`:\n\n[source%tested,{pkl}]\n----\nbird = \"Dodo\"\nstr = #\" \\\\\\\\\\ \\#n \\#u{12AF} \\#(bird) \"\"\"\"\" \"#\n----\n\nMore generally, string delimiters and escape characters can be customized to contain _n_ pound signs each, for n >= 1.\n\nIn the following string, _n_ is 2. As a result, the string content is interpreted verbatim:\n\n[source%tested,{pkl-expr}]\n----\n##\" \\\\\\\\\\ \\#\\#\\# \"\"\"\"\" \"##\n----\n\n=== String API\n\nThe `String` class offers a link:{uri-stdlib-String}[rich API].\nHere are just a few examples:\n\n[source%tested,{pkl}]\n----\nstrLength = \"dodo\".length // <1>\nreversedStr = \"dodo\".reverse() // <2>\nhasAx = \"dodo\".contains(\"alive\") // <3>\ntrimmed = \"  dodo  \".trim() // <4>\n----\n<1> result: `4`\n<2> result: `\"odod\"`\n<3> result: `false`\n<4> result: `\"dodo\"`\n\n[[durations]]\n== Durations\n\nA value of type link:{uri-stdlib-Duration}[Duration] has a _value_ component of type `Number` and a _unit_ component of type `String`.\nThe unit component is constrained to the units defined in link:{uri-stdlib-DurationUnit}[DurationUnit].\n\nDurations are constructed with the following `Number` properties:\n\n[source%tested,{pkl}]\n----\nduration1 = 5.ns  // nanoseconds (smallest unit)\nduration2 = 5.us  // microseconds\nduration3 = 5.ms  // milliseconds\nduration4 = 5.s   // seconds\nduration5 = 5.min // minutes\nduration6 = 5.h   // hours\nduration7 = 3.d   // days (largest unit)\n----\n\nA duration can be negative, as in `-5.min`.\nIt can have a floating point value, as in `5.13.min`.\nThe link:{uri-stdlib-Duration-value}[value] and link:{uri-stdlib-Duration-unit}[unit] properties provide access to the duration's components.\n\nDurations support the standard comparison operators:\n\n[source%tested,{pkl}]\n----\ncomparison1 = 5.min == 3.s\ncomparison2 = 5.min < 3.s\ncomparison3 = 5.min > 3.s\ncomparison4 = 5.min <= 3.s\ncomparison5 = 5.min >= 3.s\n----\n\nDurations support the same arithmetic operators as numbers:\n\n[source%tested,{pkl}]\n----\nres1 = 5.min + 3.s    // <1>\nres2 = 5.min - 3.s    // <2>\nres3 = 5.min * 3      // <3>\nres4 = 5.min / 3      // <4>\nres5 = 5.min / 3.min  // <5>\nres6 = 5.min ~/ 3     // <6>\nres7 = 5.min ~/ 3.min // <7>\nres8 = 5.min % 3      // <8>\nres9 = 5.min ** 3     // <9>\n----\n<1> result: `5.05.min`\n<2> result: `4.95.min`\n<3> result: `15.min`\n<4> result: `1.6666666666666667.min`\n<5> result: `1.6666666666666667`\n<6> result: `1.min`\n<7> result: `1`\n<8> result: `2.min`\n<9> result: `125.min`\n\nThe value component can be an expression:\n\n[source%tested,{pkl}]\n----\nx = 5\nxMinutes = x.min // <1>\ny = 3\nxySeconds = (x + y).s // <2>\n----\n<1> result: `5.min`\n<2> result: `8.s`\n\n[[data-sizes]]\n== Data Sizes\n\nA value of type link:{uri-stdlib-DataSize}[DataSize] has a _value_ component of type `Number` and a _unit_ component of type `String`.\nThe unit component is constrained to the units defined in link:{uri-stdlib-DataSizeUnit}[DataSizeUnit].\n\nData sizes with decimal units (factor 1000) are constructed with the following `Number` properties:\n\n[source%tested,{pkl}]\n----\ndatasize1 = 5.b  // bytes (smallest unit)\ndatasize2 = 5.kb // kilobytes\ndatasize3 = 5.mb // megabytes\ndatasize4 = 5.gb // gigabytes\ndatasize5 = 5.tb // terabytes\ndatasize6 = 5.pb // petabytes (largest unit)\n----\n\nData sizes with binary units (factor 1024) are constructed with the following `Number` properties:\n\n[source%tested,{pkl}]\n----\ndatasize1 = 5.b   // bytes (smallest unit)\ndatasize2 = 5.kib // kibibytes\ndatasize3 = 5.mib // mebibytes\ndatasize4 = 5.gib // gibibytes\ndatasize5 = 5.tib // tebibytes\ndatasize6 = 5.pib // pebibytes (largest unit)\n----\n\nA data size can be negative, as in `-5.mb`.\nIt can have a floating point value, as in `5.13.mb`.\nThe link:{uri-stdlib-DataSize-value}[value] and link:{uri-stdlib-DataSize-unit}[unit] properties provide access to the data size's components.\n\nData sizes support the standard comparison operators:\n\n[source%tested,{pkl}]\n----\ncomparison1 = 5.mb == 3.kib\ncomparison2 = 5.mb < 3.kib\ncomparison3 = 5.mb > 3.kib\ncomparison4 = 5.mb <= 3.kib\ncomparison5 = 5.mb >= 3.kib\n----\n\nData sizes support the same arithmetic operators as numbers:\n\n[source%tested,{pkl}]\n----\nres1 = 5.mb + 3.kib // <1>\nres2 = 5.mb - 3.kib // <2>\nres3 = 5.mb * 3     // <3>\nres4 = 5.mb / 3     // <4>\nres5 = 5.mb / 3.mb  // <5>\nres6 = 5.mb ~/ 3    // <6>\nres7 = 5.mb ~/ 3.mb // <7>\nres8 = 5.mb % 3     // <8>\nres9 = 5.mb ** 3    // <9>\n----\n<1> result: `5.003072.mb`\n<2> result: `4.996928.mb`\n<3> result: `15.mb`\n<4> result: `1.6666666666666667.mb`\n<5> result: `1.6666666666666667`\n<6> result: `1.mb`\n<7> result: `1`\n<8> result: `2.mb`\n<9> result: `125.mb`\n\nThe value component can be an expression:\n\n[source%tested,{pkl}]\n----\nx = 5\nxMegabytes = x.mb // <1>\ny = 3\nxyKibibytes = (x + y).kib // <2>\n----\n<1> result: `5.mb`\n<2> result: `8.kib`\n\n[[objects]]\n== Objects\n\nAn object is an ordered collection of _values_ indexed by _name_.\n\nAn object's key-value pairs are called its _properties_.\nProperty values are lazily evaluated on the first read.\n\nBecause Pkl's objects differ in important ways from objects in general-purpose programming languages,\nand because they are the backbone of most data models, understanding objects is the key to understanding Pkl.\n\n[[defining-objects]]\n=== Defining Objects\n\nLet's define an object with properties `name` and `extinct`:\n\n[source%tested,{pkl}]\n----\ndodo { // <1>\n  name = \"Dodo\" // <2>\n  extinct = true // <3>\n} // <4>\n----\n<1> Defines a module property named `dodo`.\n    The open curly brace (`{`) indicates that the value of this property is an object.\n<2> Defines an object property named `name` with string value `\"Dodo\"`.\n<3> Defines an object property named `extinct` with boolean value `true`.\n<4> The closing curly brace indicates the end of the object definition.\n\nTo access an object property by name, use dot (`.`) notation:\n\n[source%tested,{pkl}]\n----\ndodoName = dodo.name\ndodoIsExtinct = dodo.extinct\n----\n\nObjects can be nested:\n\n[source%tested,{pkl}]\n----\ndodo {\n  name = \"Dodo\"\n  taxonomy { // <1>\n    `class` = \"Aves\" // <2>\n  }\n}\n----\n<1> Defines an object property named `taxonomy`.\n    The open curly brace indicates that its value is another object.\n<2> The word `class` is a keyword of Pkl, and needs to be wrapped in backticks (```) to be used as a property.\n\nAs you probably guessed, the nested property `class` can be accessed with `dodo.taxonomy.class`.\n\nLike all values, objects are _immutable_, which is just a fancy (and short!) way to say that their properties never change.\nSo what happens when Dodo moves to a different street? Do we have to construct a new object from scratch?\n\n[[amending-objects]]\n=== Amending Objects\n\nFortunately, we don't have to.\nAn object can be _amended_ to form a new object that only differs in selected properties.\nHere is how this looks:\n\n[source%parsed,{pkl}]\n----\ntortoise = (dodo) { // <1>\n  name = \"Galápagos tortoise\"\n  taxonomy { // <2>\n    `class` = \"Reptilia\" // <3>\n  }\n}\n----\n<1> Defines a module property named `tortoise`.\n    Its value is an object that _amends_ `dodo`.\n    Note that the amended object must be enclosed in parentheses.\n<2> Object property `tortoise.taxonomy` _amends_ `dodo.taxonomy`.\n<3> Object property `tortoise.taxonomy.class` _overrides_ `dodo.taxonomy.class`.\n\nAs you can see, it is easy to construct a new object that overrides selected properties of an existing object,\neven if, as in our example, the overridden property is nested inside another object.\n\nNOTE: If this way of constructing new objects from existing objects reminds you of prototypical inheritance, you are spot-on:\nPkl objects use prototypical inheritance as known from languages such as JavaScript.\nBut unlike in JavaScript, their prototype chain cannot be directly accessed or even modified.\nAnother difference is that in Pkl, object properties are late-bound. Read on to see what this means.\n\n[[amends-declaration]]\n[NOTE]\n.Amends declaration vs. amends expression\n====\n\nThe <<defining-objects,defining objects>> and <<amending-objects,amending objects>> sections cover two notations that are both a form of amending; called an _amends declaration_ and an _amends expression_, respectively.\n\n[source%tested,{pkl}]\n----\npigeon { // <1>\n  name = \"Turtle dove\"\n  extinct = false\n}\n\nparrot = (pigeon) { // <2>\n  name = \"Parrot\"\n}\n----\n<1> Amends declaration.\n<2> Amends expression.\n\nAn amends declaration amends a property of the same name if the property exists within a parent module.\nOtherwise, an amends declaration implicitly amends {uri-stdlib-Dynamic}[Dynamic].\n\nAnother way to think about an amends declaration is that it is shorthand for assignment.\nIn practical terms, `pigeon {}` is the same as `pigeon = (super.pigeon) {}`.\n\nAmending object bodies can be chained for both an amends declaration and an amends expression.\n\n[source%tested,{pkl}]\n----\npigeon {\n  name = \"Common wood pigeon\"\n} {\n  extinct = false\n} // <1>\n\ndodo = (pigeon) {\n  name = \"Dodo\"\n} {\n  extinct = true\n} // <2>\n----\n<1> Chained amends declaration.\n<2> Chained amends expression (`(pigeon) { ... } { ... }` is the amends expression).\n====\n\n[[late-binding]]\n=== Late Binding\n\nLet's move on to Pkl's secret sauce:\nthe ability to define an object property's value in terms of another property's value, and the resulting _late binding_ effect.\nHere is an example:\n\n[source%tested,{pkl}]\n----\npenguin {\n  eggIncubation = 40.d \n  adultWeightInGrams = eggIncubation.value * 100 // <1>\n}\nadultWeightInGrams = penguin.adultWeightInGrams\n----\n<1> result: `4000`\n\nWe have defined a hypothetical `penguin` object whose `adultWeightInGrams` property is defined in terms of the `eggIncubation` duration.\nCan you guess what happens when `penguin` is amended and its `eggIncubation` overridden?\n\n[source%tested,{pkl}]\n----\nmadeUpBird = (penguin) {\n  eggIncubation = 11.d\n}\nadultWeightInGrams = madeUpBird.adultWeightInGrams // <1>\n----\n<1> result: `1100`\n\nAs you can see, ``madeUpBird``'s `adultWeightInGrams` changed along with its `eggIncubation`.\nThis is what we mean when we say that object properties are _late-bound_.\n\n[NOTE]\n.Spreadsheet Programming\n====\nA good analogy is that object properties behave like spreadsheet cells.\nWhen they are linked, changes to \"downstream\" properties automatically propagate to \"upstream\" properties.\nThe main difference is that editing a spreadsheet cell changes the state of the spreadsheet,\nwhereas \"editing\" a property results in a new object, leaving the original object untouched.\nIt is as if you made a copy of the entire spreadsheet whenever you edited a cell!\n====\n\nLate binding of properties is an incredibly useful feature for a configuration language.\nIt is used extensively in Pkl code (especially in templates) and is the key to understanding how Pkl works.\n\n=== Transforming Objects\n\nSay we have the following object:\n\n[source%tested,{pkl}]\n----\ndodo {\n  name = \"Dodo\"\n  extinct = true\n}\n----\n\nHow can property `name` be removed?\n\nThe recipe for transforming an object is:\n\n. Convert the object to a map.\n. Transform the map using ``Map``'s link:{uri-stdlib-Map}[rich API].\n. If necessary, convert the map back to an object.\n\nEquipped with this knowledge, let's try to accomplish our objective:\n\n[source%tested,{pkl-expr}]\n----\ndodo\n  .toMap()\n  .remove(\"name\")\n  .toDynamic()\n----\n\nThe resulting dynamic object is equivalent to `dodo`, except that it no longer has a `name` property.\n\n[IMPORTANT]\n.Lazy vs. Eager Data Types\n====\nConverting an object to a map is a transition from a _lazy_ to an _eager_ data type.\nAll of the object's properties are evaluated and all references between them are resolved.\n\nIf the map is later converted back to an object, subsequent changes to the object's properties no longer propagate to (previously) dependent properties.\nTo make these boundaries clear, transitioning between _lazy_ and _eager_ data types always requires an explicit method call, such as `toMap()` or `toDynamic()`.\n====\n\n[[typed-objects]]\n=== Typed Objects\n\n:fn-typed-objects: footnote:[By \"structure\" we mean a list of property names and (optionally) property types.]\n\nPkl has two kinds of objects:\n\n* A link:{uri-stdlib-Dynamic}[Dynamic] object has no predefined structure.{fn-typed-objects}\n  When a dynamic object is amended, not only can existing properties be overridden or amended, but new properties can also be added.\n  So far, we have only used dynamic objects in this chapter.\n* A link:{uri-stdlib-Typed}[Typed] object has a fixed structure described by a class definition.\n  When a typed object is amended, its properties can be overridden or amended, but new properties cannot be added.\n  In other words, the new object has the same class as the original object.\n\n[TIP]\n.When to Use Typed vs. Dynamic Objects\n====\n* Use typed objects to build schema-backed data models that are validatedfootnote:[By \"Use typed objects\" we mean to define classes and build data models out of instances of these classes.].\n  This is what most templates do.\n* Use dynamic objects to build schema-less data models that are not validated.\n  Dynamic objects are useful for ad-hoc tasks, tasks that do not justify the effort of writing and maintaining a schema, and for representing data whose structure is unknown.\n====\n\nNote that every <<modules,module>> is a typed object. Its properties implicitly define a class,\nand new properties cannot be added when amending the module.\n\nA typed object is backed by a _class_.\nLet's look at an example:\n\n[source%tested,{pkl}]\n----\nclass Bird { // <1>\n  name: String\n  lifespan: Int\n  migratory: Boolean\n}\n\npigeon = new Bird { // <2>\n  name = \"Pigeon\"\n  lifespan = 8\n  migratory = false\n}\n----\n<1> Defines a class named `Bird` with properties `name`, `lifespan` and `migratory`.\n<2> Defines a module property named `pigeon`.\n    Its value is a typed object constructed by instantiating class `Bird`.\n    A type only needs to be stated when the property does not have or inherit a <<type-annotations,type annotation>>.\n    Otherwise, amend syntax (`pigeon { ... }`) or shorthand instantiation syntax (`pigeon = new { ... }`) should be used.\n\nCongratulations, you have constructed your first typed objectfootnote:[Not counting that every module is a typed object.]!\nHow does it differ from a dynamic object?\n\nThe answer is that a typed object has a fixed structure prescribed by its class, which cannot be changed when amending the object:\n\n[source%tested%error,{pkl}]\n----\nclass Bird { // <1>\n  name: String\n  lifespan: Int\n}\n\nfaultyPigeon = new Bird {\n  name = \"Pigeon\"\n  lifespan = 8\n  hobby = \"singing\"\n}\n----\n\nEvaluating this gives:\n\n[source,shell,subs=\"quotes\"]\n----\nCannot find property *hobby* in object of type *repl#Bird*.\n\nAvailable properties:\nlifespan\nname\n----\n\nClass structure is also enforced when instantiating a class.\nLet's try to override property `name` with a value of the wrong type:\n\n[source%tested%error,{pkl}]\n----\nfaultyPigeon2 = new Bird {\n  name = 3.min\n  lifespan = 8\n}\n----\n\nEvaluating this, also fails:\n\n[source,shell,subs=\"quotes\"]\n----\nExpected value of type *String*, but got type *Duration*.\nValue: 3.min\n----\n\nTyped objects are the fundamental building block for constructing validated data models in Pkl.\nTo dive deeper into this topic, continue with <<classes,Classes>>.\n\n[NOTE]\n.Converting untyped objects to typed objects\n====\nWhen you have a `Dynamic` that has all the properties (with the right types and meeting all constraints), you can convert it to a `Typed` by using link:{uri-stdlib-Dynamic-toTyped}[`toTyped(<class>)`]:\n\n[source,{pkl}]\n----\nclass Bird {\n  name: String\n  lifespan: Int\n}\n\npigeon = new Dynamic { // <1>\n  name = \"Pigeon\"\n  lifespan = 8\n}.toTyped(Bird) // <2>\n----\n<1> Instead of a `new Bird`, `pigeon` can be defined with a `new Dynamic`.\n<2> That `Dynamic` is then converted to a `Bird`.\n====\n\n[[properties]]\n=== Property Modifiers\n\n==== Hidden Properties\n\nA property with the modifier `hidden` is omitted from the rendered output and object conversions.\nHidden properties are also ignored when evaluating equality or hashing (e.g. for `Mapping` or `Map` keys).\n\n[source,{pkl}]\n----\nclass Bird {\n  name: String\n  lifespan: Int\n  hidden nameAndLifespanInIndex = \"\\(name), \\(lifespan)\" // <1>\n  nameSignWidth: UInt = nameAndLifespanInIndex.length // <2>\n}\n\npigeon = new Bird { // <3>\n  name = \"Pigeon\"\n  lifespan = 8\n}\n\npigeonInIndex = pigeon.nameAndLifespanInIndex // <4>\n\npigeonDynamic = pigeon.toDynamic() // <5>\n\nfavoritePigeon = (pigeon) {\n  nameAndLifespanInIndex = \"Bettie, \\(lifespan)\"\n}\n\nsamePigeon = pigeon == favoritePigeon // <6>\n----\n<1> Properties defined as `hidden` are accessible on any `Bird` instance, but not output by default.\n<2> Non-hidden properties can refer to hidden properties as usual.\n<3> `pigeon` is an object with _four_ properties, but is rendered with _three_ properties.\n<4> Accessing a `hidden` property from outside the class and object is like any other property.\n<5> Object conversions omit hidden properties, so the resulting `Dynamic` has three properties.\n<6> Objects that differ only in `hidden` property values are considered equal\n\nInvoking Pkl on this file produces the following result.\n\n[source,{pkl}]\n----\npigeon {\n  name = \"Pigeon\"\n  lifespan = 8\n  nameSignWidth = 9\n}\npigeonInIndex = \"Pigeon, 8\"\npigeonDynamic {\n  name = \"Pigeon\"\n  lifespan = 8\n  nameSignWidth = 9\n}\nfavoritePigeon {\n  name = \"Pigeon\"\n  lifespan = 8\n  nameSignWidth = 9\n}\nsamePigeon = true\n----\n\n==== Local properties\nA property with the modifier `local` can only be referenced in the lexical scope of its definition.\n\n[source,{pkl}]\n----\nclass Bird {\n  name: String\n  lifespan: Int\n  local separator = \",\" // <1>\n  hidden nameAndLifespanInIndex = \"\\(name)\\(separator) \\(lifespan)\" // <2>\n}\n\npigeon = new Bird {\n  name = \"Pigeon\"\n  lifespan = 8\n}\n\npigeonInIndex = pigeon.nameAndLifespanInIndex // <3>\npigeonSeparator = pigeon.separator // Error <4>\n----\n<1> This property can only be accessed from inside this _class definition_.\n<2> Non-local properties can refer to the local property as usual.\n<3> The _value_ of `separator` occurs in `nameAndLifespanInIndex`.\n<4> Pkl does not accept this, as there is no property `separator` on a `Bird` instance.\n\nBecause a `local` property is added to the lexical scope, but not (observably) to the object, you can add `local` properties to ``Listing``s and ``Mapping``s.\n\n[NOTE]\n.Import clauses define local properties\n====\n\nAn _import clause_ defines a local property in the containing module.\nThis means `import \"someModule.pkl\"` is effectively `const local someModule = import(\"someModule.pkl\")`.\nAlso, `import \"someModule.pkl\" as otherName` is effectively `const local otherName = import(\"someModule.pkl\")`.\n====\n\n[[fixed-properties]]\n==== Fixed properties\n\nA property with the `fixed` modifier cannot be assigned to or amended when defining an object of its class.\n\n.Bird.pkl\n[source%tested,{pkl}]\n----\nfixed laysEggs: Boolean = true\n\nfixed birds: Listing<String> = new {\n  \"Pigeon\"\n  \"Hawk\"\n  \"Penguin\"\n}\n----\n\nWhen amending, assigning to a `fixed` property is an error.\nSimilarly, it is an error to use an <<amends-declaration,amends declaration>> on a fixed property:\n\n.invalid.pkl\n[source%tested,{pkl}]\n----\namends \"Bird.pkl\"\n\nlaysEggs = false // <1>\n\nbirds { // <2>\n  \"Giraffe\"\n}\n----\n<1> Error: cannot assign to fixed property `laysEggs`\n<2> Error: cannot amend fixed property `birds`\n\nWhen extending a class and overriding an existing property definition, the fixedness of the overridden property must be preserved.\nIf the property in the parent class is declared `fixed`, the child property must also be declared `fixed`.\nIf the property in the parent class is not declared `fixed`, the child property may not add the `fixed` modifier.\n\n[source%parsed,{pkl}]\n----\nabstract class Bird {\n  fixed canFly: Boolean\n  name: String\n}\n\nclass Penguin extends Bird {\n  canFly = false // <1>\n  fixed name = \"Penguin\" // <2>\n}\n----\n<1> Error: missing modifier `fixed`.\n<2> Error: modifier `fixed` cannot be applied to property `name`.\n\nThe `fixed` modifier is useful for defining properties that are meant to be derived from other properties.\nIn the following snippet, the property `wingspanWeightRatio` is not meant to be assigned to, because it is derived\nfrom other properties.\n\n[source%parsed,{pkl}]\n----\nclass Bird {\n  wingspan: Int\n  weight: Int\n  fixed wingspanWeightRatio: Int = wingspan / weight\n}\n----\n\nAnother use-case for `fixed` is to define properties that are meant to be fixed to a class definition.\nIn the example below, the `species` of a bird is tied to the class, and therefore is declared `fixed`.\n\nNote that it is possible to define a `fixed` property without a value, for one of two reasons:\n\n1. The type has a default value that makes an explicit default redundant.\n2. The property is meant to be overridden by a child class.\n\n[source%tested,{pkl}]\n----\nabstract class Bird {\n  fixed species: String // <1>\n}\n\nclass Osprey extends Bird {\n  fixed species: \"Pandion haliaetus\" // <2>\n}\n----\n<1> No explicit default because the property is overridden by a child class.\n<2> Overrides the type from `String` to the <<string-literal-types,string literal type>> `\"Pandion haliaetus\"`. +\nAssigning an explicit default would be redundant, therefore it is omitted.\n\n==== Const properties\n\nA property with the `const` modifier behaves like the <<fixed-properties,`fixed`>> modifier,\nwith the additional rule that it cannot reference non-const properties or methods.\n\n.Bird.pkl\n[source%tested,{pkl}]\n----\nconst laysEggs: Boolean = true\n\nconst examples: Listing<String> = new {\n  \"Pigeon\"\n  \"Hawk\"\n  \"Penguin\"\n}\n----\n\nReferencing any non-const property or method is an error.\n\n.invalid.pkl\n[source%parsed,{pkl}]\n----\npigeonName: String = \"Pigeon\"\n\nconst function birdLifespan(i: Int): Int = (i / 4).toInt()\n\nclass Bird {\n  name: String\n  lifespan: Int\n}\n\nconst bird: Bird = new {\n  name = pigeonName // <1>\n  lifespan = birdLifespan(24) // <2>\n}\n----\n<1> Error: cannot reference non-const property `pigeonName` from a const property.\n<2> Allowed: `birdLifespan` is const.\n\nIt is okay to reference another value _within_ the same const property.\n\n.valid.pkl\n[source%tested,{pkl}]\n----\nclass Bird {\n  lifespan: Int\n  description: String\n  speciesName: \"Bird\"\n}\n\nconst bird: Bird = new {\n  lifespan = 8\n  description = \"species: \\(speciesName), lifespan: \\(lifespan)\" // <1>\n}\n----\n<1> `lifespan` is declared within property `bird`. `speciesName` resolves to `this.speciesName`, where `this` is a value within property `bird`.\n\nNOTE: Because `const` members can only reference themselves and other `const` members, they are not <<late-binding,late bound>>.\n\nThe `const` modifier implies that it is also <<fixed-properties,fixed>>.\nTherefore, the same rules that apply to `fixed` also apply to `const`:\n\n* A `const` property cannot be assigned to or amended when defining an object of its class.\n* The const-ness of a property or method must be preserved when it is overridden by a child class.\n\n[[class-and-annotation-const]]\n*Class, Annotation, and Typealias Scoping*\n\nIn these following scenarios, any reference to a property or method of its enclosing module requires that the referenced member is `const`:\n\n* Class body\n* Annotation body\n* Typealiased constrained type\n\n.invalid2.pkl\n[source%parsed,{pkl}]\n----\npigeonName: String = \"Pigeon\"\n\nclass Bird {\n  name: String = pigeonName // <1>\n}\n\n@Deprecated { message = \"Replace with \\(pigeonName)\" } // <2>\noldPigeonName: String\n\ntypealias IsPigeonName = String(pigeonName) // <3>\n----\n<1> Error: cannot reference non-const property `pigeonName` from a class.\n<2> Error: cannot reference non-const property `pigeonName` from an annotation.\n<3> Error: cannot reference non-const property `pigeonname` from a typealias.\n\nThis rule exists because classes, annotations, and typealiases are not <<late-binding,late bound>>;\nit is not possible to change the definition of these members by amending the module\nwhere it is defined.\n\nGenerally, there are two strategies for referencing such properties:\n\n*Add the `const` modifier to the referenced property*\n\nOne solution is to add the `const` modifier to the property being referenced.\n\n.Birds.pkl\n[source,diff]\n----\n-pigeonName: String = \"Pigeon\"\n+const pigeonName: String = \"Pigeon\"\n\n class Bird {\n   name: String = pigeonName\n }\n----\n\nThis solution makes sense if `pigeonName` does not get assigned/amended when amending module `Birds.pkl` (modules are regular objects that can be amended).\n\n*Self-import the module*\n\n.Birds.pkl\n[source,diff]\n----\n+import \"Birds.pkl\" // <1>\n+\n pigeonName: String = \"Pigeon\"\n\n class Bird {\n-   name: String = pigeonName\n+   name: String = Birds.pigeonName\n }\n----\n<1> module `Birds` imports itself\n\nThis solution works because an import clause implicitly defines a `const local` property and amending this module does not affect a self-import.\n\nThis makes sense if property `pigeonName` *does* get assigned/amended when amending module `Birds.pkl`.\n\n[[listings]]\n== Listings\n\nA value of type link:{uri-stdlib-Listing}[Listing] is an ordered, indexed collection of _elements_.\n\nA listing's elements have zero-based indexes and are lazily evaluated on the first read.\n\nListings combine qualities of lists and objects:\n\n* Like lists, listings can contain arbitrary elements.\n* Like objects, listings excel at defining and amending nested literal data structures.\n* Like objects, listings can only be directly manipulated through amendment,\n  but converting them to a list (and, if necessary, back to a listing) opens the door to arbitrary transformations.\n* Like object properties, listing elements are evaluated lazily, can be defined in terms of each other, and are late-bound.\n\n[TIP]\n.When to use Listing vs. <<lists,List>>\n====\n* When a collection of elements needs to be specified literally, use a listing.\n* When a collection of elements needs to be transformed in a way that cannot be achieved by <<amending-listings,amending>> a listing, use a list.\n* If in doubt, use a listing.\n\nTemplates and schemas should almost always use listings instead of lists.\nNote that listings can be converted to lists when the need arises.\n====\n\n=== Defining Listings\n\nListings have a literal syntax that is similar to that of objects.\nHere is a listing with two elements:\n\n[source%tested,{pkl}]\n----\nbirds = new Listing { // <1>\n  new { // <2>\n    name = \"Pigeon\"\n    diet = \"Seed\"\n  }\n  new { // <3>\n    name = \"Parrot\"\n    diet = \"Berries\"\n  }\n}\n----\n<1> Defines a module property named `birds` with a value of type `Listing`.\n    A type only needs to be stated when the property does not have or inherit a <<listing-type-annotations,type annotation>>.\n    Otherwise, amend syntax (`birds { ... }`) or shorthand instantiation syntax (`birds = new { ... }`) should be used.\n<2> Defines a listing element of type `Dynamic`.\n<3> Defines another listing element of type `Dynamic`.\n    The order of definitions is relevant.\n\nTo access an element by index, use the `[]` (subscript) operator:\n\n[source%tested,{pkl}]\n----\nfirstBirdName = birds[0].name  // <1>\nsecondBirdDiet = birds[1].diet // <2>\n----\n<1> result: `\"Pigeon\"`\n<2> result: `\"Berries\"`\n\nListings can contain arbitrary types of elements:\n\n[source%tested,{pkl}]\n----\nlisting = new Listing {\n  \"Pigeon\" // <1>\n  3.min // <2>\n  new Listing { // <3>\n    \"Barn owl\"\n  }\n}\n----\n<1> Defines a listing element of type `String`.\n<2> Defines a listing element of type `Duration`.\n<3> Defines a listing element of type `Listing`.\n\nListings can have `local` properties:\n\n[source%tested,{pkl}]\n----\nlisting = new Listing {\n  local pigeon = \"Pigeon\" // <1>\n  pigeon // <2>\n  \"A \" + pigeon + \" is a bird\" // <3>\n}\n----\n<1> Defines a local property with the value `\"Pigeon\"`.\n    Local properties can have a type annotation, as in `pigeon: String = \"Pigeon\"`.\n<2> Defines a listing element that references the local property.\n<3> Defines another listing element that references the local property.\n\n[[amending-listings]]\n=== Amending Listings\n\nLet's say we have the following listing:\n\n[source%tested,{pkl}]\n----\nbirds = new Listing {\n  new {\n    name = \"Pigeon\"\n    diet = \"Seeds\"\n  }\n  new {\n    name = \"Parrot\"\n    diet = \"Berries\"\n  }\n}\n----\n\nTo add, override, or amend elements of this listing, amend the listing itself:\n\n[source%tested,{pkl}]\n----\nbirds2 = (birds) { // <1>\n  new { // <2>\n    name = \"Barn owl\"\n    diet = \"Mice\"\n  }\n  [0] { // <3>\n    diet = \"Worms\"\n  }\n  [1] = new { // <4>\n    name = \"Albatross\"\n    diet = \"Fish\"\n  }\n}\n----\n<1> Defines a module property named `birds2`. Its value is a listing that amends `birds`.\n<2> Defines a listing element of type `Dynamic`.\n<3> Amends the listing element at index 0 (whose name is `\"Pigeon\"`) and overrides property `diet`.\n<4> Overrides the listing element at index 1 (whose name is `\"Parrot\"`) with an entirely new dynamic object.\n\n=== Late Binding\n\nA listing element can be defined in terms of another element.\nTo reference the element at index `<index>`, use `this[<index>]`:\n\n[source%tested,{pkl}]\n----\nbirds = new Listing {\n  new { // <1>\n    name = \"Pigeon\"\n    diet = \"Seeds\"\n  }\n  (this[0]) { // <2>\n    name = \"Parrot\"\n  }\n}\n----\n<1> Defines a listing element of type `Dynamic`.\n<2> Defines a listing element that amends the element at index 0 and overrides `name`.\n\nListing elements are late-bound:\n\n[source%tested,{pkl}]\n----\nnewBirds = (birds) { // <1>\n  [0] {\n    diet = \"Worms\"\n  }\n}\n\nsecondBirdDiet = newBirds[1].diet // <2>\n----\n<1> Amends listing `birds` and overrides property `diet` of element 0 (whose name is \"Pigeon\"`) to have the value `\"Worms\"`.\n<2> Because element 1 is defined in terms of element 0, its `diet` property also changes to `\"Worms\"`.\n\n=== Transforming Listings\n\nSay we have the following listing:\n\n[source%tested,{pkl}]\n----\nbirds = new Listing {\n  new {\n    name = \"Pigeon\"\n    diet = \"Seeds\"\n  }\n  new {\n    name = \"Parrot\"\n    diet = \"Berries\"\n  }\n}\n----\n\nHow can the order of elements be reversed programmatically?\n\nThe recipe for transforming a listing is:\n\n. Convert the listing to a list.\n. Transform the list using ``List``'s link:{uri-stdlib-List}[rich API].\n. If necessary, convert the list back to a listing.\n\nTIP: Often, transformations happen in a link:{uri-stdlib-PcfRenderer-converters}[converter] of a link:{uri-stdlib-BaseValueRenderer}[value renderer].\nBecause most value renderers treat lists the same as listings, it is often not necessary to convert back to a listing.\n\nEquipped with this knowledge, let's try to accomplish our objective:\n\n[source%tested,{pkl}]\n----\nreversedbirds = birds\n  .toList()\n  .reverse()\n  .toListing()\n----\n\n`result` now contains the same elements as `birds`, but in reverse order.\n\n[IMPORTANT]\n.Lazy vs. Eager Data Types\n====\nConverting a listing to a list is a transition from a _lazy_ to an _eager_ data type.\nAll of the listing's elements are evaluated and all references between them are resolved.\n\nIf the list is later converted back to a listing, subsequent changes to the listing's elements no longer propagate to (previously) dependent elements.\nTo make these boundaries clear, transitioning between _lazy_ and _eager_ data types always requires an explicit method call, such as `toList()` or `toListing()`.\n====\n\n=== Default Element\n\nListings can have a _default element_:\n\n[source%tested,{pkl}]\n----\nbirds = new Listing {\n  default { // <1>\n    lifespan = 8\n  }\n  new { // <2>\n    name = \"Pigeon\" // <3>\n  }\n  new { // <4>\n    name = \"Parrot\"\n    lifespan = 20 // <5>\n  }\n}\n----\n<1> Amends the `default` element and sets property `lifespan`.\n<2> Defines a new listing element that implicitly amends the default element.\n<3> Defines a new property called `name`. Property `lifespan` is inherited from the default element.\n<4> Defines a new listing element that implicitly amends the default element.\n<5> Overrides the default for property `lifespan`.\n\n`default` is a hidden (that is, not rendered) link:{uri-stdlib-Listing-default}[property] defined in class `Listing`.\nIf `birds` had a <<listing-type-annotations,type annotation>>, a suitable default element would be inferred from its type parameter.\nIf, as in our example, no type annotation is provided or inherited, the default element is the empty `Dynamic` object.\n\nLike regular listing elements, the default element is late-bound.\nAs a result, defaults can be changed retroactively:\n\n[source%tested,{pkl}]\n----\nbirds2 = (birds) {\n  default {\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n}\n----\n\nBecause both of ``birds``'s elements amend the default element, changing the default element also changes them.\nAn equivalent literal definition of `birds2` would look as follows:\n\n[source%tested,{pkl}]\n----\nbirds2 = new Listing {\n  new {\n    name = \"Pigeon\"\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n  new {\n    name = \"Parrot\"\n    lifespan = 20\n    diet = \"Berries\"\n  }\n}\n----\n\nNote that Parrot kept its diet because its prior self defined it explicitly, overriding any default.\n\nIf you are interested in the technical underpinnings of default elements (and not afraid of dragons!), continue with <<function-amending, Function Amending>>.\n\n[[listing-type-annotations]]\n=== Type Annotations\n\nTo declare the type of a property that is intended to hold a listing, use:\n\n[source,{pkl}]\n----\nx: Listing<ElementType>\n----\n\nThis declaration has the following effects:\n\n* `x` is initialized with an empty listing.\n* If `ElementType` has a <<default-values,default value>>, that value becomes the listing's default element.\n* The first time `x` is read,\n  ** its value is checked to have type `Listing`.\n  ** the listing's elements are checked to have the type `ElementType`.\n\nHere is an example:\n\n[source%tested,{pkl}]\n----\nclass Bird {\n  name: String\n  lifespan: Int\n}\n\nbirds: Listing<Bird>\n----\n\nBecause the default value for type `Bird` is `new Bird {}`, that value becomes the listing's default element.\n\nLet's go ahead and populate `birds`:\n\n[source%tested,{pkl}]\n----\nbirds {\n  new {\n    name = \"Pigeon\"\n    lifespan = 8\n  }\n  new {\n    name = \"Parrot\"\n    lifespan = 20\n  }\n}\n----\n\nThanks to ``birds``'s default element, which was inferred from its type,\nit is not necessary to state the type of each list element\n(`new Bird { ... }`, `new Bird { ... }`, etc.).\n\n==== Distinct Elements\n\nTo constrain a listing to distinct elements, use ``Listing``'s link:{uri-stdlib-Listing-isDistinct}[isDistinct] property:\n\n[source%tested,{pkl}]\n----\nclass Bird {\n  name: String\n  lifespan: Int\n}\n\nbirds: Listing<Bird>(isDistinct)\n----\n\nThis is as close as Pkl's late-bound data types (objects, listings, and mappings) get to a <<sets,Set>>.\n\nTo demand distinct names instead of distinct `Bird` objects, use link:{uri-stdlib-Listing-isDistinctBy}[isDistinctBy()]:\n\n[source%tested,{pkl}]\n----\nbirds: Listing<Bird>(isDistinctBy((it) -> it.name))\n----\n\n[[mappings]]\n== Mappings\n\nA value of type link:{uri-stdlib-Mapping}[Mapping] is an ordered collection of _values_ indexed by _key_.\n\nNOTE: Most of what has been said about <<listings,listings>> also applies to mappings.\nNevertheless, this section is written to stand on its own.\n\nA mapping's key-value pairs are called its _entries_.\nKeys are eagerly evaluated; values are lazily evaluated on the first read.\n\nMappings combine qualities of maps and objects:\n\n* Like maps, mappings can contain arbitrary key-value pairs.\n* Like objects, mappings excel at defining and amending nested literal data structures.\n* Like objects, mappings can only be directly manipulated through amendment,\n  but converting them to a map (and, if necessary, back to a mapping) opens the door to arbitrary transformations.\n* Like object properties, a mapping's values (but not its keys) are evaluated lazily, can be defined in terms of each other, and are late-bound.\n\n[TIP]\n.When to use Mapping vs. <<maps,Map>>\n====\n* When key-value style data needs to be specified literally, use a mapping.\n* When key-value style data needs to be transformed in a way that cannot be achieved by <<amending-mappings,amending>> a mapping, use a map.\n* If in doubt, use a mapping.\n\nTemplates and schemas should almost always use mappings instead of maps.\nNote that mappings can be converted to maps when the need arises.\n====\n\n=== Defining Mappings\n\nMappings have the same literal syntax as objects, except that keys enclosed in `[]` take the place of property names.\nHere is a mapping with two entries:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping { // <1>\n  [\"Pigeon\"] { // <2>\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n  [\"Parrot\"] { // <3>\n    lifespan = 20\n    diet = \"Berries\"\n  }\n}\n----\n<1> Defines a module property named `birds` with a value of type `Mapping`.\n    A type only needs to be stated when the property does not have or inherit a <<mapping-type-annotations,type annotation>>.\n    Otherwise, amend syntax (`birds { ... }`) or shorthand instantiation syntax (`birds = new { ... }`) should be used.\n<2> Defines a mapping entry with the key `\"Pigeon\"` and a value of type `Dynamic`.\n<3> Defines a mapping entry with the key `\"Parrot\"` and a value of type `Dynamic`.\n\nTo access a value by key, use the `[]` (subscript) operator:\n\n[source%tested,{pkl}]\n----\npigeon = birds[\"Pigeon\"]\nparrot = birds[\"Parrot\"]\n----\n\nMappings can contain arbitrary types of values:\n\n[source%tested,{pkl}]\n----\nmapping = new Mapping {\n  [\"number\"] = 42\n  [\"list\"] = List(\"Pigeon\", \"Parrot\")\n  [\"nested mapping\"] {\n    [\"Pigeon\"] {\n      lifespan = 20\n      diet = \"Seeds\"\n    }\n  }\n}\n----\n\nAlthough string keys are most common, mappings can contain arbitrary types of keys:\n\n[source%tested,{pkl}]\n----\nmapping = new Mapping {\n  [3.min] = 42\n  [new Dynamic { name = \"Pigeon\" }] = \"abc\"\n}\n----\n\nKeys can be computed:\n\n[source%tested,{pkl}]\n----\nmapping = new Mapping {\n  [\"Pigeon\".reverse()] = 42\n}\n----\n\nMappings can have `local` properties:\n\n[source%tested,{pkl}]\n----\nmapping = new Mapping {\n  local parrot = \"Parrot\" // <1>\n  [\"Pigeon\"] { // <2>\n    friend = parrot\n  }\n}\n----\n<1> Defines a local property name `parrot` with the value `\"Parrot\"`.\n    Local properties can have a type annotation, as in `parrot: String = \"Parrot\"`.\n<2> Defines a mapping entry whose value references `parrot`.\n    The local property is visible to values but not keys.\n\n[[amending-mappings]]\n=== Amending Mappings\n\nLet's say we have the following mapping:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping {\n  [\"Pigeon\"] {\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n  [\"Parrot\"] {\n    lifespan = 20\n    diet = \"Berries\"\n  }\n}\n----\n\nTo add, override, or amend entries of this mapping, amend the mapping:\n\n[source%tested,{pkl}]\n----\nbirds2 = (birds) { // <1>\n  [\"Barn owl\"] { // <2>\n    lifespan = 15\n    diet = \"Mice\"\n  }\n  [\"Pigeon\"] { // <3>\n    diet = \"Seeds\"\n  }\n  [\"Parrot\"] = new { // <4>\n    lifespan = 20\n    diet = \"Berries\"\n  }\n}\n----\n<1> Defines a module property named `birds2`. Its value is a mapping that amends `birds`.\n<2> Defines a mapping entry with the key `\"Barn owl\"` and a value of type `Dynamic`.\n<3> Amends mapping entry `\"Pigeon\"` and overrides property `diet`.\n<4> Overrides mapping entry `\"Parrot\"` with an entirely new value of type `Dynamic`.\n\n=== Late Binding\n\nA mapping entry's value can be defined in terms of another entry's value.\nTo reference the value with key `<key>`, use `this[<key>]`:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping {\n  [\"Pigeon\"] { // <1>\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n  [\"Parrot\"] = (this[\"Pigeon\"]) { // <2>\n    lifespan = 20\n  }\n}\n----\n<1> Defines a mapping entry with the key `\"Pigeon\"` and a value of type `Dynamic`.\n<2> Defines a mapping entry with the key `\"Parrot\"` and a value that amends `\"Pigeon\"`.\n\nMapping values are late-bound:\n\n[source%tested,{pkl}]\n----\nbirds2 = (birds) { // <1>\n  [\"Pigeon\"] {\n    diet = \"Seeds\"\n  }\n}\n\nparrotDiet = birds2[\"Parrot\"].diet // <2>\n----\n<1> Amends mapping `birds` and overrides ``\"Pigeon\"``'s `diet` property to have value `\"Seeds\"`.\n<2> Because `\"Parrot\"` is defined in terms of `\"Pigeon\"`, its `diet` property also changes to `\"Seeds\"`.\n\n=== Transforming Mappings\n\nSay we have the following mapping:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping {\n  [\"Pigeon\"] {\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n  [\"Parrot\"] = (this[\"Pigeon\"]) {\n    lifespan = 20\n  }\n}\n----\n\nHow can ``birds``'s keys be reversed programmatically?\n\nThe recipe for transforming a mapping is:\n\n. Convert the mapping to a map.\n. Transform the map using ``Map``'s link:{uri-stdlib-Map}[rich API].\n. If necessary, convert the map back to a mapping.\n\nTIP: Often, transformations happen in a link:{uri-stdlib-PcfRenderer-converters}[converter] of a link:{uri-stdlib-BaseValueRenderer}[value renderer].\nAs most value renderers treat maps the same as mappings, it is often not necessary to convert back to a mapping.\n\nEquipped with this knowledge, let's try to accomplish our objective:\n\n[source%tested,{pkl}]\n----\nresult = birds\n  .toMap()\n  .mapKeys((key, value) -> key.reverse())\n  .toMapping()\n----\n\n`result` contains the same values as `birds`, but its keys have changed to `\"noegiP\"` and `\"torraP\"`.\n\n[IMPORTANT]\n.Lazy vs. Eager Data Types\n====\nConverting a mapping to a map is a transition from a _lazy_ to an _eager_ data type.\nAll of the mapping's values are evaluated and all references between them are resolved.\n(Mapping keys are eagerly evaluated.)\n\nIf the map is later converted back to a mapping, changes to the mapping's values no longer propagate to (previously) dependent values.\nTo make these boundaries clear, transitioning between _lazy_ and _eager_ data types always requires an explicit method call, such as `toMap()` or `toMapping()`.\n====\n\n=== Default Value\n\nMappings can have a _default value_:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping {\n  default { // <1>\n    lifespan = 8\n  }\n  [\"Pigeon\"] { // <2>\n    diet = \"Seeds\" // <3>\n  }\n  [\"Parrot\"] { // <4>\n    lifespan = 20 // <5>\n  }\n}\n----\n<1> Amends the `default` value and sets property `lifespan`.\n<2> Defines a mapping entry with the key `\"Pigeon\"` that implicitly amends the default value.\n<3> Defines a new property called `diet`. Property `lifespan` is inherited from the default value.\n<4> Defines a mapping entry with the key `\"Parrot\"` that implicitly amends the default value.\n<5> Overrides the default for property `lifespan`.\n\n`default` is a hidden (that is, not rendered) link:{uri-stdlib-Mapping-default}[property] defined in class `Mapping`.\nIf `birds` had a <<mapping-type-annotations,type annotation>>, a suitable default value would be inferred from its second type parameter.\nIf, as in our example, no type annotation is provided or inherited, the default value is the empty `Dynamic` object.\n\nLike regular mapping values, the default value is late-bound.\nAs a result, defaults can be changed retroactively:\n\n[source%tested,{pkl}]\n----\nbirds2 = (birds) {\n  default {\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n}\n----\n\nBecause both of ``birds``'s mapping values amend the default value, changing the default value also changes them.\nAn equivalent literal definition of `birds2` would look as follows:\n\n[source%tested,{pkl}]\n----\nbirds2 = new Mapping {\n  [\"Pigeon\"] {\n    lifespan = 8\n    diet = \"Seeds\"\n  }\n  [\"Parrot\"] {\n    lifespan = 20\n    diet = \"Berries\"\n  }\n}\n----\n\nNote that Parrot kept its lifespan because its prior self defined it explicitly, overriding any default.\n\nIf you are interested in the technical underpinnings of default values, continue with <<function-amending, Function Amending>>.\n\n[[mapping-type-annotations]]\n=== Type Annotations\n\nTo declare the type of a property that is intended to hold a mapping, use:\n\n[source,{pkl}]\n----\nx: Mapping<KeyType, ValueType>\n----\n\nThis declaration has the following effects:\n\n* `x` is initialized with an empty mapping.\n* If `ValueType` has a <<default-values,default value>>, that value becomes the mapping's default value.\n* The first time `x` is read,\n  ** its value is checked to have type `Mapping`.\n  ** the mapping's keys are checked to have type `KeyType`.\n  ** the mapping's values are checked to have type `ValueType`.\n\nHere is an example:\n\n[source%tested,{pkl}]\n----\nclass Bird {\n  lifespan: Int\n}\n\nbirds: Mapping<String, Bird>\n----\n\nBecause the default value for type `Bird` is `new Bird {}`, that value becomes the mapping's default value.\n\nLet's go ahead and populate `birds`:\n\n[source%tested,{pkl}]\n----\nbirds {\n  [\"Pigeon\"] {\n    lifespan = 8\n  }\n  [\"Parrot\"] {\n    lifespan = 20\n  }\n}\n----\n\nThanks to ``birds``'s default value, which was inferred from its type,\nit is not necessary to state the type of each mapping value\n(`[\"Pigeon\"] = new Bird { ... }`, `[\"Parrot\"] = new Bird { ... }`, etc.).\n\n[[classes]]\n== Classes\n\nClasses are arranged in a single inheritance hierarchy.\nAt the top of the hierarchy sits class link:{uri-stdlib-Any}[Any]; at the bottom, type <<nothing-type,nothing>>.\n\nClasses contain properties and methods, which can be `local` to their declaring scope.\nProperties can also be `hidden` from rendering.\n\n[source%tested,{pkl}]\n----\nclass Bird {\n  name: String\n  hidden taxonomy: Taxonomy\n}\n\nclass Taxonomy {\n  `species`: String\n}\n\npigeon: Bird = new {\n  name = \"Common wood pigeon\"\n  taxonomy {\n    species = \"Columba palumbus\"\n  }\n}\n\npigeonClass = pigeon.getClass()\n----\n\nDeclaration of new class instances will fail when property names are misspelled: \n\n[source%tested%error,{pkl}]\n----\n// Detects the spelling mistake\nparrot = new Bird {\n  namw = \"Parrot\"\n}\n----\n\n=== Class Inheritance\n\nPkl supports single inheritance with a Java(Script)-like syntax.\n\n[source%tested,{pkl}]\n----\nabstract class Bird {\n  name: String\n}\n\nclass ParentBird extends Bird {\n  kids: List<String>\n}\n\npigeon: ParentBird = new {\n  name = \"Old Pigeon\"\n  kids = List(\"Pigeon Jr.\", \"Teen Pigeon\")\n}\n----\n\n[[methods]]\n== Methods\n\nPkl methods can be defined on classes and modules using the `function` keyword.\nMethods may access properties of their containing type.\nSubmodules and subclasses can override them.\n\nLike Java and most other object-oriented languages, Pkl uses _single dispatch_ -- methods are dynamically dispatched based on the receiver's runtime type.\n\n[source%tested,{pkl}]\n----\nclass Bird {\n  name: String\n  function greet(bird: Bird): String = \"Hello, \\(bird.name)!\" // <1>\n}\n\nfunction greetPigeon(bird: Bird): String = bird.greet(pigeon) // <2>\n\npigeon: Bird = new {\n  name = \"Pigeon\"\n}\nparrot: Bird = new {\n  name = \"Parrot\"\n}\n\ngreeting1 = pigeon.greet(parrot) // <3>\ngreeting2 = greetPigeon(parrot)  // <4>\n----\n<1> Instance method of class `Bird`.\n<2> Module method.\n<3> Call instance method on `pigeon`.\n<4> Call module method (on `this`).\n\nLike other object-oriented languages, methods defined on extended classes and modules may be overridden.\nThe parent type's method may be called via the <<super-keyword,`super` keyword>>.\n\nNOTE: Methods do not support named parameters or default parameter values.\nThe xref:blog:ROOT:class-as-a-function.adoc[Class-as-a-function] pattern may be a suitable replacement.\n\nTIP: In most cases, methods without parameters should not be defined.\nInstead, use <<fixed-properties,`fixed` properties>> on the module or class.\n\n[[modules]]\n== Modules\n\n=== Introduction\n\nModules are the unit of loading, executing, and sharing Pkl code.\nEvery file containing Pkl code is a module.\nBy convention, module files have a `.pkl` extension.\n\nModules have a <<Module Names,Module Name>> and are loaded from a <<Module URIs,Module URI>>.\n\nAt runtime, modules are represented as objects of type link:{uri-stdlib-baseModule}/Module[Module].\nThe precise runtime type of a module is a subclass of `Module` containing the module's property and method definitions.\n\nLike class members, module members may have type annotations, which are validated at runtime:\n\n[source%tested,{pkl}]\n----\ntimeout: Duration(isPositive) = 5.ms\n\nfunction greet(name: String): String = \"Hello, \\(name)!\"\n----\n\nBecause modules are regular objects, they can be assigned to properties and passed to and returned from methods.\n\nModules can be <<import-module,imported>> by other modules.\nIn analogy to objects, modules can serve as templates for other modules through <<module-amend,amending>>.\nIn analogy to classes, modules can be <<module-extend,extended>> to add additional module members.\n\n=== Module Names\n\nModules may declare their name by way of a _module clause_, which consists of the keyword `module` followed by a qualified name:\n\n[source%tested,{pkl}]\n----\n/// My bird module.\nmodule com.animals.Birds\n----\n\nA module clause must come first in a module.\nIts doc comment, if present, holds the module's overall documentation.\n\nIn the absence of a module clause, a module's name is inferred from the module URI from which the module was first loaded.\nFor example, the inferred name for a module first loaded from `+https://example.com/pkl/bird.pkl+` is `bird`.\n\nModule names do not affect evaluation but are used in diagnostic messages and Pkldoc.\nIn particular, they are the first component (everything before the hash sign) of fully qualified member names such as `pkl.base#Int`.\n\nNOTE: Modules shared with other parties should declare a qualified module name, which is more unique and stable than an inferred name.\n\n=== Module URIs\n\nModules are loaded from _module URIs_.\n\nBy default, the following URI types are available for import:\n\n==== File URI:\nExample: `+file:///path/to/my_module.pkl+` \n\nRepresents a module located on a file system.\n\n==== HTTP(S) URI:\nExample: `+https://example.com/my_module.pkl+` \n\nRepresents a module imported via an HTTP(S) GET request.\n\nNOTE: Modules loaded from HTTP(S) URIs are only cached until the `pkl` command exits or the `Evaluator` object is closed.\n\n[[module-path-uri]]\n==== Module path URI:\nExample: `+modulepath:/path/to/my_module.pkl+`\n\nModule path URIs are resolved relative to the _module path_, a search path for modules similar to Java's class path (see the `--module-path` CLI option).\nFor example, given the module path `/dir1:/zip1.zip:/jar1.jar`, module `+modulepath:/path/to/my_module.pkl+` will be searched for in the following locations:\n\n. `/dir1/path/to/my_module.pkl`\n. `/path/to/my_module.pkl` within `/zip1.zip`\n. `/path/to/my_module.pkl` within `/jar1.jar`\n\nWhen evaluating Pkl code from Java, `+modulepath:/path/to/my_module.pkl+` corresponds to class path location `path/to/my_module.pkl`.\nIn a typical Java project, this corresponds to file path `src/main/resources/path/to/my_module.pkl` or `src/test/resources/path/to/my_module.pkl`.\n\n[[package-asset-uri]]\n==== Package asset URI:\nExample: `+package://example.com/mypackage@1.0.0#/my_module.pkl+`\n\nRepresent a module within a _package_.\nA package is a shareable archive of modules and resources that are published to the internet.\n\nTo import `package://example.com/mypackage@1.0.0#/my_module.pkl`, Pkl follows these steps:\n\n1. Make an HTTPS GET request to `\\https://example.com/mypackage@1.0.0` to retrieve the package's metadata.\n2. From the package metadata, download the referenced zip archive, and validate its checksum.\n3. Resolve path `/my_module.pkl` within the package's zip archive.\n\nA package asset URI has the following form:\n\n----\n'package://' <host> <path> '@' <semver> '#' <asset path>\n----\n\nOptionally, the SHA-256 checksum of the package can also be specified:\n\n[source]\n----\n'package://' <host> <path> '@' <semver> '::sha256:' <sha256-checksum> '#' <asset path>\n----\n\nPackages can be managed as dependencies within a _project_.\nFor more details, consult the <<projects,project>> section of the language reference.\n\nPackages can also be downloaded from a mirror.\nFor more details, consult the <<mirroring_packages>> section of the language reference.\n\n==== Standard Library URI\n\nExample: `+pkl:math+`\n\nStandard library modules are named `pkl.<simpleName>` and have module URIs of the form `pkl:<simpleName>`.\nFor example, module `pkl.math` has module URI `pkl:math`.\nSee the link:{uri-pkl-stdlib-docs-index}[API Docs] for the complete list of standard library modules.\n\n==== Relative URIs\n\nRelative module URIs are interpreted relative to the URI of the enclosing module.\nFor example, a module with URI `modulepath:/animals/birds/pigeon.pkl`\ncan import `modulepath:/animals/birds/parrot.pkl`\nwith `import \"parrot.pkl\"` or `import \"/animals/birds/parrot.pkl\"`.\n\n[NOTE]\n.Paths on Windows\n====\nRelative paths use the `/` character as the directory separator on all platforms, including Windows.\n\nPaths that contain drive letters (e.g. `C:`) must be declared as an absolute file URI, for example: `import \"file:///C:/path/to/my/module.pkl\"`. Otherwise, they are interpreted as a URI scheme.\n====\n\nNOTE: When importing a relative directory or file that starts with `@`, the import string must be prefixed with `./`.\nOtherwise, this syntax will be interpreted as xref:dependency-notation[dependency notation].\n\n[#dependency-notation]\n==== Dependency notation URIs\n\nExample: `+@birds/bird.pkl+`\n\nDependency notation URIs represent a path within a <<project-dependencies,project or package dependency>>.\nFor example, import `@birds/bird.pkl` represents path `/bird.pkl` in a dependency named \"birds\".\n\nA dependency is either a remote package or a local project dependency.\n\n==== Extension points\n\nPkl embedders can register additional module loaders that recognize other types of module URIs.\n\n==== Evaluation\n\nModule URIs can be evaluated directly:\n\n[source,shell]\n----\n$ pkl eval path/to/mymodule.pkl\n$ pkl eval file:///path/to/my_module.pkl\n$ pkl eval https://apple.com/path/to/mymodule.pkl\n$ pkl eval --module-path=/pkl-modules modulepath:/path/to/my_module.pkl\n$ pkl eval pkl:math\n----\n\n[[triple-dot-module-uris]]\n==== Triple-dot Module URIs\n\nTo simplify referencing ancestor modules in a hierarchical module structure,\nrelative file and module path URIs may start with `++...++/`, a generalization of `../`.\nModule URI `++...++/foo/bar/baz.pkl` resolves to the first existing module among\n`../foo/bar/baz.pkl`, `../../foo/bar/baz.pkl`, `../../../foo/bar/baz.pkl`, and so on.\nFurthermore, module URI `++...++` is equivalent to `++...++/<currentFileName>`.\n\nUsing triple-dot module URIs never resolve to the current module.\nFor example, a module at path `foo/bar.pkl` that references module URI `++...++/foo/bar.pkl`\ndoes not resolve to itself.\n\n[[module-amend]]\n=== Amending a Module\n\nRecall how an object is amended:\n\n[source%tested,{pkl}]\n----\npigeon {\n  name = \"Pigeon\"\n  diet = \"Seeds\"\n}\n\nparrot = (pigeon) { // <1>\n  name = \"Parrot\"   // <2>\n}\n----\n<1> Object `parrot` amends object `pigeon`, inheriting all of its members.\n<2> `parrot` overrides `name`.\n\nAmending a module works in the same way, except that the syntax differs slightly:\n\n.pigeon.pkl\n[source%tested,{pkl}]\n----\nname = \"Pigeon\"\ndiet = \"Seeds\"\n----\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\namends \"pigeon.pkl\" // <1>\n\nname = \"Parrot\"     // <2>\n----\n<1> Module `parrot` amends module `pigeon`, inheriting all of its members.\n<2> `parrot` overrides `name`.\n\nA module is amended by way of an _amends clause_, which consists of the keyword `amends` followed by the <<Module URIs,module URI>> of the module to amend.\n\nAn amends clause comes after the module clause (if present) and before any import clauses:\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\nmodule parrot\n\namends \"pigeon.pkl\"\n\nimport \"other.pkl\"\n\nname = \"Parrot\"\n----\n\nAt most one amends clause is permitted.\nA module cannot have both an amends clause and an extends clause.\n\nAn amending module has the same type (that is, module class) as the module it amends.\nAs a consequence, it cannot define new properties, methods, or classes, unless they are declared as `local`.\nIn our example, this means that module `parrot` can only define (and thus override) the property `name`.\nSpelling mistakes such as `namw` are caught immediately, rather than accidentally defining a new property.\n\nAmending is used to fill in _template modules_:\n\n. The template module defines which properties exist, their types, and what module output is desired (for example JSON indented with two spaces).\n. The amending module fills in property values as required, relying on the structure, defaults and validation provided by the template module.\n. The amending module is evaluated to produce the final result.\n\nTemplate modules are often provided by third parties and served over HTTPS.\n\n[[module-extend]]\n=== Extending a Module\n\nRecall how a class is extended:\n\n.PigeonAndParrot.pkl\n[source%tested,{pkl}]\n----\nopen class Pigeon {   // <1>\n  name = \"Pigeon\"\n  diet = \"Seeds\"\n}\n\nclass Parrot extends Pigeon {   // <2>\n  name = \"Parrot\"               // <3>\n  diet = \"Berries\"              // <4>\n  extinct = false               // <5>\n\n  function say() = \"Pkl is great!\"   // <6>\n}\n----\n<1> Class `Pigeon` is declared as `open` for extension.\n<2> Class `Parrot` extends `Pigeon`, inheriting all of its members.\n<3> `Parrot` overrides `name`.\n<4> `Parrot` overrides `diet`.\n<5> `Parrot` defines a new property named `extinct`.\n<6> `Parrot` defines a new function named `say`.\n\nExtending a module works in the same way, except that the syntax differs slightly:\n\n.pigeon.pkl\n[source%tested,{pkl}]\n----\nopen module pigeon   // <1>\n\nname = \"Pigeon\"\ndiet = \"Seeds\"\n----\n<1> Module `pigeon` is declared as `open` for extension.\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\nextends \"pigeon.pkl\"    // <1>\n\nname = \"Parrot\"         // <2>\ndiet = \"Berries\"        // <3>\nextinct = false         // <4>\n\nfunction say() = \"Pkl is great!\" // <5>\n----\n<1> Module `parrot` extends module `pigeon`, inheriting all of its members.\n<2> `parrot` overrides `name`.\n<3> `parrot` overrides `diet`.\n<4> `parrot` defines a new property named `extinct`.\n<5> `parrot` defines a new function named `say`.\n\nA module is extended by way of an _extends clause_, which consists of the keyword `extends` followed by the <<Module URIs,module URI>> of the module to extend.\nThe extends clause comes after the module clause (if present) and before any import clauses.\nOnly modules declared as `open` can be extended.\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\nmodule parrot\n\nextends \"pigeon.pkl\"\n\nimport \"other.pkl\"\n\nname = \"Parrot\"\ndiet = \"Berries\"\nextinct = false\n\nfunction say() = \"Pkl is great!\"\n----\n\nAt most one extends clause is permitted.\nA module cannot have both an amends clause and an extends clause.\n\nExtending a module implicitly defines a new module class that extends the original module's class.\n\n[[import-module]]\n=== Importing a Module\n\nA module import makes the imported module accessible to the importing module.\nA module is imported by way of either an <<import-clause,import clause>>, or an <<import-expression,import expression>>.\n\n[[import-clause]]\n==== Import Clauses\n\nAn import clause consists of the keyword `import` followed by the <<Module URIs,module URI>> of the module to import.\nAn import clause comes after module, amends and extends clauses (if present), and before the module body:\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\nmodule parrot\n\namends \"pigeon.pkl\"\n\nimport \"module1.pkl\"\nimport \"module2.pkl\"\n\nname = \"Parrot\"\n----\n\nMultiple import clauses are permitted.\n\nA module import implicitly defines a new `const local` property through which the imported module can be accessed.\n(Remember that modules are regular objects.)\nThe name of this property, called _import name_, is constructed from the module URI as follows:\n\n. Strip the URI scheme, including the colon (`:`).\n. Strip everything up to and including the last forward slash (`/`).\n. Strip any trailing `.pkl` file extension.\n\nHere are some examples:\n\n.Local file import\n[source%parsed,{pkl}]\n----\nimport \"modules/pigeon.pkl\" // relative to current module\n\nname = pigeon.name\n----\n\n.HTTPS import\n[source%parsed,{pkl}]\n----\nimport \"https://mycompany.com/modules/pigeon.pkl\"\n\nname = pigeon.name\n----\n\n.Standard library import\n[source%parsed,{pkl}]\n----\nimport \"pkl:math\"\n\npi = math.Pi\n----\n\n.Package import\n[source%parsed,{pkl}]\n----\nimport \"package://example.com/birds@1.0.0#/sparrow.pkl\"\n\nname = sparrow.name\n----\n\nBecause its members are automatically visible in every module, the `pkl:base` module is typically not imported.\n\nOccasionally, the default import name for a module may not be convenient or appropriate:\n\n* If not a valid identifier, the import name needs to be enclosed in backticks on each use, for example, `&#96;my-module&#96;.someMember`.\n* The import name may clash with other names in the importing module.\n\nIn such a case, a different import name can be chosen:\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\nimport \"pigeon.pkl\" as piggy\n\nname = \"Parrot\"\ndiet = piggy.diet\n----\n\n[TIP]\n.What makes a good module file name?\n====\nWhen creating a new module, especially one intended for import into other modules, try to choose a module file name that makes a good import name:\n\n* short\n+\nLess than six characters, not counting the `.pkl` file extension, is a good rule of thumb.\n* valid identifier\n+\nStick to alphanumeric characters. Use an underscore (`_`) instead of a hyphen (`-`) as a name separator.\n* descriptive\n+\nAn import name should make sense on its own and when used in qualified member names.\n====\n\n[[import-expression]]\n==== Import Expressions (`import()`)\n\nAn import expression consists of the keyword `import`, followed by a <<Module URIs,module URI>> wrapped in parentheses:\n\n[source,{pkl}]\n----\nmodule birds\n\npigeon = import(\"pigeon.pkl\")\nparrot = import(\"parrot.pkl\")\n----\n\nUnlike import clauses, import expressions only import a value, and do not import a type.\nA type is a name that can be used in type positions, for example, as a type annotation.\n\n[[globbed-imports]]\n=== Globbed Imports\n\nMultiple modules may be imported at once with `import*`.\nWhen importing multiple modules, a glob pattern is used to match against existing resources.\nA globbed import evaluates to a `Mapping`, where keys are the expanded form of the glob and values are import expressions on each individual module.\n\nGlobbed imports can be expressed as either a clause or as an expression.\nWhen expressed as a clause, they follow the same naming rules as a normal <<import-clause,import clause>>: they introduce a local property equal to the last path segment without the `.pkl` extension.\nA globbed import clause cannot be used as a type.\n\n[source,{pkl}]\n----\nimport* \"birds/*.pkl\" as allBirds // <1>\nimport* \"reptiles/*.pkl\" <2>\n\nbirds = import*(\"birds/*.pkl\") // <3>\n----\n<1> Globbed import clause\n<2> Globbed import clause without an explicit name (will import the name `*`)\n<3> Globbed import expression\n\nAssuming that a file system contains these files:\n\n[source,txt]\n----\n.\n├── birds/\n│  ├── pigeon.pkl\n│  ├── parrot.pkl\n│  └── falcon.pkl\n└── index.pkl\n----\n\nThe following two snippets are logically identical:\n\n.index.pkl\n[source,{pkl}]\n----\nbirds = import*(\"birds/*.pkl\")\n----\n\n.index.pkl\n[source,{pkl}]\n----\nbirds = new Mapping {\n  [\"birds/pigeon.pkl\"] = import(\"birds/pigeon.pkl\")\n  [\"birds/parrot.pkl\"] = import(\"birds/parrot.pkl\")\n  [\"birds/falcon.pkl\"] = import(\"birds/falcon.pkl\")\n}\n----\n\nBy default, only the `file` and `package` schemes are globbable.\nGlobbing another scheme will cause Pkl to throw.\n\nPkl can be extended to provide custom globbable schemes through the link:{uri-pkl-core-ModuleKey}[ModuleKey]\nSPI.\n\nWhen globbing within <<package-asset-uri,packages>>, only the asset path (the fragment section) is globbable.\nOtherwise, characters are interpreted verbatim, and not treated as glob wildcards.\n\nFor details on how glob patterns work, refer to <<glob-patterns>> in the Advanced Topics section.\n\nNOTE: When globbing files, symbolic links are not followed. Additionally, the `.` and `..` entries are skipped. +\nThis behavior is similar to the behavior of Bash with `shopt -s dotglob` enabled.\n\n=== Security Checks\n\nWhen attempting to directly evaluate a module, as in `pkl eval myModule.pkl`,\nthe following security checks are performed:\n\n* The module URI is checked against the module allowlist (`--allowed-modules`).\n\nThe module allowlist is a comma-separated list of regular expressions.\nFor access to be granted, at least one regular expression must match a prefix of the module URI.\nFor example, the allowlist `file:,https:` grants access to any module whose URI starts with `file:` or `https:`.\n\nWhen a module attempts to load another module (via `amends`, `extends`, or `imports`),\nthe following security checks are performed:\n\n* The target module URI is checked against the module allowlist (`--allowed-modules`).\n* The source and target modules' _trust levels_ are determined and compared.\n\nFor access to be granted, the source module's trust level must be greater than or equal to the target module's trust level.\nBy default, there are five trust levels, listed from highest to lowest:\n\n. `repl:` modules (code evaluated in the REPL)\n. `file:` modules\n. `modulepath:` modules\n. All other modules (for example `https:`)\n. `pkl:` modules (standard library)\n\nFor example, this means that `file:` modules can import `https:` modules, but not the other way around.\n\nIf a module URI is resolved in multiple steps, all URIs are subject to the above security checks.\nAn example of this is an HTTPS URL that results in a redirect.\n\nPkl embedders can further customize security checks.\n\n[[module-output]]\n=== Module Output\n\nBy default, the output of evaluating a module is the entire module rendered as Pcf.\nThere are two ways to change this behavior:\n\n1. _Outside_ the language, by using the `--format` CLI option or the `outputFormat` Gradle task property.\n2. _Inside_ the language, by configuring a module's `output` property.\n\n==== CLI\n\nGiven the following module:\n\n[source%tested,{pkl}]\n.config.pkl\n----\na = 10\nb {\n  c = 20\n}\n----\n\n`pkl eval config.pkl`, which is shorthand for `pkl eval --format pcf config.pkl`, renders the module as Pcf:\n\n[source,{pkl}]\n----\na = 10\nb {\n  c = 20\n}\n----\n\n`pkl eval --format yaml config.pkl` renders the module as YAML:\n\n[source,yaml]\n----\na: 10\nb:\n  c: 20\n----\n\nLikewise, `pkl eval --format json config.pkl` renders the module as JSON.\n\n[[in-language]]\n==== In-language\n\nNow let's do the same -- and more -- inside the language.\n\nModules have an link:{uri-stdlib-baseModule}/Module#output[output] property that controls what the module's output is and how that output is rendered.\n\nTo control *what* the output is, set the link:{uri-stdlib-baseModule}/ModuleOutput#value[output.value] property:\n\n[source%parsed,{pkl}]\n----\na = 10\nb {\n  c = 20\n}\noutput {\n  value = b // defaults to `outer`, which is the entire module\n}\n----\n\nThis produces:\n\n[source,{pkl}]\n----\nc = 20\n----\n\nTo control _how_ the output is rendered, set the link:{uri-stdlib-baseModule}/ModuleOutput#renderer[output.renderer] property:\n\n[source%parsed,{pkl}]\n----\na = 10\nb {\n  c = 20\n}\n\noutput {\n  renderer = new YamlRenderer {}\n}\n----\n\nThe standard library provides these renderers:\n\n* link:{uri-stdlib-baseModule}/JsonRenderer[JsonRenderer]\n* link:{uri-stdlib-jsonnetModule}/Renderer[jsonnet.Renderer]\n* link:{uri-stdlib-baseModule}/PcfRenderer[PcfRenderer]\n* link:{uri-stdlib-baseModule}/PListRenderer[PListRenderer]\n* link:{uri-stdlib-baseModule}/PropertiesRenderer[PropertiesRenderer]\n* link:{uri-stdlib-protobufModule}/Renderer[protobuf.Renderer]\n* link:{uri-stdlib-xmlModule}/Renderer[xml.Renderer]\n* link:{uri-stdlib-baseModule}/YamlRenderer[YamlRenderer]\n\nTo render a format that is not yet supported, you can implement your own renderer by extending the class link:{uri-stdlib-baseModule}/ValueRenderer[ValueRenderer].\n\nThe standard library renderers can be configured with _value converters_, which influence how particular values are rendered.\n\nFor example, since YAML does not have a standard way to represent data sizes, a plain `YamlRenderer` cannot render `DataSize` values.\nHowever, we can teach it to:\n\n[source%parsed,{pkl}]\n----\nquota {\n  memory = 100.mb\n  disk = 20.gb\n}\n\noutput {\n  renderer = new YamlRenderer {\n    converters {\n      [DataSize] = (size) -> \"\\(size.value) \\(size.unit)\"\n    }\n  }\n}\n----\n\nThis produces:\n\n[source,yaml]\n----\nquota:\n  memory: 100 MB\n  disk: 20 GB\n----\n\nIn addition to _class_-based converters, renderers also support _path_-based converters:\n\n[source%parsed,{pkl}]\n----\noutput {\n  renderer = new YamlRenderer {\n    converters {\n      [\"quota.memory\"] = (size) -> \"\\(size.value) \\(size.unit)\"\n      [\"quota.disk\"] = (size) -> \"\\(size.value) \\(size.unit)\"\n    }\n  }\n}\n----\n\nFor more on path-based converters, see {uri-stdlib-PcfRenderer-converters}[PcfRenderer.converters].\n\nSpecial <<annotations,Annotations>> may also be used to influence how class properties are rendered.\nThe `ConvertProperty` annotation (and subclasses of it) are automatically applied during.\nFor more on annotation-based converters, see link:{uri-stdlib-ConvertProperty}[ConvertProperty].\n\nSometimes it is useful to directly compute the final module output, bypassing `output.value` and `output.converters`.\nTo do so, set the link:{uri-stdlib-baseModule}/ModuleOutput#text[output.text] property to a String value:\n\n[source%parsed,{pkl}]\n----\noutput {\n  // defaults to `renderer.render(value)`\n  text = \"this is the final output\".toUpperCase()\n}\n----\n\nThis produces:\n\n[source]\n----\nTHIS IS THE FINAL OUTPUT\n----\n\n[[multiple-file-output]]\n==== Multiple File Output\n\nIt is sometimes desirable for a single module to produce multiple output files.\nThis is possible by configuring a module's link:{uri-stdlib-outputFiles}[`output.files`] property \n// suppress inspection \"AsciiDocLinkResolve\"\nand specifying the xref:pkl-cli:index.adoc#multiple-file-output-path[`--multiple-file-output-path`]\n(or `-m` for short) CLI option.\n\nHere is an example that produces a JSON and a YAML file:\n\n.birds.pkl\n[source%parsed,{pkl}]\n----\npigeon {\n  name = \"Pigeon\"\n  diet = \"Seeds\"\n}\nparrot {\n  name = \"Parrot\"\n  diet = \"Seeds\"\n}\noutput {\n  files {\n    [\"birds/pigeon.json\"] {\n      value = pigeon\n      renderer = new JsonRenderer {}\n    }\n    [\"birds/parrot.yaml\"] {\n      value = parrot\n      renderer = new YamlRenderer {}\n    }\n  }\n}\n----\n\nRunning `pkl eval -m output/ birds.pkl` produces the following output files:\n\n.output/birds/pigeon.json\n[source,json]\n----\n{\n  \"name\": \"Pigeon\",\n  \"diet\": \"Seeds\"\n}\n----\n\n.output/birds/parrot.yaml\n[source,yaml]\n----\nname: Parrot\ndiet: Berries\n----\n\nWithin `output.files`, \na key determines a file's path relative to `--multiple-file-output-path`, \nand a value determines the file's contents.\nIf a file's path resolves to a location outside `--multiple-file-output-path`, \nevaluation fails with an error.\nNon-existing parent directories are created.\n\n[[aggregating-module-outputs]]\n===== Aggregating Module Outputs\n\nA value within `output.files` can be another module's `output`.\nWith this, a module can aggregate the outputs of multiple other modules.\nHere is an example:\n\n.pigeon.pkl\n[source%parsed,{pkl}]\n----\nname = \"Pigeon\"\ndiet = \"Seeds\"\noutput {\n  renderer = new JsonRenderer {}\n}\n----\n\n.parrot.pkl\n[source%parsed,{pkl}]\n----\nname = \"Parrot\"\ndiet = \"Seeds\"\noutput {\n  renderer = new YamlRenderer {}\n}\n----\n\n.birds.pkl\n[source%parsed,{pkl}]\n----\nimport \"pigeon.pkl\"\nimport \"parrot.pkl\"\n\noutput {\n  files {\n    [\"birds/pigeon.json\"] = pigeon.output\n    [\"birds/parrot.yaml\"] = parrot.output\n  }\n}\n----\n\n[TIP]\n====\nWhen aggregating module outputs,\nthe appropriate file extensions can be obtained programmatically:\n\n.birds.pkl\n[source%parsed,{pkl}]\n----\nimport \"pigeon.pkl\"\nimport \"parrot.pkl\"\n\noutput {\n  files {\n    [\"birds/pigeon.\\(pigeon.output.renderer.extension)\"] = pigeon.output\n    [\"birds/parrot.\\(parrot.output.renderer.extension)\"] = parrot.output\n  }\n}\n----\n====\n\n[[null-values]]\n== Null Values\n\nThe keyword `null` indicates the absence of a value.\n`null` is an instance of link:{uri-stdlib-Null}[Null], a direct subclass of `Any`.\n\n=== Non-Null Operator\n\nThe `!!` (non-null) operator asserts that its operand is non-null.\nHere are some examples:\n\n[source%tested%error,{pkl}]\n----\nname = \"Pigeon\"\nnameNonNull = name!!  // <1>\n\nname2 = null\nname2NonNull = name2!! // <2>\n----\n<1> result: `\"Pigeon\"`\n<2> result: _Error: Expected a non-null value, but got `null`._\n\n=== Null Coalescing\n\nThe `??` (null coalescing) operator fills in a default for a `null` value.\n\n[source,{pkl-expr}]\n----\nvalue ?? default\n----\n\nThe above expression evaluates to `value` if `value` is non-null, and to `default` otherwise.\nHere are some examples:\n\n[source%tested,{pkl}]\n----\nname = \"Pigeon\"\nnameOrParrot = name ?? \"Parrot\"  // <1>\n\nname2 = null\nname2OrParrot = name2 ?? \"Parrot\" // <2>\n----\n<1> result: `\"Pigeon\"`\n<2> result: `\"Parrot\"`\n\n[NOTE]\n.Default non-null behavior\n====\nMany languages allow `null` for (almost) every type, but Pkl does not.\nAny type can be extended to include `null` by appending `?` to the type.\n\nFor example, `parrot: Bird` will always be non-null, but `pigeon: Bird?` could be `null` - and _is_ by default,\nif `pigeon` is never amended. This means if you try to coalesce a (non-nullable) typed variable,\nthe result is always that variable’s value.\n\nAs per our example `parrot ?? pigeon == parrot` always holds,\nbut `pigeon ?? parrot` could either be `pigeon` or `parrot`,\ndepending on whether `pigeon` was ever amended with a non-null value.\n====\n\n[[null-propagation]]\n=== Null Propagation\n\nThe `?.` (null propagation) operator provides null-safe access to a member whose receiver may be `null`.\n\n[source,{pkl-expr}]\n----\nvalue?.member\n----\n\nThe above expression evaluates to `value.member` if `value` is non-null, and to `null` otherwise.\nHere are some examples:\n\n[source%tested,{pkl}]\n----\nname = \"Pigeon\"\nnameLength = name?.length          // <1>\nnameUpper = name?.toUpperCase()    // <2>\n\nname2 = null\nname2Length = name2?.length        // <3>\nname2Upper = name2?.toUpperCase()  // <4>\n----\n<1> result: `6`\n<2> result: `\"PIGEON\"`\n<3> result: `null`\n<4> result: `null`\n\nThe `?.` operator is often combined with `??`:\n\n[source%tested,{pkl}]\n----\nname = null\nnameLength = name?.length ?? 0 // <1>\n----\n<1> result: `0`\n\n=== ifNonNull Method\n\nThe link:{uri-stdlib-ifNonNull}[ifNonNull()] method is a generalization of the <<null-propagation,null propagation>> operator.\n\n[source%parsed,{pkl-expr}]\n----\nname.ifNonNull((it) -> doSomethingWith(it))\n----\n\nThe above expression evaluates to `doSomethingWith(name)` if `name` is non-null, and to `null` otherwise.\nHere are some examples:\n\n[source%tested,{pkl}]\n----\nname = \"Pigeon\"\nnameWithTitle = name.ifNonNull((it) -> \"Dr.\" + it)  // <1>\n\nname2 = null\nname2WithTitle = name2.ifNonNull((it) -> \"Dr.\" + it) // <2>\n----\n<1> result: `\"Dr. Pigeon\"`\n<2> result: `null`\n\n=== NonNull Type Alias\n\nTo express that a property can have any type except `Null`, use the `NonNull` <<type-aliases,type alias>>:\n\n[source,{pkl}]\n----\nx: NonNull\n----\n\n[[if-expressions]]\n== If Expressions\n\nAn `if` expression serves the same role as the ternary operator (`? :`) in other languages.\nEvery `if` expression must have an `else` branch.\n\n[source%tested,{pkl}]\n----\nnum = if (2 + 2 == 5) 1984 else 42 // <1>\n----\n<1> result: `42`\n\n[[resources]]\n== Resources\n\nPkl programs can read external resources, such as environment variables or text files.\n\nTo read a resource, use a `read` expression:\n\n[source%parsed,{pkl}]\n----\npath = read(\"env:PATH\")\n----\n\nBy default, the following resource URI schemes are supported:\n\nenv: :: Reads an environment variable.\nResult type is `String`.\nprop: :: Reads an external property set via the `-p name=value` CLI option.\nResult type is `String`.\nfile: :: Reads a file from the file system.\nResult type is link:{uri-stdlib-Resource}[Resource].\nhttp(s): :: Reads an HTTP(S) resource.\nResult type is link:{uri-stdlib-Resource}[Resource].\nmodulepath: :: Reads a resource from the module path (`--module-path`) or JVM class path.\nResult type is link:{uri-stdlib-Resource}[Resource].\nSee <<module-path-uri,Module Path URI>> for further information.\npackage: :: Reads a resource from a _package_. Result type is link:{uri-stdlib-Resource}[Resource]. See <<package-asset-uri>> for further information.\n\nRelative resource URIs are resolved against the enclosing module's URI.\n\nResources are cached in memory on the first read.\nTherefore, subsequent reads are guaranteed to return the same result.\n\n[[nullable-reads]]\n=== Nullable Reads\n\nIf a resource does not exist or cannot be read, `read()` fails with an error.\nTo recover from the absence of a resource, use `read?()` instead,\nwhich returns `null` for absent resources:\n\n[source%parsed,{pkl}]\n----\nport = read?(\"env:PORT\")?.toInt() ?? 1234\n----\n\n[[globbed-reads]]\n=== Globbed Reads\n\nMultiple resources may be read at the same time with `read*()`.\nWhen reading multiple resources, a glob pattern is used to match against existing resources.\nA globbed read returns a `Mapping`, where the keys are the expanded form of the glob, and values are `read` expressions on each individual resource.\n\nAssuming that a file system contains these files:\n\n[source,txt]\n----\n.\n├── birds/\n│  ├── pigeon.pkl\n│  ├── parrot.pkl\n│  └── falcon.pkl\n└── index.pkl\n----\n\nThe following two snippets are logically identical:\n\n.index.pkl\n[source%parsed,{pkl}]\n----\nbirdFiles = read*(\"birds/*.pkl\")\n----\n\n.index.pkl\n[source%parsed,{pkl}]\n----\nbirdFiles = new Mapping {\n  [\"birds/pigeon.pkl\"] = read(\"birds/pigeon.pkl\")\n  [\"birds/parrot.pkl\"] = read(\"birds/parrot.pkl\")\n  [\"birds/falcon.pkl\"] = read(\"birds/falcon.pkl\")\n}\n----\n\nBy default, the following schemes support globbing:\n\n* `modulepath`\n* `file`\n* `env`\n* `prop`\n\nGlobbing other resources results in an error.\n\nFor details on how glob patterns work, reference <<glob-patterns>> in the Advanced Topics section.\n\nNOTE: When globbing files, symbolic links are not followed. Additionally, the `.` and `..` entries are skipped. +\nThis behavior is similar to the behavior of Bash with `shopt -s dotglob` enabled.\n\n[NOTE]\n====\nThe `env` and `prop` schemes are considered opaque, as they do not have traditional hierarchical elements like a host, path, or query string.\n\nWhile globbing is traditionally viewed as a way to match elements in a file system, a glob pattern is simply a way to match strings.\nThus, environment variables and external properties can be globbed, where their names get matched according to the rules described by the glob pattern.\n\nTo match all values within these schemes, use the `+++**+++` wildcard.\nThis has the effect of matching names that contain a forward slash too (`/`).\nFor example, the expression `read*(\"+++env:**+++\")` will evaluate to a Mapping of all environment variables.\n====\n\n=== Extending resource readers\n\nWhen Pkl is embedded within another runtime, it can be extended to read other kinds of resources.\n\nWhen embedded into a JVM application, new resources may be read by implementing the link:{uri-pkl-core-ResourceReader}[ResourceReader] SPI.\nWhen Pkl is embedded within Swift, new resources may be read by implementing the link:{uri-pkl-swift-resource-reader-docs}[ResourceReader] interface.\nWhen Pkl is embedded within Go, new resources may be read by implementing the link:{uri-pkl-go-resource-reader-docs}[ResourceReader] interface.\n\n=== Resource Allowlist\n\nWhen attempting to read a resource, the resource URI is checked against the resource allowlist (`--allowed-resources`).\nIn embedded mode, the allowlist is configured via an evaluator's link:{uri-pkl-core-SecurityManager}[SecurityManager].\n\nThe resource allowlist is a comma-separated list of regular expressions.\nFor access to be granted, at least one regular expression must match a prefix of the resource URI.\nFor example, the allowlist `file:,https:` grants access to any resource whose URI starts with `file:` or `https:`.\n\n[[errors]]\n== Errors\n\nBy design, errors are fatal in Pkl -- there is no way to recover from them.\nTo raise an error, use a `throw` expression:\n\n[source%tested%error,{pkl}]\n----\nmyValue = throw(\"You won't be able to recover from this one!\") // <1>\n----\n<1> `myValue` never receives a value because the program exits.\n\nThe error message is printed to the console and the program exits.\nIn embedded mode, a link:{uri-pkl-core-PklException}[PklException] is thrown.\n\n[[debugging]]\n== Debugging\n\nWhen debugging Pkl code, it can be useful to print the value of an expression.\nTo do so, use a `trace` expression:\n\n[source%tested,{pkl}]\n----\nnum1 = 42\nnum2 = 16\nres = trace(num1 * num2)\n----\n\nTracing an expression does not affect its result, but prints both its source code and result on standard error:\n\n[source,shell]\n----\npkl: TRACE: num1 * num2 = 672 (at file:///some/module.pkl, line 42)\n----\n\n[[advanced-topics]]\n== Advanced Topics\n\nThis section discusses language features that are generally more relevant to template and library authors than template consumers.\n\n<<meaning-of-new,Meaning of `new`>> +\n<<let-expressions,Let Expressions>> +\n<<type-tests,Type Tests>> +\n<<type-casts,Type Casts>> +\n<<lists,Lists>> +\n<<sets,Sets>> +\n<<maps,Maps>> +\n<<regular-expressions,Regular Expressions>> +\n<<type-aliases,Type Aliases>> +\n<<type-annotations,Type Annotations>> +\n<<anonymous-functions,Anonymous Functions>> +\n<<amend-null,Amending Null Values>> +\n<<when-generators,When Generators>> +\n<<for-generators,For Generators>> +\n<<spread-syntax,Spread Syntax>> +\n<<member-predicates,Member Predicates (`[[...]]`)>> +\n<<this-keyword,`this` Keyword>> +\n<<outer-keyword,`outer` Keyword>> +\n<<super-keyword,`super` Keyword>> +\n<<module-keyword,`module` Keyword>> +\n<<glob-patterns,Glob Patterns>> +\n<<doc-comments,Doc Comments>> +\n<<annotations,Annotations>> +\n<<name-resolution,Name Resolution>> +\n<<reserved-keywords,Reserved Keywords>> +\n<<blank-identifiers,Blank Identifiers>> +\n<<projects,Projects>> +\n<<external-readers,External Readers>> +\n<<mirroring_packages,Mirroring packages>>\n\n[[meaning-of-new]]\n=== Meaning of `new`\n\nObjects in Pkl always <<amending-objects, amends>> _some_ value.\nThe `new` keyword is a special case of amending where a contextual value is amended.\nIn Pkl, there are two forms of `new` objects:\n\n* `new` with explicit type information, for example, `new Foo {}`.\n* `new` without type information, for example, `new {}`.\n\n==== Type defaults\n\nTo understand instantiation cases without explicit parent or type information, it's important to first understand implicit default values.\nWhen a property is declared in a module or class but is not provided an explicit default value, the property's default value becomes the type's default value.\nSimilarly, when `Listing` and `Mapping` types are declared with explicit type arguments for their element or value, their `default` property amends that declared type.\nWhen `Listing` and `Mapping` types are declared without type arguments, their `default` property amends an empty `Dynamic` object.\nSome types, including `Pair` and primitives like `String`, `Number`, and `Boolean` have no default value; attempting to render such a property results in the error \"Tried to read property `<name>` but its value is undefined\".\n\n[source,{pkl}]\n----\nclass Bird {\n  name: String = \"polly\"\n}\n\nbird: Bird // <1>\nbirdListing: Listing<Bird> // <2>\nbirdMapping: Mapping<String, Bird> // <3> \n----\n<1> Without an explicit default value, this property has default value `new Bird { name = \"polly\" }`\n<2> With an explicit element type argument, this property's default value is equivalent to `new Listing<Bird> { default = (_) -> new Bird { name = \"polly\" } }`\n<3> With an explicit value type argument, this property's default value is equivalent to `new Mapping<String, Bird> { default = (_) -> new Bird { name = \"polly\" } }`\n\n==== Explicitly Typed `new`\n\nInstantiating an object with `new <type>` results in a value that amends the specified type's default value.\nNotably, creating a `Listing` element or assigning a `Mapping` entry value with an explicitly typed `new` ignores the object's `default` value.\n\n[source,{pkl}]\n----\nclass Bird {\n  /// The name of the bird\n  name: String\n\n  /// Whether this is a bird of prey or not.\n  isPredatory: Boolean?\n}\n\nnewProperty = new Bird { // <1>\n  name = \"Warbler\"\n}\n\nsomeListing = new Listing<Bird> {\n  default {\n    isPredatory = true\n  }\n  new Bird { // <2>\n    name = \"Sand Piper\"\n  }\n}\n\nsomeMapping = new Mapping<String, Bird> {\n  default {\n    isPredatory = true\n  }\n  [\"Penguin\"] = new Bird { // <3>\n    name = \"Penguin\"\n  }\n}\n----\n<1> Assigning a `new` explicitly-typed value to a property.\n<2> Adding an `new` explicitly-typed `Listing` element.\nThe value will not have property `isPredatory = true` as the `default` property of the `Listing` is not used.\n<3> Assigning a `new` explicitly-typed value to a `Mapping` entry.\nThe value will not have property `isPredatory = true` as the `default` property of the `Mapping` is not used.\n\n==== Implicitly Typed `new`\n\nWhen using the implicitly typed `new` invocation, there is no explicit parent value to amend.\nIn these cases, Pkl infers the amend operation's parent value based on context:\n\n* When assigning to a declared property, the property's default value is amended (<<amend-null, including `null`>>).\nIf there is no type associated with the property, an empty `Dynamic` object is amended.\n* When assigning to an entry (e.g. a `Mapping` member) or element (e.g. a `Listing` member), the enclosing object's `default` property is applied to the corresponding index or key, respectively, to produce the value to be amended.\n* In other cases, evaluation fails with the error message \"Cannot tell which parent to amend\".\n\nThe type annotation of a <<methods,method>> parameter is not used for inference.\nIn this case, the argument's type should be specified explicitly.\n\n[source,{pkl}]\n----\nclass Bird {\n  name: String\n\n  function listHatchlings(items: Listing<String>): Listing<String> = new {\n    for (item in items) {\n      \"\\(name):\\(item)\"\n    }\n  }\n}\n\ntypedProperty: Bird = new { // <1>\n  name = \"Swift\"\n}\n\nuntypedProperty = new { // <2>\n  hello = \"world\"\n}\n\ntypedListing: Listing<Bird> = new {\n  new { // <3>\n    name = \"Kite\"\n  }\n}\n\nuntypedListing: Listing = new {\n  new { // <4>\n    hello = \"there\"\n  }\n}\n\ntypedMapping: Mapping<String, Bird> = new {\n  default { entryKey ->\n    name = entryKey\n  }\n  [\"Saltmarsh Sparrow\"] = new { // <5>\n    name = \"Sharp-tailed Sparrow\"\n  }\n}\n\namendedMapping = (typedMapping) {\n  [\"Saltmarsh Sparrow\"] = new {} // <6>\n}\n\nclass Aviary {\n  birds: Listing<Bird> = new {\n    new { name = \"Osprey\" }\n  }\n}\n\naviary: Aviary = new {\n  birds = new { // <7>\n    new { name = \"Kiwi\" }\n  }\n}\n\nswiftHatchlings = typedProperty.listHatchlings(new { \"Poppy\"; \"Chirpy\" }) // <8>\n----\n<1> Assignment to a property with an explicitly declared type, amending `new Bird {}`.\n<2> Assignment to an undeclared property in module context, amending `new Dynamic {}`.\n<3> `Listing` element creation, amending implicit `default`, `new Bird {}`.\n<4> `Listing` element creation, amending implicit `default`, `new Dynamic {}`.\n<5> `Mapping` value assignment, amending the result of applying `default` to `\"Saltmarsh Sparrow\"`, `new Bird { name = \"Saltmarsh Sparrow\" }`.\n<6> `Mapping` value assignment _replacing_ the parent's entry, amending the result of applying `default` to `\"Saltmarsh Sparrow\"`, `new Bird { name = \"Saltmarsh Sparrow\" }`.\n<7> Amending the property default value `new Listing { new Bird { name = \"Osprey\" } }`; the result contains both birds.\n<8> Error: Cannot tell which parent to amend.\n\n[[let-expressions]]\n=== Let Expressions\n\nA `let` expression is Pkl's version of an (immutable) local variable.\nIts syntax is:\n\n[source]\n----\nlet (<name> = <value>) <expr>\n----\n\nA `let` expression is evaluated as follows:\n\n. `<name>` is bound to `<value>`, itself an expression.\n. `<expr>` is evaluated, which can refer to `<value>` by its `<name>` (this is the point).\n. The result of <expr> becomes the result of the overall expression.\n\nHere is an example:\n\n[source%tested,{pkl}]\n----\nbirdDiets =\n  let (diets = List(\"Seeds\", \"Berries\", \"Mice\"))\n    List(diets[2], diets[0]) // <1>\n----\n<1> result: `birdDiets = List(\"Mice\", \"Seeds\")`\n\n`let` expressions serve two purposes:\n\n- They introduce a human-friendly name for a potentially complex expression.\n- They evaluate a potentially expensive expression that is used in multiple places only once.\n\n`let` expressions can have type annotations:\n\n[source%tested,{pkl}]\n----\nbirdDiets = \n  let (diets: List<String> = List(\"Seeds\", \"Berries\", \"Mice\"))\n    diets[2] + diets[0] // <1>\n----\n<1> result: `birdDiets = List(\"Mice\", \"Seeds\")`\n\n`let` expressions can be stacked:\n\n[source%tested,{pkl}]\n----\nbirdDiets = \n  let (birds = List(\"Pigeon\", \"Barn owl\", \"Parrot\"))\n  let (diet = List(\"Seeds\", \"Mice\", \"Berries\"))\n    birds.zip(diet) // <1>\n----\n<1> result: `birdDiets = List(Pair(\"Pigeon\", \"Seeds\"), Pair(\"Barn owl\", \"Mice\"), Pair(\"Parrot\", \"Berries\"))`\n\n[[type-tests]]\n=== Type Tests\n\nTo test if a value conforms to a type, use the _is_ operator.\n\nAll the following tests hold:\n\n[source%tested,{pkl}]\n----\ntest1 = 42 is Int\ntest2 = 42 is Number\ntest3 = 42 is Any\ntest4 = !(42 is String)\n\nopen class Base\nclass Derived extends Base\n\nbase = new Base {}\n\ntest5 = base is Base\ntest6 = base is Any\ntest7 = !(base is Derived)\n\nderived = new Derived {}\n\ntest8 = derived is Derived\ntest9 = derived is Base\ntest10 = derived is Any\n----\n\nA value can be tested against any type, not just a class:\n\n[source,{pkl}]\n----\ntest1 = email is String(contains(\"@\")) // <1>\ntest2 = map is Map<Int, Base> // <2>\ntest3 = name is \"Pigeon\"|\"Barn owl\"|\"Parrot\" // <3>\n----\n<1> `email` is tested for being a string that contains a `@` sign\n<2> `map` is tested for being a map from `Int` to `Base` values\n<3> `name` is tested for being one of `\"Pigeon\"`, `\"Barn owl\"`, or `\"Parrot\"`\n\n[[type-casts]]\n=== Type Casts\n\nThe _as_ (type cast) operator performs a runtime type check on its operand.\nIf the type check succeeds, the operand is returned as-is; otherwise, an error is thrown.\n\n[source%tested,{pkl}]\n----\nbirds {\n  new { name = \"Pigeon\" }\n  new { name = \"Barn owl\" }\n}\nnames = birds.toList().map((it) -> it.name) as List<String>\n----\n\nAlthough type casts are never mandatory in Pkl, they occasionally help humans and tools better understand an expression's type.\n\n[[lists]]\n=== Lists\n\nA value of type link:{uri-stdlib-List}[List] is an ordered, indexed collection of _elements_.\n\nA list's elements have zero-based indexes and are eagerly evaluated.\n\n[TIP]\n.When to use List vs. <<listings,Listing>>\n====\n* When a collection of elements needs to be specified literally, use a listing.\n* When a collection of elements needs to be transformed in a way that cannot be achieved by <<amending-listings,amending>> a listing, use a list.\n* If in doubt, use a listing.\n\nTemplates and schemas should almost always use listings instead of lists.\nNote that listings can be converted to lists when the need arises.\n====\n\nLists are constructed with the `List()` methodfootnote:soft-keyword[Strictly speaking, `List`, `Set`, and `Map` are currently soft keywords. The goal is to eventually turn them into regular standard library methods.]:\n\n[source%tested,{pkl}]\n----\nlist1 = List() // <1>\nlist2 = List(1, 2, 3) // <2>\nlist3 = List(1, \"x\", 5.min, List(1, 2, 3)) // <3>\n----\n<1> result: empty list\n<2> result: list of length 3\n<3> result: heterogeneous list whose last element is another list\n\nTo concatenate lists, use the `+` operator:\n\n[source%tested,{pkl-expr}]\n----\nList(1, 2) + List(3, 4) + List(5)\n----\n\nTo access a list element by index, use the `[]` (subscript) operator:\n\n[source%tested,{pkl}]\n----\nlist = List(1, 2, 3, 4)\nlistElement = list[2] // <1>\n----\n<1> result: `3`\n\nClass `List` offers a link:{uri-stdlib-List}[rich API].\nHere are just a few examples:\n\n[source%tested,{pkl}]\n----\nlist = List(1, 2, 3, 4)\nres1 = list.contains(3) // <1>\nres2 = list.first // <2>\nres3 = list.rest // <3>\nres4 = list.reverse() // <4>\nres5 = list.drop(1).take(2) // <5>\nres6 = list.map((n) -> n * 3) // <6>\n----\n<1> result: `true`\n<2> result: `1`\n<3> result: `List(2, 3, 4)`\n<4> result: `List(4, 3, 2, 1)`\n<5> result: `List(2, 3)`\n<6> result: `List(3, 6, 9, 12)`\n\n[[sets]]\n=== Sets\n\nA value of type link:{uri-stdlib-Set}[Set] is a collection of unique _elements_.\n\nSets are constructed with the `Set()` methodfootnote:soft-keyword[]:\n\n[source%tested,{pkl}]\n----\nres1 = Set() // <1>\nres2 = Set(1, 2, 3) // <2>\nres3 = Set(1, 2, 3, 1) // <3>\nres4 = Set(1, \"x\", 5.min, List(1, 2, 3)) // <4>\n----\n<1> result: empty set\n<2> result: set of length 3\n<3> result: same set of length 3\n<4> result: heterogeneous set that contains a list as its last element\n\nSets retain the order of elements when constructed, which impacts how they are iterated over.\nHowever, this order is not considered when determining equality of two sets.\n\n[source%tested,{pkl}]\n----\nres1 = Set(4, 3, 2)\nres2 = res1.first // <1>\nres3 = res1.toListing() // <2>\nres4 = Set(2, 3, 4) == res1 // <3>\n----\n<1> result: `4`\n<2> result: `new Listing { 4; 3; 2 }`\n<3> result: `true`\n\nTo compute the union of sets, use the `+` operator:\n\n[source%tested,{pkl-expr}]\n----\nSet(1, 2) + Set(2, 3) + Set(5, 3) // <1>\n----\n<1> result: `Set(1, 2, 3, 5)`\n\nClass `Set` offers a link:{uri-stdlib-Set}[rich API].\nHere are just a few examples:\n\n[source%tested,{pkl}]\n----\nset = Set(1, 2, 3, 4)\nres1 = set.contains(3) // <1>\nres2 = set.drop(1).take(2) // <2>\nres3 = set.map((n) -> n * 3) // <3>\nres4 = set.intersect(Set(3, 9, 2)) // <4>\n----\n<1> result: `true`\n<2> result: `Set(2, 3)`\n<3> result: `Set(3, 6, 9, 12)`\n<4> result: `Set(3, 2)`\n\n[[maps]]\n=== Maps\n\nA value of type link:{uri-stdlib-Map}[Map] is a collection of _values_ indexed by _key_.\n\nA map's key-value pairs are called its _entries_.\nKeys and values are eagerly evaluated.\n\n[TIP]\n.When to use Map vs. <<mappings,Mapping>>\n====\n* When key-value style data needs to be specified literally, use a mapping.\n* When key-value style data needs to be transformed in ways that cannot be achieved by <<amending-mappings,amending>> a mapping, use a map.\n* If in doubt, use a mapping.\n\nTemplates and schemas should almost always use mappings instead of maps.\n(Note that mappings can be converted to maps when the need arises.)\n====\n\nMaps are constructed by passing alternating keys and values to the `Map()` methodfootnote:soft-keyword[]:\n\n[source%tested,{pkl}]\n----\nmap1 = Map() // <1>\nmap2 = Map(1, \"one\", 2, \"two\", 3, \"three\") // <2>\nmap3 = Map(1, \"x\", 2, 5.min, 3, Map(1, 2)) // <3>\n----\n<1> result: empty map\n<2> result: set of length 3\n<3> result: heterogeneous map whose last value is another map\n\nAny Pkl value can be used as a map key:\n\n[source%tested,{pkl-expr}]\n----\nMap(new Dynamic { name = \"Pigeon\" }, 10.gb)\n----\n\nMaps retain the order of entries when constructed, which impacts how they are iterated over.\nHowever, this order is not considered when determining equality of two maps.\n\n[source%tested,{pkl}]\n----\nres1 = Map(2, \"hello\", 1, \"world\")\nres2 = res1.entries.first // <1>\nres3 = res1.toMapping() // <2>\nres4 = res1 == Map(1, \"world\", 2, \"hello\") // <3>\n----\n<1> result: `Pair(2, \"hello\")`\n<2> result: `new Mapping { [2] = \"hello\"; [1] = \"world\" }`\n<3> result: `true`\n\nTo merge maps, use the `+` operator:\n\n[source%tested,{pkl}]\n----\ncombinedMaps = Map(1, \"one\") + Map(2, \"two\", 1, \"three\") + Map(4, \"four\") // <1>\n----\n<1> result: `Map(1, \"three\", 2, \"two\", 4, \"four\")`\n\nTo access a value by key, use the `[]` (subscript) operator:\n\n[source%tested,{pkl}]\n----\nmap = Map(\"Pigeon\", 5.gb, \"Parrot\", 10.gb)\nparrotValue = map[\"Parrot\"] // <1>\n----\n<1> result: `10.gb`\n\nClass `Map` offers a link:{uri-stdlib-Map}[rich API].\nHere are just a few examples:\n\n[source%tested,{pkl}]\n----\nmap = Map(\"Pigeon\", 5.gb, \"Parrot\", 10.gb)\nres1 = map.containsKey(\"Parrot\") // <1>\nres2 = map.containsValue(8.gb) // <2>\nres3 = map.isEmpty // <3>\nres4 = map.length // <4>\nres5 = map.getOrNull(\"Falcon\") // <5>\n----\n<1> result: `true`\n<2> result: `false`\n<3> result: `false`\n<4> result: `2`\n<5> result: `null`\n\n[[bytes]]\n=== Bytes\n\nA value of type `Bytes` is a sequence of `UInt8` elements.\n\n`Bytes` can be constructed by passing byte values into the constructor.\n\n[source,pkl]\n----\nbytes1 = Bytes(0xff, 0x00, 0x3f) // <1>\nbytes2 = Bytes() // <2>\n----\n<1> Result: a `Bytes` with 3 elements\n<2> Result: an empty `Bytes`\n\n`Bytes` can also be constructed from a base64-encoded string, via `base64DecodedBytes`:\n\n[source,pkl]\n----\nbytes3 = \"cGFycm90\".base64DecodedBytes // <1>\n----\n<1> Result: `Bytes(112, 97, 114, 114, 111, 116)`\n\n==== `Bytes` vs `List<UInt8>`\n\n`Bytes` is similar to `List<UInt8>` in that they are both sequences of `UInt8` elements.\nHowever, they are semantically distinct.\n`Bytes` represent binary data, and is typically rendered differently.\nFor example, they are rendered as `<data>` tags when using `PListRenderer`.\n\n`Bytes` also have different performance characteristics; a value of type `Bytes` tends to be managed as a contiguous memory block.\nThus, they are more compact and consume less memory.\nHowever, they are not optimized for transformations.\nFor example, given two values of size `M` and `N`, concatenating two `Bytes` values allocates O(M + N) space, whereas concatenating two `List` values allocates O(1) space.\n\n[[regular-expressions]]\n=== Regular Expressions\n\nA value of type link:{uri-stdlib-Regex}[Regex] is a regular expression with the same syntax and semantics as a link:{uri-javadoc-Pattern}[Java regular expression].\n\nRegular expressions are constructed with the link:{uri-stdlib-Regex-method}[Regex()] method:\n\n[source%tested,{pkl}]\n----\nemailRegex = Regex(#\"([\\w\\.]+)@([\\w\\.]+)\"#)\n----\n\n// note: first \\ on next line is asciidoc escape\nNotice the use of custom string delimiters `\\#\"` and `\"#`, which change the string's escape character from `\\` to `\\#`.\nAs a consequence, the regular expression's backslash escape character no longer requires escaping.\n\nTo test if a string fully matches a regular expression, use link:{uri-stdlib-matches}[String.matches()]:\n\n[source%tested,{pkl-expr}]\n----\n\"pigeon@example.com\".matches(emailRegex)\n----\n\nMany `String` methods accept either a `String` or `Regex` argument.\nHere is an example:\n\n[source%tested,{pkl}]\n----\nres1 = \"Pigeon<pigeon@example.com>\".contains(\"pigeon@example.com\")\nres2 = \"Pigeon<pigeon@example.com>\".contains(emailRegex)\n----\n\nTo find all matches of a regex in a string, use link:{uri-stdlib-Regex-match}[Regex.findMatchesIn()].\nThe result is a list of link:{uri-stdlib-RegexMatch}[RegexMatch] objects containing details about each match:\n\n[source%tested,{pkl}]\n----\nmatches = emailRegex.findMatchesIn(\"pigeon@example.com / falcon@example.com / parrot@example.com\")\nlist1 = matches.drop(1).map((it) -> it.start) // <1>\nlist2 = matches.drop(1).map((it) -> it.value) // <2>\nlist3 = matches.drop(1).map((it) -> it.groups[1].value) // <3>\n----\n<1> result: `List(0, 19, 40)` (the entire match, `matches[0]`, was dropped)\n<2> result: `List(\"pigeon@example.com\", \"falcon@example.com\", \"parrot@example.com\")`\n<3> result: `List(\"pigeon, falcon, parrot\")`\n\n[[type-aliases]]\n=== Type Aliases\n\nA _type alias_ introduces a new name for a (potentially complicated) type:\n\n[source%tested,{pkl}]\n----\ntypealias EmailAddress = String(matches(Regex(#\".+@.+\"#)))\n----\n\nOnce a type alias has been defined, it can be used in type annotations:\n\n[source%tested,{pkl}]\n----\nemail: EmailAddress = \"pigeon@example.com\"\n\nemailList: List<EmailAddress> = List(\"pigeon@example.com\", \"parrot@example.com\")\n----\n\nNew type aliases can be defined in terms of existing ones:\n\n[source%tested,{pkl}]\n----\ntypealias EmailList = List<EmailAddress>\n\nemailList: EmailList = List(\"pigeon@example.com\", \"parrot@example.com\")\n----\n\nType aliases can have type parameters:\n\n[source%tested,{pkl}]\n----\ntypealias StringMap<Value> = Map<String, Value>\n\nmap: StringMap<Int> = Map(\"Pigeon\", 42, \"Falcon\", 21)\n----\n\nCode generators have different strategies for dealing with type aliases:\n\n* the xref:java-binding:codegen.adoc[Java] code generator inlines them\n* the xref:kotlin-binding:codegen.adoc[Kotlin] code generator turns them into Kotlin type aliases.\n\nType aliases for unions of <<String Literal Types>> are turned into enum classes by both code generators.\n\n[[predefined-type-aliases]]\n==== Predefined Type Aliases\n\nThe _pkl.base_ module defines the following type aliases:\n\n* link:{uri-stdlib-Int8}[Int8] (-128 to 127)\n* link:{uri-stdlib-Int16}[Int16] (-32,768 to 32,767)\n* link:{uri-stdlib-Int32}[Int32] (-2,147,483,648 to 2,147,483,647)\n\n//-\n* link:{uri-stdlib-UInt8}[UInt8] (0 to 255)\n* link:{uri-stdlib-UInt16}[UInt16] (0 to 65,535)\n* link:{uri-stdlib-UInt32}[UInt32] (0 to 4,294,967,295)\n* link:{uri-stdlib-UInt}[UInt] (0 to 9,223,372,036,854,775,807)\n\n//-\n* link:{uri-stdlib-Uri}[Uri] (any String value)\n\nWARNING: Note that `UInt` has the same maximum value as `Int`, half of what would normally be expected.\n\nThe main purpose of the provided integer aliases is to enforce the range of an integer:\n\n[source%tested%error,{pkl}]\n----\nport: UInt16 = -1\n----\n\nThis gives:\n\n[source,shell,subs=\"quotes\"]\n----\nType constraint *isBetween(0, 65535)* violated.\nValue: -1\n----\n\nTo restrict a number to a custom range, use the link:{uri-stdlib-isBetween}[isBetween] method:\n\n[source%tested,{pkl}]\n----\nport: Int(isBetween(0, 1023)) = 443\n----\n\nNOTE: Remember that numbers are always instances of `Int` or `Float`.\nType aliases such as `UInt16` only check that numbers are within a certain range.\n\nThe xref:java-binding:codegen.adoc[Java] and xref:kotlin-binding:codegen.adoc[Kotlin] code generators\nmap predefined type aliases to the most suitable Java and Kotlin types.\nFor example, `UInt8` is mapped to `java.lang.Byte` and `kotlin.Byte`, and `Uri` is mapped to `java.net.URI`.\n\n[[type-annotations]]\n=== Type Annotations\n\nProperty and method definitions may optionally contain type annotations.\nType annotations serve the following purposes:\n\n* Documentation\n+ Type annotations help to document data models. They are included in any generated documentation.\n\n* Validation\n+ Type annotations are validated at runtime.\n\n* Defaults\n+ Type-annotated properties have <<default-values,Default Values>>.\n\n* Code Generation\n+ Type annotations enable statically typed access to configuration data through code generation.\n\n* Tooling\n+ Type annotations enable advanced tooling features such as code completion in editors.\n\n==== Class Types\n\nAny class can be used as a type:\n\n[source%parsed,{pkl}]\n----\nclass Bird {\n  name: String // <1>\n}\nbird: Bird // <2>\n----\n<1> Declares an instance property of type `String`.\n<2> Declares a module property of type `Bird`.\n\n==== Module Types\n\nAny module import can be used as type:\n\n[source%parsed,{pkl}]\n.bird.pkl\n----\nname: String\nlifespan: Int\n----\n\n[source%parsed,{pkl}]\n.birds.pkl\n----\nimport \"bird.pkl\"\n\npigeon: bird  // <1>\nparrot: bird // <1>\n----\n<1> Guaranteed to amend _bird.pkl_.\n\nAs a special case, the `module` keyword denotes the _enclosing_ module's type:\n\n[source%parsed,{pkl}]\n.bird.pkl\n----\nname: String\nlifespan: Int\nfriends: Listing<module>\n----\n\n[source%parsed,{pkl}]\n.pigeon.pkl\n----\namends \"bird.pkl\"\n\nname = \"Pigeon\"\nlifespan = 8\nfriends {\n  import(\"falcon.pkl\") // <1>\n}\n----\n<1> _falcon.pkl_ (not shown here) is guaranteed to amend _bird.pkl_.\n\n==== Type Aliases\n\nAny <<type-aliases,type alias>> can be used as a type:\n\n[source%parsed,{pkl}]\n----\ntypealias EmailAddress = String(contains(\"@\"))\n\nemail: EmailAddress // <1>\n\nemailList: List<EmailAddress> // <2>\n----\n<1> equivalent to `email: String(contains(\"@\"))` for type checking purposes\n<2> equivalent to `emailList: List<String(contains(\"@\"))>` for type checking purposes\n\n[[nullable-types]]\n==== Nullable Types\n\nClass types such as `Bird` (see above) do not admit `null` values.\nTo turn them into _nullable types_, append a question mark (`?`):\n\n[source%parsed,{pkl}]\n----\nbird: Bird = null   // <1>\nbird2: Bird? = null // <2>\n----\n<1> throws `Type mismatch: Expected a value of type Bird, but got null`\n<2> succeeds\n\nThe only class types that admit `null` values despite not ending in `?` are `Any` and `Null`.\n(`Null` is not very useful as a type because it _only_ admits `null` values.)\n`Any?` and `Null?` are equivalent to `Any` and `Null`, respectively.\nIn some languages, nullable types are also known as _optional types_.\n\n[[generic-types]]\n==== Generic Types\n\nThe following class types are _generic types_:\n\n* `Pair`\n* `Collection`\n* `Listing`\n* `List`\n* `Mapping`\n* `Set`\n* `Map`\n* `Function0`\n* `Function1`\n* `Function2`\n* `Function3`\n* `Function4`\n* `Function5`\n* `Class`\n\nA generic type has constituent types written in angle brackets (`<>`):\n\n[source%parsed,{pkl}]\n----\npair: Pair<String, Bird>    // <1>\ncoll: Collection<Bird>      // <2>\nlist: List<Bird>            // <3>\nset: Set<Bird>              // <4>\nmap: Map<String, Bird>      // <5>\nmapping: Mapping<String, Bird> // <6>\n----\n\n<1> a pair `String` and `Bird` as types for the first and second element, respectively\n<2> a collection of `Bird` elements\n<3> a list of `Bird` elements\n<4> a set of `Bird` elements\n<5> a map with `String` keys and `Bird` values\n<6> a mapping of `String` keys and `Bird` values\n\nOmitting the constituent types is equivalent to declaring them as `unknown`:\n\n[source%parsed,{pkl}]\n----\npair: Pair       // equivalent to `Pair<unknown, unknown>`\ncoll: Collection // equivalent to `Collection<unknown>`\nlist: List       // equivalent to `List<unknown>`\nset: Set         // equivalent to `Set<unknown>`\nmap: Map         // equivalent to `Map<unknown, unknown>`\nmapping: Mapping    // equivalent to `Mapping<unknown, unknown>`\n----\n\nThe `unknown` type is both a top and a bottom type.\nWhen a static type analyzer encounters an expression of `unknown` type,\nit backs off and trusts the user that they know what they are doing.\n\n[[union-types]]\n==== Union Types\n\nA value of type `A | B`, read \"A or B\", is either a value of type `A` or a value of type `B`.\n\n[source%tested,{pkl}]\n----\nclass Bird { name: String }\n\nbird1: String|Bird = \"Pigeon\"\nbird2: String|Bird = new Bird { name = \"Pigeon\" }\n----\n\nMore complex union types can be formed:\n\n[source%parsed,{pkl}]\n----\nfoo: List<Boolean|Number|String>|Bird\n----\n\nUnion types have no implicit default values, but an explicit type can be chosen using a `*` marker:\n[source%parsed,{pkl}]\n----\nfoo: \"a\"|\"b\"       // undefined. Will throw an error if not amended\nbar: \"a\"|*\"b\"      // default value will be taken from type \"b\"\nbaz: \"a\"|\"b\" = \"a\" // explicit value is given\nqux: String|*Int   // default taken from Int, but Int has no default. Will throw if not amended\n----\n\nUnion types often come in handy when writing schemas for legacy JSON or YAML files.\n\n[[string-literal-types]]\n==== String Literal Types\n\nA string literal type admits a single string value:\n\n[source%parsed,{pkl}]\n----\ndiet: \"Seeds\"\n----\n\nWhile occasionally useful on their own,\nstring literal types are often combined with <<Union Types>> to form enumerated types:\n\n[source%parsed,{pkl}]\n----\ndiet: \"Seeds\"|\"Berries\"|\"Insects\"\n----\n\nTo reuse an enumerated type, introduce a type alias:\n\n[source%parsed,{pkl}]\n----\ntypealias Diet = \"Seeds\"|\"Berries\"|\"Insects\"\ndiet: Diet\n----\n\nThe Java and Kotlin code generators turn type aliases for enumerated types into enum classes.\n\n[[nothing-type]]\n==== Nothing Type\n\nThe `nothing` type is the bottom type of Pkl's type system, the counterpart of top type `Any`.\n\nThe bottom type is assignment-compatible with every other type, and no other type is assignment-compatible with it.\n\nBeing assignment-compatible with every other type may sound too good to be true, but there is a catch -- the `nothing` type has no values!\n\nDespite being a lonely type, `nothing` has practical applications.\nFor example, it is used in the standard library's `TODO()` method:\n\n[source%tested,{pkl}]\n----\nfunction TODO(): nothing = throw(\"TODO\")\n----\n\nA `nothing` return type indicates that a method never returns normally but always throws an error.\n\n[[unknown-type]]\n==== Unknown Type\n\nThe `unknown` type footnote:[Also known as _dynamic type_. We do not use that term to avoid confusion with `Dynamic`, Pkl's dynamic object type.] is ``nothing``'s even stranger cousin: it is both a top and bottom type!\nThis makes `unknown` assignment-compatible with every other type, and every other type assignment-compatible with `unknown`.\n\nWhen a static type analyzer encounters a value of `unknown` type,\nit backs off and trusts the code's author to know what they are doing -- for example, whether a method called on the value exists.\n\n==== Progressive Disclosure\n\nIn the spirit of link:{uri-progressive-disclosure}[progressive disclosure], type annotations are optional in Pkl.\nOmitting a type annotation is equivalent to specifying the type `unknown`:\n\n[source%parsed,{pkl}]\n----\nlifespan = 42 // <1>\nmap: Map // <2>\nfunction say(name) = name // <3>\n----\n<1> shorthand for `lifespan: unknown = 42`\n    (As a dynamically typed language, Pkl does not try to statically infer types.)\n<2> shorthand for `map: Map<unknown, unknown> = Map()`\n<3> shorthand for `function say(name: unknown): unknown = name`\n\n[[default-values]]\n==== Default Values\n\nType-annotated properties have implicit \"empty\" default values depending on their type:\n\n[source%tested,{pkl}]\n----\nclass Bird\n\ncoll: Collection<Bird>         // = List() <1>\nlist: List<Bird>               // = List() <2>\nset: Set<Bird>                 // = Set() <3>\nmap: Map<String, Bird>         // = Map() <4>\nlisting: Listing<Bird>         // = new Listing { default = (index) -> new Bird {} } <5>\nmapping: Mapping<String, Bird> // = new Mapping { default = (key) -> new Bird {} } <6>\nobj: Bird                      // = new Bird {} <7>\nnullable: Bird?                // = Null(new Bird {}) <8>\nunion: *Bird|String            // = new Bird {} <9>\nstringLiteral: \"Pigeon\"        // = \"Pigeon\" <10>\nnullish: Null                  // = null <11>\n----\n\n<1> Properties of type `Collection` default to the empty list.\n<2> Properties of type `List` default to the empty list.\n<3> Properties of type `Set` default to the empty set.\n<4> Properties of type `Map` default to the empty map.\n<5> Properties of type `Listing<X>` default to an empty listing whose default element is the default for `X`.\n<6> Properties of type `Mapping<X, Y>` default to an empty mapping whose default value is the default for `Y`.\n<7> Properties of non-external class type `X` default to `new X {}`.\n<8> Properties of type `X?` default to `Null(x)` where `x` is the default for `X`.\n<9> Properties with a union type have no default value. By prefixing one of the types in a union with a `*`, the default of that type is chosen as the default for the union.\n<10> Properties with a string literal type default to the type's only value.\n<11> Properties of type `Null` default to `null`.\n\nSee <<amend-null, Amending Null Values>> for further information.\n\nProperties of the following types do not have implicit default values:\n\n* `abstract` classes, including `Any` and `NotNull`\n* Union types, unless an explicit default is given by prefixing one of the types with `*`.\n* `external` (built-in) classes, including:\n** `String`\n** `Boolean`\n** `Int`\n** `Float`\n** `Duration`\n** `DataSize`\n** `Pair`\n** `Regex`\n\nAccessing a property that neither has an (implicit or explicit) default value nor has been overridden throws an error:\n\n[source%tested%error,{pkl}]\n----\nname: String\n----\n\n[[type-constraints]]\n==== Type Constraints\n\nA type may be followed by a comma-separated list of _type constraints_ enclosed in round brackets (`()`).\nA type constraint is a boolean expression that must hold for the annotated element.\nType constraints enable advanced runtime validation that goes beyond the capabilities of static type checking.\n\n[source%tested,{pkl}]\n----\nclass Bird {\n  name: String(length >= 3)     //  <1>\n  parent: String(this != name)  //  <2>\n}\n\npigeon: Bird = new {\n  name = \"Pigeon\"\n  parent = \"Pigeon Sr.\" // <3>\n}\n----\n<1> Restricts `name` to have at least three characters.\n<2> The name of the bird (`this`) should not be the same as the name of the `parent`.\n<3> Note how `parent` is different from `name`. If they were the same, we would be thrown a constraint error.\n\nIn the following example, we define a `Bird` with a name of only two characters.\n\n[source%tested%error,{pkl}]\n----\npigeon: Bird = new {\n  // fails the constraint because [name] is less than 3 characters\n  name = \"Pi\"\n}\n----\n\nBoolean expressions are convenient for ad-hoc type constraints.\nAlternatively, type constraints can be given as lambda expressions accepting a single argument, namely the value to be validated.\nThis allows for the abstraction and reuse of type constraints.\n\n[source%tested,{pkl}]\n----\nclass Project {\n  local emailAddress = (str) -> str.matches(Regex(#\".+@.+\"#))\n  email: String(emailAddress)\n}\n\nproject: Project = new {\n  email = \"projectPigeon@example.com\"\n}\n----\n\n[source%tested%error,{pkl}]\n----\nproject: Project = new {\n  // fails the constraint because `\"projectPigeon-example.com\"` doesn't match the regular expression.\n  email = \"projectPigeon-example.com\"\n}\n----\n\n===== Composite Type Constraints\n\nA composite type can have type constraints for the overall type, its constituent types, or both.\n\n[source%tested,{pkl}]\n----\nclass Project {\n  local emailAddress = (str) -> str.matches(Regex(#\".+@.+\"#))\n  // constrain the nullable type's element type\n  type: String(contains(\"source\"))?\n  // constrain the map type and its key/value types\n  contacts: Map<String(!isEmpty), String(emailAddress)>(length <= 5)\n}\n\nproject: Project = new {\n  type = \"open-source\"\n  contacts = Map(\"Pigeon\", \"pigeon@example.com\")\n}\n----\n\n[[anonymous-functions]]\n=== Anonymous Functions\n\nAn _anonymous function_ is a function without a name.\n\nMost modern general-purpose programming languages support anonymous functions,\nunder names such as _lamba expressions_, _arrow functions_, _function literals_, _closures_, or _procs_.\n\nAnonymous functions have their own literal syntax:\n\n[source]\n----\n() -> expr // <1>\n(param) -> expr // <2>\n(param1, param2, ..., paramN) -> expr // <3>\n----\n<1> Zero-parameter lambda expression\n<2> Single-parameter lambda expression\n<3> Multi-parameter lambda expression\n\nHere is an example:\n\n[source%tested,{pkl-expr}]\n----\n(n) -> n * 3\n----\n\nThis anonymous function accepts a parameter named `n`, multiplies it by 3, and returns the result.\n\nAnonymous functions are values of type link:{uri-stdlib-Function}[Function], more specifically\nlink:{uri-stdlib-Function0}[Function0], link:{uri-stdlib-Function1}[Function1],\nlink:{uri-stdlib-Function2}[Function2], link:{uri-stdlib-Function3}[Function3],\nlink:{uri-stdlib-Function4}[Function4], or link:{uri-stdlib-Function5}[Function5].\nThey cannot have more than five parameters.\n\nTo invoke an anonymous function, call its link:{uri-stdlib-Function1-apply}[apply] method:\n\n[source%tested,{pkl-expr}]\n----\n((n) -> n * 3).apply(4) // 12\n----\n\nMany standard library methods accept anonymous functions:\n\n[source%tested,{pkl-expr}]\n----\nList(1, 2, 3).map((n) -> n * 3) // List(3, 6, 9)\n----\n\nAnonymous functions can be assigned to properties, thereby giving them a name:\n\n[source%tested,{pkl}]\n----\nadd = (a, b) -> a + b\nadded = add.apply(2, 3)\n----\n\n[TIP]\n====\nIf an anonymous function is not intended to be passed as value, it is customary to declare a method instead:\n\n[source%tested,{pkl}]\n----\nfunction add(a, b) = a + b\nadded = add(2, 3)\n----\n====\n\nAn anonymous function's parameters can have type annotations:\n\n[source%tested,{pkl-expr}]\n----\n(a: Number, b: Number) -> a + b\n----\n\nApplying this function to arguments not of type `Number` results in an error.\n\nAnonymous functions are _closures_: They can access members defined in a lexically enclosing scope, even after leaving that scope:\n\n[source%tested,{pkl}]\n----\na = 42\naddToA = (b: Number) -> a + b\nlist = List(1, 2, 3).map(addToA) // List(43, 44, 45)\n----\n\nSingle-parameter anonymous functions can also be applied with the `|>` (pipe) operator,\nwhich expects a function argument to the left and an anonymous function to the right.\nThe pipe operator works especially well for chaining multiple functions:\n\n[source%tested,{pkl}]\n----\nmul3 = (n) -> n * 3\nadd2 = (n) -> n + 2\n\nnum = 4 \n  |> mul3\n  |> add2\n  |> mul3 // <1>\n----\n<1> result: `42`\n\nLike methods, anonymous functions can be recursive:\n\n[source%tested,{pkl}]\n----\nfactor = (n: Number(isPositive)) -> if (n < 2) n else n * factor.apply(n - 1)\nnum = factor.apply(5) // <1>\n----\n<1> result: `120`\n\n[[mixins]]\n==== Mixins\n\nA mixin is an anonymous function used to apply the same modification to different objects.\n\nEven though mixins are regular functions, they are best created with object syntax:\n\n[source%tested,{pkl}]\n----\nwithDiet = new Mixin {\n  diet = \"Seeds\"\n}\n----\n\nMixins can optionally specify which type of object they apply to:\n\n[source%tested,{pkl}]\n----\nclass Bird { diet: String }\n\nwithDietTyped = new Mixin<Bird> {\n  diet = \"Seeds\"\n}\n----\n\nFor properties with type annotation, the shorthand `new { ... }` syntax can be used:\n\n[source%tested,{pkl}]\n----\nwithDietTyped: Mixin<Bird> = new {\n  diet = \"Seeds\"\n}\n----\n\nTo apply a mixin, use the `|>` (pipe) operator:\n\n[source%tested,{pkl}]\n----\npigeon {\n  name = \"Pigeon\"\n}\npigeonWithDiet = pigeon |> withDiet\n\nbarnOwl {\n  name = \"Barn owl\"\n}\nbarnOwlWithDiet = barnOwl |> withDiet\n----\n\n`withDiet` can be generalized by turning it into a factory method for mixins:\n[source%tested,{pkl}]\n----\nfunction withDiet(_diet: String) = new Mixin {\n  diet = _diet\n}\nseedPigeon = pigeon |> withDiet(\"Seeds\")\nMiceBarnOwl = barnOwl |> withDiet(\"Mice\")\n----\n\nMixins can themselves be modified with <<function-amending,function amending>>.\n\n[[function-amending]]\n==== Function Amending\n\nAn anonymous function that returns an object can be amended with the same syntax as that object.\nThe result is a new function that accepts the same number of parameters as the original function,\napplies the original function to them, and amends the returned object.\n\nFunction amending is a special form of function composition.\nThanks to function amending, link:{uri-stdlib-Listing-default}[Listing.default]\nand link:{uri-stdlib-Mapping-default}[Mapping.default] can be treated as if they were objects,\nonly gradually revealing their true (single-parameter function) nature:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping {\n  default { // <1>\n    diet = \"Seeds\"\n  }\n  [\"Pigeon\"] { // <2>\n    lifespan = 8\n  }\n}\n----\n<1> Amends the `default` function, which returns a default mapping value given a mapping key, and sets property `diet`.\n<2> Implicitly applies the amended `default` function and amends the returned object with property `lifespan`.\n\nThe result is a mapping whose entry `\"Pigeon\"` has both `diet` and `lifespan` set.\n\nWhen amending an anonymous function, it is possible to access its parameters\nby declaring a comma-separated, arrow (`->`) terminated parameter list after the opening curly brace (`{`).\n\nOnce again, this is especially useful to configure a listing's or mapping's `default` function:\n\n[source%tested,{pkl}]\n----\nbirds = new Mapping {\n  default { key -> // <1>\n    name = key\n  }\n  [\"Pigeon\"] {} // <2>\n  [\"Barn owl\"] {} // <3>\n}\n----\n<1> Amends the `default` function and sets the `name` property to the mapping entry's key.\n    To access the `default` function's key parameter, it is declared with `key ->`.\n    (Any other parameter name could be chosen, but `key` is customary for default functions.)\n<2> Defines a mapping entry with key `\"Pigeon\"`\n<3> Defines a mapping entry with key `\"Barn owl\"`\n\nThe result is a mapping with two entries `\"Pigeon\"` and `\"Barn owl\"` whose `name` properties are set to their keys.\n\nFunction amending can also be used to refine <<mixins,mixins>>.\n\n[[amend-null]]\n=== Amending Null Values\n\nIt's time to lift a secret: The predefined `null` value is just one of the potentially many values of type `Null`.\n\nFirst, here are the technical facts:\n\n* Null values are constructed with `pkl.base#Null()`.\n* `Null(x)` constructs a null value that is equivalent to `x` when amended.\nIn other words, `Null(x) { ... }` is equivalent to `x { ... }`.\n* All null values are equal according to `==`.\n\nWe say that `Null(x)` is a \"null value with default x\".\nBut what is it useful for?\n\n====\nNull values with default are used to define properties that are null (\"switched off\") by default but have a default value once amended (\"switched on\").\n====\n\nHere is an example:\n\n.template.pkl\n[source%tested,{pkl}]\n----\n// we don't have a pet yet, but already know that it is going to be a bird\npet = Null(new Dynamic {\n  animal = \"bird\"\n})\n----\n\n[source%parsed,{pkl}]\n----\namends \"template.pkl\"\n\n// We got a pet, let's fill in its name\npet {\n  name = \"Parry the Parrot\"\n}\n----\n\nA null value can be switched on without adding or overriding a property:\n\n[source%parsed,{pkl}]\n----\namends \"template.pkl\"\n\n// We do not need to name anything if we have no pet yet\npet {}\n----\n\nThe predefined `null` value is defined as `Null(new Dynamic {})`.\nIn other words, amending `null` is equivalent to amending `Dynamic {}` (the empty dynamic object):\n\n[source%tested,{pkl}]\n----\npet = null\n----\n\n[source%tested,{pkl}]\n----\npet {\n  name = \"Parry the Parrot\"\n}\n----\n\nIn most cases, the `Null()` method is not used directly.\nInstead, it is used under the hood to create implicit defaults for properties with nullable type:\n\n.template.pkl\n[source%tested,{pkl}]\n----\nclass Pet {\n  name: String\n  animal: String = \"bird\"\n}\n\n// defaults to `Null(Pet {})`\npet: Pet?\n----\n\n[source%tested,{pkl}]\n----\namends \"template.pkl\"\n\npet {\n  name = \"Perry the Parrot\"\n}\n----\n\nThe general rule is: A property with nullable type `X?` defaults to `Null(x)` if type `X` has default value `x`, and to `null` if `X` has no default value.\n\n[[when-generators]]\n=== When Generators\n\n`when` generators conditionally generate object members.\nThey come in two variants:\n\n. `when (<condition>) { <members> }`\n. `when (<condition>) { <members> } else { <members> }`\n\nThe following code conditionally generates properties `hobby` and `idol`:\n[source%tested,{pkl}]\n----\nisSinger = true\n\nparrot {\n  lifespan = 20\n  when (isSinger) {\n    hobby = \"singing\"\n    idol = \"Frank Sinatra\"\n  }\n}\n----\n\n`when` generators can have an `else` part:\n\n[source%tested,{pkl}]\n----\nisSinger = false\n\nparrot {\n  lifespan = 20\n  when (isSinger) {\n    hobby = \"singing\"\n    idol = \"Aretha Franklin\"\n  } else {\n    hobby = \"whistling\"\n    idol = \"Wolfgang Amadeus Mozart\"\n  }\n}\n----\n\nBesides properties, `when` generators can generate elements and entries:\n\n[source%tested,{pkl}]\n----\nabilities {\n  \"chirping\"\n  when (isSinger) {\n    \"singing\" // <1>\n  }\n  \"whistling\"\n}\n\nabilitiesByBird {\n  [\"Barn owl\"] = \"hooing\"\n  when (isSinger) {\n    [\"Parrot\"] = \"singing\" // <2>\n  }\n  [\"Parrot\"] = \"whistling\"\n}\n----\n<1> conditional element\n<2> conditional entry\n\n[[for-generators]]\n=== For Generators\n\n`for` generators generate object members in a loop.\nThey come in two variants:\n\n. `for (<value> in <iterable>) { <members> }`\n. `for (<key>, <value> in <iterable>) { <members> }`\n\nThe following code generates a `birds` object containing three elements.\nEach element is an object with properties `name` and `lifespan`.\n\n[source%tested,{pkl}]\n----\nnames = List(\"Pigeon\", \"Barn owl\", \"Parrot\")\n\nbirds {\n  for (_name in names) {\n    new {\n      name = _name\n      lifespan = 42\n    }\n  }\n}\n----\n\nThe following code generates a `birdsByName` object containing three entries.\nEach entry is an object with properties `name` and `lifespan` keyed by name.\n\n[source%tested,{pkl}]\n----\nnamesAndLifespans = Map(\"Pigeon\", 8, \"Barn owl\", 15, \"Parrot\", 20)\n\nbirdsByName {\n  for (_name, _lifespan in namesAndLifespans) {\n    [_name] {\n      name = _name\n      lifespan = _lifespan\n    }\n  }\n}\n----\n\nThe following types are iterable:\n\n|===\n|Type |Key |Value\n\n|`IntSeq`\n|element index (`Int`)\n|element value (`Int`)\n\n|`List<Element>`\n|element index (`Int`)\n|element value (`Element`)\n\n|`Set<Element>`\n|element index (`Int`)\n|element value (`Element`)\n\n|`Map<Key, Value>`\n|entry key (`Key`)\n|entry value (`Value`)\n\n|`Bytes`\n|element index (`Int`)\n|element value (`UInt8`)\n\n|`Listing<Element>`\n|element index (`Int`)\n|element value (`Element`)\n\n|`Mapping<Key, Value>`\n|entry key (`Key`)\n|entry value (`Value`)\n\n|`Dynamic`\n|element index (`Int`) +\nentry key +\nproperty name (`String`)\n|element value +\nentry value +\nproperty value\n|===\n\nIndices are zero-based.\nNote that `for` generators can generate elements and entries but not properties.footnote:[More precisely, they cannot generate properties with a non-constant name.]\n\n[[spread-syntax]]\n=== Spread Syntax (`\\...`)\n\nSpread syntax generates object members from an iterable value.\n\nThere are two variants of spread syntax, a non-nullable variant and a nullable variant.\n\n1. `\\...<iterable>`\n2. `\\...?<iterable>`\n\nSpreading an xref:objects[`Object`] (one of `Dynamic`, `Listing` and `Mapping`) will unpack all of its members into the enclosing object footnote:[Values that are xref:typed-objects[`Typed`] are not iterable.].\nEntries become entries, elements become elements, and properties become properties.\n\n[source%tested,{pkl}]\n----\nentries1 {\n  [\"Pigeon\"] = \"Piggy the Pigeon\"\n  [\"Barn owl\"] = \"Barney the Barn owl\"\n}\n\nentries2 {\n  ...entries1 // <1>\n}\n\nelements1 { 1; 2 }\n\nelements2 {\n  ...elements1 // <2>\n}\n\nproperties1 {\n  name = \"Pigeon\"\n  diet = \"Seeds\"\n}\n\nproperties2 {\n  ...properties1 // <3>\n}\n----\n<1> Spreads entries `[\"Pigeon\"] = \"Piggy the Pigeon\"` and `[\"Barn owl\"] = \"Barney the Barn owl\"`\n<2> Spreads elements `1` and `2`\n<3> Spreads properties `name = \"Pigeon\"` and `diet = \"Seeds\"`\n\nSpreading all other iterable types generates members determined by the iterable.\nThe following table describes how different iterables turn into object members:\n\n|===\n|Iterable type|Member type\n\n| `Map`\n| Entry\n\n| `List`\n| Element\n\n| `Set`\n| Element\n\n| `IntSeq`\n| Element\n\n| `Bytes`\n| Element\n|===\n\nThese types can only be spread into enclosing objects that support that member type.\nFor example, a `List` can be spread into a `Listing`, but cannot be spread into a `Mapping`.\n\nIn some ways, spread syntax can be thought of as a shorthand for a xref:for-generators[for generator]. One key difference is that spread syntax can generate properties, which is not possible with a for generator.\n\n[NOTE]\n====\nLook out for duplicate key conflicts when using spreads.\nSpreading entries or properties may cause conflicts due to matched existing key definitions.\n\nIn the following code snippet, `\"Pigeon\"` is declared twice in the `newPets` object, and thus is an error.\n\n[source%tested%error,{pkl}]\n----\noldPets {\n  [\"Pigeon\"] = \"Piggy the Pigeon\"\n  [\"Parrot\"] = \"Perry the Parrot\"\n}\n\nnewPets {\n  ...oldPets\n  [\"Pigeon\"] = \"Toby the Pigeon\" // <1>\n}\n----\n<1> Error: Duplicate definition of member `\"Pigeon\"`.\n====\n\n==== Nullable spread\n\nA non-nullable spread (`\\...`) will error if the value being spread is `null`.\n\nIn contrast, a nullable spread (`\\...?`) is syntactic sugar for wrapping a spread in a xref:when-generators[`when`].\n\nThe following two snippets are logically identical.\n\n[source%parsed,{pkl}]\n----\nresult {\n  ...?myValue\n}\n----\n\n[source%parsed,{pkl}]\n----\nresult {\n  when (myValue != null) {\n    ...myValue\n  }\n}\n----\n\n[[member-predicates]]\n=== Member Predicates (`[[...]]`)\n\nOccasionally it is useful to configure all object members matching a predicate.\nThis is especially true when configuring elements, which—unlike entries—cannot be accessed by key:\n\n[source%tested,{pkl}]\n----\nenvironmentVariables {   // <1>\n  new { name = \"PIGEON\"; value = \"pigeon-value\" }\n  new { name = \"PARROT\"; value = \"parrot-value\" }\n  new { name = \"BARN OWL\"; value = \"barn-owl-value\" }\n}\n\nupdated = (environmentVariables) {\n  [[name == \"PARROT\"]] { // <2>\n    value = \"new-value\"  // <3>\n  }\n}\n----\n<1> a listing of environment variables\n<2> amend element(s) whose name equals \"PARROT\" +\n(`name` is shorthand for `this.name`)\n<3> update value to \"new-value\"\n\nThe predicate, enclosed in double brackets (`\\[[...]]`), is matched against each member of the enclosing object.\nWithin the predicate, `this` refers to the member that the predicate is matched against.\nMatching members are amended (`{ ... }`) or overridden (`= <new-value>`).\n\n[[this-keyword]]\n=== `this` keyword\n\nNormally, the `this` keyword references the enclosing object's receiver.\n\nExample:\n[source,pkl]\n----\nbird {\n  eatsInsects = this is InsectavorousBird\n}\n----\n\nWhen used inside a <<type-constraints,type constraint>>, `this` refers to the value being tested.\n\nExample:\n[source,pkl]\n----\nport: UInt16(this > 1000)\n----\n\nWhen used inside a <<member-predicates,member predicate>>, `this` refers to the value being matched against.\n\nExample:\n[source,pkl]\n----\nanimals {\n  [[this is Bird]] {\n    canFly = true\n  }\n}\n----\n\n[[receiver]]\n==== Receiver\n\nThe receiver is the bottom-most object in the <<prototype-chain>>.\nThat means that, within the context of an amending object, the receiver is the amending object.\n\nExample:\n[source,pkl]\n----\nhidden lawyerBird {\n  title = \"\\(this.name), Esq.\"\n}\n\npolly = (lawyerBird) {\n  name = \"Polly\" // <1>\n}\n----\n<1> Polly has title `\"Polly, Esq.\"`.\n\n[[outer-keyword]]\n=== `outer` keyword\n\nThe `outer` keyword references the <<receiver,receiver>> of the immediately outer lexical object.\n\nIt can be useful to disambiguate a lookup that might otherwise resolve elsewhere.\n\nExample:\n[source%tested,pkl]\n----\nfoo {\n  bar = \"bar\"\n  qux {\n    bar = outer.bar // <1>\n  }\n}\n----\n<1> References `bar` one level higher.\n\nNote that `outer` cannot be chained.\nIn order to reference a value more than one level higher, a typical pattern is to declare a local property at that level.\n\nFor example:\n\n[source%parsed,pkl]\n----\nfoo {\n  local self = this\n  bar {\n    baz {\n      qux = self.qux\n    }\n  }\n}\n----\n\n[[super-keyword]]\n=== `super` keyword\n\nThe `super` keyword references the parent object in the <<prototype-chain,prototype chain>>.\n\nWhen used within a class, it refers to the superclass's prototype.\nWhen used within an object, it refers to the parent object in the amends chain.\n\nExample:\n[source%tested,pkl]\n----\nbird = new { name = \"Quail\" }\n\nbird2 = (bird) { name = \"Ms. \\(super.name)\" } // <1>\n\nabstract class Bird {\n  foods: Listing<String>\n\n  function canEat(food: String): Boolean = foods.contains(food)\n}\n\nclass InsectavorousBird extends Bird {\n  function canEat(food: String) =\n    super.canEat(food) || food == \"insect\" // <2>\n}\n----\n<1> Result: `\"Ms. Quail\"`\n<2> Calls parent class method `canEat()`\n\nThe `super` keyword must be followed by property/method access, or subscript.\n`super` by itself a syntax error; whereas `super.foo` and `super[\"foo\"]` are valid expressions.\n\n[[module-keyword]]\n=== `module` keyword\n\nThe `module` keyword can be used as either a value, or as a type.\n\nWhen used as a value, it refers to the <<receiver,receiver>> of the module itself.\n\n[source%tested,pkl]\n----\nname = \"Quail\"\n\nsome {\n  deep {\n    object {\n      name = module.name // <1>\n    }\n  }\n}\n----\n<1> Resolves to `\"Quail\"`\n\nWhen used as a type, it is the module's class.\n\n[source%parsed,pkl]\n----\nmodule Bird\n\nfriend: module // <1>\n----\n<1> Is class `Bird`\n\nThe `module` type is a _self type_.\nIf the module is extended by another module, the `module` type refers to the extending module when\nin the context of that module.\n\n[[glob-patterns]]\n=== Glob Patterns\n\nResources and modules may be imported at the same time by globbing with the <<globbed-imports>> and <<globbed-reads>> features.\n\nPkl's glob patterns mostly follow the rules described by link:{uri-glob-7}[glob(7)], with the following differences:\n\n* `*` includes names that start with a dot (`.`).\n* `+++**+++` behaves like `*`, except it also matches directory boundary characters (`/`).\n* Named character classes are not supported.\n* Collating symbols are not supported.\n* Equivalence class expressions are not supported.\n* Support for <<glob-sub-patterns,sub-patterns>> (patterns within `{` and `}`) are added.\n\nHere is a full specification of how globs work:\n\n==== Wildcards\n\nThe following tokens denote wildcards:\n\n[cols=\"1,2\"]\n|===\n|Wildcard |Meaning\n\n|`*`\n|Match zero or more characters, until a directory boundary (`/`) is reached.\n\n|`**`\n|Match zero or more characters, crossing directory boundaries.\n\n|`?`\n|Match a single character.\n\n|`[...]`\n|Match a single character represented by this <<character-classes,character class>>.\n|===\n\nNOTE: Unlike globs within shells, the `*` wildcard includes names that start with a dot (`.`).\n\n[[character-classes]]\n==== Character Classes\n\nCharacter classes are sequences delimited by the `[` and `]` characters, and represent a single\ncharacter as described by the sequence within the enclosed brackets.\nFor example, the pattern `[abc]` means \"a single character that is a, b, or c\".\n\nCharacter classes may be negated using `!`.\nFor example, the pattern `[!abc]` means \"a single character that is not a, b, nor c\".\n\nCharacter classes may use the `-` character to denote a range.\nThe pattern `[a-f]` is equivalent to `[abcdef]`.\nIf the `-` character exists at the beginning or the end of a character class, it does not carry any special meaning.\n\nWithin a character class, the characters `{`, `}`, `\\`, `*`, and `?` do not have any special meaning.\n\nA character class is not allowed to be empty.\nThus, if the first character within the character class is `]`, it is treated literally and not as the closing delimiter of the character class.\nFor example, the glob pattern `[]abc]` matches a single character that is either `]`, `a`, `b`, or `c`.\n\n[[glob-sub-patterns]]\n==== Sub-patterns\n\nSub-patterns are glob patterns delimited by the `{` and `}` characters, and separated by the `,` character.\nFor example, the pattern `{pigeon,parrot}` will match either `pigeon` or `parrot`.\n\nSub-patterns cannot be nested. The pattern `{foo,{bar,baz}}` is not a valid glob pattern, and an error will be thrown during evaluation.\n\n==== Escapes\n\nThe escape character (`\\`) can be used to remove the special meaning of a character. The following escapes are valid:\n\n* `\\[`\n* `\\*`\n* `\\?`\n* `\\\\`\n* `\\{`\n\nAll other escapes are considered a syntax error and an error is thrown.\n\nTIP: If incorporating escape characters into a glob pattern, use <<custom-string-delimiters,custom string delimiters>> to express the glob pattern. For example, `+++import*(#\"\\{foo.pkl\"#)+++`. This way, the backslash is interpreted as a backslash and not a string escape.\n\n==== Examples\n[cols=\"1,2\"]\n|===\n|Pattern |Description\n\n|`*.pk[lg]`\n|Anything suffixed by `.pkl`, or `.pkg`.\n\n|`**.y{a,}ml`\n|Anything suffixed by either `yml` or `yaml`, crossing directory boundaries. \n\n|`birds/{\\*.yml,*.json}`\n|Anything within the `birds` subdirectory that ends in `.yml` or `.json`. This pattern is equivalent to `birds/*.{yml,json}`.\n\n|`a?*.txt`\n|Anything starting with `a` and at least one more letter, and suffixed with `.txt`.\n\n|`modulepath:/**.pkl`\n|All Pkl files in the module path.\n|===\n\n[[quoted-identifiers]]\n=== Quoted Identifiers\n\nAn identifier is the name part of an entity in Pkl.\nEntities that are named by identifiers include classes, properties, typealiases, and modules.\nFor example, `class Bird` has the identifier `Bird`.\n\nNormally, an identifier must conform to Unicode's {uri-unicode-identifier}[UAX31-R1-1 syntax], with the additions of `_` and `$` permitted as identifier start characters.\nAdditionally, an identifier cannot clash with a keyword.\n\nTo define an identifier that is otherwise illegal, enclose them in backticks.\nThis is called a _quoted identifier_.\n\n[source,{pkl}]\n----\n`A Bird's First Flight Time` = 5.s\n----\n\n[NOTE]\n====\nBackticks are not part of a quoted identifier's name, and surrounding an already legal identifier with backticks is redundant.\n\n[source,{pkl}]\n----\n`number` = 42 // <1>\nres1 = `number` // <2>\nres2 = number // <3>\n----\n<1> Equivalent to `number = 42`\n<2> References property `{backtick}number{backtick}`\n<3> Also references property `{backtick}number{backtick}`\n====\n\n[[doc-comments]]\n=== Doc Comments\n\nDoc comments are the user-facing documentation of a module and its members.\nThey consist of one or more lines starting with a triple slash (`///`).\nHere is a doc comment for a module:\n\n[source%tested,{pkl}]\n----\n/// An aviated animal going by the name of [bird](https://en.wikipedia.org/wiki/Bird).\n///\n/// These animals live on the planet Earth.\nmodule com.animals.Birds\n----\n\nDoc comments are written in Markdown.\nThe following Markdown features are supported:\n\n* all link:{uri-common-mark}[CommonMark] features\n* https://help.github.com/articles/organizing-information-with-tables[GitHub flavored Markdown tables]\n\n[NOTE]\n====\nPlaintext URLs are only rendered as links when enclosed in angle brackets:\n\n[source,{pkl}]\n----\n/// A link is *not* generated for https://example.com.\n/// A link *is* generated for <https://example.com>.\n----\n====\n\nDoc comments are consumed by humans reading source code, the _Pkldoc_ documentation generator, code generators, and editor/IDE plugins.\nThey are programmatically accessible via the link:{uri-stdlib-reflectModule}/[pkl.reflect] Pkl API and link:{uri-pkl-core-ModuleSchema}[ModuleSchema] Java API.\n\n[TIP]\n.Doc Comment Style Guidelines\n====\n* Use proper spelling and grammar.\n* Start each sentence on a new line and capitalize the first letter.\n* End each sentence with a punctuation mark.\n* The first paragraph of a doc comment is its _summary_.\n  Keep the summary short (a single sentence is common)\n  and insert an empty line (`///`) before the next paragraph.\n====\n\nDoc comments can be attached to module, class, type alias, property, and method declarations.\nHere is a comprehensive example:\n\n.Birds.pkl\n[source%tested,{pkl}]\n----\n/// An aviated animal going by the name of [bird](https://en.wikipedia.org/wiki/Bird).\n///\n/// These animals live on the planet Earth.\nmodule com.animals.Birds\n\n/// A bird living on Earth.\n///\n/// Has [name] and [lifespan] properties and an [isOlderThan()] method.\nclass Bird {\n  /// The name of this bird.\n  name: String\n\n  /// The lifespan of this bird.\n  lifespan: UInt8\n\n  /// Tells if this bird is older than [bird].\n  function isOlderThan(bird: Bird): Boolean = lifespan > bird.lifespan\n}\n\n/// An adult [Bird].\ntypealias Adult = Bird(lifespan >= 2)\n\n/// A common [Bird] found in large cities.\npigeon: Bird = new {\n  name = \"Pigeon\"\n  lifespan = 8\n}\n\n/// Creates a [Bird] with the given [_name] and lifespan `0`.\nfunction Infant(_name: String): Bird = new { name = _name; lifespan = 0 }\n----\n\n[[member-links]]\n==== Member Links\n\nTo link to a member declaration, write the member's name enclosed in square brackets (`[]`):\n\n[source,{pkl}]\n----\n/// A common [Bird] found in large cities.\n----\n\nTo customize the link text, insert the desired text, enclosed in square brackets, before the member name:\n\n[source,{pkl}]\n----\n/// A [common Bird][Bird] found in large cities.\n----\n\nCustom link text can use markup:\n\n[source,{pkl}]\n----\n/// A [*common* Bird][Bird] found in large cities.\n----\n\nThe short link `[Bird]` is equivalent to `[{backtick}Bird{backtick}][Bird]`.\n\nMember links are resolved according to Pkl's normal name resolution rules.\nThe syntax for linking to the members of _Birds.pkl_ (see above) is as follows:\n\nModule::\n* `[module]` (from same module)\n* `[Birds]` (from a module that contains `import \"Birds.pkl\"`)\n\nClass::\n* `[Bird]` (from same module)\n* `[Birds.Bird]` (from a module that contains `import \"Birds.pkl\"`)\n\nType Alias::\n* `[Adult]` (from same module)\n* `[Birds.Adult]` (from a module that contains `import \"Birds.pkl\"`)\n\nClass Property::\n* `[name]` (from same class)\n* `[Bird.name]` (from same module)\n* `[Birds.Bird.name]` (from a module that contains `import \"Birds.pkl\"`)\n\nClass Method::\n* `[greet()]` (from same class)\n* `[Bird.greet()]` (from same module)\n* `[Birds.Bird.greet()]` (from a module that contains `import \"Birds.pkl\"`)\n\nClass Method Parameter::\n* `[bird]` (from same method)\n\nModule Property::\n* `[pigeon]` (from same module)\n* `[Birds.pigeon]` (from a module that contains `import \"Birds.pkl\"`)\n\nModule Method::\n* `[isPigeon()]` (from same module)\n* `[Birds.isPigeon()]` (from a module that contains `import \"Birds.pkl\"`)\n\nModule Method Parameter::\n* `[bird]` (from same method)\n\nMembers of `pkl.base` can be linked to by their simple name:\n\n[source,{pkl}]\n----\n/// Returns a [String].\n----\n\nModule-level members can be prefixed with `module.` to resolve name conflicts:\n\n[source,{pkl}]\n----\n/// See [module.pigeon].\n----\n\nTo exclude a member from documentation and code completion, <<annotations,annotate>> it with `@Unlisted`:\n\n[source%parsed,{pkl}]\n----\n@Unlisted\npigeon: Bird\n----\n\nThe following member links are marked up as code but not rendered as links:footnote:[Only applies to links without custom link text.]\n\n* `[null]`, `[true]`, `[false]`, `[this]`, `[unknown]`, `[nothing]`\n* self-links\n* subsequent links to the same member from the same doc comment\n* links to a method's own parameters\n\nNevertheless, it is a good practice to use member links in the above cases.\n\n[[annotations]]\n=== Annotations\n\nAnnotations are a mechanism to provides extra metadata about Pkl <<modules,modules>>, <<classes,classes>>, <<methods,methods>>, and <<properties,properties>>.\nThey provide metadata about the type or member they annotate that can be via link:{uri-stdlib-reflectModule}[reflection] or Pkl's Java APIs.\nThe most common use cases for annotations are to add metadata to influence behavior of xref:pkl-doc:index.adoc[Pkldoc], code generation tools, or <<module-output,module output>>.\n\nAnnotations are regular Pkl objects whose class extends link:{uri-stdlib-Annotation}[`Annotation`].\nAnnotation instances are defined similarly to regular <<classes, class instances>>, but instead of using the `new` keyword the class name is prefixed with `@`.\nThe object body may be omitted if an annotation's class has no properties or the declared annotation does not override any of the class's default values\nMultiple annotations may be defined on a member.\nIf the annotated member has a <<doc-comments,doc comment>>, the annotation is defined between the comment and the member.\n\n[source%tested,{pkl}]\n----\n/// Module doc comment\n@SomeAnnotation // <1>\nmodule myModule\n\nclass SomeAnnotation extends Annotation { // <2>\n  description: String = \"some annotation\"\n}\n\n/// Module doc comment\n@SomeAnnotation // <3>\nclass Bird {\n  @SomeAnnotation { description = \"some property\" } // <4>\n  name: String\n\n  @SomeAnnotation { description = \"some method\" } // <5>\n  @Unlisted // <6>\n  function greet(greeting: String): String = \"\\(greeting), \\(name)!\"\n}\n----\n<1> An annotation applied to a module. The annotation(s) must precede the `module` clause and follow the doc comment. The object body is omitted.\n<2> The definition of an annotation class.\n<3> An annotation appied to a class. The object body is omitted.\n<4> An annotation applied to a property. The object body is included because the `description` property is overridden.\n<5> An annotation applied to a method. The object body is included because the `description` property is overridden.\n<6> A second annotation applied to the same method.\n\n[[name-resolution]]\n=== Name Resolution\n\nConsider this snippet of code buried deep inside a config file:\n\n[source%parsed,{pkl}]\n----\na = x + 1\n----\n\nThe call site's \"variable\" syntax reveals that `x` refers to a _LAMP_\n(let binding, anonymous function parameter, method parameter, or property) definition. But which one?\n\nTo answer this question, Pkl follows these steps:\n\n. Search the lexically enclosing scopes of `x`,\n  starting with the scope in which `x` occurs and continuing outwards\n  up to and including the enclosing module's top-level scope, for a LAMP definition named `x`.\n  If a match is found, this is the answer.\n. Search the `pkl.base` module for a top-level definition of property `x`.\n  If a match is found, this is the answer.\n. Search the <<prototype-chain,prototype chain>> of `this`, from bottom to top, for a definition of property `x`.\n  If a match is found, this is the answer.\n. Throw a \"name `x` not found\" error.\n\nNOTE: Pkl's LAMP name resolution is inspired by link:{uri-newspeak}[Newspeak].\nThe goal is for name resolution to be stable with regard to changes in external modules.\nThis is why lexically enclosing scopes are searched before the prototype chain of `this`,\nand why the prototype chains of lexically enclosing scopes are not searched,\nwhich sometimes requires the use of `outer.` or `module.`.\nFor name resolution to fully stabilize, the list of top-level properties defined in `pkl.base` needs to be freezed.\nThis is tentatively planned for Pkl 1.0.\n\nConsider this snippet of code buried deep inside a config file:\n\n[source%parsed,{pkl}]\n----\na = x(\"foo\") + 1\n----\n\nThe call site's method call syntax reveals that `x` refers to a method definition. But which one?\n\nTo answer this question, Pkl follows these steps:\n\n. Search the call sites' lexically enclosing scopes,\n  starting with the scope in which the call site occurs and continuing outwards\n  up to and including the enclosing module's top-level scope, for a definition of method `x`.\n  If a match is found, this is the answer.\n. Search the `pkl.base` module for a top-level definition of method `x`.\n  If a match is found, this is the answer.\n. Search the class inheritance chain of `this`, starting with the class of `this`\n  and continuing upwards until and including class `Any`, for a method named `x.`\n  If a match is found, this is the answer.\n. Throw a \"method `x` not found\" error.\n\nNOTE: Pkl does not support arity or type-based method overloading.\nHence, the argument list of a method call is irrelevant for method resolution.\n\n[[prototype-chain]]\n==== Prototype Chain\n\nPkl's object model is based on link:{uri-prototypical-inheritance}[prototypical inheritance].\nThe prototype chain of objectfootnote:[An instance of `Listing`, `Mapping`, `Dynamic`, or (a subclass of) `Typed`.] `x` contains, from bottom to top:\n\n1. The chain of objects amended to create `x`, ending in `x` itself, in reverse order.footnote:[All objects in this chain are instances of the same class,\n   except when a direct conversion between listing, mapping, dynamic, and typed object has occurred.\n   For example, `Typed.toDynamic()` returns a dynamic object that amends a typed object.]\n2. The prototype of the class of the top object in (1).\n   If no amending took place, this is the class of `x`.\n3. The prototypes of the superclasses of (2).\n\nThe prototype of class `X` is an instance of `X` that defines the defaults for properties defined in `X`.\nIts direct ancestor in the prototype chain is the prototype of the superclass of `X`.\n\nThe prototype of class `Any` sits at the top of every prototype chain.\nTo reduce the chance of naming collisions, `Any` does not define any property names.footnote:[Method resolution searches the class inheritance rather than prototype chain.]\n\nConsider the following code:\n\n[source%tested,{pkl}]\n----\none = new Dynamic { name = \"Pigeon\" }\ntwo = (one) { lifespan = 8 }\n----\n\nThe prototype chain of object `two` contains, now listed from top to bottom:\n\n. The prototype of class `Any`.\n. The prototype of class `Dynamic`.\n. `one`\n. `two`\n\nConsider the following code:\n\n[source%tested,{pkl}]\n----\nabstract class Named {\n  name: String\n}\nclass Bird extends Named {\n  lifespan: Int = 42\n}\none = new Bird { name = \"Pigeon\" }\ntwo = (one) { lifespan = 8 }\n----\n\nThe prototype chain of object `two` contains, listed from top to bottom:\n\n. The prototype of class `Any`.\n. The prototype of class `Typed`.\n. The prototype of class `Named`.\n. The prototype of class `Bird`.\n. `one`\n. `two`\n\n===== Non-object Values\n\nThe prototype chain of non-object value `x` contains, from bottom to top:\n\n1. The prototype of the class of `x`.\n2. The prototypes of the superclasses of (1).\n\nFor example, the prototype chain of value `42` contains, now listed from top to bottom:\n\n. The prototype of class `Any`.\n. The prototype of class `Number`.\n. The prototype of class `Int`.\n\nA prototype chain never contains a non-object value, such as `42`.\n\n[[reserved-keywords]]\n=== Reserved keywords\n\nThe following keywords are reserved in the language.\nThey cannot be used as a regular identifier, and currently do not have any meaning.\n\n* `protected`\n* `override`\n* `record`\n* `delete`\n* `case`\n* `switch`\n* `vararg`\n\nTo use these names in an identifier, <<quoted-identifiers, surround them with backticks>>.\n\nFor a complete list of keywords, consult field `Lexer.KEYWORDS` in {uri-github-PklLexer}[Lexer.java].\n\n[[blank-identifiers]]\n=== Blank Identifiers\n\nBlank identifiers can be used in many places to ignore parameters and variables. +\n`_` is not a valid identifier. To use it as a parameter or variable name,\nit needs to be enclosed in backticks: +`_`+.\n\n==== Functions and methods\n\n[source%tested,{pkl}]\n----\nbirds = List(\"Robin\", \"Swallow\", \"Eagle\", \"Falcon\")\nindexes = birds.mapIndexed((i, _) -> i)\n\nfunction constantly(_, second) = second \n----\n\n==== For generators\n\n[source%tested,{pkl}]\n----\nbirdColors = Map(\"Robin\", \"blue\", \"Eagle\", \"white\", \"Falcon\", \"red\")\n\nbirds = new Listing {\n  for (name, _ in birdColors) {\n    name\n  }\n}\n----\n\n==== Let bindings\n\n[source%tested,{pkl}]\n----\nname = let (_ = trace(\"defining name\")) \"Eagle\"\n----\n\n==== Object bodies\n\n[source%tested,{pkl}]\n----\nbirds = new Dynamic {\n  default { _ ->\n    species = \"Bird\"\n  }\n  [\"Falcon\"] {}\n  [\"Eagle\"] {}\n}\n----\n\n[[projects]]\n=== Projects\n\nA _project_ is a directory of Pkl modules and other resources.\nIt is defined by the presence of a `PklProject` file that amends the standard library module\n`pkl:Project`.\n\nDefining a project serves the following purposes:\n\n1. It allows defining common evaluator settings for Pkl modules within a logical project.\n2. It helps with managing <<package-asset-uri,package>> dependencies for Pkl modules within a logical project.\n3. It enables packaging and sharing the contents of the project as a <<package-asset-uri,package>>.\n4. It allows importing packages via dependency notation.\n\n[[project-dependencies]]\n==== Dependencies\n\nA project is useful for managing <<package-asset-uri,package>> dependencies.\n\nWithin a PklProject file, dependencies can be defined:\n\n.PklProject\n[source%tested,{pkl}]\n----\namends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] { // <1>\n    uri = \"package://example.com/birds@1.0.0\"\n  }\n}\n----\n<1> Declare dependency on `package://example.com/birds@1.0.0` with simple name \"birds\".\n\nThese dependencies can then be imported by their simple name.\nThis syntax is called _dependency notation_.\n\nExample:\n\n[source,{pkl}]\n----\nimport \"@birds/Bird.pkl\" // <1>\n\npigeon: Bird = new {\n  name = \"Pigeon\"\n}\n----\n<1> Dependency notation; imports path `/Bird.pkl` within dependency `package://example.com/birds@1.0.0`\n\nNOTE: Internally, Pkl assigns URI scheme `projectpackage` to project dependencies imported using dependency notation.\n\nWhen the project gets published as a _package_, these names and URIs are preserved as the package's dependencies.\n\n[[resolving-dependencies]]\n==== Resolving Dependencies\n\nDependencies that are declared in a `PklProject` file must be _resolved_ via CLI command xref:pkl-cli:index.adoc#command-project-resolve[`pkl project resolve`].\nThis builds a single dependency list, resolving all transitive dependencies, and determines the appropriate version for each package.\nIt creates or updates a file called `PklProject.deps.json` in the project's root directory with the list of resolved dependencies.\n\nWhen resolving version conflicts, the CLI will pick the latest link:{uri-semver}[semver] minor version of each package.\nFor example, if the project declares a dependency on package A at `1.2.0`, and a package transitively declares a dependency on package A at `1.3.0`, version `1.3.0` is selected.\n\nIn short, the algorithm has the following steps:\n\n1. Gather a list of all dependencies, either directly declared or transitive.\n2. For each dependency, keep only the newest minor version.\n\nThe resolve command is idempotent; given a PklProject file, it always produces the same set of resolved dependencies.\n\nNOTE: This algorithm is adapted from Go's link:{uri-mvs-build-list}[minimum version selection].\n\n==== Creating a Package\n\nProjects enable the creation of a <<package-asset-uri,package>>.\nTo create a package, the `package` section of a `PklProject` module must be defined.\n\n.PklProject\n[source,pkl]\n----\namends \"pkl:Project\"\n\npackage {\n  name = \"mypackage\" // <1>\n  baseUri = \"package://example.com/\\(name)\" // <2>\n  version = \"1.0.0\" // <3>\n  packageZipUrl = \"https://example.com/\\(name)/\\(name)@\\(version).zip\" // <4>\n}\n----\n<1> The display name of the package.For display purposes only.\n<2> The package URI, without the version part.\n<3> The version of the package.\n<4> The URL to download the package's ZIP file.\n\nThe package itself is created by the command xref:pkl-cli:index.adoc#command-project-package[`pkl project package`].\n\nThis command only prepares artifacts to be published.\nOnce the artifacts are prepared, they are expected to be uploaded to an HTTPS server such that the ZIP asset can be downloaded at path `packageZipUrl`, and the metadata can be downloaded at `+https://<package uri>+`.\n\n[[local-dependencies]]\n==== Local dependencies\n\nA project can depend on a local project as a dependency.\nThis can be useful for:\n\n* Structuring a monorepo that publishes multiple packages.\n* Temporarily testing out library changes when used within another project.\n\nTo specify a local dependency, import its `PklProject` file.\nThe imported `PklProject` _must_ have a package section defined.\n\n.birds/PklProject\n[source,{pkl}]\n----\namends \"pkl:Project\"\n\ndependencies {\n  [\"fruit\"] = import(\"../fruit/PklProject\") // <1>\n}\n\npackage {\n  name = \"birds\"\n  baseUri = \"package://example.com/birds\"\n  version = \"1.8.3\"\n  packageZipUrl = \"https://example.com/birds@\\(version).zip\"\n}\n----\n<1> Specify relative project `../fruit` as a dependency.\n\n.fruit/PklProject\n[source,{pkl}]\n----\namends \"pkl:Project\"\n\npackage {\n  name = \"fruit\"\n  baseUri = \"package://example.com/fruit\"\n  version = \"1.5.0\"\n  packageZipUrl = \"https://example.com/fruit@\\(version).zip\"\n}\n----\n\nFrom the perspective of project `birds`, `fruit` is just another package.\nIt can be imported using dependency notation, i.e. `import \"@fruit/Pear.pkl\"`.\nAt runtime, it will resolve to relative path `../fruit/Pear.pkl`.\n\nWhen packaging projects with local dependencies, both the project and its dependent project must be passed to the xref:pkl-cli:index.adoc#command-project-package[`pkl project package`] command.\n\n[[external-readers]]\n=== External Readers\n\nExternal readers are a mechanism to extend the <<modules,module>> and <<resources,resource>> URI schemes that Pkl supports.\nReaders are implemented as ordinary executables and use Pkl's xref:bindings-specification:message-passing-api.adoc[message passing API] to communicate with the hosting Pkl evaluator.\nThe xref:swift:ROOT:index.adoc[Swift] and xref:go:ROOT:index.adoc[Go] language binding libraries provide an `ExternalReaderRuntime` type to facilitate implementing external readers.\n\nExternal readers are configured separately for modules and resources.\nThey are registered by mapping their URI scheme to the executable to run and additional arguments to pass.\nThis is done on the command line by passing `--external-resource-reader` and `--external-module-reader` flags, which may both be passed multiple times.\n\n[source,text]\n----\n$ pkl eval <module> --external-resource-reader <scheme>=<executable> --external-module-reader <scheme>='<executable> <argument> <argument>'\n----\n\nExternal readers may also be configured in a <<projects, Project's>> `PklProject` file.\n[source,{pkl}]\n----\nevaluatorSettings {\n  externalResourceReaders {\n    [\"<scheme>\"] {\n      executable = \"<executable>\"\n    }\n  }\n  externalModuleReaders {\n    [\"<scheme>\"] {\n      executable = \"<executable>\"\n      arguments { \"<arg>\"; \"<arg>\" }\n    }\n  }\n}\n----\n\nRegistering an external reader for a scheme automatically adds that scheme to the default allowed modules/resources.\nAs with Pkl's built-in module and resource schemes, setting explicit allowed modules or resources overrides this behavior and appropriate patterns must be specified to allow use of external readers.\n\n==== Example\n\nConsider this module:\n\n[source,{pkl}]\n----\nusername = \"pigeon\"\n\nemail = read(\"ldap://ds.example.com:389/dc=example,dc=com?mail?sub?(uid=\\(username))\").text\n----\n\nPkl doesn't implement the `ldap:` resource URI scheme natively, but an external reader can provide it.\nAssuming a hypothetical `pkl-ldap` executable implementing the external reader protocol and the `ldap:` scheme is in the `$PATH`, this module can be evaluated as:\n\n[source,text]\n----\n$ pkl eval <module> --external-resource-reader ldap=pkl-ldap\nusername = \"pigeon\"\nemail = \"pigeon@example.com\"\n----\n\nIn this example, the external reader may provide both `ldap:` and `ldaps:` schemes.\nTo support both schemes during evaluation, both would need to be registered explicitly:\n[source,text]\n----\n$ pkl eval <module> --external-resource-reader ldap=pkl-ldap --external-resource-reader ldaps=pkl-ldap\n----\n\n[[mirroring_packages]]\n=== Mirroring packages\n\nA package is a shareable archive of modules and resources that are published to the internet.\n\nA package's URI tells two things:\n\n1. The name of the package.\n2. Where the package is downloaded from.\n\nFor example, given the package name `package://example.com/mypackage@1.0.0`, Pkl will make an HTTPS request to `\\https://example.com/mypackage@1.0.0` to fetch package metadata.\n\nIn situations where internet access is restricted, a mirror can be set up to allow use of packages that are published to the internet.\n\nTo direct Pkl to a mirror, the `--http-rewrite` CLI option (and its equivalent options when using Pkl's other evaluator APIs) must be used.\nFor example, `--http-rewrite \\https://pkg.pkl-lang.org/=\\https://my.internal.mirror/` will tell Pkl to download packages from host `my.internal.mirror`.\n\nNOTE: To effectively mirror packages from pkg.pkl-lang.org, there must be two rewrites; one for `\\https://pkg.pkl-lang.org/` (where package metadata is downloaded), and one for `\\https://github.com/` (where package zip files are downloaded).\n\nNOTE: Pkl does not provide any tooling to run a mirror server.\nTo fully set up mirroring, an HTTP(s) server will need be running, and which mirrors the same assets byte-for-byte.\n"
  },
  {
    "path": "docs/modules/language-tutorial/pages/01_basic_config.adoc",
    "content": "= Basic Configuration\ninclude::ROOT:partial$component-attributes.adoc[]\n\nIn this first part of xref:index.adoc[the Pkl tutorial], you build familiarity with Pkl syntax and basic structure.\nYou also learn different ways to invoke Pkl to produce different formats.\n\n== Basic values\n\nConsider the following example Pkl file.\n\n[source,{pkl}]\n.intro.pkl\n----\nname = \"Pkl: Configure your Systems in New Ways\"\nattendants = 100\nisInteractive = true\namountLearned = 13.37\n----\n\nRunning Pkl on this file gives\n\n[source,shell]\n----\n$ pkl eval /Users/me/tutorial/intro.pkl\nname = \"Pkl: Configure your Systems in New Ways\"\nattendants = 100\nisInteractive = true\namountLearned = 13.37\n----\n\nIt may seem nothing happened.\nHowever, Pkl tells you that it _accepts the input_.\nIn other words, you now know that `intro.pkl` does not contain any errors.\n\nYou can ask Pkl to print this configuration in a different format, using the `-f` option.\nFor example, JSON:\n\n[source,shell]\n----\n$ pkl eval -f json /Users/me/tutorial/intro.pkl\n{\n  \"name\": \"Pkl: Configure your Systems in New Ways\",\n  \"attendants\": 100,\n  \"isInteractive\": true,\n  \"amountLearned\": 13.37\n}\n----\n\nOr _PropertyList_ format:\n\n[source,shell]\n----\n$ pkl eval -f plist /Users/me/tutorial/intro.pkl\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>name</key>\n  <string>Pkl: Configure your Systems in New Ways</string>\n  <key>attendants</key>\n  <integer>100</integer>\n  <key>isInteractive</key>\n  <true/>\n  <key>amountLearned</key>\n  <real>13.37</real>\n</dict>\n</plist>\n----\n\nNotice that Pkl generated `<string>`, `<integer>`, `<true/>` and `<real>` for the values in your configuration.\nThis means it has _both_ correctly derived the types of the literal values _and_ translated those types to the corresponding elements in the PropertyList.\nxref:03_writing_a_template.adoc[Part III] goes into types in more detail.\n\n\n== Structure: Classes, objects, modules\n\nA configuration often requires more than just basic values.\nTypically, you need some kind of (hierarchical) structure.\nPkl provides _immutable objects_ for this.\n\nObjects have three kinds of members: properties, elements and entries.\nFirst, look at the syntax for objects and their members.\n\n=== Properties\n\n[source,{pkl}]\n.simpleObjectWithProperties.pkl\n----\nbird { // <1>\n  name = \"Common wood pigeon\" // <2>\n  diet = \"Seeds\"\n  taxonomy { // <3>\n    species = \"Columba palumbus\"\n  }\n}\n----\n<1> This _defines_ `bird` to be an object\n<2> For primitive values, Pkl has the `=` syntax (more on this later).\n<3> Just like `bird {`, but to show that objects can be nested.\n\nThis defines an object called `bird` with three _named properties_: `name`, `diet`, and `taxonomy`.\nThe first two of these are strings, but `taxonomy` is another object.\nThis means properties in an object can have different types and objects can be nested.\n\n=== Elements\n\nOf course, you don't always have names for every individual structure in your configuration.\nWhat if you want \"just a bunch of things\" without knowing how many?\nPkl offers _elements_ for this purpose.\nElements are object members, just like properties.\nWhere you index properties by their name, you index elements by an integer.\nYou can think of an object that only contains elements as _array_.\nMuch like arrays in many languages, you can use square brackets to access an element, for example, `myObject[42]`.\n\nYou write an element, by writing only an expression.\nPkl derives the index from the number of elements already in the object.\nFor example:\n\n[source,{pkl}]\n.simpleObjectsWithElements.pkl\n----\nexampleObjectWithJustIntElements {\n  100 // <1>\n  42\n}\n\nexampleObjectWithMixedElements {\n  \"Bird Breeder Conference\"\n  (2000 + 23) // <2>\n  exampleObjectWithJustIntElements // <3>\n}\n----\n<1> When you write only the value (without a name), you describe an _element_.\n<2> Elements don't have to be literal values; they can be arbitrary _expressions_.\n<3> Elements can really be _any_ value, not just primitive values.\n\n[[entries]]\n=== Entries\n\nObjects can have one more kind of member; _entries_.\nLike a _property_, an _entry_ is \"named\" (technically _keyed_).\nUnlike a property, the name does not need to be known at declaration time.\nOf course, we need a syntax to tell entries apart from properties.\nYou write entry \"names\" by enclosing them in square brackets (\"names\" is quoted, because the names do not need to be strings; any value can index entries).\n\n[source,{pkl}]\n.simpleObjectsWithEntries.pkl\n----\npigeonShelter {\n  [\"bird\"] { // <1>\n    name = \"Common wood pigeon\"\n    diet = \"Seeds\"\n    taxonomy {\n      species = \"Columba palumbus\"\n    }\n  }\n  [\"address\"] = \"355 Bird St.\" // <2>\n}\n\nbirdCount {\n  [pigeonShelter] = 42 // <3>\n}\n----\n<1> The difference with properties is the notation of the key: `[<expression>]`.\n<2> As with properties, entries can be primitive values or objects.\n<3> Any object can be used as a key for an entry.\n\n\n=== Mixed members\n\nIn the examples so far, you have seen objects with properties, object with elements and object with entries.\nThese object members can be freely mixed.\n\n[source,{pkl}]\n.mixedObject.pkl\n----\nmixedObject {\n  name = \"Pigeon\"\n  lifespan = 8\n  \"wing\"\n  \"claw\"\n  [\"wing\"] = \"Not related to the _element_ \\\"wing\\\"\"\n  42\n  extinct = false\n  [false] {\n    description = \"Construed object example\"\n  }\n}\n----\n\nNotice, how properties (`name`, `lifespan` and `extinct`), elements (`\"wing\"`, `\"claw\"`, `42`) and entries (`\"wing\"`, `false`) are mixed together in this one object.\nYou don't have to order them by kind, and you don't require (other) special syntax.\n\n=== Collections\n\nThis free-for-all mixing of object members can become confusing.\nAlso, target formats are often considerably more restrictive.\nIn the following example, you see what happens when you try to produce JSON from `mixedObject`:\n\n[source,shell]\n----\n$ pkl eval -f json /Users/me/tutorial/mixedObject.pkl\n–– Pkl Error ––\nCannot render object with both properties/entries and elements as JSON.\nObject: \"Pigeon\"\n\n89 | text = renderer.renderDocument(value)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L90)\n----\n\nThis is why Pkl has two special types of object, namely _listings_, which contain _exclusively_ elements, and _mappings_, which contain _exclusively_ entries.\nBoth listings and mappings _are_ \"just objects,\" so, they don't require syntax besides that of objects:\n\n[source,{pkl}]\n.collections.pkl\n----\nbirds { // <1>\n  \"Pigeon\"\n  \"Parrot\"\n  \"Barn owl\"\n  \"Falcon\"\n}\n\nhabitats { // <2>\n  [\"Pigeon\"] = \"Streets\"\n  [\"Parrot\"] = \"Parks\"\n  [\"Barn owl\"] = \"Forests\"\n  [\"Falcon\"] = \"Mountains\"\n}\n----\n<1> A listing containing four elements.\n<2> A mapping containing four entries.\n\n[NOTE]\n====\n_Technically_, the correct way to define `birds` and `habitats` is by using `new Listing {...}` and `new Mapping {...}` explicitly.\nYou will see what these mean in part xref:03_writing_a_template.adoc[three] of this tutorial.\n====\n\nWhen you render _this_ configuration as JSON, everything works:\n\n[source,json]\n----\n{\n  \"birds\": [\n    \"Pigeon\",\n    \"Parrot\",\n    \"Barn owl\",\n    \"Falcon\"\n  ],\n  \"habitats\": {\n    \"Pigeon\": \"Streets\",\n    \"Parrot\": \"Parks\",\n    \"Barn owl\": \"Forests\",\n    \"Falcon\": \"Mountains\"\n  }\n}\n----\n\nNotice particularly, that you rendered the listing as a JSON _array_.\nWhen you index the listing with an integer, you're referring to the element inside the listing at the corresponding position (starting from `0`).\nFor example:\n\n[source,{pkl}]\n.indexedListing.pkl\n----\nbirds {\n  \"Pigeon\"\n  \"Parrot\"\n  \"Barn owl\"\n  \"Falcon\"\n}\n\nrelatedToSnowOwl = birds[2]\n----\nresults in\n[source,{pkl}]\n----\nbirds {\n  \"Pigeon\"\n  \"Parrot\"\n  \"Barn owl\"\n  \"Falcon\"\n}\nrelatedToSnowOwl = \"Barn owl\"\n----\n\n== Exercises\n\n1. Given the following JSON snippet (taken from W3C examples), write the `.pkl` file that produces this JSON:\n\n+\n[source,json]\n----\n{\n  \"name\": \"Common wood pigeon\",\n  \"lifespan\": 8,\n  \"friends\": {\n    \"bird1\": \"Parrot\",\n    \"bird2\": \"Albatross\",\n    \"bird3\": \"Falcon\"\n  }\n}\n----\n\n2. For some reason, we decide we no longer need the birdX names of the different birds; we just need them as an array.\n   Change your solution to the previous question to produce the following JSON result:\n\n+\n[source,json]\n----\n{\n  \"name\": \"Common wood pigeon\",\n  \"lifespan\": 8,\n  \"birds\": [\"Parrot\", \"Barn owl\", \"Falcon\"]\n}\n----\n"
  },
  {
    "path": "docs/modules/language-tutorial/pages/02_filling_out_a_template.adoc",
    "content": "= Filling out a Template\ninclude::ROOT:partial$component-attributes.adoc[]\n\nIn this second part of xref:index.adoc[the Pkl tutorial], you will learn how to write one (part of a) configuration in terms of another.\nYou will also find and fill out an existing _template_.\n\n== Composing configurations\n=== Amending\n\nThe central mechanism in Pkl for expressing one (part of a) configuration in terms of another is _amending_.\nConsider the following example.\n\n[source,{pkl}]\n.amendingObjects.pkl\n----\nbird {\n  name = \"Pigeon\"\n  diet = \"Seeds\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Dinosauria\"\n    order = \"Columbiformes\"\n  }\n}\n\nparrot = (bird) {\n  name = \"Parrot\"\n  diet = \"Berries\"\n  taxonomy {\n    order = \"Psittaciformes\"\n  }\n}\n----\n\nParrot and Pigeon have nearly identical properties.\nThey only differ in their name and taxonomy, so if you have already written out `bird`, you can say that `parrot` is just like `bird` except `name` is `\"Parrot\"`, diet is `\"Berries\"` the `taxonomy.order` is `\"Psittaciformes\"`.\nWhen you run this, Pkl expands everything fully.\n\n[source,{pkl}]\n----\nbird {\n  name = \"Pigeon\"\n  diet = \"Seeds\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Dinosauria\"\n    order = \"Columbiformes\"\n  }\n}\nparrot {\n  name = \"Parrot\"\n  diet = \"Berries\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Dinosauria\"\n    order = \"Psittaciformes\"\n  }\n}\n----\n\n[NOTE]\n====\nSo far, you have only worked with link:{uri-stdlib-Dynamic}[Dynamic] objects.\nPkl also offers link:{uri-stdlib-Typed}[Typed] objects.\n_Amending_ allows you to override, amend, and add new properties to a dynamic object.\nTyped objects will only let you amend or override existing properties, not add entirely new ones.\nThe xref:03_writing_a_template.adoc[next part of the tutorial] discusses types in more detail.\nThere, you see that amending _never changes the type_ of the object.\n====\n\nYou can also amend nested objects.\nThis allows you to only describe the difference with the outermost object for arbitrarily deeply nested structures.\nConsider the following example.\n\n[source,{pkl}]\n.nestedAmends.pkl\n----\nstockPigeon {\n  name = \"Stock pigeon\"\n  diet = \"Seeds\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Columbimorphae\"\n    order = \"Columbiformes\"\n    species = \"Columba oenas\"\n  }\n}\n\nwoodPigeon = (stockPigeon) {\n  name = \"Common wood pigeon\"\n  taxonomy { // <1>\n    species = \"Columba palumbus\"\n  }\n}\n\ndodo = (woodPigeon) { // <2>\n  name = \"Dodo\"\n  extinct = true // <3>\n  taxonomy {\n    species = \"Raphus cucullatus\"\n  }\n}\n----\n<1> This amends `species`, _as it occurs in_ `stockPigeon`.\n<2> Amended objects can, themselves, be amended.\n<3> New fields can be added to objects when amending.\n\nNotice how you only have to change `taxonomy.species`.\nIn this example, `stockPigeon.taxonomy` has `kingdom`, `clade`, `order` and `species`.\nYou are amending `stockPigeon`, to define `woodPigeon`.\nThey have the same `taxonomy`, except for `species`.\nThis notation says that everything in `taxonomy` should be what it is in the object you are amending (`stockPigeon`), except for `species`, which should be `\"Columba palumbus\"` .\n\nFor the input above, Pkl produces the following output.\n[source,{pkl}]\n----\nstockPigeon {\n  name = \"Stock pigeon\"\n  diet = \"Seeds\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Columbimorphae\"\n    order = \"Columbiformes\"\n    species = \"Columba oenas\"\n  }\n}\nwoodPigeon {\n  name = \"Common wood pigeon\"\n  diet = \"Seeds\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Columbimorphae\"\n    order = \"Columbiformes\"\n    species = \"Columba palumbus\"\n  }\n}\ndodo {\n  name = \"Dodo\"\n  diet = \"Seeds\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Columbimorphae\"\n    order = \"Columbiformes\"\n    species = \"Raphus cucullatus\"\n  }\n  extinct = true\n}\n----\n\nSo far, you have only amended _properties_.\nSince you refer to them by name, it makes sense that you \"overwrite\" the value from the object you're amending.\nWhat if you include _elements_ or _entries_ in an amends expression?\n\n[source,{pkl}]\n.amendElementsAndEntries.pkl\n----\nfavoriteFoods {\n  \"red berries\"\n  \"blue berries\"\n  [\"Barn owl\"] {\n    \"mice\"\n  }\n}\n\nadultBirdFoods = (favoriteFoods) {\n  [1] = \"pebbles\" // <1>\n  \"worms\" // <2>\n  [\"Falcon\"] { // <3>\n    \"insects\"\n    \"amphibians\"\n  }\n  [\"Barn owl\"] { // <4>\n    \"fish\"\n  }\n}\n----\n<1> Explicitly amending _by index_ replaces the element at that index.\n<2> Without explicit indices, Pkl can't know which element to overwrite, so, instead, it _adds_ an element to the object you're amending.\n<3> When you write \"new\" entries (using a key that does not occur in the object you're amending), Pkl also _adds_ them.\n<4> When you write an entry using a key that exists, this notation amends its value.\n\nPkl can't know which of the `favoriteFoods` to overwrite only by their _value_.\nWhen you want to _replace_ an element, you have to explicitly amend the element at a specific index.\nThis is why a \"plain\" element in an amends expression is _added_ to the object being amended.\nResult:\n\n[source,{pkl}]\n----\nfavoriteFoods {\n  [\"Barn owl\"] {\n    \"mice\"\n  }\n  \"red berries\"\n  \"blue berries\"\n}\nadultBirdFoods {\n  [\"Barn owl\"] {\n    \"mice\"\n    \"fish\"\n  }\n  \"red berries\"\n  \"pebbles\"\n  [\"Falcon\"] {\n    \"insects\"\n    \"amphibians\"\n  }\n  \"worms\"\n}\n----\n\n\n=== Modules\n\nA `.pkl` file describes a _module_.\nModules are objects that can be referred to from other modules.\nGoing back to the example above, you can write `pigeon` as a separate module.\n\n[source,{pkl}]\n.pigeon.pkl\n----\nname = \"Common wood pigeon\"\ndiet = \"Seeds\"\ntaxonomy {\n  kingdom = \"Animalia\"\n  clade = \"Dinosauria\"\n  species = \"Columba palumbus\"\n}\n----\n\nYou can `import` this module and express `parrot` like you did before.\n\n[source,{pkl}]\n.parrot.pkl\n----\nimport \"pigeon.pkl\" // <1>\n\nparrot = (pigeon) {\n  name = \"Great green macaw\"\n  diet = \"Berries\"\n  taxonomy {\n    species = \"Ara ambiguus\"\n  }\n}\n----\n<1> Importing `pigeon.pkl` creates the object `pigeon`, so you can refer to `pigeon` in this code, like you did before.\n\nIf you run Pkl on both, you will see that it works.\nLooking at the result, however, you see a (possibly) unexpected difference.\n\n[source,{pkl}]\n----\n$ pkl eval /Users/me/tutorial/pigeon.pkl\nname = \"Common wood pigeon\"\ndiet = \"Seeds\"\ntaxonomy {\n  kingdom = \"Animalia\"\n  clade = \"Dinosauria\"\n  species = \"Columba palumbus\"\n}\n\n$ pkl eval /Users/me/tutorial/parrot.pkl\nparrot {\n  name = \"Great green macaw\"\n  diet = \"Berries\"\n  taxonomy {\n    kingdom = \"Animalia\"\n    clade = \"Dinosauria\"\n    species = \"Ara ambiguus\"\n  }\n}\n----\n\nThe object `pigeon` is \"spread\" in the top-level, while `parrot` is a nested and named object.\nThis is because writing `parrot {...}` defines an object property _in_ the \"current\" module.\n\nIn order to say that \"this module is an object, amended from the `pigeon` module,\" you use an _amends clause_.\n\n[source,{pkl}]\n.parrot.pkl\n----\namends \"pigeon.pkl\" // <1>\n\nname = \"Great green macaw\"\n----\n<1> \"This\" module is the same as `\"pigeon.pkl\"`, except for what is in the remainder of the file.\n\n[NOTE]\n====\nAs a first intuition, think of \"amending a module\" as \"filling out a form.\"\n====\n\n== Amending templates\n\nA Pkl file can be either a _template_ or a _\"normal\" module_.\nThis terminology describes the _intended use_ of the module and doesn't imply anything about its structure.\nIn other words: just by looking at Pkl code, you can't tell whether it is a template or a \"normal\" module.\n\n[source,{pkl}]\n.AcmeCICD.pkl\n----\nmodule AcmeCICD\n\nclass Pipeline {\n  name: String(nameRequiresBranchName)?\n\n  hidden nameRequiresBranchName = (_) ->\n      if (branchName == null)\n        throw(\"Pipelines that set a 'name' must also set a 'branchName'.\")\n      else true\n\n  branchName: String?\n}\n\ntimeout: Int(this >= 3)\n\npipelines: Listing<Pipeline>\n\noutput {\n  renderer = new YamlRenderer {}\n}\n----\n\nRemember that amending is like filling out a form.\nThat's exactly what you're doing here; you're filling out \"work order forms\".\n\nNext, add a time-out of one minute for your job.\n\n[source,{pkl}]\n.cicd.pkl\n----\namends \"AcmeCICD.pkl\"\n\ntimeout = 1\n----\nUnfortunately, Pkl does not accept this configuration and provides a rather elaborate error message:\n[source,plain]\n----\n–– Pkl Error –– // <1>\nType constraint `this >= 3` violated. // <2>\nValue: 1 // <3>\n\n225 | timeout: Int(this >= 3)? // <4>\n                   ^^^^^^^^^\nat AcmeCICD#timeout (file:///Users/me/tutorial/AcmeCICD.pkl, line 8)\n\n3 | timeout = 1 // <5>\n              ^\nat cicd#timeout (file:///Users/me/tutorial/cicd.pkl, line 3)\n\n90 | text = renderer.renderDocument(value) // <6>\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (https://github.com/apple/pkl/blob/e4d8c882d/stdlib/base.pkl#L90)\n\n----\n<1> Pkl found an error.\n<2> Which error Pkl found.\n<3> What the offending value is.\n<4> Where Pkl found its expectation (line 8 of the amended module).\n<5> Where Pkl found the offending value (line 3 of the input module).\n<6> What Pkl evaluated to discover the error.\n\nWhen Pkl prints source locations, it also prints clickable links for easy access.\nFor local files, it generates a link for your development environment (https://pkl-lang.org/main/current/pkl-cli/index.html#settings-file[configurable in `+~/.pkl/settings.pkl+`]).\nFor packages imported from elsewhere, if available, Pkl produces `https://` links to their repository.\n\nPkl complains about a _type constraint_.\nPkl's type system doesn't just protect you from providing a `String` where you expected an `Int`, it even checks which _values_ are allowed.\nIn this case, the minimum time-out is _three_ minutes.\nIf you change the value to `3`, Pkl accepts your configuration.\n\n[source, shell]\n----\n$ pkl eval cicd.pkl\ntimeout: 3\npipelines: []\n----\n\nYou can now define a pipeline.\nStart off by specifying the name of the pipeline and nothing else.\n\n[source,{pkl}]\n.cicd.pkl\n----\namends \"AcmeCICD.pkl\"\n\ntimeout = 3\npipelines {\n  new { // <1>\n    name = \"prb\"\n  }\n}\n----\n<1> There is no pipeline object to amend. The `new` keyword gives you an object to amend.\n\nSo far, you've defined objects the same way you amended them.\nIf the name `foo` didn't occur before, `foo { ... }` _creates_ a property called `foo` and assigns to it the contents in place of the `...` (given that `...` is not valid Pkl, but an abbreviation for illustration purposes).\nIf `foo` is an existing object, this notation is an _amend expression_; resulting in a new _object_ (value), but _not_ a new (named) property.\nSince `pipelines` is a listing, you can _add_ elements by writing expressions in an amend expression.\n\nIn this case, though, there is no object to amend. Writing `myNewPipeline { ... }` defines a _property_, but listings may only include _elements_.\nThis is where you can use the keyword `new`.\n\n`new` gives you an object to amend.\nPkl derives from the context in which `new` is used and what the object to amend should look like.\nThis is called the _default value_ for the context.\nxref:03_writing_a_template.adoc[The next part] goes into detail about how Pkl does this.\n\nRunning Pkl on your new configuration produces a verbose error.\n\n[source,plain]\n.cicd.pkl\n----\n–– Pkl Error ––\nPipelines that set a 'name' must also set a 'branchName'.\n\n8 | throw(\"Pipelines that set a 'name' must also set a 'branchName'.\")\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat AcmeCICD#Pipeline.nameRequiresBranchName.<function#1> (file:///Users/me/tutorial/AcmeCICD.pkl, line 8)\n\n6 | name = \"prb\"\n           ^^^^^\nat cicd#pipelines[#1].name (file:///Users/me/tutorial/cicd.pkl, line 6)\n\n90 | text = renderer.renderDocument(value)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (https://github.com/apple/pkl/blob/e4d8c882d/stdlib/base.pkl#L90)\n\n----\n\nYou have hit another type constraint, like `timeout: Int(this >= 3)` before.\nIn this case, the error message consists of an English language sentence, instead of Pkl code.\nWhen constraints are complicated or very application specific, template authors can `throw` a more descriptive error message like this.\n\nThe message is quite instructive, so you can fix the error by adding a `branchName`.\n\n[source,{pkl}]\n.cicd.pkl\n----\namends \"AcmeCICD.pkl\"\n\ntimeout = 3\npipelines {\n  new {\n    name = \"prb\"\n    branchName = \"main\"\n  }\n}\n----\n\nand indeed\n\n[source,{pkl}]\n----\n$ pkl eval -f yml /Users/me/tutorial/cicd.pkl\ntimeout: 3\npipelines:\n- name: prb\n  branchName: main\n----\n"
  },
  {
    "path": "docs/modules/language-tutorial/pages/03_writing_a_template.adoc",
    "content": "= Writing a Template\ninclude::ROOT:partial$component-attributes.adoc[]\n\nIn parts xref:01_basic_config.adoc[one] and xref:02_filling_out_a_template.adoc[two], you saw that Pkl provides _validation_ of our configurations.\nIt checks syntax, types and constraints.\nAs you saw in the `AcmeCICD` example xref:02_filling_out_a_template.adoc#amending-templates[here], the template can provide informative error messages when an amending module violates a type constraint.\n\nIn this final part, you will see some of Pkl's techniques that are particularly relevant for writing a template.\n\n== Basic types\n\nPkl always checks the _syntax_ of its input.\nAs it evaluates your configuration, it also checks _types_.\nYou've seen objects, listings, and mappings already.\nThese provide ways to write structured configuration.\nBefore you can write types for them, you need to know how to write the types for the simplest (unstructured) values.\n\nThese are all Pkl's _basic_ types:\n\n[source,{pkl}]\n.pklTutorialPart3.pkl\n----\nname: String = \"Writing a Template\"\n\npart: Int = 3\n\nhasExercises: Boolean = true\n\namountLearned: Float = 13.37\n\nduration: Duration = 30.min\n\nbandwidthRequirementPerSecond: DataSize = 52.4288.mb\n----\n\nIn the above, you've explicitly annotated the code with type signatures.\nThe default output of Pkl is actually `pcf`, which is a subset of Pkl.\nSince `pcf` does not have type signatures, running Pkl on this example removes them.\n\n[source,shell]\n----\n$ pkl eval pklTutorialPart3.pkl\nname = \"Writing a Template\"\npart = 3\nhasExercises = true\namountLearned = 13.37\nduration = 30.min\nbandwidthRequirementPerSecond = 52.4288.mb\n----\n\nNote how `Duration` and `DataSize` help you prevent https://en.wikipedia.org/wiki/Mars_Climate_Orbiter[unit errors] in these common (for configuration) domains.\n\n== Typed objects, properties and amending\n\nHaving a notation for basic types, you can now write _typed objects_.\n\n[source,{pkl}]\n.simpleClass.pkl\n----\nclass Language { // <1>\n  name: String\n}\n\nbestForConfig: Language = new { // <2>\n  name = \"Pkl\"\n}\n----\n<1> A class definition.\n<2> A property definition, using the `Language` class.\n\n[NOTE]\n====\nAlthough not required (or enforced), it's customary to name properties starting with a lower-case letter. Class names, by that same convention, start with an upper-case letter.\n====\n\nYou can type objects with _classes_.\nIn this example, you define a class called `Language`.\nYou can now be certain that every instance of `Language` has a property `name` with type `String`.\n\nTypes and values are different things in Pkl.\nPkl does not render types in its output,footnote:[Although, some output formats can contain their own form of type annotation. This may be derived from the Pkl type. Type definitions (`class` and `typealias`) themselves are never rendered.] so when you run Pkl on this, you don't see the class _definition_ at all.\n\n[source,{pkl}]\n----\n$ pkl eval simpleClass.pkl\nbestForConfig {\n  name = \"Pkl\"\n}\n\n----\n\nDid you notice that the output doesn't just omit the type signature, but also the `= new`?\nWe will discuss this further in the next section.\n\nWhen your configuration describes a few different parts like this, you can define one instance and amend it for every other instance.\n\nFor example:\n\n[source,{pkl}]\n.pklTutorialParts.pkl\n----\nclass TutorialPart {\n  name: String\n  \n  part: Int\n  \n  hasExercises: Boolean\n  \n  amountLearned: Float\n  \n  duration: Duration\n  \n  bandwidthRequirementPerSecond: DataSize\n}\n\npklTutorialPart1: TutorialPart = new {\n  name = \"Basic Configuration\"\n  part = 1\n  hasExercises = true\n  amountLearned = 13.37\n  duration = 30.min\n  bandwidthRequirementPerSecond = 50.mib.toUnit(\"mb\")\n}\n\npklTutorialPart2: TutorialPart = (pklTutorialPart1) {\n  name = \"Filling out a Template\"\n  part = 2\n}\n\npklTutorialPart3: TutorialPart = (pklTutorialPart1) {\n  name = \"Writing a Template\"\n  part = 3\n}\n\n----\n\nYou can read this as saying \"``pklTutorialPart2`` & `pklTutorialPart3` are exactly like `pklTutorialPart1`, except for their `name` and `part`.\"\nRunning Pkl confirms this:\n\n[source,shell]\n----\n$ pkl eval pklTutorialParts.pkl\npklTutorialPart1 {\n  name = \"Basic Configuration\"\n  part = 1\n  hasExercises = true\n  amountLearned = 13.37\n  duration = 30.min\n  bandwidthRequirementPerSecond = 52.4288.mb\n}\npklTutorialPart2 {\n  name = \"Filling out a Template\"\n  part = 2\n  hasExercises = true\n  amountLearned = 13.37\n  duration = 30.min\n  bandwidthRequirementPerSecond = 52.4288.mb\n}\npklTutorialPart3 {\n  name = \"Writing a Template\"\n  part = 3\n  hasExercises = true\n  amountLearned = 13.37\n  duration = 30.min\n  bandwidthRequirementPerSecond = 52.4288.mb\n}\n\n----\n\nSadly, `pklTutorialParts.pkl` is a _rewrite_ of `pklTutorialPart3.pkl`.\nIt creates a separate `class TutorialPart` and instantiates three properties with it (`pklTutorialPart1`, `pklTutorialPart2` and `pklTutorialPart3`).\nIn doing so, it implicitly moves everything \"down\" one level (`pklTutorialPart3` is now a property in the module `pklTutorialParts`, whereas above, in `pklTutorialPart3.pkl` it was its own module).\nThis is not very DRY.\nAs a matter of fact, you don't need this rewrite.\n\nAny `.pkl` file defines a _module_ in Pkl.\nAny module is represented by a _module class_, which is an actual Pkl `class`.\nA module is not quite the same as any other class, because Pkl never renders class definitions on the output.\nHowever, when you ran Pkl on `pklTutorialPart3.pkl`, it _did_ produce an output.\nThis is because a module also defines an _instance_ of the module class.\n\nThe values given to properties in a module (or in any \"normal\" class) are called _default values_.\nWhen you instantiate a class, all the properties for which you _don't_ provide a value are populated from the class' default values.\n\nIn our examples of tutorial parts, only the `name` and `part` varied across instances.\nYou can express this by adding default values to the (module) class definition.\nInstead of starting from a particular tutorial part, you can define the module `tutorialPart` as follows:\n\n[source,{pkl}]\n.TutorialPart.pkl\n----\nname: String // <1>\n\npart: Int // <1>\n\nhasExercises: Boolean = true // <2>\n\namountLearned: Float = 13.37 // <2>\n\nduration: Duration = 30.min // <2>\n\nbandwidthRequirementPerSecond: DataSize = 52.4288.mb // <2>\n----\n<1> No default value given.\n<2> Default value given.\n\nRunning this through Pkl gives an error, or course, because of the missing values:\n\n[source, shell]\n----\n$ pkl eval TutorialPart.pkl\n–– Pkl Error ––\nTried to read property `name` but its value is undefined.\n\n1 | name: String\n    ^^^^\n...\n----\n\nAn individual part now only has to fill in the missing fields, so you can change `pklTutorialPart3.pkl` to amend this:\n\n[source,{pkl}]\n.pklTutorialPart3.pkl\n----\namends \"TutorialPart.pkl\"\n\nname = \"Writing a Template\"\n\npart = 3\n----\n\nThis results in\n\n[source, shell]\n----\n$ pkl eval pklTutorialPart3.pkl\nname = \"Writing a Template\"\npart = 3\nhasExercises = true\namountLearned = 13.37\nduration = 30.min\nbandwidthRequirementPerSecond = 52.4288.mb\n\n----\n\nThis now behaves exactly like our `pklTutorialPart3: TutorialPart = (pklTutorialPart1) {...` before.\n`pklTutorialPart3` is now defined as the value we get by amending `tutorialPart` and giving it a `name` and a `part`.\n\n[IMPORTANT]\n====\nAmending anything _never changes its type_.\nWhen we amend an object of type `Foo`, the result will always be precisely of type `Foo`.\nBy \"precisely\" we mean, that amending an object also can't \"turn it into\" an instance of a sub-class of the class of the object being amended.\n====\n\n== A new template\n\nNow that you know about types, you can start writing your first template.\nSo far, you've written configurations with Pkl, either without a template, or using the `AcmeCICD` template from xref:02_filling_out_a_template.adoc#amending-templates[Amending templates].\nIt is often easiest to first write a (typical) configuration for which you want to create a template.\nSuppose you want to define what a live workshop for this tutorial looks like.\nConsider this example:\n\n[source,{pkl}]\n.workshop2024.pkl\n----\ntitle = \"Pkl: Configure your Systems in New Ways\"\ninteractive = true\nseats = 100\noccupancy = 0.85\nduration = 1.5.h\n`abstract` = \"\"\"\n  With more systems to configure, the software industry is drowning in repetitive and brittle configuration files.\n  YAML and other configuration formats have been turned into programming languages against their will.\n  Unsurprisingly, they don’t live up to the task.\n  Pkl puts you back in control.\n  \"\"\"\n\nevent {\n  name = \"Migrating Birds between hemispheres\"\n  year = 2024\n}\n\ninstructors {\n  \"Kate Sparrow\"\n  \"Jerome Owl\"\n}\n\nsessions {\n  new {\n    date = \"2/1/2024\"\n    time = 30.min\n  }\n  new {\n    date = \"2/1/2024\"\n    time = 30.min\n  }\n}\n\nassistants {\n  [\"kevin\"] = \"Kevin Parrot\"\n  [\"betty\"] = \"Betty Harrier\"\n}\n\nagenda {\n  [\"beginners\"] {\n    name = \"Basic Configuration\"\n    part = 1\n    duration = 45.min\n  }\n  [\"intermediates\"] {\n    name = \"Filling out a Template\"\n    part = 2\n    duration = 45.min\n  }\n  [\"experts\"] {\n    name = \"Writing a Template\"\n    part = 3\n    duration = 45.min\n  }\n}\n----\n\nCall your new template `Workshop.pkl`.\nAlthough not required, it's good practice to always name your template with a `module`-clause.\nDefining the first few properties are like you saw in the previous section:\n\n[source,{pkl}]\n----\nmodule Workshop\n\ntitle: String\n\ninteractive: Boolean\n\nseats: Int\n\noccupancy: Float\n\nduration: Duration\n\n`abstract`: String\n----\n\nUnlike these first few properties, `event` is an object with multiple properties.\nTo be able to type `event`, you need a `class`.\nYou've seen before how to define this:\n\n[source,{pkl}]\n----\nclass Event {\n  name: String\n\n  year: Int\n}\n\nevent: Event\n----\n\nNext, `instructors` isn't an object with properties, but a list of unnamed values.\nPkl offers the `Listing` type for this:\n\n\n[source,{pkl}]\n----\ninstructors: Listing<String>\n----\n\n`sessions` is a `Listing` of objects, so you need a `Session` class.\n[source,{pkl}]\n----\nclass Session {\n  time: Duration\n\n  date: String\n}\n\nsessions: Listing<Session>\n----\n\n`assistants` has a structure like an object, in that all the values are named, but the set of names is not fixed for all possible workshops (and some workshops may have more assistants than others). The Pkl type for this is a `Mapping`:\n\n[source,{pkl}]\n----\nassistants: Mapping<String, String>\n----\n\nFinally, for every workshop session, there is an `agenda`, which describes which ``TutorialPart``s are covered.\nYou already defined `TutorialPart.pkl` as its own module, so you should not define a separate class, but rather `import` that module and reuse it here:\n\n[source,{pkl}]\n----\nimport \"TutorialPart.pkl\" // <1>\n\nagenda: Mapping<String, TutorialPart>\n----\n<1> This `import` clause brings the name `TutorialPart` into scope, which is the module class as discussed above. Note that import clauses must appear before property definitions.\n\nPutting it all together, your `Workshop.pkl` template looks like this:\n\n[source,{pkl}]\n.Workshop.pkl\n----\nmodule Workshop\n\nimport \"TutorialPart.pkl\"\n\ntitle: String\n\ninteractive: Boolean\n\nseats: Int\n\noccupancy: Float\n\nduration: Duration\n\n`abstract`: String\n\nclass Event {\n  name: String\n\n  year: Int\n}\n\nevent: Event\n\ninstructors: Listing<String>\n\nclass Session {\n  time: Duration\n\n  date: String\n}\n\nsessions: Listing<Session>\n\nassistants: Mapping<String, String>\n\nagenda: Mapping<String, TutorialPart>\n----\n"
  },
  {
    "path": "docs/modules/language-tutorial/pages/index.adoc",
    "content": "= Tutorial\ninclude::ROOT:partial$component-attributes.adoc[]\n\nWelcome to the Pkl tutorial. We will get you up and running quickly!\nIf you are new to Pkl, we recommend that you follow along with the code examples.\nThis tutorial describes interactions with the xref:pkl-cli:index.adoc#repl[REPL].\nFor an even more interactive experience, follow along using a xref:main:ROOT:tools.adoc[supported editor].\n\nFor more comprehensive documentation, see xref:language-reference:index.adoc[Language Reference].\nFor ready-to-go examples with full source code, see xref:ROOT:examples.adoc[].\nFor API documentation, see xref:ROOT:standard-library.adoc[Standard Library].\n\nPick a tutorial by topic:\n\n1. xref:01_basic_config.adoc[Basic Configuration]\n2. xref:02_filling_out_a_template.adoc[Filling out a Template]\n3. xref:03_writing_a_template.adoc[Writing a Template]\n"
  },
  {
    "path": "docs/modules/pkl-cli/pages/index.adoc",
    "content": "= CLI\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-homebrew: https://brew.sh\n:uri-mise: https://mise.jdx.dev\n:uri-winget: https://learn.microsoft.com/en-us/windows/package-manager/\n\n:uri-pkl-macos-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-amd64&e=bin\n:uri-pkl-macos-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-macos-aarch64&e=bin\n:uri-pkl-linux-amd64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-amd64&e=bin\n:uri-pkl-linux-aarch64-download: {uri-sonatype-snapshot-download}&a=pkl-cli-linux-aarch64&e=bin\n:uri-pkl-alpine-download: {uri-sonatype-snapshot-download}&a=pkl-cli-alpine-linux-amd64&e=bin\n:uri-pkl-windows-download: {uri-sonatype-snapshot-download}&a=pkl-cli-windows-amd64&e=exe\n:uri-pkl-java-download: {uri-sonatype-snapshot-download}&a=pkl-cli-java&e=jar\n\nifdef::is-release-version[]\n:uri-pkl-macos-amd64-download: {github-releases}/pkl-macos-amd64\n:uri-pkl-macos-aarch64-download: {github-releases}/pkl-macos-aarch64\n:uri-pkl-linux-amd64-download: {github-releases}/pkl-linux-amd64\n:uri-pkl-linux-aarch64-download: {github-releases}/pkl-linux-aarch64\n:uri-pkl-alpine-download: {github-releases}/pkl-alpine-linux-amd64\n:uri-pkl-windows-download: {github-releases}/pkl-windows-amd64.exe\n:uri-pkl-java-download: {uri-maven-repo}/org/pkl-lang/pkl-cli-java/{pkl-artifact-version}/pkl-cli-java-{pkl-artifact-version}.jar\nendif::[]\n\n:uri-pkl-stdlib-docs-settings: {uri-pkl-stdlib-docs}/settings/\n:uri-pkl-cli-main-sources: {uri-github-tree}/pkl-cli/src/main/kotlin/org/pkl/cli\n:uri-pkl-cli-CliEvaluatorOptions: {uri-pkl-cli-main-sources}/CliEvaluatorOptions.kt\n:uri-certificates: {uri-github-tree}/pkl-commons-cli/src/main/resources/org/pkl/commons/cli/commands\n:uri-ci-artifacts: https://s01.oss.sonatype.org/content/groups/public/org/pkl-lang/\n\nThe `pkl` command-line interface (CLI) evaluates Pkl modules and writes their output to the console or a file.\nFor interactive development, the CLI includes a Read-Eval-Print Loop (REPL).\n\n[[installation]]\n== Installation\n\nThe CLI comes in multiple flavors:\n\n* Native macOS executable for amd64 (tested on macOS 10.15)\n* Native Linux executable for amd64\n* Native Linux executable for aarch64\n* Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8)\n* Native Windows executable for amd64 (tested on Windows Server 2022)\n* Java executable (tested with Java 17/21 on macOS and Oracle Linux)\n\nOn macOS, Linux, and Windows, we recommend using the native executables.\nThey are self-contained, start up instantly, and run complex Pkl code much faster than the Java executable.\n\n.What is the Difference Between the Linux and Alpine Linux Executables?\n[NOTE]\n====\nThe Linux executable is dynamically linked against _glibc_ and _libstdc{plus}{plus}_,\nwhereas, the Alpine Linux executable is statically linked against _musl libc_ and _libstdc{plus}{plus}_.\n====\n\nThe Java executable works on multiple platforms and has a smaller binary size than the native executables.\nHowever, it requires a Java 17 (or higher) runtime on the system path, and has a noticeable startup delay.\n\nAll flavors are built from the same codebase and undergo the same automated testing.\nExcept where noted otherwise, the rest of this page discusses the native executables.\n\n[[homebrew]]\n=== Homebrew\n\nOn macOS and Linux, release versions can be installed with {uri-homebrew}[Homebrew].\n\nifdef::is-release-version[]\nTo install Pkl, run:\n\n[source,shell]\n----\nbrew install pkl\n----\n\nTo update Pkl, run:\n\n[source,shell]\n----\nbrew update\nbrew upgrade pkl   # or just `brew upgrade`\n----\nendif::[]\n\nifndef::is-release-version[]\nFor instructions, switch to a release version of this page.\nendif::[]\n\n[[mise]]\n=== Mise\n\nOn macOS, Linux, and Windows, release versions can be installed with {uri-mise}[Mise].\n\nifdef::is-release-version[]\nTo install Pkl, run:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\n# Install and activate Pkl globally\nmise use -g pkl@{pkl-version}\n\n# Install and activate Pkl locally\nmise use pkl@{pkl-version}\n----\nendif::[]\n\nifndef::is-release-version[]\nFor instructions, switch to a release version of this page.\nendif::[]\n\n[[winget]]\n=== Windows Package Manager\n\nOn Windows, release versions can be installed with {uri-winget}[Windows Package Manager].\n\nifdef::is-release-version[]\nTo install Pkl, run:\n\n[source,shell]\n----\nwinget install Apple.Pkl\n----\n\nTo update Pkl, run:\n\n[source,shell]\n----\nwinget upgrade Apple.Pkl\n----\nendif::[]\n\nifndef::is-release-version[]\nFor instructions, switch to a release version of this page.\nendif::[]\n\n[[download]]\n=== Download\n\nDevelopment and release versions can be downloaded and installed manually.\n\n=== macOS Executable\n\nOn aarch64:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl '{uri-pkl-macos-aarch64-download}'\nchmod +x pkl\n./pkl --version\n----\n\nOn amd64:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl '{uri-pkl-macos-amd64-download}'\nchmod +x pkl\n./pkl --version\n----\n\nThis should print something similar to:\n\n[source]\n[subs=\"+attributes\"]\n----\nPkl {pkl-version} (macOS, native)\n----\n\n[[linux-executable]]\n=== Linux Executable\n\nThe Linux executable is dynamically linked against _glibc_ and _libstdc{plus}{plus}_ for the amd64 and aarch64 architectures.\nFor a statically linked executable, see <<Alpine Linux Executable>>.\n\nOn aarch64:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl '{uri-pkl-linux-aarch64-download}'\nchmod +x pkl\n./pkl --version\n----\n\nOn amd64:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl '{uri-pkl-linux-amd64-download}'\nchmod +x pkl\n./pkl --version\n----\n\nThis should print something similar to:\n\n[source]\n[subs=\"+attributes\"]\n----\nPkl {pkl-version} (Linux, native)\n----\n\n[[alpine-linux-executable]]\n=== Alpine Linux Executable\n\nThe Alpine Linux executable is statically linked against _musl libc_ and _libstdc{plus}{plus}_.\nFor a dynamically linked executable, see <<Linux Executable>>.\n\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o pkl '{uri-pkl-alpine-download}'\nchmod +x pkl\n./pkl --version\n----\n\nThis should print something similar to:\n\n[source]\n[subs=\"+attributes\"]\n----\nPkl {pkl-version} (Linux, native)\n----\n\nNOTE: We currently do not support the aarch64 architecture for Alpine Linux.\n\n[[windows-executable]]\n=== Windows Executable\n\n[source,PowerShell]\n[subs=\"+attributes\"]\n----\nInvoke-WebRequest '{uri-pkl-windows-download}' -OutFile pkl.exe\n.\\pkl --version\n----\n\nThis should print something similar to:\n\n[source]\n[subs=\"+attributes\"]\n----\nPkl {pkl-version} (Windows 10.0, native)\n----\n\nNOTE: We currently do not support the aarch64 architecture for Windows.\n\n[[java-executable]]\n=== Java Executable\n\nThe Java executable is a jar that can be executed directly on macOS, Linux, and Windows.\n\nIt requires `java` to be installed, and available on `$PATH`.\n\n[tabs]\n====\nmacOS/Linux::\n+\n[source,shell]\n[subs=\"+attributes\"]\n----\ncurl -L -o jpkl '{uri-pkl-java-download}'\nchmod +x jpkl\n./jpkl --version\n----\n\nWindows::\n+\n[source,PowerShell]\n[subs=\"+attributes\"]\n----\nInvoke-WebRequest '{uri-pkl-java-download}' -OutFile jpkl.bat\n.\\jpkl --version\n----\n====\n\nThis should print something similar to:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\nPkl {pkl-version} (macOS 14.2, Java 17.0.10)\n----\n\nNOTE: The Java executable is named `jpkl`.\n\n[[usage]]\n== Usage\n\n*Synopsis:* `pkl <subcommand> [<options>] [<args>]`\n\nFor a brief description of available options, run `pkl -h`.\n\nNOTE: The Java executable is named `jpkl`.\n\n[[command-eval]]\n=== `pkl eval`\n\n*Synopsis:* `pkl eval [<options>] [<modules>]`\n\nEvaluate the given Pkl `<modules>` and produce their rendering results.\n\n<modules>::\nThe absolute or relative URIs of the modules to evaluate.\nRelative URIs are resolved against the working directory.\n\n==== Options\n\n[[format]]\n.-f, --format\n[%collapsible]\n====\nDefault: (none) +\nExample: `yaml` +\nThe output format to generate.\nThe default output renderer for a module supports the following formats:\n\n* `json`\n* `jsonnet`\n* `pcf`\n* `plist`\n* `properties`\n* `textproto`\n* `xml`\n* `yaml`\n\nIf no format is set, the default renderer chooses `pcf`.\n====\n\n[[output-path]]\n.-o, --output-path\n[%collapsible]\n====\nDefault: (none) +\nExample: \"config.yaml\" +\nThe file path where the output file is placed.\nRelative paths are resolved against the project directory.\n\n// suppress inspection \"AsciiDocLinkResolve\"\nThis option is mutually exclusive with link:#multiple-file-output-path[`--multiple-file-output-path`].\nIf neither option is set, each module's `output.text` is written to standard output.\n\nIf multiple source modules are given, placeholders can be used to map them to different output files.\nThe following placeholders are supported:\n\n`%\\{moduleDir}`:::\nThe directory path of the module, relative to the working directory.\nOnly available when evaluating file-based modules.\n\n`%\\{moduleName}`:::\nThe simple module name as inferred from the module URI.\nFor hierarchical URIs such as `+file:///foo/bar/baz.pkl+`, this is the last path segment without file extension.\n\n`%\\{outputFormat}`:::\nThe requested output format.\nOnly available if `--format` is set.\n\nIf multiple source modules are mapped to the same output file, their outputs are concatenated.\nBy default, module outputs are separated with `---`, as in a YAML stream.\n// suppress inspection \"AsciiDocLinkResolve\"\nThe separator can be customized using the link:#module-output-separator[`--module-output-separator`] option.\n====\n\n[[module-output-separator]]\n.--module-output-separator\n[%collapsible]\n====\nDefault: `---` (as in a YAML stream) +\nThe separator to use when multiple module outputs are written to the same file, or to standard output.\n====\n\n[[multiple-file-output-path]]\n.-m, --multiple-file-output-path\n[%collapsible]\n====\nDefault: (none) +\nExample: \"output/\" +\nThe directory where a module's output files are placed.\n\nSetting this option causes Pkl to evaluate a module's `output.files` property\nand write the files specified therein.\nWithin `output.files`, a key determines a file's path relative to `--multiple-file-output-path`,\nand a value determines the file's contents.\n\n// suppress inspection \"AsciiDocLinkResolve\"\nThis option cannot be used together with any of the following:\n\n* xref:output-path[`--output-path`]\n* xref:expression[`--expression`]\n\n// suppress inspection \"AsciiDocLinkResolve\"\nThis option supports the same placeholders as link:#output-path[`--output-path`].\n\nExamples:\n\n[source,shell]\n----\n# Write files to `output/`\npkl eval -m output/ myFiles.pkl\n\n# Write files to the current working directory\npkl eval -m . myFiles.pkl\n\n# Write foo.pkl's files to the `foo` directory, and bar.pkl's files\n# to the `bar` directory\npkl eval -m \"%{moduleName}\" foo.pkl bar.pkl\n----\n\nFor additional details, see xref:language-reference:index.adoc#multiple-file-output[Multiple File Output]\nin the language reference.\n====\n\n[[expression]]\n.-x, --expression\n[%collapsible]\n====\nDefault: (none) +\nThe expression to be evaluated within the module.\n\nThis option causes Pkl to evaluate the provided expression instead of the module's `output.text` or `output.files` properties.\nThe resulting value is then stringified, and written to either standard out, or the designated output file.\n\nFor example, consider the following Pkl module:\n\n.pigeon.pkl\n[source%tested,{pkl}]\n----\nmetadata {\n  species = \"Pigeon\"\n}\n----\n\nThe following command prints `Pigeon` to the console:\n\n[source,shell]\n----\npkl eval -x metadata.species pigeon.pkl\n# => Pigeon\n----\n\nSetting an `--expression` flag can be thought of as substituting the expression in place of a module's `output.text` property.\nRunning the previous command is conceptually the same as if the below module were evaluated without the `--expression` flag:\n\n[source,pkl]\n----\nmetadata {\n  species = \"Pigeon\"\n}\n\noutput {\n  text = metadata.species.toString()\n}\n----\n====\n\n[[power-assertions-eval]]\n.--power-assertions, --no-power-assertions\n[%collapsible]\n====\nDefault: enabled +\nEnable or disable power assertions for detailed assertion failure messages.\nWhen enabled, type constraint failures will show intermediate values in the assertion expression.\nUse `--no-power-assertions` to disable this feature if you prefer simpler output or better performance.\n====\n\nThis command also takes <<common-options, common options>>.\n\n[[command-server]]\n=== `pkl server`\n\n*Synopsis:* `pkl server`\n\nRun as a server that communicates over standard input/output.\n\nThis option is used for embedding Pkl in an external client, such as xref:swift:ROOT:index.adoc[pkl-swift] or xref:go:ROOT:index.adoc[pkl-go].\n\n[[command-test]]\n=== `pkl test`\n\n*Synopsis:* `pkl test [<options>] [<modules>]`\n\nEvaluate the given `<modules>` as _tests_, producing a test report and appropriate exit code.\n\nRenderers defined in test files will be ignored by the `test` command.\n\nTests that result in writing `pkl-expected.pcf` files are considered failing tests.\nIf these are the only failures, the command exits with exit code 10.\nOtherwise, failures result in exit code 1.\n\n<modules>::\nThe absolute or relative URIs of the modules to test.\nThe module must extend `pkl:test`.\nRelative URIs are resolved against the working directory.\n\n==== Options\n\n[[junit-reports]]\n.--junit-reports\n[%collapsible]\n====\nDefault: (none) +\nExample: `./build/test-results` +\nDirectory where to store JUnit reports.\n\nBy default, one file will be created for each test module. This behavior can be changed with `--junit-aggregate-reports`, which will instead create a single JUnit report file with all test results.\n\nNo JUnit reports will be generated if this option is not present.\n====\n\n[[junit-aggregate-reports]]\n.--junit-aggregate-reports\n[%collapsible]\n====\nAggregate JUnit reports into a single file.\n\nBy default it will be `pkl-tests.xml` but you can override it using `--junit-aggregate-suite-name` flag.\n====\n\n[[junit-aggregate-suite-name]]\n.--junit-aggregate-suite-name\n[%collapsible]\n====\nDefault: (none) +\nExample: `my-tests` +\nThe name of the root JUnit test suite.\n\nUsed in combination with `--junit-aggregate-reports` flag.\n====\n\n[[overwrite]]\n.--overwrite\n[%collapsible]\n====\nForce generation of expected examples. +\nThe old expected files will be deleted if present.\n====\n\n[[power-assertions-test]]\n.--power-assertions, --no-power-assertions\n[%collapsible]\n====\nDefault: enabled +\nEnable or disable power assertions for detailed assertion failure messages.\nWhen enabled, test failures will show intermediate values in the assertion expression, making it easier to understand why a test failed.\nUse `--no-power-assertions` to disable this feature if you prefer simpler output.\n====\n\nThis command also takes <<common-options, common options>>.\n\n[[command-run]]\n=== `pkl run`\n\n*Synopsis:* `pkl run [<options>] [<module>] [<command options>]`\n\nEvaluate a <<cli-tools,CLI command>> defined by `<module>`.\n\n<module>::\nThe absolute or relative URIs of the command module to run.\nThe module must extend `pkl:Command`.\nRelative URIs are resolved against the working directory.\n\n<command options>::\nAdditional CLI options and arguments defined by `<module>`.\n\nThis command also takes <<common-options, common options>>.\n\n[[command-repl]]\n=== `pkl repl`\n\n*Synopsis:* `pkl repl [<options>]`\n\nStart a REPL session.\n\nThis command takes <<common-options, common options>>.\n\n[[command-project-package]]\n=== `pkl project package`\n\n*Synopsis:* `pkl project package <project-dir>`\n\nThis command prepares a project to be published as a package.\nGiven a project directory, it creates the following artifacts:\n\n* `<name>@<version>` - the package metadata file\n* `<name>@<version>.sha256` - the dependency metadata file's SHA-256 checksum\n* `<name>@<version>.zip` - the package archive\n* `<name>@<version>.zip.sha256` - the package archive's SHA-256 checksum\n\nThese artifacts are expected to be published to an HTTPS server, such that the metadata and zip files can be fetched at their expected locations.\n\nThe package ZIP should be available at the `packageZipUrl` location specified in the `PklProject` file\nThe package metadata should be available at the package URI's derived HTTPS URL.\nFor example, given package `package://example.com/mypackage@1.0.0`, the metadata file should be published to `+https://example.com/mypackage@1.0.0+`.\n\nDuring packaging, this command runs these additional steps:\n\n1. Run the package's API tests, if any are defined.\n2. Validates that if the package has already been published, that the package's metadata is identical. This step can be skipped using the `--skip-publish-check` flag.\n\nExamples:\n\n[source,shell]\n----\n# Search the current working directory for a project, and package it.\npkl project package\n\n# Package all projects within the `packages/` directory to `.out`, writing each package's artifacts to its own directory.\npkl project package --output-path \".out/%{name}@%{version}/\" packages/*/\n----\n\n==== Options\n\n.--output-path\n[%collapsible]\n====\nDefault: `.out`\n\nThe directory to write artifacts to.\nAccepts the following placeholders:\n\n`%\\{name}`:: The name of the package\n`%\\{version}`:: The version of the package\n====\n\n.--skip-publish-check\n[%collapsible]\n====\nSkips checking whether a package has already been published with different contents.\n\nBy default, the packager will check whether a package at the same version has already been published.\nIf the package has been published, it validates that the package's metadata is identical to the locally generated metadata.\n====\n\n.--junit-reports\n[%collapsible]\n====\nDefault: (none) +\nExample: `./build/test-results` +\nDirectory where to store JUnit reports.\n\nNo JUnit reports will be generated if this option is not present.\n====\n\n.--junit-aggregate-reports\n[%collapsible]\n====\nAggregate JUnit reports into a single file.\n\nBy default it will be `pkl-tests.xml` but you can override it using `--junit-aggregate-suite-name` flag.\n====\n\n.--junit-aggregate-suite-name\n[%collapsible]\n====\nDefault: (none) +\nExample: `my-tests` +\nThe name of the root JUnit test suite.\n\nUsed in combination with `--junit-aggregate-reports` flag.\n====\n\n.--overwrite\n[%collapsible]\n====\nForce generation of expected examples. +\nThe old expected files will be deleted if present.\n====\n\nThis command also takes <<common-options,common options>>.\n\n[[command-project-resolve]]\n=== `pkl project resolve`\n\n*Synopsis:* `pkl project resolve <project-dir>`\n\nThis command takes the dependencies of a project, and writes the resolved versions a file at path `PklProject.deps.json`.\n\nIt builds a dependency list, taking the latest minor version in case of version conflicts.\nFor more details, see the xref:language-reference:index.adoc#resolving-dependencies[resolving dependencies] section of the language reference.\n\nExamples:\n[source,shell]\n----\n# Search the current working directory for a project, and resolve its dependencies.\npkl project resolve\n\n# Resolve dependencies for all projects within the `packages/` directory.\npkl project resolve packages/*/\n----\n\n==== Options\n\nThis command accepts <<common-options,common options>>.\n\n[[command-download-package]]\n=== `pkl download-package`\n\n*Synopsis*: `pkl download-package <package-uri>`\n\nThis command downloads the specified packages to the cache directory.\nIf the\npackage already exists in the cache directory, this command is a no-op.\n\n==== Options\n\nThis command accepts <<common-options,common options>>.\n\n[[command-analyze-imports]]\n=== `pkl analyze imports`\n\n*Synopsis*: `pkl analyze imports [<modules>]`\n\nThis command builds a graph of imports declared in the provided modules.\n\nThis is a lower level command that is meant to be useful for Pkl-related tooling.\nFor example, this command feeds into the xref:pkl-gradle:index.adoc[] to determine if tasks are considered up-to-date or not.\n\nThis command produces an object with two properties, `imports` and `resolvedImports`.\n\nThe `imports` property is a mapping of a module's absolute URI, to the set of imports declared within that module.\n\nThe `resolvedImports` property is a mapping of a module's absolute URI (as stated in `imports`), to the resolved absolute URI that might be useful for fetching the module's contents.\nFor example, a xref:language-reference:index.adoc#local-dependencies[local dependency] import will have an in-language URI with scheme `projectpackage:`, and may have resolved URI with scheme `file:` (assuming that the project is file-based).\n\nExamples:\n\n[source,shell]\n----\n# Analyze the imports of a single module\npkl analyze imports myModule.pkl\n\n# Same as the previous command, but output in JSON.\npkl analyze imports -f json myModule.pkl\n\n# Analyze imports of all modules declared within src/\npkl analyze imports src/*.pkl\n----\n\n<modules>::\nThe absolute or relative URIs of the modules to analyze. Relative URIs are resolved against the working directory.\n\n==== Options\n\n.-f, --format\n[%collapsible]\n====\nSame meaning as <<format>> in <<command-eval>>.\n====\n\n.-o, --output-path\n[%collapsible]\n====\nSame meaning as <<output-path>> in <<command-eval>>.\n====\n\nThis command also takes <<common-options,common options>>.\n\n[[command-shell-completion]]\n=== `pkl shell-completion`\n\n*Synopsis*: `pkl shell-completion <shell>`\n\nGenerate shell completion script. Supported shells are: `bash`, `zsh`, `fish`.\n\n[source,shell]\n----\n# Generate shell completion script for bash\npkl shell-completion bash\n\n# Generate shell completion script for zsh\npkl shell-completion zsh\n----\n\n[[command-format]]\n=== `pkl format`\n\n*Synopsis*: `pkl format <options> [<paths>]`\n\nThis command formats or checks formatting of Pkl files. +\nExit codes:\n\n* 0: No violations found or files were updated.\n* 1: An unexpected error happened (ex.: IO error)\n* 11: Violations were found (when running without `--write`).\n\nIf the path is a directory, recursively looks for files with a `.pkl` extension, or files named `PklProject`.\n\nBy default, the input files are formatted, and written to standard out.\n\n==== Options\n\n.--grammar-version\n[%collapsible]\n====\nDefault: `2` (latest version) +\nSelect the grammar compatibility version for the formatter.\nNew versions are created for each backward incompatible grammar change.\n====\n\n.-s, --silent\n[%collapsible]\n====\nSkip writing to standard out. Mutually exclusive with `--diff-name-only`.\n====\n\n.-w, --write\n[%collapsible]\n====\nFormat files in place, overwriting them. Implies `--diff-name-only`.\n====\n\n.--diff-name-only\n[%collapsible]\n====\nWrite the path of files with formatting violations to stdout.\n====\n\n[[common-options]]\n=== Common options\n\nThe <<command-eval>>, <<command-test>>, <<command-run>>, <<command-repl>>, <<command-project-resolve>>, <<command-project-package>>, <<command-download-package>>, and <<command-analyze-imports>> commands support the following common options:\n\ninclude::../../pkl-cli/partials/cli-common-options.adoc[]\n\nThe <<command-eval>>, <<command-test>>, <<command-repl>>, <<command-download-package>>, and <<command-analyze-imports>> commands also take the following options:\n\ninclude::../../pkl-cli/partials/cli-project-options.adoc[]\n\n[[root-options]]\n=== Root options\n\nThe root `pkl` command supports the following options:\n\n.-v, --version\n[%collapsible]\n====\nDisplay version information.\n====\n\n== Evaluating Modules\n\nSay we have the following module:\n\n[[config.pkl]]\n.config.pkl\n[source,{pkl}]\n----\nbird {\n  species = \"Pigeon\"\n  diet = \"Seeds\"\n}\nparrot = (bird) {\n  species = \"Parrot\"\n  diet = \"Berries\"\n}\n----\n\nTo evaluate this module and write its output to standard output, run:\n\n[source,shell]\n----\npkl eval config.pkl\n----\n\nYou should see the following output:\n\n[source,{pkl}]\n----\nbird {\n  species = \"Pigeon\"\n  diet = \"Seeds\"\n}\nparrot {\n  species = \"Parrot\"\n  diet = \"Berries\"\n}\n----\n\nTo render output as JSON, YAML, XML property list, or Java properties,\nuse `--format json`, `--format yaml`, `--format plist`, or `--format properties`, respectively.\n\nTo control the output format from within Pkl code, see xref:language-reference:index.adoc#module-output[Module Output].\n\nTo read a source module from standard input rather than a file, use `-` as a module name:\n\n[source,shell]\n----\necho mod2.pkl | pkl eval mod1.pkl - mod3.pkl\n----\n\nThis is especially useful in environments that don't support `/dev/stdin`.\n\nTo write output to a file rather than standard output, use `--output-path some/file.ext`.\n\n[[batch-evaluation]]\n=== Batch Evaluation\n\nMultiple modules can be evaluated at once:\n\n[source,shell]\n----\npkl eval config1.pkl config2.pkl config3.pkl\n----\n\nTo write module outputs to separate output files, `--output-path` supports the following placeholders:\n\n`%\\{moduleDir}`:: the directory path of the source module, relative to the working directory (only available for file based modules)\n`%\\{moduleName}`:: the last path segment of the module URI, without file extension\n`%\\{outputFormat}`:: the target format (only available if `--format` is set)\n\nThe following run produces three JSON files placed next to the given source modules:\n\n[source,shell]\n----\npkl eval --format=json --output-path=%{moduleDir}/%{moduleName}.json config1.pkl config2.pkl config3.pkl\n----\n\nIf multiple module outputs are written to the same file, or to standard output, their outputs are concatenated.\nBy default, module outputs are separated with `---`, as in a YAML stream.\nThe separator can be customized using the `--module-output-separator` option.\n\n[[cli-tools]]\n== Implementing CLI Tools\n\nCLI tools can be implemented in Pkl by modules extending the `pkl:Command` module.\nWith `pkl:Command`, you can define a script in Pkl that is executed by your shell, providing a better CLI experience.\n\nRegular evaluation requires use of xref:language-reference:index.adoc#resources[resources] like properties and evironment variables to provide parameters:\n[source,bash]\n----\n$ pkl eval script.pkl -p username=me -p password=password\n----\n\nCommands provide a native, familiar CLI experience:\n[source,bash]\n----\n$ pkl run script.pkl --username=admin --password=hunter2\n$ ./script.pkl --username=admin --password=hunter2\n----\n\nPkl commands have a few properties that distinguish them from standard module evaluation:\n\n* Users provide input to commands using familiar command line idioms, providing a better experience than deriving inputs from xref:language-reference:index.adoc#resources[resources] like external properties or environment variables.\n* Commands can dynamically import modules when they are specified as command line options.\n* Commands may write to standard output (via `output.text` or `output.bytes`) and the filesystem (via `output.files`) in the same evaluation.\n* Command file output may write to any absolute path (not only relative to the `--multiple-file-output-path` option).\n** Relative output paths are written relative to the current working directory (or `--working-dir`, if specified).\n** Paths of output file are printed to the command's standard error.\n\nIMPORTANT: Users of `pkl run` must be aware of the security implications of this behavior.\nUsing `pkl eval` prevents accidental overwrites by not allowing absolute paths, but `pkl run` does not offer this protection.\nCommands may write to any path the invoking user has permissions to modify.\n\nCommands are implemented as regular modules and declare their supported command line flags and positional arguments using a class with annotated properties.\n\n=== Defining Commands\n\nCommands are defined by creating a module that extends `pkl:Command`:\n\n[source,pkl%tested]\n.my-tool.pkl\n----\n/// This doc comment becomes part of the command's CLI help!\n/// Markdown formatting is **allowed!**\nextends \"pkl:Command\"\n\noptions: Options // <1>\n\nclass Options {\n  // Define CLI flags/arguments...\n}\n\n// Regular module code...\n----\n<1> Re-declaration of the `options` property's type.\n\nLike `pkl eval`, when a command completes without an evaluation error the process exits successfully (exit code 0).\nCommands can return a failure using `throw` (exit code 1), but otherwise may not control the exit code.\n\nOther than the differences listed above, commands behave like any other Pkl module.\nFor example, there is no way to execute other programs or make arbitrary HTTP requests.\nIf additional functionality is desired, xref:language-reference:index.adoc#external-readers[external readers] may be used to extends Pkl's capabilities.\n\n=== Command Options\n\nEach property of a command's options class becomes a command line option.\nProperties with the `local`, `hidden`, `fixed`, and/or `const` modifiers are not parsed as options\nA property's doc comment, if present, becomes the corresponding option's CLI help description.\nDoc comments are interpreted as Markdown text and formatted nicely when displayed to users.\nProperties must have xref:language-reference:index.adoc#type-annotations[type annotations] to determine how they are parsed.\n\nProperties may be xref:language-reference:index.adoc#annotations[annotated] to influence how they behave:\n\n* Properties annotated with link:{uri-stdlib-Command-Flag}[`@Flag`] become CLI flags named `--<property name>` that accept a value.\n* `Boolean` properties annotated with link:{uri-stdlib-Command-BooleanFlag}[`@BooleanFlag`] become CLI flags named `--<property name>` and `--no-<property name>` that result in `true` and `false` values, respectively.\n* `Int` (and type aliases of `Int`) properties annotated with link:{uri-stdlib-Command-CountedFlag}[`@CountedFlag`] become CLI flags named `--<property name>` that produce a value equal to the number of times they are present on the command line.\n* Properties annotated with link:{uri-stdlib-Command-Argument}[`@Argument`] become positional CLI arguments and are parsed in the order they appear in the class.\n* Properties with no annotation are treated the same as `@Flag` with no further customization.\n\nFlag options may set a `shortName` property to define a single-character abbreviation (`-<short name>`).\nFlag abbreviations may be combined (e.g. `-a -b -v -v -q some-value` is equivalent to `-abvvq some-value`).\n\n[CAUTION]\n====\nFlag names and short names may not conflict with <<common-options,common options>>.\nFuture versions of Pkl may introduce additional common options and the names of these options will become forbidden for use in `pkl:Command`.\nThus, any Pkl release that adds common options may introduce breaking changes for commands.\n\nWhile unfortunate, this behavior eliminates potentially dangerous or misleading ambiguities between Pkl-defined and user-defined options.\n====\n\nA `@Flag` or `@Argument` property's type annotation determines how it is converted from the raw string value:\n\n|===\n|Type |Behavior\n\n|`String`\n|Value is used verbatim.\n\n|`Char`\n|Value is used verbatim but must be exactly one character.\n\n|`Boolean`\n|True values: `true`, `t`, `1`, `yes`, `y`, `on`\n\nFalse values: `false`, `f`, `0`, `no`, `n`, `off`\n\n|`Number`\n|Value is parsed as an `Int` if possible, otherwise parsed as `Float`.\n\n|`Float`\n|Value is parsed as a `Float`.\n\n|`Int`\n|Value is parsed as a `Int`.\n\n|`Int8`, `Int16`, `Int32`, `UInt`, `UInt8`, `UInt16`, `UInt32`\n|Value is parsed as a `Int` and must be within the type's range.\n\n|xref:language-reference:index.adoc#union-types[Union] of xref:language-reference:index.adoc#string-literal-types[string literals]\n|Value is used verbatim but must match a member of the union.\n\n|`List<Element>`, `Listing<Element>`, `Set<Element>`\n|Each occurrence of the option becomes an element of the final value.\n\n`Element` values are parsed based on the above primitive types.\n\n|`Map<Key, Value>`, `Mapping<Key, Value>`\n|Each occurrence of the option becomes an entry of the final value.\n\nValues are split on the first `\"=\"` character; the first part is parsed as `Key` and the second as `Value`, both based on the above primitive types.\n\n|`Pair<First, Second>`\n|Value is split on the first `\"=\"` character; the first part is parsed as `First` and the second as `Second`, both based on the above primitive types.\n\n|===\n\nIf a flag that accepts only a single value is provided multiple times, the last occurrence becomes the final value.\n\nOnly a single positional argument accepting multiple values is permitted per command.\n\nA property with a xref:language-reference:index.adoc#nullable-types[nullable type] is optional and, if not specified on the command line, will have value `null`.\nProperties with default values are also optional.\nType constraints are evaluated when the command is executed, so additional restrictions on option values are enforced at runtime.\n\n==== Custom Option Conversion and Aggregation\n\nA property may be annotated with any type if its `@Flag` or `@Argument` annotation sets the `convert` or `transformAll` properties.\nThe `convert` property is a xref:language-reference:index.adoc#anonymous-functions[function] that overrides how _each_ raw option value is interpreted.\nThe `transformAll` property is a function that overrides how _all_ parsed option values become the final property value.\n\nThe `convert` and `transformAll` functions may return an pkldoc:Import[pkl:Command] value that is replaced during option parsing with the actual value of the module specified by its `uri` property.\nIf `glob` is `true`, the replacement value is a `Mapping`; its keys are the _absolute_ URIs of the matched modules and its values are the actual module values.\nWhen specifying glob import options on the command line, it is often necessary to quote the value to avoid it being interpreted by the shell.\nIf the return value of `convert` or `transformAll` is a `List`, `Set`, `Map`, or `Pair`, each contained value (elements and entry keys/values) that are `Import` values are also replaced.\n\n[IMPORTANT]\n====\nIf an option has type `Mapping<String, «some module type»>` and should accept a single glob pattern value, the option's annotation must also set `multiple = false` to override the default behavior of `Mapping` options accepting multiple values.\nExample:\n[source%parsed,{pkl}]\n----\n@Flag {\n  convert = (it) -> new Import { uri = it; glob = true }\n  multiple = false\n}\nbirds: Mapping<String, Bird>\n----\n\nIf multiple glob patterns values should be accepted and merged, `transformAll` may be used to merge every glob-imported `Mapping`:\n[source%parsed,{pkl}]\n----\n@Flag {\n  convert = (it) -> new Import { uri = it; glob = true }\n  transformAll =\n    (values) -> values.fold(new Mapping {}, (result, element) ->\n      (result) { ...element }\n    )\n}\nbirds: Mapping<String, Bird>\n----\n====\n\n=== Subcommands\n\nLike many other command line libraries, `pkl:Command` allows building commands into a hierarchy with a root command and subcommands:\n\n[source,pkl%tested]\n.my-tool.pkl\n----\nextends \"pkl:Command\"\n\ncommand {\n  subcommands {\n    import(\"subcommand1.pkl\")\n    import(\"subcommand2.pkl\")\n    for (_, subcommand in import*(\"./subcommands/*.pkl\")) {\n      subcommand\n    }\n  }\n}\n----\n\n[source,pkl%tested]\n.subcommand1.pkl\n----\nextends \"pkl:Command\"\n\nimport \"my-tool.pkl\"\n\nparent: `my-tool` // <1>\n\n// Regular module code...\n----\n<1> Optional; asserts that this is a subcommand of `my-tool` and simplifies accessing properties and options of the parent command\n\nEach element of `subcommands` must have a unique value for `command.name`.\n\n=== Testing Commands\n\nCommand modules are normal Pkl modules, so they may be imported and used like any other module.\nThis is particularly helpful when testing commands, as the command's `options` and `parent` properties can be populated by test code.\n\nTesting the above command and subcommand might look like this:\n\n[source,pkl%tested]\n----\namends \"pkl:test\"\n\nimport \"my-tool.pkl\"\nimport \"subcommand1.pkl\"\n\nexamples {\n  [\"Test my-tool\"] {\n    (`my-tool`) {\n      options {\n        // Set my-tool options here...\n      }\n    }.output.text\n  }\n  [\"Test subcommand1\"] {\n    (subcommand1) {\n      parent { // this amends `my-tool`\n        options {\n          // Set my-tool options here...\n        }\n      }\n      options {\n        // Set subcommand options here...\n      }\n    }.output.text\n  }\n}\n----\n\n[[commands-as-standalone-scripts]]\n=== Commands as standalone scripts\n\nOn *nix platforms, Pkl commands can be configured to run as standalone tools that can be invoked without the `pkl run` command.\nTo achieve this, the command file must be marked executable (i.e. `chmod +x my-tool.pkl`) and a link:https://en.wikipedia.org/wiki/Shebang_(Unix)[shebang comment] must be added on the first line of the file:\n\n[source,pkl%parsed]\n----\n#!/usr/bin/env -S pkl run\n----\n\nNOTE: The `-S` flag for `env` is required on Linux systems due to a limitation of shebang handling in the Linux kernel.\nWhile not required on other *nix platforms like macOS, but it should be included for compatibility.\n\n==== Shell Completion\n\nLike with Pkl's own CLI, <<command-shell-completion, shell completions>> can be generated for standalone scripts.\n\n[source,shell]\n----\n# Generate shell completion script for bash\n./my-tool.pkl shell-completion bash\n\n# Generate shell completion script for zsh\n./my-tool.pkl shell-completion zsh\n----\n\n==== Customizing Completion Candidates\n\n`@Flag` and `@Argument` annotations may specify the `completionCandidates` to improve generated shell completions.\n\nValid values include:\n\n* A `Listing<String>` of literal string values to offer for completion.\n* The literal string `\"path\"`, which offers local file paths for completion.\n\nOptions with a string literal union type implicitly offer the members of the union as completion candidates.\n\n=== Flag name ambiguities\n\nIt is possible for commands to define flags with names or short names that collide with Pkl's own command line options.\nTo avoid ambiguity in parsing these options, all flags for Pkl itself (e.g. `--root-dir`) must be placed before the root command module's URI.\nCommand authors are encouraged to avoid overlapping with Pkl's built-in flags, but this may not always be feasible, especially for single-character abbreviated names.\n\nThis imposes a limitation around <<commands-as-standalone-scripts,standalone commands>> that prevents users from customizing Pkl evaluator options when they are invoked.\nThere are two recommended workarounds for this limitation:\n\n* Use a `PklProject` to define evaluator settings instead of doing so on the command line.\n* If the command line must be used, switch to invoking via `pkl run [<flags>] [<root command module>]`.\n\n[[repl]]\n== Working with the REPL\n\nTo start a REPL session, run `pkl repl`:\n\n[source,shell]\n[subs=\"+attributes\"]\n----\n$ pkl repl\nWelcome to Pkl {pkl-version}.\nType an expression to have it evaluated.\nType :help or :examples for more information.\n\npkl>\n----\n\n=== Loading Modules\n\nTo load <<config.pkl,`config.pkl`>> into the REPL, run:\n\n[source,shell]\n----\npkl> :load config.pkl\n----\n\nTo evaluate the `bird.species` property, run:\n\n[source,shell]\n----\npkl> bird.species\n\"Pigeon\"\n----\n\nTo evaluate the entire module, force-evaluate `this`:\n\n[source,shell]\n----\npkl> :force this\n----\n\n=== REPL Commands\n\nCommands start with `:` and can be tab-completed:\n\n[source,shell]\n[subs=\"+attributes,+macros\"]\n----\npkl> :{empty}kbd:[Tab]\nclear       examples    force       help        load        quit        reset\npkl> :q{empty}kbd:[Tab]\npkl> :quit{empty}kbd:[Return]\n$\n----\n\nCommands can be abbreviated with any unique name prefix:\n\n[source,shell]\n[subs=\"+attributes,+macros\"]\n----\npkl> :q{empty}kbd:[Return]\n$\n----\n\nTo learn more about each command, run the `:help` command.\n\nSome commands support further command-specific tab completion.\nFor example, the `:load` command supports completing file paths.\n\nWith commands out of the way, let's move on to evaluating code.\n\n=== Evaluating Code\n\nTo evaluate an expression, type the expression and hit kbd:[Return].\n\n[source,shell]\n----\npkl> 2 + 4\n6\n----\n\nApart from expressions, the REPL also accepts property, function, and class definitions.\n(See the xref:language-reference:index.adoc[Language Reference] to learn more about these language concepts.)\n\n[source,shell]\n----\npkl> hello = \"Hello, World!\"\npkl> hello\n\"Hello, World!\"\npkl> function double(n) = 2 * n\npkl> double(5)\n10\npkl> class Bird { species: String }\npkl> new Bird { species = \"Pigeon\" }\n{\n  name = ?\n}\n----\n\nTop-level expressions are only supported in the REPL.\nIn a regular module, every expression is contained in a definition, and only definitions exist at the top level.\n\n=== Redefining Members\n\nExisting members can be redefined:\n\n[source,shell]\n----\npkl> species = \"Pigeon\"\npkl> species\n\"Pigeon\"\npkl> species = \"Barn\"\npkl> species\n\"Barn\"\npkl> species + \" Owl\"\npkl> species\n\"Barn Owl\"\n----\n\nDue to Pkl's late binding semantics, redefining a member affects dependent members:\n\n[source,shell]\n----\npkl> name = \"Barn\"\npkl> species = \"\\(name) Owl\"\npkl> species\n\"Barn Owl\"\npkl> name = \"Elf\"\npkl> species\n\"Elf Owl\"\n----\n\nRedefining members is only supported in the REPL. Under the hood,\nit works as follows:\n\n* The REPL environment is represented as a synthetic Pkl module.\n* When a new member is defined, it is added to the current REPL module.\n* When an existing member is redefined, it is added to a new REPL module that xref:language-reference:index.adoc#module-amend[amends] the previous REPL module.\n\n[[settings-file]]\n== Settings File\n\nThe Pkl settings file allows to customize the CLI experience.\n\nA settings file is a Pkl module amending the `pkl.settings` standard library module.\nIts default location is `~/.pkl/settings.pkl`.\nTo use a different settings file, set the `--settings` command line option, for example `--settings mysettings.pkl`.\nTo enforce default settings, use `--settings pkl:settings`.\nThe settings file is also honored by (and configurable through) the Gradle plugin and `CliEvaluator` API.\n\nHere is a typical settings file:\n\n.~/.pkl/settings.pkl\n[source%parsed,{pkl}]\n----\namends \"pkl:settings\" // <1>\n\neditor = Idea // <2>\n----\n<1> A settings file should amend the `pkl.settings` standard library module.\n<2> Configures IntelliJ IDEA as the preferred editor.\nOther supported values are `System`, `GoLand`, `TextMate`, `Sublime`, `Atom`, and `VsCode`.\n\nWith the above settings file in place, kbd:[Cmd]+Double-clicking a source code link in a stack trace opens the corresponding file in IntelliJ IDEA at the correct location.\n\nTo learn more about available settings, see link:{uri-pkl-stdlib-docs-settings}[pkl.settings].\n\n[[ca-certs]]\n== CA Certificates\n\nWhen making TLS requests, Pkl comes with its own set of {uri-certificates}[CA certificates].\nThese certificates can be overridden via either of the two options:\n\n- Set them directly via the CLI option `--ca-certificates <path>`.\n- Add them to a directory at path `~/.pkl/cacerts/`.\n\nBoth these options will *replace* the default CA certificates bundled with Pkl. +\nThe CLI option takes precedence over the certificates in `~/.pkl/cacerts/`. +\nCertificates need to be X.509 certificates in PEM format.\n\n[[http-proxy]]\n== HTTP Proxying\n\nWhen making HTTP(s) requests, Pkl can possibly make use of an HTTP proxy.\n\nThere are two values that determine proxy settings; the proxy address and list of noproxy rules.\nWhen determining proxy settings, Pkl will look at the following locations, in order of precedence (lowest to highest):\n\n1. OS settings (on macOS, Windows, and GNOME environments)\n2. <<settings-file,Settings file>>\n3. xref:language-reference:index.adoc#projects[PklProject file]\n4. `--http-proxy` and `--http-no-proxy` CLI flags\n\n[NOTE]\n====\nThe proxy and noproxy values are individually set.\nFor example, using the `--http-no-proxy` flag but not the `--http-proxy` flag will cause Pkl to look at the PklProject file, then the settings file, then system settings for the proxy address.\n\nOne exception to this rule is that setting a proxy address will cause Pkl to ignore any noproxy values set at the OS level.\n====\n\nPkl only supports HTTP proxies, so neither HTTPS nor SOCKS proxies are supported.\nPkl does not support authentication with a proxy.\n\nWhen specifying a proxy address, it must have scheme `http`, and may not contain anything other than a host and port.\n\n=== Proxy exclusions\n\nPkl can be configured to bypass the proxy for specific requests via a proxy exclusion rule (i.e. the `--http-no-proxy` flag).\nIt may be provided either as a hostname, an IP address, or an IP range via https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].\nWhen determining whether a proxy should be excluded, hostnames do not get resolved to their IP address.\nFor example, a request to `localhost` will not match `--http-no-proxy=127.0.0.1`.\n\nFor individual hosts (not CIDRs), ports can be specified.\nWhen no port is specified for a given host, connections to all ports bypass the proxy.\n\nA hostname will match all of its subdomains.\nFor example, `example.com` will match `foo.example.com`, and `bar.foo.example.com`, but not `fooexample.com`.\n\nThe value `*` is a special wildcard that matches all hosts.\n\nA port can optionally be specified. If omitted, it matches all ports.\n\nNOTE: Pkl follows the rules described in https://about.gitlab.com/blog/2021/01/27/we-need-to-talk-no-proxy/#standardizing-no_proxy[Standardizing `no_proxy`], except it does not look at environment variables.\n"
  },
  {
    "path": "docs/modules/pkl-cli/partials/cli-common-options.adoc",
    "content": "[[allowed-modules]]\n.--allowed-modules\n[%collapsible]\n====\nDefault: `pkl:,file:,modulepath:,https:,repl:,package:,projectpackage:` +\nComma-separated list of URI patterns that determine which modules can be loaded and evaluated.\nPatterns are matched against the beginning of module URIs.\n(File paths have been converted to `file:` URLs at this stage.)\nAt least one pattern needs to match for a module to be loadable.\n====\n\n[[allowed-resources]]\n.--allowed-resources\n[%collapsible]\n====\nDefault: `env:,prop:,package:,projectpackage:` +\nComma-separated list of URI patterns that determine which external resources can be read.\nPatterns are matched against the beginning of resource URIs.\nAt least one pattern needs to match for a resource to be readable.\n====\n\n[[color]]\n.--color\n[%collapsible]\n====\nDefault: `auto` +\nWhen to format messages with ANSI color codes.\nPossible values:\n\n- `\"never\"`: Never format\n- `\"auto\"`: Format if `stdin`, `stdout`, or `stderr` are connected to a console.\n- `\"always\"`: Always format\n====\n\n[[cache-dir]]\n.--cache-dir\n[%collapsible]\n====\nDefault: `~/.pkl/cache` +\nExample: `/path/to/module/cache/` +\nThe cache directory for storing packages.\n====\n\n.--no-cache\n[%collapsible]\n====\nDisable caching of packages.\n====\n\n.-e, --env-var\n[%collapsible]\n====\nDefault: OS environment variables for the current process +\nExample: `MY_VAR=myValue` +\nSets an environment variable that can be read by Pkl code with `read(\"env:<envVarName>\")`.\nRepeat this option to set multiple environment variables.\n====\n\n.-h, --help\n[%collapsible]\n====\nDisplay help information.\n====\n\n.--module-path\n[%collapsible]\n====\nDefault: (empty) +\nExample: `dir1:zip1.zip:jar1.jar` +\nDirectories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.\nPaths are separated by the platform-specific path separator (`:` on *nix, `;` on Windows).\nRelative paths are resolved against the working directory.\n====\n\n.-p, --property\n[%collapsible]\n====\nDefault: (none) +\nExample: `myProp=myValue` +\nSets an external property that can be read by Pkl code with `read(\"prop:<propertyName>\")`.\nRepeat this option to set multiple external properties.\n====\n\n.--root-dir\n[%collapsible]\n====\nDefault: (none) +\nExample: `/some/path` +\nRoot directory for `file:` modules and resources.\nIf set, access to file-based modules and resources is restricted to those located under the specified root directory.\nAny symlinks are resolved before this check is performed.\n====\n\n.--settings\n[%collapsible]\n====\nDefault: (none) +\nExample: `mySettings.pkl` +\nFile path of the Pkl settings file to use.\nIf not set, `~/.pkl/settings.pkl` or defaults specified in the `pkl.settings` standard library module are used.\n====\n\n.-t, --timeout\n[%collapsible]\n====\nDefault: (none) +\nExample: `30` +\nDuration, in seconds, after which evaluation of a source module will be timed out.\nNote that a timeout is treated the same as a program error in that any subsequent source modules will not be evaluated.\n====\n\n.-w, --working-dir\n[%collapsible]\n====\nBase path that relative module paths passed as command-line arguments are resolved against.\nDefaults to the current working directory.\n====\n\n.--ca-certificates\n[%collapsible]\n====\nDefault: (none) +\nExample: `/some/path/certificates.pem` +\nPath to a file containing CA certificates to be used for TLS connections.\n\nSetting this option replaces the existing set of CA certificates bundled into the CLI.\nCertificates need to be X.509 certificates in PEM format.\n\nFor other methods of configuring certificates, see xref:pkl-cli:index.adoc#ca-certs[CA Certificates].\n====\n\n.--http-proxy\n[%collapsible]\n====\nDefault: (none) +\nExample: `\\http://proxy.example.com:1234` +\nConfigures HTTP connections to connect to the provided proxy address.\nThe URI must have scheme `http`, and may not contain anything other than a host and port.\n====\n\n.--http-no-proxy\n[%collapsible]\n====\nDefault: (none) +\nExample: `example.com,169.254.0.0/16` +\nComma separated list of hosts to which all connections should bypass the proxy.\nHosts can be specified by name, IP address, or IP range using https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].\n====\n\n.--http-rewrite\n[%collapsible]\n====\nDefault: (none) +\nExample: `\\https://pkg.pkl-lang.org/=https://my.internal.mirror/` +\nReplace outbound HTTP(S) requests from one URL with another URL.\nThe left-hand side describes the source prefix, and the right-hand describes the target prefix.\nThis option is commonly used to enable package mirroring.\nThe above example will rewrite URL `\\https://pkg.pkl-lang.org/pkl-k8s/k8s@1.0.0` to `\\https://my.internal.mirror/pkl-k8s/k8s@1.0.0`.\n====\n\n.--trace-mode\n[%collapsible]\n====\nDefault: `compact` +\nSpecifies how `trace()` output is formatted.\nPossible options are `compact` and `pretty`.\n====\n"
  },
  {
    "path": "docs/modules/pkl-cli/partials/cli-project-options.adoc",
    "content": "[[project-dir]]\n.--project-dir\n[%collapsible]\n====\nDefault: (none) +\nExample: `/some/path` +\nDirectory where the project lives.\n\nA project is a directory that contains a `PklProject` file, which is used to declare package dependencies, as well as common evaluator settings to be applied in the project.\n\nIf omitted, this is determined by searching up from the working directory for a directory that contains a `PklProject` file, until `--root-dir` or the file system root is reached.\n====\n\n[[omit-project-settings]]\n.--omit-project-settings\n[%collapsible]\n====\nDisables loading evaluator settings from the PklProject file.\n====\n\n[[no-project]]\n.--no-project\n[%collapsible]\n====\nDisables all behavior related to projects.\n====\n"
  },
  {
    "path": "docs/modules/pkl-core/examples/CoreEvaluatorExample.java",
    "content": "import org.pkl.core.Evaluator;\nimport org.pkl.core.ModuleSource;\nimport java.util.List;\n\nimport org.pkl.core.PModule;\nimport org.pkl.core.PObject;\nimport org.junit.jupiter.api.Test;\n\n// the pkl-jvm-examples repo has a similar example\n@SuppressWarnings({\"unchecked\", \"unused\", \"ConstantConditions\", \"NewClassNamingConvention\"})\npublic class CoreEvaluatorExample {\n  @Test\n  public void usage() {\n    // tag::usage[]\n    PModule module;\n    try (var evaluator =\n      Evaluator.preconfigured()) { // <1>\n      module = evaluator.evaluate(\n        ModuleSource.text(\"pigeon { age = 30; hobbies = List(\\\"swimming\\\", \\\"surfing\\\") }\")); // <2>\n    }\n    var pigeon = (PObject) module.get(\"pigeon\"); // <3>\n    var className = pigeon.getClassInfo().getQualifiedName(); // <4>\n    var hobbies = (List<String>) pigeon.get(\"hobbies\"); // <5>\n    // end::usage[]\n  }\n}\n"
  },
  {
    "path": "docs/modules/pkl-core/pages/index.adoc",
    "content": "= pkl-core Library\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-core-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-core\n:uri-pkl-core-main-sources: {uri-github-tree}/pkl-core/src/main/java/org/pkl/core\n:uri-pkl-core-test-sources: {uri-github-tree}/pkl-core/src/test/kotlin/org/pkl/core\n:uri-pkl-core-Evaluator: {uri-pkl-core-main-sources}/Evaluator.java\n:uri-pkl-core-PModule: {uri-pkl-core-main-sources}/PModule.java\n:uri-pkl-core-PklException: {uri-pkl-core-main-sources}/PklException.java\n:uri-pkl-core-ValueVisitor: {uri-pkl-core-main-sources}/ValueVisitor.java\n:uri-pkl-core-JsonRenderer: {uri-pkl-core-main-sources}/JsonRenderer.java\n:uri-pkl-core-PcfRenderer: {uri-pkl-core-main-sources}/PcfRenderer.java\n:uri-pkl-core-PListRenderer: {uri-pkl-core-main-sources}/PListRenderer.java\n:uri-pkl-core-YamlRenderer: {uri-pkl-core-main-sources}/YamlRenderer.java\n:uri-pkl-core-SecurityManagers: {uri-pkl-core-main-sources}/SecurityManagers.java\n:uri-pkl-core-ModuleKeyFactories: {uri-pkl-core-main-sources}/module/ModuleKeyFactories.java\n\nThe _pkl-core_ library contains the Pkl parser, evaluator, REPL server, and xref:ROOT:standard-library.adoc[Standard Library].\nIt is the foundation for most of Pkl's other libraries and tools.\nThe library can also be used to embed Pkl in Java libraries and applications.\n\n[[pkl-core-installation]]\n== Installation\n\nThe _pkl-core_ library is available {uri-pkl-core-maven-module}[from Maven Central].\nIt requires Java 17 or higher.\n\n=== Gradle\n\nTo use the library in a Gradle project, declare the following dependency:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\ndependencies {\n  implementation(\"org.pkl-lang:pkl-core:{pkl-artifact-version}\")\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven(url = \"{uri-sonatype}\")\nendif::[]\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\ndependencies {\n  implementation \"org.pkl-lang:pkl-core:{pkl-artifact-version}\"\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven { url \"{uri-sonatype}\" }\nendif::[]\n}\n----\n====\n\n=== Maven\n\nTo use the library in a Maven project, declare the following dependency:\n\n.pom.xml\n[source,xml,subs=\"+attributes\"]\n----\n<project>\n  <dependency>\n    <groupId>org.pkl-lang</groupId>\n    <artifactId>pkl-core</artifactId>\n    <version>{pkl-artifact-version}</version>\n  </dependency>\nifndef::is-release-version[]\n  <repositories>\n    <repository>\n      <id>sonatype-s01</id>\n      <name>Sonatype S01</name>\n      <url>{uri-sonatype}</url>\n    </repository>\n  </repositories>\nendif::[]\n</project>\n----\n\n== Usage\n\n{uri-pkl-core-Evaluator}[`Evaluator`] is the core evaluator that exposes multiple methods of evaluation.\n\nThe main evaluation method is `evaluate`, which returns a Java representation of the Pkl module object.\nIf evaluation succeeds, a {uri-pkl-core-PModule}[`PModule`] object representing the fully evaluated module is returned.\nOtherwise, an {uri-pkl-core-PklException}[`PklException`] with error details is thrown.\n\nLet's look at an example:\n\n[[config-evaluator-core-example]]\n[source,java,indent=0]\n----\ninclude::{examplesdir}/CoreEvaluatorExample.java[tags=usage]\n----\n<1> Build an `Evaluator` with default configuration.\nThe evaluator should be closed once it is no longer needed.\nIn this example, this is done with a try-with-resources statement.\nNote that objects returned by the evaluator remain valid after calling `close()`.\n<2> Build a `ModuleSource` using the given text as the module's contents. Evaluate the given module source. Alternatively, it's possible to build a `ModuleSource` from a file, path, uri, and other sources.\n<3> Get the module's `\"pigeon\"` property, which is represented as `PObject` in Java.\n<4> Get the class name for this object. In this example, the class name is `pkl.base#Dynamic`.\n<5> Get pigeon's `\"diet\"` property, which is represented as `List<String>` in Java.\n\n[[value-visitor]]\nOften, {uri-pkl-core-ValueVisitor}[`ValueVisitor`] is a better way to process a module.\nSee {uri-pkl-core-PcfRenderer}[`PcfRenderer`], {uri-pkl-core-JsonRenderer}[`JsonRenderer`], {uri-pkl-core-YamlRenderer}[`YamlRenderer`] and {uri-pkl-core-PListRenderer}[`PListRenderer`] for examples.\n\n[[security-manager-spi]]\nThe (Pkl, not Java) security manager can be configured and customized using {uri-pkl-core-SecurityManagers}[`SecurityManagers`] and related classes.\n\n[[module-loader-spi]]\nModule loaders can be configured and customized using {uri-pkl-core-ModuleKeyFactories}[`ModuleKeyFactories`] and related classes.\n\n== Further Information\n\nRefer to the Javadoc and sources published with the library, or browse the library's {uri-pkl-core-main-sources}[main] and {uri-pkl-core-test-sources}[test] sources.\n"
  },
  {
    "path": "docs/modules/pkl-doc/pages/index.adoc",
    "content": "= Pkldoc\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-doc-maven: {uri-maven-docsite}/artifact/org.pkl-lang/pkl-doc\n:uri-DocsiteInfo: {uri-pkl-stdlib-docs}/DocsiteInfo/\n:uri-DocPackageInfo: {uri-pkl-stdlib-docs}/DocPackageInfo/\n:uri-CliDocGenerator: {uri-pkl-doc-main-sources}/CliDocGenerator.kt\n:uri-DocGenerator: {uri-pkl-doc-main-sources}/DocGenerator.kt\n:uri-pkldoc-macos-amd64-download: {uri-sonatype-snapshot-download}&a=pkldoc-macos-amd64&e=bin\n:uri-pkldoc-macos-aarch64-download: {uri-sonatype-snapshot-download}&a=pkldoc-macos-aarch64&e=bin\n:uri-pkldoc-linux-amd64-download: {uri-sonatype-snapshot-download}&a=pkldoc-linux-amd64&e=bin\n:uri-pkldoc-linux-aarch64-download: {uri-sonatype-snapshot-download}&a=pkldoc-linux-aarch64&e=bin\n:uri-pkldoc-alpine-download: {uri-sonatype-snapshot-download}&a=pkldoc-alpine-linux-amd64&e=bin\n:uri-pkldoc-windows-download: {uri-sonatype-snapshot-download}&a=pkldoc-windows-amd64&e=exe\n:uri-pkldoc-java-download: {uri-sonatype-snapshot-download}&a=pkldoc-java&e=jar\n\nifdef::is-release-version[]\n:uri-pkldoc-macos-amd64-download: {github-releases}/pkldoc-macos-amd64\n:uri-pkldoc-macos-aarch64-download: {github-releases}/pkldoc-macos-aarch64\n:uri-pkldoc-linux-amd64-download: {github-releases}/pkldoc-linux-amd64\n:uri-pkldoc-linux-aarch64-download: {github-releases}/pkldoc-linux-aarch64\n:uri-pkldoc-alpine-download: {github-releases}/pkldoc-alpine-linux-amd64\n:uri-pkldoc-windows-download: {github-releases}/pkldoc-windows-amd64.exe\n:uri-pkldoc-java-download: {github-releases}/jpkldoc\nendif::[]\n\n_Pkldoc_ is a documentation website generator that produces navigable and searchable API documentation for Pkl modules.\n\nPkldoc's look and feel is inspired by Scaladoc.\nTo get a first impression, browse the link:{uri-pkl-stdlib-docs-index}[Standard Library API Docs].\n\n== Features\n\nPkldoc offers the following features:\n\nCode navigation::\nEasily navigate between hyperlinked modules, classes, functions, and properties.\nMember search::\nSearch the entire documentation by member name.\nSee the next section for details.\nComment folding::\nExpand and collapse multi-paragraph doc comments.\nMarkdown support::\nWrite doc comments in Markdown.\nSee xref:language-reference:index.adoc#doc-comments[Doc Comments] for details.\nMember links::\nLink to other members from your doc comments.\nSee xref:language-reference:index.adoc#member-links[Member Links] for details.\nMember anchors::\nGet a member's deep link by clicking its anchor symbol and copying the URL in the address bar.\nCross-site links::\nEnable cross-site member links simply by providing the URLs of other Pkldoc websites such as the standard library docs.\n\n[[member-search]]\n=== Member Search\n\nTo get a first impression of Pkldoc's member search, let's try and find property `MinFiniteFloat` in the link:{uri-pkl-stdlib-docs-index}[standard library docs]:\n\nimage::pkldoc-search.gif[title=\"Searching the standard library docs.\"]\n\nTo start a search, press kbd:[s]. Search results are displayed as you type.\n\nTo limit the search to a particular kind of member, prefix the search term with _m:_ for modules, _c:_ for classes, _f:_ for functions, or _p:_ for properties.\nFor example, search term _p:min_ finds property `MinFiniteFloat` but not function `min()`.\n\nCamel case matching is always enabled and does not require capitalizing the search term.\nFor example, search term _mff_ matches properties `MinFiniteFloat` and `MaxFiniteFloat`.\n\nBoth search terms and member names may contain non-ASCII Unicode characters.\nAs characters are normalized to their base form, search term _res_ matches `Réseau`.\n\nThe `@AlsoKnownAs` annotation, defined and used throughout the _pkl.base_ module, documents alternative names for a member used in other programming languages or earlier versions of a module.\nPkldoc's search takes these alternative names into account.\nFor example, searching the standard library docs for _count_ or _size_ finds property `String.length`.\nFeel free to use `@AlsoKnownAs` in your own modules.\n\nSearch results are categorized into _exact_ and _other_ (partial) matches.\nOn module and class pages, additional categories show matches in the same module and class.\nWithin a category, results are ranked by similarity with the search term.\n\nTo navigate to a search result, either click the result or select it with the up/down arrow keys and press kbd:[Enter].\n\n== Installation\n\nPkldoc is offered as Gradle plugin, Java library, and CLI.\n\n=== Gradle Plugin\n\nSee xref:pkl-gradle:index.adoc#installation[Installation] in the _Gradle Plugin_ chapter.\n\n[[install-library]]\n=== Java Library\n\nThe `pkl-doc` library is available {uri-pkl-doc-maven}[from Maven Central].\nIt requires Java 17 or higher.\n\nifndef::is-release-version[]\nNOTE: Snapshots are published to repository `{uri-snapshot-repo}`.\nendif::[]\n\n==== Gradle\n\nTo use the library in a Gradle project, declare the following dependency:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\ndependencies {\n  implementation(\"org.pkl-lang:pkl-doc:{pkl-artifact-version}\")\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven(url = \"{uri-sonatype}\")\nendif::[]\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\ndependencies {\n  implementation \"org.pkl-lang:pkl-doc:{pkl-artifact-version}\"\n}\n\nrepositories {\nifdef::is-release-version[]\n  mavenCentral()\nendif::[]\nifndef::is-release-version[]\n  maven { url \"{uri-sonatype}\" }\nendif::[]\n}\n----\n====\n\n==== Maven\n\nTo use the library in a Maven project, declare the following dependency:\n\n.pom.xml\n[source,xml,subs=\"+attributes\"]\n----\n<project>\n  <dependency>\n    <groupId>org.pkl-lang</groupId>\n    <artifactId>pkl-doc</artifactId>\n    <version>{pkl-artifact-version}</version>\n  </dependency>\nifndef::is-release-version[]\n  <repositories>\n    <repository>\n      <id>sonatype-s01</id>\n      <name>Sonatype S01</name>\n      <url>{uri-sonatype}</url>\n    </repository>\n  </repositories>\nendif::[]\n</project>\n----\n\n[[install-cli]]\n=== CLI\n\nThe CLI comes in multiple flavors:\n\n* Native macOS executable for amd64 (tested on macOS 10.15)\n* Native Linux executable for amd64\n* Native Linux executable for aarch64\n* Native Alpine Linux executable for amd64 (cross-compiled and tested on Oracle Linux 8)\n* Native Windows executable for amd64 (tested on Windows Server 2022)\n* Java executable (tested with Java 17/21 on macOS and Oracle Linux)\n\n.What is the Difference Between the Linux and Alpine Linux Executables?\n[NOTE]\n====\nThe Linux executable is dynamically linked against _glibc_ and _libstdc{plus}{plus}_,\nwhereas, the Alpine Linux executable is statically linked against _musl libc_ and _libstdc{plus}{plus}_.\n====\n\nThe Java executable works on multiple platforms and has a smaller binary size than the native executables.\nHowever, it requires a Java 17 (or higher) runtime on the system path, and has a noticeable startup delay.\n\nDownload links:\n\n* macOS aarch64: {uri-pkldoc-macos-aarch64-download}\n* macOS amd64: {uri-pkldoc-macos-amd64-download}\n* Linux aarch64: {uri-pkldoc-linux-aarch64-download}\n* Linux amd64: {uri-pkldoc-linux-amd64-download}\n* Alpine Linux amd64: {uri-pkldoc-alpine-download}\n* Windows amd64: {uri-pkldoc-windows-download}\n\n[[usage]]\n== Usage\n\nThe Pkldoc tool is offered as Gradle plugin, Java library, and CLI.\nIt can generate documentation either for modules directly, or generate documentation for _package uris_.\n\nThe tool requires an argument of a module named _docsite-info.pkl_, that amends link:{uri-DocsiteInfo}[pkl.DocsiteInfo].\n\n[discrete]\n==== Generating documentation for modules directly\n\nModules can be passed directly to Pkldoc for documentation generation.\nWhen generating documentation for these modules, there must also be a module named _doc-package-info.pkl_ that amends link:{uri-DocPackageInfo}[pkl.DocPackageInfo].\n\nThe _doc-package-info.pkl_ module defines a _doc package_, which describes how modules are grouped and versioned together. \n\nWhen generating documentation for modules, each such module must declare a module name that starts with a package name declared in a _doc-package-info.pkl_ module.\nFor example, the following are valid module declarations for package _com.example_:\n\n* `module com.example.Birds`\n* `module com.example.Birds.Parrot`\n\nThe part of the module name that comes after the package name\nmust match the module's relative path in its source code repository.\nFor example, module _com.example.Bird.Parrot_ is expected to be found at _$sourceCode/Bird/Parrot.pkl_,\nwhere _sourceCode_ is configured in _doc-package-info.pkl_.\n\n[discrete]\n==== Generating documentation for a _package_\n\nPkldoc can alternatively generate documentation for a _package_.\nWhen generating documentation for a package, the URI of the package must be passed as an argument to Pkldoc.\nThese packages must already be published and downloadable.\n\nWhen generating documentation for packages, modules within a package must declare a module name that is prefixed by the package's name declared in the `Package.name` property of its `PklProject` file.\nFor example, the following are valid module declarations for package `com.example`:\n\n* `module com.example.Birds`\n* `module com.example.Birds.Parrot`\n\nThe part of the module name that comes after the package name\nmust match the module's relative path in its source code repository.\nFor example, module _com.example.Bird.Parrot_ is expected to be found at _$sourceCode/Bird/Parrot.pkl_,\nwhere _sourceCode_ is configured in the `Package.sourceCode` property of its `PklProject` file.\n\n=== Gradle Plugin\n\nSee xref:pkl-gradle:index.adoc#pkldoc-generation[Pkldoc Generation] in the _Gradle Plugin_ chapter.\n\n=== Java Library\n\nThe Java library offers two APIs:\n\n* A high-level link:{uri-CliDocGenerator}[CliDocGenerator] API whose feature set corresponds to the CLI.\n* A low-level link:{uri-DocGenerator}[DocGenerator] API that offers additional features and control.\n\nFor more information, refer to the Javadoc documentation.\n\n=== CLI\n\n*Synopsis:* `pkldoc [<options>] <modules>`\n\n`<modules>`::\nThe absolute or relative URIs of docsite descriptors, package descriptors, and the modules for which to generate documentation.\n\nRelative URIs are resolved against the working directory.\n\n==== Options\n\n.-o, --output-dir\n[%collapsible]\n====\nDefault: (none) +\nExample: `pkldoc` +\nThe directory where generated documentation is placed.\n====\n\n.--no-symlinks\n[%collapsible]\n====\nCreate copies of files and directories instead of symbolic links.\nIn particular, this affects how the \"current\" directories containing documentation content for the last generated version should be created.\nBy default, a symbolic link is created pointing to the last generated version. If symlinks are disabled, a full copy of the last generated version is created.\n====\n\nCommon CLI options:\n\ninclude::../../pkl-cli/partials/cli-common-options.adoc[]\n\n[[full-example]]\n== Full Example\n\nFor a ready-to-go example with full source code and detailed walkthrough,\nsee link:{uri-pkldoc-example}[pkldoc] in the _pkl-jvm-examples_ repository.\n"
  },
  {
    "path": "docs/modules/pkl-gradle/pages/index.adoc",
    "content": "= Gradle Plugin\ninclude::ROOT:partial$component-attributes.adoc[]\n:uri-pkl-gradle-maven-module: {uri-maven-docsite}/artifact/org.pkl-lang/org.pkl-lang.gradle.plugin\n:uri-pkl-gradle-main-sources: {uri-github-tree}/pkl-gradle/src/main/java/org/pkl/gradle\n:uri-pkl-gradle-Eval: {uri-pkl-gradle-main-sources}/Eval.java\n:uri-pkl-gradle-JavaCodeGen: {uri-pkl-gradle-main-sources}/JavaCodeGen.java\n:uri-pkl-gradle-KotlinCodeGen: {uri-pkl-gradle-main-sources}/KotlinCodeGen.java\n:uri-pkl-gradle-Pkldoc: {uri-pkl-gradle-main-sources}/Pkldoc.java\n\nThe Gradle plugin offers the following features:\n\n* <<module-evaluation,Module evaluation>>\n* <<java-code-gen,Java code generation>>\n* <<kotlin-code-gen,Kotlin code generation>>\n* <<pkldoc-generation,Pkldoc generation>>\n\nPlugin versions coincide with Pkl versions.\nThat is, plugin version `x.y.z` uses Pkl version `x.y.z`.\n\n[[installation]]\n== Installation\n\nThe Gradle plugin is available {uri-pkl-gradle-maven-module}[from Maven Central].\nIt requires Java 17 or higher and Gradle 8.1 or higher.\nEarlier Gradle versions are not supported.\n\nifndef::is-release-version[]\nNOTE: Snapshots are published to repository `{uri-snapshot-repo}`.\nendif::[]\n\nThe plugin is applied as follows:\n\n[tabs]\n====\nKotlin::\n+\n.build.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\nplugins {\n  id(\"org.pkl-lang\") version \"{pkl-artifact-version}\"\n}\n----\n+\n.settings.gradle.kts\n[source,kotlin,subs=\"+attributes\"]\n----\npluginManagement {\n    repositories {\nifdef::is-release-version[]\n        mavenCentral()\nendif::[]\nifndef::is-release-version[]\n        maven(url = \"{uri-sonatype}\")\nendif::[]\n    }\n}\n----\n\nGroovy::\n+\n.build.gradle\n[source,groovy,subs=\"+attributes\"]\n----\nplugins {\n  id \"org.pkl-lang\" version \"{pkl-artifact-version}\"\n}\n----\n+\n.settings.gradle\n[source,groovy,subs=\"+attributes\"]\n----\npluginManagement {\n    repositories {\nifdef::is-release-version[]\n        mavenCentral()\nendif::[]\nifndef::is-release-version[]\n        maven { url \"{uri-sonatype}\" }\nendif::[]\n    }\n}\n----\n====\n\n[[module-evaluation]]\n== Module Evaluation\n\nThis feature integrates the xref:pkl-cli:index.adoc[Pkl evaluator] into Gradle builds.\n\n=== Usage\n\nTo add an evaluator to the build, add a named configuration block inside `pkl.evaluators`:\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  evaluators {\n    evalPkl {\n      sourceModules.add(file(\"module1.pkl\"))\n      outputFile = layout.buildDirectory.file(\"module1.yaml\")\n      outputFormat = \"yaml\"\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  evaluators {\n    register(\"evalPkl\") {\n      sourceModules.add(file(\"module1.pkl\"))\n      outputFile.set(layout.buildDirectory.file(\"module1.yaml\"))\n      outputFormat.set(\"yaml\")\n    }\n  }\n}\n----\n====\n\nFor each declared evaluator, the Pkl plugin creates an equally named task.\nHence the above evaluator can be run with:\n\n[source,shell script]\n----\n$ ./gradlew evalPkl\n----\n\nFor a ready-to-go example with full source code,\nsee link:{uri-build-eval-example}[codegen-java] in the _pkl-jvm-examples_ repository.\n\n=== Configuration Options\n\n[[output-format]]\n.outputFormat: Property<String>\n[%collapsible]\n====\nDefault: `\"pcf\"` +\nExample: `outputFormat = \"yaml\"` +\nThe output format to generate.\nThe default output renderer for a module supports the following formats:\n\n* `\"json\"`\n* `\"jsonnet\"`\n* `\"pcf\"`\n* `\"plist\"`\n* `\"properties\"`\n* `\"textproto\"`\n* `\"xml\"`\n* `\"yaml\"`\n====\n\n[[output-file]]\n.outputFile: RegularFileProperty\n[%collapsible]\n====\nDefault: `file(\"%\\{moduleDir}/%\\{moduleName}.%\\{outputFormat}\")` (places output files next to the source modules) +\nExample: `outputFile = layout.projectDirectory.file(\"config.yaml\")` +\nThe file path where the output file is placed.\nRelative paths are resolved against the project directory.\n\nIf multiple source modules are given, placeholders can be used to map them to different output files.\nThe following placeholders are supported:\n\n`%\\{moduleDir}`:::\nThe directory path of the module, relative to the working directory.\nOnly available when evaluating file-based modules.\n\n`%\\{moduleName}`:::\nThe simple module name as inferred from the module URI.\nFor hierarchical module URIs such as `+file:///foo/bar/baz.pkl+`, this is the last path segment without file extension.\n\n`%\\{outputFormat}`:::\nThe requested output format.\nOnly available if `outputFormat` is set.\n\nIf multiple sources modules are mapped to the same output file, their outputs are concatenated.\nBy default, module outputs are separated with `---`, as in a YAML stream.\n// suppress inspection \"AsciiDocLinkResolve\"\nThe separator can be customized using the link:#module-output-separator[`moduleOutputSeparator`] option.\n====\n\n[[multiple-file-output-dir]]\n.multipleFileOutputDir: DirectoryProperty\n[%collapsible]\n====\nExample 1: `multipleFileOutputDir = layout.projectDirectory.dir(\"output\")` +\nExample 2: `+multipleFileOutputDir = layout.projectDirectory.file(\"%{moduleDir}/output\")+`\nThe directory where a module's output files are placed.\n\nSetting this option causes Pkl to evaluate a module's `output.files` property\nand write the files specified therein.\nWithin `output.files`, a key determines a file's path relative to `multipleFileOutputDir`,\nand a value determines the file's contents.\n\nThis option cannot be used together with any of the following:\n\n* xref:output-file[outputFile]\n* xref:expression[expression]\n\nThis option supports the same placeholders as xref:output-file[outputFile].\n\nFor additional details, see xref:language-reference:index.adoc#multiple-file-output[Multiple File Output]\nin the language reference.\n====\n\n[[module-output-separator]]\n.moduleOutputSeparator: Property<String>\n[%collapsible]\n====\nDefault: `\"---\"` (as in a YAML stream) +\nThe separator to use when multiple module outputs are written to the same file.\n====\n\n[[expression]]\n.expression: Property<String>\n[%collapsible]\n====\nDefault: (none) +\nExample: `expression = \"topLevelProperty.subValue\"` +\nThe expression to be evaluated within the module.\n\nThis option causes Pkl to evaluate the provided expression instead of the module's `output.text` or `output.files` properties.\nThe resulting value is then stringified, and written to the designated output file.\n\nFor example, consider the following Pkl module:\n\n.my-pod.pkl\n[source%tested,{pkl}]\n----\nmetadata {\n  name = \"my-pod\"\n}\n----\n\nThe expression `metadata.name` evaluates to text `my-pod`.\n====\n\nCommon properties:\n\ninclude::../partials/gradle-modules-properties.adoc[]\n\n[[tests]]\n== Tests\n\nThis feature integrates the xref:pkl-cli:index.adoc#usage[Pkl test evaluator] into Gradle builds.\n\n=== Usage\n\nTo add tests to the build, add a named configuration block inside `pkl.tests`:\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  tests {\n    testPkl {\n      sourceModules.add(files(\"module1_test.pkl\", \"module2_test.pkl\"))\n      junitReportsDir = layout.buildDirectory.dir(\"reports\")\n      overwrite = false\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  tests {\n    register(\"testPkl\") {\n      sourceModules.addAll(files(\"module1_test.pkl\", \"module2_test.pkl\"))\n      junitReportsDir.set(layout.buildDirectory.dir(\"reports\"))\n      overwrite.set(false)\n    }\n  }\n}\n----\n====\n\n[[junit-reports-path]]\n.junitReportsDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `null` +\nExample: `junitReportsDir = layout.buildDirectory.dir(\"reports\")` +\nWhether and where to generate JUnit XML reports.\n====\n\n[[junit-aggregate-reports]]\n.junitAggregateReports: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nAggregate JUnit reports into a single file.\n====\n\n[[junit-aggregate-suite-name]]\n.junitAggregateSuiteName: Property<String>\n[%collapsible]\n====\nDefault: `null` +\nThe name of the root JUnit test suite.\n====\n\n[[overwrite]]\n.overwrite: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nWhether to ignore expected example files and generate them again.\n====\n\n[[power-assertions-test]]\n.powerAssertions: Property<Boolean>\n[%collapsible]\n====\nDefault: `true` (for test tasks) +\nExample: `powerAssertions = false` +\nEnable or disable power assertions for detailed assertion failure messages.\nWhen enabled, test failures will show intermediate values in the assertion expression, making it easier to understand why a test failed.\n====\n\nCommon properties:\n\ninclude::../partials/gradle-modules-properties.adoc[]\n\n[[java-code-gen]]\n== Java Code Generation\n\nThis feature integrates the xref:java-binding:codegen.adoc[Java code generator] into Gradle builds.\n\n=== Usage\n\nTo add a Java code generator to the build, add a named configuration block inside `pkl.javaCodeGenerators`:\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  javaCodeGenerators {\n    genJava {\n      sourceModules.addAll(files(\"Template1.pkl\", \"Template2.pkl\"))\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  javaCodeGenerators {\n    register(\"genJava\") {\n      sourceModules.addAll(files(\"Template1.pkl\", \"Template2.pkl\"))\n    }\n  }\n}\n----\n====\n\nTo compile generated classes together with test code rather than main code, use `sourceSet = sourceSets.test`.\n\nTo generate getter methods instead of public final fields, use `generateGetters = true`.\n\nFor each declared Java code generator, the Pkl plugin creates an equally named task.\nHence, the above generator can be run with:\n\n[source,shell script]\n----\n$ ./gradlew genJava\n----\n\nFor a ready-to-go example with full source code,\nsee link:{uri-codegen-java-example}[codegen-java] in the _pkl-jvm-examples_ repository.\n\n=== Configuration Options\n\n.generateGetters: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nExample: `generateGetters = true` +\nWhether to generate private final fields and public getter methods rather than public final fields.\n====\n\n.paramsAnnotation: Property<String>\n[%collapsible]\n====\nDefault: `null` if `generateSpringBootConfig` is `true`, `\"org.pkl.config.java.mapper.Named\"` otherwise+\nExample: `paramsAnnotation = \"org.project.MyAnnotation\"` +\nFully qualified name of the annotation type to use for annotating constructor parameters with their name. +\nThe specified annotation type must have a `value` parameter of type `String` or the generated code may not compile.\nIf set to `null`, constructor parameters are not annotated.\nWhether and how constructor parameters should be annotated depends on the library that instantiates the generated classes.\nFor Spring Boot applications, and for users of `pkl-config-java` compiling the generated classes with `-parameters`, no annotation is required.\n\n====\n.nonNullAnnotation: Property<String>\n[%collapsible]\n====\nDefault: `\"org.pkl.config.java.mapper.NonNull\"` +\nExample: `nonNullAnnotation = \"org.project.MyAnnotation\"` +\nFully qualified name of the annotation type to use for annotating non-null types. +\nThe specified annotation type must be annotated with `@java.lang.annotation.Target(ElementType.TYPE_USE)`\nor the generated code may not compile.\n====\n\nCommon code generation properties:\n\ninclude::../partials/gradle-codegen-properties.adoc[]\n\nCommon properties:\n\ninclude::../partials/gradle-modules-properties.adoc[]\n\n[[kotlin-code-gen]]\n== Kotlin Code Generation\n\nThis feature integrates the xref:kotlin-binding:codegen.adoc[Kotlin code generator] into Gradle builds.\n\n=== Usage\n\nTo add a Kotlin code generator to the build, add a named configuration block inside `pkl.kotlinCodeGenerators`:\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  kotlinCodeGenerators {\n    genKotlin {\n      sourceModules.addAll(files(\"Template1.pkl\", \"Template2.pkl\"))\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  kotlinCodeGenerators {\n    register(\"genKotlin\") {\n      sourceModules.addAll(files(\"Template1.pkl\", \"Template2.pkl\"))\n    }\n  }\n}\n----\n====\n\nTo compile generated classes together with test code rather than main code, use `sourceSet = sourceSets.test`.\n\nFor each declared Kotlin code generator, the Pkl plugin creates an equally named task. Hence the above generator can be run with:\n\n[source,shell script]\n----\n$ ./gradlew genKotlin\n----\n\nFor a ready-to-go example with full source code,\nsee link:{uri-codegen-kotlin-example}[codegen-kotlin] in the _pkl-jvm-examples_ repository.\n\n=== Configuration Options\n\n=== Configuration Options\n\n.generateKdoc: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nExample: `generateKdoc = true` +\nWhether to preserve Pkl doc comments by generating corresponding KDoc comments.\n====\n\nCommon code generation properties:\n\ninclude::../partials/gradle-codegen-properties.adoc[]\n\nCommon properties:\n\ninclude::../partials/gradle-modules-properties.adoc[]\n\n[[pkldoc-generation]]\n== Pkldoc generation\n\nThis features integrates the xref:pkl-doc:index.adoc[Pkldoc] generator into Gradle builds.\n\n=== Usage\n\nTo add a Pkldoc generator to the build, add a named configuration block inside `pkl.pkldocGenerators`:\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  pkldocGenerators {\n    pkldoc {\n      sourceModules.addAll(files(\"doc-package-info.pkl\", \"Template1.pkl\", \"Template2.pkl\"))\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  pkldocGenerators {\n    register(\"pkldoc\") {\n      sourceModules.addAll(files(\"doc-package-info.pkl\", \"Template1.pkl\", \"Template2.pkl\"))\n    }\n  }\n}\n----\n====\n\nFor each declared Pkldoc generator, the Pkl plugin creates an equally named task.\nHence, the above generator can be run with:\n\n[source,shell script]\n----\n$ ./gradlew pkldoc\n----\n\nFor a ready-to-go example with full source code,\nsee link:{uri-pkldoc-example}[pkldoc] in the _pkl-jvm-examples_ repository.\n\n=== Configuration Options\n\nThe following properties can be configured inside a Pkldoc generator's configuration block:\n\n.outputDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `layout.buildDirectory.dir(\"pkldoc/<generator_name>\")` +\nExample: `outputDir = layout.projectDirectory.dir(\"pkl-docs\")` +\nThe directory where generated documentation is placed.\n====\n\n.noSymlinks: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nExample: `noSymlinks = true` +\nCreate copies of files and directories instead of symbolic links.\nIn particular, this affects how the \"current\" directories containing documentation content for the last generated version should be created.\nBy default, a symbolic link is created pointing to the last generated version.\nIf symlinks are disabled, a full copy of the last generated version is created.\n====\n\nCommon properties:\n\ninclude::../partials/gradle-modules-properties.adoc[]\n\n[[project-package]]\n== Project packaging\nThis feature is the Gradle analogy for the xref:pkl-cli:index.adoc#command-project-package[project package] command in the CLI.\nIt prepares package assets to be published from a project.\n\nThere are two differences between this feature and the CLI:\n\n* Input project directories are required (the CLI determines a project from the current working directory if arguments are omitted).\n* Output directory defaults to a path within the build directory.\n\n=== Usage\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  project {\n    packagers {\n      makePackages {\n        projectDirectories.from(file(\"pkl-config/\"))\n      }\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  project {\n    packagers {\n      register(\"makePackages\") {\n        projectDirectories.from(file(\"pkl-config/\"))\n      }\n    }\n  }\n}\n----\n====\n\nFor each declared packager, the Pkl plugin creates an equally named task.\nHence, the above packager can be run with:\n\n[source,shell]\n----\n$ ./gradlew makePackages\n----\n\n=== Configuration Options\n\n.projectDirectories: ConfigurableFileCollection\n[%collapsible]\n====\nDefault: (none) +\nExample: `projectDirectories.from(file(\"pkl-config/\"\"))` +\nThe project directories to create packages for.\n====\n\n.skipPublishCheck: Property<Boolean>\n[%collapsible]\n====\nDefault: (false) +\nExample: `skipPublishCheck.set(true)`\n\nSkips checking whether a package has already been published with different contents.\n\nBy default, the packager will check whether a package at the same version has already been published.\nIf the package has been published, it validates that the package's metadata is identical to the locally generated metadata.\n====\n\n.outputPath: DirectoryProperty\n[%collapsible]\n====\nDefault: `project.getLayout().getBuildDirectory().dir(\"generated/pkl/packages\")`\n\nThe directory to write artifacts to.\nAccepts the following placeholders:\n\n`%\\{name}`:: The name of the package\n`%\\{version}`:: The version of the package\n====\n\n.junitReportsDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `null` +\nExample: `junitReportsDir = layout.buildDirectory.dir(\"reports\")` +\nWhether and where to generate JUnit XML reports.\n====\n\n.overwrite: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nWhether to ignore expected example files and generate them again.\n====\n\nCommon properties:\n\ninclude::../partials/gradle-common-properties.adoc[]\n\n== Project Resolving\n\nThis feature is the Gradle analogy for the xref:pkl-cli:index.adoc#command-project-resolve[project resolve] command in the CLI.\nIt takes the dependencies of a project, and writes the resolved versions a file at path `PklProject.deps.json`, within the root directory of the project.\n\n=== Usage\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  project {\n    resolvers {\n      resolvePklDeps {\n        projectDirectories.from(file(\"pkl-config/\"))\n      }\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  project {\n    resolvers {\n      register(\"resolvePklDeps\") {\n        projectDirectories.from(file(\"pkl-config/\"))\n      }\n    }\n  }\n}\n----\n====\n\nFor each declared resolver, the Pkl plugin creates an equally named task.\nHence, the above resolver can be run with:\n\n[source,shell]\n----\n$ ./gradlew resolvePklDeps\n----\n\n=== Configuration Options\n\n.projectDirectories: ConfigurableFileCollection\n[%collapsible]\n====\nDefault: (none) +\nExample: `projectDirectories.from(file(\"pkl-config/\"\"))` +\nThe project directories to create packages for.\n====\n\nCommon properties:\n\ninclude::../partials/gradle-common-properties.adoc[]\n\n[[analyze-imports]]\n== Analyze Imports\n\nThis feature is the Gradle analogy for the xref:pkl-cli:index.adoc#command-analyze-imports[analyze imports] command in the CLI. It builds a graph of imports of the provided source modules.\n\n=== Usage\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  analyzers {\n    imports {\n      appConfig {\n        sourceModules.add(file(\"src/main/resources/appConfig.pkl\"))\n      }\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  analyzers {\n    imports {\n      register(\"appConfig\") {\n        sourceModules.add(file(\"src/main/resources/appConfig.pkl\"))\n      }\n    }\n  }\n}\n----\n====\n\n=== Configuration Options\n\n.outputFormat: Property<String>\n[%collapsible]\n====\nSame meaning as <<output-format,outputFormat>> in <<module-evaluation>>.\n====\n\n.outputFile: RegularFileProperty<String>\n[%collapsible]\n====\nSame meaning as <<output-file,outputFile>> in <<module-evaluation>>.\n====\n\nCommon properties:\n\ninclude::../partials/gradle-modules-properties.adoc[]\n"
  },
  {
    "path": "docs/modules/pkl-gradle/partials/gradle-codegen-properties.adoc",
    "content": ".indent: Property<String>\n[%collapsible]\n====\nDefault: `\"  \"` (two spaces) +\nExample: `indent = \"\\t\"` (one tab) +\nThe characters to use for indenting generated source code.\n====\n\n.outputDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `layout.buildDirectory.dir(\"generated/pkl/<generator_name>\")` +\nExample: `outputDir = layout.projectDirectory.dir(\"src/main/pkl\")` +\nThe directory where generated classes are placed.\n\nThe default places generated sources within the build directory of the project, to avoid sources from being committed into the repository on accident.\n====\n\n.sourceSet: Property<SourceSet>\n[%collapsible]\n====\nDefault: `sourceSets.main` (if it exists; no default otherwise) +\nExample: `sourceSet = sourceSets.test` +\nThe Gradle source set that generated code is compiled together with.\n\nFor the codegen tasks, the `modulePath` property defaults to the compilation classpath of this source set, as well as all of the source directories of the `resource` source directory set of this source set. This setup makes it possible to rely on modules defined in classpath dependencies of your project or in the resources of your project.\n\nFor projects which apply the `idea` plugin and are opened in IntelliJ IDEA, this option determines whether generated sources are marked as test sources (if the source set's name contains the word \"test\") or regular sources (otherwise).\n====\n\n.generateSpringBootConfig: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nExample: `generateSpringBootConfig = true` +\nWhether to generate config classes for use with Spring Boot.\n====\n\n.implementSerializable: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nExample: `implementSerializable = true` +\nWhether to generate classes that implement `java.io.Serializable`.\n====\n\n.addGeneratedAnnotation: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nExample: `addGeneratedAnnotation = true` +\nWhether to add the `org.pkl.config.java.Generated` annotation to generated types.\n====\n\n.renames: MapProperty<String, String>\n[%collapsible]\n====\nDefault: `[:]` +\nExample: `renames = [\"foo.\": \"com.example.foo.\", \"bar.Config\": \"com.example.bar.Config\"]` +\nAllows to change default class and package names (derived from Pkl module names) in the generated code.\n\nWhen you need the generated class or package names to be different from the default names derived from the Pkl module names, you can define a rename mapping, where the key is the original Pkl module name prefix, and the value is its replacement.\nWhen you do, the generated code's `package` declarations, class names, as well as file locations, will be modified according to this mapping.\n\nThe prefixes are replaced literally, which means that dots at the end are important.\nIf you want to rename packages only, in most cases, you must ensure that you have an ending dot on both sides of a mapping (except for an empty mapping, if you use it), otherwise you may get unexpected results:\n\n----\n// Assuming the following mapping configuration:\nrenames = [\n  \"com.foo.\": \"x\",  // Dot on the left only\n  \"org.bar\": \"y.\",  // Dot on the right only\n  \"net.baz\": \"z\"    // No dots\n]\n\n// The following renames will be made:\n\"com.foo.bar\" -> \"xbar\"       // Target prefix merged into the suffix\n\"org.bar.baz\" -> \"y..baz\"     // Double dot, invalid name\n\"net.baz.qux\" -> \"z.qux\"      // Looks okay, but...\n\"net.bazqux\"  -> \"zqux\"       // ...may cut the name in the middle.\n----\n\nWhen computing the appropriate target name, the longest matching prefix is used:\n\n----\n// Assuming the following mapping configuration:\nrenames = [\n  \"com.foo.Main\": \"w.Main\",\n  \"com.foo.\": \"x.\",\n  \"com.\": \"y.\",\n  \"\": \"z.\"\n]\n\n// The following renames will be made:\ncom.foo.Main -> w.Main\ncom.foo.bar  -> x.bar\ncom.baz.qux  -> y.baz.qux\norg.foo.bar  -> z.org.foo.bar\n----\n\nKeys in this mapping can be arbitrary strings, including an empty string.\nValues must be valid dot-separated fully qualifed class name prefixes, possibly terminated by a dot.\n====\n\n"
  },
  {
    "path": "docs/modules/pkl-gradle/partials/gradle-common-properties.adoc",
    "content": ".allowedModules: ListProperty<String>\n[%collapsible]\n====\nDefault: `[\"pkl:\", \"file:\", \"modulepath:\", \"https:\", \"repl:\", \"package:\", \"projectpackage:\"]` +\nExample: `allowedModules = [\"file:\"]` +\nURI patterns that determine which modules can be loaded and evaluated.\nPatterns are matched against the beginning of module URIs.\n(File paths have been converted to `file:` URLs at this stage.)\nAt least one pattern needs to match for a module to be loadable.\n====\n\n.allowedResources: ListProperty<String>\n[%collapsible]\n====\nDefault: `[\"env:\", \"prop:\", \"modulepath:\", \"https:\", \"file:\", \"package:\", \"projectpackage:\"]` +\nExample: `allowedResources = [\"env:\", \"prop:\"]` +\nURL patterns that determine which external resources can be read.\nPatterns are matched against the beginning of resource URLs.\nAt least one pattern needs to match for a resource to be readable.\n====\n\n.environmentVariables: MapProperty<String, String>\n[%collapsible]\n====\nDefault: `[:]` (note that Gradle default differs from CLI default) +\nExample 1: `environmentVariables = [\"MY_VAR_1\": \"myValue1\", \"MY_VAR_2\": \"myValue2\"]` +\nExample 2: `environmentVariables = System.getenv()` +\nEnvironment variables that can be read by Pkl code with `read(\"env:<envVariableName>\")`.\n====\n\n.evalRootDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `rootProject.layout.projectDirectory` +\nExample 1: `evalRootDir = layout.projectDirectory.dir(\"pkl-modules\")` +\nExample 2: `evalRootDir.fileValue file(\"/some/absolute/path\")` +\n\nRoot directory for `file:` modules and resources.\nIf non-null, access to file-based modules and resources is restricted to those located under the root directory.\nAny symlinks are resolved before this check is performed.\n====\n\n.evalTimeout: Property<java.time.Duration>\n[%collapsible]\n====\nDefault: `null` +\nExample: `evalTimeout = Duration.ofSeconds(10)` +\nDuration after which evaluation of a source module will be timed out.\nNote that a timeout is treated the same as a program error in that any subsequent source modules will not be evaluated.\n====\n\n.externalProperties: MapProperty<String, String>\n[%collapsible]\n====\nDefault: `[:]` +\nExample: `externalProperties = [\"myProp1\": \"myValue1\", \"myProp2\": \"myValue2\"]` +\nExternal properties that can be read by Pkl code with `read(\"prop:<propertyName>\")`.\n====\n\n.moduleCacheDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `null` +\nExample 1: `moduleCacheDir = layout.buildDirectory.dir(\"pkl-module-cache\")` +\nExample 2: `moduleCacheDir.fileValue file(\"/absolute/path/to/cache\")` +\nThe cache directory for storing packages.\nIf `null`, defaults to `~/.pkl/cache`.\n====\n\n.color: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nFormat messages using ANSI color.\n====\n\n.noCache: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` +\nDisable caching of packages.\n====\n\n.modulePath: ConfigurableFileCollection\n[%collapsible]\n====\nDefault: `files()` (empty collection) +\nExample: `modulePath.from files(\"dir1\", \"zip1.zip\", \"jar1.jar\")` +\nThe directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.\nRelative paths are resolved against the project directory.\n====\n\n.proxy: Property<URI>\n[%collapsible]\n====\nDefault: `null` +\nExample: `proxy = uri(\"http://proxy.example.com:1234\")` +\nConfigures HTTP connections to connect to the provided proxy address.\nThe URI must have scheme `http`, and may not contain anything other than a host and port.\n====\n\n.noProxy: ListProperty<String>\n[%collapsible]\n====\nDefault: `null` +\nExample: `noProxy = [\"example.com\", \"169.254.0.0/16\"]` +\nHosts to which all connections should bypass the proxy.\nHosts can be specified by name, IP address, or IP range using https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation[CIDR notation].\n====\n\n.httpRewrites: MapProperty<String, String>\n[%collapsible]\n====\nDefault: `null` +\nExample: `httpRewrites = [uri(\"https://pkg.pkl-lang.org/\"): uri(\"https://my.internal.mirror/\")]` +\nReplace outbound HTTP(S) requests from one URL with another URL.\nThe left-hand side describes the source prefix, and the right-hand describes the target prefix.\nThis option is commonly used to enable package mirroring.\nThe above example will rewrite URL `\\https://pkg.pkl-lang.org/pkl-k8s/k8s@1.0.0` to `\\https://my.internal.mirror/pkl-k8s/k8s@1.0.0`.\n====\n\n.powerAssertions: Property<Boolean>\n[%collapsible]\n====\nDefault: `false` (except for test tasks, which default to `true`) +\nExample: `powerAssertions = true` +\nEnable power assertions for detailed assertion failure messages.\nWhen enabled, type constraint failures will show intermediate values in the assertion expression.\nThis option has a performance impact when constraint failures occur.\n====\n"
  },
  {
    "path": "docs/modules/pkl-gradle/partials/gradle-modules-properties.adoc",
    "content": "\n.sourceModules: ListProperty<Object>\n[%collapsible]\n====\nDefault: `[]` +\nExample 1: `sourceModules = [\"module1.pkl\", \"module2.pkl\"]` +\nExample 2: `+sourceModules = fileTree(\"config\").include(\"**/*.pkl\")+` +\nList of Pkl modules which are used for this operation.\n\nThis property accepts the following types to represent a module:\n\n* `java.net.URI`\n* `java.io.File`\n* `java.nio.file.Path`\n* `java.net.URL`\n* `java.lang.CharSequence` - if the represented string looks like a URI (it contains a scheme), the input is treated as a URI. Otherwise, it is treated as a path. Relative paths are resolved against the project directory.\n* `org.gradle.api.file.FileSystemLocation`\n====\n\n.transitiveModules: ConfigurableFileCollection\n[%collapsible]\n====\nDefault: [computed by pkl-gradle] +\nExample 1: `transitiveModules.from files(\"module1.pkl\", \"module2.pkl\")` +\nExample 2: `+transitiveModules.from fileTree(\"config\").include(\"**/*.pkl\")+` +\n\nFile paths of modules that are directly or indirectly used by source modules.\n\nThis property, along with `sourceModules`, is the set of input files used to determine whether this task is up-to-date or not.\n\nBy default, Pkl computes this property by analyzing the imports of the source modules.\nSetting this property explicitly causes Pkl to skip the analyze imports step.\n\nIncluding source modules in `transitiveModules` is permitted but not required.\nRelative paths are resolved against the project directory.\n====\n\n.projectDir: DirectoryProperty\n[%collapsible]\n====\nDefault: `null` +\nExample 1: `projectDir = layout.projectDirectory.dir(\"pkl\")` +\nExample 2: `projectDir.fileValue file(\"/some/absolute/path\")`\n\nDirectory where the project lives.\n\nA project is a directory that contains a `PklProject` file, which is used to declare package dependencies, as well as common evaluator settings to be applied in the project.\n\nIf `null`, this is determined by searching up from the working directory for a directory that contains a `PklProject` file, until `evalRootDir` or the file system root is reached.\n====\n\n.omitProjectSettings: Property<Boolean>\n[%collapsible]\n====\nDisables loading evaluator settings from the PklProject file.\n====\n\n.noProject: Property<Boolean>\n[%collapsible]\n====\nDisables all behavior related to projects.\n====\n\n.settingsModule: Property<Object>\n[%collapsible]\n====\nDefault: `null` +\nExample: `settingsModule = layout.projectDirectory.file(\"mySettings.pkl\")` +\nThe Pkl settings module to use.\nThis property accepts the same input types as the `sourceModules` property.\n\nIf `null`, `~/.pkl/settings.pkl` or defaults specified in the `pkl.settings` standard library module are used.\n====\n\ninclude::../partials/gradle-common-properties.adoc[]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.25.adoc",
    "content": "= Pkl 0.25 Release Notes\n:version: 0.25\n:version-minor: 0.25.1\n:release-date: February 1st, 2024\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThis is the initial release of Pkl, a programming language for creating configuration.\n\nTo learn more about Pkl, refer to our xref:blog:ROOT:introducing-pkl.adoc[blog post].\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.26.adoc",
    "content": "= Pkl 0.26 Release Notes\n:version: 0.26\n:version-minor: 0.26.3\n:release-date: June 17th, 2024\n\ninclude::ROOT:partial$component-attributes.adoc[]\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThis release brings Windows support, improvements to controlling how Pkl talks over HTTP, and also fixes a scoping bug around typealiases.\n\nThe next release (0.27) is scheduled for October 10th, 2024.\n\nPlease send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +\n\n[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].\nTo get started, follow xref:pkl-cli:index.adoc#installation[Installation].#\n\n== Highlights [small]#💖#\n\nNews you don't want to miss.\n\n[[windows-support]]\n=== Windows Support\n\nPkl is now available on Windows! (https://github.com/apple/pkl/pull/492[#492])\n\n\nIn addition to macOS and Linux, Pkl is now available for download on Windows operating systems.\n\nFor installation instructions, consult xref:pkl-cli:index.adoc#windows-executable[Windows Executable] in the CLI reference.\n\n==== Writing cross-platform Pkl programs\n\nOn Windows, the in-language filepath separator is still `/`.\nThis means that most existing Pkl code should still continue working as-is.\n\nA small portion of programs will need to be updated to handle Windows support correctly.\nOne example is the various conversion scripts that read input files as CLI flags.\n\nFor example, here is a snippet from module https://github.com/apple/pkl-pantry/blob/d9571cdce407bb7f1687f81b945a4bfd24ce017d/packages/k8s.contrib/convert.pkl#L100C1-L103C74[k8s.contrib.convert]:\n\n.convert.pkl#L100-L103\n[source,pkl]\n----\nlocal inputUri =\n  if (input.startsWith(Regex(#\"\\w+:\"#))) input      // absolute URI\n  else if (input.startsWith(\"/\")) \"file://\\(input)\" // absolute file path\n  else \"file://\\(read(\"env:PWD\"))/\\(input)\"         // relative file path\n----\n\nOn Windows, the env var `PWD` is a Windows-style path, like `C:\\Foo\\Bar\\Baz`.\nWith the above logic, `inputUri` can expand to a value like `\"\\file://C:\\Foo\\Bar\\Baz/input.yaml\"`.\nThis would an invalid URI; the correct URI should be `\"\\file:///C:/Foo/Bar/Baz/input.yaml\"`.\n\nHere is a possible fix for this code:\n\n[source,pkl]\n----\nimport \"pkl:platform\"\n\nlocal inputUri =\n  if (input.startsWith(Regex(#\"\\w+:/\"#))) input\n  else if (input.startsWith(\"/\")) \"file://\\(input)\"\n  else\n    let (pwd = read(\"env:PWD\"))\n    let (\n      path =\n        if (platform.current.operatingSystem.name == \"Windows\")\n          \"/\\(pwd)/\\(input)\".replaceAll(\"\\\\\", \"/\")\n        else \"\\(pwd)/\\(input)\"\n    )\n      \"file://\\(path)\"\n----\n\nTo learn more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0006-import-paths-on-windows.adoc[SPICE-0006].\n\n[[http-proxying]]\n=== HTTP proxying\n\nPkl now supports proxying HTTP(S) requests (https://github.com/apple/pkl/pull/506[#506]).\n\nFor users of the CLI, Pkl will by default look for proxy settings configured within the OS when on macOS, Windows, and GNOME environments.\n\nThis can be changed by adding settings in the following locations:\n\n1. xref:pkl-cli:index.adoc#settings-file[Settings file]\n2. xref:language-reference:index.adoc#projects[PklProject file]\n3. `--http-proxy` and `--http-no-proxy` CLI flags\n\nAs part of this, some changes have been made to the standard library. For details, see <<standard-library-changes,Standard Library changes>>.\n\nUsers of the Java/Kotlin bindings can specify proxy settings when building an <<http-java-client,HTTP client>>.\n\nHTTP proxy settings are also added as new fields in the message-passing-api.\nAuthors of external Pkl clients are encouraged to support these new fields to provide proxy support in their libraries.\nFor details, see <<message-passing-api-changes,Message passing API changes>>.\n\nTo read more about the design of HTTP proxying, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0004-HTTP-Proxy-Support.adoc[SPICE-0004], and also the xref:pkl-cli:index.adoc#http-proxy[documentation].\n\n[[scheme-agnostic-project-dependencies]]\n=== Scheme-agnostic project dependencies\n\nImprovements have been made to project dependencies (https://github.com/apple/pkl/pull/486[#486]).\n\nA project dependency is a way to manage `package`-based modules.\nIt provides two uses:\n\n1. A package can be imported through xref:language-reference:index.adoc#dependency-notation[dependency notation].\n2. Conflicting versions in the transitive dependency graph are resolved.\n\nCurrently, dependencies can only be used with file-based modules.\nThis can be limiting in some circumstances:\n\n1. JVM library users typically interact with Pkl by bundling Pkl files a classpath resources, and load them using `modulepath:` URIs.\n2. Go library users often embed Pkl code using the https://pkg.go.dev/embed#hdr-Directives[`go:embed` directive], and load them using https://pkg.go.dev/github.com/apple/pkl-go/pkl#WithFs[`WithFs`].\n\nThis means that these users miss out on the benefits of project dependencies.\n\nPkl 0.26 adds support for using dependencies in any hierarchical module scheme.\nThis means that `modulepath:` users in Java can now declare projects and dependencies.\nThis also means that other custom methods of embedding modules can also use dependency notation.\n\n[NOTE]\n====\nA _hierarchical_ URI is a URI whose path part starts with `/`, and in which `/` delimits path segments.\n\nThe URI `myscheme:/foo.pkl` is hierarchical, whereas the URI `myscheme:foo.pkl` is not.\n====\n\nTo read more about this design, consult https://github.com/apple/pkl-evolution/tree/main/spices/SPICE-0005-scheme-agnostic-projects.adoc[SPICE-0005].\n\n[[typealias-scoping-fix-and-change]]\n=== Typealias scoping fix and change\n\nImprovements have been made to `typealias`es (https://github.com/apple/pkl/pull/144[#144], https://github.com/apple/pkl/pull/373[#373], https://github.com/apple/pkl/pull/516[#516]).\n\nCurrently, a typealias that references a value on its enclosing module will break if used in another module.\n\n.myModule.pkl\n[source,pkl]\n----\ntypealias StartsWithFoo = String(startsWith(foo))\n\nfoo = \"foo\"\n----\n\n[source,pkl]\n----\nimport \"myModule.pkl\"\n\nmyStr: StartsWithFoo = \"fooey\"\n----\n\nThis results in error:\n\n[source]\n----\n–– Pkl Error ––\nCannot find property `foo`.\n\n1 | typealias StartsWithFoo = String(startsWith(foo))\n----\n\nThis is a language bug that has been fixed.\n\nIn the process of fixing this bug, we realized that the rules around variable resolution within typealiases were problematic.\nTypealiases are meant to be statically defined, and shouldn't be able to see properties that can be late-bound.\nThus, a new rule is introduced: a typealias can only reference properties/methods that are `const`.\n\nThis is a breaking change. To read more about this breakage and remediation steps, reference <<typealiases-are-treated-as-const>>.\n\n== Noteworthy [small]#🎶#\n\nReady when you need them.\n\n[[pkldoc-improvements]]\n=== Pkldoc improvements\n\nThe following improvements have been made to xref:pkl-doc:index.adoc[Pkldoc]:\n\n1. The documentation for the standard library no longer shows dependent packages, because every package implicitly depends on the standard library (https://github.com/apple/pkl/pull/503[#503]).\n2. If the standard library exists in the package list, it is shown first (https://github.com/apple/pkl/pull/165[#165]).\n3. Fewer characters are percent-encoded. For example, the `(` and `)` characters are no longer percent-encoded (https://github.com/apple/pkl/pull/489[#489]).\n\n[[standard-library-changes]]\n=== Standard library changes\n\nTo support <<http-proxying,http proxying>>, several changes have been made to the standard library (https://github.com/apple/pkl/pull/506[#506]).\n\n* Module `pkl.settings` has new property `http`.\n* class `EvaluatorSettings` originally in `pkl.Project` has been moved to its own module.\nFor backwards compatibility, `pkl.Project` now has a `typealias EvaluatorSettings` pointing to the new module, but it is marked `@Deprecated`.\n\n=== Java API Changes\n\n[[http-java-client]]\n==== HTTP Java Client\n\nA new Java API is introduced, named `org.pkl.core.http.HttpClient` (https://github.com/apple/pkl/pull/217[#217], https://github.com/apple/pkl/pull/295[#295], https://github.com/apple/pkl/pull/506[#506], https://github.com/apple/pkl/pull/518[#518]).\nThis interface provides the ability to manage how Pkl makes HTTP(S) calls, including how it deals with CA certificates, as well as proxies.\n\nThis client can be passed to Pkl's evaluator using `EvaluatorBuilder` for users of pkl-core, and `ConfigEvaluatorBuilder` for users of pkl-config-java or pkl-config-kotlin.\n\n[[http-module-key-factory]]\n==== New HTTP ModuleKeyFactory\n\nA new module key factory for HTTP(S) modules has been added (https://github.com/apple/pkl/pull/495[#495]), and can be built with `org.pkl.core.ModuleKeyFactories#http`.\n\nThe preconfigured evaluator (`org.pkl.core.EvaluatorBuilder#preconfigured`) includes this module key.\nUsers that build their own evaluator from scratch should add this module key factory if HTTP(S) modules are needed.\n\nExample:\n\n[source,diff]\n----\n import org.pkl.core.EvaluatorBuilder;\n import org.pkl.core.module.ModuleKeyFactories;\n\n var evaluator = EvaluatorBuilder.unconfigured()\n+  .addModuleKeyFactory(ModuleKeyFactories.http) // <1>\n   .build();\n----\n<1> Add `ModuleKeyFactories.http` to the set of module key factories used by this evaluator.\n\nIf this module key factory is not added, Pkl may still make HTTP(S) requests if `ModuleKeyFactories.genericUrl` is included.\nHowever, this bypasses proxy and CA certificate settings.\n\n[[pkl-executor-changes]]\n==== `pkl-executor` changes\n\nA new set of parameters are now available to `org.pkl.executor.Executor` (https://github.com/apple/pkl/pull/217[#217], https://github.com/apple/pkl/pull/518[#518]).\nThese new parameters are exposed by `org.pkl.executor.spi.v1.ExecutorSpiOptions2`.\n\nThe new parameters are:\n\n* `certificateFiles`: A set of CA certificate files to trust when making HTTPS requests.\n* `certificateBytes`: A set of PEM-encoded CA certificate bytes to trust when making HTTPS requests.\n* `testPort`: An option that is used for internal testing only.\n\nThese options are ignored when using a Pkl distribution whose version is lower than 0.26.0.\n\n[[message-passing-api-changes]]\n=== Message passing API changes\n\nA new property, `http`, is added to xref:bindings-specification:message-passing-api.adoc#create-evaluator-request[Create Evaluator Request] (https://github.com/apple/pkl/pull/506[#506], https://github.com/apple/pkl/pull/518[#518]).\n\nThis allows for the configuration of Pkl's HTTP proxy, as well as CA certificates.\n\n[[rename-codegen-classes]]\n=== Ability to rename classes produced by Java/Kotlin code generators\n\nThe Java and Kotlin code generators have a new option that allows users to change the name of Java/Kotlin classes that get produced during code generation (https://github.com/apple/pkl/pull/499[#499]).\n\nThe CLIs have a new flag, `--rename`, and the Gradle plugin receives a similarly named property called `renames`.\n\nThis option accepts a map from an old prefix to a new prefix, where longer prefixes have higher precedence than shorter prefixes.\n\nFor example, when generating `module foo.Bar`, specifying `--rename foo.=com.foo.` will cause the Java/Kotlin code generators to emit package `com.foo`, and class `Bar`.\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n[[typealiases-are-treated-as-const]]\n=== Typealiases are treated as `const`\n\nA breaking change has been made to typealiases (https://github.com/apple/pkl/pull/516[#516]).\n\nTypealiases are types that can stand in for another type declaration.\n\nThe aliased type can have constraints, where these constraints can reference values defined on the enclosing module.\n\n.baseModule.pkl\n[source,pkl]\n----\ntypealias MyValue = Any(isValid) // <1>\n\nisValid = true\n----\n<1> `isValid` is defined on the enclosing module.\n\nOne problem with this is that typealiases are meant to be statically defined.\nLike classes, typealiases should not be changed by amending its enclosing module.\n\n[source,pkl]\n----\namends \"baseModule.pkl\"\n\nisValid = false // <1>\n----\n<1> Despite this amended value, `typealias MyValue` should still stand for `Any(true)`.\n\nTo have clearer semantics, a new rule is introduced: referenced members on the enclosing module must be `const`.\nEffectively, a typealias is treated as if it is also a `const` member.\n\nTo fix the above typealias, the `const` modifier should be added to `isValid`.\n\n[source,diff]\n----\n typealias MyValue = Any(isValid)\n \n-isValid = true\n+const isValid = true\n----\n\nIt might not always be valid to add the `const` modifier.\nFor example, this property may be overwritten in a downstream module, so adding the `const` modifier this would break that module.\nIn these cases, another fix is to self-import the enclosing module.\nThis works because import declarations introduce values that are implicitly marked `const`.\n\n.baseModule.pkl\n[source,diff]\n----\n+import \"baseModule.pkl\" // <1>\n+\n-typealias MyValue = Any(isValid)\n+typealias MyValue = Any(baseModule.isValid)\n \n isValid = true\n----\n<1> Self import\n\nThis change aligns with the behavior of class and annotation bodies.\n\nTo read more about the rationale behind this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0007-const-checks-in-typealiases.adoc[SPICE-0007].\n\n[[expanded-dependency-notation-uris]]\n=== Expanded dependency notation URIs\n\nThe parsing of relative path imports has changed (https://github.com/apple/pkl/pull/486[#486]).\n\nCurrently, the declaration `import \"@foo/bar.pkl\"` is treated as the import of a dependency named `foo`, but _only_ when declared within file-based and package-based modules.\nIn an HTTP-based module, for example, the above import is treated as \"bar.pkl inside directory @foo\".\n\nTo <<scheme-agnostic-project-dependencies,improve project dependencies>>, such declarations are treated as dependency notation in all modules, and will fail with error \"Cannot find dependency\".\n\nAny import/reads that are intentionally relative-path imports will need to be updated to be prefixed with `./`.\n\nExample:\n\n[source,diff]\n----\n-import \"@bar/foo.pkl\"\n+import \"./@bar/foo.pkl\"\n----\n\n[[minimum-java-version-bump]]\n=== Minimum Java version bumped to Java 17\n\nThe minimum Java version for Pkl has been bumped to Java 17 (https://github.com/apple/pkl/pull/439[#439]).\n\nThis means that when running the xref:pkl-cli:index.adoc#java-executable[jpkl] CLI, the installed `java` is expected to be Java 17 or higher.\nThis also means that users of the JVM libraries need to be on at least Java 17 or higher.\n\n[[minimum-gradle-version-bump]]\n=== Gradle plugin minimum version bump\n\nThe minimum Gradle version for the xref:main:pkl-gradle:index.adoc[Gradle plugin] is now 8.1 (https://github.com/apple/pkl/pull/454[#454]).\n\n[[path-encoding-changes]]\n=== Path encoding changes\n\nIn order to support Windows, the output of some Pkl tools have unsafe characters encoded in a special format (https://github.com/apple/pkl/pull/489[#489]).\n\nOn Windows, the characters `<`, `>`, `:`, `\"`, `\\`, `|`, `?`, and `*` are reserved and cannot exist in a filename.\nAdditionally, the ASCII control character code points `0x0` through `0x1f` are also illegal.\n\nThese characters are encoded by wrapping their hexadecimal code point value in parentheses.\nFor example, the character `:` is encoded as `(3a)`.\n\nIn some scenarios, files that get written to disk will be encoded.\nThese are:\n\n* Files generated by Pkldoc.\n* `*.kt` files produced by the Kotlin code generator.\n* Packages written to the cache directory.\n\nTo learn more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0003-windows-safe-paths.adoc[SPICE-0003].\n\n==== Pkldoc links changes\n\nThe links generated by Pkldoc have changed.\n\nFor example, a module called `module `foo<bar`` creates file `foo(3c)bar.html`, instead of `foo<bar.html`.\n\nAs part of this change, some Pkldoc links have also changed.\n\n==== Cache directory prefix changes\n\nThe cache directory has been changed from `<moduleCacheDir>/package-1` to `<moduleCacheDir>/package-2`.\n\nIf Pkl's dependencies are vendored within a repository, these dependencies will need to be re-vendored.\n\n=== Java API Breaking Changes\n\nThe following Java APIs have breaking changes:\n\n|===\n|Class/method | Breaking change\n\n|`org.pkl.cli.commands.CliDownloadPackageCommand`\n|Renamed to `org.pkl.cli.commands.CliPackageDownloader`\n\n|`org.pkl.cli.commands.CliAbstractProjectCommand`\n|Renamed to `org.pkl.cli.commands.CliProjectCommand`\n\n|`org.pkl.config.java.InvalidMappingException`\n|Fields `pklName` and `javaName` are now `private`.\n\n|`org.pkl.core.packages.PackageResolver#getInstance`\n|New parameter `httpClient` added\n\n|`org.pkl.core.repl.ReplServer.ReplServer`\n|New parameter `httpClient` added\n\n|`org.pkl.commons.cli.CliBaseOptions`\n|New parameters `testPort`, `httpProxy`, `httpNoProxy` added\n|===\n\n[[standard-library-breaking-changes]]\n=== Standard library breaking changes\n\nClass `pkl.Project.EvaluatorSettings` has been removed.\nA new (deprecated) typealias is added that points to new module `pkl.EvaluatorSettings`.\nFor both of these, see https://github.com/apple/pkl/pull/506[#506].\n\n[[type-checked-settings-file]]\n=== Type-checked settings file\n\nThe loading of the xref:pkl-cli:index.adoc#settings-file[settings file] has changed (https://github.com/apple/pkl/pull/477[#477]).\n\nThe settings file is a way to control the behavior of the Pkl CLI.\nThis module is expected to `amends \"pkl:settings\"`, but this behavior was not checked.\n\nIn 0.26, it is an error if the settings module neither amends `\"pkl:settings\"`, nor set its `output.value` to an instance of the settings module.\n\n[[empty-directories-excluded-from-packaging]]\n=== Empty directories excluded from packaging\n\nCurrently, the `pkl project package` command will bundle empty directories into the resulting ZIP file.\n\nIn version 0.26, this has been changed to exclude these directories (https://github.com/apple/pkl/pull/330[#330]).\nThis means that the packages can produce a _different_ checksum if there are any empty directories.\n\nThis does not break the usage of existing packages, and does not affect compatibility of new packages used with older Pkl 0.25.\n\nHowever, this can break certain workflows.\nThe `pkl project package` command runs a publish check, to determine if a package has already been published but with a different checksum.\nWhen upgrading, users might encounter an error message like the following:\n\n[source]\n----\n-- Pkl Error --\nPackage `package://example.com/foo@1.0.0` was already published with different contents.\n----\n\nTo mitigate, the package's version needs to be bumped, even if package contents have not changed.\n\n== Miscellaneous [small]#🐸#\n\nThe following changes have been made that are neither new features nor breaking changes.\n\n* Pkl's user-agent header for HTTP requests has been tweaked to add a semicolon (https://github.com/apple/pkl/pull/221[#221]). Here is an example difference:\n+\nBefore: `Pkl/0.26 (macOS native)` + \nAfter: `Pkl/0.26 (macOS; native)`\n* Documentation improvements (https://github.com/apple/pkl/pull/120[#120], https://github.com/apple/pkl/pull/121[#121], https://github.com/apple/pkl/pull/142[#142], https://github.com/apple/pkl/pull/121[#121], https://github.com/apple/pkl/pull/337[#337], https://github.com/apple/pkl/pull/341[#341], https://github.com/apple/pkl/pull/372[#372], https://github.com/apple/pkl/pull/386[#386], https://github.com/apple/pkl/pull/391[#391], https://github.com/apple/pkl/pull/397[#397], https://github.com/apple/pkl/pull/422[#422], https://github.com/apple/pkl/pull/436[#436], https://github.com/apple/pkl/pull/469[#469], https://github.com/apple/pkl/pull/484[#484], https://github.com/apple/pkl/pull/485[#485], https://github.com/apple/pkl/pull/[#491]).\n* Optimization: `const` access is checked when variables are resolved, instead of every time the variable is accessed (https://github.com/apple/pkl/pull/438[#438]).\n* Optimization: use logical AND instead of bitwise AND when comparing numbers (https://github.com/apple/pkl/pull/102[#102]).\n* Mark Java classes `final` (https://github.com/apple/pkl/pull/458[#458]).\n* Migrate code to newer JDK17 features, and clean up existing Java code (https://github.com/apple/pkl/pull/451[#451], https://github.com/apple/pkl/pull/458[#458], https://github.com/apple/pkl/pull/512[#512]).\n* Improve rendering of string values within generated `<file>.pkl-expected.pcf` files when running `pkl test` (https://github.com/apple/pkl/pull/416[#416]).\n* Improve performance of loading Pkl's built-in CA certificates (https://github.com/apple/pkl/pull/518[#518]).\n\n== Bug Fixes [small]#🐜#\n\nThe following bugs have been fixed.\n\n* `Collection#sortWith` produces un-sorted output (https://github.com/apple/pkl/pull/394[#394]).\n* Property `typedType` in module `pkl.reflect` reflects upon `Type`, instead of `Typed` (https://github.com/apple/pkl/pull/426[#426]).\n* `const` members can be assigned to when via an object spread  (https://github.com/apple/pkl/pull/428[#428]).\n* Relative globbed reads resolve to the same value in different modules (https://github.com/apple/pkl/pull/449[#449]).\n* Performance bug: globbed imports and globbed reads expand to an unbounded number of root nodes (https://github.com/apple/pkl/pull/449[#449]).\n* Relative globbed imports within a package match no modules (https://github.com/apple/pkl/pull/496[#496]).\n* Constraints within typealiases resolve to the wrong values (https://github.com/apple/pkl/pull/144[#144]).\n* Members of `pkl.reflect` cannot be rendered (https://github.com/apple/pkl/pull/170[#170], https://github.com/apple/pkl/pull/470[#470]).\n* Throws `NullPointerException` if \"List Resources Response\" or \"List Modules Response\" messages contain both null `pathElements` and `error` (https://github.com/apple/pkl/pull/480[#480]).\n* Classes of `com.oracle.truffle` are not shaded in pkl-config-java-all and pkl-tools (https://github.com/apple/pkl/pull/238[#238]).\n* Throws `PklBugException` when running publish check on an invalid URL (https://github.com/apple/pkl/pull/441[#441]).\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* https://github.com/flyinprogrammer[@flyinprogrammer]\n* https://github.com/fumiya-kume[@fumiya-kume]\n* https://github.com/garysassano[@garysassano]\n* https://github.com/HT154[@HT154]\n* https://github.com/hoxell[@hoxell]\n* https://github.com/jw-y[@jw-y]\n* https://github.com/KushalP[@KushalP]\n* https://github.com/lilyball[@lilyball]\n* https://github.com/luuvish[@luuvish]\n* https://github.com/Malix-off[@Malix-off]\n* https://github.com/manuelsblanco[@manuelsblanco]\n* https://github.com/MarkSRobinson[@MarkSRobinson]\n* https://github.com/mitchcapper[@mitchcapper]\n* https://github.com/mrs1669[@mrs1669]\n* https://github.com/netvl[@netvl]\n* https://github.com/nirinchev[@nirinchev]\n* https://github.com/raj-j-shah[@raj-j-shah]\n* https://github.com/sgammon[@sgammon]\n* https://github.com/StefMa[@StefMa]\n* https://github.com/stefanobaghino[@stefanobaghino]\n* https://github.com/TimeTravelPenguin[@TimeTravelPenguin]\n* https://github.com/TheFruxz[@TheFruxz]\n* https://github.com/translatenix[@translatenix]\n* https://github.com/zihluwang[@zihluwang]\n\nA special thank-you goes out to https://github.com/translatenix[@translatenix]!\nThey submitted multiple bug fixes, improved the quality of the codebase, and provided HTTP improvements.\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.27.adoc",
    "content": "= Pkl 0.27 Release Notes\n:version: 0.27\n:version-minor: 0.27.2\n:release-date: November 5th, 2024\n\ninclude::ROOT:partial$component-attributes.adoc[]\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThis release brings improvements in typechecking of `Listing` and `Mapping`, the ability to use readers from external processes, as well as a new import graph analyzer API.\n\nThe next release (0.28) is scheduled for February 2025.\n\nPlease send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +\n\n[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].\nTo get started, follow xref:pkl-cli:index.adoc#installation[Installation].#\n\n== Highlights [small]#💖#\n\nNews you don't want to miss.\n\n[#typecheck-improvements]\n=== Improved typechecking of `Listing` and `Mapping` types\n\nTypechecking of `Listing` and `Mapping` types has been improved (https://github.com/apple/pkl/pull/628[#628], https://github.com/apple/pkl/pull/725[#725], https://github.com/apple/pkl/pull/740[#740], https://github.com/apple/pkl/pull/752[#752], https://github.com/apple/pkl/pull/778[#778], https://github.com/apple/pkl/pull/781[#781]).\n\nToday, the typecheck `listing: Listing<E>` immediately evaluates all listing elements to check that they have type `E`.\nLikewise, the typecheck `mapping: Mapping<K, V>` immediately evaluates all mapping values to check that they have type `V`.\n\nFor example, the typecheck `listing: Listing<Bird>` proceeds as follows:\n\n1. Check that `listing` has type `Listing`\n2. Evaluate each listing element and check that it has type `Bird`\n\nThis behavior is different from how the rest of Pkl works.\nGenerally, Pkl only evaluates code that affects program output.\n\nFor example, consider the following program:\n\n[source,pkl]\n----\nclass Bird {\n  name: String\n  canFly: Boolean\n}\n\nlocal bird: Bird = new {\n  name = \"Pidgy\"\n  canFly = throw(\"uh oh\")\n}\n\nbirdName = bird.name\n----\n\nEven though `bird.canFly` throws an error, the above program succeeds because `bird.canFly` is not part of the program's output and hence is never accessed (Note that `bird` is a _local_ property).\n\nTypechecks of `Mapping` and `Listing` types have been changed to match this behavior.\nMapping and listing values are now only typechecked if and when they are accessed.\n\nNOTE: Mapping _keys_ are still eagerly checked.\n\nThis change causes some previously failing programs to evaluate successfully:\n\n[source,pkl]\n----\nlocal myNumbers: Listing<Int> = new { 1; 2; \"uh oh\" } \nresult = myNumbers[0]\n----\nIn Pkl 0.26 and below, the above program fails with a type mismatch error because element `\"uh oh\"` is typechecked when `myNumbers` is accessed.\nIn Pkl 0.27, the same program succeeds, because only element `myNumbers[0]` is part of the program's output and its typecheck succeeds.\n\nAs another consequence of this change, some Pkl programs now complete more quickly:\n\n[source,pkl]\n----\nlocal allBirds: Mapping<String, Bird> = import*(\"**/bird.pkl\")\n\nenvironment: \"prod\"|\"qa\"\n\ncluster: String\n\nmyBird = allBirds[\"\\(environment)/\\(cluster)/bird.pkl\"] // <1>\n----\nIn Pkl 0.26 and below, all modules matching `**/bird.pkl` are imported when `allBirds` is accessed and typechecked.\nThis can take a long time.\nIn Pkl 0.27, only module `\"\\(environment)/\\(cluster)/bird.pkl\"` is imported because only this module is part of the program's output.\n\nTo learn more about this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0010-overhauled-mapping-listing-typechecks.adoc[SPICE-0010].\n\n=== External readers\n\nA new feature has been added to allow Pkl to spawn external processes to read resources and modules (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/762[#762], https://github.com/apple/pkl/pull/766[#766], https://github.com/apple/pkl/pull/770[#770]).\n\nToday, users who use Pkl as a library can define custom module and resource readers.\nThis allows authors to extend how Pkl performs I/O.\n\nFor example, users can implement a reader that reads the `secret:` scheme, where they define exactly how the bytes are fetched in the host runtime.\n\n[source,pkl]\n----\nresult = read(\"secret:mypassword\") // <1>\n----\n<1> `secret:` is a custom scheme defined by the host runtime.\n\nHowever, CLI users have been left out.\n\nIn Pkl 0.27, a new extension point is added to allow users to implement module and resource readers as external processes.\nWhen run, Pkl will spawn the external process, and talk to the process via xref:bindings-specification:message-passing-api.adoc[message passing].\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0009-external-readers.adoc[SPICE-0009].\n\nThanks to https://github.com/HT154[@HT154] for contributing the feature!\n\n[[import-analysis]]\n=== Import analysis API\n\nA new API has been added to analyze the import graph of Pkl modules (https://github.com/apple/pkl/pull/695[#695]).\n\nThis API comes in four forms:\n\n1. A standard library module: `pkl:analyze`\n2. A CLI command: `pkl analyze imports`\n3. A Java API: `org.pkl.core.Analyzer`\n4. A Gradle API: `org.pkl.gradle.task.AnalyzeImportsTask`\n\nSome use-cases for this API are:\n\n* For build tools to perform out-of-date checks. Build tools can invalidate a cached result if any of the transitive modules have changed.\n* Static code analysis, to determine how Pkl modules depend on each other.\n\nWith this API, xref:pkl-gradle:index.adoc[] now by default <<transitive-modules-computed-by-default,computes the transitive modules>> for many of its tasks.\n\nHere is an example of the CLI in use:\n\n[source,shell]\n----\npkl analyze imports -f json myModule.pkl # <1>\n----\n<1> `-f` means: produce output in JSON.\n\nProduces:\n\n[source,json]\n----\n{\n  \"imports\": {\n    \"file:///my/proj/myModule.pkl\": [\n      {\n        \"uri\": \"projectpackage://example.com/birds@1.0.0#/Bird.pkl\"\n      }\n    ],\n    \"projectpackage://example.com/birds@1.0.0#/Bird.pkl\": []\n  },\n  \"resolvedImports\": {\n    \"file:///my/proj/myModule.pkl\": \"file:///my/proj/myModule.pkl\",\n    \"projectpackage://example.com/birds@1.0.0#/Bird.pkl\": \"file:///my/birds/Bird.pkl\"\n  }\n}\n----\n\nFrom this output, we can see that `myModule.pkl` imports `Bird.pkl` from the `birds` package.\nWe can also see that the module `projectpackage://example.com/birds@1.0.0#/Bird.pkl` resolves to disk location `\\file:///my/birds/Bird.pkl` (we can deduce that `birds` is a xref:language-reference:index.adoc#local-dependencies[local dependency]).\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0001-import-graph-analyzer-api.adoc[SPICE-0001].\n\n== Noteworthy [small]#🎶#\n\nReady when you need them.\n\n=== Colored output\n\nThe Pkl CLI will now emit some messages in color (https://github.com/apple/pkl/pull/552[#552], https://github.com/apple/pkl/pull/746[#746], https://github.com/apple/pkl/pull/771[#771], https://github.com/apple/pkl/pull/779[#779]).\n\nHere is a sneak peek of colored error messages in action.\n\nimage::error_sample.png[syntax highlighted output]\n\nThanks to https://github.com/thomaspurchas[@thomaspurchas] for contributing to this feature!\n\n=== `const local` object members\n\nThe `const` modifier can be applied to object members, provided that they are also `local` (https://github.com/apple/pkl/pull/678[#678]).\n\nCurrently, regular object members are not allowed to have the `const` modifier.\nThis introduces an artificial pain point.\n\nFor example, given the following module:\n\n[source,pkl]\n----\namends \"Bird.pkl\"\n\nimport \"Bird.pkl\"\n\nlocal northAmerica = \"North America\"\n\nlocal typealias NorthAmericanBird = Bird(this.origin == northAmerica) // <1>\n----\n<1> Error: cannot reference `northAmerica` from here because it is not `const`.\n\nThis is invalid code, because this typealias is referencing a non-const value on the enclosing module.\nHowever, is not possible fix this by adding the `const` modifier to `northAmerica`.\nThis is because this module `amends \"Bird.pkl\"`, which means that this module is considered a regular object and not a class.\nThis means that any members declared here are _object members_, and not _class members_.\n\nIn Pkl 0.27, a new rule is introduced to allow the `const` modifier to be applied to object members, provided that they are also `local`.\n\nThis change affects object properties, as well as object methods.\n\nTo read more about this design, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0011-const-object-members.adoc[SPICE-0011].\n\n=== Pkl CLI changes\n\n==== New CLI Flags\n\nSome new common flags have been added to the CLI (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/746[#746]).\n\n|===\n|Flag |Description\n\n|`--color`\n|Format messages with ANSI color codes\n\n|`--external-module-reader`\n|Shell out to a process to read certain modules.\n\n|`--external-resource-reader`\n|Shell out to a process to read certain resources.\n|===\n\n==== New command: `pkl analyze imports`\n\nAs part of the set of APIs added for <<import-analysis,import analysis>>, a new subcommand has been added called `analyze imports` (https://github.com/apple/pkl/pull/695[#695]).\n\nFor details, consult the xref:pkl-cli:index.adoc#command-analyze-imports[CLI documentation].\n\n=== Kotlin/Java code generator improvements\n\nVarious improvements have been made to the Kotlin and Java code generators (https://github.com/apple/pkl/pull/705[#705], https://github.com/apple/pkl/pull/710[#710], https://github.com/apple/pkl/pull/714[#714], https://github.com/apple/pkl/pull/721[#721], https://github.com/apple/pkl/pull/729[#729]).\n\n==== Java codegen improvements\n\n* Only generate `hashCode()`, `equals()`, and `toString()` methods for Java classes that are instantiable.\n* Add support for Spring Boot 3.\n* Make module classes also implement serializable.\n* Make empty Java classes instantiable.\n\n==== Kotlin codegen improvements\n\n* Skip generation of `copy()`, `equals()`, `hashCode()`, `toString()` methods for abstract Kotlin classes.\n* Don't implement `Serializable` for abstract classes\n* Add support for Spring Boot 3.\n\nThanks to https://github.com/translatenix[@translatenix] for contributing these improvements!\n\n=== Gradle Plugin changes\n\n==== New `AnalyzeImportsTask`\n\nA new task called `org.pkl.gradle.task.AnalyzeImportsTask` is introduced (https://github.com/apple/pkl/pull/695[#695]).\n\nThis task is the Gradle analogy to `pkl analyze imports`.\n\nExample:\n\n[tabs]\n====\nbuild.gradle::\n+\n[source,groovy]\n----\npkl {\n  analyzers {\n    imports {\n      appConfig {\n        sourceModules.add(file(\"src/main/resources/appConfig.pkl\"))\n      }\n    }\n  }\n}\n----\n\nbuild.gradle.kts::\n+\n[source,kotlin]\n----\npkl {\n  analyzers {\n    imports {\n      register(\"appConfig\") {\n        sourceModules.add(file(\"src/main/resources/appConfig.pkl\"))\n      }\n    }\n  }\n}\n----\n====\n\nFor more details, consult the xref:pkl-gradle:index.adoc#analyze-imports[documentation].\n\n==== Tracked file outputs\n\nTasks created by the Pkl plugin now declare tracked output files (https://github.com/apple/pkl/pull/403[#403]).\n\nThis means that downstream tasks do not need to declare an explicit dependency on the Pkl task.\n\nFor example, assuming that `evalPkl` is an `EvalTask`:\n\n.build.gradle.kts\n[source,diff]\n----\n val myGradleTask by tasks.registering {\n   inputs.files(evalPkl)\n-  dependsOn(evalPkl) // <1>\n }\n----\n<1> No longer necessary to declare this dependency.\n\n[[transitive-modules-computed-by-default]]\n==== `transitiveModules` computed by default \n\nThe `transitiveModules` property of a task is now computed by building the import graph of the source modules (https://github.com/apple/pkl/pull/695[#695]).\n\nThis means that Pkl-related tasks no longer need to declare their set of transitive modules, because the pkl-gradle plugin will compute this automatically.\n\nNOTE: This adds latency to each task. To opt out of this behavior, set `transitiveModules` explicitly.\n\n=== Standard library changes\n\n==== Additions to `pkl:base`\n\nNew properties and methods have been added to the classes of `pkl:base` (https://github.com/apple/pkl/pull/666[#666], https://github.com/apple/pkl/pull/683[#683]).\n\nNew properties and methods have been added to {uri-stdlib-Listing}[`Listing`] and {uri-stdlib-Mapping}[`Mapping`].\n\nOne of the goals of this change is to improve the experience of authoring constraints.\nThis eliminates the need to convert to collection types as often.\n\nThe added properties and methods are:\n\n* {uri-stdlib-Listing}#first[`Listing.first`]\n* {uri-stdlib-Listing}#firstOrNull[`Listing.firstOrNull`]\n* {uri-stdlib-Listing}#last[`Listing.last`]\n* {uri-stdlib-Listing}#lastOrNull[`Listing.lastOrNull`]\n* {uri-stdlib-Listing}#single[`Listing.single`]\n* {uri-stdlib-Listing}#singleOrNull[`Listing.singleOrNull`]\n* {uri-stdlib-Listing}#every()[`Listing.every()`]\n* {uri-stdlib-Listing}#any()[`Listing.any()`]\n* {uri-stdlib-Listing}#contains()[`Listing.contains()`]\n* {uri-stdlib-Mapping}#containsValue()[`Mapping.containsValue()`]\n* {uri-stdlib-Mapping}#every()[`Mapping.every()`]\n* {uri-stdlib-Mapping}#any()[`Mapping.any()`]\n\nWith this, the following change can be made to existing constraints:\n\n[source,diff]\n----\n-ipAddresses: Listing<String>(toList().contains(\"127.0.0.1\"))\n+ipAddresses: Listing<String>(contains(\"127.0.0.1\"))\n----\n\nAdditionally, a new method is added to `String`, called {uri-stdlib-String}#splitLimit()[`String.splitLimit()`].\n\n==== Additions to `pkl:EvaluatorSettings`\n\nNew properties have been added to `pkl:EvaluatorSettings` (https://github.com/apple/pkl/pull/660[#660], https://github.com/apple/pkl/pull/746[#746]).\n\nThese are:\n\n* {uri-stdlib-evaluatorSettingsModule}/#color[`color`]\n* {uri-stdlib-evaluatorSettingsModule}/#externalModuleReaders[`externalModuleReaders`]\n* {uri-stdlib-evaluatorSettingsModule}/#externalResourceReaders[`externalResourceReaders`]\n\n==== `String` to `Number` conversion improvements.\n\nThe `String` to `Number` converter methods, for example,  {uri-stdlib-StringToInt}[`String.toInt()`], can now handle underscore separators (https://github.com/apple/pkl/pull/578[#578], https://github.com/apple/pkl/pull/580[#580]).\n\nThis better aligns with the source code representation of xref:language-reference:index.adoc#integers[number literals].\n\n[source,pkl]\n----\nmyNum = \"1_000\".toInt() // <1>\n----\n<1> Result: `1000`\n\n==== New module: `pkl:analyze`\n\nAs part of <<import-analysis>>, a new standard library module is added called `pkl:analyze` (https://github.com/apple/pkl/pull/695[#695]).\n\nThis module provides an API for computing the total import graph given a set of input modules.\nThis API treats the inputs as entrypoints, and produces a graph representing the entire dependency tree, including transitive imports.\n\nExample:\n[source,pkl]\n----\nimport \"pkl:analyze\"\n\nimportGraph: analyze.ImportGraph = analyze.importGraph(Set(\"file:///path/to/my/module.pkl\"))\n----\n\nFor details, see the {uri-stdlib-analyzeModule}[documentation].\n\n=== Annotations on `PklProject` added to packages\n\nWhen creating packages, some annotations on a `PklProject` will affect how pkldoc generates documentation.\n\n* `@Unlisted`: Omit the package from publishing documentation.\n* `@Deprecated`: Add information on the package to show that it is deprecated. \n\nExample:\n\n.PklProject\n[source,pkl]\n----\n@Deprecated\namends \"pkl:Project\"\n----\n\n=== Test report improvements\n\nThe report generated from `pkl test` has been overhauled and improved (https://github.com/apple/pkl/pull/498[#498], https://github.com/apple/pkl/pull/628[#682], https://github.com/apple/pkl/pull/738[#738], https://github.com/apple/pkl/pull/771[#771]).\n\n* Tests are grouped into either the `facts` or `examples` section.\n* A summary line is added, describing how many tests have passed and failed, and how many assertions have passed and failed.\n* Test results are colored.\n* The ✅ and ❌ emojis are replaced with ✔ and ✘.\n* Thrown errors are reported within the test.\n\nHere is a sneak peek of the new test result output.\n\nimage::test_sample.png[]\n\nThanks to https://github.com/jjmaestro[@jjmaestro] for contributing to this improvement!\n\n=== Java API additions\n\n==== New API: `org.pkl.core.Analyzer`\n\nAs part of <<import-analysis>>, a new Java API called `org.pkl.core.Analyzer` is introduced (https://github.com/apple/pkl/pull/695[#695]).\n\n==== New methods\n\nThe following methods are added:\n\n**pkl-executor**\n\n* `org.pkl.executor.ExecutorException.getPklVersion`\n* `org.pkl.executor.ExecutorException.ExecutorException(java.lang.String, java.lang.Throwable, java.lang.String)`\n\n**pkl-core**\n\n* `org.pkl.core.module.ModuleKeyFactories.externalProcess(java.lang.String, org.pkl.core.externalreader.ExternalReaderProcess)`\n* `org.pkl.core.module.ModuleKeyFactories.externalProcess(java.lang.String, org.pkl.core.externalreader.ExternalReaderProcess, long)`\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n=== Java API breaking changes\n\nThe following Java APIs have breaking changes:\n\n|===\n|Class/method | Breaking change\n\n|`org.pkl.core.runtime.TestResults`\n|Moved to `org.pkl.core.TestResults`, turned into a record, and largely restructured.\n\n|`org.pkl.core.module.ModuleKeyFactories.closeQuietly`\n|Deprecated for removal in favor of `org.pkl.core.Closeables.closeQuietly`.\n|===\n\n=== Spring Boot 2 support dropped\n\nThe Java code generator no longer supports Spring Boot 2.x (https://github.com/apple/pkl/pull/729[#729]).\n\nSpring Boot 2 users can continue to use the Pkl 0.26 code generator.\n\n=== `pkl test` considered failing when writing examples\n\nIf running `pkl test` results in `pkl-expected.pcf` files being written, the test now exits with exit code `10` (https://github.com/apple/pkl/pull/738[#738]).\n\nAdditionally, the junit reports will consider the test as failing.\n\n=== `Listing` and `Mapping` typecheck changes\n\nDue to changes to <<typecheck-improvements,Listing and Mapping typechecking>>, some previously failing programs now succeed.\nThis can happen when erroneous code is never evaluated because it does not affect program output:\n\n[source,pkl]\n----\nlocal myNumbers: Listing<Int> = new { 1; 2; \"uh oh\" } \nresult = myNumbers[0] // <1>\n----\n<1> In Pkl 0.26 and below, throws a type mismatch error.\n+\nIn Pkl 0.27, yields `1`.\n\n== Miscellaneous [small]#🐸#\n\n* Make pkl-doc top box include a preview of the rest of module-level documentation (https://github.com/apple/pkl/pull/570[#570]).\n* Module `pkl-core` now has a dependency on `org.msgpack:msgpack-core` (https://github.com/apple/pkl/pull/660[#660]). Users concerned about potential version conflicts can use one of Pkl's shaded fat JARs (`pkl-config-java-all`, `pkl-tools`).\n* Make PklProject.deps.json files end in a newline (https://github.com/apple/pkl/pull/664[#644]).\n* Fix invalid syntax of code examples in stdlib doc comments (https://github.com/apple/pkl/pull/703[#703]).\n* Update Java dependencies (https://github.com/apple/pkl/pull/689[#689], https://github.com/apple/pkl/pull/767[#767]).\n* Add jbang catalog support (https://github.com/apple/pkl/pull/655[#655]).\n* Documentation improvements (https://github.com/apple/pkl/pull/623[#623], https://github.com/apple/pkl/pull/680[#680], https://github.com/apple/pkl/pull/682[#682], https://github.com/apple/pkl/pull/685[#685], https://github.com/apple/pkl/pull/687[#687], https://github.com/apple/pkl/pull/703[#703], https://github.com/apple/pkl/pull/704[#704], https://github.com/apple/pkl/pull/715[#715], https://github.com/apple/pkl/pull/730[#730], https://github.com/apple/pkl/pull/753[#753]).\n\n== Bug Fixes [small]#🐜#\n\nThe following bugs have been fixed.\n\n* CLI `--property` flags containing `=` in property values are not parsed correctly (https://github.com/apple/pkl/issues/630[#630]).\n* Thrown `PklBugException` when reading assets from a local project dependency (https://github.com/apple/pkl/issues/641[#641]).\n* Thrown `PklBugException` when PklProjects have a cyclical local dependency (https://github.com/apple/pkl/pull/731[#731]).\n* Thrown exception when sending `ReadResourceResponse` or `ReadModuleResponse` where both `contents` and `error` are `null` (https://github.com/apple/pkl/pull/657[#657]).\n* Double unary minus is evaluated as single unary minus (https://github.com/apple/pkl/pull/697[#697]).\n* Kotlin compiler fails to compiler generated classes with \"copy overrides nothing\" for subclasses of abstract classes (https://github.com/apple/pkl/issues/569[#569]).\n* \"Unexpected error\" thrown when `Module.output` has its type overridden (https://github.com/apple/pkl/issues/709[#709]).\n* \"Unexpected error\" thrown when loading files with non-ASCII characters (https://github.com/apple/pkl/issues/653[#653]).\n* Type parameters in `new Mapping<TypeA, TypeB>`/`new Listing <Type>` are not checked (https://github.com/apple/pkl/issues/405[#405]).\n* Comparison methods of `pkl:semver` are incorrect (https://github.com/apple/pkl/issues/772[#772]).\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* https://github.com/djarnis73[@djarnis73]\n* https://github.com/kasugamirai[@kasugamirai]\n* https://github.com/KushalP[@KushalP]\n* https://github.com/jjmaestro[@jjmaestro]\n* https://github.com/HT154[@HT154]\n* https://github.com/lamtrinhdev[@lamtrinhdev]\n* https://github.com/ManuW[@ManuW]\n* https://github.com/maxandersen[@maxandersen]\n* https://github.com/netvl[@netvl]\n* https://github.com/StefMa[@StefMa]\n* https://github.com/taichi-ishitani[@taichi-ishitani]\n* https://github.com/thomaspurchas[@thomaspurchas]\n* https://github.com/translatenix[@translatenix]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.28.adoc",
    "content": "= Pkl 0.28 Release Notes\n:version: 0.28\n:version-minor: 0.28.2\n:release-date: February 26th, 2025\n\ninclude::ROOT:partial$component-attributes.adoc[]\n\n:uri-snippet-tests: {uri-github-tree}/pkl-core/src/test/files/LanguageSnippetTests/input\n:uri-standard-library: {uri-github-tree}/stdlib/\n:uri-antlr: https://www.antlr.org\n:wbr: pass:[<wbr />]\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThe next release (0.29) is scheduled for June 2025.\nTo see what's coming in the future, follow the {uri-pkl-roadmap}[Pkl Roadmap].\n\nPlease send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +\n\n[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].\nTo get started, follow xref:pkl-cli:index.adoc#installation[Installation].#\n\n== Highlights [small]#💖#\n\nNews you don't want to miss.\n\n=== New parser\n\nPkl has new parser (https://github.com/apple/pkl/pull/917[#917], https://github.com/apple/pkl/pull/957[#957], https://github.com/apple/pkl/pull/962[#962])!\n\nThe first step to evaluating a program is to parse its source code into a parse tree.\nCurrently, Pkl uses link:{uri-antlr}[ANTLR] to generate parser code from grammar files.\n\nUsing this approach has allowed for rapidly iterating and changing the language's grammar.\nHowever, Pkl's grammar has matured; it's not as likely that the grammar will change from one version to the next.\nAdditionally, the current parser's performance has become more painful as projects written in Pkl grow in size.\nIn many cases, parsing can take up most of the time spent during evaluation.\n\nIn 0.28, the ANTLR-generated parser is being replaced by a handwritten parser.\nIn benchmarking tests, this has shown to improve parsing speed by around two orders of magnitude.\nHere are some quick comparisons between the two parsers, run on a MacBook Pro M4 Max machine, with 5 warmup iterations, and run for 10 iterations:\n\n|===\n||Old parser |New parser\n\n|link:{uri-snippet-tests}[Language snippet tests]\n|440.8ms\n|5.9ms\n\n|link:{uri-standard-library}[Standard library]\n|136.7msfootnote:[In the `pkl` CLI, the standard library is parsed during compilation rather than during evaluation. As a result, there is no parsing overhead.]\n|0.8ms\n\n|All https://github.com/apple/pkl-pantry[pkl-pantry] modules\n|1424.2ms\n|7.0ms\n|===\n\n== Noteworthy [small]#🎶#\n\nReady when you need them.\n\n=== CLI improvements\n\n==== Colored help messages\n\nThe `pkl`, `pkldoc`, `pkl-codegen-java`, and `pkl-codegen-kotlin` CLIs now emits help text with colors (https://github.com/apple/pkl/pull/947[#947]).\n\nHere is a sneak peek:\n\nimage::pkl-cli-help-new.png[new pkl cli help output]\n\nThanks to https://github.com/gordonbondon[@gordonbondon] for their contribution!\n\n==== `jpkl` support on Windows\n\nThe `jpkl` executable is now supported on Windows (https://github.com/apple/pkl/pull/872[#872]).\n\n`jpkl` is a fat jar that can be executed directly when on macOS and Linux, but current users of Windows are required to execute it with `java -jar <path/to/jpkl>`.\n\nIn 0.28, Windows users can also call execute this command directly.\nTo do so, the filename should be called `jpkl.bat`, and placed in `PATH`.\n\n=== Type constraint changes\n\nType annotations that are executed as a result of calling a constraint expressions now perform an eager typecheck (https://github.com/apple/pkl/pull/964[#964]).\n\nIn Pkl 0.27, we changed how xref:0.27.adoc#typecheck-improvements[typechecks are executed for `Listing` and `Mapping`] types.\n\nHowever, this had two unintended side effects:\n\nFor one, error messages from certain failing constraints show `?` in place of values that are failing.\n\nThe following snippet:\n\n[source%parsed,pkl]\n----\nclass Bird { name: String }\n\nbird: Listing<Bird>(firstOneIsQuail) = new {\n  new { name = \"Pigeon\" }\n  new { name = \"Quail\" }\n}\n\nlocal firstOneIsQuail = (it: Listing<Bird>) -> it[0].name == \"Quail\"\n----\n\nProduces the following error message:\n\n[source]\n----\n–– Pkl Error ––\nType constraint `firstOneIsQuail` violated.\nValue: new Listing { ?; ? }\n\n3 | bird: Listing<Bird>(firstOneIsQuail) = new {\n                        ^^^^^^^^^^^^^^^\n----\n\n:fn-typecheck-details: footnote:[See https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0010-overhauled-mapping-listing-typechecks.adoc#delegating-objects[delegating objects] in SPICE-0010 for more details on this behavior.]\n\nThis is happening because lazy typechecks of mappings and listings will return a _new_ listing. Because the lambda's argument is defined as ``it: Listing<Bird>``, the value being passed into the function body is this new listing{fn-typecheck-details}.\n\nSecondly, some constraints became less strict, allowing more values to pass.\n\nThe following snippet fails in Pkl 0.26, but passes in Pkl 0.27:\n\n[source%parsed,pkl]\n----\nclass Bird { name: String }\n\nlocal nonEmpty = (it: Listing<Bird>) -> !it.isEmpty\n\nbirds: Listing(nonEmpty) = new { 1; 2; 3 }\n----\n\nThis is because the function parameter `it: Listing<Bird>` does not actually check members of the argument until they are accessed, and the function body `!it.isEmpty` does not access any members.\n\nTo address both of these issues, the rule for executing type constraints has changed.\nWhen executing a type annotation, mapping and listing typechecks are always _eager_.\nThis means that Pkl will check that each member of the mapping/listing conforms to the type parameter.\n\n=== Java 22+ support\n\nPkl's Java libraries now support Java 22 and higher (https://github.com/apple/pkl/pull/876[#876]).\n\nThanks to https://github.com/sgammon[@sgammon] for their contribution!\n\n=== New standard library method\n\nThe `pkl:math` standard library module has a new method, called {uri-stdlib-mathModule}/index.html#atan2()[atan2] (https://github.com/apple/pkl/pull/819[#819]).\nIt computes the https://en.wikipedia.org/wiki/Atan2[2-argument arctangent].\n\nThanks to https://github.com/gordonbondon[@gordonbondon] for their contribution!\n\n=== Overhauled for-generator implementation\n\nThe implementation of xref:language-reference:index.adoc#for-generators[for-generators] has been overhauled (https://github.com/apple/pkl/pull/844[#844]).\n\nThis fixes some known bugs with the current for-generator implementation, and also improves code health by reducing complexity and removing workarounds and band-aids.\n\nThanks to https://github.com/odenix[@odenix] for their contribution!\n\n=== Java code generator improvements\n\nImprovements have been made to the Java code generator (https://github.com/apple/pkl/pull/792[#792]).\n\nIn pkl-codegen-java, the `--params-annotation` flag now accepts `none` as a value, which causes the code generator to skip adding annotations to a constructor's parameters.\nAdditionally, the Kotlin API `org.pkl.codegen.java.JavaCodeGeneratorOptions.paramsAnnotation` is now nullable.\nIf null, this also skips adding annotations.\n\nBy default, this annotation is set to `org.pkl.config.java.mapper.Named`, or none if the `--generate-spring-boot-config` flag is set.\n\nThis is useful for those compiling Java code with the `-parameters` flag set, because the pkl-config-java library is able to map into these classes without any extra annotations.\n\nThanks to https://github.com/odenix[@odenix] for their contribution!\n\n=== Kotlin code generator improvements\n\nImprovements have been made to the Kotlin code generator (https://github.com/apple/pkl/pull/793[#793]).\n\nCurrently, the output of `toString()` on a generated Kotlin class differs depending on if it was generated as a data class or as a regular class.\n\nIn Pkl 0.28, this method produces the same format, and matches the format used by data classes.\n\nThanks to https://github.com/odenix[@odenix] for their contribution!\n\n=== pkldoc improvements\n\npkldoc has a new flag to write real files instead of symlinks (https://github.com/apple/pkl/pull/824[#824]).\n\nCurrently, pkldoc creates a symlink called \"current\", which points to the latest non-prerelease version of a package.\nHowever, these symlinks can be problematic for some systems.\n\nA new flag, `--no-symlinks`, and a similarly named Gradle property, `noSymlinks`, instructs pkldoc to write real files instead of symlinks. \n\nThanks to https://github.com/netvl[@netvl] for their contributions!\n\n=== `jar:nested:` URIs are accepted by default\n\nTo improve integration with Spring Boot, the Pkl evaluator by default now accepts module URIs starting with `jar:nested:` (https://github.com/apple/pkl/pull/895[#895]).\n\nThe `--allowed-modules` flag (and the equally named option in other APIs) can be used to configure the set of allowed modules.\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n=== Stricter grammar\n\nAs a result of implementing a new parser, the following previously accepted grammar is no longer valid (https://github.com/apple/pkl/pull/917[#917]).\n\n==== Inline object entries\n\nWhen declaring multiple xref:language-tutorial:01_basic_config.adoc#entries[entries] on the same line, a semicolon is now required to separate them.\n\nThe following code snippet is currently valid, and becomes a syntax error in 0.28.\n\n[source,pkl]\n----\nobj { [\"one\"] = 1 [\"two\"] = 2 }\n----\n\nTo fix, insert a semicolon between the two entries:\n\n[source,diff]\n----\n-obj { [\"one\"] = 1 [\"two\"] = 2 }\n+obj { [\"one\"] = 1; [\"two\"] = 2 }\n----\n\n==== String escapes\n\nWhen using xref:language-reference:index.adoc#custom-string-delimiters[custom string delimiters], the escape sequence becomes backslash (`\\`) plus the number of pounds used to delimit the string.\n\nDue to a parser bug, any extra pounds after this escape sequence are also permitted.\n\nIn Pkl 0.28, this becomes a syntax error.\n\n[source,pkl]\n----\nfoo = \"foo \\#(bar)\" // Invalid character escape sequence `\\#`.\n----\n\n==== Whitespace between generator members\n\nInline object spreads, for generators, and when generators all now require either whitespace or a semicolon separator.\n\n[source,pkl]\n----\nfoo { ...bar...baz } // Syntax error\n----\n\n=== Minimum Gradle version bump\n\nThe minimum Gradle version for the xref:main:pkl-gradle:index.adoc[Gradle Plugin] has been bumped to 8.2 (https://github.com/apple/pkl/pull/901[#901]).\n\n=== Minimum Kotlin version bump\n\nFor users of Pkl's Kotlin libraries, the minimum Kotlin version has been bumped to 2.0 (https://github.com/apple/pkl/pull/900[#900]).\n\n=== Java/Kotlin API breaking changes\n\nBreaking changes have been made to the Java/Kotlin APIs (https://github.com/apple/pkl/pull/748[#748], https://github.com/apple/pkl/pull/749[#749], https://github.com/apple/pkl/pull/776[#776], https://github.com/apple/pkl/pull/793[#793], https://github.com/apple/pkl/pull/808[#808], https://github.com/apple/pkl/pull/810[#810]).\n\n|===\n|API |Breakage\n\n| org.pkl.core.resource{wbr}.Resource \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.project{wbr}.Package \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.Member{wbr}.SourceLocation \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core{wbr}.Release \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.Release{wbr}.SourceCode \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.Release{wbr}.Documentation \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.Release{wbr}.StandardLibrary \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.project{wbr}.DeclaredDependencies \n| Converted into a record; previous getter methods are deprecated.\n\n| org.pkl.core.evaluatorSettings{wbr}.PklEvaluatorSettings{wbr}.Proxy{wbr}.create \n| Deprecated; use the constructor instead.\n\n| org.pkl.core.module{wbr}.ExternalModuleResolver \n| Moved into package org.pkl.core.externalreader\n\n| org.pkl.core.resource{wbr}.ExternalResourceResolver \n| Moved into package org.pkl.core.externalreader\n\n| org.pkl.core.messaging{wbr}.MessageTransportModuleResolver \n| Renamed to ExternalModuleResolverImpl, made package-private\n\n| org.pkl.core.messaging{wbr}.MessageTransportResourceResolver \n| Renamed to ExternalResourceResolverImpl, made package-private\n\n| org.pkl.core.module{wbr}.ExternalModuleResolver{wbr}.Spec \n| Replaced with record org.pkl.core.externalreader.ModuleReaderSpec\n\n| org.pkl.core.resource{wbr}.ExternalResourceResolver{wbr}.Spec \n| Replaced with record org.pkl.core.externalreader.ResourceReaderSpec\n\n| org.pkl.core.messaging{wbr}.CreateEvaluatorRequest \n| Changed properties `allowedModules` and `allowedResources` to be of type `List<String>` instead of `List<Pattern>`\n\n| org.pkl.codegen.kotlin{wbr}.KotlinCodegenOptions\n| Renamed to org.pkl.codegen.kotlin.KotlinCodeGeneratorOptions\n\n| org.pkl.codegen.kotlin{wbr}.CliKotlinCodeGeneratorOptions{wbr}.toKotlinCodegenOptions\n| Deprecated without replacement\n\n| org.pkl.codegen.java{wbr}.JavaCodegenOptions\n| Renamed to org.pkl.codegen.java.JavaCodeGeneratorOptions\n\n| org.pkl.codegen.java{wbr}.CliJavaCodeGeneratorOptions{wbr}.toJavaCodegenOptions()\n| Deprecated without replacement \n|===\n\n=== Fat jars no longer shade Truffle\n\nPkl publishes two fat jars to Maven Central: https://central.sonatype.com/artifact/org.pkl-lang/pkl-tools[pkl-tools], and https://central.sonatype.com/artifact/org.pkl-lang/pkl-config-java-all[pkl-config-java-all].\n\nDue a version bump in the Truffle library, the package `com.oracle.truffle` can no longer be shaded.\n\nFor users that use both Pkl and other Truffle languages, this means that their version of Truffle should match Pkl's version.\n\n== Miscellaneous [small]#🐸#\n\n* Documentation improvements (https://github.com/apple/pkl/pull/792[#792], https://github.com/apple/pkl/pull/846[#846], https://github.com/apple/pkl/pull/860[#860], https://github.com/apple/pkl/pull/892[#892], https://github.com/apple/pkl/pull/921[#921], https://github.com/apple/pkl/pull/937[#937], https://github.com/apple/pkl/pull/943[#943], https://github.com/apple/pkl/pull/944[#944], https://github.com/apple/pkl/pull/955[#955], https://github.com/apple/pkl/pull/956[#956], https://github.com/apple/pkl/pull/973[#973]).\n* The repository now requires Java 21 or higher to build (https://github.com/apple/pkl/pull/876[#876]).\n* Enable multi-jdk testing via `-DmultiJdkTesting=true` flag when building Pkl (https://github.com/apple/pkl/pull/876[#876]).\n* Allow setting commit id via `-DcommitId` flag when building Pkl (https://github.com/apple/pkl/pull/954[#954]).\n\n== Bugs fixed [small]#🐜#\n\nThe following bugs have been fixed.\n\n[smaller]\n* Optimization: `const` members should be cached for all children in the prototype chain (https://github.com/apple/pkl/issues/508[#508])\n* codegen-kotlin: Use same toString() representation for data classes and regular classes (https://github.com/apple/pkl/issues/717[#717])\n* Late-bound values of iteratees within nested for/spread fail to resolve for-generator variables (https://github.com/apple/pkl/issues/741[#741])\n* codegen-java/kotlin: Fix generation of equals/hashCode methods (https://github.com/apple/pkl/pull/802[#802]) \n* Not possible to render mapping with Int keys in YAML (https://github.com/apple/pkl/issues/878[#878])\n* Parser accepts wrong string escapes (https://github.com/apple/pkl/issues/888[#888])\n* Downstream native-image embedders are broken (https://github.com/apple/pkl/issues/907[#907])\n* Failed type constraint error messages do not show forced members (https://github.com/apple/pkl/issues/918[#918])\n* ANTLR incompatibilities (https://github.com/apple/pkl/issues/927[#927])\n* Doc comments with interleaving comments result in an error (https://github.com/apple/pkl/issues/931[#931])\n* Spread elements inside an object body don't need separators (https://github.com/apple/pkl/issues/932[#932])\n* Correctly set allowed modules/resoures when external reader scheme contain regex control characters (https://github.com/apple/pkl/pull/941[#941])\n* Bad import analysis fails with \"None (cause has no message)\" (https://github.com/apple/pkl/issues/949[#949])\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* https://github.com/gordonbondon[@gordonbondon]\n* https://github.com/HT154[@HT154]\n* https://github.com/jsoref[@jsoref]\n* https://github.com/KushalP[@KushalP]\n* https://github.com/netvl[@netvl]\n* https://github.com/odenix[@odenix]\n* https://github.com/romacafe[@romacafe]\n* https://github.com/sgammon[@sgammon]\n* https://github.com/sorcix[@sorcix]\n* https://github.com/stanleyycheung[@stanleyycheung]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.29.adoc",
    "content": "= Pkl 0.29 Release Notes\n:version: 0.29\n:version-minor: 0.29.1\n:release-date: July 24th, 2025\n\ninclude::ROOT:partial$component-attributes.adoc[]\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThis release brings support for working with binary data, and also a new setting to control HTTP rewriting.\n\nThe next release (0.30) is scheduled for October 2025.\nTo see what's coming in the future, follow the {uri-pkl-roadmap}[Pkl Roadmap].\n\nPlease send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +\n\n[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].\nTo get started, follow xref:pkl-cli:index.adoc#installation[Installation].#\n\n== Highlights [small]#💖#\n\n[[bytes-standard-library-class]]\n=== `Bytes` standard library class\n\nA new standard library class is introduced, called `Bytes` (https://github.com/apple/pkl/pull/1019[#1019]).\n\nCurrently, Pkl does not have a built-in way to describe binary data.\nIn situations where binary data is needed, the common pattern is to use a Base64 string.\nThis is sufficient in simple cases, but still introduces many shortcomings:\n\n1. `pkl eval` can only produce UTF-8 encoded strings.\n2. It is not possible to compute the checksum of binary content (except in the case of `read()`).\n3. It is hard to interop with configuration formats that allow binary data.\n4. It is hard to do transformations on binary data.\n\nTo address these shortcomings, the `Bytes` class is introduced.\nThis is a data type representing a sequence of bytes.\n\n[source,pkl]\n----\nmyBytes = Bytes(0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21) // <1>\n----\n<1> ASCII bytes for the string \"Hello, World!\"\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0013-bytes-standard-library.adoc[SPICE-0013].\n\n==== Emitting binary output\n\nA new property called `bytes` is added to `FileOutput`.\nThe CLI has been changed to evaluate this property, and write its contents to the designated output location.\n\nThis change means that Pkl modules can now output binary content.\nFor example, here is a simple module that outputs bytes:\n\n[source,pkl]\n----\noutput {\n  bytes = Bytes(1, 2, 3, 4) // <1>\n}\n----\n<1> Write bytes 1, 2, 3, 4\n\nThe same change applies when evaluating in multiple-file output mode.\n\n[source,pkl]\n----\noutput {\n  files {\n    [\"foo.bin\"] {\n      bytes = Bytes(1, 2, 3, 4) // <1>\n    }\n  }\n}\n----\n<1> Write bytes 1, 2, 3, 4 to a file called `foo.bin`.\n\n==== Rendering `Bytes`\n\nOut of the box, only the `plist` and `pcf` formats are able to render `Bytes`.\nFor other formats, a renderer needs to be defined.\n\n[source,pkl]\n----\noutput {\n  renderer = new JsonRenderer {\n    [Bytes] = (it) -> it.base64 // <1>\n  }\n}\n----\n<1> Render bytes as a base64 string in JSON.\n\n==== Using `Bytes` from language bindings\n\nUsers of Pkl's language bindings also benefit from the new type.\nWhen using code generation, the `Bytes` data type will turn into the following types:\n\n|===\n|Language |Type\n\n|Java\n|`byte[]`\n\n|Kotlin\n|`ByteArray`\n\n|Go\n|`[]byte`\n\n|Swift\n|`[UInt8]`\n|===\n\nMaintainers of other language bindings are encouraged to map `Bytes` into the corresponding binary type in their language.\n\n==== `Bytes` versus `List<UInt8>`\n\nConceptually, `Bytes` is very similar to `List<UInt8>`, because both are data types that describe sequences of `UInt8` values.\nHowever, they have different performance characteristics.\nA `List` is a https://en.wikipedia.org/wiki/Persistent_data_structure[persistent data structure].\nThis means that creating modified copies of lists is very cheap.\n\nHowever, lists have more overhead per element.\nA `List<UInt8>` with 1000 elements takes up about 5.4 kilobytes of heap space, whereas the same data in `Bytes` takes roughly 1 kilobyte.\n\n=== HTTP Rewrites and Package Mirroring\n\nA new evaluator setting is introduced, which rewrites URLs before making outbound HTTP calls (https://github.com/apple/pkl/pull/1062[#1062], https://github.com/apple/pkl/pull/1127[#1127], https://github.com/apple/pkl/pull/1133[#1133]).\n\nThis setting can be configured via CLI flag `--http-rewrite`, and also in other ways:\n\n* A builder option in `org.pkl.core.EvaluatorBuilder`\n* A builder option in `org.pkl.executor.ExecutorOptions`\n* A new property in `CreateEvaluatorRequest` in the Message Passing API\n* A new property in the Gradle plugin\n* A new property in `pkl.EvaluatorSettings#Http`\n\nThe main use-case for this setting is to enable package mirroring.\nFor example, let's assume that the following mirrors exist:\n\n|===\n|Original |Mirror\n\n|\\https://pkg.pkl-lang.org\n|\\https://my.internal.mirror/pkg-pkl-lang\n\n|\\https://github.com\n|\\https://my.internal.mirror/github\n|===\n\nA user of the CLI can use these mirrors with the following settings.\n\n.~/.pkl/settings.pkl\n[source,pkl]\n----\namends \"pkl:settings\"\n\nhttp {\n  rewrites {\n    [\"https://pkg.pkl-lang.org/\"] = \"https://my.internal.mirror/pkg-pkl-lang/\"\n    [\"https://github.com/\"] = \"https://my.internal.mirror/github/\"\n  }\n}\n----\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0016-http-rewrites.adoc[SPICE-0016].\n\n== Noteworthy [small]#🎶#\n\nReady when you need them.\n\n=== pkldoc, pkl-codegen-java, pkl-codegen-kotlin executables\n\nThe pkldoc, pkl-config-java and pkl-config-kotlin CLIs are published as their own executables (https://github.com/apple/pkl/pull/1023[#1023]).\n\nCurrently, these tools have excellent support when called from within the pkl-gradle plugin.\nHowever, the story for using these as CLIs is much clunkier.\nUsers must call Java by including their published `.jar` files, as well as all of their dependencies via the `-classpath` argument.\n\nIn 0.29, they are all being published as executables.\nIn particular, pkldoc is being published as both a Java executable and a native executable.\nOn the other hand, pkl-codegen-java and pkl-codegen-kotlin are published as Java executables only.\n\nFor more information, see their download instructions:\n\n* xref:pkl-doc:index.adoc#install-cli[pkldoc]\n* xref:java-binding:codegen.adoc#install-cli[pkl-codegen-java]\n* xref:kotlin-binding:codegen.adoc#install-cli[pkl-codegen-kotlin]\n\n=== Java API changes\n\n==== Resource Readers SPI added to preconfigured evaluators\n\nA change was made to the preconfigured evaluators (https://github.com/apple/pkl/pull/1094[#1094]).\n\nCurrently, they add module key factories from service providers, but not resource readers.\n\nThis means that users of pkl-spring, for example, cannot add custom resource readers.\nThis is also inconsistent (in the preconfigured evaluator, import can use custom schemes, but not read).\n\nIn Pkl 0.29, any resource reader registered via the Service Provider Interface will be added to the preconfigured evalutors.\n\n==== New methods\n\nNew methods are introduced to the Java API.\n\n* `org.pkl.core.Evaluator.evaluateOutputBytes`\n* `org.pkl.core.http.HttpClient.Builder.setRewrites`\n* `org.pkl.core.http.HttpClient.Builder.addRewrite`\n* `org.pkl.executor.ExecutorOptions.httpRewrites`\n* `org.pkl.config.java.ConfigEvaluatorBuilder.getHttpClient`\n* `org.pkl.config.java.ConfigEvaluatorBuilder.setHttpClient`\n\n=== Standard Library changes\n\nNew properties, methods, classes and typealiases have been added to the standard library (https://github.com/apple/pkl/pull/1019[#1019], https://github.com/apple/pkl/pull/1053[#1053], https://github.com/apple/pkl/pull/1063[#1063], https://github.com/apple/pkl/pull/1144[#1144]).\n\n==== Additions to `pkl:base`\n\n* {uri-stdlib-String}#isBase64[`String.isBase64`]\n* {uri-stdlib-String}#base64DecodedBytes[`String.base64DecodedBytes`]\n* {uri-stdlib-String}#encodeToBytes()[`String.encodeToBytes()`]\n* {uri-stdlib-List}#mapNonNullIndexed()[`List.mapNonNullIndexed()`]\n* {uri-stdlib-List}#toBytes()[`List.toBytes()`]\n* {uri-stdlib-Set}#mapNonNullIndexed()[`Set.mapNonNullIndexed()`]\n* {uri-stdlib-FileOutput}#bytes[`FileOutput.bytes`]\n* {uri-stdlib-Resource}#bytes[`Resource.bytes`]\n* {uri-stdlib-Mapping}#getOrDefault()[`Mapping.getOrDefault()`]\n* {uri-stdlib-Listing}#getOrDefault()[`Listing.getOrDefault()`]\n* {uri-stdlib-baseModule}#Charset[`Charset`]\n* {uri-stdlib-Bytes}[`Bytes`]\n\n==== Additions to `pkl:EvaluatorSettings`\n\n* {uri-stdlib-evaluatorSettingsHttpClass}#rewrites[`Http.rewrites`]\n\n==== Additions to `pkl:reflect`\n\n* {uri-stdlib-reflectModule}#bytesType[`bytesType`]\n\n=== `pkl` CLI changes\n\nNew features are added to the `pkl` CLI (https://github.com/apple/pkl/pull/1052[#1052], https://github.com/apple/pkl/pull/1056[#1056]).\n\n==== Aggregated JUnit reports\n\nA new set of CLI flags are introduced: `--junit-aggregate-reports`, and `--junit-aggregate-suite-name`.\nCollectively, these flags tell Pkl to combine the JUnit reports into a single file, instead of creating a file per Pkl module.\n\nThanks to https://github.com/gordonbondon[@gordonbondon] for contributing to this feature!\n\n==== shell-completion subcommand\n\nA new subcommand called `shell-completion` has been added to the Pkl CLI.\n\nThis command produces autocompletion scripts for a given shell.\n\nThe following example installs shell completions for https://fishshell.com[fish shell]:\n\n[source,shellscript]\n----\npkl shell-completion fish > \"~/.config/fish/completions/pkl.fish\"\n----\n\nThanks to https://github.com/gordonbondon[@gordonbondon] for contributing to this feature!\n\n=== `@Generated` annotation for Java/Kotlin codegen\n\nClasses generated by the Java and Kotlin code generator can optionally receive new annotation called `Generated` (https://github.com/apple/pkl/pull/1075[#1075], https://github.com/apple/pkl/pull/1115[#1115]).\n\nThis behavior is toggled with the `--generated-annotation` CLI flag, or the similarly named Gradle property.\n\nWhen enabled, classes are annotated with `org.pkl.config.java.Generated`.\n\nThis allows users of JaCoCo to exclude Pkl-generated classes from coverage reports.\n\nThanks to https://github.com/arouel[@arouel] for their contributions here!\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n=== Standard library deprecations\n\nThe following methods have been deprecated in the standard library:\n\n|===\n|Method name |Details\n\n|`Resource.md5`\n|Replaced with `Resource.bytes.md5`\n\n|`Resource.sha1`\n|Replaced with `Resource.bytes.sha1`\n\n|`Resource.sha256`\n|Replaced with `Resource.bytes.sha256`\n\n|`Resource.sha256Int`\n|Replaced with `Resource.bytes.sha256Int`\n|===\n\n=== Grammar changes\n\nNew rules have been introduced to the parser (https://github.com/apple/pkl/pull/1022[#1022], https://github.com/apple/pkl/pull/1126[#1126]).\n\n==== Block comment nesting is removed\n\nCurrently, block comments can be nested.\nFor example, the comment `/* /* my comment */ */` is two block comments; one outer comment and one inner comment.\n\nHowever, this has some drawbacks.\n\n1. Block comments can be possibly be closed incorrectly, like `/* /* my comment */`. However, this is a valid block comment in most languages.\n2. Pkl's syntax highlighters do not support block comment nesting, leading to highlighting that is inconsistent with Pkl's parser.\n\nTo improve user experience, block comment nesting is removed.\nAs a result, block comments are always terminated upon the first `*/`.\n\n==== Shebang line can only appear at the start of a file\n\nThe grammar around shebang comments has been made stricter. \n\nPkl files allow for a https://en.wikipedia.org/wiki/Shebang_(Unix)[shebang comment].\nCurrently, this comment can appear anywhere in a file.\nIn 0.29, this comment must appear at the start of a file.\n\n=== Opaque `file:` URIs are invalid\n\nA new rule is introduced to treat opaque `file:` URIs as errors (https://github.com/apple/pkl/pull/1087[#1087]).\n\nOpaque file URIs are URIs whose scheme-specific part does not start with `/`.\nFor example, `file:foo/bar.txt` is an opaque URI.\n\nCurrently, this has the unintentional behavior of: look for file `foo/bar.txt` from the process working directory.\nThese are effectively dynamics imports; from a single import, we can't statically determine what file is actually being imported.\n\nAccording to https://datatracker.ietf.org/doc/html/rfc8089#section-2[RFC-8089], `file` URIs must have paths that start with /.\nSo, these are actually not valid URIs.\n\nIn Pkl 0.29, it is an error to load a module or resource with an opaque `file:` URI.\n\nNOTE: To import or read a relative path, omit `file:` from the import string. For example, `import(\"foo/bar.txt\")` instead of `import(\"file:foo/bar.txt\")`.\n\n[[new-base-module-names]]\n=== New base module names: `Bytes` and `Charset`\n\nTwo new names are introduced to the base module: `Bytes` and `Charset`.\nThat means that any code that currently references these names on implicit `this` will break (https://github.com/apple/pkl/pull/1019[#1019]).\n\nThe following snippet demonstrates this breaking behavior.\nIn 0.28 and below, `obj2.prop` resolves to string \"my bytes\".\nIn 0.29, it resolves to class `Bytes` in the base module.\n\n[source,pkl]\n----\nobj1 {\n  Bytes = \"my bytes\"\n}\n\nobj2 = (obj1) {\n  prop = Bytes\n}\n----\n\nTo make this code continue to have the same meaning, an explicit `this` reference is required.\n\n[source,diff]\n----\n obj1 {\n   Bytes = \"my bytes\"\n }\n \n obj2 = (obj1) {\n-  prop = Bytes\n+  prop = this.Bytes\n }\n----\n\nThis only affects code that references these names off of implicit this.\nCode that references the name from the lexical scope will continue to work as-is.\n\nTo learn more about name resolution, consult the xref:language-reference:index.adoc#name-resolution[language reference].\n\n=== jpkl is not published to Maven Central\n\nDue to a breakage in release pipeline, the `jpkl` executable is not published to Maven Central (https://github.com/apple/pkl/pull/1147[#1147]).\n\nIt is still available to download as a GitHub release asset.\n\n== Miscellaneous [small]#🐸#\n\n* Documentation improvements (https://github.com/apple/pkl/pull/1065[#1065], https://github.com/apple/pkl/pull/1127[#1127]).\n* Dependency updates (https://github.com/apple/pkl/pull/1088[#1088], https://github.com/apple/pkl/pull/1128[#1128], https://github.com/apple/pkl/pull/1139[#1139]).\n* Use `javac -release` and `kotlinc -Xjdk-release` compiler flags for improved bytecode compatibilty (https://github.com/apple/pkl/pull/1080[#1080]).\n* Parser improvements (https://github.com/apple/pkl/pull/1066[#1066]).\n\n== Bugs fixed [small]#🐜#\n\nThe following bugs have been fixed.\n\n* New parser fails on nested multi line comments (https://github.com/apple/pkl/issues/1014[#1014])\n* Fix package dependency links when generating pkldoc (https://github.com/apple/pkl/pull/1078[#1078])\n* Don't show 100% when number of failures is rounded up (https://github.com/apple/pkl/pull/1110[#1110])\n* Quoting the module name crashes pkl (https://github.com/apple/pkl/issues/1111[#1111])\n* Shebang comment parsing is too lenient (https://github.com/apple/pkl/issues/1125[#1125])\n* CLI: noProxy option in settings.pkl and PklProject are ignored (https://github.com/apple/pkl/issues/1142[#1142])\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* https://github.com/arouel[@arouel]\n* https://github.com/gordonbondon[@gordonbondon]\n* https://github.com/HT154[@HT154]\n* https://github.com/KushalP[@KushalP]\n* https://github.com/madrob[@madrob]\n* https://github.com/MikeSchulze[@MikeSchulze]\n* https://github.com/sitaktif[@sitaktif]\n* https://github.com/vlsi[@vlsi]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.30.adoc",
    "content": "= Pkl 0.30 Release Notes\n:version: 0.30\n:version-minor: 0.30.2\n:release-date: November 3rd, 2025\n\n:yaml-binary-scalar: https://yaml.org/type/binary.html\n\ninclude::ROOT:partial$component-attributes.adoc[]\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThis release introduces a code formatter, and an in-language API for producing `pkl-binary` output.\n\nThe next release (0.31) is scheduled for February 2026.\nTo see what's coming in the future, follow the {uri-pkl-roadmap}[Pkl Roadmap].\n\nPlease send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +\n\n[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].\nTo get started, follow xref:pkl-cli:index.adoc#installation[Installation].#\n\n== Highlights [small]#💖#\n\n[[formatter]]\n=== Formatter\n\nPkl now has a formatter (https://github.com/apple/pkl/pull/1107[#1107], https://github.com/apple/pkl/pull/1208[#1208], https://github.com/apple/pkl/pull/1211[#1211], https://github.com/apple/pkl/pull/1215[#1215], https://github.com/apple/pkl/pull/1217[#1217], https://github.com/apple/pkl/pull/1235[#1235], https://github.com/apple/pkl/pull/1246[#1246], https://github.com/apple/pkl/pull/1247[#1247], https://github.com/apple/pkl/pull/1252[#1252], https://github.com/apple/pkl/pull/1256[#1256], https://github.com/apple/pkl/pull/1259[#1259], https://github.com/apple/pkl/pull/1260[#1260], https://github.com/apple/pkl/pull/1263[#1263], https://github.com/apple/pkl/pull/1265[#1265], https://github.com/apple/pkl/pull/1266[#1266], https://github.com/apple/pkl/pull/1267[#1267], https://github.com/apple/pkl/pull/1268[#1268], https://github.com/apple/pkl/pull/1270[#1270], https://github.com/apple/pkl/pull/1271[#1271], https://github.com/apple/pkl/pull/1272[#1272], https://github.com/apple/pkl/pull/1273[#1273], https://github.com/apple/pkl/pull/1274[#1274], https://github.com/apple/pkl/pull/1280[#1280], https://github.com/apple/pkl/pull/1283[#1283], https://github.com/apple/pkl/pull/1289[#1289], https://github.com/apple/pkl/pull/1290[#1290])!\n\nPkl's formatter is _canonical_, which means that it has a single set of formatting rules, with (almost) no configuration options.\nThe goal is to eliminate the possibility of formatting debates, which can lead to churn and bike-shedding.\n\nThe formatter is available both as a CLI subcommand and as a Java API.\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0014-canonical-formatter.adoc[SPICE-0014].\n\n==== Using the CLI\n\nThe Pkl formatter is available under the `pkl format` subcommand. By default, the command will concatenate and write all formatted content to standard out.\n\nTo simply check for formatting violations, getting formatted output on stdout is likely too verbose.\nThe `--silent` flag can be used to omit any output, and the <<formatting-exit-codes,exit code>> can be used to determine\nif there are formatting violations.\n\n[source,shell]\n----\npkl format --silent . || echo \"Formatting violations were found!\"\n----\n\nAlternatively, the `--names` flag will print out the names of any files that have formatting violations.\n\n[source,shell]\n----\npkl format --diff-name-only .\n----\n\nTo apply formatting, use the `--write` (`-w`) flag.\nThis also implies the `--diff-name-only` flag.\n\n[source,shell]\n----\npkl format -w .\n----\n\n[[formatting-exit-codes]]\n==== Exit codes\n\nThe formatter will exit with the following codes:\n\n|===\n|Code |Description\n\n|0\n|No formatting violations were found.\n\n|1\n|Non-formatting errors occurred.\n\n|11\n|Formatting violations were found.\n|===\n\n==== Grammar version\n\nThe formatter can be configured with a _grammar version_, which maps to a Pkl version range.\n\n|===\n|Grammar version |Pkl versions\n\n|1\n|0.25 - 0.29\n\n|2\n|0.30+\n|===\n\nGrammar version 2 uses the newly introduced <<trailing-commas,trailing commas>> feature, and therefore is not compatible with existing versions of Pkl.\nTo ensure compatibility, use the `--grammar-version 1` CLI flag.\n\n[[binary-renderer-parser]]\n=== `pkl-binary` in-language Renderer\n\nA new in-language API has been added to render values into xref:bindings-specification:binary-encoding.adoc[pkl-binary encoding] (https://github.com/apple/pkl/pull/1203[#1203],\nhttps://github.com/apple/pkl/pull/1250[#1250], https://github.com/apple/pkl/pull/1275[#1275]).\n\nIt's sometimes useful to separate Pkl evaluation from data consumption when used as application or service configuration.\nThis is possible with the `pkl-binary` format, which is a lossless encoding of Pkl data.\n\nIn this approach, Pkl is first rendered into `pkl-binary` during build time, and then deserialized into classes and structs at startup time.\nThis means that the Pkl evaluator does not need to be shipped with the application, which improves code portability and eliminates runtime overhead.\n\nHowever, currently, the API for getting this binary format is somewhat cumbersome.\nOnly the host languages have access to this API (for example, https://swiftpackageindex.com/apple/pkl-swift/0.6.0/documentation/pklswift/evaluator/evaluateexpressionraw(source:expression:)[`evaluateExpressionRaw`] in pkl-swift).\nThis means that one-off logic must be written to render this format in the host language.\n\nIn 0.30, this renderer is added as an in-language API, through the {uri-stdlib-pklbinaryModule}[`pkl:pklbinary`] standard library module.\nAdditionally, it is available through CLI flag `--format pkl-binary`.\n\nFor example:\n\n// this is parsed instead of tested because DocSnippetTests only handles textual output (via ReplServer)\n[source%parsed,pkl]\n----\nimport \"pkl:pklbinary\"\n\noutput {\n  renderer = new pklbinary.Renderer {}\n}\n----\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0021-binary-renderer-and-parser.adoc[SPICE-0021].\n\n==== New renderer type: `BytesRenderer`\n\nTo enable the `pkl-binary` renderer feature, Pkl now supports renderers that produce `Bytes` output (https://github.com/apple/pkl/pull/1203[#1203]).\n\nThe existing `ValueRenderer` class now extends new class `BaseValueRenderer`, and a new `BytesRenderer` class is introduced.\n\nSetting a module's output renderer to a `BytesRenderer` will control its resulting `output.bytes`.\n\nThis affects usage scenarios where a module's `output.bytes` is evaluated, for example, when using `pkl eval`.\n\n==== Using `pkl-binary` data\n\nUsers of Pkl's language binding libraries can decode `pkl-binary` data into instances of code-generated types.\n\n[tabs]\n====\nJava::\n+\n[source,java]\n----\nvar encodedData = fetchEncodedData(); // some byte[] or InputStream\nvar config = Config.fromPklBinary(encodedData);\nvar appConfig = config.as(AppConfig.class);\n----\n\nKotlin::\n+\n[source,kotlin]\n----\nval encodedData = fetchEncodedData() // some ByteArray or InputStream\nval config = Config.fromPklBinary(encodedData, ValueMapper.preconfigured().forKotlin())\nval appConfig = config.to<AppConfig>()\n----\n\nGo::\n+\n[source,go]\n----\nencodedData := fetchEncodedData() // some []byte\nvar appConfig AppConfig\nif err := pkl.Unmarshal(encodedData, &appConfig); err != nil {\n  // handle error\n} \n----\n\nSwift::\n+\n[source,swift]\n----\nlet encodedData = fetchEncodedData() // some [UInt8]\nlet appConfig = try PklDecoder.decode(AppConfig.self, from: encodedData)\n----\n====\n\n== Noteworthy [small]#🎶#\n\n[[trailing-commas]]\n=== Trailing Commas\n\nPkl's grammar has been updated to allow including a comma following the final item of comma-separated syntax elements (https://github.com/apple/pkl/pull/1137[#1137]).\n\nThese syntax elements are affected:\n\n[source%tested,pkl]\n----\nfunction add(\n  bar,\n  baz, // <1>\n) = bar + baz\n\nfoo = add(\n  1,\n  2, // <2>\n)\n\ntypealias MyMapping<\n  Key,\n  Value, // <3>\n> = Mapping<Key, Value>\n\nbar: Mapping<\n  String,\n  Int, // <4>\n>\n\nbaz: Mapping(\n  !containsKey(\"forbidden key\"),\n  !containsKey(\"forbidden value\"), // <5>\n)\n\nqux: (\n  String,\n  Int, // <6>\n) -> Dynamic =\n  (paramA, paramB) -> new Dynamic {\n    quux = \"\\(paramA): \\(paramB)\"\n  }\n\ncorge = (qux) {\n  paramA,\n  paramB, // <7>\n  ->\n  grault = paramA.length * paramB\n}\n----\n<1> Function parameter lists in method definitions.\n<2> Argument lists in method calls.\n<3> Type parameter lists in generic type definitions.\n<4> Type argument lists in type annotations and casts.\n<5> Type constraint lists.\n<6> Function type parameter lists in function type annotations.\n<7> Object body parameter lists.\n\nTo learn more about this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0019-trailing-commas.adoc[SPICE-0019].\n\n=== Pretty-printed traces\n\nA new evaluator option is added to enable pretty-printed traces (https://github.com/apple/pkl/pull/1100[#1100], https://github.com/apple/pkl/pull/1227[#1227], https://github.com/apple/pkl/pull/1230[#1230]).\n\nCurrently, the `trace()` operator will render values as a single line, and trims the output after 100 characters.\nThis can obscure information when debugging.\n\nIn 0.30, a new evaluator option is added to control how traces are emitted.\nTwo trace modes are introduced:\n\n* `compact` - the current output mode (default).\n* `pretty` - multiline, with no limit on output size.\n\nFor example, users of the CLI can specify `--trace-mode` as a flag.\n\n[source,shell]\n----\npkl eval --trace-mode pretty myModule.pkl  \n----\n\nThanks to https://github.com/ssalevan[@ssalevan] for their contribution to this feature!\n\n=== Better support for `Bytes` when rendering YAML\n\nPreviously, attempting to render a `Bytes` value using {uri-stdlib-YamlRenderer}[`YamlRenderer`] required the use of a link:{uri-stdlib-PcfRenderer-converters}[converter].\nNow, Pkl can natively render YAML containing link:{yaml-binary-scalar}[binary scalars] (https://github.com/apple/pkl/pull/1276[#1276]).\n\n[source,pkl%tested]\n----\nfoo {\n  bar = Bytes(1, 2, 3)\n}\n\nrendered = new YamlRenderer {}.renderValue(foo) // <1>\n----\n<1> Result: `bar: !!binary AQID`\n\nSimilarly, link:{uri-stdlib-YamlParser}[`yaml.Parser`] now parses binary YAML values as Pkl link:{uri-stdlib-Bytes}[`Bytes`] values (https://github.com/apple/pkl/pull/1277[#1277]).\nThis is a breaking change; previously these values were parsed as link:{uri-stdlib-String}[`String`] value containing the base64-encoded binary data.\n\n[source,pkl%tested]\n----\nimport \"pkl:yaml\"\n\nyamlData = \n  \"\"\"\n  bytes: !!binary AQID\n  \"\"\"\n\nparsed = new yaml.Parser {}.parse(yamlData).bytes // <1>\n----\n<1> Result: `Bytes(1, 2, 3)`\n\n[[pkldoc-perf-improvements]]\n=== `pkldoc` performance improvements\n\nThe `pkldoc` documentation generator has been overhauled (https://github.com/apple/pkl/pull/1169[#1169], https://github.com/apple/pkl/pull/1224[#1224], https://github.com/apple/pkl/pull/1241[#1241], https://github.com/apple/pkl/pull/1242[#1242]).\n\nCurrently, the `pkldoc` tool needs to consume much of an existing documentation website whenever generating new documentation.\nThis adds significant I/O overhead as a pkldoc documentation website grows.\n\nThe generator has been overhauled to minimize the amount of data needed to be read from the current site.\n\nTo read more about this change, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0018-pkldoc-io-improvements.adoc[SPICE-0018].\n\n[[pkldoc-migration]]\n==== Migration\n\nThe new pkldoc website introduces breaking changes to the data model.\nBecause of this, existing sites must be migrated before using the `0.30` version of pkldoc.\n\nTo migrate, run the one-time command `pkldoc --migrate`.\n\n=== Java API changes\n\n==== New classes\n\nNew classes are introduced to the Java API.\n\n* `org.pkl.core.PklBinaryDecoder`\n\n==== New methods\n\nNew methods are introduced to the Java API.\n\n* `org.pkl.core.Evaluator.evaluateExpressionPklBinary`\n* `org.pkl.core.EvaluatorBuilder.setTraceMode`\n* `org.pkl.core.EvaluatorBuilder.getTraceMode`\n* `org.pkl.config.java.Config.fromPklBinary`\n\n=== Standard Library changes\n\nNew modules, properties, methods, classes and typealiases have been added to the standard library (https://github.com/apple/pkl/pull/1106[#1106]).\n\n==== Changes to `pkl:base`\n\nAdditions:\n\n* New class: {uri-stdlib-BaseValueRenderer}[`BaseValueRenderer`]\n* {uri-stdlib-ValueRenderer}[`ValueRenderer`] (now a subclass of {uri-stdlib-BaseValueRenderer}[`BaseValueRenderer`])\n* {uri-stdlib-BytesRenderer}[`BytesRenderer`]\n* {uri-stdlib-baseModule}/RenderDirective#bytes[`RenderDirective.bytes`]\n\n==== Additions to `pkl:EvaluatorSettings`\n\n* {uri-stdlib-evaluatorSettingsModule}#traceMode[`traceMode`]\n\n==== Additions to `pkl:reflect`\n\n* {uri-stdlib-reflectModule}/Class#allMethods[`Class.allMethods`]\n* {uri-stdlib-reflectModule}/Class#allProperties[`Class.allProperties`]\n* {uri-stdlib-reflectModule}/Property#allAnnotations[`Propterty.allAnnotations`]\n* {uri-stdlib-reflectModule}/Propterty#allModifiers[`Propterty.allModifiers`]\n\n==== New module: `pkl:pklbinary`\n\nThe `pkl:pklbinary` standard library module is added.\n\n=== `pkl repl` improvements\n\nThe REPL now handles interrupts (Ctrl-C) in a more user-friendly way (https://github.com/apple/pkl/pull/1188[#1188]).\n\nInstead of exiting immediately, it behaves like other REPLs:\n\n* If the line is non-empty or in a continuation, the buffer is cleared.\n* If the line is empty, print a message with instructions on exiting the REPL.\n** If another interrupt is sent immediately after, exit.\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n=== Binary data handling `yaml.Parser`\n\nlink:{yaml-binary-scalar}[YAML binary scalars] are now parsed as link:{uri-stdlib-Bytes}[`Bytes`] values.\nPrior versions of Pkl parsed binary scalars as link:{uri-stdlib-String}[`String`] values containing the base64-encoded binary data.\n\n=== Minimum Kotlin version bump\n\nFor users of Pkl's Kotlin libraries, the minimum Kotlin version has been bumped to 2.1 (https://github.com/apple/pkl/pull/1232[#1232]).\n\n=== New base module names: `BaseValueRenderer`, `BytesRenderer`\n\nTwo new names are introduced to the base module: `BaseValueRenderer`, and `BytesRenderer`.\nThat means that any code that currently references these names on implicit `this` will break (https://github.com/apple/pkl/pull/1203[#1203]).\n\nTo learn more about how this breaks code and how to fix it, see xref:0.29.adoc#new-base-module-names[New base module names] in 0.29's release notes.\n\n=== `pkldoc` sites need to be migrated\n\nDue to breaking changes made in pkldoc's data model, existing pkldoc websites must be migrated.\n\nSee <<pkldoc-migration>> for more details.\n\n== Miscellaneous [small]#🐸#\n\n* Dependency updates (https://github.com/apple/pkl/pull/1184[#1184], https://github.com/apple/pkl/pull/1225[#1225], https://github.com/apple/pkl/pull/1226[#1226], https://github.com/apple/pkl/pull/1228[#1228]).\n* Enforce Pkl formatting of stdlib (https://github.com/apple/pkl/pull/1236[#1236], https://github.com/apple/pkl/pull/1253[#1253], https://github.com/apple/pkl/pull/1258[#1258], https://github.com/apple/pkl/pull/1278[#1278], https://github.com/apple/pkl/pull/1279[#1279]).\n* Add internal IntelliJ plugin that's meant to assist with development of the Pkl codebase itself (https://github.com/apple/pkl/pull/1248[#1248]).\n* Update CircleCI macOS instance type and Xcode version (https://github.com/apple/pkl/pull/1243[#1243], https://github.com/apple/pkl/pull/1244[#1244]).\n* Disable multi-jdk testing when running on Windows ARM (https://github.com/apple/pkl/pull/1223[#1223]).\n* Refine documentation for class `Any` (https://github.com/apple/pkl/pull/1194[#1194]).\n\n== Bugs fixed [small]#🐜#\n\nThe following bugs have been fixed.\n\n* Incorrect error message when refusing to read past root dir (https://github.com/apple/pkl/pull/1234[#1233]).\n* Unicode U+7FFF character (翿) incorrectly parsed as EOF (https://github.com/apple/pkl/pull/1251[#1251]).\n* Fallback certificates do not work in certain classloader setups (https://github.com/apple/pkl/pull/1198[#1199]).\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* https://github.com/bioball[@bioball]\n* https://github.com/HT154[@HT154]\n* https://github.com/netvl[@netvl]\n* https://github.com/spyoungtech[@spyoungtech]\n* https://github.com/srueg[@srueg]\n* https://github.com/ssalevan[@ssalevan]\n* https://github.com/stackoverflow[@stackoverflow]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.31.adoc",
    "content": "= Pkl 0.31 Release Notes\n:version: 0.31\n:version-minor: 0.31.0\n:release-date: February 26th, 2026\n:version-next: 0.32\n:version-next-date: July 2026\n\ninclude::partial$intro.adoc[]\n\n== Highlights [small]#💖#\n\n[[power-assertions]]\n=== Power Assertions\n\nPkl's test output and error output has been improved with power assertions (pr:https://github.com/apple/pkl/pull/1384[], pr:https://github.com/apple/pkl/pull/1419[])!\n\nPkl has two places that are effectively assertions.\nThese are:\n\n* Type constraint expressions\n* Test facts\n\nCurrently, when these assertions fail, the error message prints the assertion's source section.\nHowever, this information can sometimes be lacking.\nIt tells you what the mechanics of the assertion is, but doesn't tell you _why_ the assertion is failing.\n\nFor example, here is the current error output of a failing typecheck.\n\n[source,text]\n----\n–– Pkl Error ––\nType constraint `name.endsWith(lastName)` violated.\nValue: new Person { name = \"Bub Johnson\" }\n\n7 | passenger: Person(name.endsWith(lastName)) = new { name = \"Bub Johnson\" }\n----\n\nJust from this error message, we don't know what the last name is supposed to be.\nWhat is `name` supposed to end with?\nWe just know it's some property called `lastName` but, we don't know what it _is_.\n\nIn Pkl 0.31, the error output becomes:\n\n[source,text]\n----\n–– Pkl Error ––\nType constraint `name.endsWith(lastName)` violated.\nValue: new Person { name = \"Bub Johnson\" }\n\n    name.endsWith(lastName)\n    │    │        │\n    │    false    \"Smith\"\n    \"Bub Johnson\"\n\n7 | passenger: Person(name.endsWith(lastName)) = new { name = \"Bub Johnson\" }\n----\n\nNow, we know what the expectation is.\n\nThis type of diagram is also added to test facts.\nWhen tests fail, Pkl emits a diagram of the expression, and the values produced.\n\nFor example, given the following test:\n\n.math.pkl\n[source,pkl]\n----\namends \"pkl:test\"\n\nfacts {\n  local function add(a: Int, b: Int) = a * b\n  local function divide(a: Int, b: Int) = a % b\n  [\"math\"] {\n    add(3, 4) == 7\n    divide(8, 2) == 4\n  }\n}\n----\n\nThe error output now includes a power assertion diagram, which helps explain why the test failed.\n\n[source,text]\n----\nmodule math\n  facts\n    ✘ math\n       add(3, 4) == 7 (math.pkl:9)\n       │         │\n       12        false\n       divide(8, 2) == 4 (math.pkl:10)\n       │            │\n       0            false\n\n0.0% tests pass [1/1 failed], 0.0% asserts pass [2/2 failed]\n----\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0026-power-assertions.adoc[SPICE-0026].\n\n[[cli-framework]]\n=== CLI Framework\n\nPkl 0.31 introduces a new framework for implementing CLI tools in Pkl (pr:https://github.com/apple/pkl/pull/1367[], pr:https://github.com/apple/pkl/pull/1431[], pr:https://github.com/apple/pkl/pull/1432[], pr:https://github.com/apple/pkl/pull/1436[], pr:https://github.com/apple/pkl/pull/1440[], pr:https://github.com/apple/pkl/pull/1444[]).\n\nThe framework provides a way to build command line tools with user experience idioms that will be immediately familiar to users.\nCLI tools implemented in Pkl have largely the same capabilities as normal Pkl evaluation (i.e. writing to standard output and files), but this may be extended using xref:language-reference:index.adoc#external-readers[external readers].\n\nCommands are defined by extending the pkldoc:#[pkl:Command] module:\n\n.bird-generator.pkl\n[source,pkl]\n----\nextends \"pkl:Command\"\n\noptions: Options\n\nclass Options {\n  /// Mapping of <bird>=<bird age> pairs defining the list of birds.\n  @Argument\n  birds: Mapping<String, Number>\n\n  /// Aggregation function to apply to all bird ages.\n  aggregate: *\"sum\" | \"mean\" | \"count\"\n}\n\nclass Bird {\n  /// Name of the bird.\n  name: String\n\n  /// Age of the bird in years.\n  age: Number\n}\n\nbirds: Listing<Bird> = new {\n  for (_name, _age in options.birds) {\n    new { name = _name; age = _age }\n  }\n}\n\nresult: Number =\n  if (options.aggregate == \"sum\")\n    birds.toList().fold(0.0, (result, bird) -> result + bird.age)\n  else if (options.aggregate == \"mean\")\n    birds.toList().fold(0.0, (result, bird) -> result + bird.age) / birds.length\n  else\n    birds.length\n----\n\nCommands are executed using the `pkl run` CLI subcommand:\n\n[source,bash]\n----\n$ pkl run bird-generator.pkl pigeon --aggregate=mean Pigeon=1 Hawk=8 Eagle=3\nbirds {\n  new {\n    name = \"Pigeon\"\n    age = 1\n  }\n  new {\n    name = \"Hawk\"\n    age = 8\n  }\n  new {\n    name = \"Eagle\"\n    age = 3\n  }\n}\nresult = 4.0\n----\n\nAutomatic CLI help is provided:\n\n[source,bash]\n----\n$ pkl run test.pkl -h\nUsage: test.pkl [<options>] [<birds>]... <command> [<args>]...\n\nOptions:\n  --aggregate=<count, mean, sum>  Aggregation function to apply to all bird ages.\n  -h, --help                      Show this message and exit\n\nArguments:\n  <birds>  Mapping of <bird>=<bird age> pairs defining the list of birds.\n----\n\nTo learn more about this feature, consult xref:pkl-cli:index.adoc#cli-tools[the documentation] and https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0025-pkl-run-cli-framework.adoc[SPICE-0025].\n\n== Noteworthy [small]#🎶#\n\n=== Syntax Highlighting\n\nThe Pkl CLI displays Pkl code in several locations: stack frames within errors messages, <<power-assertions,power assertions>>, and in the xref:pkl-cli:index.adoc#repl[REPL].\nThis code is now syntax highlighted to improve readability (pr:https://github.com/apple/pkl/pull/1385[], pr:https://github.com/apple/pkl/pull/1409[]):\n\nimage::syntax-highlight-error.png[syntax highlighted output]\n\n[[cli-dependency-notation]]\n=== CLI Support for Dependency Notation\n\nThe Pkl CLI now supports specifying modules using xref:language-reference:index.adoc#project-dependencies[dependency notation] (pr:https://github.com/apple/pkl/pull/1434[], pr:https://github.com/apple/pkl/pull/1439[]).\nThis is especially helpful for <<cli-framework,CLI commands>> defined in Packages:\n\n[source,bash]\n----\n$ pkl run @my-tool/cmd.pkl ...\n----\n\nThis enhancement applies to the `pkl eval`, `pkl run`, `pkl test`, and `pkl analyze imports` commands.\nIt also applies to the `pkldoc`, `pkl-codegen-java`, and `pkl-codegen-kotlin` tools.\n\n[NOTE]\nDependency notation only works for remote package dependencies. xref:language-reference:index.adoc#local-dependencies[Local dependencies] are not supported.\n\n=== Property Converter Annotations\n\nPkl provides the pkldoc:BaseValueRenderers#converters[] mechanism for transforming values during rendering.\nConverters are flexible, but their design makes some transformations awkward.\nIn particular, modifying property names during rendering required a lot of extra code.\n\nThe new pkldoc:ConvertProperty[] annotation adds a way to express parameterized per-property name and value transformations (pr:https://github.com/apple/pkl/pull/1333[]).\n\nTo learn more about this feature, consult https://github.com/apple/pkl-evolution/blob/main/spices/SPICE-0024-annotation-converters.adoc[SPICE-0024].\n\nAdditional new Pkl APIs for per-format property renaming will be added for many built-in renderers:\n\n.fmt.pkl\n[source,pkl]\n----\nimport \"pkl:json\"\nimport \"pkl:yaml\"\n\n@json.Property { name = \"foo_bar\" }\n@yaml.Property { name = \"foo-bar\" }\nfooBar: String = \"hello world\"\n----\n\n[source,terminaloutput]\n----\n$ pkl eval fmt.pkl -f json\n{\n  \"foo_bar\": \"hello world\"\n}\n\n$ pkl eval fmt.pkl -f yaml\nfoo-bar: hello world\n----\n\n=== Java API changes\n\n==== New classes\n\nNew classes are introduced to the Java API.\n\n* `org.pkl.core.CommandSpec`\n\n==== New methods\n\nNew methods are introduced to the Java API.\n\n* `org.pkl.core.Evaluator.evaluateCommand`\n* `org.pkl.core.EvaluatorBuilder.setPowerAssertionsEnabled`\n* `org.pkl.core.EvaluatorBuilder.getPowerAssertionsEnabled`\n* `org.pkl.core.SecurityManager.resolveSecurePath`\n* `org.pkl.config.java.ConfigEvaluator.evaluateOutputValue`\n* `org.pkl.coznfig.java.ConfigEvaluator.evaluateExpression`\n\n=== Standard Library changes\n\nNew properties have been added to the standard library (pr:https://github.com/apple/pkl/pull/1396[]).\n\n==== Additions to `pkl:base`\n\n* pkldoc:List#isNotEmpty[]\n* pkldoc:Map#isNotEmpty[]\n* pkldoc:Set#isNotEmpty[]\n* pkldoc:Listing#isNotEmpty[]\n* pkldoc:Mapping#isNotEmpty[]\n* pkldoc:String#isNotEmpty[]\n* pkldoc:String#isNotBlank[]\n* pkldoc:ConvertProperty[]\n* pkldoc:BaseValueRenderer#convertPropertyTransformers[]\n\n==== New module `pkl:Command`\n\nThe pkldoc:#[pkl:Command] standard library module is added.\n\n==== Additions to `pkl:json`\n\n* pkldoc:Property[pkl:json]\n\n==== Additions to `pkl:jsonnet`\n\n* pkldoc:Property[pkl:jsonnet]\n\n==== Additions to `pkl:protobuf`\n\n* pkldoc:Property[pkl:protobuf]\n\n==== Additions to `pkl:xml`\n\n* pkldoc:Property[pkl:xml]\n\n==== Additions to `pkl:yaml`\n\n* pkldoc:Property[pkl:yaml]\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n=== Removal of `@argfile` support\n\nPrior versions of Pkl had an undocumented feature allowing inclusion of CLI arguments from files using `@path/to/file`.\nIn order to support <<cli-dependency-notation,dependency notation>> on the CLI, `@argfile` support has been removed from Pkl.\n\n=== Removal of `Collection#transpose()`\n\nPrior versions of Pkl defined a `transpose()` method on the `Collection` class.\nThis method was never implemented and threw an error when called.\nAs it was never functional, it has been removed entirely without a deprecation warning (pr:https://github.com/apple/pkl/pull/1437[]).\n\n== Miscellaneous [small]#🐸#\n\n* Improve formatting of imports to keep surrounding comments (pr:https://github.com/apple/pkl/pull/1424[]).\n* Add support for evaluating module output and expressions to `ConfigEvaluator` (pr:https://github.com/apple/pkl/pull/1297[]).\n* The `pkl format --write` command now exits successfully when formatting violations are found and updated (pr:https://github.com/apple/pkl/pull/1340[]).\n* Add `pkl-bom` module to aid in aligning Pkl Java dependencies (pr:https://github.com/apple/pkl/pull/1390[]).\n* Improve error message when writing `PklProject.deps.json` fails (pr:https://github.com/apple/pkl/pull/1405[]).\n* Add information about pkldoc:Annotation[]s to the language reference (pr:https://github.com/apple/pkl/pull/1427[]).\n* Improved usability for the `org.pkl.formatter.Formatter` Java API (pr:https://github.com/apple/pkl/pull/1428[]).\n\n== Bugs fixed [small]#🐜#\n\nThe following bugs have been fixed.\n\n* `Function.toString()` returns incorrect result (pr:https://github.com/apple/pkl/pull/1411[]).\n* Failure when `--multiple-file-output-path` is a symlink (pr:https://github.com/apple/pkl/pull/1389[]).\n* The `module` type in a non-final module has default value of type `Dynamic` (pr:https://github.com/apple/pkl/pull/1392[]).\n* The `module` type is cached incorrectly in some cases (pr:https://github.com/apple/pkl/pull/1393[]).\n* A possible race condition involving symlinks could bypass `--root-dir` during module and resource reading (pr:https://github.com/apple/pkl/pull/1426[]).\n* `pkl format` produces internal stack traces when lexing fails (pr:https://github.com/apple/pkl/pull/1430[]).\n* `super` access expressions are parsed incorrectly inside the spread operator (pr:https://github.com/apple/pkl/pull/1364[]).\n* Modules and resources with `jar:file:` URIs were not properly sandboxed by `--root-dir` (pr:https://github.com/apple/pkl/pull/1442[]).\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* https://github.com/bioball[@bioball]\n* https://github.com/eddie4941[@eddie4941]\n* https://github.com/HT154[@HT154]\n* https://github.com/stackoverflow[@stackoverflow]\n* https://github.com/StefMa[@StefMa]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/0.32.adoc",
    "content": "= Pkl 0.32.0 Release Notes\n:version: 0.32\n:version-minor: 0.32.0\n:release-date: TBD\n:version-next: 0.33\n:version-next-date: TBD\n\ninclude::partial$intro.adoc[]\n\n== Highlights [small]#💖#\n\nNews you don't want to miss.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Noteworthy [small]#🎶#\n\nReady when you need them.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Work In Progress [small]#🚆#\n\nThey missed the train but deserve a mention.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* XXX\n"
  },
  {
    "path": "docs/modules/release-notes/pages/changelog.adoc",
    "content": "= Changelog\ninclude::ROOT:partial$component-attributes.adoc[]\n\n[[release-0.32.0]]\n== 0.32.0 (UNRELEASED)\n\n[[release-0.31.0]]\n== 0.31.0 (2026-02-26)\n\nxref:0.31.adoc[Release Notes]\n[[release-0.30.2]]\n\n== 0.30.2 (2025-12-15)\n\n=== Fixes\n\n* Fixes formatting of blank files (https://github.com/apple/pkl/pull/1351[#1351]).\n* Fixes an issue where the `pkl format` CLI command adds an extra newline when writing formatted content to standard output (https://github.com/apple/pkl/issues/1346[#1346]).\n* Make linux executables link to glibc 2.17 (https://github.com/apple/pkl/pull/1352[#1352]).\n* Fix incorrect parsing of super expressions (https://github.com/apple/pkl/pull/1364[#1364]).\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* https://github.com/bioball[@bioball]\n* https://github.com/HT154[@HT154]\n* https://github.com/stackoverflow[@stackoverflow]\n\n[[release-0.30.1]]\n== 0.30.1 (2025-12-03)\n\n=== Fixes\n\n* Fixes formatting of `Map` constructors with line comments (https://github.com/apple/pkl/pull/1312[#1312]).\n* Fixes a crash when parsing empty parenthesized types (https://github.com/apple/pkl/pull/1323[#1323]).\n* Fixes a parser issue allowing too many newlines between tokens (https://github.com/apple/pkl/pull/1328[#1328]).\n* Fixes parsing of URIs with schemes containing `+`, `-`, or `.` (https://github.com/apple/pkl/pull/1335[#1335]).\n* Fixes a crash when creating very large `List` instances (https://github.com/apple/pkl/pull/1337[#1337]).\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* https://github.com/bioball[@bioball]\n* https://github.com/HT154[@HT154]\n* https://github.com/spyoungtech[@spyoungtech]\n* https://github.com/stackoverflow[@stackoverflow]\n\n[[release-0.30.0]]\n== 0.30.0 (2025-10-30)\n\nxref:0.30.adoc[Release notes]\n\n[[release-0.29.1]]\n== 0.29.1 (2025-08-27)\n\n=== Fixes\n\n* Fixes an issue where autocompletion in Bash and ZSH do noes not suggest filenames (https://github.com/apple/pkl/pull/1161[#1161]).\n* Fixes an issue where `pkldoc` throws a runtime error about failing to load class path resources (https://github.com/apple/pkl/issues/1174[#1174]).\n* Fixes an issue where `pkldoc` always runs with `testMode` set to true.\n* Fixes an issue where evaluating a module that ends with an unmatched backtick throws `ArrayIndexOutOfBoundsException` (https://github.com/apple/pkl/issues/1182[#1182]).\n* Fixes the formatting of YAML strings when emitting backslash characters within quoted strings (https://github.com/apple/pkl/pull/1165[#1165]).\n* Fixes an issue where `local` members inside `Mapping` objects are incorrectly encoded into binary format (https://github.com/apple/pkl/issues/1151[#1151]).\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* https://github.com/bioball[@bioball]\n* https://github.com/gordonbondon[@gordonbondon]\n* https://github.com/HT154[@HT154]\n\n[[release-0.29.0]]\n== 0.29.0 (2025-07-24)\n\nxref:0.29.adoc[Release notes]\n\n[[release-0.28.2]]\n== 0.28.2 (2025-04-17)\n\n=== Fixes\n\n* Adds an optimization when object bodies with generators produce no members (https://github.com/apple/pkl/pull/1013[#1013]).\n* Fixes a runtime crash when `--output-path` points to a directory (https://github.com/apple/pkl/pull/1038[#1038]).\n* Fixes a bug that sometimes causes pkl-doc to crash (https://github.com/apple/pkl/pull/1028[#1028]).\n\n=== Miscellaneous\n\n* Documentation improvements (https://github.com/apple/pkl/pull/982[#982], https://github.com/apple/pkl/pull/1010[#1010], https://github.com/apple/pkl/pull/1031[#1031]).\n* CI improvements (https://github.com/apple/pkl/pull/1020[#1020]).\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* https://github.com/JeroenSoeters[@JeroenSoeters]\n* https://github.com/KushalP[@KushalP]\n* https://github.com/mbvissers[@mbvissers]\n* https://github.com/pepicrft[@pepicrft]\n\n[[release-0.28.1]]\n== 0.28.1 (2025-03-03)\n\n=== Fixes\n\n* Fixes an issue where Pkl Gradle tasks can possibly fail with `java.lang.UnsatisfiedLinkError` (https://github.com/apple/pkl/pull/995[#995]).\n* Fixes an issue where the artifacts pkl-tools and pkl-config-java-all fail with `java.lang.ClassFormatError` (https://github.com/apple/pkl/pull/998[#998]).\n\n=== Changes\n\n* Adds the ability to configure `native-image` build with Gradle system properties (https://github.com/apple/pkl/pull/1001[#1001]).\n+\nNow, any system property starting with `\"pkl.native\"` will have that prefix stripped, and the rest passed as CLI arguments to `native-image`. For example, the native-image resource cache can be configured by passing Gradle flag `-Dpkl.native-Dpolyglot.engine.userResourceCache=/my/cache/dir`.\n\n[[release-0.28.0]]\n== 0.28.0 (2025-02-26)\n\nxref:0.28.adoc[Release notes]\n\n[[release-0.27.2]]\n== 0.27.2 (2025-01-22)\n\n=== Fixes\n\n* Fixes issues where server mode message decoding might result in null pointer exceptions (https://github.com/apple/pkl/pull/853[#853], https://github.com/apple/pkl/pull/882[#882]).\n* Fixes an issue where the test report outputs decimal numbers using local-specific decimals (https://github.com/apple/pkl/pull/868[#868]).\n* Fixes an issue where the native executables might not run on some environments, resulting in an error like \"Fatal error: Failed to create the main Isolate\" (https://github.com/apple/pkl/pull/875[#875]).\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* link:https://github.com/HT154[@HT154]\n* link:https://github.com/StefMa[@StefMa]\n\n[[release-0.27.1]]\n== 0.27.1 (2024-12-06)\n\n=== Fixes\n\n- Fixes a broken \"number literals\" link in the 0.27 release notes (https://github.com/apple/pkl/pull/784[#784]).\n- Fixes a possible deadlock during external reader process close (https://github.com/apple/pkl/pull/786[#786]).\n- Fixes counting elements with computed indices multiple times in length computation of listings (https://github.com/apple/pkl/pull/797[#797]).\n- Fixes non Pkl modules being reported in GatherImports task, leading to plugin failures (https://github.com/apple/pkl/pull/821[#821]).\n- Fixes a problem where the delegate chain of type casts for Listing/Mapping get unreasonably big, even though the type nodes are the same, which may lead to a stack overflow or performance degradation (https://github.com/apple/pkl/pull/826[#826]).\n- Fixes incorrect scoping of type variables in lazy Listing/Mapping type checking in cross-module typealiases (https://github.com/apple/pkl/pull/789[#789]).\n- Fixes regression in type checking logic for Listing/Mapping (https://github.com/apple/pkl/pull/789[#789]).\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* link:https://github.com/GUI[@GUI]\n* link:https://github.com/HT154[@HT154]\n* link:https://github.com/odenix[@odenix] (formerly @translatenix)\n\n\n[[release-0.27.0]]\n== 0.27.0 (2024-11-05)\n\nxref:0.27.adoc[Release notes]\n\n[[release-0.26.3]]\n== 0.26.3 (2024-08-06)\n\n=== Fixes\n\n* Fixes an issue where CLI argument `--property foo=\"\"` is effectively parsed as `--property foo=\"true\"`. This is now parsed as an empty string (https://github.com/apple/pkl/pull/596[#596]).\n* Fixes a regression where amending a globbed import or globbed read results in a PklBugException (https://github.com/apple/pkl/pull/607[#607]).\n* Fixes an issue around using `file()` notation when using the pkl-gradle plugin on Windows (https://github.com/apple/pkl/pull/611[#611]).\n\n[[release-0.26.2]]\n== 0.26.2 (2024-07-18)\n\n=== Fixes\n\n* Fixes a possible race condition where multiple concurrent Pkl evaluations results in a thrown exception when downloading packages (https://github.com/apple/pkl/pull/584[#584]).\n\n[[release-0.26.1]]\n== 0.26.1 (2024-06-28)\n\n=== Fixes\n\n* Fixes a regression where native executables fail to run on some environments that don't support newer CPU features (https://github.com/apple/pkl/pull/551[#551]).\n* Fixes a `PklBugException` when passing `.` as a project directory to `pkl project resolve` and `pkl project package` (https://github.com/apple/pkl/pull/544[#544]).\n\n=== Changes\n\n* Disable revocation checking of TLS certificates (https://github.com/apple/pkl/pull/553[#553]).\n+\nAs part of HTTP improvements in 0.26, we unwittingly fixed a bug where Pkl does not actually perform cert revocation checks when making HTTPS requests.\nThis fix, unfortunately, caused a regression in some cases.\nFor example, this happens when connecting to a server that bears a public trust certificate, while in an environment with no internet access.\nThis is because the HTTP client needs to check the revocation status of all certificates in the chain.\n+\nRevocation checks are a nuanced topic with some benefits, and also with its own problem areas.\nFor this reason, revocation checking is disabled for Pkl's native CLIs.\nUsers of Pkl's Java APIs will respect the revocation settings set in the JVM.\n\n[[release-0.26.0]]\n== 0.26.0 (2024-06-17)\n\nxref:0.26.adoc[Release notes]\n\n[[release-0.25.3]]\n== 0.25.3 (2024-03-26)\n\n=== Fixes\n\n* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/357[#357], link:https://github.com/apple/pkl/pull/362[#362])\n* Fixes a bug where amending a module that defines an abstract class might cause a Java `AssertionError` (link:https://github.com/apple/pkl/pull/319[#319])\n* Fixes a bug where a for/when generator within a lambda declared with `new {}` syntax might not resolve variables correctly (link:https://github.com/apple/pkl/pull/297[#297])\n* Fixes a bug where `const` and `local` modifiers are not exported when obtaining a class's mirror in `pkl:reflect` (link:https://github.com/apple/pkl/pull/265[#265]).\n\n=== Miscellaneous\n\n* Documentation improvements (link:https://github.com/apple/pkl/pull/93[#93], link:https://github.com/apple/pkl/pull/106[#106], link:https://github.com/apple/pkl/pull/143[#143], link:https://github.com/apple/pkl/pull/205[#205], link:https://github.com/apple/pkl/pull/214[#214], link:https://github.com/apple/pkl/pull/224[#224], link:https://github.com/apple/pkl/pull/257[#257], link:https://github.com/apple/pkl/pull/270[#270], link:https://github.com/apple/pkl/pull/282[#282], link:https://github.com/apple/pkl/pull/283[#283], link:https://github.com/apple/pkl/pull/299[#299], link:https://github.com/apple/pkl/pull/337[#337], link:https://github.com/apple/pkl/pull/340[#340])\n* Build script improvements (link:https://github.com/apple/pkl/pull/253[#253], link:https://github.com/apple/pkl/pull/314[#314], link:https://github.com/apple/pkl/pull/333[#333], link:https://github.com/apple/pkl/pull/338[#338])\n\n=== Changes\n\n* Add `jpkl` to the set of artifacts released to GitHub (link:https://github.com/apple/pkl/pull/314[#314])\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* link:https://github.com/r1ft1[@r1ft1]\n* link:https://github.com/WardsParadox[@WardsParadox]\n* link:https://github.com/grantabbott[@grantabbott]\n* link:https://github.com/mshakhmaykin[@mshakhmaykin]\n* link:https://github.com/d4wae89d498[@d4wae89d498]\n* link:https://github.com/KushalP[@KushalP]\n* link:https://github.com/zihluwang[@zihluwang]\n* link:https://github.com/Malix-off[@Malix-off]\n\n[[release-0.25.2]]\n== 0.25.2 (2024-02-08)\n\n=== Fixes\n\n* Fixes some issues with generated pkldoc websites (link:https://github.com/apple/pkl/pull/70[#70],\nlink:https://github.com/apple/pkl/pull/81[#81], link:https://github.com/apple/pkl/pull/96[#96])\n* Fixes an issue where a PklBugException produces an incorrect URL to file issues (link:https://github.com/apple/pkl/pull/73[#73])\n\n=== Miscellaneous\n\n* Documentation fixes (link:https://github.com/apple/pkl/pull/21[#21], link:https://github.com/apple/pkl/pull/29[#29], link:https://github.com/apple/pkl/pull/41[#41], link:https://github.com/apple/pkl/pull/44[#44], link:https://github.com/apple/pkl/pull/51[#51], link:https://github.com/apple/pkl/pull/57[#57], link:https://github.com/apple/pkl/pull/60[#60], link:https://github.com/apple/pkl/pull/64[#64], link:https://github.com/apple/pkl/pull/68[#68], link:https://github.com/apple/pkl/pull/74[#74], link:https://github.com/apple/pkl/pull/77[#77], link:https://github.com/apple/pkl/pull/78[#78], link:https://github.com/apple/pkl/pull/82[#82], link:https://github.com/apple/pkl/pull/84[#84], link:https://github.com/apple/pkl/pull/86[#86], link:https://github.com/apple/pkl/pull/89[#89], link:https://github.com/apple/pkl/pull/91[#91], link:https://github.com/apple/pkl/pull/104[#104])\n* Build script improvements (https://github.com/apple/pkl/pull/53[#53], link:https://github.com/apple/pkl/pull/83[#83])\n\n=== Contributors ❤️\n\nThank you to all the contributors for this release!\n\n* link:https://github.com/uhooi[@uhooi]\n* link:https://github.com/mnin[@mnin]\n* link:https://github.com/TinkoLiu[@TinkoLiu]\n* link:https://github.com/shufanhao[@shufanhao]\n* link:https://github.com/pfeilbr[@pfeilbr]\n* link:https://github.com/KadoBOT[@KadoBOT]\n* link:https://github.com/KushalP[@KushalP]\n* link:https://github.com/translatenix[@translatenix]\n* link:https://github.com/Edward-Knight[@Edward-Knight]\n* link:https://github.com/jamesward[@jamesward]\n* link:https://github.com/shubhgng[@shubhgng]\n* link:https://github.com/hayashikun[@hayashikun]\n* link:https://github.com/lanzafame[@lanzafame]\n* link:https://github.com/igmrrf[@igmrrf]\n* link:https://github.com/kelvinelove[@kelvinelove]\n* link:https://github.com/lilyball[@lilyball]\n* link:https://github.com/maiph[@maiph]\n\n[[release-0.25.1]]\n== 0.25.1 (2024-02-01)\n\n=== Fixes\n\n* Fixes an issue where pkl-tools fat jar is empty.\n\n[[release-0.25.0]]\n== 0.25.0 (2024-02-01)\n\nxref:0.25.adoc[Release notes]\n"
  },
  {
    "path": "docs/modules/release-notes/pages/index.adoc",
    "content": "= Release Notes\n\nThe Pkl team aims to release a new version of Pkl in February, June, and October of each year.\n\n* xref:0.32.adoc[0.32 Release Notes]\n* xref:0.31.adoc[0.31 Release Notes]\n* xref:0.30.adoc[0.30 Release Notes]\n* xref:0.29.adoc[0.29 Release Notes]\n* xref:0.28.adoc[0.28 Release Notes]\n* xref:0.27.adoc[0.27 Release Notes]\n* xref:0.26.adoc[0.26 Release Notes]\n* xref:0.25.adoc[0.25 Release Notes]\n* xref:changelog.adoc[Changelog]\n"
  },
  {
    "path": "docs/modules/release-notes/partials/intro.adoc",
    "content": "include::ROOT:partial$component-attributes.adoc[]\n\nPkl {version} was released on {release-date}. +\n[.small]#The latest bugfix release is {version-minor}. (xref:changelog.adoc[All Versions])#\n\nThe next release ({version-next}) is scheduled for {version-next-date}.\nTo see what's coming in the future, follow the {uri-pkl-roadmap}[Pkl Roadmap].\n\nPlease send feedback and questions to https://github.com/apple/pkl/discussions[GitHub Discussions], or submit an issue on https://github.com/apple/pkl/issues/new[GitHub]. +\n\n[small]#Pkl is hosted on https://github.com/apple/pkl[GitHub].\nTo get started, follow xref:pkl-cli:index.adoc#installation[Installation].#\n"
  },
  {
    "path": "docs/modules/release-notes/template.adoc",
    "content": "= Pkl XXX Release Notes\n:version: XXX (e.g., 0.9)\n:version-minor: XXX (e.g., 0.9.0)\n:release-date: XXX (e.g., July 11, 2018)\n:version-next: XXX (e.g., 0.10)\n:version-next-date: XXX (e.g., July 2018)\n\ninclude::partial$intro.adoc[]\n\n== Highlights [small]#💖#\n\nNews you don't want to miss.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Noteworthy [small]#🎶#\n\nReady when you need them.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Breaking Changes [small]#💔#\n\nThings to watch out for when upgrading.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Work In Progress [small]#🚆#\n\nThey missed the train but deserve a mention.\n\n.XXX\n[%collapsible]\n====\nXXX\n====\n\n== Contributors [small]#🙏#\n\nWe would like to thank the contributors to this release (in alphabetical order):\n\n* XXX\n"
  },
  {
    "path": "docs/modules/style-guide/pages/index.adoc",
    "content": "= Pkl Style Guide\n:icons: font\n:source-highlighter: highlight.js\n:pkl-expr: pkl expression\n:pkl: pkl\n:sectnums:\n\nThis document serves as the Pkl team's recommended coding standard for the Pkl configuration language.\n\n== Files\n\n=== Filename\n\nUse the `.pkl` extension for all files.\n\nFollow these rules for casing the file's name:\n\n[cols=\"1,3,1\"]\n|===\n| Casing | Description | Example\n| PascalCase\n| It is designed to be used as a template, or used as a class (i.e. imported and instantiated).\n| `K8sResource.pkl`\n| camelCase\n| It is designed to be used as a value.\n| `myDeployment.pkl`\n| kebab-case\n| It is designed to be used as a CLI tool.\n| `do-convert.pkl`\n|===\n\n*Exception*: If a file is meant to render into a static configuration file, the filename should match the target file's name without the extension.\nFor example, `config.pkl` turns into `config.yml`.\n\n*Exception*: The `PklProject` file cannot have any extension.\n\n=== File Encoding\n\nEncode all files using UTF-8.\n\n== Module Structure\n\n=== Header\n\nSeparate each section of the module header by one blank line.\n\nA module header consists of the following clauses, each of which is optional:\n\n- Module clause\n- `amends` or `extends` clause\n- Import clauses\n\n.module.pkl\n[source%parsed,{pkl}]\n----\nmodule com.example.Foo // <1>\n\nextends \"Bar.pkl\" // <2>\n\nimport \"baz.pkl\" // <3>\nimport \"Buz.pkl\" // <3>\n----\n<1> Module clause\n<2> `extends` clause\n<3> Import clause\n\n==== Module name\n\nMatch the name of the module with the name of the file.\n\n.MyModule.pkl\n[source%tested,{pkl}]\n----\nmodule MyModule\n\n----\n\nIf a module is meant to be published, add a module clause, `@ModuleInfo` annotation, and doc comments.\n\nModules that do not get published anywhere may omit a module clause.\n\n.MyModule.pkl\n[source%tested,{pkl}]\n----\n/// Used for some type of purpose. <1>\n@ModuleInfo { minPklVersion = \"0.24.0\" } // <2>\nmodule MyModule // <3>\n\n----\n<1> Doc comments\n<2> `@ModuleInfo` annotation\n<3> Module clause\n\n==== `amends` vs. `extends` clause\n\nA module that doesn't add new properties shouldn't use the `extends` clause.\n\n==== Imports\n\nSort imports sections using https://en.wikipedia.org/wiki/Natural_sort_order[natural sorting] by their module URI.\nRelative path and package imports should be in their own section, separated by a newline.\nThere should be no unused imports.\n\n[source%parsed,{pkl}]\n----\nimport \"modulepath:/foo.pkl\"\nimport \"package://example.com/mypackage@1.0.0#/foo.pkl\"\n\nimport \"@mypackage/baz.pkl\"\n\nimport \".../my/file/bar2.pkl\"\nimport \".../my/file/bar11.pkl\"\n----\n\n=== Module body\n\nWithin a module body, define members in this order:\n\n1. Properties\n2. Methods\n3. Classes and type aliases\n4. The amended xref:language-reference:index.adoc#in-language[output] property.\n\n*Exception*: local members can be close to their usage.\n\n*Exception*: functions meant to be a class constructor can be next to the class declaration.\n\n.constructor.pkl\n[source%tested,{pkl}]\n----\nfunction MyClass(_name: String): MyClass = new { name = _name }\n\nclass MyClass {\n  name: String\n}\n----\n\n=== Module URIs\n\nIf possible, use xref:language-reference:index.adoc#triple-dot-module-uris[triple-dot Module URIs] to reference ancestor modules\ninstead of multiple `../`.\n\n.good.pkl\n[source%parsed,{pkl}]\n----\namends \".../ancestor.pkl\"\n\nimport \".../ancestor2.pkl\"\n----\n\n.bad.pkl\n[source%parsed,{pkl}]\n----\namends \"../../../ancestor.pkl\"\n\nimport \"../../../ancestor2.pkl\"\n----\n\n== Objects\n\n=== Member spacing\n\nObject members (properties, elements, and entries) should be separated by at most one blank line.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nfoo = \"bar\"\n\nbaz = \"buz\"\n----\n\n.good.pkl\n[source%tested,{pkl}]\n----\nfoo = \"bar\"\nbaz = \"buz\"\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nfoo = \"bar\"\n\n\nbaz = \"buz\"\n----\n\nToo many lines separate `foo` and `baz`.\n\n=== Overridden properties\n\nProperties that override an existing property shouldn't have doc comments nor type annotations,\nunless the type is intentionally overridden via `extends`.\n\n[source%tested,{pkl}]\n----\namends \"myOtherModule.pkl\"\n\nfoo = \"bar\"\n----\n\n=== New property definitions\n\nEach property definition should have a type annotation and <<doc-comment,doc comment>>.\nSuccessive definitions should be separated by a blank line.\n\n.good.pkl\n[source%parsed,{pkl}]\n----\n/// Denotes something.\nmyFoo: String\n\n/// Something else\nmyOtherFoo: String\n----\n\n.bad.pkl\n[source%parsed,{pkl}]\n----\n/// Denotes something.\nmyFoo: String\n/// Something else\nmyOtherFoo: String\n----\n\n=== Objects with `new`\n\nWhen initializing a `Typed` object using `new`, omit the type.\nFor example, use `new {}` instead of `new Foo {}`.\n\nThis rule does not apply when initializing a property to a subtype of the property's declared type.\n\n.good.pkl\n[source%parsed,{pkl}]\n----\nmyFoo: Foo = new { foo = \"bar\" }\n----\n\n.good.pkl\n[source%parsed,{pkl}]\n----\nopen class Foo {}\nclass Bar extends Foo {}\n\nfoo: Foo = new Bar {}\n----\n\nThis is okay because this is meaning to initialize `Bar` instead of `Foo`.\n\n.bad.pkl\n[source%parsed,{pkl}]\n----\nmyFoo1: Foo = new Foo { foo = \"bar\" } // <1>\n\nmyFoo2 = new Foo { foo = \"bar\" } // <2>\n----\n<1> Unnecessary `new Foo { ... }`\n<2> Unless amending/extending a module where `myFoo2` is already defined, `myFoo2` is effectively the `unknown` type, i.e. `myFoo2: unknown`.\n\n== Comments\n\nUse doc comments to convey information to users of a module.\nUse line comments or block comments to convey implementation concerns to authors of a module, or to comment out code.\n\n[[doc-comment]]\n=== Doc comments\n\nDoc comments should start with a one sentence summary paragraph, followed by additional paragraphs if necessary.\nStart new sentences on their own line.\n\n[source%parsed,{pkl}]\n----\n/// The time allotted for eating lunch.\n///\n/// Note:\n/// * Hamburgers typically take longer to eat than salad.\n/// * Pizza gets prepared per-order.\n///\n/// Orders must be placed on-prem.\n/// See <https://cafeteria.com> for more details.\nlunchHours: Duration\n----\n\n=== Line comments\n\nIf a comment relates to a property definition, place it after the property's doc comments.\nAdd a single space after `//`.\n\n.good.pkl\n[source%parsed,{pkl}]\n----\n/// Designates whether it is zebra party time.\n// TODO: Add constraints here?\npartyTime: Boolean\n----\n\nA line comment may also be placed at the end of a line, as long as the line doesn't exceed 100 characters.\n\n.good.pkl\n[source%tested,{pkl}]\n----\n/// Designates whether it is zebra party time.\npartyTime: Boolean // TODO: Add constraints here?\n----\n\n=== Block comments\n\nA single-line block comment should have a single space after `+++/*+++` and before `+++*/+++`.\n\n.good.pkl\n[source%tested,{pkl}]\n----\n/* Let's have a zebra party */\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\n/*Let's have a zebra party*/\n----\n\n== Classes\n\n=== Class names\n\nName classes in PascalCase.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nclass ZebraParty {}\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nclass zebraParty {}\n----\n\n== Strings\n\n=== Custom String Delimiters\n\nUse xref:language-reference:index.adoc#custom-string-delimiters[custom string delimiters] to avoid the need for string escaping.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nmyString = #\"foo \\ bar \\ baz\"#\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nmyString = \"foo \\\\ bar \\\\ baz\"\n----\n\nNOTE: Sometimes, using custom string delimiters makes source code harder to read. For example, the `+\\#+` literal reads better using escapes (`\"\\\\#\"`) than using custom string delimiters (`+##\"\\#\"##+`).\n\n=== Interpolation\n\nPrefer interpolation to string concatenation.\n\n.good.pkl\n[source%parsed,{pkl}]\n----\ngreeting = \"Hello, \\(name)\"\n----\n\n.bad.pkl\n[source%parsed,{pkl}]\n----\ngreeting = \"Hello, \" + name\n----\n\n== Formatting\n\n=== Line width\n\nLines shouldn't exceed 100 characters.\n\n*Exceptions:*\n\n1. String literals\n2. Code snippets within doc comments\n\n=== Indentation\n\nUse two spaces per indentation level.\n\n==== Members within braces\n\nMembers within braces should be indented one level deeper than their parents.\n\n[source%tested,{pkl}]\n----\nfoo {\n  bar {\n    baz = \"hi\"\n  }\n}\n----\n\n==== Assignment operator (`=`)\n\nAn assignee that starts after a newline should be indented.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nfoo =\n  \"foo\"\n\nbar =\n  new {\n    baz = \"baz\"\n    biz = \"biz\"\n  }\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nfoo =\n\"foo\"\n\nbar =\nnew {\n  baz = \"baz\"\n  biz = \"biz\"\n}\n----\n\nAn assignee that starts on the same line should not be indented.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nfoo = new {\n  baz = \"baz\"\n  biz = \"biz\"\n}\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nfoo = new {\n    baz = \"baz\"\n    biz = \"biz\"\n  }\n----\n\n==== `if` and `let` expressions\n\n`if` and `let` bodies that start on their own line should be indented.\nChild bodies may also be inline, and the `else` branch of `if` expressions may be inline of `if`.\n\n.good.pkl\n[source%parsed,{pkl-expr}]\n----\nif (bar)\n  bar\nelse\n  foo\n----\n\n.good.pkl\n[source%parsed,{pkl-expr}]\n----\nif (bar) bar else foo\n----\n\n.good.pkl\n[source%parsed,{pkl-expr}]\n----\nlet (foo = \"bar\")\n  foo.toUpperCase()\n----\n\n.good.pkl\n[source%parsed,{pkl-expr}]\n----\nlet (foo = \"bar\") foo.toUpperCase()\n----\n\n.bad.pkl\n[source%parsed,{pkl-expr}]\n----\nif (bar)\nbar\nelse\nfoo\n----\n\n.bad.pkl\n[source%parsed,{pkl-expr}]\n----\nlet (foo = \"bar\")\nfoo.toUpperCase()\n----\n\n*Exception*: A nested `if` expression within the `else` branch should have the same indentation level as its parent, and start on the same line as the parent `else` keyword.\n\n.good.pkl\n[source%parsed,{pkl-expr}]\n----\nif (bar)\n  bar\nelse if (baz)\n  baz\nelse\n  foo\n----\n\n.bad.pkl\n[source%parsed,{pkl-expr}]\n----\nif (bar)\n  bar\nelse\n  if (baz)\n    baz\n  else\n    foo\n----\n\n==== Multiline chained method calls\n\nIndent successive multiline chained method calls.\n\n[source%parsed,{pkl-expr}]\n----\nfoo()\n  .bar()\n  .baz()\n  .biz()\n----\n\n==== Multiline binary operators\n\nPlace operators after the newline, and indent successive lines to the same level.\n\n.good.pkl\n[source%parsed,{pkl}]\n----\nfoo = bar\n  |> baz\n  |> biz\n\nmyNum = 1\n  + 2\n  + 3\n  + 4\n----\n\n.bad.pkl\n[source%parsed,{pkl}]\n----\nfoo = bar |>\n  baz |>\n  biz\n\nmyNum = 1 +\n  2 +\n  3 +\n  4\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nfoo = bar\n|> baz\n|> biz\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nfoo = bar\n  |> baz\n    |> biz\n----\n\n*Exception*: the minus operator must come before the newline, because otherwise it is parsed as a unary minus.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nmyNum = 1 -\n  2 -\n  3 -\n  4\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nmyNum = 1\n  - 2\n  - 3\n  - 4\n----\n\n=== Spaces\n\nAdd a space:\n\n[source%parsed,{pkl}]\n----\namends \"Foo.pkl\" // <1>\n\nres1 { \"foo\" } // <2>\nres2 = 1 + 2 // <3>\nres3 = res2 as Number // <3>\nres4 = List(1, 2, 3) // <4>\nres5 = if (foo) bar else baz // <5>\n\ntypealias Foo = \"foo\" | \"bar\" | \"baz\" // <6>\n----\n<1> After keywords\n<2> Before and after braces\n<3> Around infix operators\n<4> After a comma\n<5> Before opening parentheses in control operators (`if`, `for`, `when` are control operators)\n<6> Before and after the pipe symbol (`|`)\n\n=== Object bodies\n\n==== Single line\n\nAn object body may be a single line if it only consists of primitive elements, or if it contains two or fewer members.\nOtherwise, split them into multiple lines.\n\nSeparate each member of a single line object with a semicolon and a space.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nres1 = new { bar = \"bar\"; baz = \"baz\" }\nres2 = new { 1; 2; 3; 4; 5; 6 }\n----\n\n.bad.pkl\n[source%parsed,{pkl}]\n----\nres1 = new { bar = \"bar\"; baz = \"baz\"; biz = \"biz\"; } // <1>\n\nres2 = new { 1 2 3 4 5 6 } // <2>\n----\n\n<1> Too many members and trailing `;`\n<2> No semicolon\n\n==== Multiline\n\nMultiline objects should have their members separated by at least one line break and at most one blank line.\n\n.good.pkl\n[source%tested,{pkl}]\n----\nres {\n  foo = \"foo\"\n  bar = \"bar\"\n}\n\nres2 {\n  [\"foo\"] = \"foo\"\n  [\"bar\"] = \"bar\"\n}\n\nres3 {\n  \"foo\"\n  \"bar\"\n}\n----\n\n.good.pkl\n[source%tested,{pkl}]\n----\nres {\n  foo = \"foo\"\n\n  bar = \"bar\"\n}\n\nres2 {\n  [\"foo\"] = \"foo\"\n\n  [\"bar\"] = \"bar\"\n}\n\nres3 {\n  \"foo\"\n\n  \"bar\"\n}\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nres {\n  foo = \"foo\"\n\n\n  bar = \"bar\" // <1>\n}\n\nres2 {\n  [\"foo\"] = \"foo\"\n\n\n  [\"bar\"] = \"bar\" // <1>\n}\n\nres3 {\n  \"foo\"\n\n\n  \"bar\" // <1>\n}\n\nres4 {\n  foo = \"foo\"; bar = \"bar\" // <2>\n}\n----\n<1> Too many blank lines between members\n<2> No line break separating members\n\nPut the opening brace on the same line.\n\n.good.pkl\n\n[source%tested,{pkl}]\n----\nres {\n  foo = \"foo\"\n  bar = \"bar\"\n}\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nres\n{\n  foo = \"foo\"\n  bar = \"bar\"\n}\n----\n\n== Programming Practices\n\n=== Prefer `for` generators\n\nWhen programmatically creating elements and entries, prefer\nxref:language-reference:index.adoc#for-generators[for generators] over using the collection API.\nUsing for generators preserves xref:language-reference:index.adoc#late-binding[late binding].\n\n.good.pkl\n[source%tested,{pkl}]\n----\nnumbers {\n  1\n  2\n  3\n  4\n}\n\nsquares {\n  for (num in numbers) {\n    num ** 2\n  }\n}\n----\n\n.bad.pkl\n[source%tested,{pkl}]\n----\nnumbers {\n  1\n  2\n  3\n  4\n}\n\nsquares = numbers.toList().map((num) -> num ** 2).toListing()\n----\n"
  },
  {
    "path": "docs/nav.adoc",
    "content": "* xref:introduction:index.adoc[Introduction]\n** xref:introduction:use-cases.adoc[Use Cases]\n** xref:introduction:concepts.adoc[Concepts]\n** xref:introduction:comparison.adoc[Comparison]\n\n* xref:pkl-cli:index.adoc#installation[Installation]\n\n* xref:language-tutorial:index.adoc[Tutorial]\n** xref:language-tutorial:01_basic_config.adoc[Basic Configuration]\n** xref:language-tutorial:02_filling_out_a_template.adoc[Filling out a Template]\n** xref:language-tutorial:03_writing_a_template.adoc[Writing a Template]\n\n* xref:ROOT:language.adoc[Language]\n** xref:language-reference:index.adoc[Language Reference]\n** xref:ROOT:standard-library.adoc[Standard Library]\n** xref:ROOT:language-bindings.adoc[Language Bindings]\n*** xref:java-binding:index.adoc[Java]\n**** xref:java-binding:codegen.adoc[Code Generator]\n**** xref:pkl-core:index.adoc[pkl-core Library]\n**** xref:java-binding:pkl-config-java.adoc[pkl-config-java Library]\n*** xref:kotlin-binding:index.adoc[Kotlin]\n**** xref:kotlin-binding:codegen.adoc[Code Generator]\n**** xref:kotlin-binding:pkl-config-kotlin.adoc[pkl-config-kotlin Library]\n*** xref:swift:ROOT:index.adoc[Swift]\n*** xref:go:ROOT:index.adoc[Go]\n*** xref:bindings-specification:index.adoc[Specification]\n**** xref:bindings-specification:message-passing-api.adoc[Message Passing API]\n**** xref:bindings-specification:binary-encoding.adoc[Pkl Binary Encoding]\n\n* xref:ROOT:tools.adoc[Tools]\n** xref:pkl-cli:index.adoc[CLI]\n** xref:pkl-doc:index.adoc[Pkldoc]\n** xref:pkl-gradle:index.adoc[Gradle Plugin]\n** Editor support\n*** xref:intellij:ROOT:index.adoc[IntelliJ]\n*** xref:vscode:ROOT:index.adoc[VSCode]\n*** xref:neovim:ROOT:index.adoc[Neovim]\n\n* xref:ROOT:examples.adoc[Examples]\n\n* xref:ROOT:evolution-and-roadmap.adoc[Evolution and Roadmap]\n\n* xref:release-notes:index.adoc[Release Notes]\n** xref:release-notes:0.32.adoc[0.32 Release Notes]\n** xref:release-notes:0.31.adoc[0.31 Release Notes]\n** xref:release-notes:0.30.adoc[0.30 Release Notes]\n** xref:release-notes:0.29.adoc[0.29 Release Notes]\n** xref:release-notes:0.28.adoc[0.28 Release Notes]\n** xref:release-notes:0.27.adoc[0.27 Release Notes]\n** xref:release-notes:0.26.adoc[0.26 Release Notes]\n** xref:release-notes:0.25.adoc[0.25 Release Notes]\n** xref:release-notes:changelog.adoc[Changelog]\n\n"
  },
  {
    "path": "docs/src/test/kotlin/DocSnippetTests.kt",
    "content": "import org.junit.platform.commons.annotation.Testable\nimport org.junit.platform.engine.*\nimport org.junit.platform.engine.TestDescriptor.Type\nimport org.junit.platform.engine.discovery.ClassSelector\nimport org.junit.platform.engine.discovery.MethodSelector\nimport org.junit.platform.engine.discovery.PackageSelector\nimport org.junit.platform.engine.discovery.UniqueIdSelector\nimport org.junit.platform.engine.support.descriptor.*\nimport org.junit.platform.engine.support.hierarchical.EngineExecutionContext\nimport org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine\nimport org.junit.platform.engine.support.hierarchical.Node\nimport org.junit.platform.engine.support.hierarchical.Node.DynamicTestExecutor\nimport org.opentest4j.MultipleFailuresError\nimport org.pkl.commons.test.FileTestUtils.rootProjectDir\nimport org.pkl.core.Loggers\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.StackFrameTransformers\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.repl.ReplRequest\nimport org.pkl.core.repl.ReplResponse\nimport org.pkl.core.repl.ReplServer\nimport org.pkl.core.util.IoUtils\nimport org.pkl.core.http.HttpClient\nimport org.pkl.parser.Parser\nimport org.pkl.parser.ParserError\nimport org.pkl.parser.syntax.ClassProperty\nimport org.pkl.core.resource.ResourceReaders\nimport java.nio.file.Files\nimport kotlin.io.path.isDirectory\nimport kotlin.io.path.isRegularFile\nimport kotlin.io.path.useDirectoryEntries\n\n@Testable\nclass DocSnippetTests\n\nclass DocSnippetTestsEngine : HierarchicalTestEngine<DocSnippetTestsEngine.ExecutionContext>() {\n  private val projectDir = rootProjectDir.resolve(\"docs\")\n  private val docsDir = projectDir.resolve(\"modules\")\n\n  private companion object {\n    val headingRegex = Regex(\"\"\"(?u)^\\s*(=++)\\s*(.+)\"\"\")\n    val collapsibleBlockRegex = Regex(\"\"\"(?u)^\\s*\\[%collapsible\"\"\")\n    val codeBlockRegex = Regex(\"\"\"(?u)^\\s*\\[source(?:%(tested|parsed)(%error)?)?(?:,\\{?([a-zA-Z-_]+)}?)?\"\"\")\n    val codeBlockNameRegex = Regex(\"\"\"(?u)^\\s*\\.(.+)\"\"\")\n    val codeBlockDelimiterRegex = Regex(\"\"\"(?u)^\\s*----\"\"\")\n    val graphicsRegex = Regex(\"\\\\[small]#.+#\")\n  }\n\n  override fun getId() = \"pkl-doc-tests\"\n\n  override fun discover(\n    discoveryRequest: EngineDiscoveryRequest,\n    uniqueId: UniqueId\n  ): TestDescriptor {\n    val packageSelectors = discoveryRequest.getSelectorsByType(PackageSelector::class.java)\n    val classSelectors = discoveryRequest.getSelectorsByType(ClassSelector::class.java)\n    val methodSelectors = discoveryRequest.getSelectorsByType(MethodSelector::class.java)\n    val uniqueIdSelectors = discoveryRequest.getSelectorsByType(UniqueIdSelector::class.java)\n\n    val testClass = DocSnippetTests::class.java\n    val packageName = testClass.`package`.name\n    val className = testClass.name\n\n    if (methodSelectors.isEmpty()\n      && (packageSelectors.isEmpty() || packageSelectors.any { it.packageName == packageName })\n      && (classSelectors.isEmpty() || classSelectors.any { it.className == className })\n    ) {\n\n      val rootDescriptor = Descriptor.Path(uniqueId, docsDir.fileName.toString(), ClassSource.from(testClass), docsDir)\n      doDiscover(rootDescriptor, uniqueIdSelectors)\n      return rootDescriptor\n    }\n\n    // return empty descriptor w/o children\n    return EngineDescriptor(uniqueId, javaClass.simpleName)\n  }\n\n  override fun createExecutionContext(request: ExecutionRequest): ExecutionContext {\n    val replServer = ReplServer(\n      SecurityManagers.defaultManager,\n      HttpClient.dummyClient(),\n      Loggers.stdErr(),\n      listOf(\n        ModuleKeyFactories.standardLibrary,\n        ModuleKeyFactories.classPath(DocSnippetTests::class.java.classLoader),\n        ModuleKeyFactories.file\n      ),\n      listOf(\n        ResourceReaders.environmentVariable(),\n        ResourceReaders.externalProperty()\n      ),\n      System.getenv(),\n      emptyMap(),\n      null,\n      null,\n      null,\n      IoUtils.getCurrentWorkingDir(),\n      StackFrameTransformers.defaultTransformer,\n      false,\n      TraceMode.COMPACT,\n    )\n    return ExecutionContext(replServer)\n  }\n\n  private fun doDiscover(rootDescriptor: TestDescriptor, selectors: List<UniqueIdSelector>) {\n    fun isMatch(other: UniqueId) = selectors.isEmpty() || selectors.any {\n      it.uniqueId.hasPrefix(other) || other.hasPrefix(it.uniqueId)\n    }\n\n    docsDir.useDirectoryEntries { docsDirEntries ->\n      for (docsDirEntry in docsDirEntries) {\n        if (!docsDirEntry.isDirectory()) continue\n\n        val docsDirEntryName = docsDirEntry.fileName.toString()\n        val docsDirEntryId = rootDescriptor.uniqueId.append(\"dir\", docsDirEntryName)\n        if (!isMatch(docsDirEntryId)) continue\n\n        val docsDirEntryDescriptor = Descriptor.Path(\n          docsDirEntryId,\n          docsDirEntryName,\n          DirectorySource.from(docsDirEntry.toFile()),\n          docsDirEntry\n        )\n        rootDescriptor.addChild(docsDirEntryDescriptor)\n\n        val pagesDir = docsDirEntry.resolve(\"pages\")\n        if (!pagesDir.isDirectory()) continue\n\n        pagesDir.useDirectoryEntries { pagesDirEntries ->\n          for (pagesDirEntry in pagesDirEntries) {\n            val pagesDirEntryName = pagesDirEntry.fileName.toString()\n            val pagesDirEntryId = docsDirEntryId.append(\"file\", pagesDirEntryName)\n            if (!pagesDirEntry.isRegularFile() ||\n              !pagesDirEntryName.endsWith(\".adoc\") ||\n              !isMatch(pagesDirEntryId)\n            ) continue\n\n            val pagesDirEntryDescriptor = Descriptor.Path(\n              pagesDirEntryId,\n              pagesDirEntryName,\n              FileSource.from(pagesDirEntry.toFile()),\n              pagesDirEntry\n            )\n            docsDirEntryDescriptor.addChild(pagesDirEntryDescriptor)\n\n            parseAsciidoc(pagesDirEntryDescriptor, selectors)\n          }\n        }\n      }\n    }\n  }\n\n  @Suppress(\"DEPRECATION\")\n  private fun parseAsciidoc(docDescriptor: Descriptor.Path, selectors: List<UniqueIdSelector>) {\n    var line = \"\"\n    var prevLine = \"\"\n    var lineNum = 0\n    var codeBlockNum = 0\n    val sections = ArrayDeque<Descriptor.Section>()\n\n    Files.lines(docDescriptor.path).use { linesStream ->\n      val linesIterator = linesStream.iterator()\n\n      fun advance() {\n        prevLine = line\n        line = linesIterator.next()\n        lineNum += 1\n      }\n\n      fun addSection(title: String, newLevel: Int) {\n        while (sections.isNotEmpty() && sections.first().level >= newLevel) {\n          sections.removeFirst()\n        }\n\n        val parent = sections.firstOrNull() ?: docDescriptor\n        val normalizedTitle = title\n          .replace(\"<code>\", \"\")\n          .replace(\"</code>\", \"\")\n          .replace(graphicsRegex, \"\")\n          .trim()\n        val childSection = Descriptor.Section(\n          parent.uniqueId.append(\"section\", normalizedTitle),\n          normalizedTitle,\n          FileSource.from(docDescriptor.path.toFile(), FilePosition.from(lineNum)),\n          newLevel\n        )\n\n        sections.addFirst(childSection)\n        parent.addChild(childSection)\n        codeBlockNum = 0\n      }\n\n      nextLine@ while (linesIterator.hasNext()) {\n        advance()\n\n        val headingMatch = headingRegex.find(line)\n        if (headingMatch != null) {\n          val (markup, title) = headingMatch.destructured\n          val newLevel = markup.length\n          // ignore level 1 heading (we already have a test node for the file)\n          if (newLevel == 1) continue\n          addSection(title, newLevel)\n          continue\n        }\n\n        val collapsibleBlockMatch = collapsibleBlockRegex.find(line)\n        if (collapsibleBlockMatch != null) {\n          val blockName = codeBlockNameRegex.find(prevLine)?.groupValues?.get(1) ?: \"Details\"\n          val newLevel = 999\n          addSection(blockName, newLevel)\n          continue\n        }\n\n        val codeBlockMatch = codeBlockRegex.find(line)\n        if (codeBlockMatch != null) {\n          codeBlockNum += 1\n          val (testMode, error, language) = codeBlockMatch.destructured\n          if (testMode.isNotEmpty()) {\n            val blockName = codeBlockNameRegex.find(prevLine)?.groupValues?.get(1) ?: \"snippet$codeBlockNum\"\n            while (linesIterator.hasNext()) {\n              advance()\n              val startDelimiterMatch = codeBlockDelimiterRegex.find(line)\n              if (startDelimiterMatch != null) {\n                val jumpToLineNum = lineNum + 1\n                val builder = StringBuilder()\n                while (linesIterator.hasNext()) {\n                  advance()\n                  val endDelimiterMatch = codeBlockDelimiterRegex.find(line)\n                  if (endDelimiterMatch != null) {\n                    val section = sections.first()\n                    val snippetId = section.uniqueId.append(\"snippet\", blockName)\n                    if (selectors.isEmpty() || selectors.any { snippetId.hasPrefix(it.uniqueId) }) {\n                      section.addChild(\n                        Descriptor.Snippet(\n                          snippetId,\n                          blockName,\n                          language,\n                          FileSource.from(docDescriptor.path.toFile(), FilePosition.from(jumpToLineNum)),\n                          builder.toString(),\n                          testMode == \"parsed\",\n                          error.isNotEmpty()\n                        )\n                      )\n                    }\n                    continue@nextLine\n                  }\n                  builder.appendLine(line)\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  class ExecutionContext(val replServer: ReplServer) : EngineExecutionContext, AutoCloseable {\n    override fun close() {\n      replServer.close()\n    }\n  }\n\n  private sealed class Descriptor(\n    uniqueId: UniqueId,\n    displayName: String,\n    source: TestSource\n  ) : AbstractTestDescriptor(uniqueId, displayName, source), Node<ExecutionContext> {\n\n    class Path(\n      uniqueId: UniqueId,\n      displayName: String,\n      source: TestSource,\n      val path: java.nio.file.Path\n    ) : Descriptor(uniqueId, displayName, source) {\n\n      override fun getType() = Type.CONTAINER\n    }\n\n    class Section(\n      uniqueId: UniqueId,\n      displayName: String,\n      source: TestSource,\n      val level: Int\n    ) : Descriptor(uniqueId, displayName, source) {\n\n      override fun getType() = Type.CONTAINER\n\n      override fun before(context: ExecutionContext): ExecutionContext {\n        context.replServer.handleRequest(ReplRequest.Reset(\"reset\"))\n        return context\n      }\n    }\n\n    class Snippet(\n      uniqueId: UniqueId,\n      displayName: String,\n      private val language: String,\n      source: TestSource,\n      private val code: String,\n      private val parseOnly: Boolean,\n      private val expectError: Boolean\n    ) : Descriptor(uniqueId, displayName, source) {\n\n      override fun getType() = Type.TEST\n\n      private val parsed: org.pkl.parser.syntax.Node by lazy {\n        when (language) {\n          \"pkl\" -> Parser().parseModule(code)\n          \"pkl-expr\" -> Parser().parseExpressionInput(code)\n          else -> throw(Exception(\"Unrecognized language: $language\"))\n        }\n      }\n\n      override fun execute(context: ExecutionContext, executor: DynamicTestExecutor): ExecutionContext {\n        if (parseOnly) {\n          try {\n            parsed\n            if (expectError) {\n              throw AssertionError(\"Expected a parse error, but got none.\")\n            }\n          } catch (e: ParserError) {\n            if (!expectError) {\n              throw AssertionError(e.message)\n            }\n          }\n          return context\n        }\n\n        context.replServer.handleRequest(\n          ReplRequest.Eval(\n            \"snippet\",\n            code,\n            !expectError,\n            !expectError\n          )\n        )\n\n        val properties = parsed.children()?.filterIsInstance<ClassProperty>() ?: emptyList()\n\n        val responses = mutableListOf<ReplResponse>()\n\n        // force each property\n        for (prop in properties) {\n          responses.addAll(context.replServer.handleRequest(\n            ReplRequest.Eval(\n              \"snippet\",\n              prop.name.value,\n              false,\n              true\n            )\n          ))\n        }\n        if (expectError) {\n          if (responses.dropLast(1).any { it !is ReplResponse.EvalSuccess } ||\n            responses.last() !is ReplResponse.EvalError) {\n            throw AssertionError(\n              \"Expected %error snippet to fail at the end, but got the following REPL responses:\\n\\n\" +\n                  responses.joinToString(\"\\n\\n\") { it.message })\n          }\n\n          return context\n        }\n\n        val badResponses = responses.filter { it !is ReplResponse.EvalSuccess }\n        if (badResponses.isNotEmpty()) {\n          throw MultipleFailuresError(null, badResponses.map { AssertionError(it.message) })\n        }\n\n        return context\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "docs/src/test/resources/META-INF/services/org.junit.platform.engine.TestEngine",
    "content": "DocSnippetTestsEngine"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions] # ordered alphabetically\nassertj = \"3.+\"\nchecksumPlugin = \"1.4.0\"\nclikt = \"5.+\"\ncommonMark = \"0.+\"\ndownloadTaskPlugin = \"5.6.0\"\ngeantyref = \"1.+\"\ngoogleJavaFormat = \"1.25.2\"\n# must not use `+` because used in download URL\n# 23.1.x requires JDK 20+\ngraalVm = \"25.0.0\"\n#noinspection UnusedVersionCatalogEntry\ngraalVmJdkVersion = \"25.0.0\"\n# slightly hacky but convenient place so we remember to update the checksum\n#noinspection UnusedVersionCatalogEntry\ngraalVmSha256-macos-x64 = \"04278cf867d040e29dc71dd7727793f0ea67eb72adce8a35d04b87b57906778d\"\n#noinspection UnusedVersionCatalogEntry\ngraalVmSha256-macos-aarch64 = \"c446d5aaeda98660a4c14049d299e9fba72105a007df89f19d27cf3979d37158\"\n#noinspection UnusedVersionCatalogEntry\ngraalVmSha256-linux-x64 = \"1862f2ce97387a303cae4c512cb21baf36fafd2457c3cbbc10d87db94b89d3dd\"\n#noinspection UnusedVersionCatalogEntry\ngraalVmSha256-linux-aarch64 = \"6c3c8b7617006c5d174d9cf7d357ccfb4bae77a4df1294ee28084fcb6eea8921\"\n#noinspection UnusedVersionCatalogEntry\ngraalVmSha256-windows-x64 = \"33ef1d186b5c1e95465fcc97e637bc26e72d5f2250a8615b9c5d667ed5c17fd0\"\nideaExtPlugin = \"1.1.9\"\nintellijPlugin = \"2.10.1\"\nintellij = \"2025.2.3\"\njavaPoet = \"0.+\"\njavaxInject = \"1\"\njansi = \"2.+\"\njimfs = \"1.+\"\n# later versions don't work with native image\n# (at least not without additional configuration; tested with 3.25.1 and 3.27.1)\njline = \"3.23.0\"\njmh = \"1.+\"\njmhPlugin = \"0.7.2\"\njsr305 = \"3.+\"\njunit = \"5.+\"\njunitPlatform = \"1.+\"\nkotlin = \"2.2.20\"\n# 1.7+ generates much more verbose code\nkotlinPoet = \"1.6.+\"\nkotlinxHtml = \"0.11.0\"\nkotlinxSerialization = \"1.8.0\"\nkotlinxCoroutines = \"1.+\"\nktfmt = \"0.53\"\n# replaces nuValidator's log4j dependency\n# something related to log4j-1.2-api is apparently broken in 2.17.2\nlog4j = \"2.17.1\"\nmsgpack = \"0.9.8\"\nnexusPublishPlugin = \"2.0.0\"\nnuValidator = \"20.+\"\npaguro = \"3.+\"\nshadowPlugin = \"9.+\"\nslf4j = \"1.+\"\nsnakeYaml = \"2.+\"\nspotlessPlugin = \"6.25.0\"\nwiremock = \"3.+\"\n\n[libraries] # ordered alphabetically\nassertj = { group = \"org.assertj\", name = \"assertj-core\", version.ref = \"assertj\" }\nclikt = { group = \"com.github.ajalt.clikt\", name = \"clikt\", version.ref = \"clikt\" }\ncliktMarkdown = { group = \"com.github.ajalt.clikt\", name = \"clikt-markdown\", version.ref = \"clikt\" }\ncommonMark = { group = \"org.commonmark\", name = \"commonmark\", version.ref = \"commonMark\" }\ncommonMarkTables = { group = \"org.commonmark\", name = \"commonmark-ext-gfm-tables\", version.ref = \"commonMark\" }\ndownloadTaskPlugin = { group = \"de.undercouch\", name = \"gradle-download-task\", version.ref = \"downloadTaskPlugin\" }\ngeantyref = { group = \"io.leangen.geantyref\", name = \"geantyref\", version.ref = \"geantyref\" }\ngraalCompiler = { group = \"org.graalvm.compiler\", name = \"compiler\", version.ref = \"graalVm\" }\ngraalSdk = { group = \"org.graalvm.sdk\", name = \"graal-sdk\", version.ref = \"graalVm\" }\ngraalJs = { group = \"org.graalvm.js\", name = \"js\", version.ref = \"graalVm\" }\n#noinspection UnusedVersionCatalogEntry\nintellij = { group = \"com.jetbrains.intellij.idea\", name = \"ideaIC\", version.ref = \"intellij\" }\njavaPoet = { group = \"com.palantir.javapoet\", name = \"javapoet\", version.ref = \"javaPoet\" }\njavaxInject = { group = \"javax.inject\", name = \"javax.inject\", version.ref = \"javaxInject\" }\njansi = { group = \"org.fusesource.jansi\", name = \"jansi\", version.ref = \"jansi\" }\njimfs = { group = \"com.google.jimfs\", name = \"jimfs\", version.ref = \"jimfs\" }\njlineReader = { group = \"org.jline\", name = \"jline-reader\", version.ref = \"jline\" }\njlineTerminal = { group = \"org.jline\", name = \"jline-terminal\", version.ref = \"jline\" }\njlineTerminalJansi = { group = \"org.jline\", name = \"jline-terminal-jansi\", version.ref = \"jline\" }\njsr305 = { group = \"com.google.code.findbugs\", name = \"jsr305\", version.ref = \"jsr305\" }\njunitApi = { group = \"org.junit.jupiter\", name = \"junit-jupiter-api\", version.ref = \"junit\" }\njunitEngine = { group = \"org.junit.jupiter\", name = \"junit-jupiter-engine\", version.ref = \"junit\" }\njunitParams = { group = \"org.junit.jupiter\", name = \"junit-jupiter-params\", version.ref = \"junit\" }\njunitLauncher = { group = \"org.junit.platform\", name = \"junit-platform-launcher\", version.ref = \"junitPlatform\" }\nkotlinPlugin = { group = \"org.jetbrains.kotlin\", name = \"kotlin-gradle-plugin\", version.ref = \"kotlin\" }\nkotlinPoet = { group = \"com.squareup\", name = \"kotlinpoet\", version.ref = \"kotlinPoet\" }\nkotlinReflect = { group = \"org.jetbrains.kotlin\", name = \"kotlin-reflect\", version.ref = \"kotlin\" }\nkotlinScripting = { group = \"org.jetbrains.kotlin\", name = \"kotlin-scripting-jsr223\", version.ref = \"kotlin\" }\nkotlinStdLib = { group = \"org.jetbrains.kotlin\", name = \"kotlin-stdlib-jdk8\", version.ref = \"kotlin\" }\nkotlinxHtml = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-html-jvm\", version.ref = \"kotlinxHtml\" }\nkotlinxSerializationJson = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-serialization-json\", version.ref = \"kotlinxSerialization\" }\nkotlinxCoroutinesCore = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-coroutines-core\", version.ref = \"kotlinxCoroutines\" }\n#noinspection UnusedVersionCatalogEntry\nlog4j12Api = { group = \"org.apache.logging.log4j\", name = \"log4j-1.2-api\", version.ref = \"log4j\" }\nmsgpack = { group = \"org.msgpack\", name = \"msgpack-core\", version.ref = \"msgpack\" }\n#noinspection UnusedVersionCatalogEntry\nnuValidator = { group = \"nu.validator\", name = \"validator\", version.ref = \"nuValidator\" }\n# to be replaced with https://github.com/usethesource/capsule or https://github.com/lacuna/bifurcan\npaguro = { group = \"org.organicdesign\", name = \"Paguro\", version.ref = \"paguro\" }\npklConfigJavaAll025 = { group = \"org.pkl-lang\", name = \"pkl-config-java-all\", version = \"0.25.0\" }\nshadowPlugin = { group = \"com.gradleup.shadow\", name = \"com.gradleup.shadow.gradle.plugin\", version.ref = \"shadowPlugin\" }\nslf4jApi = { group = \"org.slf4j\", name = \"slf4j-api\", version.ref = \"slf4j\" }\nslf4jSimple = { group = \"org.slf4j\", name = \"slf4j-simple\", version.ref = \"slf4j\" }\nsnakeYaml = { group = \"org.snakeyaml\", name = \"snakeyaml-engine\", version.ref = \"snakeYaml\" }\nspotlessPlugin = { group = \"com.diffplug.spotless\", name = \"spotless-plugin-gradle\", version.ref = \"spotlessPlugin\"}\nsvm = { group = \"org.graalvm.nativeimage\", name = \"svm\", version.ref = \"graalVm\" }\ntruffleApi = { group = \"org.graalvm.truffle\", name = \"truffle-api\", version.ref = \"graalVm\" }\ntruffleDslProcessor = { group = \"org.graalvm.truffle\", name = \"truffle-dsl-processor\", version.ref = \"graalVm\" }\ntruffleSvm = { group = \"org.graalvm.nativeimage\", name = \"truffle-runtime-svm\", version.ref = \"graalVm\" }\ntruffleRuntime = { group = \"org.graalvm.truffle\", name = \"truffle-runtime\", version.ref = \"graalVm\" }\nwiremock = { group = \"org.wiremock\", name = \"wiremock\", version.ref = \"wiremock\" }\n\n[plugins] # ordered alphabetically\nchecksum = { id = \"org.gradle.crypto.checksum\", version.ref = \"checksumPlugin\" }\nideaExt = { id = \"org.jetbrains.gradle.plugin.idea-ext\", version.ref = \"ideaExtPlugin\" }\njmh = { id = \"me.champeau.jmh\", version.ref = \"jmhPlugin\" }\nkotlinxSerialization = { id = \"org.jetbrains.kotlin.plugin.serialization\", version.ref = \"kotlin\" }\nnexusPublish = { id = \"io.github.gradle-nexus.publish-plugin\", version.ref = \"nexusPublishPlugin\" }\nshadow = { id = \"com.gradleup.shadow\", version.ref = \"shadowPlugin\" }\nintellij = { id = \"org.jetbrains.intellij.platform\", version.ref = \"intellijPlugin\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionSha256Sum=a17ddd85a26b6a7f5ddb71ff8b05fc5104c0202c6e64782429790c933686c806\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.1.0-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# suppress inspection \"UnusedProperty\" for whole file\n\ngroup=org.pkl-lang\nversion=0.32.0\n\n# google-java-format requires jdk.compiler exports\norg.gradle.jvmargs= \\\n  -XX:+UseParallelGC \\\n  -Dfile.encoding=UTF-8 \\\n  --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \\\n  --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \\\n  --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \\\n  --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \\\n  --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\n\norg.gradle.parallel=true\norg.gradle.caching=true\nkotlin.stdlib.default.dependency=false\nkotlin.daemon.jvmargs=-XX:+UseParallelGC\n#org.gradle.workers.max=1\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=\"\\\\\\\"\\\\\\\"\"\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "jbang-catalog.json",
    "content": "{\n  \"catalogs\": {},\n  \"aliases\": {\n    \"pkl\": {\n      \"script-ref\": \"org.pkl-lang:pkl-cli-java:0.31.0\",\n      \"java-agents\": []\n    },\n    \"pkl-codegen-java\": {\n      \"script-ref\": \"org.pkl-lang:pkl-codegen-java:0.31.0\",\n      \"java-agents\": []\n    },\n    \"pkl-codegen-kotlin\": {\n      \"script-ref\": \"org.pkl-lang:pkl-codegen-kotlin:0.31.0\",\n      \"java-agents\": []\n    }\n  },\n  \"templates\": {}\n}\n"
  },
  {
    "path": "pkl-bom/pkl-bom.gradle.kts",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  `java-platform`\n  `maven-publish`\n  signing\n}\n\ndescription = \"Pkl BOM that includes all modules\"\n\ndependencies {\n  constraints {\n    api(projects.pklCli)\n    api(projects.pklCodegenJava)\n    api(projects.pklCodegenKotlin)\n    // Use explicit coordinates for pkl-config-java to avoid ambiguity with fatJar publication\n    api(\"${project.group}:pkl-config-java:${project.version}\")\n    api(\"${project.group}:pkl-config-java-all:${project.version}\")\n    api(projects.pklConfigKotlin)\n    api(projects.pklCore)\n    api(projects.pklDoc)\n    api(projects.pklExecutor)\n    api(projects.pklFormatter)\n    api(projects.pklGradle)\n    api(projects.pklParser)\n    api(projects.pklTools)\n  }\n}\n\npublishing {\n  publications {\n    create<MavenPublication>(\"library\") {\n      from(components[\"javaPlatform\"])\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-bom\")\n        description.set(\"Bill of Materials for managing Pkl dependency versions\")\n      }\n    }\n  }\n}\n\nconfigurePklPomMetadata()\n\nconfigurePomValidation()\n\nconfigurePklSigning()\n"
  },
  {
    "path": "pkl-cli/README.adoc",
    "content": "Command-line interface for Pkl.\n\nThe CLI provides the following tools:\n\n* Batch evaluator\n* REPL\n"
  },
  {
    "path": "pkl-cli/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.ethlo.time:itu:1.10.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.fasterxml.jackson.core:jackson-annotations:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.fasterxml.jackson.core:jackson-core:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.fasterxml.jackson.core:jackson-databind:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.fasterxml.jackson:jackson-bom:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.github.jknack:handlebars-helpers:4.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.jknack:handlebars:4.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.36.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.guava:failureaccess:1.0.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.guava:guava:33.4.8-jre=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.j2objc:j2objc-annotations:3.0.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.jayway.jsonpath:json-path:2.9.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.networknt:json-schema-validator:1.5.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncommons-fileupload:commons-fileupload:1.6.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncommons-io:commons-io:2.19.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=runtimeClasspath,testRuntimeClasspath\nnet.javacrumbs.json-unit:json-unit-core:2.40.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.minidev:accessors-smart:2.5.0=testRuntimeClasspath\nnet.minidev:json-smart:2.5.0=testRuntimeClasspath\nnet.sf.jopt-simple:jopt-simple:5.0.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apache.httpcomponents.client5:httpclient5:5.5=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apache.httpcomponents.core5:httpcore5-h2:5.3.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apache.httpcomponents.core5:httpcore5:5.3.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.eclipse.jetty.http2:http2-common:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty.http2:http2-hpack:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty.http2:http2-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-alpn-client:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-alpn-java-client:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-alpn-java-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-alpn-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-bom:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-client:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-http:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-io:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-proxy:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-security:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-server:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-servlet:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-servlets:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-util:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-webapp:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-xml:11.0.24=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.fusesource.jansi:jansi:2.4.2=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.polyglot:polyglot:25.0.0=compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=compileClasspath,compileOnlyDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:jniutils:25.0.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=compileClasspath,compileOnlyDependenciesMetadata,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.truffle:truffle-compiler:25.0.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.truffle:truffle-runtime:25.0.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.hamcrest:hamcrest-core:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.hamcrest:hamcrest:2.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,nativeImageClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,nativeImageClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown:0.7.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.jline:jline-native:3.23.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jline:jline-reader:3.23.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jline:jline-terminal-jansi:3.23.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jline:jline-terminal:3.23.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jspecify:jspecify:1.0.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.slf4j:slf4j-api:2.0.17=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.wiremock:wiremock:3.13.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.xmlunit:xmlunit-core:2.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.xmlunit:xmlunit-legacy:2.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.xmlunit:xmlunit-placeholders:2.10.2=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.yaml:snakeyaml:2.4=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=annotationProcessor,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,shadow,signatures,sourcesJar,stagedAlpineLinuxAmd64Executable,stagedLinuxAarch64Executable,stagedLinuxAmd64Executable,stagedMacAarch64Executable,stagedMacAmd64Executable,stagedWindowsAmd64Executable,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-cli/pkl-cli.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.io.ByteArrayOutputStream\nimport java.io.OutputStream\nimport org.gradle.kotlin.dsl.support.serviceOf\n\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n  pklJavaExecutable\n  pklNativeExecutable\n  `maven-publish`\n\n  // already on build script class path (see buildSrc/build.gradle.kts),\n  // hence must only specify plugin ID here\n  id(libs.plugins.shadow.get().pluginId)\n\n  alias(libs.plugins.checksum)\n}\n\n// make Java executable available to other subprojects\nval javaExecutableConfiguration: Configuration = configurations.create(\"javaExecutable\")\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-cli\")\n        description.set(\"Pkl CLI Java library.\")\n      }\n    }\n  }\n}\n\ndependencies {\n  implementation(libs.truffleRuntime)\n  compileOnly(libs.graalSdk)\n\n  // CliEvaluator exposes PClass\n  api(projects.pklCore)\n  // CliEvaluatorOptions exposes CliBaseOptions\n  api(projects.pklCommonsCli)\n\n  implementation(projects.pklCommons)\n  implementation(libs.jansi)\n  implementation(libs.jlineReader)\n  implementation(libs.jlineTerminal)\n  implementation(libs.jlineTerminalJansi)\n  implementation(projects.pklServer)\n  implementation(projects.pklFormatter)\n  implementation(libs.clikt)\n\n  testImplementation(projects.pklCommonsTest)\n  testImplementation(libs.wiremock)\n}\n\ntasks.jar {\n  manifest.attributes +=\n    mapOf(\"Main-Class\" to \"org.pkl.cli.Main\", \"Add-Exports\" to buildInfo.jpmsExportsForJarManifest)\n}\n\ntasks.javadoc { enabled = false }\n\ntasks.shadowJar {\n  archiveFileName.set(\"jpkl\")\n\n  exclude(\"META-INF/maven/**\")\n  exclude(\"META-INF/upgrade/**\")\n\n  exclude(\"module-info.*\")\n}\n\nval testJavaExecutable by\n  tasks.registering(Test::class) {\n    testClassesDirs = tasks.test.get().testClassesDirs\n    classpath =\n      // compiled test classes\n      sourceSets.test.get().output +\n        // java executable\n        tasks.javaExecutable.get().outputs.files +\n        // test-only dependencies\n        // (test dependencies that are also main dependencies must already be contained in java\n        // executable;\n        // to verify that, we don't want to include them here)\n        (configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())\n  }\n\n// Setup `testJavaExecutable` tasks for multi-JDK testing.\nval testJavaExecutableOnOtherJdks = buildInfo.multiJdkTestingWith(testJavaExecutable)\n\n// Prepare a run of the fat JAR, optionally with a specific Java launcher.\nprivate fun setupJavaExecutableRun(\n  name: String,\n  args: Array<String>,\n  launcher: Provider<JavaLauncher>? = null,\n  configurator: Exec.() -> Unit = {},\n) =\n  tasks.register(name, Exec::class) {\n    dependsOn(tasks.javaExecutable)\n    val outputFile = layout.buildDirectory.file(name) // dummy output to satisfy up-to-date check\n    outputs.file(outputFile)\n\n    executable =\n      when (launcher) {\n        null -> \"java\"\n        else -> launcher.get().executablePath.asFile.absolutePath\n      }\n    standardOutput = OutputStream.nullOutputStream()\n\n    args(\"-jar\", tasks.javaExecutable.get().outputs.files.singleFile.toString(), *args)\n\n    doFirst { outputFile.get().asFile.delete() }\n\n    doLast { outputFile.get().asFile.writeText(\"OK\") }\n\n    configurator()\n  }\n\nval evalTestFlags = arrayOf(\"eval\", \"-x\", \"1 + 1\", \"pkl:base\")\n\nfun Exec.useRootDirAndSuppressOutput() {\n  workingDir = rootProject.layout.projectDirectory.asFile\n  standardOutput = ByteArrayOutputStream() // we only care that this exec doesn't fail\n}\n\n// 0.28 Preparing for JDK21 toolchains revealed that `testStartJavaExecutable` may pass, even though\n// the evaluator fails. To catch this, we eval a simple expression using the fat jar.\nval testEvalJavaExecutable by\n  setupJavaExecutableRun(\"testEvalJavaExecutable\", evalTestFlags) { useRootDirAndSuppressOutput() }\n\n// Run the same evaluator tests on all configured JDK test versions.\nval testEvalJavaExecutableOnOtherJdks =\n  buildInfo.jdkTestRange.map { jdkTarget ->\n    setupJavaExecutableRun(\n      \"testEvalJavaExecutableJdk${jdkTarget.asInt()}\",\n      evalTestFlags,\n      serviceOf<JavaToolchainService>().launcherFor { languageVersion = jdkTarget },\n    ) {\n      useRootDirAndSuppressOutput()\n    }\n  }\n\ntasks.check {\n  dependsOn(\n    testJavaExecutable,\n    testJavaExecutableOnOtherJdks,\n    testEvalJavaExecutable,\n    testEvalJavaExecutableOnOtherJdks,\n  )\n}\n\ntasks.checkNative {\n  dependsOn(\":pkl-core:checkNative\")\n  dependsOn(\":pkl-server:checkNative\")\n}\n\nexecutable {\n  name = \"pkl\"\n  javaName = \"jpkl\"\n  documentationName = \"Pkl CLI\"\n  publicationName = \"pkl-cli\"\n  javaPublicationName = \"pkl-cli-java\"\n  mainClass = \"org.pkl.cli.Main\"\n  website = \"https://pkl-lang.org/main/current/pkl-cli/index.html\"\n}\n\n// make Java executable available to other subprojects\n// (we don't do the same for native executables because we don't want tasks assemble/build to build\n// them)\nartifacts {\n  add(\"javaExecutable\", tasks.javaExecutable.map { it.outputs.files.singleFile }) {\n    name = \"pkl-cli-java\"\n    classifier = null\n    extension = \"jar\"\n    builtBy(tasks.javaExecutable)\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliCommandRunner.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.completion.CompletionCommand\nimport com.github.ajalt.clikt.core.*\nimport com.github.ajalt.clikt.parameters.arguments.*\nimport com.github.ajalt.clikt.parameters.options.*\nimport com.github.ajalt.clikt.parameters.types.int\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.exists\nimport kotlin.io.path.isDirectory\nimport kotlin.io.path.writeBytes\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.cli.commands.installCommonOptions\nimport org.pkl.commons.currentWorkingDir\nimport org.pkl.core.Closeables\nimport org.pkl.core.CommandSpec\nimport org.pkl.core.EvaluatorBuilder\nimport org.pkl.core.FileOutput\nimport org.pkl.core.ModuleSource.uri\nimport org.pkl.core.PklBugException\nimport org.pkl.core.PklException\nimport org.pkl.core.util.IoUtils\n\nclass CliCommandRunner\n@JvmOverloads\nconstructor(\n  private val options: CliBaseOptions,\n  private val reservedFlagNames: Set<String>,\n  private val reservedFlagShortNames: Set<String>,\n  private val args: List<String>,\n  private val outputStream: OutputStream = System.out,\n  private val errStream: OutputStream = System.err,\n) : CliCommand(options) {\n\n  override fun doRun() {\n    val builder = evaluatorBuilder()\n    try {\n      evalCmd(builder)\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n  }\n\n  private fun evalCmd(builder: EvaluatorBuilder) {\n    val evaluator = builder.build()\n    evaluator.use {\n      evaluator.evaluateCommand(\n        uri(resolvedSourceModules.first()),\n        reservedFlagNames,\n        reservedFlagShortNames,\n      ) { spec ->\n        try {\n          val root = SynthesizedRunCommand(spec, this, options.sourceModules.first().toString())\n          root.installCommonOptions(includeVersion = false)\n          root.subcommands(\n            CompletionCommand(\n              name = \"shell-completion\",\n              help = \"Generate a completion script for the given shell\",\n            )\n          )\n          root.parse(args)\n        } catch (e: PklException) {\n          throw e\n        } catch (e: Exception) {\n          throw e.message?.let { PklException(it, e) } ?: PklException(e)\n        }\n      }\n    }\n  }\n\n  /** Renders the comand's `output.bytes`, writing it to the standard output stream. */\n  fun writeOutput(outputBytes: ByteArray) {\n    if (outputBytes.isEmpty()) return\n    outputStream.write(outputBytes)\n    outputStream.flush()\n  }\n\n  /**\n   * Renders the command's `output.files`, writing each entry as a file.\n   *\n   * File paths are written to the standard error stream.\n   *\n   * Unlike CliEvaluator, command outputs write relative to --working-dir and may write files\n   * anywhere in the filesystem. This is intentionally less sandboxed than `pkl eval` and directly\n   * targets the capabilities of CLI tools written in general purpose languages. Pkl commands should\n   * therefore be treated as untrusted code the way that any other CLI tool would be.\n   */\n  fun writeMultipleFileOutput(outputFiles: Map<String, FileOutput>) {\n    if (outputFiles.isEmpty()) return\n\n    val writtenFiles = mutableMapOf<Path, String>()\n    val outputDir = options.normalizedWorkingDir\n    if (outputDir.exists() && !outputDir.isDirectory()) {\n      throw CliException(\"Output path `$outputDir` exists and is not a directory.\")\n    }\n    for ((pathSpec, fileOutput) in outputFiles) {\n      checkPathSpec(pathSpec)\n      val resolvedPath = outputDir.resolve(pathSpec).normalize()\n      val realPath = if (resolvedPath.exists()) resolvedPath.toRealPath() else resolvedPath\n      val previousOutput = writtenFiles[realPath]\n      if (previousOutput != null) {\n        throw CliException(\n          \"Output file conflict: `output.files` entries `\\\"${previousOutput}\\\"` and `\\\"$pathSpec\\\"` resolve to the same file path `$realPath`.\"\n        )\n      }\n      if (realPath.isDirectory()) {\n        throw CliException(\n          \"Output file conflict: `output.files` entry `\\\"$pathSpec\\\"` resolves to file path `$realPath`, which is a directory.\"\n        )\n      }\n      writtenFiles[realPath] = pathSpec\n      realPath.createParentDirectories()\n      realPath.writeBytes(fileOutput.bytes)\n      val displayPath =\n        if (Path.of(pathSpec).isAbsolute) pathSpec\n        else IoUtils.relativize(resolvedPath, currentWorkingDir).toString()\n      errStream.writeText(displayPath + IoUtils.getLineSeparator())\n      errStream.flush()\n    }\n  }\n\n  class SynthesizedRunCommand(\n    private val spec: CommandSpec,\n    private val runner: CliCommandRunner,\n    name: String? = null,\n  ) : CliktCommand(name = name ?: spec.name) {\n    init {\n      spec.options.forEach { opt ->\n        when (opt) {\n          is CommandSpec.Flag ->\n            registerOption(\n              option(\n                  names = opt.names,\n                  help = opt.helpText ?: \"\",\n                  metavar = opt.metavar,\n                  hidden = opt.hidden,\n                  completionCandidates = opt.completionCandidates?.toClikt(),\n                )\n                .convert {\n                  try {\n                    opt.transformEach.apply(it, workingDirUri)\n                  } catch (e: CommandSpec.Option.BadValue) {\n                    fail(e.message!!)\n                  } catch (_: CommandSpec.Option.MissingOption) {\n                    throw MissingOption(option)\n                  }\n                }\n                .transformAll(opt.defaultValue, opt.showAsRequired) {\n                  try {\n                    opt.transformAll.apply(it, workingDirUri)\n                  } catch (e: CommandSpec.Option.BadValue) {\n                    fail(e.message!!)\n                  } catch (_: CommandSpec.Option.MissingOption) {\n                    throw MissingOption(option)\n                  }\n                }\n            )\n          is CommandSpec.BooleanFlag ->\n            registerOption(\n              if (opt.defaultValue != null)\n                option(names = opt.names, help = opt.helpText ?: \"\", hidden = opt.hidden)\n                  .flag(\"--no-${opt.name}\", default = opt.defaultValue!!)\n              else\n                option(names = opt.names, help = opt.helpText ?: \"\", hidden = opt.hidden)\n                  .nullableFlag(\"--no-${opt.name}\")\n            )\n          is CommandSpec.CountedFlag ->\n            registerOption(\n              option(names = opt.names, help = opt.helpText ?: \"\", hidden = opt.hidden)\n                .int()\n                .transformValues(0..0) { it.lastOrNull() ?: 1 }\n                .transformAll { it.sum().toLong() }\n            )\n          is CommandSpec.Argument ->\n            registerArgument(\n              argument(\n                  opt.name,\n                  opt.helpText ?: \"\",\n                  completionCandidates = opt.completionCandidates?.toClikt(),\n                )\n                .convert {\n                  try {\n                    opt.transformEach.apply(it, workingDirUri)\n                  } catch (e: CommandSpec.Option.BadValue) {\n                    fail(e.message!!)\n                  } catch (_: CommandSpec.Option.MissingOption) {\n                    throw MissingArgument(argument)\n                  }\n                }\n                .transformAll(if (opt.repeated) -1 else 1, !opt.repeated) {\n                  try {\n                    opt.transformAll.apply(it, workingDirUri)\n                  } catch (e: CommandSpec.Option.BadValue) {\n                    fail(e.message!!)\n                  } catch (_: CommandSpec.Option.MissingOption) {\n                    throw MissingArgument(argument)\n                  }\n                }\n            )\n        }\n      }\n      spec.subcommands.forEach { subcommands(SynthesizedRunCommand(it, runner)) }\n    }\n\n    val workingDirUri: URI by lazy { runner.options.normalizedWorkingDir.toUri() }\n\n    override val invokeWithoutSubcommand = true\n\n    override val hiddenFromHelp: Boolean = spec.hidden\n\n    override fun help(context: Context): String = spec.helpText ?: \"\"\n\n    override fun run() {\n      if (currentContext.invokedSubcommand is CompletionCommand) return\n\n      val opts =\n        registeredOptions()\n          .mapNotNull {\n            val opt = it as? OptionWithValues<*, *, *> ?: return@mapNotNull null\n            return@mapNotNull if (it.names.contains(\"--help\")) null\n            else it.names.last().trimStart('-') to opt.value\n          }\n          .toMap() +\n          registeredArguments()\n            .mapNotNull { it as? ArgumentDelegate<*> }\n            .associateBy({ it.name }, { it.value })\n\n      val state = spec.apply.apply(opts, currentContext.obj as CommandSpec.State?)\n      currentContext.obj = state\n\n      if (currentContext.invokedSubcommand != null) return\n      if (spec.subcommands.isNotEmpty() && spec.noOp) {\n        throw PrintHelpMessage(currentContext, true, 1)\n      }\n\n      val result = state.evaluate()\n      runner.writeOutput(result.outputBytes)\n      runner.writeMultipleFileOutput(result.outputFiles)\n    }\n  }\n}\n\nfun CommandSpec.CompletionCandidates.toClikt(): CompletionCandidates =\n  when (this) {\n    CommandSpec.CompletionCandidates.PATH -> CompletionCandidates.Path\n    is CommandSpec.CompletionCandidates.Fixed -> CompletionCandidates.Fixed(values)\n    else -> throw PklBugException.unreachableCode()\n  }\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.File\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.nio.file.StandardOpenOption\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.exists\nimport kotlin.io.path.isDirectory\nimport kotlin.io.path.writeBytes\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.currentWorkingDir\nimport org.pkl.commons.writeString\nimport org.pkl.core.Closeables\nimport org.pkl.core.Evaluator\nimport org.pkl.core.EvaluatorBuilder\nimport org.pkl.core.ModuleSource\nimport org.pkl.core.PklException\nimport org.pkl.core.module.ModulePathResolver\nimport org.pkl.core.runtime.ModuleResolver\nimport org.pkl.core.runtime.VmException\nimport org.pkl.core.runtime.VmUtils\nimport org.pkl.core.util.IoUtils\n\nprivate data class OutputFile(val pathSpec: String, val moduleUri: URI)\n\n/** API equivalent of the Pkl command-line evaluator. */\nclass CliEvaluator\n@JvmOverloads\nconstructor(\n  private val options: CliEvaluatorOptions,\n  // use System.{in,out}() rather than System.console()\n  // because the latter returns null when output is sent through a unix pipe\n  private val inputStream: InputStream = System.`in`,\n  private val outputStream: OutputStream = System.out,\n) : CliCommand(options.base) {\n  /**\n   * Output files for the modules to be evaluated. Returns `null` if `options.outputPath` is `null`\n   * or if `options.multipleFileOutputPath` is not `null`. Multiple modules may be mapped to the\n   * same output file, in which case their outputs are concatenated with\n   * [CliEvaluatorOptions.moduleOutputSeparator].\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  val outputFiles: Set<File>? by lazy {\n    fileOutputPaths?.values?.mapTo(mutableSetOf(), Path::toFile)\n  }\n\n  /**\n   * Output directories for the modules to be evaluated. Returns `null` if\n   * `options.multipleFileOutputPath` is `null`.\n   */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  val outputDirectories: Set<File>? by lazy {\n    directoryOutputPaths?.values?.mapTo(mutableSetOf(), Path::toFile)\n  }\n\n  /** The file output path */\n  val fileOutputPaths: Map<URI, Path>? by lazy {\n    if (options.multipleFileOutputPath != null) return@lazy null\n    options.outputPath?.let { resolveOutputPaths(it) }\n  }\n\n  private val directoryOutputPaths: Map<URI, Path>? by lazy {\n    options.multipleFileOutputPath?.let { resolveOutputPaths(it) }\n  }\n\n  /**\n   * Evaluates source modules according to [options].\n   *\n   * If [CliEvaluatorOptions.outputPath] is set, each module's `output.bytes` is written to the\n   * module's [output file][outputFiles].\n   *\n   * If [CliEvaluatorOptions.multipleFileOutputPath] is set, each module's `output.files` are\n   * written to the module's [output directory][outputDirectories]. Otherwise, each module's\n   * `output.bytes` is written to [outputStream] (which defaults to standard out).\n   *\n   * Throws [CliException] in case of an error.\n   */\n  override fun doRun() {\n    val builder = evaluatorBuilder()\n    try {\n      if (options.multipleFileOutputPath != null) {\n        writeMultipleFileOutput(builder)\n      } else {\n        writeOutput(builder)\n      }\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n  }\n\n  private fun resolveOutputPaths(pathStr: String): Map<URI, Path> {\n    val workingDir = options.base.normalizedWorkingDir\n    // used just to resolve the `%{moduleName}` placeholder\n    val moduleResolver = ModuleResolver(moduleKeyFactories(ModulePathResolver.empty()))\n\n    return resolvedSourceModules.associateWith { uri ->\n      val moduleDir: String? =\n        IoUtils.toPath(uri)?.let {\n          IoUtils.relativize(it.parent, workingDir).toString().ifEmpty { \".\" }\n        }\n      val moduleKey =\n        try {\n          moduleResolver.resolve(uri)\n        } catch (e: VmException) {\n          throw e.toPklException(stackFrameTransformer, options.base.color?.hasColor() ?: false)\n        }\n      val substituted =\n        pathStr\n          .replace(\"%{moduleName}\", IoUtils.inferModuleName(moduleKey))\n          .replace(\"%{outputFormat}\", options.outputFormat ?: \"%{outputFormat}\")\n          .replace(\"%{moduleDir}\", moduleDir ?: \"%{moduleDir}\")\n      if (substituted.contains(\"%{moduleDir}\")) {\n        throw PklException(\n          \"Cannot substitute output path placeholder `%{moduleDir}` \" +\n            \"because module `$uri` does not have a file system path.\"\n        )\n      }\n      val absolutePath = workingDir.resolve(substituted).normalize()\n      absolutePath\n    }\n  }\n\n  private fun Evaluator.evalOutput(moduleSource: ModuleSource): ByteArray {\n    if (options.expression == null) {\n      return evaluateOutputBytes(moduleSource)\n    }\n    return evaluateExpressionString(moduleSource, options.expression)\n      .toByteArray(StandardCharsets.UTF_8)\n  }\n\n  /** Renders each module's `output.bytes`, writing it to the specified output file. */\n  private fun writeOutput(builder: EvaluatorBuilder) {\n    val evaluator = builder.setOutputFormat(options.outputFormat).build()\n    evaluator.use { ev ->\n      val outputFiles = fileOutputPaths\n      if (outputFiles != null) {\n        // files that we've written non-empty output to\n        // YamlRenderer produces empty output if `isStream` is true and `output.value` is empty\n        // collection\n        val writtenFiles = mutableSetOf<Path>()\n\n        for ((moduleUri, outputFile) in outputFiles) {\n          val moduleSource = toModuleSource(moduleUri, inputStream)\n          if (Files.isDirectory(outputFile)) {\n            throw CliException(\n              \"Output file `$outputFile` is a directory. \" +\n                \"Did you mean `--multiple-file-output-path`?\"\n            )\n          }\n          val output = ev.evalOutput(moduleSource)\n          outputFile.createParentDirectories()\n          if (!writtenFiles.contains(outputFile)) {\n            // write file even if output is empty to overwrite output from previous runs\n            outputFile.writeBytes(output)\n            if (output.isNotEmpty()) {\n              writtenFiles.add(outputFile)\n            }\n          } else {\n            if (output.isNotEmpty()) {\n              outputFile.writeString(\n                options.moduleOutputSeparator + '\\n',\n                Charsets.UTF_8,\n                StandardOpenOption.WRITE,\n                StandardOpenOption.APPEND,\n              )\n              outputFile.writeBytes(output, StandardOpenOption.WRITE, StandardOpenOption.APPEND)\n            }\n          }\n        }\n      } else {\n        var outputWritten = false\n        for (moduleUri in resolvedSourceModules) {\n          val moduleSource = toModuleSource(moduleUri, inputStream)\n          if (options.expression != null) {\n            val output = evaluator.evaluateExpressionString(moduleSource, options.expression)\n            if (output.isNotEmpty()) {\n              if (outputWritten) outputStream.writeLine(options.moduleOutputSeparator)\n              outputStream.writeText(output)\n              outputStream.flush()\n              outputWritten = true\n            }\n          } else {\n            val outputBytes = evaluator.evaluateOutputBytes(moduleSource)\n            if (outputBytes.isNotEmpty()) {\n              if (outputWritten) outputStream.writeLine(options.moduleOutputSeparator)\n              outputStream.write(outputBytes)\n              outputStream.flush()\n              outputWritten = true\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun toModuleSource(uri: URI, reader: InputStream) =\n    if (uri == VmUtils.REPL_TEXT_URI) {\n      ModuleSource.create(uri, reader.readAllBytes().toString(StandardCharsets.UTF_8))\n    } else {\n      ModuleSource.uri(uri)\n    }\n\n  /**\n   * Renders each module's `output.files`, writing each entry as a file into the specified output\n   * directory.\n   */\n  private fun writeMultipleFileOutput(builder: EvaluatorBuilder) {\n    val outputDirs = directoryOutputPaths!!\n    val writtenFiles = mutableMapOf<Path, OutputFile>()\n    for ((moduleUri, outputDir) in outputDirs) {\n      val evaluator = builder.setOutputFormat(options.outputFormat).build()\n      if (outputDir.exists() && !outputDir.isDirectory()) {\n        throw CliException(\"Output path `$outputDir` exists and is not a directory.\")\n      }\n      val moduleSource = toModuleSource(moduleUri, inputStream)\n      val output = evaluator.evaluateOutputFiles(moduleSource)\n      val realOutputDir = if (outputDir.exists()) outputDir.toRealPath() else outputDir\n\n      for ((pathSpec, fileOutput) in output) {\n        checkPathSpec(pathSpec)\n        val resolvedPath = realOutputDir.resolve(pathSpec).normalize()\n        val realPath = if (resolvedPath.exists()) resolvedPath.toRealPath() else resolvedPath\n        if (!realPath.startsWith(realOutputDir)) {\n          throw CliException(\n            \"Output file conflict: `output.files` entry `\\\"$pathSpec\\\"` in module `$moduleUri` resolves to file path `$realPath`, which is outside output directory `$realOutputDir`.\"\n          )\n        }\n        val previousOutput = writtenFiles[realPath]\n        if (previousOutput != null) {\n          throw CliException(\n            \"Output file conflict: `output.files` entries `\\\"${previousOutput.pathSpec}\\\"` in module `${previousOutput.moduleUri}` and `\\\"$pathSpec\\\"` in module `$moduleUri` resolve to the same file path `$realPath`.\"\n          )\n        }\n        if (realPath.isDirectory()) {\n          throw CliException(\n            \"Output file conflict: `output.files` entry `\\\"$pathSpec\\\"` in module `$moduleUri` resolves to file path `$realPath`, which is a directory.\"\n          )\n        }\n        writtenFiles[realPath] = OutputFile(pathSpec, moduleUri)\n        realPath.createParentDirectories()\n        realPath.writeBytes(fileOutput.bytes)\n        outputStream.writeText(\n          IoUtils.relativize(resolvedPath, currentWorkingDir).toString() +\n            IoUtils.getLineSeparator()\n        )\n        outputStream.flush()\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliEvaluatorOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport org.pkl.commons.cli.CliBaseOptions\n\n/** Configuration options for [CliEvaluator]. */\ndata class CliEvaluatorOptions(\n  /** Base options shared between CLI commands. */\n  val base: CliBaseOptions,\n\n  /**\n   * The file path where the output file is placed. If multiple source modules are given,\n   * placeholders can be used to map them to different output files. If multiple modules are mapped\n   * to the same output file, their outputs are concatenated. Currently, the only available\n   * concatenation strategy is to separate outputs with `---`, as in a YAML stream.\n   *\n   * The following placeholders are supported:\n   * - `%{moduleDir}` The directory path of the module, relative to the working directory. Only\n   *   available when evaluating file-based modules.\n   * - `%{moduleName}` The simple module name as inferred from the module URI. For hierarchical\n   *   URIs, this is the last path segment without file extension.\n   * - `%{outputFormat}` The requested output format. Only available if `outputFormat` is non-null.\n   *\n   * If [CliBaseOptions.workingDir] corresponds to a file system path, relative output paths are\n   * resolved against that path. Otherwise, relative output paths are not allowed.\n   *\n   * If `null`, output is written to the console.\n   */\n  val outputPath: String? = null,\n\n  /**\n   * The output format to generate.\n   *\n   * The default output renderer for a module supports the following formats:\n   * - `\"json\"`\n   * - `\"jsonnet\"`\n   * - `\"pcf\"` (default)\n   * - `\"plist\"`\n   * - `\"properties\"`\n   * - `\"textproto\"`\n   * - `\"xml\"`\n   * - `\"yaml\"`\n   */\n  val outputFormat: String? = null,\n\n  /** The separator to use when multiple module outputs are written to the same location. */\n  val moduleOutputSeparator: String = \"---\",\n\n  /**\n   * The directory where a module's output files are placed.\n   *\n   * Setting this option causes Pkl to evaluate `output.files` instead of `output.text`, and write\n   * files using each entry's key as the file path relative to [multipleFileOutputPath], and each\n   * value's `text` property as the file's contents.\n   */\n  val multipleFileOutputPath: String? = null,\n\n  /**\n   * The expression to evaluate within the module.\n   *\n   * If set, the said expression is evaluated under the context of the enclosing module.\n   *\n   * If unset, the module's `output.bytes` property is evaluated.\n   */\n  val expression: String? = null,\n) {\n\n  companion object {\n    val defaults: CliEvaluatorOptions = CliEvaluatorOptions(CliBaseOptions())\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliFormatterCommand.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.IOException\nimport java.io.Writer\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.util.stream.Stream\nimport kotlin.io.path.extension\nimport kotlin.io.path.isDirectory\nimport kotlin.io.path.name\nimport kotlin.io.path.writeText\nimport kotlin.math.max\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.cli.CliTestException\nimport org.pkl.core.util.IoUtils\nimport org.pkl.formatter.Formatter\nimport org.pkl.formatter.GrammarVersion\nimport org.pkl.parser.GenericParserError\nimport org.pkl.parser.ParserError\n\nclass CliFormatterCommand\n@JvmOverloads\nconstructor(\n  private val paths: List<Path>,\n  private val grammarVersion: GrammarVersion,\n  private val overwrite: Boolean,\n  private val diffNameOnly: Boolean,\n  private val silent: Boolean,\n  private val consoleWriter: Writer = System.out.writer(),\n  private val errWriter: Writer = System.err.writer(),\n) : CliCommand(CliBaseOptions()) {\n  private fun format(contents: String): String {\n    return Formatter().format(contents, grammarVersion)\n  }\n\n  private fun writeErrLine(error: String) {\n    errWriter.write(error)\n    errWriter.appendLine()\n    errWriter.flush()\n  }\n\n  private fun writeLine(message: String) {\n    if (silent) return\n    consoleWriter.write(message)\n    consoleWriter.appendLine()\n    consoleWriter.flush()\n  }\n\n  private fun allPaths(): Stream<Path> {\n    return paths.distinct().stream().flatMap { path ->\n      when {\n        path.toString() == \"-\" -> Stream.of(path)\n        path.isDirectory() ->\n          Files.walk(path)\n            .filter { it.extension == \"pkl\" || it.name == \"PklProject\" }\n            .map { it.normalize() }\n        else -> Stream.of(path.normalize())\n      }\n    }\n  }\n\n  override fun doRun() {\n    val status = Status(SUCCESS)\n\n    handlePaths(status)\n\n    when (status.status) {\n      FORMATTING_VIOLATION -> {\n        // using CliTestException instead of CliException because we want full control on how to\n        // print errors\n        throw CliTestException(\"\", status.status)\n      }\n      ERROR -> {\n        if (!silent) {\n          writeErrLine(\"An error occurred during formatting.\")\n        }\n        throw CliTestException(\"\", status.status)\n      }\n    }\n  }\n\n  private fun handlePaths(status: Status) {\n    for (path in allPaths()) {\n      val pathStr = path.toString()\n      try {\n        val contents =\n          when {\n            pathStr == \"-\" -> IoUtils.readString(System.`in`)\n            else -> Files.readString(path)\n          }\n        if (pathStr == \"-\" && overwrite) {\n          throw CliException(\"Cannot write to stdin\", ERROR)\n        }\n\n        val formatted = format(contents)\n        if (contents != formatted) {\n          if (diffNameOnly || overwrite) {\n            // if `--diff-name-only` or `-w` is specified, only write file names\n            writeLine(pathStr)\n          }\n\n          if (overwrite) {\n            path.writeText(formatted, Charsets.UTF_8)\n          } else {\n            // only exit on violation for \"check\" operations, not when overwriting\n            status.update(FORMATTING_VIOLATION)\n          }\n        }\n\n        if (!diffNameOnly && !overwrite) {\n          consoleWriter.write(formatted)\n          consoleWriter.flush()\n        }\n      } catch (pe: ParserError) { // thrown by the lexer\n        writeErrLine(\"Could not format `$pathStr`: $pe\")\n        status.update(ERROR)\n      } catch (pe: GenericParserError) { // thrown by the generic parser\n        writeErrLine(\"Could not format `$pathStr`: $pe\")\n        status.update(ERROR)\n      } catch (e: IOException) {\n        writeErrLine(\"IO error while reading `$pathStr`: ${e.message}\")\n        status.update(ERROR)\n      }\n    }\n  }\n\n  companion object {\n    private const val SUCCESS = 0\n    private const val FORMATTING_VIOLATION = 11\n    private const val ERROR = 1\n\n    private class Status(var status: Int) {\n      fun update(newStatus: Int) {\n        status =\n          when {\n            status == ERROR -> status\n            newStatus == ERROR -> newStatus\n            else -> max(status, newStatus)\n          }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliImportAnalyzer.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.Writer\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.writeString\nimport org.pkl.core.Closeables\nimport org.pkl.core.ModuleSource\n\nclass CliImportAnalyzer\n@JvmOverloads\nconstructor(\n  private val options: CliImportAnalyzerOptions,\n  private val consoleWriter: Writer = System.out.writer(),\n) : CliCommand(options.base) {\n\n  override fun doRun() {\n    val rendered = render()\n    if (options.outputPath != null) {\n      options.outputPath.createParentDirectories()\n      options.outputPath.writeString(rendered)\n    } else {\n      consoleWriter.write(rendered)\n      consoleWriter.flush()\n    }\n  }\n\n  // language=pkl\n  private val sourceModule =\n    ModuleSource.text(\n      \"\"\"\n        import \"pkl:analyze\"\n\n        local importStrings = read*(\"prop:pkl.analyzeImports.**\").toMap().values.toSet()\n\n        output {\n          value = analyze.importGraph(importStrings)\n          renderer {\n            converters {\n              [Map] = (it) -> it.toMapping()\n              [Set] = (it) -> it.toListing()\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent()\n    )\n\n  private fun render(): String {\n    val builder = evaluatorBuilder().setOutputFormat(options.outputFormat)\n    try {\n      return builder\n        .apply {\n          for ((idx, sourceModule) in resolvedSourceModules.withIndex()) {\n            addExternalProperty(\"pkl.analyzeImports.$idx\", sourceModule.toString())\n          }\n        }\n        .build()\n        .use { it.evaluateOutputText(sourceModule) }\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliImportAnalyzerOptions.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\n\ndata class CliImportAnalyzerOptions(\n  /** Base options shared between CLI commands. */\n  val base: CliBaseOptions,\n\n  /** The file path where the output file is placed. */\n  val outputPath: Path? = null,\n\n  /**\n   * The output format to generate.\n   *\n   * These accept the same options as [CliEvaluatorOptions.outputFormat].\n   */\n  val outputFormat: String? = null,\n)\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliPackageDownloader.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.core.packages.PackageResolver\nimport org.pkl.core.packages.PackageUri\n\nclass CliPackageDownloader(\n  baseOptions: CliBaseOptions,\n  private val packageUris: List<PackageUri>,\n  private val noTransitive: Boolean,\n) : CliCommand(baseOptions) {\n\n  override fun doRun() {\n    if (moduleCacheDir == null) {\n      throw CliException(\"Cannot download packages because no cache directory is specified.\")\n    }\n    val packageResolver = PackageResolver.getInstance(securityManager, httpClient, moduleCacheDir)\n    val errors = mutableMapOf<PackageUri, Throwable>()\n    for (pkg in packageUris) {\n      try {\n        packageResolver.downloadPackage(pkg, pkg.checksums, noTransitive)\n      } catch (e: Throwable) {\n        errors[pkg] = e\n      }\n    }\n    when (errors.size) {\n      0 -> return\n      1 ->\n        throw CliException(\n          errors.values.single().message\n            ?: (\"An unexpected error occurred: \" + errors.values.single())\n        )\n      else ->\n        throw CliException(\n          buildString {\n            appendLine(\"Failed to download some packages.\")\n            for ((uri, error) in errors) {\n              appendLine()\n              appendLine(\"Failed to download $uri because:\")\n              appendLine(\"${error.message}\")\n            }\n          }\n        )\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliProjectCommand.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliBaseOptions.Companion.getProjectFile\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.core.module.ProjectDependenciesManager.PKL_PROJECT_FILENAME\n\nabstract class CliProjectCommand(cliOptions: CliBaseOptions, private val projectDirs: List<Path>) :\n  CliCommand(cliOptions) {\n\n  protected val normalizedProjectFiles: List<Path> by lazy {\n    if (projectDirs.isEmpty()) {\n      val projectFile =\n        cliOptions.normalizedWorkingDir.getProjectFile(cliOptions.normalizedRootDir)\n          ?: throw CliException(\n            \"No project visible to the working directory. Ensure there is a PklProject file in the workspace, or provide an explicit project directory as an argument.\"\n          )\n      return@lazy listOf(projectFile.normalize())\n    }\n    projectDirs.map(cliOptions.normalizedWorkingDir::resolve).map { dir ->\n      val projectFile = dir.resolve(PKL_PROJECT_FILENAME)\n      if (!Files.exists(projectFile)) {\n        throw CliException(\"Directory $dir does not contain a PklProject file.\")\n      }\n      projectFile.normalize()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliProjectPackager.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.Writer\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.cli.CliTestException\nimport org.pkl.commons.cli.CliTestOptions\nimport org.pkl.core.project.Project\nimport org.pkl.core.project.ProjectPackager\nimport org.pkl.core.util.ErrorMessages\n\nclass CliProjectPackager(\n  baseOptions: CliBaseOptions,\n  projectDirs: List<Path>,\n  private val testOptions: CliTestOptions,\n  private val outputPath: String,\n  private val skipPublishCheck: Boolean,\n  private val consoleWriter: Writer = System.out.writer(),\n  private val errWriter: Writer = System.err.writer(),\n) : CliProjectCommand(baseOptions, projectDirs) {\n\n  private fun runApiTests(project: Project) {\n    val apiTests = project.`package`!!.apiTests()\n    if (apiTests.isEmpty()) return\n    val normalizeApiTests = apiTests.map { project.projectDir.resolve(it).toUri() }\n    val testRunner =\n      CliTestRunner(\n        cliOptions.copy(sourceModules = normalizeApiTests, projectDir = project.projectDir),\n        testOptions = testOptions,\n        consoleWriter = consoleWriter,\n        errWriter = errWriter,\n      )\n    try {\n      testRunner.run()\n    } catch (e: CliTestException) {\n      throw CliException(ErrorMessages.create(\"packageTestsFailed\", project.`package`!!.uri()))\n    }\n  }\n\n  override fun doRun() {\n    val projects = buildList {\n      for (projectFile in normalizedProjectFiles) {\n        val project = loadProject(projectFile)\n        project.`package`\n          ?: throw CliException(\n            ErrorMessages.create(\"noPackageDefinedByProject\", project.projectFileUri)\n          )\n        runApiTests(project)\n        add(project)\n      }\n    }\n    // Require that all local projects are included\n    projects.forEach { proj ->\n      proj.dependencies.localDependencies().values.forEach { localDep ->\n        val projectDir = Path.of(localDep.projectFileUri()).parent\n        if (projects.none { it.projectDir == projectDir }) {\n          throw CliException(\n            ErrorMessages.create(\"missingProjectInPackageCommand\", proj.projectDir, projectDir)\n          )\n        }\n      }\n    }\n    ProjectPackager(\n        projects,\n        cliOptions.normalizedWorkingDir,\n        outputPath,\n        stackFrameTransformer,\n        cliOptions.color?.hasColor() ?: false,\n        securityManager,\n        httpClient,\n        skipPublishCheck,\n        consoleWriter,\n      )\n      .createPackages()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliProjectResolver.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.IOException\nimport java.io.Writer\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.core.PklException\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.module.ProjectDependenciesManager\nimport org.pkl.core.packages.PackageResolver\nimport org.pkl.core.project.ProjectDependenciesResolver\n\nclass CliProjectResolver(\n  baseOptions: CliBaseOptions,\n  projectDirs: List<Path>,\n  private val consoleWriter: Writer = System.out.writer(),\n  private val errWriter: Writer = System.err.writer(),\n) : CliProjectCommand(baseOptions, projectDirs) {\n  override fun doRun() {\n    for (projectFile in normalizedProjectFiles) {\n      val project = loadProject(projectFile)\n      val packageResolver =\n        PackageResolver.getInstance(\n          SecurityManagers.standard(\n            allowedModules,\n            allowedResources,\n            SecurityManagers.defaultTrustLevels,\n            rootDir,\n          ),\n          httpClient,\n          moduleCacheDir,\n        )\n      val dependencies = ProjectDependenciesResolver(project, packageResolver, errWriter).resolve()\n      val depsFile =\n        projectFile.parent.resolve(ProjectDependenciesManager.PKL_PROJECT_DEPS_FILENAME).toFile()\n      try {\n        depsFile.outputStream().use { dependencies.writeTo(it) }\n        consoleWriter.appendLine(depsFile.toString())\n        consoleWriter.flush()\n      } catch (e: IOException) {\n        throw PklException(\"Failed to write to $depsFile: ${e.message}\", e)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliRepl.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport org.pkl.cli.repl.Repl\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.core.Loggers\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.module.ModulePathResolver\nimport org.pkl.core.repl.ReplServer\nimport org.pkl.core.resource.ResourceReaders\n\ninternal class CliRepl(private val options: CliEvaluatorOptions) : CliCommand(options.base) {\n  override fun doRun() {\n    ModulePathResolver(modulePath).use { modulePathResolver ->\n      // TODO: send options as command\n      val server =\n        ReplServer(\n          SecurityManagers.standard(\n            allowedModules,\n            allowedResources,\n            SecurityManagers.defaultTrustLevels,\n            rootDir,\n          ),\n          httpClient,\n          Loggers.stdErr(),\n          listOf(\n            ModuleKeyFactories.standardLibrary,\n            ModuleKeyFactories.modulePath(modulePathResolver),\n          ) +\n            ModuleKeyFactories.fromServiceProviders() +\n            listOf(\n              ModuleKeyFactories.file,\n              ModuleKeyFactories.http,\n              ModuleKeyFactories.pkg,\n              ModuleKeyFactories.projectpackage,\n              ModuleKeyFactories.genericUrl,\n            ),\n          listOf(\n            ResourceReaders.environmentVariable(),\n            ResourceReaders.externalProperty(),\n            ResourceReaders.modulePath(modulePathResolver),\n            ResourceReaders.file(),\n            ResourceReaders.http(),\n            ResourceReaders.https(),\n            ResourceReaders.pkg(),\n            ResourceReaders.projectpackage(),\n          ),\n          environmentVariables,\n          externalProperties,\n          moduleCacheDir,\n          project?.dependencies,\n          options.outputFormat,\n          options.base.normalizedWorkingDir,\n          stackFrameTransformer,\n          options.base.color?.hasColor() ?: false,\n          options.base.traceMode ?: TraceMode.COMPACT,\n        )\n      Repl(options.base.normalizedWorkingDir, server, options.base.color?.hasColor() ?: false).run()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliServer.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.core.messaging.ProtocolException\nimport org.pkl.server.Server\n\nclass CliServer(options: CliBaseOptions) : CliCommand(options) {\n  override fun doRun(): Unit =\n    try {\n      val server = Server.stream(System.`in`, System.out)\n      server.use { it.start() }\n    } catch (e: ProtocolException) {\n      throw CliException(e.message!!)\n    }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/CliTestRunner.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.Writer\nimport org.pkl.commons.cli.*\nimport org.pkl.core.Closeables\nimport org.pkl.core.EvaluatorBuilder\nimport org.pkl.core.ModuleSource.uri\nimport org.pkl.core.PklException\nimport org.pkl.core.TestResults\nimport org.pkl.core.stdlib.test.report.JUnitReport\nimport org.pkl.core.stdlib.test.report.SimpleReport\nimport org.pkl.core.util.ErrorMessages\n\nclass CliTestRunner\n@JvmOverloads\nconstructor(\n  private val options: CliBaseOptions,\n  private val testOptions: CliTestOptions,\n  private val consoleWriter: Writer = System.out.writer(),\n  private val errWriter: Writer = System.err.writer(),\n) : CliCommand(options) {\n\n  override fun doRun() {\n    val builder = evaluatorBuilder()\n    try {\n      evalTest(builder)\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n  }\n\n  private fun evalTest(builder: EvaluatorBuilder) {\n    val sources =\n      resolvedSourceModules.ifEmpty { project?.tests?.map { it.toUri() } }\n        ?:\n        // keep in sync with error message thrown by clikt\n        throw CliException(\n          \"\"\"\n          Usage: pkl test [<options>] <modules>...\n          \n          Error: missing argument <modules>\n        \"\"\"\n            .trimIndent()\n        )\n\n    val evaluator = builder.build()\n    evaluator.use {\n      var failed = false\n      var isExampleWrittenFailure = true\n      val moduleNames = mutableSetOf<String>()\n      val reporter = SimpleReport(useColor)\n      val allTestResults = mutableListOf<TestResults>()\n\n      val junitDir = testOptions.junitDir\n      if (junitDir != null) {\n        junitDir.toFile().mkdirs()\n      }\n\n      for ((idx, moduleUri) in sources.withIndex()) {\n        try {\n          val results = evaluator.evaluateTest(uri(moduleUri), testOptions.overwrite)\n          allTestResults.add(results)\n          if (!failed) {\n            failed = results.failed()\n            isExampleWrittenFailure = results.isExampleWrittenFailure.and(isExampleWrittenFailure)\n          }\n          reporter.report(results, consoleWriter)\n          if (sources.size > 1 && idx != sources.size - 1) {\n            consoleWriter.append('\\n')\n          }\n          consoleWriter.flush()\n          if (junitDir != null) {\n            val moduleName = \"${results.moduleName}.xml\"\n            if (moduleName in moduleNames) {\n              throw RuntimeException(\n                \"\"\"\n                  Cannot generate JUnit report for $moduleUri.\n                  A report with the same name was already generated.\n                  \n                  To fix, provide a different name for this module by adding a module header.\n                \"\"\"\n                  .trimIndent()\n              )\n            }\n            moduleNames += moduleName\n\n            if (!testOptions.junitAggregateReports) {\n              JUnitReport().reportToPath(results, junitDir.resolve(moduleName))\n            }\n          }\n        } catch (ex: Exception) {\n          errWriter.appendLine(\"Error evaluating module ${moduleUri.path}:\")\n          errWriter.write(ex.message ?: \"\")\n          if (ex !is PklException) {\n            errWriter.write(ex.stackTraceToString())\n          }\n          if (moduleUri != sources.last()) {\n            errWriter.appendLine()\n          }\n          errWriter.flush()\n          failed = true\n        }\n      }\n      if (testOptions.junitAggregateReports && junitDir != null) {\n        val fileName = \"${testOptions.junitAggregateSuiteName}.xml\"\n        JUnitReport(testOptions.junitAggregateSuiteName)\n          .summarizeToPath(allTestResults, junitDir.resolve(fileName))\n      }\n      consoleWriter.append('\\n')\n      reporter.summarize(allTestResults, consoleWriter)\n      consoleWriter.flush()\n      if (failed) {\n        val exitCode = if (isExampleWrittenFailure) 10 else 1\n        throw CliTestException(ErrorMessages.create(\"testsFailed\"), exitCode)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/Main.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:JvmName(\"Main\")\n\npackage org.pkl.cli\n\nimport com.github.ajalt.clikt.core.main\nimport org.pkl.cli.commands.*\nimport org.pkl.commons.cli.cliMain\n\n/** Main method of the Pkl CLI (command-line evaluator and REPL). */\ninternal fun main(args: Array<String>) {\n  cliMain { RootCommand().main(args) }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/OutputUtils.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.OutputStream\nimport org.pkl.commons.cli.CliException\nimport org.pkl.core.util.IoUtils\n\nfun checkPathSpec(pathSpec: String) {\n  val illegal = pathSpec.indexOfFirst { IoUtils.isReservedFilenameChar(it) && it != '/' }\n  if (illegal == -1) {\n    return\n  }\n  throw CliException(\"Path spec `$pathSpec` contains illegal character `${pathSpec[illegal]}`.\")\n}\n\nfun OutputStream.writeText(text: String) = write(text.toByteArray())\n\nfun OutputStream.writeLine(text: String) {\n  writeText(text)\n  writeText(\"\\n\")\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/AnalyzeCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.core.Context\nimport com.github.ajalt.clikt.core.subcommands\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\nimport org.pkl.cli.CliImportAnalyzer\nimport org.pkl.cli.CliImportAnalyzerOptions\nimport org.pkl.commons.cli.commands.ModulesCommand\nimport org.pkl.commons.cli.commands.NoOpCommand\nimport org.pkl.commons.cli.commands.single\n\nclass AnalyzeCommand : NoOpCommand(name = \"analyze\") {\n  override fun help(context: Context) = \"Commands related to static analysis\"\n\n  override fun helpEpilog(context: Context) = \"For more information, visit $helpLink\"\n\n  init {\n    subcommands(AnalyzeImportsCommand())\n  }\n}\n\nclass AnalyzeImportsCommand : ModulesCommand(name = \"imports\", helpLink = helpLink) {\n  override val helpString = \"Prints the graph of modules imported by the input module(s).\"\n\n  private val outputPath: Path? by\n    option(\n        names = arrayOf(\"-o\", \"--output-path\"),\n        metavar = \"path\",\n        help = \"File path where the output file is placed.\",\n      )\n      .path()\n      .single()\n\n  override fun run() {\n    val options =\n      CliImportAnalyzerOptions(\n        base = baseOptions.baseOptions(modules, projectOptions),\n        outputFormat = baseOptions.format,\n        outputPath = outputPath,\n      )\n    CliImportAnalyzer(options).run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/DownloadPackageCommand.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.convert\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport org.pkl.cli.CliPackageDownloader\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.ProjectOptions\nimport org.pkl.commons.cli.commands.single\nimport org.pkl.core.packages.PackageUri\n\nclass DownloadPackageCommand : BaseCommand(name = \"download-package\", helpLink = helpLink) {\n  override val helpString =\n    \"\"\"\n  Download package(s)\n  \n  This command downloads the specified packages to the cache directory.\n  If the package already exists in the cache directory, this command is a no-op.\n  \n  Examples:\n  \n  ```\n  # Download two packages\n  $ pkl download-package package://example.com/package1@1.0.0 package://example.com/package2@1.0.0 \n  ```\n  \"\"\"\n      .trimIndent()\n\n  private val projectOptions by ProjectOptions()\n\n  private val packageUris: List<PackageUri> by\n    argument(\"package\", \"The package URIs to download\")\n      .convert { PackageUri(it) }\n      .multiple(required = true)\n\n  private val noTransitive: Boolean by\n    option(\n        names = arrayOf(\"--no-transitive\"),\n        help = \"Skip downloading transitive dependencies of a package\",\n      )\n      .single()\n      .flag()\n\n  override fun run() {\n    CliPackageDownloader(\n        baseOptions.baseOptions(emptyList(), projectOptions),\n        packageUris,\n        noTransitive,\n      )\n      .run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/EvalCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.parameters.options.default\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.options.validate\nimport org.pkl.cli.CliEvaluator\nimport org.pkl.cli.CliEvaluatorOptions\nimport org.pkl.commons.cli.commands.ModulesCommand\nimport org.pkl.commons.cli.commands.single\n\nclass EvalCommand : ModulesCommand(name = \"eval\", helpLink = helpLink) {\n\n  override val helpString = \"Render pkl module(s)\"\n\n  private val outputPath: String? by\n    option(\n        names = arrayOf(\"-o\", \"--output-path\"),\n        metavar = \"path\",\n        help = \"File path where the output file is placed.\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .single()\n\n  private val moduleOutputSeparator: String by\n    option(\n        names = arrayOf(\"--module-output-separator\"),\n        metavar = \"string\",\n        help =\n          \"Separator to use when multiple module outputs are written to the same file. (default: ---)\",\n      )\n      .single()\n      .default(\"---\")\n\n  private val expression: String? by\n    option(\n        names = arrayOf(\"-x\", \"--expression\"),\n        metavar = \"expression\",\n        help = \"Expression to be evaluated within the module.\",\n      )\n      .single()\n\n  private val multipleFileOutputPath: String? by\n    option(\n        names = arrayOf(\"-m\", \"--multiple-file-output-path\"),\n        metavar = \"path\",\n        help = \"Directory where a module's multiple file output is placed.\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .single()\n      .validate {\n        if (outputPath != null || expression != null) {\n          fail(\"Option is mutually exclusive with -o, --output-path and -x, --expression.\")\n        }\n      }\n\n  // hidden option used by the native tests\n  private val testMode: Boolean by\n    option(names = arrayOf(\"--test-mode\"), help = \"Internal test mode\", hidden = true).flag()\n\n  private val powerAssertionsEnabled: Boolean by\n    option(\n        names = arrayOf(\"--power-assertions\"),\n        help = \"Enable power assertions for detailed assertion failure messages.\",\n      )\n      .flag(\"--no-power-assertions\", default = true, defaultForHelp = \"enabled\")\n\n  override fun run() {\n    val options =\n      CliEvaluatorOptions(\n        base =\n          baseOptions.baseOptions(\n            modules,\n            projectOptions,\n            testMode = testMode,\n            powerAssertionsEnabled = powerAssertionsEnabled,\n          ),\n        outputPath = outputPath,\n        outputFormat = baseOptions.format,\n        moduleOutputSeparator = moduleOutputSeparator,\n        multipleFileOutputPath = multipleFileOutputPath,\n        expression = expression ?: CliEvaluatorOptions.defaults.expression,\n      )\n    CliEvaluator(options).run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/FormatterCommand.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.core.CliktCommand\nimport com.github.ajalt.clikt.core.Context\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.options.default\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.types.enum\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\nimport org.pkl.cli.CliFormatterCommand\nimport org.pkl.formatter.GrammarVersion\n\nclass FormatterCommand : CliktCommand(name = \"format\") {\n  override fun help(context: Context) =\n    \"\"\"\n    Format or check formatting of Pkl files.\n    \n    Examples:\n    \n    ```\n    # Overwrite all Pkl files inside `my/folder/`, recursively.\n    $ pkl format -w my/folder/\n    \n    # Check formatting of all files, printing filenames with formatting violations to stdout.\n    # Exit with exit code `11` if formatting violations were found.\n    $ pkl format --diff-name-only my/folder/\n    \n    # Format Pkl code from stdin.\n    $ echo \"foo = 1\" | pkl format -\n    ```\n  \"\"\"\n      .trimIndent()\n\n  override fun helpEpilog(context: Context) = \"For more information, visit $helpLink\"\n\n  val paths: List<Path> by\n    argument(name = \"paths\", help = \"Files or directory to check. Use `-` to read from stdin.\")\n      .path(mustExist = false, canBeDir = true)\n      .multiple()\n\n  val grammarVersion: GrammarVersion by\n    option(\n        names = arrayOf(\"--grammar-version\"),\n        help =\n          \"\"\"\n          The grammar compatibility version to use.$NEWLINE\n          ${GrammarVersion.entries.joinToString(\"$NEWLINE\", prefix = \"  \") {\n            val default = if (it == GrammarVersion.latest()) \" `(default)`\" else \"\"\n            \"`${it.version}`: ${it.versionSpan}$default\"\n          }}\n          \"\"\"\n            .trimIndent(),\n      )\n      .enum<GrammarVersion> { \"${it.version}\" }\n      .default(GrammarVersion.latest())\n\n  val overwrite: Boolean by\n    option(\n        names = arrayOf(\"-w\", \"--write\"),\n        help = \"Format files in place, overwriting them. Implies `---diff-name-only`.\",\n      )\n      .flag(default = false)\n\n  val diffNameOnly: Boolean by\n    option(\n        names = arrayOf(\"--diff-name-only\"),\n        help = \"Write the path of files with formatting violations to stdout.\",\n      )\n      .flag(default = false)\n\n  val silent: Boolean by\n    option(\n        names = arrayOf(\"-s\", \"--silent\"),\n        help = \"Don't write to stdout or stderr. Mutually exclusive with `--diff-name-only`.\",\n      )\n      .flag(default = false)\n\n  override fun run() {\n    CliFormatterCommand(paths, grammarVersion, overwrite, diffNameOnly, silent).run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/ProjectCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.core.Context\nimport com.github.ajalt.clikt.core.subcommands\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport com.github.ajalt.clikt.parameters.options.default\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\nimport org.pkl.cli.CliProjectPackager\nimport org.pkl.cli.CliProjectResolver\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.NoOpCommand\nimport org.pkl.commons.cli.commands.TestOptions\nimport org.pkl.commons.cli.commands.single\n\nclass ProjectCommand : NoOpCommand(name = \"project\") {\n  override fun help(context: Context) = \"Run commands related to projects\"\n\n  override fun helpEpilog(context: Context) = \"For more information, visit $helpLink\"\n\n  init {\n    subcommands(ResolveCommand(), PackageCommand())\n  }\n}\n\nclass ResolveCommand : BaseCommand(name = \"resolve\", helpLink = helpLink) {\n  override val helpString =\n    \"\"\"\n  Resolve dependencies for project(s)\n\n  This command takes the `dependencies` of `PklProject`s, and writes the\n  resolved versions to `PklProject.deps.json` files.\n\n  Examples:\n\n  ```\n  # Search the current working directory for a project, and resolve its dependencies.\n  $ pkl project resolve\n\n  # Resolve dependencies for all projects within the `packages/` directory.\n  $ pkl project resolve packages/*/\n  ```\n  \"\"\"\n\n  private val projectDirs: List<Path> by\n    argument(\"dir\", \"The project directories to resolve dependencies for\").path().multiple()\n\n  override fun run() {\n    CliProjectResolver(baseOptions.baseOptions(emptyList()), projectDirs).run()\n  }\n}\n\nclass PackageCommand : BaseCommand(name = \"package\", helpLink = helpLink) {\n  override val helpString =\n    \"\"\"\n  Verify package(s), and prepare package artifacts to be published.\n\n  This command runs a project's api tests, as defined by `apiTests` in `PklProject`.\n  Additionally, it verifies that all imports resolve to paths that are local to the project.\n\n  Finally, this command writes the following artifacts into the output directory specified by the output path.\n\n    - `name@version` - dependency metadata$NEWLINE\n    - `name@version.sha256` - dependency metadata's SHA-256 checksum$NEWLINE\n    - `name@version.zip` - package archive$NEWLINE\n    - `name@version.zip.sha256` - package archive's SHA-256 checksum\n\n  The output path option accepts the following placeholders:\n\n    - %{name}: The display name of the package$NEWLINE\n    - %{version}: The version of the package\n\n  If a project has local project dependencies, the depended upon project directories must also\n  be included as arguments to this command.\n\n  Examples:\n\n  ```\n  # Search the current working directory for a project, and package it.\n  $ pkl project package\n\n  # Package all projects within the `packages/` directory.\n  $ pkl project package packages/*/\n  ```\n  \"\"\"\n      .trimIndent()\n\n  private val testOptions by TestOptions()\n\n  private val projectDirs: List<Path> by\n    argument(\"dir\", \"The project directories to package\").path().multiple()\n\n  private val outputPath: String by\n    option(\n        names = arrayOf(\"--output-path\"),\n        help = \"The directory to write artifacts to\",\n        metavar = \"path\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .single()\n      .default(\".out/%{name}@%{version}\")\n\n  private val skipPublishCheck: Boolean by\n    option(\n        names = arrayOf(\"--skip-publish-check\"),\n        help = \"Skip checking if a package has already been published with different contents\",\n      )\n      .single()\n      .flag()\n\n  override fun run() {\n    CliProjectPackager(\n        baseOptions.baseOptions(emptyList()),\n        projectDirs,\n        testOptions.cliTestOptions,\n        outputPath,\n        skipPublishCheck,\n      )\n      .run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/ReplCommand.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport org.pkl.cli.CliEvaluatorOptions\nimport org.pkl.cli.CliRepl\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.ProjectOptions\n\nclass ReplCommand : BaseCommand(name = \"repl\", helpLink = helpLink) {\n  override val helpString = \"Start a REPL session\"\n\n  private val projectOptions by ProjectOptions()\n\n  override fun run() {\n    val options = CliEvaluatorOptions(base = baseOptions.baseOptions(emptyList(), projectOptions))\n    CliRepl(options).run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/RootCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCommand\nimport com.github.ajalt.clikt.core.Context\nimport com.github.ajalt.clikt.core.context\nimport com.github.ajalt.clikt.core.subcommands\nimport org.pkl.commons.cli.commands.NoOpCommand\nimport org.pkl.commons.cli.commands.installCommonOptions\nimport org.pkl.core.Release\n\ninternal val helpLink = \"${Release.current().documentation.homepage}pkl-cli/index.html#usage\"\n\nclass RootCommand : NoOpCommand(name = \"pkl\") {\n  override val printHelpOnEmptyArgs = true\n\n  override fun helpEpilog(context: Context) = \"For more information, visit $helpLink\"\n\n  init {\n    context {\n      readArgumentFile = null\n      suggestTypoCorrection = { given, possible ->\n        if (!given.startsWith(\"-\")) {\n          registeredSubcommands().map { it.commandName }\n        } else possible\n      }\n    }\n\n    installCommonOptions()\n\n    subcommands(\n      EvalCommand(),\n      ReplCommand(),\n      ServerCommand(),\n      TestCommand(),\n      ProjectCommand(),\n      DownloadPackageCommand(),\n      AnalyzeCommand(),\n      FormatterCommand(),\n      RunCommand(),\n      CompletionCommand(\n        name = \"shell-completion\",\n        help = \"Generate a completion script for the given shell\",\n        epilog = \"For more information, visit $helpLink\",\n      ),\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/RunCommand.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.core.MissingArgument\nimport com.github.ajalt.clikt.core.PrintHelpMessage\nimport com.github.ajalt.clikt.core.context\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.convert\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.arguments.optional\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport java.net.URI\nimport org.pkl.cli.CliCommandRunner\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.BaseOptions\nimport org.pkl.commons.cli.commands.ProjectOptions\n\nclass RunCommand : BaseCommand(name = \"run\", helpLink = helpLink) {\n  override val helpString = \"Run a Pkl pkl:Command CLI tool\"\n  override val treatUnknownOptionsAsArgs = true\n\n  init {\n    context {\n      // override clikt's built-in help behavior\n      // the built-in --help is eager so any --help/-h would force printing of pkl run's help\n      // which is not desired when a command module (or any of its subcommands) are present\n      // since that would mean command-defined help is gated behind a non-obvious `-- --help`\n      helpOptionNames = emptySet()\n    }\n  }\n\n  private val showHelp by option(\"-h\", \"--help\", help = \"Show this message and exit\").flag()\n\n  val module: URI? by\n    argument(\n        name = \"module\",\n        help = \"Root pkl:Command module to invoke.\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .convert { BaseOptions.parseModuleName(it) }\n      .optional()\n\n  val args: List<String> by argument(name = \"args\").multiple()\n\n  private val projectOptions by ProjectOptions()\n\n  override fun run() {\n    // if no module is specified but --help is show help, otherwise error becuase module is missing\n    if (module == null)\n      if (showHelp) throw PrintHelpMessage(currentContext)\n      else throw MissingArgument(registeredArguments().find { it.name == \"module\" }!!)\n\n    val reservedFlagNames = mutableSetOf(\"help\")\n    val reservedFlagShortNames = mutableSetOf(\"h\")\n    registeredOptions().forEach { opt ->\n      (opt.names + opt.secondaryNames).forEach {\n        if (it.startsWith(\"--\")) reservedFlagNames.add(it.trimStart('-'))\n        else reservedFlagShortNames.add(it.trimStart('-'))\n      }\n    }\n    CliCommandRunner(\n        baseOptions.baseOptions(listOf(module!!), projectOptions),\n        reservedFlagNames,\n        reservedFlagShortNames,\n        if (showHelp) args + listOf(\"--help\") else args,\n      )\n      .run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/ServerCommand.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.core.CliktCommand\nimport com.github.ajalt.clikt.core.Context\nimport org.pkl.cli.CliServer\nimport org.pkl.commons.cli.CliBaseOptions\n\nclass ServerCommand : CliktCommand(name = \"server\") {\n  override fun help(context: Context) =\n    \"Run as a server that communicates over standard input/output\"\n\n  override fun helpEpilog(context: Context) = \"For more information, visit $helpLink\"\n\n  override fun run() {\n    CliServer(CliBaseOptions()).run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/TestCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.convert\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport java.net.URI\nimport org.pkl.cli.CliTestRunner\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.BaseOptions\nimport org.pkl.commons.cli.commands.ProjectOptions\nimport org.pkl.commons.cli.commands.TestOptions\n\nclass TestCommand : BaseCommand(name = \"test\", helpLink = helpLink) {\n  override val helpString = \"Run tests within the given module(s)\"\n\n  val modules: List<URI> by\n    argument(\n        name = \"modules\",\n        help = \"Module paths or URIs to evaluate.\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .convert { BaseOptions.parseModuleName(it) }\n      .multiple()\n\n  private val projectOptions by ProjectOptions()\n\n  private val testOptions by TestOptions()\n\n  private val powerAssertionsEnabled: Boolean by\n    option(\n        names = arrayOf(\"--power-assertions\"),\n        help = \"Enable power assertions for detailed assertion failure messages.\",\n      )\n      .flag(\"--no-power-assertions\", default = true, defaultForHelp = \"enabled\")\n\n  override fun run() {\n    CliTestRunner(\n        options =\n          baseOptions.baseOptions(\n            modules,\n            projectOptions,\n            powerAssertionsEnabled = powerAssertionsEnabled,\n          ),\n        testOptions = testOptions.cliTestOptions,\n      )\n      .run()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/commands/Utils.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.commands\n\ninternal const val NEWLINE = '\\u0085'\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/repl/Repl.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.repl\n\nimport java.io.IOException\nimport java.net.URI\nimport java.nio.file.Path\nimport java.util.regex.Pattern\nimport kotlin.io.path.deleteIfExists\nimport org.fusesource.jansi.Ansi\nimport org.jline.reader.EndOfFileException\nimport org.jline.reader.Highlighter\nimport org.jline.reader.LineReader\nimport org.jline.reader.LineReader.Option\nimport org.jline.reader.LineReaderBuilder\nimport org.jline.reader.UserInterruptException\nimport org.jline.reader.impl.completer.AggregateCompleter\nimport org.jline.reader.impl.history.DefaultHistory\nimport org.jline.terminal.TerminalBuilder\nimport org.jline.utils.AttributedString\nimport org.jline.utils.InfoCmp\nimport org.pkl.core.repl.ReplRequest\nimport org.pkl.core.repl.ReplResponse\nimport org.pkl.core.repl.ReplServer\nimport org.pkl.core.util.AnsiStringBuilder\nimport org.pkl.core.util.AnsiStringBuilder.AnsiCode\nimport org.pkl.core.util.IoUtils\nimport org.pkl.core.util.SyntaxHighlighter\n\nclass PklHighlighter : Highlighter {\n  override fun highlight(reader: LineReader, buffer: String): AttributedString {\n    val ansi = AnsiStringBuilder(true).apply { SyntaxHighlighter.writeTo(this, buffer) }.toString()\n    return AttributedString.fromAnsi(ansi)\n  }\n\n  override fun setErrorPattern(pattern: Pattern) {}\n\n  override fun setErrorIndex(idx: Int) {}\n}\n\ninternal class Repl(workingDir: Path, private val server: ReplServer, private val color: Boolean) {\n  private val terminal = TerminalBuilder.builder().apply { jansi(true) }.build()\n  private val history = DefaultHistory()\n  private val reader =\n    LineReaderBuilder.builder()\n      .apply {\n        history(history)\n        terminal(terminal)\n        if (color) {\n          highlighter(PklHighlighter())\n        }\n        completer(AggregateCompleter(CommandCompleter, FileCompleter(workingDir)))\n        option(Option.DISABLE_EVENT_EXPANSION, true)\n        variable(LineReader.HISTORY_FILE, (IoUtils.getPklHomeDir().resolve(\"repl-history\")))\n      }\n      .build()\n\n  private var continuation = false\n  private var quit = false\n  private var maybeQuit = false\n  private var nextRequestId = 0\n\n  private fun String.faint(): String {\n    val sb = AnsiStringBuilder(color)\n    sb.append(AnsiCode.FAINT, this)\n    return sb.toString()\n  }\n\n  fun run() {\n    // JLine 2 history file is incompatible with JLine 3\n    IoUtils.getPklHomeDir().resolve(\"repl-history.bin\").deleteIfExists()\n\n    println(ReplMessages.welcome)\n    println()\n\n    var inputBuffer = \"\"\n\n    try {\n      while (!quit) {\n        val line =\n          try {\n            if (continuation) {\n              nextRequestId -= 1\n              reader.readLine(\" \".repeat(\"pkl$nextRequestId> \".length).faint())\n            } else {\n              reader.readLine(\"pkl$nextRequestId> \".faint())\n            }\n          } catch (_: UserInterruptException) {\n            if (!continuation && reader.buffer.length() == 0) {\n              if (maybeQuit) quit()\n              else {\n                maybeQuit = true\n                println(\"(To exit, press ^C again or ^D or type :quit)\")\n              }\n            } else {\n              maybeQuit = false\n            }\n            inputBuffer = \"\"\n            continuation = false\n            continue\n          } catch (_: EndOfFileException) {\n            \":quit\"\n          }\n\n        maybeQuit = false\n        val input = line.trim()\n        if (input.isEmpty()) continue\n\n        if (continuation) {\n          inputBuffer = (inputBuffer + \"\\n\" + input).trim()\n          continuation = false\n        } else {\n          inputBuffer = input\n        }\n\n        if (inputBuffer.startsWith(\":\")) {\n          executeCommand(inputBuffer)\n        } else {\n          evaluate(inputBuffer)\n        }\n      }\n    } finally {\n      try {\n        history.save()\n      } catch (_: IOException) {}\n      try {\n        terminal.close()\n      } catch (_: IOException) {}\n    }\n  }\n\n  private fun executeCommand(inputBuffer: String) {\n    val candidates = getMatchingCommands(inputBuffer)\n    when {\n      candidates.isEmpty() -> {\n        println(\"Unknown command: `${inputBuffer.drop(1)}`\")\n      }\n\n      candidates.size > 1 -> {\n        print(\"Which of the following did you mean?  \")\n        println(candidates.joinToString(separator = \"  \") { \"`:${it.type}`\" })\n      }\n\n      else -> {\n        doExecuteCommand(candidates.single())\n      }\n    }\n  }\n\n  private fun doExecuteCommand(command: ParsedCommand) {\n    when (command.type) {\n      Command.Clear -> clear()\n      Command.Examples -> examples()\n      Command.Force -> force(command)\n      Command.Help -> help()\n      Command.Load -> load(command)\n      Command.Quit -> quit()\n      Command.Reset -> reset()\n    }\n  }\n\n  private fun clear() {\n    terminal.puts(InfoCmp.Capability.clear_screen)\n    terminal.flush()\n  }\n\n  private fun examples() {\n    println(ReplMessages.examples)\n  }\n\n  private fun help() {\n    println(ReplMessages.help)\n  }\n\n  private fun quit() {\n    quit = true\n  }\n\n  private fun reset() {\n    server.handleRequest(ReplRequest.Reset(nextRequestId()))\n    clear()\n    nextRequestId = 0\n  }\n\n  private fun evaluate(inputBuffer: String) {\n    handleEvalRequest(ReplRequest.Eval(nextRequestId(), inputBuffer, false, false))\n  }\n\n  private fun loadModule(uri: URI) {\n    handleEvalRequest(ReplRequest.Load(nextRequestId(), uri))\n  }\n\n  private fun force(command: ParsedCommand) {\n    handleEvalRequest(ReplRequest.Eval(nextRequestId(), command.arg, false, true))\n  }\n\n  private fun load(command: ParsedCommand) {\n    loadModule(IoUtils.toUri(command.arg))\n  }\n\n  private fun handleEvalRequest(request: ReplRequest) {\n    val responses = server.handleRequest(request)\n\n    for (response in responses) {\n      when (response) {\n        is ReplResponse.EvalSuccess -> {\n          println(response.result)\n        }\n\n        is ReplResponse.EvalError -> {\n          println(response.message)\n        }\n\n        is ReplResponse.InternalError -> {\n          throw response.cause\n        }\n\n        is ReplResponse.IncompleteInput -> {\n          assert(responses.size == 1)\n          continuation = true\n        }\n\n        else -> throw IllegalStateException(\"Unexpected response: $response\")\n      }\n    }\n  }\n\n  private fun nextRequestId(): String = \"pkl$nextRequestId\".apply { nextRequestId += 1 }\n\n  private fun print(msg: String) {\n    terminal.writer().print(highlight(msg))\n  }\n\n  private fun println(msg: String = \"\") {\n    terminal.writer().println(highlight(msg))\n  }\n\n  private fun highlight(str: String): String {\n    val ansi = Ansi.ansi()\n    var normal = true\n    for (part in str.split(\"`\", \"```\")) {\n      ansi.a(part)\n      normal = !normal\n      if (!normal) ansi.bold() else ansi.boldOff()\n    }\n    ansi.reset()\n    return ansi.toString()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/repl/ReplCommands.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.repl\n\nprivate val cmdRegex = Regex(\":(\\\\p{Alpha}*)(\\\\p{Space}*)(.*)\", RegexOption.DOT_MATCHES_ALL)\n\ninternal fun getMatchingCommands(input: String): List<ParsedCommand> {\n  val match = cmdRegex.matchEntire(input) ?: return listOf()\n  val (cmd, ws, arg) = match.destructured\n  return Command.entries\n    .filter { it.toString().lowercase().startsWith(cmd) }\n    .map { ParsedCommand(it, cmd, ws, arg) }\n}\n\ninternal data class ParsedCommand(\n  val type: Command,\n  val cmd: String,\n  val ws: String,\n  val arg: String,\n)\n\ninternal enum class Command {\n  Clear,\n  Examples,\n  Force,\n  Help,\n  Load,\n  Quit,\n  Reset;\n\n  override fun toString() = name.lowercase()\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/repl/ReplCompleters.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.repl\n\nimport java.io.IOException\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport org.jline.reader.Candidate\nimport org.jline.reader.Completer\nimport org.jline.reader.LineReader\nimport org.jline.reader.ParsedLine\nimport org.jline.terminal.Terminal\nimport org.jline.utils.AttributedStringBuilder\nimport org.jline.utils.OSUtils\nimport org.jline.utils.StyleResolver\n\n/**\n * Originally copied from:\n * https://github.com/jline/jline3/blob/jline-parent-3.21.0/builtins/src/main/java/org/jline/builtins/Completers.java\n *\n * Reasons for copying this class instead of adding jline-builtins dependency:\n * - Adding the dependency breaks native-image build (at least when using build-time initialization,\n *   might work with some config).\n * - Completers.FileNameCompleter is the only class we currently use.\n */\ninternal abstract class JLineFileNameCompleter : Completer {\n  override fun complete(\n    reader: LineReader,\n    commandLine: ParsedLine,\n    candidates: MutableList<Candidate>,\n  ) {\n    val buffer = commandLine.word().substring(0, commandLine.wordCursor())\n    val current: Path\n    val curBuf: String\n    val sep = getSeparator(reader.isSet(LineReader.Option.USE_FORWARD_SLASH))\n    val lastSep = buffer.lastIndexOf(sep)\n    try {\n      if (lastSep >= 0) {\n        curBuf = buffer.substring(0, lastSep + 1)\n        current =\n          if (curBuf.startsWith(\"~\")) {\n            if (curBuf.startsWith(\"~$sep\")) {\n              userHome.resolve(curBuf.substring(2))\n            } else {\n              userHome.parent.resolve(curBuf.substring(1))\n            }\n          } else {\n            userDir.resolve(curBuf)\n          }\n      } else {\n        curBuf = \"\"\n        current = userDir\n      }\n      try {\n        Files.newDirectoryStream(current) { accept(it) }\n          .use { directory ->\n            directory.forEach { path ->\n              val value = curBuf + path.fileName.toString()\n              if (Files.isDirectory(path)) {\n                candidates.add(\n                  Candidate(\n                    value + if (reader.isSet(LineReader.Option.AUTO_PARAM_SLASH)) sep else \"\",\n                    getDisplay(reader.terminal, path, resolver, sep),\n                    null,\n                    null,\n                    if (reader.isSet(LineReader.Option.AUTO_REMOVE_SLASH)) sep else null,\n                    null,\n                    false,\n                  )\n                )\n              } else {\n                candidates.add(\n                  Candidate(\n                    value,\n                    getDisplay(reader.terminal, path, resolver, sep),\n                    null,\n                    null,\n                    null,\n                    null,\n                    true,\n                  )\n                )\n              }\n            }\n          }\n      } catch (ignored: IOException) {}\n    } catch (ignored: Exception) {}\n  }\n\n  protected open fun accept(path: Path): Boolean {\n    return try {\n      !Files.isHidden(path)\n    } catch (e: IOException) {\n      false\n    }\n  }\n\n  protected open val userDir: Path\n    get() = Path.of(System.getProperty(\"user.dir\"))\n\n  private val userHome: Path\n    get() = Path.of(System.getProperty(\"user.home\"))\n\n  private fun getSeparator(useForwardSlash: Boolean): String {\n    return if (useForwardSlash) \"/\" else userDir.fileSystem.separator\n  }\n\n  private fun getDisplay(\n    terminal: Terminal,\n    path: Path,\n    resolver: StyleResolver,\n    separator: String,\n  ): String {\n    val builder = AttributedStringBuilder()\n    val name = path.fileName.toString()\n    val index = name.lastIndexOf(\".\")\n    val type = if (index != -1) \".*\" + name.substring(index) else null\n    if (Files.isSymbolicLink(path)) {\n      builder.styled(resolver.resolve(\".ln\"), name).append(\"@\")\n    } else if (Files.isDirectory(path)) {\n      builder.styled(resolver.resolve(\".di\"), name).append(separator)\n    } else if (Files.isExecutable(path) && !OSUtils.IS_WINDOWS) {\n      builder.styled(resolver.resolve(\".ex\"), name).append(\"*\")\n    } else if (type != null && resolver.resolve(type).style != 0L) {\n      builder.styled(resolver.resolve(type), name)\n    } else if (Files.isRegularFile(path)) {\n      builder.styled(resolver.resolve(\".fi\"), name)\n    } else {\n      builder.append(name)\n    }\n    return builder.toAnsi(terminal)\n  }\n\n  companion object {\n    private val resolver = StyleResolver { name ->\n      when (name) {\n        // imitate org.jline.builtins.Styles.DEFAULT_LS_COLORS\n        \"di\" -> \"1;91\"\n        \"ex\" -> \"1;92\"\n        \"ln\" -> \"1;96\"\n        \"fi\" -> null\n        else -> null\n      }\n    }\n  }\n}\n\ninternal class FileCompleter(override val userDir: Path) : JLineFileNameCompleter() {\n  override fun complete(\n    reader: LineReader,\n    commandLine: ParsedLine,\n    candidates: MutableList<Candidate>,\n  ) {\n    val loadCmd =\n      getMatchingCommands(commandLine.line()).find { it.type == Command.Load && it.ws.isNotEmpty() }\n    if (loadCmd != null) {\n      super.complete(reader, commandLine, candidates)\n    }\n  }\n}\n\ninternal object CommandCompleter : Completer {\n  private val commandCandidates: List<Candidate> =\n    Command.entries.map { Candidate(\":\" + it.toString().lowercase()) }\n\n  override fun complete(reader: LineReader, line: ParsedLine, candidates: MutableList<Candidate>) {\n    if (line.wordIndex() == 0) candidates.addAll(commandCandidates)\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/repl/ReplMessages.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.repl\n\nimport org.pkl.core.Release\n\ninternal object ReplMessages {\n  val welcome =\n    \"\"\"\n    Welcome to Pkl ${Release.current().version()}.\n    Type an expression to have it evaluated.\n    Type `:help` or `:examples` for more information.\n  \"\"\"\n      .trimIndent()\n\n  val help =\n    \"\"\"\n    `<expr>`           Evaluate <expr> and print the result. `1 + 3`\n    `<name> = <expr>`  Evaluate <expr> and assign the result to property <name>. `msg = \"howdy\"`\n    `:clear`           Clear the screen.\n    `:examples`        Show code examples (use copy and paste to run them).\n    `:force <expr>`    Force eager evaluation of a value.\n    `:help`            Show this help.\n    `:load <file>`     Load <file> from local file system. `:load path/to/config.pkl`\n    `:quit`            Quit this program.\n    `:reset`           Reset the environment to its initial state.\n\n    Tips:\n    * Commands can be abbreviated. `:h`\n    * Commands can be completed. `:<TAB>`\n    * File paths can be completed. `:load <TAB>`\n    * Expressions can be completed. `\"hello\".re<TAB>`\n    * Multiple declarations and expressions can be evaluated at once. `a = 1; b = a + 2`\n    * Incomplete input will be continued on the next line.\n    * Multi-line programs can be copy-pasted into the REPL.\n\n  \"\"\"\n      .trimIndent()\n\n  val examples: String =\n    \"\"\"\n    Expressions:\n    `2 + 3 * 4`\n\n    Strings:\n    `\"Hello, \" + \"World!\"`\n\n    Properties:\n    `timeout = 5.min; timeout`\n\n    Objects:\n    ```pigeon {\n      name = \"Pigeon\"\n      fullName = \"\\(name) Bird\"\n      age = 42\n      address {\n        street = \"Landers St.\"\n      }\n    }\n    pigeon.fullName\n    \n    hobbies {\n      \"Swimming\"\n      \"Dancing\"\n      \"Surfing\"\n    }\n    hobbies[1]\n    \n    prices {\n      [\"Apple\"] = 1.5\n      [\"Orange\"] = 5\n      [\"Banana\"] = 2\n    }\n    prices[\"Banana\"]```\n    \n    Inheritance:\n    ```parrot = (pigeon) {\n      name = \"Parrot\"\n      age = 41\n    }\n    :force parrot```\n\n    For more examples, see the Language Reference${if (isMacOs()) \" (Command+Double-click the link below)\" else \"\"}:\n\n    ${Release.current().documentation().homepage()}language-reference/\n\n  \"\"\"\n      .trimIndent()\n\n  private fun isMacOs() = System.getProperty(\"os.name\").equals(\"Mac OS X\", ignoreCase = true)\n}\n"
  },
  {
    "path": "pkl-cli/src/main/kotlin/org/pkl/cli/repl/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://github.com/jline/jline3\n *\n * <p>Original license:\n *\n * <p>Copyright (c) 2002-2018, the original author or authors. All rights reserved.\n *\n * <p>https://opensource.org/licenses/BSD-3-Clause\n *\n * <p>Redistribution and use in source and binary forms, with or without modification, are permitted\n * provided that the following conditions are met:\n *\n * <p>Redistributions of source code must retain the above copyright notice, this list of conditions\n * and the following disclaimer.\n *\n * <p>Redistributions in binary form must reproduce the above copyright notice, this list of\n * conditions and the following disclaimer in the documentation and/or other materials provided with\n * the distribution.\n *\n * <p>Neither the name of JLine nor the names of its contributors may be used to endorse or promote\n * products derived from this software without specific prior written permission.\n *\n * <p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY\n * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\npackage org.pkl.cli.repl;\n"
  },
  {
    "path": "pkl-cli/src/test/files/projects/project1/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliCommandRunnerTest.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport com.github.ajalt.clikt.core.CliktError\nimport com.github.ajalt.clikt.core.MissingOption\nimport com.github.ajalt.clikt.core.PrintCompletionMessage\nimport com.github.tomakehurst.wiremock.junit5.WireMockTest\nimport java.io.ByteArrayOutputStream\nimport java.net.URI\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.ExperimentalPathApi\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.deleteRecursively\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.writeString\n\n@OptIn(ExperimentalPathApi::class)\n@WireMockTest(httpsEnabled = true, proxyMode = true)\nclass CliCommandRunnerTest {\n  private val renderOptions =\n    \"\"\"\n      extends \"pkl:Command\"\n      \n      options: Options\n      \n      output {\n        value = options\n      }\n      \n    \"\"\"\n      .trimIndent()\n\n  companion object {\n    private val packageServer = PackageServer()\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      packageServer.close()\n    }\n  }\n\n  // use manually constructed temp dir instead of @TempDir to work around\n  // https://forums.developer.apple.com/thread/118358\n  private val tempDir: Path = run {\n    val baseDir = FileTestUtils.rootProjectDir.resolve(\"pkl-cli/build/tmp/CliCommandRunnerTest\")\n    baseDir.createDirectories()\n    Files.createTempDirectory(baseDir, null)\n  }\n\n  @AfterEach\n  fun afterEach() {\n    tempDir.deleteRecursively()\n  }\n\n  private fun writePklFile(fileName: String, contents: String): URI {\n    tempDir.resolve(fileName).createParentDirectories()\n    return tempDir.resolve(fileName).writeString(contents).toUri()\n  }\n\n  private fun runToStdout(options: CliBaseOptions, args: List<String>): String {\n    val outWriter = ByteArrayOutputStream()\n    CliCommandRunner(\n        options,\n        setOf(\"root-dir\"),\n        emptySet(),\n        args,\n        outWriter,\n        ByteArrayOutputStream(),\n      )\n      .run()\n    return outWriter.toString(StandardCharsets.UTF_8)\n  }\n\n  @Test\n  fun `missing required flag`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc =\n      assertThrows<MissingOption> {\n        runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri), testMode = true), listOf())\n      }\n    assertThat(exc.paramName).isEqualTo(\"--foo\")\n  }\n\n  @Test\n  fun `primitive flags`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        `number-as-int`: Number\n        `number-as-float`: Number\n        `number-nullable`: Number?\n        `number-default`: Number = 100.0\n        `number-default-overridden`: Number = 100.0\n        \n        float: Float\n        `float-without-decimals`: Float\n        `float-nullable`: Float?\n        `float-default`: Float = 100.0\n        `float-default-overridden`: Float = 100.0\n        \n        int: Int\n        `int-nullable`: Int?\n        `int-default`: Int = 100\n        `int-default-overridden`: Int = 100\n        \n        int8: Int8\n        int16: Int16\n        int32: Int32\n        uint: UInt\n        uint8: UInt8\n        uint16: UInt16\n        uint32: UInt32\n        \n        boolean: Boolean\n        `boolean-nullable`: Boolean?\n        `boolean-default`: Boolean = true\n        `boolean-default-overridden`: Boolean = false\n        \n        string: String\n        `string-nullable`: String?\n        `string-default`: String = \"default\"\n        `string-default-overridden`: String = \"default\"\n        \n        char: Char\n        `char-nullable`: Char?\n        `char-default`: Char = \"a\"\n        `char-default-overridden`: Char = \"b\"\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\n          \"--number-as-int=123\",\n          \"--number-as-float=123.0\",\n          \"--number-default-overridden=-200.0\",\n          \"--float=123.456\",\n          \"--float-without-decimals=789\",\n          \"--float-default-overridden=-200\",\n          \"--int=123\",\n          \"--int-default-overridden=-200\",\n          \"--int8=127\",\n          \"--int16=32767\",\n          \"--int32=2147483647\",\n          \"--uint=0\",\n          \"--uint8=255\",\n          \"--uint16=65535\",\n          \"--uint32=4294967295\",\n          \"--boolean=n\",\n          \"--boolean-default-overridden=1\",\n          \"--string=foobar\",\n          \"--string-default-overridden=non-default\",\n          \"--char=X\",\n          \"--char-default-overridden=c\",\n        ),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        `number-as-int` = 123\n        `number-as-float` = 123.0\n        `number-nullable` = null\n        `number-default` = 100.0\n        `number-default-overridden` = -200.0\n        float = 123.456\n        `float-without-decimals` = 789.0\n        `float-nullable` = null\n        `float-default` = 100.0\n        `float-default-overridden` = -200.0\n        int = 123\n        `int-nullable` = null\n        `int-default` = 100\n        `int-default-overridden` = -200\n        int8 = 127\n        int16 = 32767\n        int32 = 2147483647\n        uint = 0\n        uint8 = 255\n        uint16 = 65535\n        uint32 = 4294967295\n        boolean = false\n        `boolean-nullable` = null\n        `boolean-default` = true\n        `boolean-default-overridden` = true\n        string = \"foobar\"\n        `string-nullable` = null\n        `string-default` = \"default\"\n        `string-default-overridden` = \"non-default\"\n        char = \"X\"\n        `char-nullable` = null\n        `char-default` = \"a\"\n        `char-default-overridden` = \"c\"\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `primitive arguments`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        `number-as-int`: Number\n        @Argument\n        `number-as-float`: Number\n        \n        @Argument\n        float: Float\n        @Argument\n        `float-without-decimals`: Float\n        \n        @Argument\n        int: Int\n        \n        @Argument\n        int8: Int8\n        @Argument\n        int16: Int16\n        @Argument\n        int32: Int32\n        @Argument\n        uint: UInt\n        @Argument\n        uint8: UInt8\n        @Argument\n        uint16: UInt16\n        @Argument\n        uint32: UInt32\n        \n        @Argument\n        boolean: Boolean\n        \n        @Argument\n        string: String\n        \n        @Argument\n        char: Char\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\n          \"123\",\n          \"123.0\",\n          \"123.456\",\n          \"789\",\n          \"123\",\n          \"127\",\n          \"32767\",\n          \"2147483647\",\n          \"0\",\n          \"255\",\n          \"65535\",\n          \"4294967295\",\n          \"n\",\n          \"foobar\",\n          \"X\",\n        ),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        `number-as-int` = 123\n        `number-as-float` = 123.0\n        float = 123.456\n        `float-without-decimals` = 789.0\n        int = 123\n        int8 = 127\n        int16 = 32767\n        int32 = 2147483647\n        uint = 0\n        uint8 = 255\n        uint16 = 65535\n        uint32 = 4294967295\n        boolean = false\n        string = \"foobar\"\n        char = \"X\"\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `enum flags`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      typealias MyEnum = \"d\" | \"e\" | *\"f\"\n      class Options {\n        enum: \"a\" | \"b\" | \"c\"\n        `enum-default`: \"a\" | *\"b\" | \"c\"\n        `enum-explicit-default`: \"a\" | \"b\" | \"c\" = \"c\"\n        `enum-alias-default`: MyEnum\n        `enum-alias-explicit-default`: MyEnum = \"e\"\n        `enum-alias-default-overridden`: MyEnum\n        \n        `enum-single`: \"x\"\n        `enum-single-nullable`: \"x\"?\n        `enum-single-explicit-default`: \"x\" = \"x\"\n        `enum-single-overridden`: \"x\"\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"--enum=a\", \"--enum-alias-default-overridden=d\", \"--enum-single-overridden=x\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        enum = \"a\"\n        `enum-default` = \"b\"\n        `enum-explicit-default` = \"c\"\n        `enum-alias-default` = \"f\"\n        `enum-alias-explicit-default` = \"e\"\n        `enum-alias-default-overridden` = \"d\"\n        `enum-single` = \"x\"\n        `enum-single-nullable` = null\n        `enum-single-explicit-default` = \"x\"\n        `enum-single-overridden` = \"x\"\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `enum args`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      typealias MyEnum = \"d\" | \"e\" | *\"f\"\n      class Options {\n        @Argument\n        enum: \"a\" | \"b\" | \"c\"\n        @Argument\n        `enum-default`: \"a\" | *\"b\" | \"c\"\n        @Argument\n        `enum-alias-default`: MyEnum\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"a\", \"c\", \"d\"))\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        enum = \"a\"\n        `enum-default` = \"c\"\n        `enum-alias-default` = \"d\"\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `collection flags`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        list: List<Number>\n        `list-nullable`: List<Number>?\n        `list-default`: List<Number> = List(1, 2, 300.0)\n        set: Set<Number>\n        `set-nullable`: Set<Number>?\n        `set-default`: Set<Number> = Set(1, 2, 300.0, 2)\n        \n        `enum-list`: List<\"a\" | \"b\" | *\"c\">\n        `enum-set`: Set<\"a\" | \"b\" | *\"c\">\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\n          \"--list=1\",\n          \"--list=0\",\n          \"--list=0.0\",\n          \"--list=1\",\n          \"--set=1\",\n          \"--set=0\",\n          \"--set=0.0\",\n          \"--set=1\",\n          \"--enum-list=a\",\n          \"--enum-list=a\",\n          \"--enum-list=b\",\n          \"--enum-set=a\",\n          \"--enum-set=a\",\n          \"--enum-set=b\",\n        ),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        list = List(1, 0, 0.0, 1)\n        `list-nullable` = null\n        `list-default` = List(1, 2, 300.0)\n        set = Set(1, 0, 0.0)\n        `set-nullable` = null\n        `set-default` = Set(1, 2, 300.0)\n        `enum-list` = List(\"a\", \"a\", \"b\")\n        `enum-set` = Set(\"a\", \"b\")\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `sequence args`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        list: List<Number>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"1\", \"0\", \"0.0\", \"1\"))\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        list = List(1, 0, 0.0, 1)\n        \n        \"\"\"\n          .trimIndent()\n      )\n\n    val moduleUri2 =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        set: Set<Number>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output2 =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri2)), listOf(\"1\", \"0\", \"0.0\", \"1\"))\n    assertThat(output2)\n      .isEqualTo(\n        \"\"\"\n        set = Set(1, 0, 0.0)\n        \n        \"\"\"\n          .trimIndent()\n      )\n\n    val moduleUri3 =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        listing: Listing<Number>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output3 =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri3)), listOf(\"1\", \"0\", \"0.0\", \"1\"))\n    assertThat(output3)\n      .isEqualTo(\n        \"\"\"\n        listing {\n          1\n          0\n          0.0\n          1\n        }\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `keyval args`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        map: Map<Number, Number>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"1=0\", \"0.0=1\"))\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        map = Map(1, 0, 0.0, 1)\n        \n        \"\"\"\n          .trimIndent()\n      )\n\n    val moduleUri2 =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        mapping: Mapping<Number, Number>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output2 =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri2)), listOf(\"1=0\", \"0.0=1\"))\n    assertThat(output2)\n      .isEqualTo(\n        \"\"\"\n        mapping {\n          [1] = 0\n          [0.0] = 1\n        }\n        \n        \"\"\"\n          .trimIndent()\n      )\n\n    val moduleUri3 =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        pair: Pair<Number, Number>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output3 = runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri3)), listOf(\"1=0.0\"))\n    assertThat(output3)\n      .isEqualTo(\n        \"\"\"\n        pair = Pair(1, 0.0)\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `map flags`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      typealias MyEnum = \"a\" | \"b\" | *\"c\"\n      class Options {\n        map: Map<Char, Number>\n        `map-nullable`: Map<Char, Number>?\n        `map-default`: Map<Char, Number> = Map(\"x\", 123, \"y\", 456.789)\n        \n        `enum-map`: Map<MyEnum, MyEnum>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"--map=a=0.0\", \"--map=b=1\", \"--enum-map=a=b\", \"--enum-map=b=c\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        map = Map(\"a\", 0.0, \"b\", 1)\n        `map-nullable` = null\n        `map-default` = Map(\"x\", 123, \"y\", 456.789)\n        `enum-map` = Map(\"a\", \"b\", \"b\", \"c\")\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `mapping flags`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      typealias MyEnum = \"a\" | \"b\" | *\"c\"\n      class Options {\n        mapping: Mapping<Char, Number>\n        `mapping-nullable`: Mapping<Char, Number>?\n        `mapping-default`: Mapping<Char, Number> = new { [\"x\"] = 123; [\"y\"] = 456.789 }\n        \n        `enum-mapping`: Mapping<MyEnum, MyEnum>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"--mapping=a=0.0\", \"--mapping=b=1\", \"--enum-mapping=a=b\", \"--enum-mapping=b=c\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        mapping {\n          [\"a\"] = 0.0\n          [\"b\"] = 1\n        }\n        `mapping-nullable` = null\n        `mapping-default` {\n          [\"x\"] = 123\n          [\"y\"] = 456.789\n        }\n        `enum-mapping` {\n          [\"a\"] = \"b\"\n          [\"b\"] = \"c\"\n        }\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `pair flags`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      typealias MyEnum = \"a\" | \"b\" | *\"c\"\n      class Options {\n        pair: Pair<Char, Number>\n        `pair-nullable`: Pair<Char, Number>?\n        `pair-default`: Pair<Char, Number> = Pair(\"x\", 123)\n        \n        `enum-pair`: Pair<MyEnum, MyEnum>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"--pair=a=0.0\", \"--enum-pair=a=b\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        pair = Pair(\"a\", 0.0)\n        `pair-nullable` = null\n        `pair-default` = Pair(\"x\", 123)\n        `enum-pair` = Pair(\"a\", \"b\")\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `convert Duration`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument { convert = module.convertDuration }\n        a: Duration\n        @Argument { convert = module.convertDuration }\n        b: Duration\n        @Argument { convert = module.convertDuration }\n        c: Duration\n        @Argument { convert = module.convertDuration }\n        d: Duration\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"10.h\", \"10H\", \"10.5.MS\", \"10.5d\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        a = 10.h\n        b = 10.h\n        c = 10.5.ms\n        d = 10.5.d\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `convert DataSize`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument { convert = module.convertDataSize }\n        a: DataSize\n        @Argument { convert = module.convertDataSize }\n        b: DataSize\n        @Argument { convert = module.convertDataSize }\n        c: DataSize\n        @Argument { convert = module.convertDataSize }\n        d: DataSize\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"10.gb\", \"10GB\", \"10.5.MB\", \"10.5tib\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        a = 10.gb\n        b = 10.gb\n        c = 10.5.mb\n        d = 10.5.tib\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `convert import`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n      extends \"pkl:Command\"\n      \n      options: Options\n      \n      output {\n        value = (options) {\n          fromImport {\n           baz = true // assert that imported modules are not forced\n          }\n        }\n      }\n      \n      class Options {\n        @Argument { convert = (it) -> new Import{ uri = it } }\n        fromImport: Module\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val importUri =\n      writePklFile(\n        \"import.pkl\",\n        \"\"\"\n      foo = 1\n      bar = \"baz\"\n      baz: Boolean\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val output =\n      runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(importUri.toString()))\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        fromImport {\n          foo = 1\n          bar = \"baz\"\n          baz = true\n        }\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `transformAll import`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n      extends \"pkl:Command\"\n      \n      options: Options\n      \n      output {\n        value = (options) {\n          fromImport {\n           baz = true // assert that imported modules are not forced\n          }\n        }\n      }\n      \n      class Options {\n        @Flag {\n          convert = (it) -> new Import{ uri = it }\n          transformAll = (values) -> values.firstOrNull ?? new Import { uri = \"./default.pkl\" }\n        }\n        fromImport: Module\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val importUri =\n      writePklFile(\n        \"default.pkl\",\n        \"\"\"\n      foo = 1\n      bar = \"baz\"\n      baz: Boolean\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        emptyList(),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        fromImport {\n          foo = 1\n          bar = \"baz\"\n          baz = true\n        }\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `convert glob import`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n      extends \"pkl:Command\"\n      import \"base.pkl\"\n      \n      options: Options\n      \n      output {\n        value = (options) {\n          fromGlobImport {\n            [[true]] {\n              baz = true // assert that imported modules are not forced\n            }\n          }\n        }\n      }\n      \n      class Options {\n        @Argument { convert = (it) -> new Import { uri = it; glob = true }; multiple = false }\n        fromGlobImport: Mapping<String, base>\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val baseImport =\n      writePklFile(\n        \"base.pkl\",\n        \"\"\"\n      foo: Int\n      bar: String\n      baz: Boolean\n    \"\"\"\n          .trimIndent(),\n      )\n    writePklFile(\n      \"glob1.pkl\",\n      \"\"\"\n      amends \"base.pkl\"\n      foo = 1\n      bar = \"baz\"\n    \"\"\"\n        .trimIndent(),\n    )\n    writePklFile(\n      \"glob2.pkl\",\n      \"\"\"\n      amends \"base.pkl\"\n      foo = 2\n      bar = \"qux\"\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val importDirUri = baseImport.resolve(\".\")\n\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(importDirUri.resolve(\"./glob*.pkl\").toString()),\n      )\n    assertThat(output.replace(importDirUri.toString(), \"file:/<dir>/\"))\n      .isEqualTo(\n        \"\"\"\n        fromGlobImport {\n          [\"file:/<dir>/glob1.pkl\"] {\n            foo = 1\n            bar = \"baz\"\n            baz = true\n          }\n          [\"file:/<dir>/glob2.pkl\"] {\n            foo = 2\n            bar = \"qux\"\n            baz = true\n          }\n        }\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `convert that throws`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument { convert = (it) -> throw(\"oops!\") }\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc =\n      assertThrows<CliktError> {\n        runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"hi\"))\n      }\n    assertThat(exc.message).contains(\"oops!\")\n  }\n\n  @Test\n  fun `convert with eval error`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument { convert = (it) -> it.noSuchMethod() }\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc =\n      assertThrows<CliktError> {\n        runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"hi\"))\n      }\n    assertThat(exc.message).contains(\"Cannot find method `noSuchMethod` in class `String`.\")\n  }\n\n  @Test\n  fun `convert with stack overflow`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      const function overflow(it) = overflow(it)\n      class Options {\n        @Argument { convert = (it) -> overflow(it) }\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc =\n      assertThrows<CliktError> {\n        runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"hi\"))\n      }\n    assertThat(exc.message).contains(\"A stack overflow occurred.\")\n  }\n\n  @Test\n  fun `boolean flag`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @BooleanFlag\n        `bool-true`: Boolean\n        @BooleanFlag\n        `bool-false`: Boolean\n        @BooleanFlag\n        `bool-nullable`: Boolean?\n        @BooleanFlag\n        `bool-default-true`: Boolean = true\n        @BooleanFlag\n        `bool-default-false`: Boolean = false\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"--bool-true\", \"--no-bool-false\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        `bool-true` = true\n        `bool-false` = false\n        `bool-nullable` = null\n        `bool-default-true` = true\n        `bool-default-false` = false\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `boolean flag with bad type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @BooleanFlag\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc =\n      assertThrows<CliException> {\n        runToStdout(CliBaseOptions(sourceModules = listOf(moduleUri)), listOf(\"hi\"))\n      }\n    assertThat(exc.message)\n      .contains(\"Option `foo` with annotation `@BooleanFlag` has invalid type `String`.\")\n  }\n\n  @Test\n  fun `counted flag`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @CountedFlag { shortName = \"a\" }\n        int: Int\n        @CountedFlag { shortName = \"b\" }\n        int8: Int8\n        @CountedFlag { shortName = \"c\" }\n        int16: Int16\n        @CountedFlag { shortName = \"d\" }\n        int32: Int32\n        @CountedFlag { shortName = \"x\" }\n        uint: UInt\n        @CountedFlag { shortName = \"y\" }\n        uint8: UInt8\n        @CountedFlag { shortName = \"g\" }\n        uint16: UInt16\n        @CountedFlag { shortName = \"i\" }\n        uint32: UInt32\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"-abbcccddddxxxxxyyyyyygggggggiiiiiiii\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        int = 1\n        int8 = 2\n        int16 = 3\n        int32 = 4\n        uint = 5\n        uint8 = 6\n        uint16 = 7\n        uint32 = 8\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `test transformAll`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Flag {\n          multiple = true\n          transformAll = (values) -> values.fold(0, (res, acc) -> res + acc)\n        }\n        foo: Int\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val output =\n      runToStdout(\n        CliBaseOptions(sourceModules = listOf(moduleUri)),\n        listOf(\"--foo=1\", \"--foo=5\", \"--foo=8\"),\n      )\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        foo = 14\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `completion candidates`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        none: String?\n        enum: *\"a\" | \"b\" | \"c\"\n        @Flag { completionCandidates = \"paths\" }\n        path: String?\n        @Flag { completionCandidates { \"foo\"; \"bar\"; \"baz\" } }\n        explicit: String?\n        @Argument\n        enumArg: *\"a\" | \"b\" | \"c\"\n        @Argument { completionCandidates = \"paths\" }\n        pathArg: String\n        @Argument { completionCandidates { \"foo\"; \"bar\"; \"baz\" } }\n        explicitArg: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n    val exc =\n      assertThrows<PrintCompletionMessage> {\n        runToStdout(\n          CliBaseOptions(sourceModules = listOf(moduleUri)),\n          listOf(\"a\", \"foo\", \"bar\", \"shell-completion\", \"bash\"),\n        )\n      }\n    assertThat(exc.message)\n      .contains(\n        \"\"\"\n    \"--none\")\n      ;;\n    \"--enum\")\n      COMPREPLY=($(compgen -W 'a b c' -- \"${'$'}{word}\"))\n      ;;\n    \"--path\")\n       __complete_files \"${'$'}{word}\"\n      ;;\n    \"--explicit\")\n      COMPREPLY=($(compgen -W 'bar baz foo' -- \"${'$'}{word}\"))\n      ;;\n    \"--help\")\n      ;;\n    \"enumArg\")\n      COMPREPLY=($(compgen -W '' -- \"${'$'}{word}\"))\n      ;;\n    \"pathArg\")\n       __complete_files \"${'$'}{word}\"\n      ;;\n    \"explicitArg\")\n      COMPREPLY=($(compgen -W 'bar baz foo' -- \"${'$'}{word}\"))\n      ;;\"\"\"\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliEvaluatorTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport com.github.tomakehurst.wiremock.client.WireMock.*\nimport com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo\nimport com.github.tomakehurst.wiremock.junit5.WireMockTest\nimport java.io.ByteArrayInputStream\nimport java.io.ByteArrayOutputStream\nimport java.net.ServerSocket\nimport java.net.URI\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.time.Duration\nimport java.util.regex.Pattern\nimport kotlin.io.path.*\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.*\nimport org.junit.jupiter.api.condition.DisabledOnOs\nimport org.junit.jupiter.api.condition.EnabledOnOs\nimport org.junit.jupiter.api.condition.OS\nimport org.junit.jupiter.api.io.TempDir\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.EnumSource\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.readString\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.toPath\nimport org.pkl.commons.writeString\nimport org.pkl.core.OutputFormat\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.util.IoUtils\n\n@OptIn(ExperimentalPathApi::class)\n@WireMockTest(httpsEnabled = true, proxyMode = true)\nclass CliEvaluatorTest {\n  companion object {\n    private val defaultContents =\n      \"\"\"\n      person {\n        name = \"pigeon\"\n        age = 20 + 10\n      }\n    \"\"\"\n        .trimIndent()\n\n    private val packageServer = PackageServer()\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      packageServer.close()\n    }\n  }\n\n  // use manually constructed temp dir instead of @TempDir to work around\n  // https://forums.developer.apple.com/thread/118358\n  private val tempDir: Path = run {\n    val baseDir = FileTestUtils.rootProjectDir.resolve(\"pkl-cli/build/tmp/CliEvaluatorTest\")\n    baseDir.createDirectories()\n    Files.createTempDirectory(baseDir, null)\n  }\n\n  @AfterEach\n  fun afterEach() {\n    tempDir.deleteRecursively()\n  }\n\n  @Test\n  fun `generate Pcf`() {\n    val sourceFiles = listOf(writePklFile(\"test.pkl\"))\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"pcf\")\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.pcf\",\n      \"\"\"\nperson {\n  name = \"pigeon\"\n  age = 30\n}\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `generate JSON`() {\n    val sourceFiles = listOf(writePklFile(\"test.pkl\"))\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"json\")\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.json\",\n      \"\"\"\n{\n  \"person\": {\n    \"name\": \"pigeon\",\n    \"age\": 30\n  }\n}\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `generate YAML`() {\n    val sourceFiles = listOf(writePklFile(\"test.pkl\"))\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"yaml\")\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.yaml\",\n      \"\"\"\nperson:\n  name: pigeon\n  age: 30\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `generate plist`() {\n    val sourceFiles = listOf(writePklFile(\"test.pkl\"))\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"plist\")\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.plist\",\n      \"\"\"\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>person</key>\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>30</integer>\n  </dict>\n</dict>\n</plist>\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `generate XML`() {\n    val sourceFiles = listOf(writePklFile(\"test.pkl\"))\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"xml\")\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.xml\",\n      \"\"\"\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <person>\n    <name>pigeon</name>\n    <age>30</age>\n  </person>\n</root>\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `unknown output format`() {\n    val sourceFiles = listOf(writePklFile(\"test.pkl\"))\n\n    val e =\n      assertThrows<CliException> {\n        evalToFiles(\n          CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"unknown\")\n        )\n      }\n\n    assertThat(e).hasMessageContaining(\"Unknown output format: `unknown`. \")\n  }\n\n  @Test\n  fun `generate multiple files`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\"file1.pkl\", \"x = 1 + 1\"),\n        writePklFile(\"file2.pkl\", \"x = 2 + 2\"),\n        writePklFile(\"file3.pkl\", \"x = 3 + 3\"),\n      )\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"pcf\")\n      )\n\n    assertThat(outputFiles).hasSize(3)\n    checkOutputFile(outputFiles[0], \"file1.pcf\", \"x = 2\")\n    checkOutputFile(outputFiles[1], \"file2.pcf\", \"x = 4\")\n    checkOutputFile(outputFiles[2], \"file3.pcf\", \"x = 6\")\n  }\n\n  @Test\n  fun `module path module as source module`() {\n    val dir = tempDir.resolve(\"foo\").resolve(\"bar\").createDirectories()\n    dir.resolve(\"test.pkl\").writeString(defaultContents)\n    // check relative imports too\n    dir\n      .resolve(\"test2.pkl\")\n      .writeString(\n        \"\"\"\n      amends \"test.pkl\"\n      \n      person {\n        name = \"barn owl\"\n      }\n      \"\"\"\n          .trimIndent()\n      )\n\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(\n            sourceModules =\n              listOf(URI(\"modulepath:/foo/bar/test.pkl\"), URI(\"modulepath:/foo/bar/test2.pkl\")),\n            modulePath = listOf(tempDir),\n          ),\n          outputFormat = \"pcf\",\n          outputPath = \"$tempDir/%{moduleName}.%{outputFormat}\",\n        )\n      )\n\n    assertThat(outputFiles).hasSize(2)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.pcf\",\n      \"\"\"\nperson {\n  name = \"pigeon\"\n  age = 30\n}\n    \"\"\",\n    )\n    checkOutputFile(\n      outputFiles[1],\n      \"test2.pcf\",\n      \"\"\"\nperson {\n  name = \"barn owl\"\n  age = 30\n}\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `external properties`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\n          \"test.pkl\",\n          \"\"\"\nperson {\n  name = read(\"prop:name\")\n  age = read(\"prop:age\").toInt()\n}\n    \"\"\",\n        )\n      )\n\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(\n            sourceModules = sourceFiles,\n            externalProperties = mapOf(\"name\" to \"pigeon\", \"age\" to \"30\"),\n          ),\n          outputFormat = \"pcf\",\n        )\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.pcf\",\n      \"\"\"\nperson {\n  name = \"pigeon\"\n  age = 30\n}\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `custom working directory given as absolute path`() {\n    customWorkingDirectory(relativePath = false)\n  }\n\n  @Test\n  fun `custom working directory given as relative path (the norm when using cli)`() {\n    customWorkingDirectory(relativePath = true)\n  }\n\n  private fun customWorkingDirectory(relativePath: Boolean) {\n    val dir = tempDir.resolve(\"foo\").resolve(\"bar\").createDirectories()\n    val file = dir.resolve(\"test.pkl\").writeString(defaultContents)\n\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(\n            sourceModules = listOf(file.toUri()),\n            workingDir =\n              if (relativePath) IoUtils.getCurrentWorkingDir().relativize(dir.parent)\n              else dir.parent,\n          ),\n          outputFormat = \"pcf\",\n          outputPath = \"baz/%{moduleName}.pcf\",\n        )\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    assertThat(outputFiles[0].normalize()).isEqualTo(dir.parent.resolve(\"baz/test.pcf\"))\n    checkOutputFile(\n      outputFiles[0],\n      \"test.pcf\",\n      \"\"\"\nperson {\n  name = \"pigeon\"\n  age = 30\n}\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `source module with relative path`() {\n    val dir = tempDir.resolve(\"foo\").createDirectories()\n    dir.resolve(\"test.pkl\").writeString(defaultContents)\n\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(sourceModules = listOf(URI(\"foo/test.pkl\")), workingDir = tempDir),\n          outputFormat = \"pcf\",\n        )\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(\n      outputFiles[0],\n      \"test.pcf\",\n      \"\"\"\nperson {\n  name = \"pigeon\"\n  age = 30\n}\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `module path element with relative path`() {\n    val libDir = tempDir.resolve(\"lib\").resolve(\"foo\").createDirectories()\n    libDir.resolve(\"someLib.pkl\").writeString(\"x = 1\")\n\n    val pklScript =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\nimport \"modulepath:/foo/someLib.pkl\"\nresult = someLib.x\n    \"\"\",\n      )\n\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(\n            sourceModules = listOf(pklScript),\n            workingDir = tempDir,\n            modulePath = listOf(\"lib\".toPath()),\n          ),\n          outputFormat = \"pcf\",\n        )\n      )\n\n    assertThat(outputFiles).hasSize(1)\n    checkOutputFile(outputFiles[0], \"test.pcf\", \"result = 1\")\n  }\n\n  @Test\n  fun `moduleDir is relative to workingDir even if not descendant`() {\n    val contents = \"foo = 42\"\n    val file = writePklFile(\"some/nested/structure.pkl\", contents)\n    val workingDir = tempDir.resolve(\"another/structure\").createDirectories()\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(sourceModules = listOf(file), workingDir = workingDir),\n          outputPath = \"%{moduleDir}/result.pcf\",\n          outputFormat = \"pcf\",\n        )\n      )\n    assertThat(outputFiles).hasSize(1)\n    assertThat(outputFiles[0]).isEqualTo(tempDir.resolve(\"some/nested/result.pcf\"))\n    checkOutputFile(outputFiles[0], \"result.pcf\", contents)\n  }\n\n  // Can't reliably create symlinks on Windows.\n  // Might get errors like \"A required privilege is not held by the client\".\n  @Test\n  @DisabledOnOs(OS.WINDOWS)\n  fun `moduleDir is relative to workingDir even through symlinks`() {\n    val contents = \"foo = 42\"\n    val realWorkingDir = tempDir.resolve(\"workingDir\").createDirectories()\n    val symlinkToTempDir = Files.createSymbolicLink(tempDir.resolve(\"symlinkToTempDir\"), tempDir)\n    val workingDir = symlinkToTempDir.resolve(\"workingDir\")\n    val file = realWorkingDir.resolve(\"test.pkl\").writeString(contents).toUri()\n    val outputFiles =\n      evalToFiles(\n        CliEvaluatorOptions(\n          CliBaseOptions(sourceModules = listOf(file), workingDir = workingDir),\n          outputFormat = \"pcf\",\n        )\n      )\n    assertThat(outputFiles).hasSize(1)\n    assertThat(outputFiles[0].toString()).doesNotContain(\"symlinkToTempDir\")\n    checkOutputFile(outputFiles[0], \"test.pcf\", contents)\n  }\n\n  @Test\n  fun `take input from stdin`() {\n    val stdin = ByteArrayInputStream(defaultContents.toByteArray(StandardCharsets.UTF_8))\n    val stdout = ByteArrayOutputStream()\n    val evaluator =\n      CliEvaluator(\n        CliEvaluatorOptions(\n          CliBaseOptions(sourceModules = listOf(URI(\"repl:text\"))),\n          outputFormat = \"pcf\",\n        ),\n        stdin,\n        stdout,\n      )\n    evaluator.run()\n    assertThat(stdout.toString(StandardCharsets.UTF_8).trim())\n      .isEqualTo(defaultContents.replace(\"20 + 10\", \"30\").trim())\n  }\n\n  @Test\n  fun `write output to console`() {\n    val module1 = writePklFile(\"mod1.pkl\", \"x = 21 + 21\")\n    val module2 = writePklFile(\"mod2.pkl\", \"y = 11 + 11\")\n\n    val output =\n      evalToConsole(CliEvaluatorOptions(CliBaseOptions(sourceModules = listOf(module1, module2))))\n\n    assertThat(output).isEqualTo(\"x = 42\\n---\\ny = 22\\n\")\n  }\n\n  @Test\n  fun `evaluation timeout`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\n          \"test.pkl\",\n          \"\"\"\n      function fib(n) = if (n < 2) 0 else fib(n - 1) + fib(n - 2)\n      x = fib(100)\n    \"\"\",\n        )\n      )\n\n    val e =\n      assertThrows<CliException> {\n        evalToFiles(\n          CliEvaluatorOptions(\n            CliBaseOptions(sourceModules = sourceFiles, timeout = Duration.ofMillis(100)),\n            outputFormat = \"pcf\",\n          )\n        )\n      }\n    assertThat(e.message).contains(\"timed out\")\n  }\n\n  @Test\n  fun `cannot import module located outside root dir`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\n          \"test.pkl\",\n          \"\"\"\n      amends \"/non/existing.pkl\"\n    \"\"\",\n        )\n      )\n\n    val e =\n      assertThrows<CliException> {\n        evalToFiles(\n          CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles, rootDir = tempDir))\n        )\n      }\n\n    assertThat(e.message).contains(\"Refusing to load module `file:///non/existing.pkl`\")\n  }\n\n  @Test\n  fun `concatenate file outputs`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\"test1.pkl\", \"x = 1\"),\n        writePklFile(\"test2.pkl\", \"x = 2\"),\n        writePklFile(\"test3.pkl\", \"x = 3\"),\n      )\n\n    val outputFile = tempDir.resolve(\"output.yaml\")\n\n    evalToFiles(\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = sourceFiles),\n        outputFile.toString(),\n        \"yaml\",\n      )\n    )\n\n    checkOutputFile(outputFile, \"output.yaml\", \"x: 1\\n---\\nx: 2\\n---\\nx: 3\")\n  }\n\n  @Test\n  fun `concatenate file outputs - some empty YAML streams`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\n          \"test0.pkl\",\n          \"output { value = List(); renderer = new YamlRenderer { isStream = true } }\",\n        ),\n        writePklFile(\"test1.pkl\", \"x = 1\"),\n        writePklFile(\n          \"test2.pkl\",\n          \"output { value = List(); renderer = new YamlRenderer { isStream = true } }\",\n        ),\n        writePklFile(\"test3.pkl\", \"x = 3\"),\n        writePklFile(\n          \"test4.pkl\",\n          \"output { value = List(); renderer = new YamlRenderer { isStream = true } }\",\n        ),\n      )\n\n    val outputFile = tempDir.resolve(\"output.yaml\")\n\n    evalToFiles(\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = sourceFiles),\n        outputFile.toString(),\n        \"yaml\",\n      )\n    )\n\n    checkOutputFile(outputFile, \"output.yaml\", \"x: 1\\n---\\nx: 3\")\n  }\n\n  @Test\n  fun `concatenate module outputs with custom separator`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\"test1.pkl\", \"x = 1\"),\n        writePklFile(\"test2.pkl\", \"x = 2\"),\n        writePklFile(\"test3.pkl\", \"x = 3\"),\n      )\n\n    val outputFile = tempDir.resolve(\"output.pcf\")\n\n    evalToFiles(\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = sourceFiles),\n        outputFile.toString(),\n        outputFormat = \"pcf\",\n        moduleOutputSeparator = \"// my module separator\",\n      )\n    )\n\n    checkOutputFile(\n      outputFile,\n      \"output.pcf\",\n      \"\"\"\n      x = 1\n      // my module separator\n      x = 2\n      // my module separator\n      x = 3\n      \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `concatenate module outputs with empty custom separator`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\"test1.pkl\", \"x = 1\"),\n        writePklFile(\"test2.pkl\", \"y = 2\"),\n        writePklFile(\"test3.pkl\", \"z = 3\"),\n      )\n\n    val outputFile = tempDir.resolve(\"output.pcf\")\n\n    evalToFiles(\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = sourceFiles),\n        outputFile.toString(),\n        outputFormat = \"pcf\",\n        moduleOutputSeparator = \"\",\n      )\n    )\n\n    checkOutputFile(\n      outputFile,\n      \"output.pcf\",\n      \"\"\"\n      x = 1\n      \n      y = 2\n      \n      z = 3\n      \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `concatenate console outputs`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\"test1.pkl\", \"x = 1\"),\n        writePklFile(\"test2.pkl\", \"x = 2\"),\n        writePklFile(\"test3.pkl\", \"x = 3\"),\n      )\n\n    val output =\n      evalToConsole(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"yaml\")\n      )\n\n    assertThat(output).isEqualTo(\"x: 1\\n---\\nx: 2\\n---\\nx: 3\\n\")\n  }\n\n  @Test\n  fun `concatenate console outputs - some empty YAML streams`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\n          \"test0.pkl\",\n          \"output { value = List(); renderer = new YamlRenderer { isStream = true } }\",\n        ),\n        writePklFile(\"test1.pkl\", \"x = 1\"),\n        writePklFile(\n          \"test2.pkl\",\n          \"output { value = List(); renderer = new YamlRenderer { isStream = true } }\",\n        ),\n        writePklFile(\"test3.pkl\", \"x = 3\"),\n        writePklFile(\n          \"test4.pkl\",\n          \"output { value = List(); renderer = new YamlRenderer { isStream = true } }\",\n        ),\n      )\n\n    val output =\n      evalToConsole(\n        CliEvaluatorOptions(CliBaseOptions(sourceModules = sourceFiles), outputFormat = \"yaml\")\n      )\n\n    assertThat(output).isEqualTo(\"x: 1\\n---\\nx: 3\\n\")\n  }\n\n  // prototext can't render `Dynamic`.\n  @EnumSource(names = [\"TEXTPROTO\"], mode = EnumSource.Mode.EXCLUDE)\n  @ParameterizedTest(name = \"{0} console output ends with newline\")\n  fun `console output ends with newline`(outputFormat: OutputFormat) {\n    val sourceFiles = listOf(writePklFile(\"test0.pkl\", \"foo = 0\\nbar=\\\"Baz\\\"\"))\n    val output =\n      evalToConsole(\n        CliEvaluatorOptions(\n          CliBaseOptions(sourceModules = sourceFiles),\n          outputFormat = outputFormat.toString(),\n        )\n      )\n    assertThat(output).endsWith(\"\\n\")\n  }\n\n  @Test\n  fun `file output throws if output file is a directory`() {\n    val sourceFiles =\n      listOf(\n        writePklFile(\n          \"test.pkl\",\n          \"\"\"\n          name = \"test\"\n          output {\n            files {\n              [\"\\(name).txt\"] {\n                text = \"test\"\n              }\n            } \n          }\n        \"\"\"\n            .trimIndent(),\n        )\n      )\n    val err =\n      assertThrows<CliException> {\n        evalToFiles(\n          CliEvaluatorOptions(\n            CliBaseOptions(sourceModules = sourceFiles),\n            outputPath = tempDir.toString(),\n          )\n        )\n      }\n    assertThat(err)\n      .hasMessageContaining(\"Output file `$tempDir` is a directory. \")\n      .hasMessageContaining(\"Did you mean `--multiple-file-output-path`?\")\n  }\n\n  @Test\n  fun `multiple file output writes multiple files to the provided directory`() {\n    val contents =\n      \"\"\"\n      output {\n        files {\n          [\"foo.pcf\"] {\n            value = new Dynamic {\n              [\"bar\"] = \"baz\"\n            }\n          }\n          [\"bar/baz.pcf\"] {\n            value = new Dynamic {\n              [\"baz\"] = \"biz\"\n            }\n          }\n          [\"buz.txt\"] {\n            text = \"buz\"\n          }\n        }\n      }\n      \"\"\"\n        .trimIndent()\n    val sourceFile = writePklFile(\"test.pkl\", contents)\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(sourceFile), workingDir = tempDir),\n        outputPath = \"my-outputs\",\n        multipleFileOutputPath = \".my-output/\",\n      )\n    val evaluator = CliEvaluator(options)\n    evaluator.run()\n    checkOutputFile(\n      tempDir.resolve(\".my-output/foo.pcf\"),\n      \"foo.pcf\",\n      \"\"\"\n      [\"bar\"] = \"baz\"\n      \"\"\"\n        .trimIndent(),\n    )\n    checkOutputFile(\n      tempDir.resolve(\".my-output/bar/baz.pcf\"),\n      \"baz.pcf\",\n      \"\"\"\n      [\"baz\"] = \"biz\"\n      \"\"\"\n        .trimIndent(),\n    )\n    checkOutputFile(tempDir.resolve(\".my-output/buz.txt\"), \"buz.txt\", \"buz\")\n  }\n\n  @Test\n  fun `multiple file output writes multiple modules to the output path`() {\n    val sourceModules =\n      listOf(\n        writePklFile(\n          \"test0.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"foo.pcf\"] {\n              value = new Dynamic {\n                [\"bar\"] = \"baz\"\n              }\n            }\n          }\n        }\n        \"\"\"\n            .trimIndent(),\n        ),\n        writePklFile(\n          \"test1.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"bar.pcf\"] {\n              value = new Dynamic {\n                [\"bar\"] = \"baz\"\n              }\n            }\n          }\n        }\n        \"\"\"\n            .trimIndent(),\n        ),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = sourceModules, workingDir = tempDir),\n        multipleFileOutputPath = \".\",\n      )\n    CliEvaluator(options).run()\n    assertThat(tempDir.resolve(\"foo.pcf\")).isRegularFile.hasFileName(\"foo.pcf\")\n    assertThat(tempDir.resolve(\"bar.pcf\")).isRegularFile.hasFileName(\"bar.pcf\")\n  }\n\n  @Test\n  fun `multiple file output throws in case of conflict`() {\n    val sourceModules =\n      listOf(\n        writePklFile(\n          \"bar.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"foo.pcf\"] {\n              text = \"myBar\"\n            }\n          }\n        }\n      \"\"\"\n            .trimIndent(),\n        ),\n        writePklFile(\n          \"foo.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"foo.pcf\"] {\n              text = \"myFoo\"\n            }\n          }\n        }\n      \"\"\"\n            .trimIndent(),\n        ),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = sourceModules, workingDir = tempDir),\n        multipleFileOutputPath = \".\",\n      )\n    assertThrows<CliException> { CliEvaluator(options).run() }\n  }\n\n  @Test\n  fun `multiple file output writes nothing if output files is null`() {\n    val moduleUri = writePklFile(\"test.pkl\", \"\")\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        multipleFileOutputPath = \".output\",\n      )\n    val output = evalToConsole(options)\n    assertThat(output).isEqualTo(\"\")\n    assertThat(tempDir.listDirectoryEntries()).hasSize(1)\n  }\n\n  @Test\n  fun `multiple file output throws if files are written outside the base path`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n        output {\n          files {\n            [\"../foo.txt\"] {\n              text = \"bar\"\n            }\n          }\n        }\n      \"\"\"\n          .trimIndent(),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        multipleFileOutputPath = \".output\",\n      )\n    assertThatCode { evalToConsole(options) }\n      .hasMessageStartingWith(\"Output file conflict:\")\n      .hasMessageContaining(\"which is outside output directory\")\n  }\n\n  @Test\n  fun `multiple file output throws if file path is a directory`() {\n    tempDir.resolve(\".output/myDir\").createDirectories()\n    val moduleUris =\n      listOf(\n        writePklFile(\n          \"test1.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\".\"] { text = \"bar\" }\n          }\n        }\n      \"\"\"\n            .trimIndent(),\n        ),\n        writePklFile(\n          \"test2.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"myDir\"] { text = \"bar\" }\n          }\n        }\n      \"\"\"\n            .trimIndent(),\n        ),\n      )\n    for (moduleUri in moduleUris) {\n      val options =\n        CliEvaluatorOptions(\n          CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n          multipleFileOutputPath = \".output\",\n        )\n      assertThatCode { evalToConsole(options) }\n        .hasMessageStartingWith(\"Output file conflict:\")\n        .hasMessageContaining(\"which is a directory\")\n    }\n  }\n\n  @Test\n  fun `multiple file output throws on conflicting files`() {\n    val moduleUris =\n      listOf(\n        writePklFile(\n          \"test1.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"foo.txt\"] { text = \"bar\" }\n          }\n        }\n      \"\"\"\n            .trimIndent(),\n        ),\n        writePklFile(\n          \"test2.pkl\",\n          \"\"\"\n        output {\n          files {\n            [\"foo.txt\"] { text = \"bar\" }\n          }\n        }\n      \"\"\"\n            .trimIndent(),\n        ),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = moduleUris, workingDir = tempDir),\n        multipleFileOutputPath = \".output\",\n      )\n    assertThatCode { evalToConsole(options) }\n      .hasMessageContaining(\"Output file conflict:\")\n      .hasMessageContaining(\"resolve to the same file path\")\n  }\n\n  @Test\n  fun `multi-output throws on conflicting files within the same module`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      output {\n        files {\n          [\"foo.txt\"] { text = \"bar\" }\n          [\"./foo.txt\"] { text = \"bar\" }\n        }\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        multipleFileOutputPath = \".output\",\n      )\n    assertThatCode { evalToConsole(options) }\n      .hasMessageContaining(\"Output file conflict:\")\n      .hasMessageContaining(\"resolve to the same file path\")\n  }\n\n  @Test\n  @EnabledOnOs(OS.WINDOWS)\n  fun `multiple-file output throws when using invalid Windows characters`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      output {\n        files {\n          [\"foo:bar\"] { text = \"bar\" }\n        }\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        multipleFileOutputPath = \".output\",\n      )\n    assertThatCode { evalToConsole(options) }\n      .hasMessageContaining(\"Path spec `foo:bar` contains illegal character `:`.\")\n  }\n\n  @Test\n  @EnabledOnOs(OS.WINDOWS)\n  fun `multiple-file output - cannot use backslash as dir separator on Windows`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      output {\n        files {\n          [\"foo\\\\bar\"] { text = \"bar\" }\n        }\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        multipleFileOutputPath = \".output\",\n      )\n    assertThatCode { evalToConsole(options) }\n      .hasMessageContaining(\"Path spec `foo\\\\bar` contains illegal character `\\\\`.\")\n  }\n\n  @Test\n  fun `evaluate output expression`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      foo {\n        bar = 1\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        expression = \"foo\",\n      )\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8))\n      .isEqualTo(\n        \"\"\"\n      new Dynamic { bar = 1 }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `evaluate output expression - custom toString()`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      class Person {\n        name: String\n\n        function toString() = \"Person(\\(name))\"\n      }\n      person: Person = new { name = \"Frodo\" }\n    \"\"\"\n          .trimIndent(),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        expression = \"person\",\n      )\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8)).isEqualTo(\"Person(Frodo)\")\n  }\n\n  @Test\n  fun `evaluate output expression - nested structure`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      person {\n        friend { name = \"Bilbo\" }\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir),\n        expression = \"person\",\n      )\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8))\n      .isEqualTo(\"new Dynamic { friend { name = \\\"Bilbo\\\" } }\")\n  }\n\n  @Test\n  fun `skip PklProject file`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      res = 1\n    \"\"\"\n          .trimIndent(),\n      )\n    writePklFile(\n      \"PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      package = throw(\"invalid project package\")\n    \"\"\"\n        .trimIndent(),\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir, noProject = true)\n      )\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8)).isEqualTo(\"res = 1\\n\")\n  }\n\n  @Test\n  fun `settings from PklProject file`() {\n\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      res = read*(\"env:**\")\n    \"\"\"\n          .trimIndent(),\n      )\n    writePklFile(\n      \"PklProject\",\n      // language=Pkl\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      evaluatorSettings {\n        env {\n          [\"foo\"] = \"foo\"\n          [\"bar\"] = \"bar\"\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    val options =\n      CliEvaluatorOptions(CliBaseOptions(sourceModules = listOf(moduleUri), workingDir = tempDir))\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8))\n      .isEqualTo(\n        \"\"\"\n      res {\n        [\"env:bar\"] = \"bar\"\n        [\"env:foo\"] = \"foo\"\n      }\n      \n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `noProxy settings from PklProject file`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      res = read(\"https://localhost:${packageServer.port}/birds@0.5.0\").bytes.sha256\n    \"\"\"\n          .trimIndent(),\n      )\n    writePklFile(\n      \"PklProject\",\n      // language=Pkl\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      evaluatorSettings {\n        http {\n          proxy {\n          address = \"http://example.example\"\n          noProxy {\n            \"localhost:${packageServer.port}\"\n            }\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(moduleUri),\n          workingDir = tempDir,\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n        )\n      )\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8))\n      .isEqualTo(\"res = \\\"b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de\\\"\\n\")\n  }\n\n  @Test\n  fun `noProxy settings from settings file`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      res = read(\"https://localhost:${packageServer.port}/birds@0.5.0\").bytes.sha256\n    \"\"\"\n          .trimIndent(),\n      )\n    val settingsFile =\n      writePklFile(\n        \"settings.pkl\",\n        // language=Pkl\n        \"\"\"\n      amends \"pkl:settings\"\n      \n      http {\n        proxy {\n        address = \"http://example.example\"\n        noProxy {\n          \"localhost:${packageServer.port}\"\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent(),\n      )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(moduleUri),\n          workingDir = tempDir,\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          settings = settingsFile,\n        )\n      )\n    val buffer = ByteArrayOutputStream()\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8))\n      .isEqualTo(\"res = \\\"b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de\\\"\\n\")\n  }\n\n  @Test\n  fun `setting noCache will skip writing to the cache dir`() {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      import \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n      \n      res = Swallow\n    \"\"\"\n          .trimIndent(),\n      )\n    val buffer = ByteArrayOutputStream()\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(moduleUri),\n          workingDir = tempDir,\n          moduleCacheDir = tempDir,\n          noCache = true,\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n        )\n      )\n    CliEvaluator(options, outputStream = buffer).run()\n    assertThat(buffer.toString(StandardCharsets.UTF_8))\n      .isEqualTo(\n        \"\"\"\n      res {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n      \n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(tempDir.resolve(\"package-2\")).doesNotExist()\n  }\n\n  @Test\n  fun `gives decent error message if certificate file contains random text`() {\n    val certsFile = tempDir.writeFile(\"random.pem\", \"RANDOM\")\n    val err = assertThrows<CliException> { evalModuleThatImportsPackage(certsFile) }\n    assertThat(err)\n      .hasMessageContaining(\"Error parsing CA certificate file `${certsFile.pathString}`:\")\n      .hasMessageContaining(\"No certificate data found\")\n      .hasMessageNotContainingAny(\"java.\", \"sun.\") // class names have been filtered out\n  }\n\n  @Test\n  fun `gives decent error message if certificate file is empty`(@TempDir tempDir: Path) {\n    val emptyCerts = tempDir.writeEmptyFile(\"empty.pem\")\n    val err = assertThrows<CliException> { evalModuleThatImportsPackage(emptyCerts) }\n    assertThat(err).hasMessageContaining(\"CA certificate file `${emptyCerts.pathString}` is empty.\")\n  }\n\n  @Test\n  fun `gives decent error message if certificate cannot be parsed`(@TempDir tempDir: Path) {\n    val invalidCerts = FileTestUtils.writeCertificateWithMissingLines(tempDir)\n    val err = assertThrows<CliException> { evalModuleThatImportsPackage(invalidCerts) }\n    assertThat(err)\n      // no assert for detail message because it differs between JDK implementations\n      .hasMessageContaining(\"Error parsing CA certificate file `${invalidCerts.pathString}`:\")\n      .hasMessageNotContainingAny(\"java.\", \"sun.\") // class names have been filtered out\n  }\n\n  @Test\n  fun `gives decent error message if CLI doesn't have the required CA certificate`() {\n    val err = assertThrows<CliException> { evalModuleThatImportsPackage(null, packageServer.port) }\n    assertThat(err)\n      .hasMessageContaining(\"Error during SSL handshake with host `localhost`:\")\n      .hasMessageContaining(\"unable to find valid certification path to requested target\")\n      .hasMessageNotContainingAny(\"java.\", \"sun.\") // class names have been filtered out\n  }\n\n  @Test\n  fun `eval http module from proxy`(wwRuntimeInfo: WireMockRuntimeInfo) {\n    stubFor(\n      get(urlEqualTo(\"/bar.pkl\")).withHost(equalTo(\"not.a.valid.host\")).willReturn(ok(\"foo = 1\"))\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(URI(\"http://not.a.valid.host/bar.pkl\")),\n          httpProxy = URI(\"http://localhost:${wwRuntimeInfo.httpPort}\"),\n          allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile(\"http:\"),\n        )\n      )\n    val output = evalToConsole(options)\n    assertThat(output).isEqualTo(\"foo = 1\\n\")\n  }\n\n  @Test\n  fun `eval https -- no proxy`(wwRuntimeInfo: WireMockRuntimeInfo) {\n    // pick an address on the local machine so we can be sure this test is not making any outbound\n    // connections.\n    val openPort = ServerSocket(0).use { it.localPort }\n    val targetAddress = \"https://127.0.0.1:$openPort\"\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          // use loopback address to prevent test from making outbound http connection.\n          sourceModules = listOf(URI(\"$targetAddress/foo.pkl\")),\n          httpProxy = URI(wwRuntimeInfo.httpBaseUrl),\n          httpNoProxy = listOf(\"*\"),\n          allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile(\"http:\"),\n        )\n      )\n    assertThatCode { evalToConsole(options) }\n      .hasMessageContaining(\"I/O error loading module `$targetAddress/foo.pkl`\")\n  }\n\n  @Test\n  @Disabled // TODO: figure out why this is failing.\n  fun `eval package from proxy`(wwRuntimeInfo: WireMockRuntimeInfo) {\n    stubFor(\n      any(anyUrl()).willReturn(aResponse().proxiedFrom(\"https://localhost:${packageServer.port}\"))\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(URI(\"package://localhost:1/birds@0.5.0#/catalog/Ostrich.pkl\")),\n          noCache = true,\n          httpProxy = URI(wwRuntimeInfo.httpBaseUrl),\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile(\"http:\"),\n        )\n      )\n    val output = evalToConsole(options)\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n      name = \"Ostrich\"\n\n      favoriteFruit {\n        name = \"Orange\"\n      }\n\n    \"\"\"\n          .trimIndent()\n      )\n    verify(getRequestedFor(urlEqualTo(\"birds@0.5.0\")))\n    verify(getRequestedFor(urlEqualTo(\"fruit@1.0.5\")))\n  }\n\n  @Test\n  fun `eval http module from proxy -- configured in settings`(\n    @TempDir tempDir: Path,\n    wwRuntimeInfo: WireMockRuntimeInfo,\n  ) {\n    val settingsModule =\n      tempDir.writeFile(\n        \"settings.pkl\",\n        \"\"\"\n      amends \"pkl:settings\"\n\n      http {\n        proxy {\n          address = \"${wwRuntimeInfo.httpBaseUrl}\"\n        }\n      }\n      \"\"\"\n          .trimIndent(),\n      )\n\n    stubFor(\n      get(urlEqualTo(\"/bar.pkl\")).withHost(equalTo(\"not.a.valid.host\")).willReturn(ok(\"foo = 1\"))\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(URI(\"http://not.a.valid.host/bar.pkl\")),\n          settings = settingsModule.toUri(),\n          allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile(\"http:\"),\n        )\n      )\n    val output = evalToConsole(options)\n    assertThat(output).isEqualTo(\"foo = 1\\n\")\n  }\n\n  @Test\n  fun `eval http module from proxy -- configured in PklProject`(\n    @TempDir tempDir: Path,\n    wwRuntimeInfo: WireMockRuntimeInfo,\n  ) {\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n\n      evaluatorSettings {\n        http {\n          proxy {\n            address = \"${wwRuntimeInfo.httpBaseUrl}\"\n          }\n        }\n      }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    stubFor(\n      get(urlEqualTo(\"/bar.pkl\")).withHost(equalTo(\"not.a.valid.host\")).willReturn(ok(\"foo = 1\"))\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(URI(\"http://not.a.valid.host/bar.pkl\")),\n          allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile(\"http:\"),\n          projectDir = tempDir,\n        )\n      )\n    val output = evalToConsole(options)\n    assertThat(output).isEqualTo(\"foo = 1\\n\")\n  }\n\n  @Test\n  fun `eval http module from proxy -- PklProject beats user settings`(\n    @TempDir tempDir: Path,\n    wwRuntimeInfo: WireMockRuntimeInfo,\n  ) {\n    val projectDir = tempDir.resolve(\"my-project\")\n    projectDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n\n      evaluatorSettings {\n        http {\n          proxy {\n            address = \"${wwRuntimeInfo.httpBaseUrl}\"\n          }\n        }\n      }\n      \"\"\"\n        .trimIndent(),\n    )\n    val homeDir = tempDir.resolve(\"my-home\")\n    homeDir.writeFile(\n      \"settings.pkl\",\n      \"\"\"\n        amends \"pkl:settings\"\n\n        http {\n          proxy {\n            address = \"http://invalid.proxy.address\"\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(URI(\"http://not.a.valid.host/bar.pkl\")),\n          allowedModules = SecurityManagers.defaultAllowedModules + Pattern.compile(\"http:\"),\n          projectDir = projectDir,\n          settings = homeDir.resolve(\"settings.pkl\").toUri(),\n        )\n      )\n    stubFor(get(anyUrl()).willReturn(ok(\"result = 1\")))\n    val output = evalToConsole(options)\n    assertThat(output).isEqualTo(\"result = 1\\n\")\n  }\n\n  @Test\n  fun `eval file with non-ASCII name`() {\n    val tempDirUri = tempDir.toUri()\n    val dir = tempDir.resolve(\"🤬\").createDirectory()\n    val file =\n      writePklFile(\n        dir.resolve(\"日本語.pkl\").toString(),\n        \"\"\"\n      日本語 = \"Japanese language\"\n      readDir = read(\".\").text\n      readDirFile = read(\"$tempDirUri🤬\").text\n      readOne = read(\"日本語.pkl\").text.split(\"\\n\").first\n      readOneFile = read(\"$tempDirUri🤬/日本語.pkl\").text.split(\"\\n\").first\n      readGlob = read*(\"./日*.pkl\").keys\n      readGlobFile = read*(\"$tempDirUri**/*.pkl\").keys.map((it) -> it.replaceAll(\"$tempDirUri\".replaceAll(\"///\", \"/\"), \"\"))\n      importOne = import(\"日本語.pkl\").readOne\n      importOneFile = import(\"$tempDirUri🤬/日本語.pkl\").日本語\n      importGlob = import*(\"./日*.pkl\").keys\n      importGlobFile = import*(\"$tempDirUri**/*.pkl\").keys.map((it) -> it.replaceAll(\"$tempDirUri\".replaceAll(\"///\", \"/\"), \"\"))\n    \"\"\"\n          .trimIndent(),\n      )\n    val output = evalToConsole(CliEvaluatorOptions(CliBaseOptions(sourceModules = listOf(file))))\n\n    val tripleQuote = \"\\\"\\\"\\\"\"\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        日本語 = \"Japanese language\"\n        readDir = $tripleQuote\n          日本語.pkl\n          \n          $tripleQuote\n        readDirFile = $tripleQuote\n          日本語.pkl\n          \n          $tripleQuote\n        readOne = \"日本語 = \\\"Japanese language\\\"\"\n        readOneFile = \"日本語 = \\\"Japanese language\\\"\"\n        readGlob = Set(\"./日本語.pkl\")\n        readGlobFile = Set(\"🤬/日本語.pkl\")\n        importOne = \"日本語 = \\\"Japanese language\\\"\"\n        importOneFile = \"Japanese language\"\n        importGlob = Set(\"./日本語.pkl\")\n        importGlobFile = Set(\"🤬/日本語.pkl\")\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  @DisabledOnOs(OS.WINDOWS)\n  fun `multiple file output works with symlinked output directory`() {\n    val realOutputDir = tempDir.resolve(\"real-output\").createDirectories()\n\n    val symlinkOutputDir =\n      Files.createSymbolicLink(tempDir.resolve(\"symlink-output\"), realOutputDir)\n\n    val sourceFile =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n          pigeon {\n            name = \"Pigeon\"\n            diet = \"Seeds\"\n          }\n          parrot {\n            name = \"Parrot\"\n            diet = \"Seeds\"\n          }\n          output {\n            files {\n              [\"pigeon.json\"] {\n                value = pigeon\n                renderer = new JsonRenderer {}\n              }\n              [\"birds/parrot.yaml\"] {\n                value = parrot\n                renderer = new YamlRenderer {}\n              }\n            }\n          }\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(sourceModules = listOf(sourceFile), workingDir = tempDir),\n        multipleFileOutputPath = symlinkOutputDir.toString(),\n      )\n\n    CliEvaluator(options).run()\n\n    checkOutputFile(\n      realOutputDir.resolve(\"pigeon.json\"),\n      \"pigeon.json\",\n      \"\"\"\n        {\n          \"name\": \"Pigeon\",\n          \"diet\": \"Seeds\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    checkOutputFile(\n      realOutputDir.resolve(\"birds/parrot.yaml\"),\n      \"parrot.yaml\",\n      \"\"\"\n        name: Parrot\n        diet: Seeds\n      \"\"\"\n        .trimIndent(),\n    )\n\n    checkOutputFile(\n      symlinkOutputDir.resolve(\"pigeon.json\"),\n      \"pigeon.json\",\n      \"\"\"\n        {\n          \"name\": \"Pigeon\",\n          \"diet\": \"Seeds\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    checkOutputFile(\n      symlinkOutputDir.resolve(\"birds/parrot.yaml\"),\n      \"parrot.yaml\",\n      \"\"\"\n        name: Parrot\n        diet: Seeds\n      \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  private fun evalModuleThatImportsPackage(certsFile: Path?, testPort: Int = -1) {\n    val moduleUri =\n      writePklFile(\n        \"test.pkl\",\n        \"\"\"\n      import \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n      \n      res = Swallow\n    \"\"\",\n      )\n\n    val options =\n      CliEvaluatorOptions(\n        CliBaseOptions(\n          sourceModules = listOf(moduleUri),\n          caCertificates = buildList { if (certsFile != null) add(certsFile) },\n          workingDir = tempDir,\n          noCache = true,\n          testPort = testPort,\n        )\n      )\n    CliEvaluator(options).run()\n  }\n\n  private fun writePklFile(fileName: String, contents: String = defaultContents): URI {\n    tempDir.resolve(fileName).createParentDirectories()\n    return tempDir.resolve(fileName).writeString(contents).toUri()\n  }\n\n  private fun evalToFiles(options: CliEvaluatorOptions): List<Path> {\n    val evaluator =\n      CliEvaluator(\n        options.copy(\n          outputPath = options.outputPath ?: \"%{moduleDir}/%{moduleName}.%{outputFormat}\"\n        )\n      )\n\n    evaluator.run()\n    return evaluator.fileOutputPaths!!.values.toList()\n  }\n\n  private fun evalToConsole(options: CliEvaluatorOptions): String {\n    val reader = ByteArrayInputStream(byteArrayOf())\n    val writer = ByteArrayOutputStream()\n    CliEvaluator(options, reader, writer).run()\n    return writer.toString(StandardCharsets.UTF_8)\n  }\n\n  private fun checkOutputFile(file: Path, name: String, contents: String) {\n    assertThat(file).isRegularFile.hasFileName(name)\n    assertThat(file.readString().trim()).isEqualTo(contents.trim())\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliFormatterTest.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.nio.file.Path\nimport kotlin.io.path.writeText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBugException\nimport org.pkl.commons.cli.CliException\nimport org.pkl.core.util.StringBuilderWriter\nimport org.pkl.formatter.GrammarVersion\n\nclass CliFormatterTest {\n  @Test\n  fun `no double newline when writing to stdout`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"foo.pkl\").also { it.writeText(\"foo = 1\") }\n    val sb = StringBuilder()\n    val writer = StringBuilderWriter(sb)\n    val cmd =\n      CliFormatterCommand(\n        listOf(file),\n        GrammarVersion.latest(),\n        overwrite = false,\n        diffNameOnly = false,\n        silent = false,\n        consoleWriter = writer,\n      )\n    try {\n      cmd.run()\n    } catch (_: CliException) {}\n    assertThat(sb.toString()).isEqualTo(\"foo = 1\\n\")\n  }\n\n  @Test\n  fun `parse errors do not result in bug exceptions`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"foo.pkl\").also { it.writeText(\"foo = \\\"/foo/\\\\\\${BAR}/baz\\\"\") }\n    val sb = StringBuilder()\n    val writer = StringBuilderWriter(sb)\n    val cmd =\n      CliFormatterCommand(\n        listOf(file),\n        GrammarVersion.latest(),\n        overwrite = false,\n        diffNameOnly = false,\n        silent = false,\n        consoleWriter = writer,\n      )\n    val exc = assertThrows<CliException> { cmd.run() }\n    assertThat(exc).isNotInstanceOf(CliBugException::class.java)\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliImportAnalyzerTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.net.URI\nimport java.nio.file.Path\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.writeString\nimport org.pkl.core.OutputFormat\nimport org.pkl.core.util.StringBuilderWriter\n\nclass CliImportAnalyzerTest {\n  @Test\n  fun `write to console writer`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"test.pkl\").writeString(\"import \\\"bar.pkl\\\"\")\n    val otherFile = tempDir.resolve(\"bar.pkl\").writeString(\"\")\n    val baseOptions = CliBaseOptions(sourceModules = listOf(file.toUri()))\n    val sb = StringBuilder()\n    val analyzer = CliImportAnalyzer(CliImportAnalyzerOptions(baseOptions), StringBuilderWriter(sb))\n    analyzer.run()\n    assertThat(sb.toString())\n      .isEqualTo(\n        \"\"\"\n          imports {\n            [\"${otherFile.toUri()}\"] {}\n            [\"${file.toUri()}\"] {\n              new {\n                uri = \"${otherFile.toUri()}\"\n              }\n            }\n          }\n          resolvedImports {\n            [\"${otherFile.toUri()}\"] = \"${otherFile.toRealPath().toUri()}\"\n            [\"${file.toUri()}\"] = \"${file.toRealPath().toUri()}\"\n          }\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `different output format`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"test.pkl\").writeString(\"import \\\"bar.pkl\\\"\")\n    val otherFile = tempDir.resolve(\"bar.pkl\").writeString(\"\")\n    val baseOptions = CliBaseOptions(sourceModules = listOf(file.toUri()))\n    val sb = StringBuilder()\n    val analyzer =\n      CliImportAnalyzer(\n        CliImportAnalyzerOptions(baseOptions, outputFormat = OutputFormat.JSON.toString()),\n        StringBuilderWriter(sb),\n      )\n    analyzer.run()\n    assertThat(sb.toString())\n      .isEqualTo(\n        \"\"\"\n          {\n            \"imports\": {\n              \"${otherFile.toUri()}\": [],\n              \"${file.toUri()}\": [\n                {\n                  \"uri\": \"${otherFile.toUri()}\"\n                }\n              ]\n            },\n            \"resolvedImports\": {\n              \"${otherFile.toUri()}\": \"${otherFile.toRealPath().toUri()}\",\n              \"${file.toUri()}\": \"${file.toRealPath().toUri()}\"\n            }\n          }\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `write to output file`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"test.pkl\").writeString(\"import \\\"bar.pkl\\\"\")\n    val otherFile = tempDir.resolve(\"bar.pkl\").writeString(\"\")\n    val outputPath = tempDir.resolve(\"imports.pcf\")\n    val baseOptions = CliBaseOptions(sourceModules = listOf(file.toUri()))\n    val analyzer = CliImportAnalyzer(CliImportAnalyzerOptions(baseOptions, outputPath = outputPath))\n    analyzer.run()\n    assertThat(outputPath)\n      .hasContent(\n        \"\"\"\n          imports {\n            [\"${otherFile.toUri()}\"] {}\n            [\"${file.toUri()}\"] {\n              new {\n                uri = \"${otherFile.toUri()}\"\n              }\n            }\n          }\n          resolvedImports {\n            [\"${otherFile.toUri()}\"] = \"${otherFile.toRealPath().toUri()}\"\n            [\"${file.toUri()}\"] = \"${file.toRealPath().toUri()}\"\n          }\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `invalid syntax in module`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"test.pkl\").writeString(\"foo = bar(]\")\n    assertThatCode {\n        CliImportAnalyzer(\n            CliImportAnalyzerOptions(\n              CliBaseOptions(sourceModules = listOf(file.toUri()), settings = URI(\"pkl:settings\"))\n            )\n          )\n          .run()\n      }\n      .hasMessageContaining(\n        \"\"\"\n          –– Pkl Error ––\n          Found a syntax error when parsing module `${file.toUri()}`.\n        \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliMainTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport com.github.ajalt.clikt.core.BadParameterValue\nimport com.github.ajalt.clikt.core.CliktError\nimport com.github.ajalt.clikt.core.parse\nimport java.nio.file.Path\nimport kotlin.io.path.createDirectory\nimport kotlin.io.path.createSymbolicLinkPointingTo\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.AssertionsForClassTypes.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.condition.DisabledOnOs\nimport org.junit.jupiter.api.condition.OS\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.cli.commands.EvalCommand\nimport org.pkl.cli.commands.RootCommand\nimport org.pkl.commons.writeString\nimport org.pkl.core.Release\n\nclass CliMainTest {\n  private val rootCmd = RootCommand()\n\n  @Test\n  fun `duplicate CLI option produces meaningful error message`(@TempDir tempDir: Path) {\n    val inputFile = tempDir.resolve(\"test.pkl\").writeString(\"\").toString()\n\n    assertThatCode {\n        rootCmd.parse(\n          arrayOf(\"eval\", \"--output-path\", \"path1\", \"--output-path\", \"path2\", inputFile)\n        )\n      }\n      .hasMessage(\"Option cannot be repeated\")\n\n    assertThatCode {\n        rootCmd.parse(arrayOf(\"eval\", \"-o\", \"path1\", \"--output-path\", \"path2\", inputFile))\n      }\n      .hasMessage(\"Option cannot be repeated\")\n  }\n\n  @Test\n  fun `eval requires at least one file`() {\n    assertThatCode { rootCmd.parse(arrayOf(\"eval\")) }\n      .isInstanceOf(CliktError::class.java)\n      .extracting(\"paramName\")\n      .isEqualTo(\"modules\")\n  }\n\n  // Can't reliably create symlinks on Windows.\n  // Might get errors like \"A required privilege is not held by the client\".\n  @Test\n  @DisabledOnOs(OS.WINDOWS)\n  fun `output to symlinked directory works`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      x = 3\n      \n      output {\n        value = x\n        renderer = new JsonRenderer {}\n      }\n    \"\"\"\n        .trimIndent()\n    val inputFile = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val outputFile = makeSymdir(tempDir, \"out\", \"linkOut\").resolve(\"test.pkl\").toString()\n\n    assertThatCode { rootCmd.parse(arrayOf(\"eval\", inputFile, \"-o\", outputFile)) }\n      .doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `cannot have multiple output with -o or -x`(@TempDir tempDir: Path) {\n    val testIn = makeInput(tempDir)\n    val testOut = tempDir.resolve(\"test\").toString()\n    val error = \"\"\"Option is mutually exclusive with -o, --output-path and -x, --expression.\"\"\"\n\n    assertThatCode { rootCmd.parse(arrayOf(\"eval\", \"-m\", testOut, \"-x\", \"x\", testIn)) }\n      .hasMessage(error)\n\n    assertThatCode { rootCmd.parse(arrayOf(\"eval\", \"-m\", testOut, \"-o\", \"/tmp/test\", testIn)) }\n      .hasMessage(error)\n  }\n\n  @Test\n  fun `showing version works`() {\n    assertThatCode { rootCmd.parse(arrayOf(\"--version\")) }.hasMessage(Release.current().versionInfo)\n  }\n\n  @Test\n  fun `file paths get parsed into URIs`(@TempDir tempDir: Path) {\n    val cmd = RootCommand()\n    cmd.parse(arrayOf(\"eval\", makeInput(tempDir, \"my file.txt\")))\n\n    val evalCmd = cmd.registeredSubcommands().filterIsInstance<EvalCommand>().first()\n    val modules = evalCmd.baseOptions.baseOptions(evalCmd.modules).normalizedSourceModules\n    assertThat(modules).hasSize(1)\n    assertThat(modules[0].path).endsWith(\"my file.txt\")\n  }\n\n  @Test\n  fun `invalid URIs are not accepted`() {\n    val ex = assertThrows<BadParameterValue> { rootCmd.parse(arrayOf(\"eval\", \"file:my file.txt\")) }\n\n    assertThat(ex.message).contains(\"URI `file:my file.txt` has invalid syntax\")\n  }\n\n  @Test\n  fun `invalid rewrites -- non-HTTP URI`() {\n    val ex =\n      assertThrows<BadParameterValue> {\n        rootCmd.parse(arrayOf(\"eval\", \"--http-rewrite\", \"foo=bar\", \"mymodule.pkl\"))\n      }\n    assertThat(ex.message)\n      .contains(\"Rewrite rule must start with 'http://' or 'https://', but was 'foo'\")\n  }\n\n  @Test\n  fun `invalid rewrites -- invalid URI`() {\n    val ex =\n      assertThrows<BadParameterValue> {\n        rootCmd.parse(arrayOf(\"eval\", \"--http-rewrite\", \"https://foo bar=baz\", \"mymodule.pkl\"))\n      }\n    assertThat(ex.message).contains(\"Rewrite target `https://foo bar` has invalid syntax\")\n  }\n\n  @Test\n  fun `invalid rewrites -- doesn't end with slash`() {\n    val ex =\n      assertThrows<BadParameterValue> {\n        rootCmd.parse(\n          arrayOf(\"eval\", \"--http-rewrite\", \"http://foo.com=https://bar.com\", \"mymodule.pkl\")\n        )\n      }\n    assertThat(ex.message).contains(\"Rewrite rule must end with '/', but was 'http://foo.com'\")\n  }\n\n  @Test\n  fun `missing --http-no-proxy flag is null`(@TempDir tempDir: Path) {\n    val inputFile = tempDir.resolve(\"test.pkl\").writeString(\"\").toString()\n    val command = EvalCommand()\n    command.parse(arrayOf(inputFile))\n    assertThat(command.baseOptions.noProxy).isNull()\n  }\n\n  private fun makeInput(tempDir: Path, fileName: String = \"test.pkl\"): String {\n    val code = \"x = 1\"\n    return tempDir.resolve(fileName).writeString(code).toString()\n  }\n\n  private fun makeSymdir(baseDir: Path, name: String, linkName: String): Path {\n    val dir = baseDir.resolve(name)\n    val link = baseDir.resolve(linkName)\n    dir.createDirectory()\n    link.createSymbolicLinkPointingTo(dir)\n    return link\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliPackageDownloaderTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.nio.file.Path\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.core.packages.PackageUri\n\nclass CliPackageDownloaderTest {\n  companion object {\n    private val server = PackageServer()\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      server.close()\n    }\n  }\n\n  @Test\n  fun `download packages`(@TempDir tempDir: Path) {\n    val cmd =\n      CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            moduleCacheDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris =\n          listOf(\n            PackageUri(\"package://localhost:0/birds@0.5.0\"),\n            PackageUri(\"package://localhost:0/fruit@1.0.5\"),\n            PackageUri(\"package://localhost:0/fruit@1.1.0\"),\n          ),\n        noTransitive = true,\n      )\n    cmd.run()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.zip\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.json\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/fruit@1.1.0/fruit@1.1.0.zip\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/fruit@1.1.0/fruit@1.1.0.json\")).exists()\n  }\n\n  @Test\n  fun `download packages with cache dir set by project`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      evaluatorSettings {\n        moduleCacheDir = \".my-cache\"\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val cmd =\n      CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            workingDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris = listOf(PackageUri(\"package://localhost:0/birds@0.5.0\")),\n        noTransitive = true,\n      )\n    cmd.run()\n    assertThat(tempDir.resolve(\".my-cache/package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip\"))\n      .exists()\n    assertThat(tempDir.resolve(\".my-cache/package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json\"))\n      .exists()\n  }\n\n  @Test\n  fun `download package while specifying checksum`(@TempDir tempDir: Path) {\n    val cmd =\n      CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            moduleCacheDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris =\n          listOf(\n            PackageUri(\"package://localhost:0/birds@0.5.0::sha256:${PackageServer.BIRDS_SHA}\")\n          ),\n        noTransitive = true,\n      )\n    cmd.run()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json\")).exists()\n  }\n\n  @Test\n  fun `download package with invalid checksum`(@TempDir tempDir: Path) {\n    val cmd =\n      CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            moduleCacheDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris =\n          listOf(\n            PackageUri(\"package://localhost:0/birds@0.5.0::sha256:intentionallyBogusChecksum\")\n          ),\n        noTransitive = true,\n      )\n    assertThatCode { cmd.run() }\n      .hasMessage(\n        \"\"\"\n      Cannot download package `package://localhost:0/birds@0.5.0` because the computed checksum for package metadata does not match the expected checksum.\n\n      Computed checksum: \"${PackageServer.BIRDS_SHA}\"\n      Expected checksum: \"intentionallyBogusChecksum\"\n      Asset URL: \"https://localhost:0/birds@0.5.0\"\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `disabling caching is an error`(@TempDir tempDir: Path) {\n    val cmd =\n      CliPackageDownloader(\n        baseOptions = CliBaseOptions(workingDir = tempDir, noCache = true),\n        packageUris = listOf(PackageUri(\"package://localhost:0/birds@0.5.0\")),\n        noTransitive = true,\n      )\n    assertThatCode { cmd.run() }\n      .hasMessage(\"Cannot download packages because no cache directory is specified.\")\n  }\n\n  @Test\n  fun `download packages with bad checksum`(@TempDir tempDir: Path) {\n    val cmd =\n      CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            moduleCacheDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris = listOf(PackageUri(\"package://localhost:0/badChecksum@1.0.0\")),\n        noTransitive = true,\n      )\n    assertThatCode { cmd.run() }\n      .hasMessageStartingWith(\n        \"Cannot download package `package://localhost:0/badChecksum@1.0.0` because the computed checksum does not match the expected checksum.\"\n      )\n  }\n\n  @Test\n  fun `download multiple failing packages`(@TempDir tempDir: Path) {\n    val cmd =\n      CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            moduleCacheDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris =\n          listOf(\n            PackageUri(\"package://localhost:0/badChecksum@1.0.0\"),\n            PackageUri(\"package://bogus.domain/notAPackage@1.0.0\"),\n          ),\n        noTransitive = true,\n      )\n    assertThatCode { cmd.run() }\n      .hasMessage(\n        \"\"\"\n        Failed to download some packages.\n\n        Failed to download package://localhost:0/badChecksum@1.0.0 because:\n        Cannot download package `package://localhost:0/badChecksum@1.0.0` because the computed checksum does not match the expected checksum.\n\n        Computed checksum: \"a6bf858cdd1c09da475c2abe50525902580910ee5cc1ff624999170591bf8f69\"\n        Expected checksum: \"intentionally bogus checksum\"\n        Asset URL: \"https://localhost:0/badChecksum@1.0.0/badChecksum@1.0.0.zip\"\n\n        Failed to download package://bogus.domain/notAPackage@1.0.0 because:\n        Exception when making request `GET https://bogus.domain/notAPackage@1.0.0`:\n        Error connecting to host `bogus.domain`.\n\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `download package, including transitive dependencies`(@TempDir tempDir: Path) {\n    CliPackageDownloader(\n        baseOptions =\n          CliBaseOptions(\n            moduleCacheDir = tempDir,\n            caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n            testPort = server.port,\n          ),\n        packageUris = listOf(PackageUri(\"package://localhost:0/birds@0.5.0\")),\n        noTransitive = false,\n      )\n      .run()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.zip\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/birds@0.5.0/birds@0.5.0.json\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.zip\")).exists()\n    assertThat(tempDir.resolve(\"package-2/localhost(3a)0/fruit@1.0.5/fruit@1.0.5.json\")).exists()\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectPackagerTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.File\nimport java.io.StringWriter\nimport java.net.URI\nimport java.nio.file.FileSystems\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.util.stream.Collectors\nimport kotlin.io.path.createDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.condition.DisabledOnOs\nimport org.junit.jupiter.api.condition.OS\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.cli.CliTestOptions\nimport org.pkl.commons.readString\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.writeString\nimport org.pkl.core.util.IoUtils\n\nclass CliProjectPackagerTest {\n  companion object {\n    private val packageServer = PackageServer()\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      packageServer.close()\n    }\n  }\n\n  @Test\n  fun `missing PklProject when inferring a project dir`(@TempDir tempDir: Path) {\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n      )\n    val err = assertThrows<CliException> { packager.run() }\n    assertThat(err).hasMessageStartingWith(\"No project visible to the working directory.\")\n  }\n\n  @Test\n  fun `missing PklProject when explicit dir is provided`(@TempDir tempDir: Path) {\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n      )\n    val err = assertThrows<CliException> { packager.run() }\n    assertThat(err).hasMessageStartingWith(\"Directory $tempDir does not contain a PklProject file.\")\n  }\n\n  @Test\n  fun `PklProject missing package section`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n      amends \"pkl:Project\"\n    \"\"\"\n          .trimIndent()\n      )\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n      )\n    val err = assertThrows<CliException> { packager.run() }\n    assertThat(err)\n      .hasMessageStartingWith(\"No package was declared in project `${tempDir.toUri()}PklProject`.\")\n  }\n\n  @Test\n  fun `failing apiTests`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"myTest.pkl\",\n      \"\"\"\n      amends \"pkl:test\"\n      \n      facts {\n        [\"1 == 2\"] {\n          1 == 2\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      package {\n        name = \"mypackage\"\n        version = \"1.0.0\"\n        baseUri = \"package://example.com/mypackage\"\n        packageZipUrl = \"https://foo.com\"\n        apiTests { \"myTest.pkl\" }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    val buffer = StringWriter()\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = buffer,\n      )\n    val err = assertThrows<CliException> { packager.run() }\n    assertThat(err).hasMessageContaining(\"because its API tests are failing\")\n    assertThat(buffer.toString()).contains(\"1 == 2\")\n  }\n\n  @Test\n  fun `passing apiTests`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"myTest.pkl\")\n      .writeString(\n        \"\"\"\n        amends \"pkl:test\"\n        \n        facts {\n          [\"1 == 1\"] {\n            1 == 1\n          }\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    tempDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n          apiTests { \"myTest.pkl\" }\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    val buffer = StringWriter()\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = buffer,\n      )\n    packager.run()\n  }\n\n  @Test\n  fun `apiTests that import dependencies`(@TempDir tempDir: Path) {\n    val cacheDir = tempDir.resolve(\"cache\")\n    val projectDir = tempDir.resolve(\"myProject\").createDirectories()\n    PackageServer.populateCacheDir(cacheDir)\n    projectDir\n      .resolve(\"myTest.pkl\")\n      .writeString(\n        \"\"\"\n        amends \"pkl:test\"\n        import \"@birds/Bird.pkl\"\n        \n        examples {\n          [\"Bird\"] {\n            new Bird { name = \"Finch\"; favoriteFruit { name = \"Tangerine\" } }\n          }\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    projectDir\n      .resolve(\"myTest.pkl-expected.pcf\")\n      .writeString(\n        \"\"\"\n        examples {\n          [\"Bird\"] {\n            new {\n              name = \"Finch\"\n              favoriteFruit {\n                name = \"Tangerine\"\n              }\n            }\n          }\n        }\n        \n      \"\"\"\n          .trimIndent()\n      )\n    projectDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n          apiTests { \"myTest.pkl\" }\n        }\n\n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    projectDir\n      .resolve(\"PklProject.deps.json\")\n      .writeString(\n        \"\"\"\n        {\n          \"schemaVersion\": 1,\n          \"resolvedDependencies\": {\n            \"package://localhost:0/birds@0\": {\n              \"type\": \"remote\",\n              \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n              \"checksums\": {\n                \"sha256\": \"04eec465b217fb9779489525d26e9b587e5e47ff4d584c7673a450109715bc31\"\n              }\n            },\n            \"package://localhost:0/fruit@1\": {\n              \"type\": \"remote\",\n              \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n              \"checksums\": {\n                \"sha256\": \"${PackageServer.FRUIT_SHA}\"\n              }\n            }\n          }\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    val buffer = StringWriter()\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = projectDir, moduleCacheDir = cacheDir),\n        listOf(projectDir),\n        CliTestOptions(),\n        \".out\",\n        skipPublishCheck = true,\n        consoleWriter = buffer,\n      )\n    packager.run()\n  }\n\n  @Test\n  fun `generate package`(@TempDir tempDir: Path) {\n    val fooPkl =\n      tempDir.writeFile(\n        \"a/b/foo.pkl\",\n        \"\"\"\n        module foo\n        \n        name: String\n      \"\"\"\n          .trimIndent(),\n      )\n\n    val fooTxt =\n      tempDir.writeFile(\n        \"c/d/foo.txt\",\n        \"\"\"\n        foo\n        bar\n        baz\n      \"\"\"\n          .trimIndent(),\n      )\n\n    tempDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = StringWriter(),\n      )\n    packager.run()\n    val expectedMetadata = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0\")\n    val expectedMetadataChecksum = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0.sha256\")\n    val expectedArchive = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0.zip\")\n    val expectedArchiveChecksum = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0.zip.sha256\")\n    assertThat(expectedMetadata).exists()\n    assertThat(expectedMetadata)\n      .hasContent(\n        \"\"\"\n      {\n        \"name\": \"mypackage\",\n        \"packageUri\": \"package://example.com/mypackage@1.0.0\",\n        \"version\": \"1.0.0\",\n        \"packageZipUrl\": \"https://foo.com\",\n        \"packageZipChecksums\": {\n          \"sha256\": \"e83b67722ea17ba41717ce6e99ae8ee02d66df6294bd319ce403075b1071c3e0\"\n        },\n        \"dependencies\": {},\n        \"authors\": []\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(expectedArchive).exists()\n    assertThat(expectedArchive.zipFilePaths())\n      .hasSameElementsAs(listOf(\"/\", \"/c\", \"/c/d\", \"/c/d/foo.txt\", \"/a\", \"/a/b\", \"/a/b/foo.pkl\"))\n    assertThat(expectedMetadataChecksum)\n      .hasContent(\"72ab32b27393bde5f316b00f184faae919378e4d7643872c605f681b14b647bf\")\n    assertThat(expectedArchiveChecksum)\n      .hasContent(\"e83b67722ea17ba41717ce6e99ae8ee02d66df6294bd319ce403075b1071c3e0\")\n    FileSystems.newFileSystem(URI(\"jar:\" + expectedArchive.toUri()), mutableMapOf<String, String>())\n      .use { fs ->\n        assertThat(fs.getPath(\"a/b/foo.pkl\")).hasSameTextualContentAs(fooPkl)\n        assertThat(fs.getPath(\"c/d/foo.txt\")).hasSameTextualContentAs(fooTxt)\n      }\n  }\n\n  @Test\n  fun `generate package with excludes`(@TempDir tempDir: Path) {\n    tempDir.apply {\n      writeEmptyFile(\"a/b/c/d.bin\")\n      writeEmptyFile(\"input/foo/bar.txt\")\n      writeEmptyFile(\"z.bin\")\n      writeEmptyFile(\"main.pkl\")\n      writeEmptyFile(\"main.test.pkl\")\n      writeEmptyFile(\"child/main.pkl\")\n      writeEmptyFile(\"child/main.test.pkl\")\n      writeEmptyFile(\"examples/Workflow.pkl\")\n      writeEmptyFile(\"examples/Ex1.pkl\")\n      writeEmptyFile(\"tests/Test1.pkl\")\n      writeEmptyFile(\"tests/integration/TestIng1.pkl\")\n    }\n\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n          exclude {\n            \"*.bin\"\n            \"child/main.pkl\"\n            \"*.test.pkl\"\n            \"examples/Ex1.pkl\"\n            \"tests/**\"\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = StringWriter(),\n      )\n      .run()\n    val expectedArchive = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0.zip\")\n    assertThat(expectedArchive.zipFilePaths())\n      .hasSameElementsAs(\n        listOf(\n          \"/\",\n          \"/examples\",\n          \"/examples/Workflow.pkl\",\n          \"/input\",\n          \"/input/foo\",\n          \"/input/foo/bar.txt\",\n          \"/main.pkl\",\n        )\n      )\n  }\n\n  @Test\n  fun `generate packages with local dependencies`(@TempDir tempDir: Path) {\n    val projectDir = tempDir.resolve(\"project\")\n    val project2Dir = tempDir.resolve(\"project2\")\n    projectDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n        \n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n          [\"project2\"] = import(\"../project2/PklProject\")\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    projectDir.writeFile(\n      \"PklProject.deps.json\",\n      \"\"\"\n        {\n          \"schemaVersion\": 1,\n          \"resolvedDependencies\": {\n            \"package://localhost:0/birds@0\": {\n              \"type\": \"remote\",\n              \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n              \"checksums\": {\n                \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n              }\n            },\n            \"package://localhost:0/project2@5\": {\n              \"type\": \"local\",\n              \"uri\": \"projectpackage://localhost:0/project2@5.0.0\",\n              \"path\": \"../project2\"\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    project2Dir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"project2\"\n          baseUri = \"package://localhost:0/project2\"\n          version = \"5.0.0\"\n          packageZipUrl = \"https://foo.com/project2.zip\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    project2Dir.writeFile(\n      \"PklProject.deps.json\",\n      \"\"\"\n        {\n          \"schemaVersion\": 1,\n          \"resolvedDependencies\": {}\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(projectDir, project2Dir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = StringWriter(),\n      )\n      .run()\n    val expectedMetadata = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0\")\n    assertThat(expectedMetadata).exists()\n    assertThat(expectedMetadata)\n      .hasContent(\n        \"\"\"\n      {\n        \"name\": \"mypackage\",\n        \"packageUri\": \"package://example.com/mypackage@1.0.0\",\n        \"version\": \"1.0.0\",\n        \"packageZipUrl\": \"https://foo.com\",\n        \"packageZipChecksums\": {\n          \"sha256\": \"8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85\"\n        },\n        \"dependencies\": {\n          \"birds\": {\n            \"uri\": \"package://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"project2\": {\n            \"uri\": \"package://localhost:0/project2@5.0.0\",\n            \"checksums\": {\n              \"sha256\": \"981787869571330b2f609a94a5912466990ce00e3fa94e7f290c2f99a6d5e5ed\"\n            }\n          }\n        },\n        \"authors\": []\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    val project2Metadata = tempDir.resolve(\".out/project2@5.0.0/project2@5.0.0\")\n    assertThat(project2Metadata).exists()\n    assertThat(project2Metadata.readString())\n      .isEqualTo(\n        \"\"\"\n    {\n      \"name\": \"project2\",\n      \"packageUri\": \"package://localhost:0/project2@5.0.0\",\n      \"version\": \"5.0.0\",\n      \"packageZipUrl\": \"https://foo.com/project2.zip\",\n      \"packageZipChecksums\": {\n        \"sha256\": \"8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85\"\n      },\n      \"dependencies\": {},\n      \"authors\": []\n    }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `generate package with local dependencies fails if local dep is not included for packaging`(\n    @TempDir tempDir: Path\n  ) {\n    val projectDir = tempDir.resolve(\"project\")\n    val project2Dir = tempDir.resolve(\"project2\")\n    projectDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n        \n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n          [\"project2\"] = import(\"../project2/PklProject\")\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    projectDir.writeFile(\n      \"PklProject.deps.json\",\n      \"\"\"\n        {\n          \"schemaVersion\": 1,\n          \"resolvedDependencies\": {\n            \"package://localhost:0/birds@0\": {\n              \"type\": \"remote\",\n              \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n              \"checksums\": {\n                \"sha256\": \"0a5ad2dc13f06f73f96ba94e8d01d48252bc934e2de71a837620ca0fef8a7453\"\n              }\n            },\n            \"package://localhost:0/project2@5\": {\n              \"type\": \"local\",\n              \"uri\": \"projectpackage://localhost:0/project2@5.0.0\",\n              \"path\": \"../project2\"\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    project2Dir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"project2\"\n          baseUri = \"package://localhost:0/project2\"\n          version = \"5.0.0\"\n          packageZipUrl = \"https://foo.com/project2.zip\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    project2Dir.writeFile(\n      \"PklProject.deps.json\",\n      \"\"\"\n        {\n          \"schemaVersion\": 1,\n          \"resolvedDependencies\": {}\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    assertThatCode {\n        CliProjectPackager(\n            CliBaseOptions(workingDir = tempDir),\n            listOf(projectDir),\n            CliTestOptions(),\n            \".out/%{name}@%{version}\",\n            skipPublishCheck = true,\n            consoleWriter = StringWriter(),\n          )\n          .run()\n      }\n      .hasMessageContaining(\"which is not included for packaging\")\n  }\n\n  @Test\n  fun `import path verification -- relative path outside project dir`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"main.pkl\",\n      \"\"\"\n        import \"../foo.pkl\"\n  \n        res = foo\n      \"\"\"\n        .trimIndent(),\n    )\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val e =\n      assertThrows<CliException> {\n        CliProjectPackager(\n            CliBaseOptions(workingDir = tempDir),\n            listOf(tempDir),\n            CliTestOptions(),\n            \".out/%{name}@%{version}\",\n            skipPublishCheck = true,\n            consoleWriter = StringWriter(),\n          )\n          .run()\n      }\n    assertThat(e.message)\n      .startsWith(\n        \"\"\"\n      –– Pkl Error ––\n      Path `../foo.pkl` includes path segments that are outside the project root directory.\n      \n      1 | import \"../foo.pkl\"\n                 ^^^^^^^^^^^^\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  // Absolute path imports on Windows must use an absolute URI (e.g. file:///C:/Foo/Bar), because\n  // they must contain drive letters, which conflict with schemes.\n  // We skip validation for absolute URIs, so effectively we skip this check on Windows.\n  @Test\n  @DisabledOnOs(OS.WINDOWS)\n  fun `import path verification -- absolute import from root dir`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"main.pkl\",\n      \"\"\"\n        import \"$tempDir/foo.pkl\"\n  \n        res = foo\n      \"\"\"\n        .trimIndent(),\n    )\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val e =\n      assertThrows<CliException> {\n        CliProjectPackager(\n            CliBaseOptions(workingDir = tempDir),\n            listOf(tempDir),\n            CliTestOptions(),\n            \".out/%{name}@%{version}\",\n            skipPublishCheck = true,\n            consoleWriter = StringWriter(),\n          )\n          .run()\n      }\n    assertThat(e.message)\n      .startsWith(\n        \"\"\"\n      –– Pkl Error ––\n      Path `$tempDir/foo.pkl` includes path segments that are outside the project root directory.\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  @DisabledOnOs(OS.WINDOWS)\n  fun `import path verification -- absolute read from root dir`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"main.pkl\",\n      \"\"\"\n        res = read(\"$tempDir/foo.pkl\")\n      \"\"\"\n        .trimIndent(),\n    )\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val e =\n      assertThrows<CliException> {\n        CliProjectPackager(\n            CliBaseOptions(workingDir = tempDir),\n            listOf(tempDir),\n            CliTestOptions(),\n            \".out/%{name}@%{version}\",\n            skipPublishCheck = true,\n            consoleWriter = StringWriter(),\n          )\n          .run()\n      }\n    assertThat(e.message)\n      .startsWith(\n        \"\"\"\n      –– Pkl Error ––\n      Path `$tempDir/foo.pkl` includes path segments that are outside the project root directory.\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `import path verification -- passing`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"foo/bar.pkl\",\n      \"\"\"\n        import \"baz.pkl\"\n      \"\"\"\n        .trimIndent(),\n    )\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = StringWriter(),\n      )\n      .run()\n  }\n\n  @Test\n  fun `multiple projects`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\"project1/main.pkl\", \"res = 1\")\n    tempDir.writeFile(\n      \"project1/PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"project1\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/project1\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    tempDir.writeFile(\"project2/main2.pkl\", \"res = 2\")\n    tempDir.writeFile(\n      \"project2/PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"project2\"\n          version = \"2.0.0\"\n          baseUri = \"package://example.com/project2\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val out = StringWriter()\n    CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir.resolve(\"project1\"), tempDir.resolve(\"project2\")),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = out,\n      )\n      .run()\n    val sep = File.separatorChar\n    assertThat(out.toString())\n      .isEqualToNormalizingNewlines(\n        \"\"\"\n      .out${sep}project1@1.0.0${sep}project1@1.0.0.zip\n      .out${sep}project1@1.0.0${sep}project1@1.0.0.zip.sha256\n      .out${sep}project1@1.0.0${sep}project1@1.0.0\n      .out${sep}project1@1.0.0${sep}project1@1.0.0.sha256\n      .out${sep}project2@2.0.0${sep}project2@2.0.0.zip\n      .out${sep}project2@2.0.0${sep}project2@2.0.0.zip.sha256\n      .out${sep}project2@2.0.0${sep}project2@2.0.0\n      .out${sep}project2@2.0.0${sep}project2@2.0.0.sha256\n\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(tempDir.resolve(\".out/project1@1.0.0/project1@1.0.0.zip\").zipFilePaths())\n      .hasSameElementsAs(listOf(\"/\", \"/main.pkl\"))\n    assertThat(tempDir.resolve(\".out/project2@2.0.0/project2@2.0.0.zip\").zipFilePaths())\n      .hasSameElementsAs(listOf(\"/\", \"/main2.pkl\"))\n  }\n\n  @Test\n  fun `publish checks`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\"project/main.pkl\", \"res = 1\")\n    tempDir.writeFile(\n      \"project/PklProject\",\n      // intentionally conflict with localhost:0/birds@0.5.0 from our test fixtures\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"birds\"\n          version = \"0.5.0\"\n          baseUri = \"package://localhost:0/birds\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val e =\n      assertThrows<CliException> {\n        CliProjectPackager(\n            CliBaseOptions(\n              workingDir = tempDir,\n              caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n              testPort = packageServer.port,\n            ),\n            listOf(tempDir.resolve(\"project\")),\n            CliTestOptions(),\n            \".out/%{name}@%{version}\",\n            skipPublishCheck = false,\n            consoleWriter = StringWriter(),\n          )\n          .run()\n      }\n    assertThat(e)\n      .hasMessageStartingWith(\n        \"\"\"\n      Package `package://localhost:0/birds@0.5.0` was already published with different contents.\n      \n      Computed checksum: aa8c883841db22e92794f4708b01dc905b5da77645b7dfb5b22a73da8c347db1\n      Published checksum: ${PackageServer.BIRDS_SHA}\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `publish check when package is not yet published`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\"project/main.pkl\", \"res = 1\")\n    tempDir.writeFile(\n      \"project/PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mangos\"\n          version = \"1.0.0\"\n          baseUri = \"package://localhost:0/mangos\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val out = StringWriter()\n    CliProjectPackager(\n        CliBaseOptions(\n          workingDir = tempDir,\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n        ),\n        listOf(tempDir.resolve(\"project\")),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = false,\n        consoleWriter = out,\n      )\n      .run()\n    val sep = File.separatorChar\n    assertThat(out.toString())\n      .isEqualToNormalizingNewlines(\n        \"\"\"\n      .out${sep}mangos@1.0.0${sep}mangos@1.0.0.zip\n      .out${sep}mangos@1.0.0${sep}mangos@1.0.0.zip.sha256\n      .out${sep}mangos@1.0.0${sep}mangos@1.0.0\n      .out${sep}mangos@1.0.0${sep}mangos@1.0.0.sha256\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `generate annotations`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n        @Unlisted\n        @Deprecated { since = \"0.26.1\"; message = \"do not use\" }\n        @ModuleInfo { minPklVersion = \"0.26.0\" }\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"mypackage\"\n          version = \"1.0.0\"\n          baseUri = \"package://example.com/mypackage\"\n          packageZipUrl = \"https://foo.com\"\n        }\n      \"\"\"\n          .trimIndent()\n      )\n    val packager =\n      CliProjectPackager(\n        CliBaseOptions(workingDir = tempDir),\n        listOf(tempDir),\n        CliTestOptions(),\n        \".out/%{name}@%{version}\",\n        skipPublishCheck = true,\n        consoleWriter = StringWriter(),\n      )\n    packager.run()\n    val expectedMetadata = tempDir.resolve(\".out/mypackage@1.0.0/mypackage@1.0.0\")\n    assertThat(expectedMetadata).exists()\n    assertThat(expectedMetadata)\n      .hasContent(\n        \"\"\"\n      {\n        \"name\": \"mypackage\",\n        \"packageUri\": \"package://example.com/mypackage@1.0.0\",\n        \"version\": \"1.0.0\",\n        \"packageZipUrl\": \"https://foo.com\",\n        \"packageZipChecksums\": {\n          \"sha256\": \"8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85\"\n        },\n        \"dependencies\": {},\n        \"authors\": [],\n        \"annotations\": [\n          {\n            \"type\": \"PObject\",\n            \"classInfo\": {\n              \"moduleName\": \"pkl.base\",\n              \"class\": \"Unlisted\",\n              \"moduleUri\": \"pkl:base\"\n            },\n            \"properties\": {}\n          },\n          {\n            \"type\": \"PObject\",\n            \"classInfo\": {\n              \"moduleName\": \"pkl.base\",\n              \"class\": \"Deprecated\",\n              \"moduleUri\": \"pkl:base\"\n            },\n            \"properties\": {\n              \"since\": \"0.26.1\",\n              \"message\": \"do not use\",\n              \"replaceWith\": null\n            }\n          },\n          {\n            \"type\": \"PObject\",\n            \"classInfo\": {\n              \"moduleName\": \"pkl.base\",\n              \"class\": \"ModuleInfo\",\n              \"moduleUri\": \"pkl:base\"\n            },\n            \"properties\": {\n              \"minPklVersion\": \"0.26.0\"\n            }\n          }\n        ]\n      }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  private fun Path.zipFilePaths(): List<String> {\n    return FileSystems.newFileSystem(URI(\"jar:${toUri()}\"), emptyMap<String, String>()).use { fs ->\n      Files.walk(fs.getPath(\"/\")).map(IoUtils::toNormalizedPathString).collect(Collectors.toList())\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliProjectResolverTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.io.File\nimport java.io.StringWriter\nimport java.nio.file.Path\nimport kotlin.io.path.createDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.writeString\nimport org.pkl.core.util.IoUtils\n\nclass CliProjectResolverTest {\n  companion object {\n    private val packageServer = PackageServer()\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      packageServer.close()\n    }\n  }\n\n  @Test\n  fun `missing PklProject when inferring a project dir`(@TempDir tempDir: Path) {\n    val packager =\n      CliProjectResolver(\n        CliBaseOptions(workingDir = tempDir, noCache = true),\n        emptyList(),\n        consoleWriter = StringWriter(),\n        errWriter = StringWriter(),\n      )\n    val err = assertThrows<CliException> { packager.run() }\n    assertThat(err).hasMessageStartingWith(\"No project visible to the working directory.\")\n  }\n\n  @Test\n  fun `missing PklProject when explicit dir is provided`(@TempDir tempDir: Path) {\n    val packager =\n      CliProjectResolver(\n        CliBaseOptions(noCache = true),\n        listOf(tempDir),\n        consoleWriter = StringWriter(),\n        errWriter = StringWriter(),\n      )\n    val err = assertThrows<CliException> { packager.run() }\n    assertThat(err).hasMessageStartingWith(\"Directory $tempDir does not contain a PklProject file.\")\n  }\n\n  @Test\n  fun `basic project`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n\n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    CliProjectResolver(\n        CliBaseOptions(\n          workingDir = tempDir,\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n          noCache = true,\n        ),\n        listOf(tempDir),\n        consoleWriter = StringWriter(),\n        errWriter = StringWriter(),\n      )\n      .run()\n    val expectedOutput = tempDir.resolve(\"PklProject.deps.json\")\n    assertThat(expectedOutput)\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_SHA}\"\n            }\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `basic project, inferred from working dir`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n\n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    CliProjectResolver(\n        CliBaseOptions(\n          workingDir = tempDir,\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n          noCache = true,\n        ),\n        emptyList(),\n        consoleWriter = StringWriter(),\n        errWriter = StringWriter(),\n      )\n      .run()\n    val expectedOutput = tempDir.resolve(\"PklProject.deps.json\")\n    assertThat(expectedOutput)\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_SHA}\"\n            }\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `local dependencies`(@TempDir tempDir: Path) {\n    val projectDir = tempDir.resolve(\"theproject\")\n    projectDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n\n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n          [\"project2\"] = import(\"../project2/PklProject\")\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    projectDir.writeFile(\n      \"../project2/PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"project2\"\n          baseUri = \"package://localhost:0/package2\"\n          version = \"5.0.0\"\n          packageZipUrl = \"https://foo.com/package2.zip\"\n        }\n        \n        dependencies {\n          [\"fruit\"] {\n            uri = \"package://localhost:0/fruit@1.0.5\"\n          }\n          [\"project3\"] = import(\"../project3/PklProject\")\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n\n    projectDir.writeFile(\n      \"../project3/PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"project3\"\n          baseUri = \"package://localhost:0/package3\"\n          version = \"5.0.0\"\n          packageZipUrl = \"https://foo.com/package3.zip\"\n        }\n        \n        dependencies {\n          [\"fruit\"] {\n            uri = \"package://localhost:0/fruit@1.1.0\"\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    CliProjectResolver(\n        CliBaseOptions(\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n          noCache = true,\n        ),\n        listOf(projectDir),\n        consoleWriter = StringWriter(),\n        errWriter = StringWriter(),\n      )\n      .run()\n    val expectedOutput = projectDir.resolve(\"PklProject.deps.json\")\n    assertThat(expectedOutput)\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_1_1_SHA}\"\n            }\n          },\n          \"package://localhost:0/package2@5\": {\n            \"type\": \"local\",\n            \"uri\": \"projectpackage://localhost:0/package2@5.0.0\",\n            \"path\": \"../project2\"\n          },\n          \"package://localhost:0/package3@5\": {\n            \"type\": \"local\",\n            \"uri\": \"projectpackage://localhost:0/package3@5.0.0\",\n            \"path\": \"../project3\"\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `local dependency overridden by remote dependency`(@TempDir tempDir: Path) {\n    val projectDir = tempDir.resolve(\"theproject\")\n    projectDir.writeFile(\n      \"PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n\n        dependencies {\n          [\"birds\"] {\n            uri = \"package://localhost:0/birds@0.5.0\"\n          }\n          [\"fruit\"] = import(\"../fruit/PklProject\")\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    projectDir.writeFile(\n      \"../fruit/PklProject\",\n      \"\"\"\n        amends \"pkl:Project\"\n        \n        package {\n          name = \"fruit\"\n          baseUri = \"package://localhost:0/fruit\"\n          version = \"1.0.0\"\n          packageZipUrl = \"https://foo.com/fruit.zip\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val consoleOut = StringWriter()\n    val errOut = StringWriter()\n    CliProjectResolver(\n        CliBaseOptions(\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n          noCache = true,\n        ),\n        listOf(projectDir),\n        consoleWriter = consoleOut,\n        errWriter = errOut,\n      )\n      .run()\n    val expectedOutput = projectDir.resolve(\"PklProject.deps.json\")\n    assertThat(expectedOutput)\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_SHA}\"\n            }\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(errOut.toString())\n      .isEqualTo(\n        \"WARN: local dependency `package://localhost:0/fruit@1.0.0` was overridden to remote dependency `package://localhost:0/fruit@1.0.5`.${IoUtils.getLineSeparator()}\"\n      )\n  }\n\n  @Test\n  fun `resolving multiple projects`(@TempDir tempDir: Path) {\n    tempDir.writeFile(\n      \"project1/PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n\n      dependencies {\n        [\"birds\"] {\n          uri = \"package://localhost:0/birds@0.5.0\"\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    tempDir.writeFile(\n      \"project2/PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n\n      dependencies {\n        [\"fruit\"] {\n          uri = \"package://localhost:0/fruit@1.1.0\"\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val consoleOut = StringWriter()\n    val errOut = StringWriter()\n    CliProjectResolver(\n        CliBaseOptions(\n          caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n          testPort = packageServer.port,\n          noCache = true,\n        ),\n        listOf(tempDir.resolve(\"project1\"), tempDir.resolve(\"project2\")),\n        consoleWriter = consoleOut,\n        errWriter = errOut,\n      )\n      .run()\n    val sep = File.separatorChar\n    assertThat(consoleOut.toString())\n      .isEqualToNormalizingNewlines(\n        \"\"\"\n      $tempDir${sep}project1${sep}PklProject.deps.json\n      $tempDir${sep}project2${sep}PklProject.deps.json\n    \n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(tempDir.resolve(\"project1/PklProject.deps.json\"))\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_SHA}\"\n            }\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(tempDir.resolve(\"project2/PklProject.deps.json\"))\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_1_1_SHA}\"\n            }\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `IOException when writing to PklProject-deps-json`(@TempDir tempDir: Path) {\n    val consoleOut = StringWriter()\n    val errOut = StringWriter()\n    tempDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n      amends \"pkl:Project\"\n\n      dependencies {\n        [\"birds\"] {\n          uri = \"package://localhost:0/birds@0.5.0\"\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    // coerce an IOException by making this a directory\n    val depsJsonFile = tempDir.resolve(\"PklProject.deps.json\").also { it.createDirectories() }\n    assertThatCode {\n        CliProjectResolver(\n            CliBaseOptions(\n              caCertificates = listOf(FileTestUtils.selfSignedCertificate),\n              testPort = packageServer.port,\n              noCache = true,\n            ),\n            listOf(tempDir),\n            consoleWriter = consoleOut,\n            errWriter = errOut,\n          )\n          .run()\n      }\n      .hasMessageContaining(\"Failed to write to $depsJsonFile\")\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliShellCompletionTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport com.github.ajalt.clikt.testing.test\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.cli.commands.RootCommand\n\nclass CliShellCompletionTest {\n  @Test\n  fun `shell completion command supports required shells`() {\n    val shellList = listOf(\"bash\", \"zsh\", \"fish\")\n\n    for (shell in shellList) {\n      val result = RootCommand().test(\"shell-completion $shell\")\n\n      assertThat(result.stdout).contains(\"Command completion for pkl\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/CliTestRunnerTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport com.github.ajalt.clikt.testing.test\nimport java.io.StringWriter\nimport java.io.Writer\nimport java.net.URI\nimport java.nio.file.Path\nimport java.util.*\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.cli.commands.RootCommand\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.cli.CliTestOptions\nimport org.pkl.commons.readString\nimport org.pkl.commons.toUri\nimport org.pkl.commons.writeString\n\nclass CliTestRunnerTest {\n  @Test\n  fun `CliTestRunner succeed test`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"succeed\"] {\n          8 == 8\n          3 == 3\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    runner.run()\n\n    assertThat(out.toString().stripFileAndLines(tempDir))\n      .isEqualTo(\n        \"\"\"\n      module test\n        facts\n          ✔ succeed\n      \n      100.0% tests pass [1 passed], 100.0% asserts pass [2 passed]\n\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(err.toString()).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `CliTestRunner fail test`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"fail\"] {\n          4 == 9\n          1 == 5\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    assertThatCode { runner.run() }.hasMessage(\"Tests failed.\")\n\n    assertThat(out.toString().stripFileAndLines(tempDir))\n      .isEqualTo(\n        \"\"\"\n        module test\n          facts\n            ✘ fail\n               4 == 9 (/tempDir/test.pkl, line xx)\n                 │\n                 false\n               1 == 5 (/tempDir/test.pkl, line xx)\n                 │\n                 false\n\n        0.0% tests pass [1/1 failed], 0.0% asserts pass [2/2 failed]\n\n        \"\"\"\n          .trimIndent()\n      )\n    assertThat(err.toString()).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `CliTestRunner with thrown error in facts`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"fail\"] {\n          throw(\"uh oh\")\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    assertThatCode { runner.run() }.hasMessage(\"Tests failed.\")\n\n    assertThat(out.toString().stripFileAndLines(tempDir))\n      .isEqualToNormalizingNewlines(\n        \"\"\"\n      module test\n        facts\n          ✘ fail\n             –– Pkl Error ––\n             uh oh\n\n             5 | throw(\"uh oh\")\n                 ^^^^^^^^^^^^^^\n             at test#facts[\"fail\"][#1] (/tempDir/test.pkl, line xx)\n\n      0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]\n\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(err.toString()).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `CliTestRunner with thrown error in examples -- no expected output`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      examples {\n        [\"fail\"] {\n          throw(\"uh oh\")\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    assertThatCode { runner.run() }.hasMessage(\"Tests failed.\")\n\n    assertThat(out.toString().stripFileAndLines(tempDir))\n      .isEqualTo(\n        \"\"\"\n      module test\n        examples\n          ✘ fail\n             –– Pkl Error ––\n             uh oh\n\n             5 | throw(\"uh oh\")\n                 ^^^^^^^^^^^^^^\n             at test#examples[\"fail\"][#1] (/tempDir/test.pkl, line xx)\n\n      0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]\n\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(err.toString()).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `CliTestRunner with thrown error in examples -- existing expected output`(\n    @TempDir tempDir: Path\n  ) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      examples {\n        [\"fail\"] {\n          throw(\"uh oh\")\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    tempDir\n      .resolve(\"test.pkl-expected.pcf\")\n      .writeString(\n        \"\"\"\n      examples {\n        [\"fail\"] {\n          \"never compared to\"\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    assertThatCode { runner.run() }.hasMessage(\"Tests failed.\")\n\n    assertThat(out.toString().stripFileAndLines(tempDir))\n      .isEqualToNormalizingNewlines(\n        \"\"\"\n      module test\n        examples\n          ✘ fail\n             –– Pkl Error ––\n             uh oh\n      \n             5 | throw(\"uh oh\")\n                 ^^^^^^^^^^^^^^\n             at test#examples[\"fail\"][#1] (/tempDir/test.pkl, line xx)\n\n      0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]\n\n    \"\"\"\n          .trimIndent()\n      )\n    assertThat(err.toString()).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `CliTestRunner JUnit reports`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          9 == trace(9)\n          \"foo\" == \"foo\"\n        }\n        [\"bar\"] {\n          \"foo\" == \"foo\"\n          5 == 9\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val noopWriter = noopWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions(junitDir = tempDir)\n    val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)\n    assertThatCode { runner.run() }.hasMessageContaining(\"failed\")\n\n    val junitReport = tempDir.resolve(\"test.xml\").readString().stripFileAndLines(tempDir)\n    assertThat(junitReport)\n      .isEqualTo(\n        \"\"\"\n      <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n      <testsuite name=\"test\" tests=\"2\" failures=\"1\">\n          <testcase classname=\"test.facts\" name=\"foo\"></testcase>\n          <testcase classname=\"test.facts\" name=\"bar\">\n              <failure message=\"Fact Failure\">5 == 9 (/tempDir/test.pkl, line xx)\n        │\n        false</failure>\n          </testcase>\n          <system-err><![CDATA[9 = 9\n      ]]></system-err>\n      </testsuite>\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `CliTestRunner JUnit reports, with thrown error`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          9 == trace(9)\n          \"foo\" == \"foo\"\n        }\n        [\"fail\"] {\n          throw(\"uh oh\")\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val noopWriter = noopWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions(junitDir = tempDir)\n    val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)\n    assertThatCode { runner.run() }.hasMessageContaining(\"failed\")\n\n    val junitReport = tempDir.resolve(\"test.xml\").readString().stripFileAndLines(tempDir)\n    assertThat(junitReport)\n      .isEqualTo(\n        \"\"\"\n      <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n      <testsuite name=\"test\" tests=\"2\" failures=\"1\">\n          <testcase classname=\"test.facts\" name=\"foo\"></testcase>\n          <testcase classname=\"test.facts\" name=\"fail\">\n              <error message=\"uh oh\">–– Pkl Error ––\n      uh oh\n      \n      9 | throw(&quot;uh oh&quot;)\n          ^^^^^^^^^^^^^^\n      at test#facts[&quot;fail&quot;][#1] (/tempDir/test.pkl, line xx)\n      </error>\n          </testcase>\n          <system-err><![CDATA[9 = 9\n      ]]></system-err>\n      </testsuite>\n      \n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `CliTestRunner duplicated JUnit reports`(@TempDir tempDir: Path) {\n    val foo =\n      \"\"\"\n      module foo\n      \n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          1 == 1\n        }\n      }\n    \"\"\"\n        .trimIndent()\n\n    val bar =\n      \"\"\"\n      module foo\n      \n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          1 == 1\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(foo).toString()\n    val input2 = tempDir.resolve(\"test.pkl\").writeString(bar).toString()\n    val noopWriter = noopWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri(), input2.toUri()),\n        settings = URI(\"pkl:settings\"),\n      )\n    val testOpts = CliTestOptions(junitDir = tempDir)\n    val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)\n    assertThatCode { runner.run() }.hasMessageContaining(\"failed\")\n  }\n\n  @Test\n  fun `CliTestRunner test per module`(@TempDir tempDir: Path) {\n    val code1 =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          true\n        }\n      }\n    \"\"\"\n        .trimIndent()\n\n    val code2 =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"bar\"] {\n          true\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input1 = tempDir.resolve(\"test1.pkl\").writeString(code1).toString()\n    val input2 = tempDir.resolve(\"test2.pkl\").writeString(code2).toString()\n    val noopWriter = noopWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input1.toUri(), input2.toUri()),\n        settings = URI(\"pkl:settings\"),\n      )\n    val testOpts = CliTestOptions(junitDir = tempDir)\n    val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)\n    runner.run()\n\n    assertThat(tempDir.resolve(\"test1.xml\")).isNotEmptyFile()\n    assertThat(tempDir.resolve(\"test2.xml\")).isNotEmptyFile()\n  }\n\n  @Test\n  fun `CliTestRunner test aggregate`(@TempDir tempDir: Path) {\n    val code1 =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          true\n        }\n        [\"bar\"] {\n          5 == 9\n        }\n      }\n    \"\"\"\n        .trimIndent()\n\n    val code2 =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"xxx\"] {\n          false\n        }\n        [\"yyy\"] {\n          false\n        }\n        [\"zzz\"] {\n          true\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input1 = tempDir.resolve(\"test1.pkl\").writeString(code1).toString()\n    val input2 = tempDir.resolve(\"test2.pkl\").writeString(code2).toString()\n    val noopWriter = noopWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input1.toUri(), input2.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions(junitDir = tempDir, junitAggregateReports = true)\n    val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)\n    assertThatCode { runner.run() }.hasMessageContaining(\"failed\")\n\n    assertThat(tempDir.resolve(\"pkl-tests.xml\")).isNotEmptyFile()\n    assertThat(tempDir.resolve(\"test1.xml\")).doesNotExist()\n    assertThat(tempDir.resolve(\"test2.xml\")).doesNotExist()\n\n    val junitReport = tempDir.resolve(\"pkl-tests.xml\").readString().stripFileAndLines(tempDir)\n\n    assertThat(junitReport)\n      .isEqualTo(\n        \"\"\"\n        <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n        <testsuites name=\"pkl-tests\" tests=\"5\" failures=\"3\">\n            <testsuite name=\"test1\" tests=\"2\" failures=\"1\">\n                <testcase classname=\"test1.facts\" name=\"foo\"></testcase>\n                <testcase classname=\"test1.facts\" name=\"bar\">\n                    <failure message=\"Fact Failure\">5 == 9 (/tempDir/test1.pkl, line xx)\n          │\n          false</failure>\n                </testcase>\n            </testsuite>\n            <testsuite name=\"test2\" tests=\"3\" failures=\"2\">\n                <testcase classname=\"test2.facts\" name=\"xxx\">\n                    <failure message=\"Fact Failure\">false (/tempDir/test2.pkl, line xx)\n        </failure>\n                </testcase>\n                <testcase classname=\"test2.facts\" name=\"yyy\">\n                    <failure message=\"Fact Failure\">false (/tempDir/test2.pkl, line xx)\n        </failure>\n                </testcase>\n                <testcase classname=\"test2.facts\" name=\"zzz\"></testcase>\n            </testsuite>\n        </testsuites>\n\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `CliTestRunner test aggregate suite name`(@TempDir tempDir: Path) {\n    val code1 =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"foo\"] {\n          true\n        }\n      }\n    \"\"\"\n        .trimIndent()\n\n    val code2 =\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"bar\"] {\n          true\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input1 = tempDir.resolve(\"test1.pkl\").writeString(code1).toString()\n    val input2 = tempDir.resolve(\"test2.pkl\").writeString(code2).toString()\n    val noopWriter = noopWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input1.toUri(), input2.toUri()),\n        settings = URI(\"pkl:settings\"),\n      )\n    val testOpts =\n      CliTestOptions(\n        junitDir = tempDir,\n        junitAggregateReports = true,\n        junitAggregateSuiteName = \"custom\",\n      )\n    val runner = CliTestRunner(opts, testOpts, noopWriter, noopWriter)\n    runner.run()\n\n    assertThat(tempDir.resolve(\"custom.xml\")).isNotEmptyFile()\n    assertThat(tempDir.resolve(\"pkl-tests.xml\")).doesNotExist()\n    assertThat(tempDir.resolve(\"test1.xml\")).doesNotExist()\n    assertThat(tempDir.resolve(\"test2.xml\")).doesNotExist()\n  }\n\n  @Test\n  fun `no source modules specified has same message as pkl eval`() {\n    val e1 = assertThrows<CliException> { CliTestRunner(CliBaseOptions(), CliTestOptions()).run() }\n    val e2 = RootCommand().test(\"eval\")\n    assertThat(e1).hasMessageContaining(\"missing argument <modules>\")\n    assertThat(e1.message!!.replace(\"test\", \"eval\") + \"\\n\").isEqualTo(e2.stderr)\n  }\n\n  @Test\n  fun `example length mismatch`(@TempDir tempDir: Path) {\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      examples {\n        [\"nums\"] {\n          1\n          2\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    tempDir\n      .resolve(\"test.pkl-expected.pcf\")\n      .writeString(\n        \"\"\"\n      examples {\n        [\"nums\"] {\n          1\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    assertThatCode { runner.run() }.hasMessage(\"Tests failed.\")\n\n    assertThat(out.toString().stripFileAndLines(tempDir))\n      .isEqualToNormalizingNewlines(\n        \"\"\"\n        module test\n          examples\n            ✘ nums\n               (/tempDir/test.pkl, line xx)\n               Output mismatch: Expected \"nums\" to contain 1 examples, but found 2\n\n        0.0% tests pass [1/1 failed], 0.0% asserts pass [1/1 failed]\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `only written examples`(@TempDir tempDir: Path) {\n\n    val code =\n      \"\"\"\n      amends \"pkl:test\"\n\n      examples {\n        [\"nums\"] {\n          1\n          2\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n    val out = StringWriter()\n    val err = StringWriter()\n    val opts =\n      CliBaseOptions(\n        sourceModules = listOf(input.toUri()),\n        settings = URI(\"pkl:settings\"),\n        powerAssertionsEnabled = true,\n      )\n    val testOpts = CliTestOptions()\n    val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n    val exception = assertThrows<CliException> { runner.run() }\n    assertThat(exception.exitCode).isEqualTo(10)\n    assertThat(out.toString())\n      .isEqualTo(\n        \"\"\"\n          module test\n            examples\n              ✍️ nums\n\n          1 examples written\n          \n          \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `CliTestRunner locale independence test`(@TempDir tempDir: Path) {\n    val originalLocale = Locale.getDefault()\n    Locale.setDefault(Locale.GERMANY)\n\n    try {\n      val code =\n        \"\"\"\n        amends \"pkl:test\"\n\n        facts {\n            [\"localeTest\"] {\n                1 == 1\n            }\n        }\n        \"\"\"\n          .trimIndent()\n      val input = tempDir.resolve(\"test.pkl\").writeString(code).toString()\n      val out = StringWriter()\n      val err = StringWriter()\n      val opts =\n        CliBaseOptions(\n          sourceModules = listOf(input.toUri()),\n          settings = URI(\"pkl:settings\"),\n          powerAssertionsEnabled = true,\n        )\n      val testOpts = CliTestOptions()\n      val runner = CliTestRunner(opts, testOpts, consoleWriter = out, errWriter = err)\n      runner.run()\n\n      assertThat(out.toString().stripFileAndLines(tempDir))\n        .isEqualTo(\n          \"\"\"\n            module test\n              facts\n                ✔ localeTest\n\n            100.0% tests pass [1 passed], 100.0% asserts pass [1 passed]\n\n            \"\"\"\n            .trimIndent()\n        )\n      assertThat(err.toString()).isEqualTo(\"\")\n    } finally {\n      Locale.setDefault(originalLocale)\n    }\n  }\n\n  private fun String.stripFileAndLines(tmpDir: Path): String {\n    // handle platform differences in handling of file URIs\n    // (file:/// on *nix vs. file:/ on Windows)\n    return replace(tmpDir.toFile().toURI().toString(), \"/tempDir/\")\n      .replace(tmpDir.toUri().toString(), \"/tempDir/\")\n      .replace(Regex(\"line \\\\d+\"), \"line xx\")\n  }\n\n  private fun noopWriter(): Writer =\n    object : Writer() {\n      override fun close() {}\n\n      override fun flush() {}\n\n      override fun write(cbuf: CharArray, off: Int, len: Int) {}\n    }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/repl/ReplMessagesTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli.repl\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.commons.toPath\nimport org.pkl.core.Loggers\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.StackFrameTransformers\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.repl.ReplRequest\nimport org.pkl.core.repl.ReplResponse\nimport org.pkl.core.repl.ReplServer\n\nclass ReplMessagesTest {\n  private val server =\n    ReplServer(\n      SecurityManagers.defaultManager,\n      HttpClient.dummyClient(),\n      Loggers.stdErr(),\n      listOf(ModuleKeyFactories.standardLibrary),\n      listOf(),\n      mapOf(),\n      mapOf(),\n      null,\n      null,\n      null,\n      \"/\".toPath(),\n      StackFrameTransformers.defaultTransformer,\n      false,\n      TraceMode.COMPACT,\n    )\n\n  @Test\n  fun `run examples`() {\n    val examples = ReplMessages.examples\n    var startIndex = examples.indexOf(\"```\")\n    while (startIndex != -1) {\n      val endIndex = examples.indexOf(\"```\", startIndex + 3)\n      assertThat(endIndex).isNotEqualTo(-1)\n      val text =\n        examples\n          .substring(startIndex + 3, endIndex)\n          .lines()\n          .filterNot { it.contains(\":force\") }\n          .joinToString(\"\\n\")\n      val responses = server.handleRequest(ReplRequest.Eval(\"1\", text, true, true))\n      assertThat(responses.size).isBetween(1, 9)\n      assertThat(responses).hasOnlyElementsOfType(ReplResponse.EvalSuccess::class.java)\n      startIndex = examples.indexOf(\"```\", endIndex + 3)\n    }\n  }\n\n  @Test\n  fun `handle single backtick`() {\n    val responses = server.handleRequest(ReplRequest.Eval(\"1\", \"`\", true, true))\n    assertThat(responses.size).isEqualTo(1)\n    assertThat(responses).hasOnlyElementsOfType(ReplResponse.EvalError::class.java)\n  }\n}\n"
  },
  {
    "path": "pkl-cli/src/test/kotlin/org/pkl/cli/testExtensions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.cli\n\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.commons.writeString\n\nfun Path.writeFile(fileName: String, contents: String): Path {\n  return resolve(fileName).apply {\n    createParentDirectories()\n    writeString(contents, StandardCharsets.UTF_8)\n  }\n}\n\nfun Path.writeEmptyFile(fileName: String): Path = writeFile(fileName, \"\")\n"
  },
  {
    "path": "pkl-codegen-java/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.palantir.javapoet:javapoet:0.7.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=runtimeClasspath,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=runtimeClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=runtimeClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=runtimeClasspath,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,shadow,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-codegen-java/pkl-codegen-java.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n  pklJavaExecutable\n}\n\ndependencies {\n  // CliJavaCodeGeneratorOptions exposes CliBaseOptions\n  api(projects.pklCommonsCli)\n\n  implementation(projects.pklCommons)\n  implementation(projects.pklCore)\n  implementation(libs.javaPoet)\n\n  testImplementation(projects.pklConfigJava)\n  testImplementation(projects.pklCommonsTest)\n}\n\nexecutable {\n  javaName = \"pkl-codegen-java\"\n  documentationName = \"Pkl Codegen Java\"\n  javaPublicationName = \"pkl-cli-codegen-java\"\n  mainClass = \"org.pkl.codegen.java.Main\"\n  website = \"https://pkl-lang.org/main/current/java-binding/codegen.html\"\n}\n\n// with `org.gradle.parallel=true` and without the line below, `test` strangely runs into:\n// java.lang.NoClassDefFoundError: Lorg/pkl/config/java/ConfigEvaluator;\n// perhaps somehow related to InMemoryJavaCompiler?\ntasks.test { mustRunAfter(\":pkl-config-java:testFatJar\") }\n\ntasks.jar { manifest { attributes += mapOf(\"Main-Class\" to \"org.pkl.codegen.java.Main\") } }\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-codegen-java\")\n        description.set(\n          \"\"\"\n          Java source code generator that generates corresponding Java classes for Pkl classes,\n          simplifying consumption of Pkl configuration as statically typed Java objects.\n        \"\"\"\n            .trimIndent()\n        )\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/CliJavaCodeGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.java\n\nimport java.io.IOException\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.writeString\nimport org.pkl.core.Closeables\nimport org.pkl.core.ModuleSource\n\n/** API for the Java code generator CLI. */\nclass CliJavaCodeGenerator(private val options: CliJavaCodeGeneratorOptions) :\n  CliCommand(options.base) {\n\n  override fun doRun() {\n    val builder = evaluatorBuilder()\n    try {\n      builder.build().use { evaluator ->\n        for (moduleUri in resolvedSourceModules) {\n          val schema = evaluator.evaluateSchema(ModuleSource.uri(moduleUri))\n          val codeGenerator = JavaCodeGenerator(schema, options.toJavaCodeGeneratorOptions())\n          try {\n            for ((fileName, fileContents) in codeGenerator.output) {\n              val outputFile = options.outputDir.resolve(fileName)\n              try {\n                outputFile.createParentDirectories().writeString(fileContents)\n              } catch (e: IOException) {\n                throw CliException(\"I/O error writing file `$outputFile`.\\nCause: ${e.message}\")\n              }\n            }\n          } catch (e: JavaCodeGeneratorException) {\n            throw CliException(e.message!!)\n          }\n        }\n      }\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/CliJavaCodeGeneratorOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.java\n\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\n\n/** Configuration options for [CliJavaCodeGenerator]. */\ndata class CliJavaCodeGeneratorOptions(\n  /** Base options shared between CLI commands. */\n  val base: CliBaseOptions,\n\n  /** The directory where generated source code is placed. */\n  val outputDir: Path,\n\n  /** The characters to use for indenting generated source code. */\n  val indent: String = \"  \",\n\n  /** Whether to add a `@Generated` annotation to the types to be generated. */\n  val addGeneratedAnnotation: Boolean = false,\n\n  /**\n   * Whether to generate public getter methods and private/protected fields instead of public\n   * fields.\n   */\n  val generateGetters: Boolean = false,\n\n  /** Whether to preserve Pkl doc comments by generating corresponding Javadoc comments. */\n  val generateJavadoc: Boolean = false,\n\n  /** Whether to generate config classes for use with Spring Boot. */\n  val generateSpringBootConfig: Boolean = false,\n\n  /**\n   * Fully qualified name of the annotation type to use for annotating constructor parameters with\n   * their name.\n   *\n   * The specified annotation type must have a `value` parameter of type [java.lang.String] or the\n   * generated code may not compile.\n   *\n   * If set to `null`, constructor parameters are not annotated. The default value is `null` if\n   * [generateSpringBootConfig] is `true` and `\"org.pkl.config.java.mapper.Named\"` otherwise.\n   */\n  val paramsAnnotation: String? =\n    if (generateSpringBootConfig) null else \"org.pkl.config.java.mapper.Named\",\n\n  /**\n   * Fully qualified name of the annotation type to use for annotating non-null types.\n   *\n   * The specified annotation type must have a [java.lang.annotation.Target] of\n   * [java.lang.annotation.ElementType.TYPE_USE] or the generated code may not compile. If set to\n   * `null`, [org.pkl.config.java.mapper.NonNull] will be used.\n   */\n  val nonNullAnnotation: String? = null,\n\n  /** Whether to generate classes that implement [java.io.Serializable]. */\n  val implementSerializable: Boolean = false,\n\n  /**\n   * A rename mapping for class names.\n   *\n   * When you need to have Java class or package names different from the default names derived from\n   * Pkl module names, you can define a rename mapping, where the key is a prefix of the original\n   * Pkl module name, and the value is the desired replacement.\n   */\n  val renames: Map<String, String> = emptyMap(),\n) {\n  @Suppress(\"DeprecatedCallableAddReplaceWith\")\n  @Deprecated(\"deprecated without replacement\")\n  fun toJavaCodegenOptions() = toJavaCodeGeneratorOptions()\n\n  internal fun toJavaCodeGeneratorOptions() =\n    JavaCodeGeneratorOptions(\n      indent,\n      addGeneratedAnnotation,\n      generateGetters,\n      generateJavadoc,\n      generateSpringBootConfig,\n      paramsAnnotation,\n      nonNullAnnotation,\n      implementSerializable,\n      renames,\n    )\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/JavaCodeGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"unused\")\n\npackage org.pkl.codegen.java\n\nimport com.palantir.javapoet.*\nimport java.io.StringWriter\nimport java.lang.Deprecated\nimport java.util.*\nimport java.util.regex.Pattern\nimport javax.lang.model.element.Modifier\nimport kotlin.AssertionError\nimport kotlin.Boolean\nimport kotlin.Int\nimport kotlin.Long\nimport kotlin.RuntimeException\nimport kotlin.String\nimport kotlin.Suppress\nimport kotlin.Unit\nimport kotlin.apply\nimport kotlin.let\nimport kotlin.takeIf\nimport kotlin.to\nimport org.pkl.commons.NameMapper\nimport org.pkl.core.*\nimport org.pkl.core.util.CodeGeneratorUtils\nimport org.pkl.core.util.IoUtils\n\nclass JavaCodeGeneratorException(message: String) : RuntimeException(message)\n\n@kotlin.Deprecated(\"renamed to JavaCodeGeneratorOptions\", ReplaceWith(\"JavaCodeGeneratorOptions\"))\ntypealias JavaCodegenOptions = JavaCodeGeneratorOptions\n\ndata class JavaCodeGeneratorOptions(\n  /** The characters to use for indenting generated Java code. */\n  val indent: String = \"  \",\n\n  /** Adds the `org.pkl.config.java.Generated` annotation to the classes to be generated. */\n  val addGeneratedAnnotation: Boolean = false,\n\n  /**\n   * Whether to generate public getter methods and protected final fields instead of public final\n   * fields.\n   */\n  val generateGetters: Boolean = false,\n\n  /** Whether to preserve Pkl doc comments by generating corresponding Javadoc comments. */\n  val generateJavadoc: Boolean = false,\n\n  /** Whether to generate config classes for use with Spring Boot. */\n  val generateSpringBootConfig: Boolean = false,\n\n  /**\n   * Fully qualified name of the annotation type to use for annotating constructor parameters with\n   * their name.\n   *\n   * The specified annotation type must have a `value` parameter of type [java.lang.String] or the\n   * generated code may not compile.\n   *\n   * If set to `null`, constructor parameters are not annotated. The default value is `null` if\n   * [generateSpringBootConfig] is `true` and `\"org.pkl.config.java.mapper.Named\"` otherwise.\n   */\n  val paramsAnnotation: String? =\n    if (generateSpringBootConfig) null else \"org.pkl.config.java.mapper.Named\",\n\n  /**\n   * Fully qualified name of the annotation type to use for annotating non-null types.\n   *\n   * The specified annotation type must have a [java.lang.annotation.Target] of\n   * [java.lang.annotation.ElementType.TYPE_USE] or the generated code may not compile. If set to\n   * `null`, [org.pkl.config.java.mapper.NonNull] will be used.\n   */\n  val nonNullAnnotation: String? = null,\n\n  /** Whether to generate classes that implement [java.io.Serializable]. */\n  val implementSerializable: Boolean = false,\n\n  /**\n   * A mapping from Pkl module name prefixes to their replacements.\n   *\n   * Can be used when the class or package name in the generated source code should be different\n   * from the corresponding name derived from the Pkl module declaration .\n   */\n  val renames: Map<String, String> = emptyMap(),\n)\n\n/** Entrypoint for the Java code generator API. */\nclass JavaCodeGenerator(\n  private val schema: ModuleSchema,\n  private val codegenOptions: JavaCodeGeneratorOptions,\n) {\n\n  companion object {\n    private val OBJECT = ClassName.get(Object::class.java)\n    private val STRING = ClassName.get(String::class.java)\n    private val DURATION = ClassName.get(Duration::class.java)\n    private val DURATION_UNIT = ClassName.get(DurationUnit::class.java)\n    private val DATA_SIZE = ClassName.get(DataSize::class.java)\n    private val DATASIZE_UNIT = ClassName.get(DataSizeUnit::class.java)\n    private val PAIR = ClassName.get(Pair::class.java)\n    private val COLLECTION = ClassName.get(Collection::class.java)\n    private val LIST = ClassName.get(List::class.java)\n    private val SET = ClassName.get(Set::class.java)\n    private val MAP = ClassName.get(Map::class.java)\n    private val PMODULE = ClassName.get(PModule::class.java)\n    private val PCLASS = ClassName.get(PClass::class.java)\n    private val PATTERN = ClassName.get(Pattern::class.java)\n    private val URI = ClassName.get(java.net.URI::class.java)\n    private val VERSION = ClassName.get(Version::class.java)\n\n    private const val PROPERTY_PREFIX: String = \"org.pkl.config.java.mapper.\"\n\n    private fun toClassName(fqn: String): ClassName {\n      val index = fqn.lastIndexOf(\".\")\n      if (index == -1) {\n        throw JavaCodeGeneratorException(\n          \"\"\"\n            Annotation `$fqn` is not a valid Java class.\n            The name of the annotation should be the canonical Java name of the class, for example, `com.example.Foo`.\n          \"\"\"\n            .trimIndent()\n        )\n      }\n      val packageName = fqn.substring(0, index)\n      val classParts = fqn.substring(index + 1).split('$')\n      return if (classParts.size == 1) {\n        ClassName.get(packageName, classParts.first())\n      } else {\n        ClassName.get(packageName, classParts.first(), *classParts.drop(1).toTypedArray())\n      }\n    }\n  }\n\n  val output: Map<String, String>\n    get() {\n      return mapOf(javaFileName to javaFile, propertyFileName to propertiesFile)\n    }\n\n  private val propertyFileName: String\n    get() =\n      \"resources/META-INF/org/pkl/config/java/mapper/classes/${IoUtils.encodePath(schema.moduleName)}.properties\"\n\n  private val propertiesFile: String\n    get() {\n      val props = Properties()\n      props[\"$PROPERTY_PREFIX${schema.moduleClass.qualifiedName}\"] =\n        schema.moduleClass.toJavaPoetName().reflectionName()\n      for (pClass in schema.classes.values) {\n        props[\"$PROPERTY_PREFIX${pClass.qualifiedName}\"] = pClass.toJavaPoetName().reflectionName()\n      }\n      return StringWriter()\n        .apply { props.store(this, \"Java mappings for Pkl module `${schema.moduleName}`\") }\n        .toString()\n    }\n\n  private val nonNullAnnotation: AnnotationSpec\n    get() {\n      val annotation = codegenOptions.nonNullAnnotation\n      val className =\n        if (annotation == null) {\n          ClassName.get(\"org.pkl.config.java.mapper\", \"NonNull\")\n        } else {\n          toClassName(annotation)\n        }\n      return AnnotationSpec.builder(className).build()\n    }\n\n  private val javaFileName: String\n    get() {\n      val (packageName, className) = nameMapper.map(schema.moduleName)\n      val dirPath = packageName.replace('.', '/')\n      return if (dirPath.isEmpty()) {\n        \"java/$className.java\"\n      } else {\n        \"java/$dirPath/$className.java\"\n      }\n    }\n\n  val javaFile: String\n    get() {\n      if (schema.moduleUri.scheme == \"pkl\") {\n        throw JavaCodeGeneratorException(\n          \"Cannot generate Java code for a Pkl standard library module (`${schema.moduleUri}`).\"\n        )\n      }\n\n      val pModuleClass = schema.moduleClass\n      val moduleClass = generateTypeSpec(pModuleClass, schema)\n\n      for (pClass in schema.classes.values) {\n        moduleClass.addType(generateTypeSpec(pClass, schema).build())\n      }\n\n      for (typeAlias in schema.typeAliases.values) {\n        val stringLiterals = mutableSetOf<String>()\n        if (CodeGeneratorUtils.isRepresentableAsEnum(typeAlias.aliasedType, stringLiterals)) {\n          moduleClass.addType(generateEnumTypeSpec(typeAlias, stringLiterals).build())\n        }\n      }\n      // generate static append method for module classes w/o parent class; reuse in subclasses and\n      // nested classes\n      if (pModuleClass.superclass!!.info == PClassInfo.Module) {\n        val modifier =\n          if (pModuleClass.isOpen || pModuleClass.isAbstract) Modifier.PROTECTED\n          else Modifier.PRIVATE\n        moduleClass.addMethod(appendPropertyMethod().addModifiers(modifier).build())\n      }\n\n      val (packageName, _) = nameMapper.map(schema.moduleName)\n\n      return JavaFile.builder(packageName, moduleClass.build())\n        .indent(codegenOptions.indent)\n        .build()\n        .toString()\n    }\n\n  private fun generateTypeSpec(pClass: PClass, schema: ModuleSchema): TypeSpec.Builder {\n    val isModuleClass = pClass == schema.moduleClass\n    val javaPoetClassName = pClass.toJavaPoetName()\n    val superclass =\n      pClass.superclass?.takeIf { it.info != PClassInfo.Typed && it.info != PClassInfo.Module }\n    val superProperties =\n      superclass?.let { renameIfReservedWord(it.allProperties) }?.filterValues { !it.isHidden }\n        ?: mapOf()\n    val properties = renameIfReservedWord(pClass.properties).filterValues { !it.isHidden }\n    val allProperties = superProperties + properties\n\n    fun PClass.Property.isRegex(): Boolean =\n      (this.type as? PType.Class)?.pClass?.info == PClassInfo.Regex\n\n    fun addCtorParameter(\n      builder: MethodSpec.Builder,\n      propJavaName: String,\n      property: PClass.Property,\n    ) {\n      val paramBuilder = ParameterSpec.builder(property.type.toJavaPoetName(), propJavaName)\n      if (paramsAnnotationName != null) {\n        paramBuilder.addAnnotation(\n          AnnotationSpec.builder(paramsAnnotationName)\n            .addMember(\"value\", \"\\$S\", property.simpleName)\n            .build()\n        )\n      }\n      builder.addParameter(paramBuilder.build())\n    }\n\n    fun generateConstructor(isInstantiable: Boolean): MethodSpec {\n      val builder =\n        MethodSpec.constructorBuilder()\n          // choose most restrictive access modifier possible\n          .addModifiers(\n            when {\n              isInstantiable -> Modifier.PUBLIC\n              pClass.isAbstract || pClass.isOpen -> Modifier.PROTECTED\n              else -> Modifier.PRIVATE\n            }\n          )\n\n      if (superProperties.isNotEmpty()) {\n        for ((name, property) in superProperties) {\n          if (properties.containsKey(name)) continue\n          addCtorParameter(builder, name, property)\n        }\n        // $W inserts space or newline (automatic line wrapping)\n        val callArgsStr = superProperties.keys.joinToString(\",\\$W\")\n        // use kotlin interpolation rather than javapoet $L interpolation\n        // as otherwise the $W won't get processed\n        builder.addStatement(\"super($callArgsStr)\")\n      }\n\n      for ((name, property) in properties) {\n        addCtorParameter(builder, name, property)\n        builder.addStatement(\"this.\\$N = \\$N\", name, name)\n      }\n\n      return builder.build()\n    }\n\n    fun generateEqualsMethod(): MethodSpec {\n      val builder =\n        MethodSpec.methodBuilder(\"equals\")\n          .addModifiers(Modifier.PUBLIC)\n          .addAnnotation(Override::class.java)\n          .addParameter(Object::class.java, \"obj\")\n          .returns(Boolean::class.java)\n          .addStatement(\"if (this == obj) return true\")\n          .addStatement(\"if (obj == null) return false\")\n          // generating this.getClass() instead of class literal avoids a SpotBugs warning\n          .addStatement(\"if (this.getClass() != obj.getClass()) return false\")\n          .addStatement(\"\\$T other = (\\$T) obj\", javaPoetClassName, javaPoetClassName)\n\n      for ((propertyName, property) in allProperties) {\n        val accessor = if (property.isRegex()) \"\\$N.pattern()\" else \"\\$N\"\n        builder.addStatement(\n          \"if (!\\$T.equals(this.$accessor, other.$accessor)) return false\",\n          Objects::class.java,\n          propertyName,\n          propertyName,\n        )\n      }\n\n      builder.addStatement(\"return true\")\n      return builder.build()\n    }\n\n    fun generateHashCodeMethod(): MethodSpec {\n      val builder =\n        MethodSpec.methodBuilder(\"hashCode\")\n          .addModifiers(Modifier.PUBLIC)\n          .addAnnotation(Override::class.java)\n          .returns(Int::class.java)\n          .addStatement(\"int result = 1\")\n\n      for ((propertyName, property) in allProperties) {\n        val accessor = if (property.isRegex()) \"this.\\$N.pattern()\" else \"this.\\$N\"\n        builder.addStatement(\n          \"result = 31 * result + \\$T.hashCode($accessor)\",\n          Objects::class.java,\n          propertyName,\n        )\n      }\n\n      builder.addStatement(\"return result\")\n      return builder.build()\n    }\n\n    fun generateToStringMethod(): MethodSpec {\n      val builder =\n        MethodSpec.methodBuilder(\"toString\")\n          .addModifiers(Modifier.PUBLIC)\n          .addAnnotation(Override::class.java)\n          .returns(String::class.java)\n\n      var builderSize = 50\n      val appendBuilder = CodeBlock.builder()\n      for ((propertyName, property) in allProperties) {\n        builderSize += 50\n        if (property.type.isBytesClass) {\n          appendBuilder.addStatement(\n            \"appendProperty(builder, \\$S, \\$T.toString(this.\\$N))\",\n            propertyName,\n            Arrays::class.java,\n            propertyName,\n          )\n        } else {\n          appendBuilder.addStatement(\n            \"appendProperty(builder, \\$S, this.\\$N)\",\n            propertyName,\n            propertyName,\n          )\n        }\n      }\n\n      builder\n        .addStatement(\n          \"\\$T builder = new \\$T(\\$L)\",\n          StringBuilder::class.java,\n          StringBuilder::class.java,\n          builderSize,\n        )\n        .addStatement(\"builder.append(\\$T.class.getSimpleName()).append(\\\" {\\\")\", javaPoetClassName)\n        .addCode(appendBuilder.build())\n        // not using $S here because it generates `\"\\n\" + \"{\"`\n        // with a line break in the generated code after `+`\n        .addStatement(\"builder.append(\\\"\\\\n}\\\")\")\n        .addStatement(\"return builder.toString()\")\n\n      return builder.build()\n    }\n\n    // do the minimum work necessary to avoid (most) java compile errors\n    // generating idiomatic Javadoc would require parsing doc comments, converting member links,\n    // etc.\n    fun renderAsJavadoc(docComment: String): String {\n      val escaped = docComment.replace(\"*/\", \"*&#47;\")\n      return if (escaped[escaped.length - 1] != '\\n') escaped + '\\n' else escaped\n    }\n\n    fun generateDeprecation(\n      annotations: Collection<PObject>,\n      hasJavadoc: Boolean,\n      addAnnotation: (Class<*>) -> Unit,\n      addJavadoc: (String) -> Unit,\n    ) {\n      annotations\n        .firstOrNull { it.classInfo == PClassInfo.Deprecated }\n        ?.let { deprecation ->\n          addAnnotation(Deprecated::class.java)\n          if (codegenOptions.generateJavadoc) {\n            (deprecation[\"message\"] as String?)?.let {\n              if (hasJavadoc) {\n                addJavadoc(\"\\n\")\n              }\n              addJavadoc(renderAsJavadoc(\"@deprecated $it\"))\n            }\n          }\n        }\n    }\n\n    fun generateField(propertyName: String, property: PClass.Property): FieldSpec {\n      val builder = FieldSpec.builder(property.type.toJavaPoetName(), propertyName)\n\n      val docComment = property.docComment\n      val hasJavadoc =\n        docComment != null && codegenOptions.generateJavadoc && !codegenOptions.generateGetters\n      if (hasJavadoc) {\n        builder.addJavadoc(renderAsJavadoc(docComment!!))\n      }\n\n      if (codegenOptions.generateGetters) {\n        builder.addModifiers(\n          if (pClass.isAbstract || pClass.isOpen) Modifier.PROTECTED else Modifier.PRIVATE\n        )\n      } else {\n        generateDeprecation(\n          property.annotations,\n          hasJavadoc,\n          { builder.addAnnotation(it) },\n          { builder.addJavadoc(it) },\n        )\n        builder.addModifiers(Modifier.PUBLIC)\n      }\n      builder.addModifiers(Modifier.FINAL)\n\n      return builder.build()\n    }\n\n    @Suppress(\"DuplicatedCode\")\n    fun generateGetter(\n      propertyName: String,\n      property: PClass.Property,\n      isOverridden: Boolean,\n    ): MethodSpec {\n      val propertyType = property.type\n      val isBooleanProperty =\n        propertyType is PType.Class && propertyType.pClass.info == PClassInfo.Boolean\n      val methodName =\n        (if (isBooleanProperty) \"is\" else \"get\") +\n          // can use original name here (property.name rather than propertyName)\n          // because getter name cannot possibly conflict with reserved words\n          property.simpleName.replaceFirstChar { it.titlecaseChar() }\n\n      val builder =\n        MethodSpec.methodBuilder(methodName)\n          .addModifiers(Modifier.PUBLIC)\n          .returns(propertyType.toJavaPoetName())\n          .addStatement(\"return \\$N\", propertyName)\n      if (isOverridden) {\n        builder.addAnnotation(Override::class.java)\n      }\n\n      val docComment = property.docComment\n      val hasJavadoc = docComment != null && codegenOptions.generateJavadoc\n      if (hasJavadoc) {\n        builder.addJavadoc(renderAsJavadoc(docComment!!))\n      }\n\n      generateDeprecation(\n        property.annotations,\n        hasJavadoc,\n        { builder.addAnnotation(it) },\n        { builder.addJavadoc(it) },\n      )\n\n      return builder.build()\n    }\n\n    fun generateWithMethod(propertyName: String, property: PClass.Property): MethodSpec {\n      val methodName = \"with\" + property.simpleName.replaceFirstChar { it.titlecaseChar() }\n\n      val methodBuilder =\n        MethodSpec.methodBuilder(methodName)\n          .addModifiers(Modifier.PUBLIC)\n          .addParameter(property.type.toJavaPoetName(), propertyName)\n          .returns(javaPoetClassName)\n\n      generateDeprecation(\n        property.annotations,\n        false,\n        { methodBuilder.addAnnotation(it) },\n        { methodBuilder.addJavadoc(it) },\n      )\n\n      val codeBuilder = CodeBlock.builder()\n      codeBuilder.add(\"return new \\$T(\", javaPoetClassName)\n      var firstProperty = true\n      for (name in superProperties.keys) {\n        if (name in properties) continue\n        if (firstProperty) {\n          firstProperty = false\n          codeBuilder.add(\"\\$N\", name)\n        } else {\n          codeBuilder.add(\", \\$N\", name)\n        }\n      }\n      for (name in properties.keys) {\n        if (firstProperty) {\n          firstProperty = false\n          codeBuilder.add(\"\\$N\", name)\n        } else {\n          codeBuilder.add(\", \\$N\", name)\n        }\n      }\n      codeBuilder.add(\");\\n\")\n\n      methodBuilder.addCode(codeBuilder.build())\n      return methodBuilder.build()\n    }\n\n    fun generateSpringBootAnnotations(builder: TypeSpec.Builder) {\n      if (isModuleClass) {\n        builder.addAnnotation(\n          ClassName.get(\"org.springframework.boot.context.properties\", \"ConfigurationProperties\")\n        )\n      } else {\n        // not very efficient to repeat computing module property base types for every class\n        val modulePropertiesWithMatchingType =\n          schema.moduleClass.allProperties.values.filter { property ->\n            var propertyType = property.type\n            while (propertyType is PType.Constrained || propertyType is PType.Nullable) {\n              if (propertyType is PType.Constrained) {\n                propertyType = propertyType.baseType\n              } else if (propertyType is PType.Nullable) {\n                propertyType = propertyType.baseType\n              }\n            }\n            propertyType is PType.Class && propertyType.pClass == pClass\n          }\n        if (modulePropertiesWithMatchingType.size == 1) {\n          // exactly one module property has this type -> make it available for direct injection\n          // (potential improvement: make type available for direct injection if it occurs exactly\n          // once in property tree)\n          builder.addAnnotation(\n            AnnotationSpec.builder(\n                ClassName.get(\n                  \"org.springframework.boot.context.properties\",\n                  \"ConfigurationProperties\",\n                )\n              )\n              // use \"value\" instead of \"prefix\" to entice JavaPoet to generate a single-line\n              // annotation\n              // that can easily be filtered out by JavaCodeGeneratorTest.`spring boot config`\n              .addMember(\"value\", \"\\$S\", modulePropertiesWithMatchingType.first().simpleName)\n              .build()\n          )\n        }\n      }\n    }\n\n    @Suppress(\"DuplicatedCode\")\n    fun generateClass(): TypeSpec.Builder {\n      val builder =\n        TypeSpec.classBuilder(javaPoetClassName.simpleName()).addModifiers(Modifier.PUBLIC)\n      if (codegenOptions.addGeneratedAnnotation) {\n        val name = ClassName.get(\"org.pkl.config.java\", \"Generated\")\n        val generated = AnnotationSpec.builder(name).build()\n        builder.addAnnotation(generated)\n      }\n\n      // stateless final module classes are non-instantiable by choice\n      val isInstantiable =\n        !(pClass.isAbstract || (isModuleClass && !pClass.isOpen && allProperties.isEmpty()))\n\n      if (codegenOptions.implementSerializable && isInstantiable) {\n        builder.addSuperinterface(java.io.Serializable::class.java)\n        builder.addField(generateSerialVersionUIDField())\n      }\n\n      val docComment = pClass.docComment\n      val hasJavadoc = docComment != null && codegenOptions.generateJavadoc\n      if (hasJavadoc) {\n        builder.addJavadoc(renderAsJavadoc(docComment!!))\n      }\n\n      generateDeprecation(\n        pClass.annotations,\n        hasJavadoc,\n        { builder.addAnnotation(it) },\n        { builder.addJavadoc(it) },\n      )\n\n      if (!isModuleClass) {\n        builder.addModifiers(Modifier.STATIC)\n      }\n\n      if (pClass.isAbstract) {\n        builder.addModifiers(Modifier.ABSTRACT)\n      } else if (!pClass.isOpen) {\n        builder.addModifiers(Modifier.FINAL)\n      }\n\n      if (codegenOptions.generateSpringBootConfig) {\n        generateSpringBootAnnotations(builder)\n      }\n\n      builder.addMethod(generateConstructor(isInstantiable))\n\n      superclass?.let { builder.superclass(it.toJavaPoetName()) }\n\n      // generate fields, plus getter methods and either setters or `with` methods in alternating\n      // order\n      // `with` methods also need to be generated for superclass properties so that return type is\n      // self type\n      for ((name, property) in allProperties) {\n        if (name in properties) {\n          builder.addField(generateField(name, property))\n          if (codegenOptions.generateGetters) {\n            val isOverridden = name in superProperties\n            builder.addMethod(generateGetter(name, property, isOverridden))\n          }\n        }\n        if (isInstantiable) {\n          builder.addMethod(generateWithMethod(name, property))\n        }\n      }\n\n      if (isInstantiable) {\n        builder\n          .addMethod(generateEqualsMethod())\n          .addMethod(generateHashCodeMethod())\n          .addMethod(generateToStringMethod())\n      }\n\n      return builder\n    }\n\n    return generateClass()\n  }\n\n  private fun generateSerialVersionUIDField(): FieldSpec {\n    return FieldSpec.builder(Long::class.java, \"serialVersionUID\", Modifier.PRIVATE)\n      .addModifiers(Modifier.STATIC, Modifier.FINAL)\n      .initializer(\"0L\")\n      .build()\n  }\n\n  private fun generateEnumTypeSpec(\n    typeAlias: TypeAlias,\n    stringLiterals: Set<String>,\n  ): TypeSpec.Builder {\n    val enumConstantToPklNames =\n      stringLiterals\n        .groupingBy { literal ->\n          CodeGeneratorUtils.toEnumConstantName(literal)\n            ?: throw JavaCodeGeneratorException(\n              \"Cannot generate Java enum class for Pkl type alias `${typeAlias.displayName}` \" +\n                \"because string literal type \\\"$literal\\\" cannot be converted to a valid enum constant name.\"\n            )\n        }\n        .reduce { enumConstantName, firstLiteral, secondLiteral ->\n          throw JavaCodeGeneratorException(\n            \"Cannot generate Java enum class for Pkl type alias `${typeAlias.displayName}` \" +\n              \"because string literal types \\\"$firstLiteral\\\" and \\\"$secondLiteral\\\" \" +\n              \"would both be converted to enum constant name `$enumConstantName`.\"\n          )\n        }\n\n    val builder =\n      TypeSpec.enumBuilder(typeAlias.simpleName)\n        .addModifiers(Modifier.PUBLIC)\n        .addField(String::class.java, \"value\", Modifier.PRIVATE)\n        .addMethod(\n          MethodSpec.constructorBuilder()\n            .addModifiers(Modifier.PRIVATE)\n            .addParameter(String::class.java, \"value\")\n            .addStatement(\"this.value = value\")\n            .build()\n        )\n        .addMethod(\n          MethodSpec.methodBuilder(\"toString\")\n            .addModifiers(Modifier.PUBLIC)\n            .addAnnotation(Override::class.java)\n            .returns(String::class.java)\n            .addStatement(\"return this.value\")\n            .build()\n        )\n\n    for ((enumConstantName, pklName) in enumConstantToPklNames) {\n      builder.addEnumConstant(\n        enumConstantName,\n        TypeSpec.anonymousClassBuilder(\"\\$S\", pklName).build(),\n      )\n    }\n\n    return builder\n  }\n\n  private val paramsAnnotationName: ClassName? =\n    codegenOptions.paramsAnnotation?.let { toClassName(it) }\n\n  private fun appendPropertyMethod() =\n    MethodSpec.methodBuilder(\"appendProperty\")\n      .addModifiers(Modifier.STATIC)\n      .addParameter(StringBuilder::class.java, \"builder\")\n      .addParameter(String::class.java, \"name\")\n      .addParameter(Object::class.java, \"value\")\n      .addStatement(\"builder.append(\\\"\\\\n  \\\").append(name).append(\\\" = \\\")\")\n      .addStatement(\n        \"\\$T lines = \\$T.toString(value).split(\\\"\\\\n\\\")\",\n        ArrayTypeName.of(String::class.java),\n        Objects::class.java,\n      )\n      .addStatement(\"builder.append(lines[0])\")\n      .beginControlFlow(\"for (int i = 1; i < lines.length; i++)\")\n      .addStatement(\"builder.append(\\\"\\\\n  \\\").append(lines[i])\")\n      .endControlFlow()\n\n  private fun PClass.toJavaPoetName(): ClassName {\n    val (packageName, moduleClassName) = nameMapper.map(moduleName)\n    return if (isModuleClass) {\n      ClassName.get(packageName, moduleClassName)\n    } else {\n      ClassName.get(packageName, moduleClassName, simpleName)\n    }\n  }\n\n  // generated type is a nested enum class\n  private fun TypeAlias.toJavaPoetName(): ClassName {\n    val (packageName, moduleClassName) = nameMapper.map(moduleName)\n    return ClassName.get(packageName, moduleClassName, simpleName)\n  }\n\n  /** Generate `List<? extends Foo>` if `Foo` is `abstract` or `open`, to allow subclassing. */\n  private fun PType.toJavaPoetTypeArgumentName(): TypeName {\n    val baseName = toJavaPoetName(boxed = true)\n    return if (this is PType.Class && (pClass.isAbstract || pClass.isOpen)) {\n      WildcardTypeName.subtypeOf(baseName)\n    } else {\n      baseName\n    }\n  }\n\n  private val PType.isBytesClass: Boolean\n    get() = this is PType.Class && this.pClass.info == PClassInfo.Bytes\n\n  private fun PType.toJavaPoetName(nullable: Boolean = false, boxed: Boolean = false): TypeName =\n    when (this) {\n      PType.UNKNOWN -> OBJECT.nullableIf(nullable)\n      PType.NOTHING -> TypeName.VOID\n      is PType.StringLiteral -> STRING.nullableIf(nullable)\n      is PType.Class -> {\n        // if in doubt, spell it out\n        when (val classInfo = pClass.info) {\n          PClassInfo.Any -> OBJECT\n          PClassInfo.Typed,\n          PClassInfo.Dynamic -> OBJECT.nullableIf(nullable)\n          PClassInfo.Boolean -> TypeName.BOOLEAN.boxIf(boxed).nullableIf(nullable)\n          PClassInfo.String -> STRING.nullableIf(nullable)\n          // seems more useful to generate `double` than `java.lang.Number`\n          PClassInfo.Number -> TypeName.DOUBLE.boxIf(boxed).nullableIf(nullable)\n          PClassInfo.Int -> TypeName.LONG.boxIf(boxed).nullableIf(nullable)\n          PClassInfo.Float -> TypeName.DOUBLE.boxIf(boxed).nullableIf(nullable)\n          PClassInfo.Duration -> DURATION.nullableIf(nullable)\n          PClassInfo.DataSize -> DATA_SIZE.nullableIf(nullable)\n          PClassInfo.Bytes -> ArrayTypeName.of(TypeName.BYTE)\n          PClassInfo.Pair ->\n            ParameterizedTypeName.get(\n                PAIR,\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[0].toJavaPoetTypeArgumentName()\n                },\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[1].toJavaPoetTypeArgumentName()\n                },\n              )\n              .nullableIf(nullable)\n          PClassInfo.Collection ->\n            ParameterizedTypeName.get(\n                COLLECTION,\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[0].toJavaPoetTypeArgumentName()\n                },\n              )\n              .nullableIf(nullable)\n          PClassInfo.List,\n          PClassInfo.Listing -> {\n            ParameterizedTypeName.get(\n                LIST,\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[0].toJavaPoetTypeArgumentName()\n                },\n              )\n              .nullableIf(nullable)\n          }\n          PClassInfo.Set ->\n            ParameterizedTypeName.get(\n                SET,\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[0].toJavaPoetTypeArgumentName()\n                },\n              )\n              .nullableIf(nullable)\n          PClassInfo.Map,\n          PClassInfo.Mapping ->\n            ParameterizedTypeName.get(\n                MAP,\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[0].toJavaPoetTypeArgumentName()\n                },\n                if (typeArguments.isEmpty()) {\n                  OBJECT\n                } else {\n                  typeArguments[1].toJavaPoetTypeArgumentName()\n                },\n              )\n              .nullableIf(nullable)\n          PClassInfo.Module -> PMODULE.nullableIf(nullable)\n          PClassInfo.Class -> PCLASS.nullableIf(nullable)\n          PClassInfo.Regex -> PATTERN.nullableIf(nullable)\n          PClassInfo.Version -> VERSION.nullableIf(nullable)\n          else ->\n            when {\n              !classInfo.isStandardLibraryClass -> pClass.toJavaPoetName().nullableIf(nullable)\n              else ->\n                throw JavaCodeGeneratorException(\n                  \"Standard library class `${pClass.qualifiedName}` is not supported by Java code generator. \" +\n                    \"If you think this is an omission, please let us know.\"\n                )\n            }\n        }\n      }\n      is PType.Nullable -> baseType.toJavaPoetName(nullable = true, boxed = true)\n      is PType.Constrained -> baseType.toJavaPoetName(nullable = nullable, boxed = boxed)\n      is PType.Alias ->\n        when (typeAlias.qualifiedName) {\n          \"pkl.base#NonNull\" -> OBJECT.nullableIf(nullable)\n          \"pkl.base#Int8\" -> TypeName.BYTE.boxIf(boxed).nullableIf(nullable)\n          \"pkl.base#Int16\",\n          \"pkl.base#UInt8\" -> TypeName.SHORT.boxIf(boxed).nullableIf(nullable)\n          \"pkl.base#Int32\",\n          \"pkl.base#UInt16\" -> TypeName.INT.boxIf(boxed).nullableIf(nullable)\n          \"pkl.base#UInt\",\n          \"pkl.base#UInt32\" -> TypeName.LONG.boxIf(boxed).nullableIf(nullable)\n          \"pkl.base#DurationUnit\" -> DURATION_UNIT.nullableIf(nullable)\n          \"pkl.base#DataSizeUnit\" -> DATASIZE_UNIT.nullableIf(nullable)\n          \"pkl.base#Uri\" -> URI.nullableIf(nullable)\n          else -> {\n            if (CodeGeneratorUtils.isRepresentableAsEnum(aliasedType, null)) {\n              if (typeAlias.isStandardLibraryMember) {\n                throw JavaCodeGeneratorException(\n                  \"Standard library typealias `${typeAlias.qualifiedName}` is not supported by Java code generator. \" +\n                    \"If you think this is an omission, please let us know.\"\n                )\n              } else {\n                // reference generated enum class\n                typeAlias.toJavaPoetName().nullableIf(nullable)\n              }\n            } else {\n              // inline type alias\n              aliasedType.toJavaPoetName(nullable)\n            }\n          }\n        }\n      is PType.Function ->\n        throw JavaCodeGeneratorException(\n          \"Pkl function types are not supported by the Java code generator.\"\n        )\n      is PType.Union ->\n        if (CodeGeneratorUtils.isRepresentableAsString(this)) STRING.nullableIf(nullable)\n        else\n          throw JavaCodeGeneratorException(\n            \"Pkl union types are not supported by the Java code generator.\"\n          )\n      else ->\n        // should never encounter PType.TypeVariableNode because it can only occur in stdlib classes\n        throw AssertionError(\"Encountered unexpected PType subclass: $this\")\n    }\n\n  private fun TypeName.nullableIf(isNullable: Boolean): TypeName =\n    if (isPrimitive && isNullable) box()\n    else if (isPrimitive || isNullable) this else annotated(nonNullAnnotation)\n\n  private fun TypeName.boxIf(shouldBox: Boolean): TypeName = if (shouldBox) box() else this\n\n  private fun <T> renameIfReservedWord(map: Map<String, T>): Map<String, T> {\n    return map.mapKeys { (key, _) ->\n      if (key in javaReservedWords) {\n        generateSequence(\"_$key\") { \"_$it\" }.first { it !in map.keys }\n      } else key\n    }\n  }\n\n  private val nameMapper = NameMapper(codegenOptions.renames)\n}\n\ninternal val javaReservedWords =\n  setOf(\n    \"_\", // java 9+\n    \"abstract\",\n    \"assert\",\n    \"boolean\",\n    \"break\",\n    \"byte\",\n    \"case\",\n    \"catch\",\n    \"char\",\n    \"class\",\n    \"const\",\n    \"continue\",\n    \"default\",\n    \"double\",\n    \"do\",\n    \"else\",\n    \"enum\",\n    \"extends\",\n    \"false\",\n    \"final\",\n    \"finally\",\n    \"float\",\n    \"for\",\n    \"goto\",\n    \"if\",\n    \"implements\",\n    \"import\",\n    \"instanceof\",\n    \"int\",\n    \"interface\",\n    \"long\",\n    \"native\",\n    \"new\",\n    \"null\",\n    \"package\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"return\",\n    \"short\",\n    \"static\",\n    \"strictfp\",\n    \"super\",\n    \"switch\",\n    \"synchronized\",\n    \"this\",\n    \"throw\",\n    \"throws\",\n    \"transient\",\n    \"true\",\n    \"try\",\n    \"void\",\n    \"volatile\",\n    \"while\",\n  )\n"
  },
  {
    "path": "pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/Main.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:JvmName(\"Main\")\n\npackage org.pkl.codegen.java\n\nimport com.github.ajalt.clikt.core.main\nimport com.github.ajalt.clikt.parameters.options.*\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.cliMain\nimport org.pkl.commons.cli.commands.ModulesCommand\nimport org.pkl.commons.cli.commands.installCommonOptions\nimport org.pkl.commons.toPath\nimport org.pkl.core.Release\n\n/** Main method for the Java code generator CLI. */\ninternal fun main(args: Array<String>) {\n  cliMain { PklJavaCodegenCommand().main(args) }\n}\n\ninternal val helpLink = \"${Release.current().documentation.homepage}java-binding/codegen.html#cli\"\n\nclass PklJavaCodegenCommand : ModulesCommand(name = \"pkl-codegen-java\", helpLink) {\n  private val defaults = CliJavaCodeGeneratorOptions(CliBaseOptions(), \"\".toPath())\n\n  private val outputDir: Path by\n    option(\n        names = arrayOf(\"-o\", \"--output-dir\"),\n        metavar = \"path\",\n        help = \"The directory where generated source code is placed.\",\n      )\n      .path()\n      .default(defaults.outputDir)\n\n  private val indent: String by\n    option(\n        names = arrayOf(\"--indent\"),\n        metavar = \"chars\",\n        help = \"The characters to use for indenting generated source code.\",\n      )\n      .default(defaults.indent)\n\n  private val addGeneratedAnnotation: Boolean by\n    option(\n        names = arrayOf(\"--add-generated-annotation\"),\n        help = \"Whether to add a @Generated annotation to the types to be generated.\",\n      )\n      .flag()\n\n  private val generateGetters: Boolean by\n    option(\n        names = arrayOf(\"--generate-getters\"),\n        help =\n          \"Whether to generate public getter methods and \" +\n            \"private final fields instead of public final fields.\",\n      )\n      .flag()\n\n  private val generateJavadoc: Boolean by\n    option(\n        names = arrayOf(\"--generate-javadoc\"),\n        help = \"Whether to preserve Pkl doc comments by generating corresponding Javadoc comments.\",\n      )\n      .flag()\n\n  private val generateSpringBoot: Boolean by\n    option(\n        names = arrayOf(\"--generate-spring-boot\"),\n        help = \"Whether to generate config classes for use with Spring Boot.\",\n      )\n      .flag()\n\n  private val paramsAnnotation: String by\n    option(\n        names = arrayOf(\"--params-annotation\"),\n        help =\n          \"Fully qualified name of the annotation type to use for annotating constructor parameters with their name.\",\n      )\n      .defaultLazy(\n        \"`none` if `--generate-spring-boot` is set, `org.pkl.config.java.mapper.Named` otherwise\"\n      ) {\n        if (generateSpringBoot) \"none\" else \"org.pkl.config.java.mapper.Named\"\n      }\n\n  private val nonNullAnnotation: String? by\n    option(\n      names = arrayOf(\"--non-null-annotation\"),\n      help =\n        \"\"\"\n      Fully qualified name of the annotation type to use for annotating non-null types.\n      The specified annotation type must be annotated with `@java.lang.annotation.Target(ElementType.TYPE_USE)`\n      or the generated code may not compile.\n    \"\"\"\n          .trimIndent(),\n    )\n\n  private val implementSerializable: Boolean by\n    option(\n        names = arrayOf(\"--implement-serializable\"),\n        help = \"Whether to generate classes that implement java.io.Serializable.\",\n      )\n      .flag()\n\n  private val renames: Map<String, String> by\n    option(\n        names = arrayOf(\"--rename\"),\n        metavar = \"old_name=new_name\",\n        help =\n          \"\"\"\n            Replace a prefix in the names of the generated Java classes (repeatable).\n            By default, the names of generated classes are derived from the Pkl module names.\n            With this option, you can override or modify the default names, renaming entire\n            classes or just their packages.\n          \"\"\"\n            .trimIndent(),\n      )\n      .associate()\n\n  override val helpString: String = \"Generate Java classes and interfaces from Pkl module(s)\"\n\n  override fun run() {\n    val options =\n      CliJavaCodeGeneratorOptions(\n        base = baseOptions.baseOptions(modules, projectOptions),\n        outputDir = outputDir,\n        indent = indent,\n        addGeneratedAnnotation = addGeneratedAnnotation,\n        generateGetters = generateGetters,\n        generateJavadoc = generateJavadoc,\n        generateSpringBootConfig = generateSpringBoot,\n        paramsAnnotation = if (paramsAnnotation == \"none\") null else paramsAnnotation,\n        nonNullAnnotation = nonNullAnnotation,\n        implementSerializable = implementSerializable,\n        renames = renames,\n      )\n    CliJavaCodeGenerator(options).run()\n  }\n\n  init {\n    installCommonOptions()\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/CliJavaCodeGeneratorTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.java\n\nimport java.nio.file.Path\nimport kotlin.io.path.listDirectoryEntries\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.readString\n\nclass CliJavaCodeGeneratorTest {\n\n  private val dollar = \"$\"\n\n  @Test\n  fun `module inheritance`(@TempDir tempDir: Path) {\n    val module1 =\n      PklModule(\n        \"org.mod1\",\n        \"\"\"\n      open module org.mod1\n\n      pigeon: Person\n\n      class Person {\n        name: String\n        age: Int\n      }\n      \"\"\",\n      )\n\n    val module2 =\n      PklModule(\n        \"org.mod2\",\n        \"\"\"\n      module org.mod2\n\n      extends \"mod1.pkl\"\n\n      parrot: Person\n      \"\"\",\n      )\n\n    val module1File = module1.writeToDisk(tempDir.resolve(\"org/mod1.pkl\"))\n    val module2File = module2.writeToDisk(tempDir.resolve(\"org/mod2.pkl\"))\n    val outputDir = tempDir.resolve(\"output\")\n\n    val generator =\n      CliJavaCodeGenerator(\n        CliJavaCodeGeneratorOptions(\n          CliBaseOptions(listOf(module1File.toUri(), module2File.toUri())),\n          outputDir,\n        )\n      )\n\n    generator.run()\n\n    val javaDir = outputDir.resolve(\"java\")\n\n    val moduleJavaFiles = javaDir.resolve(\"org\").listDirectoryEntries()\n    assertThat(moduleJavaFiles.map { it.fileName.toString() })\n      .containsExactlyInAnyOrder(\"Mod1.java\", \"Mod2.java\")\n\n    val module1JavaFile = javaDir.resolve(\"org/Mod1.java\")\n    assertContains(\n      \"\"\"\n      |public class Mod1 {\n      |  public final @NonNull Person pigeon;\n    \"\"\",\n      module1JavaFile.readString(),\n    )\n\n    val module2JavaFile = javaDir.resolve(\"org/Mod2.java\")\n    assertContains(\n      \"\"\"\n      |public final class Mod2 extends Mod1 {\n      |  public final Mod1. @NonNull Person parrot;\n    \"\"\",\n      module2JavaFile.readString(),\n    )\n    val resourcesDir = outputDir.resolve(\"resources/META-INF/org/pkl/config/java/mapper/classes/\")\n\n    val module1PropertiesFile = resourcesDir.resolve(\"org.mod1.properties\")\n\n    val module1PropertiesString = module1PropertiesFile.readString()\n    // use two assertions because java.util.Properties doesn't guarantee order\n    assertContains(\n      \"\"\"org.pkl.config.java.mapper.org.mod1\\#Person=org.Mod1${dollar}Person\"\"\",\n      module1PropertiesString,\n    )\n    assertContains(\n      \"\"\"org.pkl.config.java.mapper.org.mod1\\#ModuleClass=org.Mod1\"\"\",\n      module1PropertiesString,\n    )\n\n    val module2PropertiesFile = resourcesDir.resolve(\"org.mod2.properties\")\n\n    assertContains(\n      \"\"\"org.pkl.config.java.mapper.org.mod2\\#ModuleClass=org.Mod2\"\"\",\n      module2PropertiesFile.readString(),\n    )\n  }\n\n  @Test\n  fun `class name clashes`(@TempDir tempDir: Path) {\n    val module1 =\n      PklModule(\n        \"org.mod1\",\n        \"\"\"\n      module org.mod1\n\n      class Person {\n        name: String\n      }\n      \"\"\",\n      )\n\n    val module2 =\n      PklModule(\n        \"org.mod2\",\n        \"\"\"\n      module org.mod2\n\n      import \"mod1.pkl\"\n\n      person1: mod1.Person\n      person2: Person\n\n      class Person {\n        age: Int\n      }\n      \"\"\",\n      )\n\n    val module1PklFile = module1.writeToDisk(tempDir.resolve(\"org/mod1.pkl\"))\n    val module2PklFile = module2.writeToDisk(tempDir.resolve(\"org/mod2.pkl\"))\n    val outputDir = tempDir.resolve(\"output\")\n\n    val generator =\n      CliJavaCodeGenerator(\n        CliJavaCodeGeneratorOptions(\n          CliBaseOptions(listOf(module1PklFile.toUri(), module2PklFile.toUri())),\n          outputDir,\n        )\n      )\n\n    generator.run()\n\n    val module2JavaFile = outputDir.resolve(\"java/org/Mod2.java\")\n    assertContains(\n      \"\"\"\n      |public final class Mod2 {\n      |  public final Mod1. @NonNull Person person1;\n      |\n      |  public final @NonNull Person person2;\n      \"\"\",\n      module2JavaFile.readString(),\n    )\n  }\n\n  @Test\n  fun `custom package names`(@TempDir tempDir: Path) {\n    val module1 =\n      PklModule(\n        \"org.foo.Module1\",\n        \"\"\"\n          module org.foo.Module1\n\n          class Person {\n            name: String\n          }\n        \"\"\",\n      )\n\n    val module2 =\n      PklModule(\n        \"org.bar.Module2\",\n        \"\"\"\n          module org.bar.Module2\n          \n          import \"../../org/foo/Module1.pkl\"\n\n          class Group {\n            owner: Module1.Person\n            name: String\n          }\n        \"\"\",\n      )\n\n    val module3 =\n      PklModule(\n        \"org.baz.Module3\",\n        \"\"\"\n          module org.baz.Module3\n          \n          import \"../../org/bar/Module2.pkl\"\n\n          class Supergroup {\n            owner: Module2.Group\n          }\n        \"\"\",\n      )\n\n    val module1PklFile = module1.writeToDisk(tempDir.resolve(\"org/foo/Module1.pkl\"))\n    val module2PklFile = module2.writeToDisk(tempDir.resolve(\"org/bar/Module2.pkl\"))\n    val module3PklFile = module3.writeToDisk(tempDir.resolve(\"org/baz/Module3.pkl\"))\n    val outputDir = tempDir.resolve(\"output\")\n\n    val generator =\n      CliJavaCodeGenerator(\n        CliJavaCodeGeneratorOptions(\n          CliBaseOptions(listOf(module1PklFile, module2PklFile, module3PklFile).map { it.toUri() }),\n          outputDir,\n          renames = mapOf(\"org.foo\" to \"com.foo.x\", \"org.baz\" to \"com.baz.a.b\"),\n        )\n      )\n\n    generator.run()\n\n    val module1JavaFile = outputDir.resolve(\"java/com/foo/x/Module1.java\")\n    module1JavaFile.readString().let {\n      assertContains(\"package com.foo.x;\", it)\n\n      assertContains(\"public final class Module1 {\", it)\n\n      assertContains(\n        \"\"\"\n        |  public static final class Person {\n        |    public final @NonNull String name;\n        \"\"\",\n        it,\n      )\n    }\n\n    val module2JavaFile = outputDir.resolve(\"java/org/bar/Module2.java\")\n    module2JavaFile.readString().let {\n      assertContains(\"package org.bar;\", it)\n\n      assertContains(\"import com.foo.x.Module1;\", it)\n\n      assertContains(\"public final class Module2 {\", it)\n\n      assertContains(\n        \"\"\"\n        |  public static final class Group {\n        |    public final Module1. @NonNull Person owner;\n        \"\"\",\n        it,\n      )\n    }\n\n    val module3JavaFile = outputDir.resolve(\"java/com/baz/a/b/Module3.java\")\n    module3JavaFile.readString().let {\n      assertContains(\"package com.baz.a.b;\", it)\n\n      assertContains(\"import org.bar.Module2;\", it)\n\n      assertContains(\"public final class Module3 {\", it)\n\n      assertContains(\n        \"\"\"\n        |  public static final class Supergroup {\n        |    public final Module2. @NonNull Group owner;\n        \"\"\",\n        it,\n      )\n    }\n  }\n\n  private fun assertContains(part: String, code: String) {\n    val trimmedPart = part.trim().trimMargin()\n    if (!code.contains(trimmedPart)) {\n      // check for equality to get better error output (ide diff dialog)\n      assertThat(code).isEqualTo(trimmedPart)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/InMemoryJavaCompiler.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.java\n\nimport java.io.ByteArrayOutputStream\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.net.URI\nimport javax.tools.*\n\nclass CompilationFailedException(msg: String) : RuntimeException(msg)\n\nobject InMemoryJavaCompiler {\n  fun compile(sourceFiles: Map<String, String>): Map<String, Class<*>> {\n    val compiler = ToolProvider.getSystemJavaCompiler()\n    val diagnosticsCollector = DiagnosticCollector<JavaFileObject>()\n    val fileManager =\n      InMemoryFileManager(compiler.getStandardFileManager(diagnosticsCollector, null, null))\n    val sourceObjects =\n      sourceFiles\n        .filter { (filename, _) -> filename.endsWith(\".java\") }\n        .map { (filename, contents) -> ReadableSourceFileObject(filename, contents) }\n    val task = compiler.getTask(null, fileManager, diagnosticsCollector, null, null, sourceObjects)\n    val result = task.call()\n    if (!result) {\n      throw CompilationFailedException(\n        buildString {\n          appendLine(\"Compilation failed. Error(s):\")\n          for (diagnostic in diagnosticsCollector.diagnostics) {\n            appendLine(diagnostic.getMessage(null))\n          }\n        }\n      )\n    }\n    val loader = ClassFileObjectLoader(fileManager.outputFiles)\n    return fileManager.outputFiles.mapValues { loader.loadClass(it.key) }\n  }\n}\n\nprivate class ClassFileObjectLoader(val fileObjects: Map<String, WritableBinaryFileObject>) :\n  ClassLoader(ClassFileObjectLoader::class.java.classLoader) {\n\n  override fun findClass(name: String): Class<*> {\n    val obj = fileObjects[name]\n    if (obj == null || obj.kind != JavaFileObject.Kind.CLASS) {\n      throw ClassNotFoundException(name)\n    }\n    val array = obj.out.toByteArray()\n    return defineClass(name, array, 0, array.size)\n  }\n}\n\nprivate class ReadableSourceFileObject(path: String, private val contents: String) :\n  SimpleJavaFileObject(URI(path), JavaFileObject.Kind.SOURCE) {\n\n  override fun openInputStream(): InputStream = contents.byteInputStream()\n\n  override fun getCharContent(ignoreEncodingErrors: Boolean): CharSequence = contents\n}\n\nprivate class WritableBinaryFileObject(className: String, kind: JavaFileObject.Kind) :\n  SimpleJavaFileObject(URI(\"/${className.replace(\".\", \"/\")}.${kind.extension}\"), kind) {\n  val out = ByteArrayOutputStream()\n\n  override fun openOutputStream(): OutputStream = out\n}\n\nprivate class InMemoryFileManager(delegate: JavaFileManager) :\n  ForwardingJavaFileManager<JavaFileManager>(delegate) {\n\n  val outputFiles = mutableMapOf<String, WritableBinaryFileObject>()\n\n  override fun getJavaFileForOutput(\n    location: JavaFileManager.Location,\n    className: String,\n    kind: JavaFileObject.Kind,\n    sibling: FileObject,\n  ): JavaFileObject {\n\n    return WritableBinaryFileObject(className, kind).also { outputFiles[className] = it }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.java\n\nimport java.io.*\nimport java.nio.file.Path\nimport java.util.function.Consumer\nimport java.util.regex.Pattern\nimport org.assertj.core.api.AbstractAssert\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertAll\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ValueSource\nimport org.pkl.core.*\nimport org.pkl.core.ModuleSource.path\nimport org.pkl.core.ModuleSource.text\nimport org.pkl.core.util.IoUtils\n\nclass JavaCodeGeneratorTest {\n  companion object {\n    private const val MAPPER_PREFIX = \"resources/META-INF/org/pkl/config/java/mapper/classes\"\n\n    private val simpleClass: Class<*> by lazy {\n      generateJavaCode(\n          \"\"\"\n        module my.mod\n\n        class Simple {\n          str: String\n          list: List<Int>\n        }\n      \"\"\"\n            .trimIndent()\n        )\n        .compile()\n        .getValue(\"my.Mod\\$Simple\")\n    }\n\n    private val propertyTypesSources: JavaSourceCode by lazy {\n      generateJavaCode(\n        \"\"\"\n        module my.mod\n\n        class PropertyTypes {\n          boolean: Boolean\n          int: Int\n          float: Float\n          string: String\n          duration: Duration\n          durationUnit: DurationUnit\n          dataSize: DataSize\n          dataSizeUnit: DataSizeUnit\n          nullable: String?\n          nullable2: String?\n          pair: Pair\n          pair2: Pair<String, Other>\n          coll: Collection\n          coll2: Collection<Other>\n          list: List\n          list2: List<Other>\n          set: Set\n          set2: Set<Other>\n          map: Map\n          map2: Map<String, Other>\n          container: Mapping\n          container2: Mapping<String, Other>\n          other: Other\n          regex: Regex\n          any: Any\n          nonNull: NonNull\n          enum: Direction\n          bytes: Bytes\n        }\n\n        class Other {\n          name: String\n        }\n\n        typealias Direction = \"north\"|\"east\"|\"south\"|\"west\"\n      \"\"\"\n      )\n    }\n\n    private val propertyTypesClasses: Map<String, Class<*>> by lazy {\n      propertyTypesSources.compile()\n    }\n\n    private fun generateJavaCode(\n      pklCode: String,\n      options: JavaCodeGeneratorOptions = JavaCodeGeneratorOptions(),\n    ): JavaSourceCode {\n      val module = Evaluator.preconfigured().evaluateSchema(text(pklCode))\n      val generator = JavaCodeGenerator(module, options)\n      return JavaSourceCode(generator.javaFile)\n    }\n  }\n\n  @TempDir lateinit var tempDir: Path\n\n  @Test\n  fun testEquals() {\n    val ctor = simpleClass.constructors.first()\n    val instance1 = ctor.newInstance(\"foo\", listOf(1, 2, 3))\n    val instance2 = ctor.newInstance(\"foo\", listOf(1, 2, 3))\n    val instance3 = ctor.newInstance(\"foo\", listOf(1, 3, 2))\n    val instance4 = ctor.newInstance(\"bar\", listOf(1, 2, 3))\n\n    assertThat(instance1).isEqualTo(instance1).isEqualTo(instance2)\n    assertThat(instance2).isEqualTo(instance1)\n    assertThat(instance3).isNotEqualTo(instance1)\n    assertThat(instance4).isNotEqualTo(instance1)\n  }\n\n  @Test\n  fun testHashCode() {\n    val ctor = simpleClass.constructors.first()\n    val instance1 = ctor.newInstance(\"foo\", listOf(1, 2, 3))\n    val instance2 = ctor.newInstance(\"foo\", listOf(1, 2, 3))\n    val instance3 = ctor.newInstance(\"foo\", listOf(1, 3, 2))\n    val instance4 = ctor.newInstance(\"bar\", listOf(1, 2, 3))\n\n    assertThat(instance1.hashCode()).isEqualTo(instance1.hashCode()).isEqualTo(instance2.hashCode())\n    assertThat(instance3.hashCode()).isNotEqualTo(instance1.hashCode())\n    assertThat(instance4.hashCode()).isNotEqualTo(instance1.hashCode())\n  }\n\n  @Test\n  fun testToString() {\n    val (_, propertyTypes) = instantiateOtherAndPropertyTypes()\n\n    assertThat(propertyTypes.toString())\n      .isEqualTo(\n        \"\"\"\n        PropertyTypes {\n          _boolean = true\n          _int = 42\n          _float = 42.3\n          string = string\n          duration = 5.min\n          durationUnit = min\n          dataSize = 3.gb\n          dataSizeUnit = gb\n          nullable = idea\n          nullable2 = null\n          pair = Pair(1, 2)\n          pair2 = Pair(pigeon, Other {\n            name = pigeon\n          })\n          coll = [1, 2, 3]\n          coll2 = [Other {\n            name = pigeon\n          }, Other {\n            name = pigeon\n          }]\n          list = [1, 2, 3]\n          list2 = [Other {\n            name = pigeon\n          }, Other {\n            name = pigeon\n          }]\n          set = [1, 2, 3]\n          set2 = [Other {\n            name = pigeon\n          }]\n          map = {1=one, 2=two}\n          map2 = {one=Other {\n            name = pigeon\n          }, two=Other {\n            name = pigeon\n          }}\n          container = {1=one, 2=two}\n          container2 = {one=Other {\n            name = pigeon\n          }, two=Other {\n            name = pigeon\n          }}\n          other = Other {\n            name = pigeon\n          }\n          regex = (i?)\\w*\n          any = Other {\n            name = pigeon\n          }\n          nonNull = Other {\n            name = pigeon\n          }\n          _enum = north\n          bytes = [1, 2, 3, 4]\n        }\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `deprecated property with message`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      class ClassWithDeprecatedProperty {\n         @Deprecated { message = \"property deprecation message\" } \n         deprecatedProperty: Int = 1337\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateJavadoc = true),\n      )\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  public static final class ClassWithDeprecatedProperty {\n        |    /**\n        |     * @deprecated property deprecation message\n        |     */\n        |    @Deprecated\n        |    public final long deprecatedProperty;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    /**\n        |     * @deprecated property deprecation message\n        |     */\n        |    @Deprecated\n        |    public ClassWithDeprecatedProperty withDeprecatedProperty(long deprecatedProperty) {\n        |      return new ClassWithDeprecatedProperty(deprecatedProperty);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated property's getter with message`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      class ClassWithDeprecatedProperty {\n         @Deprecated { message = \"property deprecation message\" } \n         deprecatedProperty: Int = 1337\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateGetters = true, generateJavadoc = true),\n      )\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  public static final class ClassWithDeprecatedProperty {\n        |    private final long deprecatedProperty;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    /**\n        |     * @deprecated property deprecation message\n        |     */\n        |    @Deprecated\n        |    public long getDeprecatedProperty() {\n        |      return deprecatedProperty;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    /**\n        |     * @deprecated property deprecation message\n        |     */\n        |    @Deprecated\n        |    public ClassWithDeprecatedProperty withDeprecatedProperty(long deprecatedProperty) {\n        |      return new ClassWithDeprecatedProperty(deprecatedProperty);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated class with message`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      @Deprecated { message = \"class deprecation message\" }\n      class DeprecatedClass {\n        propertyOfDeprecatedClass: Int = 42\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateJavadoc = true),\n      )\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n      |  /**\n      |   * @deprecated class deprecation message\n      |   */\n      |  @Deprecated\n      |  public static final class DeprecatedClass {\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @ParameterizedTest\n  @ValueSource(booleans = [false, true])\n  fun `deprecated module class with message`(generateJavadoc: Boolean) {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      @Deprecated{ message = \"module class deprecation message\" }\n      module DeprecatedModule\n      \n      propertyInDeprecatedModuleClass : Int = 42\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateJavadoc = generateJavadoc),\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n      |@Deprecated\n      |public final class DeprecatedModule {\n    \"\"\"\n          .trimMargin()\n      )\n\n    if (generateJavadoc) {\n      assertThat(javaCode)\n        .contains(\n          \"\"\"\n        |/**\n        | * @deprecated module class deprecation message\n        | */\n      \"\"\"\n            .trimMargin()\n        )\n    } else {\n      assertThat(javaCode).doesNotContain(\"* @deprecated\")\n    }\n  }\n\n  @ParameterizedTest\n  @ValueSource(booleans = [false, true])\n  fun `deprecated property`(generateJavadoc: Boolean) {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      class ClassWithDeprecatedProperty {\n         @Deprecated\n         deprecatedProperty: Int = 1337\n      }\n    \"\"\"\n          .trimIndent(),\n        // no message, so no Javadoc, regardless of flag\n        JavaCodeGeneratorOptions(generateJavadoc = generateJavadoc),\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  public static final class ClassWithDeprecatedProperty {\n        |    @Deprecated\n        |    public final long deprecatedProperty;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    @Deprecated\n        |    public ClassWithDeprecatedProperty withDeprecatedProperty(long deprecatedProperty) {\n        |      return new ClassWithDeprecatedProperty(deprecatedProperty);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"* @deprecated\")\n  }\n\n  @Test\n  fun `deprecated property's getter`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n        class ClassWithDeprecatedProperty {\n           @Deprecated\n           deprecatedProperty: Int = 1337\n        }\n      \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateGetters = true),\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  public static final class ClassWithDeprecatedProperty {\n        |    private final long deprecatedProperty;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    @Deprecated\n        |    public long getDeprecatedProperty() {\n        |      return deprecatedProperty;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    @Deprecated\n        |    public ClassWithDeprecatedProperty withDeprecatedProperty(long deprecatedProperty) {\n        |      return new ClassWithDeprecatedProperty(deprecatedProperty);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"* @deprecated\")\n  }\n\n  @Test\n  fun `deprecated class`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      @Deprecated\n      class DeprecatedClass {\n        propertyOfDeprecatedClass: Int = 42\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  @Deprecated\n        |  public static final class DeprecatedClass {\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"* @deprecated\")\n  }\n\n  @Test\n  fun `deprecated module class`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      @Deprecated\n      module DeprecatedModule\n      \n      propertyInDeprecatedModuleClass : Int = 42\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |@Deprecated\n        |public final class DeprecatedModule {\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"* @deprecated\")\n  }\n\n  @Test\n  fun `deprecation with message and doc comment on the same property`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      /// Documenting deprecatedProperty\n      @Deprecated { message = \"property is deprecated\" }\n      deprecatedProperty: Int\n    \"\"\",\n        JavaCodeGeneratorOptions(generateJavadoc = true),\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  /**\n        |   * Documenting deprecatedProperty\n        |   *\n        |   * @deprecated property is deprecated\n        |   */\n        |  @Deprecated\n        |  public final long deprecatedProperty;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun properties() {\n    val (other, propertyTypes) = instantiateOtherAndPropertyTypes()\n\n    assertThat(readProperty(other, \"name\")).isEqualTo(\"pigeon\")\n    assertThat(readProperty(propertyTypes, \"_boolean\")).isEqualTo(true)\n    assertThat(readProperty(propertyTypes, \"_int\")).isEqualTo(42L)\n    assertThat(readProperty(propertyTypes, \"_float\")).isEqualTo(42.3)\n    assertThat(readProperty(propertyTypes, \"string\")).isEqualTo(\"string\")\n    assertThat(readProperty(propertyTypes, \"duration\"))\n      .isEqualTo(Duration(5.0, DurationUnit.MINUTES))\n    assertThat(readProperty(propertyTypes, \"dataSize\"))\n      .isEqualTo(DataSize(3.0, DataSizeUnit.GIGABYTES))\n    assertThat(readProperty(propertyTypes, \"nullable\")).isEqualTo(\"idea\")\n    assertThat(readProperty(propertyTypes, \"nullable2\")).isEqualTo(null as String?)\n    assertThat(readProperty(propertyTypes, \"list\")).isEqualTo(listOf(1, 2, 3))\n    assertThat(readProperty(propertyTypes, \"list2\")).isEqualTo(listOf(other, other))\n    assertThat(readProperty(propertyTypes, \"set\")).isEqualTo(setOf(1, 2, 3))\n    assertThat(readProperty(propertyTypes, \"set2\")).isEqualTo(setOf(other))\n    assertThat(readProperty(propertyTypes, \"map\")).isEqualTo(mapOf(1 to \"one\", 2 to \"two\"))\n    assertThat(readProperty(propertyTypes, \"map2\")).isEqualTo(mapOf(\"one\" to other, \"two\" to other))\n    assertThat(readProperty(propertyTypes, \"container\")).isEqualTo(mapOf(1 to \"one\", 2 to \"two\"))\n    assertThat(readProperty(propertyTypes, \"container2\"))\n      .isEqualTo(mapOf(\"one\" to other, \"two\" to other))\n    assertThat(readProperty(propertyTypes, \"other\")).isEqualTo(other)\n    assertThat(readProperty(propertyTypes, \"regex\")).isInstanceOf(Pattern::class.java)\n    assertThat(readProperty(propertyTypes, \"any\")).isEqualTo(other)\n    assertThat(readProperty(propertyTypes, \"nonNull\")).isEqualTo(other)\n    assertThat(readProperty(propertyTypes, \"bytes\")).isEqualTo(byteArrayOf(1, 2, 3, 4))\n  }\n\n  private fun readProperty(obj: Any, property: String): Any? =\n    obj::class.java.getField(property).get(obj)\n\n  @Test\n  fun `properties 2`() {\n    assertThat(propertyTypesSources).isEqualToResourceFile(\"PropertyTypes.jva\")\n  }\n\n  @Test\n  fun `enum constant names`() {\n    val cases =\n      listOf(\n        \"camelCasedName\" to \"CAMEL_CASED_NAME\",\n        \"hyphenated-name\" to \"HYPHENATED_NAME\",\n        \"EnQuad\\u2000EmSpace\\u2003IdeographicSpace\\u3000\" to \"EN_QUAD_EM_SPACE_IDEOGRAPHIC_SPACE_\",\n        \"ᾊᾨ\" to \"ᾊᾨ\",\n        \"0-digit\" to \"_0_DIGIT\",\n        \"digit-1\" to \"DIGIT_1\",\n        \"42\" to \"_42\",\n        \"àœü\" to \"ÀŒÜ\",\n        \"日本-つくば\" to \"日本_つくば\",\n      )\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n      typealias MyTypeAlias = ${cases.joinToString(\" | \") { \"\\\"${it.first}\\\"\" }}\n    \"\"\"\n          .trimIndent()\n      )\n    val javaClass = javaCode.compile().getValue(\"my.Mod\\$MyTypeAlias\")\n\n    assertThat(javaClass.enumConstants.size)\n      .isEqualTo(cases.size) // make sure zip doesn't drop cases\n\n    assertAll(\n      \"generated enum constants have correct names\",\n      javaClass.declaredFields.zip(cases) { field, (_, kotlinName) ->\n        {\n          assertThat(field.name).isEqualTo(kotlinName)\n          Unit\n        }\n      },\n    )\n\n    assertAll(\n      \"toString() returns Pkl name\",\n      javaClass.enumConstants.zip(cases) { enumConstant, (pklName, _) ->\n        { assertThat(enumConstant.toString()).isEqualTo(pklName) }\n      },\n    )\n  }\n\n  @Test\n  fun `conflicting enum constant names`() {\n    val exception =\n      assertThrows<JavaCodeGeneratorException> {\n        generateJavaCode(\n          \"\"\"\n        module my.mod\n        typealias MyTypeAlias = \"foo-bar\" | \"foo bar\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n\n    assertThat(exception)\n      .hasMessageContainingAll(\"both be converted to enum constant name\", \"FOO_BAR\")\n  }\n\n  @Test\n  fun `empty enum constant name`() {\n    val exception =\n      assertThrows<JavaCodeGeneratorException> {\n        generateJavaCode(\n          \"\"\"\n        module my.mod\n        typealias MyTypeAlias = \"foo\" | \"\" | \"bar\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n\n    assertThat(exception).hasMessageContaining(\"cannot be converted\")\n  }\n\n  @Test\n  fun `inconvertible enum constant name`() {\n    val exception =\n      assertThrows<JavaCodeGeneratorException> {\n        generateJavaCode(\n          \"\"\"\n        module my.mod\n        typealias MyTypeAlias = \"foo\" | \"✅\" | \"bar\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n    assertThat(exception).hasMessageContainingAll(\"✅\", \"cannot be converted\")\n  }\n\n  @Test\n  fun `recursive types`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      class Foo {\n        other: Int\n        bar: Bar\n      }\n      class Bar {\n        foo: Foo\n        other: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  public static final class Foo {\n        |    public final long other;\n        |\n        |    public final @NonNull Bar bar;\n        |\n        |    public Foo(@Named(\"other\") long other, @Named(\"bar\") @NonNull Bar bar) {\n        |      this.other = other;\n        |      this.bar = bar;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static final class Bar {\n        |    public final @NonNull Foo foo;\n        |\n        |    public final @NonNull String other;\n        |\n        |    public Bar(@Named(\"foo\") @NonNull Foo foo, @Named(\"other\") @NonNull String other) {\n        |      this.foo = foo;\n        |      this.other = other;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun inheritance() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      abstract class Foo {\n        one: Int\n      }\n      open class None extends Foo {}\n      open class Bar extends None {\n        two: String?\n      }\n      class Baz extends Bar {\n        three: Duration\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateGetters = true),\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  public abstract static class Foo {\n        |    protected final long one;\n        |\n        |    protected Foo(@Named(\"one\") long one) {\n        |      this.one = one;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static class None extends Foo {\n        |    public None(@Named(\"one\") long one) {\n        |      super(one);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static class Bar extends None {\n        |    protected final String two;\n        |\n        |    public Bar(@Named(\"one\") long one, @Named(\"two\") String two) {\n        |      super(one);\n        |      this.two = two;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .isEqualToResourceFile(\"Inheritance.jva\")\n  }\n\n  @Test\n  fun `stateless classes`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      class Foo\n      abstract class Bar\n      class Baz extends Bar\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |  public static final class Foo {\n        |    public Foo() {\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public abstract static class Bar {\n        |    protected Bar() {\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static final class Baz extends Bar {\n        |    public Baz() {\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `stateless module classes`() {\n    var javaCode = generateJavaCode(\"module my.mod\")\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |public final class Mod {\n        |  private Mod() {\n        |  }\n      \"\"\"\n          .trimMargin()\n      )\n\n    javaCode = generateJavaCode(\"abstract module my.mod\")\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n      |public abstract class Mod {\n      |  protected Mod() {\n      |  }\n    \"\"\"\n          .trimMargin()\n      )\n\n    javaCode = generateJavaCode(\"open module my.mod\")\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n      |public class Mod {\n      |  public Mod() {\n      |  }\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `reserved words`() {\n    val props = javaReservedWords.joinToString(\"\\n\") { \"`$it`: Int\" }\n\n    val fooClass =\n      generateJavaCode(\n          \"\"\"\n      module my.mod\n\n      class Foo {\n        $props\n      }\n    \"\"\"\n            .trimIndent()\n        )\n        .compile()\n        .getValue(\"my.Mod\\$Foo\")\n\n    assertThat(fooClass.declaredFields).allSatisfy(Consumer { it.name.startsWith(\"_\") })\n  }\n\n  @Test\n  fun generatedAnnotation() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      class GeneratedAnnotation {\n        test: Boolean = true\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(addGeneratedAnnotation = true),\n      )\n\n    assertThat(javaCode).compilesSuccessfully().isEqualToResourceFile(\"GeneratedAnnotation.jva\")\n  }\n\n  @Test\n  fun getters() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      class GenerateGetters {\n        urgent: Boolean = true\n        url: String = \"https://apple.com\"\n        diskSize: DataSize = 4.mb\n        ETA: Duration = 3.s\n        package: String\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateGetters = true),\n      )\n\n    assertThat(javaCode).compilesSuccessfully().isEqualToResourceFile(\"GenerateGetters.jva\")\n  }\n\n  @Test\n  fun `'with' methods`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      abstract class Foo {\n        x: Int\n      }\n      class Bar extends Foo {\n        y: String\n      }\n    \"\"\"\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |    public Bar withX(long x) {\n        |      return new Bar(x, y);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    public Bar withY(@NonNull String y) {\n        |      return new Bar(x, y);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"public Foo withX\") // because `Foo` is abstract\n  }\n\n  @Test\n  fun `module class`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n      \n      pigeon: String\n      parrot: String\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n      |public final class Mod {\n      |  public final @NonNull String pigeon;\n      |\n      |  public final @NonNull String parrot;\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `hidden properties`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      hidden pigeon1: String\n      parrot1: String\n\n      class Persons {\n        hidden pigeon2: String\n        parrot2: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .doesNotContain(\"final String pigeon1\")\n      .contains(\"final @NonNull String parrot1\")\n      .doesNotContain(\"final String pigeon2\")\n      .contains(\"final @NonNull String parrot2\")\n  }\n\n  @Test\n  fun javadoc() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      /// module comment.\n      /// *emphasized* `code`.\n      module my.mod\n\n      /// module property comment.\n      /// *emphasized* `code`.\n      pigeon: Person\n\n      /// class comment.\n      /// *emphasized* `code`.\n      class Person {\n        /// class property comment.\n        /// *emphasized* `code`.\n        name: String\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateJavadoc = true),\n      )\n\n    assertThat(javaCode).compilesSuccessfully().isEqualToResourceFile(\"Javadoc.jva\")\n  }\n\n  @Test\n  fun `javadoc 2`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      /// module property comment.\n      /// can contain /* and */ characters.\n      pigeon: Person\n\n      class Person {\n        /// class property comment.\n        /// can contain /* and */ characters.\n        name: String\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateGetters = true, generateJavadoc = true),\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  /**\n        |   * module property comment.\n        |   * can contain /* and *&#47; characters.\n        |   */\n        |  public @NonNull Person getPigeon() {\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    /**\n        |     * class property comment.\n        |     * can contain /* and *&#47; characters.\n        |     */\n        |    public @NonNull String getName() {\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `pkl_base type aliases`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n\n      uint8: UInt8\n      uint16: UInt16\n      uint32: UInt32\n      uint: UInt\n      int8: Int8\n      int16: Int16\n      int32: Int32\n      uri: Uri\n\n      pair: Pair<UInt8, UInt16>\n      list: List<UInt32>\n      set: Set<UInt>\n      map: Map<Int8, Int16>\n      listing: Listing<Int32>\n      mapping: Mapping<Uri, UInt8>\n      nullable: UInt16?\n\n      class Foo {\n        uint8: UInt8\n        uint16: UInt16\n        uint32: UInt32\n        uint: UInt\n        int8: Int8\n        int16: Int16\n        int32: Int32\n        uri: Uri\n        list: List<UInt>\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |public final class Mod {\n        |  public final short uint8;\n        |\n        |  public final int uint16;\n        |\n        |  public final long uint32;\n        |\n        |  public final long uint;\n        |\n        |  public final byte int8;\n        |\n        |  public final short int16;\n        |\n        |  public final int int32;\n        |\n        |  public final @NonNull URI uri;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public final @NonNull Pair<@NonNull Short, @NonNull Integer> pair;\n        |\n        |  public final @NonNull List<@NonNull Long> list;\n        |\n        |  public final @NonNull Set<@NonNull Long> set;\n        |\n        |  public final @NonNull Map<@NonNull Byte, @NonNull Short> map;\n        |\n        |  public final @NonNull List<@NonNull Integer> listing;\n        |\n        |  public final @NonNull Map<@NonNull URI, @NonNull Short> mapping;\n        |\n        |  public final Integer nullable;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static final class Foo {\n        |    public final short uint8;\n        |\n        |    public final int uint16;\n        |\n        |    public final long uint32;\n        |\n        |    public final long uint;\n        |\n        |    public final byte int8;\n        |\n        |    public final short int16;\n        |\n        |    public final int int32;\n        |\n        |    public final @NonNull URI uri;\n        |\n        |    public final @NonNull List<@NonNull Long> list;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `nullable properties`() {\n    var javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n      \n      foo: String\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(nonNullAnnotation = \"com.example.Annotations\\$NonNull\"),\n      )\n\n    assertThat(javaCode)\n      .contains(\"import com.example.Annotations;\")\n      .contains(\"public final @Annotations.NonNull String foo;\")\n\n    javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n      \n      foo: Int\n      bar: Int?\n      baz: Any\n      qux: String\n      foo2: List<String>?\n      bar2: List<String?>\n      baz2: List<String>\n      qux2: List<Int>\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n      |public final class Mod {\n      |  public final long foo;\n      |\n      |  public final Long bar;\n      |\n      |  public final Object baz;\n      |\n      |  public final @NonNull String qux;\n      |\n      |  public final List<@NonNull String> foo2;\n      |\n      |  public final @NonNull List<String> bar2;\n      |\n      |  public final @NonNull List<@NonNull String> baz2;\n      |\n      |  public final @NonNull List<@NonNull Long> qux2;\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `user defined type aliases`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n\n      typealias Simple = String\n      typealias Constrained = String(length >= 3)\n      typealias Parameterized = List<Int(nonZero)>\n      typealias Recursive1 = Parameterized(nonEmpty)\n      typealias Recursive2 = List<Constrained>\n\n      simple: Simple\n      constrained: Constrained\n      parameterized: Parameterized\n      recursive1: Recursive1\n      recursive2: Recursive2\n\n      class Foo {\n        simple: Simple\n        constrained: Constrained\n        parameterized: Parameterized\n        recursive1: Recursive1\n        recursive2: Recursive2\n      }\n    \"\"\"\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |public final class Mod {\n        |  public final @NonNull String simple;\n        |\n        |  public final @NonNull String constrained;\n        |\n        |  public final @NonNull List<@NonNull Long> parameterized;\n        |\n        |  public final @NonNull List<@NonNull Long> recursive1;\n        |\n        |  public final @NonNull List<@NonNull String> recursive2;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static final class Foo {\n        |    public final @NonNull String simple;\n        |\n        |    public final @NonNull String constrained;\n        |\n        |    public final @NonNull List<@NonNull Long> parameterized;\n        |\n        |    public final @NonNull List<@NonNull Long> recursive1;\n        |\n        |    public final @NonNull List<@NonNull String> recursive2;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `generic type aliases`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n\n      class Person { name: String }\n\n      typealias List2<E> = List<E>\n      typealias Map2<V, K> = Map<K, V>\n      typealias StringMap<V> = Map<String, V>\n      typealias MMap<X> = Map<X, X>\n\n      res1: List2<Int>\n      res2: List2<List2<String>>\n      res3: Map2<String, Int>\n      res4: StringMap<Duration>\n      res5: MMap<Person?>\n\n      res6: List2\n      res7: Map2\n      res8: StringMap\n      res9: MMap\n\n      class Foo {\n        res1: List2<Int>\n        res2: List2<List2<String>>\n        res3: Map2<String, Int>\n        res4: StringMap<Duration>\n        res5: MMap<Person?>\n\n        res6: List2\n        res7: Map2\n        res8: StringMap\n        res9: MMap\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |public final class Mod {\n        |  public final @NonNull List<@NonNull Long> res1;\n        |\n        |  public final @NonNull List<@NonNull List<@NonNull String>> res2;\n        |\n        |  public final @NonNull Map<@NonNull Long, @NonNull String> res3;\n        |\n        |  public final @NonNull Map<@NonNull String, @NonNull Duration> res4;\n        |\n        |  public final @NonNull Map<Person, Person> res5;\n        |\n        |  public final @NonNull List<@NonNull Object> res6;\n        |\n        |  public final @NonNull Map<@NonNull Object, @NonNull Object> res7;\n        |\n        |  public final @NonNull Map<@NonNull String, @NonNull Object> res8;\n        |\n        |  public final @NonNull Map<@NonNull Object, @NonNull Object> res9;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static final class Foo {\n        |    public final @NonNull List<@NonNull Long> res1;\n        |\n        |    public final @NonNull List<@NonNull List<@NonNull String>> res2;\n        |\n        |    public final @NonNull Map<@NonNull Long, @NonNull String> res3;\n        |\n        |    public final @NonNull Map<@NonNull String, @NonNull Duration> res4;\n        |\n        |    public final @NonNull Map<Person, Person> res5;\n        |\n        |    public final @NonNull List<@NonNull Object> res6;\n        |\n        |    public final @NonNull Map<@NonNull Object, @NonNull Object> res7;\n        |\n        |    public final @NonNull Map<@NonNull String, @NonNull Object> res8;\n        |\n        |    public final @NonNull Map<@NonNull Object, @NonNull Object> res9;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `union of string literals`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n\n      x: \"Pigeon\"|\"Barn Owl\"|\"Parrot\"\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode).compilesSuccessfully().contains(\"public final @NonNull String x;\")\n  }\n\n  @Test\n  fun `other union type`() {\n    val e =\n      assertThrows<JavaCodeGeneratorException> {\n        generateJavaCode(\n          \"\"\"\n        module mod\n\n        x: \"Pigeon\"|Int|\"Parrot\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n    assertThat(e).hasMessageContaining(\"Pkl union types are not supported\")\n  }\n\n  @Test\n  fun `stringy type`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n\n      v1: \"RELEASE\"\n      v2: \"RELEASE\"|String\n      v3: String|\"RELEASE\"\n      v4: \"RELEASE\"|String|\"LATEST\"\n      v5: Version|String|\"LATEST\"\n      v6: (Version|String)|(\"LATEST\"|String)\n      \n      typealias Version = \"RELEASE\"|String|\"LATEST\"\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\"public final @NonNull String v1;\")\n      .contains(\"public final @NonNull String v2;\")\n      .contains(\"public final @NonNull String v3;\")\n      .contains(\"public final @NonNull String v4;\")\n      .contains(\"public final @NonNull String v5;\")\n      .contains(\"public final @NonNull String v6;\")\n  }\n\n  @Test\n  fun `stringy type alias`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n\n      typealias Version1 = \"RELEASE\"|String\n      typealias Version2 = String|\"RELEASE\"\n      typealias Version3 = \"RELEASE\"|String|\"LATEST\"\n      typealias Version4 = Version3|String|\"LATEST\"\n      typealias Version5 = (Version4|String)|(\"LATEST\"|String)\n      typealias Version6 = Version5\n      \n      v1: Version1\n      v2: Version2\n      v3: Version3\n      v4: Version4\n      v5: Version5\n      v6: Version6\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .contains(\"public final @NonNull String v1;\")\n      .contains(\"public final @NonNull String v2;\")\n      .contains(\"public final @NonNull String v3;\")\n      .contains(\"public final @NonNull String v4;\")\n      .contains(\"public final @NonNull String v5;\")\n      .contains(\"public final @NonNull String v6;\")\n  }\n\n  @Test\n  fun `custom constructor parameter annotation`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      name: String\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(paramsAnnotation = \"org.project.MyAnnotation\"),\n      )\n\n    assertThat(javaCode)\n      .contains(\"import org.project.MyAnnotation;\")\n      .contains(\"public Mod(@MyAnnotation(\\\"name\\\") @NonNull String name)\")\n  }\n\n  @Test\n  fun `no constructor parameter annotation`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      name: String\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(paramsAnnotation = null),\n      )\n\n    assertThat(javaCode).contains(\"public Mod(@NonNull String name)\")\n  }\n\n  @Test\n  fun `spring boot config`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      server: Server\n\n      class Server {\n        port: Int\n        urls: Listing<Uri>\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateSpringBootConfig = true),\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |@ConfigurationProperties\n        |public final class Mod {\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public final @NonNull Server server;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  @ConfigurationProperties(\"server\")\n        |  public static final class Server {\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |    public final long port;\n        |\n        |    public final @NonNull List<@NonNull URI> urls;\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"@ConstructorBinding\")\n      .doesNotContain(\"@Named\")\n\n    // not worthwhile to add spring & spring boot dependency just so that this test can compile\n    // their annotations\n    val javaCodeWithoutSpringAnnotations =\n      javaCode.deleteLines { it.contains(\"ConfigurationProperties\") }\n    assertThat(javaCodeWithoutSpringAnnotations).compilesSuccessfully()\n  }\n\n  @Test\n  fun `import module`() {\n    val library =\n      PklModule(\n        \"library\",\n        \"\"\"\n          module library\n\n          class Person { name: String; age: Int }\n          \n          pigeon: Person\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val client =\n      PklModule(\n        \"client\",\n        \"\"\"\n          module client\n          \n          import \"library.pkl\"\n          \n          lib: library\n          \n          parrot: library.Person\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val javaSourceFiles = generateFiles(library, client)\n    assertDoesNotThrow { InMemoryJavaCompiler.compile(javaSourceFiles.mapValues { it.value.text }) }\n\n    val javaClientCode =\n      javaSourceFiles.entries.find { (fileName, _) -> fileName.endsWith(\"Client.java\") }!!.value\n    assertThat(javaClientCode)\n      .contains(\n        \"\"\"\n        |public final class Client {\n        |  public final @NonNull Library lib;\n        |\n        |  public final Library. @NonNull Person parrot;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `extend module`() {\n    val base =\n      PklModule(\n        \"base\",\n        \"\"\"\n          open module base\n        \n          open class Person { name: String }\n        \n          pigeon: Person\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val derived =\n      PklModule(\n        \"derived\",\n        \"\"\"\n          module derived\n          extends \"base.pkl\"\n          \n          class Person2 extends Person { age: Int }\n          \n          person1: Person\n          person2: Person2\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val javaSourceFiles = generateFiles(base, derived)\n    assertDoesNotThrow { InMemoryJavaCompiler.compile(javaSourceFiles.mapValues { it.value.text }) }\n\n    val javaDerivedCode =\n      javaSourceFiles.entries.find { (filename, _) -> filename.endsWith(\"Derived.java\") }!!.value\n    assertThat(javaDerivedCode)\n      .contains(\n        \"\"\"\n        |public final class Derived extends Base {\n        |  public final Base. @NonNull Person person1;\n        |\n        |  public final @NonNull Person2 person2;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `empty module`() {\n    val javaCode = generateJavaCode(\"module mod\")\n    assertThat(javaCode).contains(\"public final class Mod {\")\n  }\n\n  @Test\n  fun `extend module that only contains type aliases`() {\n    val base =\n      PklModule(\n        \"base\",\n        \"\"\"\n          abstract module base\n    \n          typealias Version = \"LATEST\"|String\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val derived =\n      PklModule(\n        \"derived\",\n        \"\"\"\n          module derived\n          \n          extends \"base.pkl\"\n          \n          v: Version = \"1.2.3\"\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val javaSourceFiles = generateFiles(base, derived)\n    assertDoesNotThrow { InMemoryJavaCompiler.compile(javaSourceFiles.mapValues { it.value.text }) }\n\n    val javaDerivedCode =\n      javaSourceFiles.entries.find { (filename, _) -> filename.endsWith(\"Derived.java\") }!!.value\n    assertThat(javaDerivedCode)\n      .contains(\n        \"\"\"\n        |public final class Derived extends Base {\n        |  public final @NonNull String v;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `generated properties files`() {\n    val pklModule =\n      PklModule(\n        \"Mod.pkl\",\n        \"\"\"\n          module org.pkl.Mod\n    \n          foo: Foo\n    \n          bar: Bar\n    \n          class Foo {\n            prop: String\n          }\n    \n          class Bar {\n            prop: Int\n          }\n        \"\"\"\n          .trimIndent(),\n      )\n    val generated = generateFiles(pklModule)\n    val expectedPropertyFile =\n      \"resources/META-INF/org/pkl/config/java/mapper/classes/org.pkl.Mod.properties\"\n    assertThat(generated).containsKey(expectedPropertyFile)\n    val generatedFile = generated[expectedPropertyFile]!!\n    assertThat(generatedFile)\n      .contains(\"org.pkl.config.java.mapper.org.pkl.Mod\\\\#ModuleClass=org.pkl.Mod\")\n      .contains(\"org.pkl.config.java.mapper.org.pkl.Mod\\\\#Foo=org.pkl.Mod\\$Foo\")\n      .contains(\"org.pkl.config.java.mapper.org.pkl.Mod\\\\#Bar=org.pkl.Mod\\$Bar\")\n  }\n\n  @Test\n  fun `generated properties files with normalized java name`() {\n    val pklModule =\n      PklModule(\n        \"mod.pkl\",\n        \"\"\"\n          module my.mod\n    \n          foo: Foo\n    \n          bar: Bar\n    \n          class Foo {\n            prop: String\n          }\n    \n          class Bar {\n            prop: Int\n          }\n        \"\"\"\n          .trimIndent(),\n      )\n    val generated = generateFiles(pklModule)\n    val expectedPropertyFile =\n      \"resources/META-INF/org/pkl/config/java/mapper/classes/my.mod.properties\"\n    assertThat(generated).containsKey(expectedPropertyFile)\n    val generatedFile = generated[expectedPropertyFile]!!\n    assertThat(generatedFile)\n      .contains(\"org.pkl.config.java.mapper.my.mod\\\\#ModuleClass=my.Mod\")\n      .contains(\"org.pkl.config.java.mapper.my.mod\\\\#Foo=my.Mod\\$Foo\")\n      .contains(\"org.pkl.config.java.mapper.my.mod\\\\#Bar=my.Mod\\$Bar\")\n  }\n\n  @Test\n  fun `generates serializable classes`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module mod\n  \n      class BigStruct {\n        boolean: Boolean\n        int: Int\n        float: Float\n        string: String\n        duration: Duration\n        dataSize: DataSize\n        pair: Pair\n        pair2: Pair<String, SmallStruct>\n        coll: Collection\n        coll2: Collection<SmallStruct>\n        list: List\n        list2: List<SmallStruct>\n        set: Set\n        set2: Set<SmallStruct>\n        map: Map\n        map2: Map<String, SmallStruct>\n        container: Mapping\n        container2: Mapping<String, SmallStruct>\n        other: SmallStruct\n        regex: Regex\n        nonNull: NonNull\n        enum: Direction\n      }\n  \n      class SmallStruct {\n        name: String\n      }\n  \n      typealias Direction = \"north\"|\"east\"|\"south\"|\"west\"\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(implementSerializable = true),\n      )\n\n    assertThat(javaCode)\n      .contains(\"implements Serializable\")\n      .contains(\"private static final long serialVersionUID = 0L;\")\n\n    val classes = javaCode.compile()\n\n    val smallStructCtor = classes.getValue(\"Mod\\$SmallStruct\").constructors.first()\n    val smallStruct = smallStructCtor.newInstance(\"pigeon\")\n\n    val enumClass = classes.getValue(\"Mod\\$Direction\")\n    val enumValue = enumClass.enumConstants.first()\n\n    val bigStructCtor = classes.getValue(\"Mod\\$BigStruct\").constructors.first()\n    val bigStruct =\n      bigStructCtor.newInstance(\n        true,\n        42L,\n        42.3,\n        \"string\",\n        Duration(5.0, DurationUnit.MINUTES),\n        DataSize(3.0, DataSizeUnit.GIGABYTES),\n        Pair(1, 2),\n        Pair(\"pigeon\", smallStruct),\n        listOf(1, 2, 3),\n        listOf(smallStruct, smallStruct),\n        listOf(1, 2, 3),\n        listOf(smallStruct, smallStruct),\n        setOf(1, 2, 3),\n        setOf(smallStruct, smallStruct),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to smallStruct, \"two\" to smallStruct),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to smallStruct, \"two\" to smallStruct),\n        smallStruct,\n        Pattern.compile(\"(i?)\\\\w*\"),\n        smallStruct,\n        enumValue,\n      )\n\n    fun confirmSerDe(instance: Any) {\n      var restoredInstance: Any? = null\n\n      assertThatCode {\n          // serialize\n          val baos = ByteArrayOutputStream()\n          val oos = ObjectOutputStream(baos)\n          oos.writeObject(instance)\n          oos.flush()\n\n          // deserialize\n          val bais = ByteArrayInputStream(baos.toByteArray())\n          val ois =\n            object : ObjectInputStream(bais) {\n              override fun resolveClass(desc: ObjectStreamClass?): Class<*> {\n                return Class.forName(desc!!.name, false, instance.javaClass.classLoader)\n              }\n            }\n          restoredInstance = ois.readObject()\n        }\n        .doesNotThrowAnyException()\n\n      assertThat(restoredInstance!!).isEqualTo(instance)\n    }\n\n    confirmSerDe(enumValue)\n    confirmSerDe(smallStruct)\n    confirmSerDe(bigStruct)\n  }\n\n  @Test\n  fun `non-instantiable classes aren't made serializable`() {\n    var javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n      abstract class Foo { str: String }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(implementSerializable = true),\n      )\n\n    assertThat(javaCode).doesNotContain(\"Serializable\")\n\n    javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(implementSerializable = true),\n      )\n\n    assertThat(javaCode).doesNotContain(\"Serializable\")\n  }\n\n  @Test\n  fun `generates serializable module classes`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module Person\n      name: String\n      address: Address\n      class Address { city: String }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(implementSerializable = true),\n      )\n\n    assertThat(javaCode)\n      .contains(\n        \"\"\"\n        |public final class Person implements Serializable {\n        |  private static final long serialVersionUID = 0L;\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  public static final class Address implements Serializable {\n        |    private static final long serialVersionUID = 0L;\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `override property type`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo\n\n      class TheFoo extends Foo {\n        fooProp: String\n      }\n\n      open class OpenClass {\n        prop: Foo\n      }\n\n      class TheClass extends OpenClass {\n        prop: TheFoo\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  public static final class TheClass extends OpenClass {\n        |    public final @NonNull TheFoo prop;\n        |\n        |    public TheClass(@Named(\"prop\") @NonNull TheFoo prop) {\n        |      super(prop);\n        |      this.prop = prop;\n        |    }\n        |\n        |    public TheClass withProp(@NonNull TheFoo prop) {\n        |      return new TheClass(prop);\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `override property type, with getters`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo\n\n      class TheFoo extends Foo {\n        fooProp: String\n      }\n\n      open class OpenClass {\n        prop: Foo\n      }\n\n      class TheClass extends OpenClass {\n        prop: TheFoo\n      }\n    \"\"\"\n          .trimIndent(),\n        JavaCodeGeneratorOptions(generateGetters = true),\n      )\n\n    assertThat(javaCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  public static final class TheClass extends OpenClass {\n        |    private final @NonNull TheFoo prop;\n        |\n        |    public TheClass(@Named(\"prop\") @NonNull TheFoo prop) {\n        |      super(prop);\n        |      this.prop = prop;\n        |    }\n        |\n        |    @Override\n        |    public @NonNull TheFoo getProp() {\n        |      return prop;\n        |    }\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `override names in a standalone module`() {\n    val files =\n      JavaCodeGeneratorOptions(\n          renames = mapOf(\"a.b.c.\" to \"x.y.z.\", \"d.e.f.AnotherModule\" to \"u.v.w.RenamedModule\")\n        )\n        .generateFiles(\n          \"MyModule.pkl\" to\n            \"\"\"\n              module a.b.c.MyModule\n              \n              foo: String = \"abc\"\n            \"\"\"\n              .trimIndent(),\n          \"AnotherModule.pkl\" to\n            \"\"\"\n              module d.e.f.AnotherModule\n              \n              bar: Int = 123\n            \"\"\"\n              .trimIndent(),\n        )\n        .toMutableMap()\n\n    files.validateContents(\n      \"java/x/y/z/MyModule.java\" to listOf(\"package x.y.z;\", \"public final class MyModule {\"),\n      \"$MAPPER_PREFIX/a.b.c.MyModule.properties\" to\n        listOf(\"org.pkl.config.java.mapper.a.b.c.MyModule\\\\#ModuleClass=x.y.z.MyModule\"),\n      // ---\n      \"java/u/v/w/RenamedModule.java\" to\n        listOf(\"package u.v.w;\", \"public final class RenamedModule {\"),\n      \"$MAPPER_PREFIX/d.e.f.AnotherModule.properties\" to\n        listOf(\"org.pkl.config.java.mapper.d.e.f.AnotherModule\\\\#ModuleClass=u.v.w.RenamedModule\"),\n    )\n  }\n\n  @Test\n  fun `override names based on the longest prefix`() {\n    val files =\n      JavaCodeGeneratorOptions(\n          renames = mapOf(\"com.foo.bar.\" to \"x.\", \"com.foo.\" to \"y.\", \"com.\" to \"z.\", \"\" to \"w.\")\n        )\n        .generateFiles(\n          \"com/foo/bar/Module1\" to\n            \"\"\"\n              module com.foo.bar.Module1\n              \n              bar: String\n            \"\"\"\n              .trimIndent(),\n          \"com/Module2\" to\n            \"\"\"\n              module com.Module2\n              \n              com: String\n            \"\"\"\n              .trimIndent(),\n          \"org/baz/Module3\" to\n            \"\"\"\n              module org.baz.Module3\n              \n              baz: String\n            \"\"\"\n              .trimIndent(),\n        )\n\n    files.validateContents(\n      \"java/x/Module1.java\" to listOf(\"package x;\", \"public final class Module1 {\"),\n      \"$MAPPER_PREFIX/com.foo.bar.Module1.properties\" to\n        listOf(\"org.pkl.config.java.mapper.com.foo.bar.Module1\\\\#ModuleClass=x.Module1\"),\n      // ---\n      \"java/z/Module2.java\" to listOf(\"package z;\", \"public final class Module2 {\"),\n      \"$MAPPER_PREFIX/com.Module2.properties\" to\n        listOf(\"org.pkl.config.java.mapper.com.Module2\\\\#ModuleClass=z.Module2\"),\n      // ---\n      \"java/w/org/baz/Module3.java\" to listOf(\"package w.org.baz;\", \"public final class Module3 {\"),\n      \"$MAPPER_PREFIX/org.baz.Module3.properties\" to\n        listOf(\"org.pkl.config.java.mapper.org.baz.Module3\\\\#ModuleClass=w.org.baz.Module3\"),\n    )\n  }\n\n  @Test\n  fun `override names in multiple modules using each other`() {\n    val files =\n      JavaCodeGeneratorOptions(\n          renames =\n            mapOf(\n              \"org.foo.\" to \"com.foo.x.\",\n              \"org.bar.Module2\" to \"org.bar.RenamedModule\",\n              \"org.baz.\" to \"com.baz.a.b.\",\n            )\n        )\n        .generateFiles(\n          \"org/foo/Module1\" to\n            \"\"\"\n              module org.foo.Module1\n              \n              class Person {\n                name: String\n              }\n            \"\"\"\n              .trimIndent(),\n          \"org/bar/Module2\" to\n            \"\"\"\n              module org.bar.Module2\n              \n              import \"../../org/foo/Module1.pkl\"\n\n              class Group {\n                owner: Module1.Person\n                name: String\n              }\n            \"\"\"\n              .trimIndent(),\n          \"org/baz/Module3\" to\n            \"\"\"\n              module org.baz.Module3\n              \n              import \"../../org/bar/Module2.pkl\"\n\n              class Supergroup {\n                owner: Module2.Group\n              }\n            \"\"\"\n              .trimIndent(),\n        )\n\n    files.validateContents(\n      \"java/com/foo/x/Module1.java\" to listOf(\"package com.foo.x;\", \"public final class Module1 {\"),\n      \"$MAPPER_PREFIX/org.foo.Module1.properties\" to\n        listOf(\n          \"org.pkl.config.java.mapper.org.foo.Module1\\\\#ModuleClass=com.foo.x.Module1\",\n          \"org.pkl.config.java.mapper.org.foo.Module1\\\\#Person=com.foo.x.Module1${'$'}Person\",\n        ),\n      // ---\n      \"java/org/bar/RenamedModule.java\" to\n        listOf(\n          \"package org.bar;\",\n          \"import com.foo.x.Module1;\",\n          \"public final class RenamedModule {\",\n          \"public final Module1. @NonNull Person owner;\",\n        ),\n      \"$MAPPER_PREFIX/org.bar.Module2.properties\" to\n        listOf(\n          \"org.pkl.config.java.mapper.org.bar.Module2\\\\#ModuleClass=org.bar.RenamedModule\",\n          \"org.pkl.config.java.mapper.org.bar.Module2\\\\#Group=org.bar.RenamedModule${'$'}Group\",\n        ),\n      // ---\n      \"java/com/baz/a/b/Module3.java\" to\n        listOf(\n          \"package com.baz.a.b;\",\n          \"import org.bar.RenamedModule;\",\n          \"public final class Module3 {\",\n          \"public final RenamedModule. @NonNull Group owner;\",\n        ),\n      \"$MAPPER_PREFIX/org.baz.Module3.properties\" to\n        listOf(\n          \"org.pkl.config.java.mapper.org.baz.Module3\\\\#ModuleClass=com.baz.a.b.Module3\",\n          \"org.pkl.config.java.mapper.org.baz.Module3\\\\#Supergroup=com.baz.a.b.Module3${'$'}Supergroup\",\n        ),\n    )\n  }\n\n  @Test\n  fun `do not capitalize names of renamed classes`() {\n    val files =\n      JavaCodeGeneratorOptions(\n          renames = mapOf(\"a.b.c.MyModule\" to \"x.y.z.renamed_module\", \"d.e.f.\" to \"u.v.w.\")\n        )\n        .generateFiles(\n          \"MyModule.pkl\" to\n            \"\"\"\n              module a.b.c.MyModule\n              \n              foo: String = \"abc\"\n            \"\"\"\n              .trimIndent(),\n          \"lower_module.pkl\" to\n            \"\"\"\n              module d.e.f.lower_module \n              \n              bar: Int = 123\n            \"\"\"\n              .trimIndent(),\n        )\n\n    files.validateContents(\n      \"java/x/y/z/renamed_module.java\" to\n        listOf(\"package x.y.z;\", \"public final class renamed_module {\"),\n      \"$MAPPER_PREFIX/a.b.c.MyModule.properties\" to\n        listOf(\"org.pkl.config.java.mapper.a.b.c.MyModule\\\\#ModuleClass=x.y.z.renamed_module\"),\n      // ---\n      \"java/u/v/w/Lower_module.java\" to\n        listOf(\"package u.v.w;\", \"public final class Lower_module {\"),\n      \"$MAPPER_PREFIX/d.e.f.lower_module.properties\" to\n        listOf(\"org.pkl.config.java.mapper.d.e.f.lower_module\\\\#ModuleClass=u.v.w.Lower_module\"),\n    )\n  }\n\n  @Test\n  fun `equals,hashCode,toString work correctly for class that doesn't declare properties`() {\n    val javaCode =\n      generateJavaCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo {\n        name: String\n      }\n      \n      class Bar extends Foo {}\n    \"\"\"\n          .trimIndent()\n      )\n\n    val classes = javaCode.compile()\n    val fooClass = classes.getValue(\"my.Mod\\$Foo\")\n    val foo1 = fooClass.getDeclaredConstructor(String::class.java).newInstance(\"name1\")\n    val barClass = classes.getValue(\"my.Mod\\$Bar\")\n    val bar1 = barClass.getDeclaredConstructor(String::class.java).newInstance(\"name1\")\n    val anotherBar1 = barClass.getDeclaredConstructor(String::class.java).newInstance(\"name1\")\n    val bar2 = barClass.getDeclaredConstructor(String::class.java).newInstance(\"name2\")\n\n    assertThat(bar1)\n      .isEqualTo(bar1)\n      .isEqualTo(anotherBar1)\n      .isNotEqualTo(bar2)\n      .isNotEqualTo(foo1)\n      .hasSameHashCodeAs(bar1)\n      .hasSameHashCodeAs(anotherBar1)\n    assertThat(bar1.toString())\n      .isEqualTo(\n        \"\"\"\n        Bar {\n          name = name1\n        }\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  private fun Map<String, String>.validateContents(\n    @Suppress(\"RemoveRedundantQualifierName\") vararg assertions: kotlin.Pair<String, List<String>>\n  ) {\n    val files = toMutableMap()\n\n    for ((fileName, lines) in assertions) {\n      assertThat(files).containsKey(fileName)\n      assertThat(files.remove(fileName)).describedAs(\"Contents of $fileName\").contains(lines)\n    }\n\n    assertThat(files).isEmpty()\n  }\n\n  private fun JavaCodeGeneratorOptions.generateFiles(\n    vararg pklModules: PklModule\n  ): Map<String, String> {\n    val pklFiles = pklModules.map { it.writeToDisk(tempDir.resolve(\"pkl/${it.name}.pkl\")) }\n    val evaluator = Evaluator.preconfigured()\n    return pklFiles.fold(mapOf()) { acc, pklFile ->\n      val pklSchema = evaluator.evaluateSchema(path(pklFile))\n      val generator = JavaCodeGenerator(pklSchema, this)\n      acc + generator.output\n    }\n  }\n\n  private fun JavaCodeGeneratorOptions.generateFiles(\n    @Suppress(\"RemoveRedundantQualifierName\") vararg pklModules: kotlin.Pair<String, String>\n  ): Map<String, String> =\n    generateFiles(*pklModules.map { (name, text) -> PklModule(name, text) }.toTypedArray())\n\n  private fun generateFiles(vararg pklModules: PklModule): Map<String, JavaSourceCode> =\n    JavaCodeGeneratorOptions().generateFiles(*pklModules).mapValues { JavaSourceCode(it.value) }\n\n  private fun instantiateOtherAndPropertyTypes(): kotlin.Pair<Any, Any> {\n    val otherCtor = propertyTypesClasses.getValue(\"my.Mod\\$Other\").constructors.first()\n    val other = otherCtor.newInstance(\"pigeon\")\n\n    val enumClass = propertyTypesClasses.getValue(\"my.Mod\\$Direction\")\n    val enumValue = enumClass.enumConstants.first()\n\n    val propertyTypesCtor =\n      propertyTypesClasses.getValue(\"my.Mod\\$PropertyTypes\").constructors.first()\n    val propertyTypes =\n      propertyTypesCtor.newInstance(\n        true,\n        42,\n        42.3,\n        \"string\",\n        Duration(5.0, DurationUnit.MINUTES),\n        DurationUnit.MINUTES,\n        DataSize(3.0, DataSizeUnit.GIGABYTES),\n        DataSizeUnit.GIGABYTES,\n        \"idea\",\n        (null as String?),\n        Pair(1, 2),\n        Pair(\"pigeon\", other),\n        listOf(1, 2, 3),\n        listOf(other, other),\n        listOf(1, 2, 3),\n        listOf(other, other),\n        setOf(1, 2, 3),\n        setOf(other, other),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to other, \"two\" to other),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to other, \"two\" to other),\n        other,\n        Pattern.compile(\"(i?)\\\\w*\"),\n        other,\n        other,\n        enumValue,\n        byteArrayOf(1, 2, 3, 4),\n      )\n\n    return other to propertyTypes\n  }\n\n  private fun assertThat(actual: JavaSourceCode): JavaSourceCodeAssert =\n    JavaSourceCodeAssert(actual)\n\n  private data class JavaSourceCode(val text: String) {\n    fun compile(): Map<String, Class<*>> =\n      InMemoryJavaCompiler.compile(mapOf(\"/org/Mod.java\" to text))\n\n    fun deleteLines(predicate: (String) -> Boolean): JavaSourceCode =\n      JavaSourceCode(text.lines().filterNot(predicate).joinToString(\"\\n\"))\n  }\n\n  private class JavaSourceCodeAssert(actual: JavaSourceCode) :\n    AbstractAssert<JavaSourceCodeAssert, JavaSourceCode>(actual, JavaSourceCodeAssert::class.java) {\n    fun contains(expected: String): JavaSourceCodeAssert {\n      if (!actual.text.contains(expected)) {\n        // check for equality to get better error output (IDE diff dialog)\n        assertThat(actual.text).isEqualTo(expected)\n      }\n      return this\n    }\n\n    fun doesNotContain(expected: String): JavaSourceCodeAssert {\n      assertThat(actual.text).doesNotContain(expected)\n      return this\n    }\n\n    fun compilesSuccessfully(): JavaSourceCodeAssert {\n      assertThatCode { actual.compile() }.doesNotThrowAnyException()\n      return this\n    }\n\n    fun isEqualTo(expected: String): JavaSourceCodeAssert {\n      assertThat(actual.text).isEqualTo(expected)\n      return this\n    }\n\n    fun isEqualToResourceFile(fileName: String): JavaSourceCodeAssert {\n      isEqualTo(IoUtils.readClassPathResourceAsString(javaClass, fileName))\n      return this\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/PklModule.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.java\n\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.commons.writeString\n\ndata class PklModule(val name: String, val content: String) {\n  fun writeToDisk(path: Path): Path {\n    return path.createParentDirectories().writeString(content)\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/resources/org/pkl/codegen/java/GenerateGetters.jva",
    "content": "package my;\n\nimport java.lang.Object;\nimport java.lang.Override;\nimport java.lang.String;\nimport java.lang.StringBuilder;\nimport java.util.Objects;\nimport org.pkl.config.java.mapper.Named;\nimport org.pkl.config.java.mapper.NonNull;\nimport org.pkl.core.DataSize;\nimport org.pkl.core.Duration;\n\npublic final class Mod {\n  private Mod() {\n  }\n\n  private static void appendProperty(StringBuilder builder, String name, Object value) {\n    builder.append(\"\\n  \").append(name).append(\" = \");\n    String[] lines = Objects.toString(value).split(\"\\n\");\n    builder.append(lines[0]);\n    for (int i = 1; i < lines.length; i++) {\n      builder.append(\"\\n  \").append(lines[i]);\n    }\n  }\n\n  public static final class GenerateGetters {\n    private final boolean urgent;\n\n    private final @NonNull String url;\n\n    private final @NonNull DataSize diskSize;\n\n    private final @NonNull Duration ETA;\n\n    private final @NonNull String _package;\n\n    public GenerateGetters(@Named(\"urgent\") boolean urgent, @Named(\"url\") @NonNull String url,\n        @Named(\"diskSize\") @NonNull DataSize diskSize, @Named(\"ETA\") @NonNull Duration ETA,\n        @Named(\"package\") @NonNull String _package) {\n      this.urgent = urgent;\n      this.url = url;\n      this.diskSize = diskSize;\n      this.ETA = ETA;\n      this._package = _package;\n    }\n\n    public boolean isUrgent() {\n      return urgent;\n    }\n\n    public GenerateGetters withUrgent(boolean urgent) {\n      return new GenerateGetters(urgent, url, diskSize, ETA, _package);\n    }\n\n    public @NonNull String getUrl() {\n      return url;\n    }\n\n    public GenerateGetters withUrl(@NonNull String url) {\n      return new GenerateGetters(urgent, url, diskSize, ETA, _package);\n    }\n\n    public @NonNull DataSize getDiskSize() {\n      return diskSize;\n    }\n\n    public GenerateGetters withDiskSize(@NonNull DataSize diskSize) {\n      return new GenerateGetters(urgent, url, diskSize, ETA, _package);\n    }\n\n    public @NonNull Duration getETA() {\n      return ETA;\n    }\n\n    public GenerateGetters withETA(@NonNull Duration ETA) {\n      return new GenerateGetters(urgent, url, diskSize, ETA, _package);\n    }\n\n    public @NonNull String getPackage() {\n      return _package;\n    }\n\n    public GenerateGetters withPackage(@NonNull String _package) {\n      return new GenerateGetters(urgent, url, diskSize, ETA, _package);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      GenerateGetters other = (GenerateGetters) obj;\n      if (!Objects.equals(this.urgent, other.urgent)) return false;\n      if (!Objects.equals(this.url, other.url)) return false;\n      if (!Objects.equals(this.diskSize, other.diskSize)) return false;\n      if (!Objects.equals(this.ETA, other.ETA)) return false;\n      if (!Objects.equals(this._package, other._package)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.urgent);\n      result = 31 * result + Objects.hashCode(this.url);\n      result = 31 * result + Objects.hashCode(this.diskSize);\n      result = 31 * result + Objects.hashCode(this.ETA);\n      result = 31 * result + Objects.hashCode(this._package);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(300);\n      builder.append(GenerateGetters.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"urgent\", this.urgent);\n      appendProperty(builder, \"url\", this.url);\n      appendProperty(builder, \"diskSize\", this.diskSize);\n      appendProperty(builder, \"ETA\", this.ETA);\n      appendProperty(builder, \"_package\", this._package);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/resources/org/pkl/codegen/java/GeneratedAnnotation.jva",
    "content": "package my;\n\nimport java.lang.Object;\nimport java.lang.Override;\nimport java.lang.String;\nimport java.lang.StringBuilder;\nimport java.util.Objects;\nimport org.pkl.config.java.Generated;\nimport org.pkl.config.java.mapper.Named;\n\n@Generated\npublic final class Mod {\n  private Mod() {\n  }\n\n  private static void appendProperty(StringBuilder builder, String name, Object value) {\n    builder.append(\"\\n  \").append(name).append(\" = \");\n    String[] lines = Objects.toString(value).split(\"\\n\");\n    builder.append(lines[0]);\n    for (int i = 1; i < lines.length; i++) {\n      builder.append(\"\\n  \").append(lines[i]);\n    }\n  }\n\n  @Generated\n  public static final class GeneratedAnnotation {\n    public final boolean test;\n\n    public GeneratedAnnotation(@Named(\"test\") boolean test) {\n      this.test = test;\n    }\n\n    public GeneratedAnnotation withTest(boolean test) {\n      return new GeneratedAnnotation(test);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      GeneratedAnnotation other = (GeneratedAnnotation) obj;\n      if (!Objects.equals(this.test, other.test)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.test);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(100);\n      builder.append(GeneratedAnnotation.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"test\", this.test);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/resources/org/pkl/codegen/java/Inheritance.jva",
    "content": "package my;\n\nimport java.lang.Object;\nimport java.lang.Override;\nimport java.lang.String;\nimport java.lang.StringBuilder;\nimport java.util.Objects;\nimport org.pkl.config.java.mapper.Named;\nimport org.pkl.config.java.mapper.NonNull;\nimport org.pkl.core.Duration;\n\npublic final class Mod {\n  private Mod() {\n  }\n\n  private static void appendProperty(StringBuilder builder, String name, Object value) {\n    builder.append(\"\\n  \").append(name).append(\" = \");\n    String[] lines = Objects.toString(value).split(\"\\n\");\n    builder.append(lines[0]);\n    for (int i = 1; i < lines.length; i++) {\n      builder.append(\"\\n  \").append(lines[i]);\n    }\n  }\n\n  public abstract static class Foo {\n    protected final long one;\n\n    protected Foo(@Named(\"one\") long one) {\n      this.one = one;\n    }\n\n    public long getOne() {\n      return one;\n    }\n  }\n\n  public static class None extends Foo {\n    public None(@Named(\"one\") long one) {\n      super(one);\n    }\n\n    public None withOne(long one) {\n      return new None(one);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      None other = (None) obj;\n      if (!Objects.equals(this.one, other.one)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.one);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(100);\n      builder.append(None.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"one\", this.one);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n\n  public static class Bar extends None {\n    protected final String two;\n\n    public Bar(@Named(\"one\") long one, @Named(\"two\") String two) {\n      super(one);\n      this.two = two;\n    }\n\n    public Bar withOne(long one) {\n      return new Bar(one, two);\n    }\n\n    public String getTwo() {\n      return two;\n    }\n\n    public Bar withTwo(String two) {\n      return new Bar(one, two);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      Bar other = (Bar) obj;\n      if (!Objects.equals(this.one, other.one)) return false;\n      if (!Objects.equals(this.two, other.two)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.one);\n      result = 31 * result + Objects.hashCode(this.two);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(150);\n      builder.append(Bar.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"one\", this.one);\n      appendProperty(builder, \"two\", this.two);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n\n  public static final class Baz extends Bar {\n    private final @NonNull Duration three;\n\n    public Baz(@Named(\"one\") long one, @Named(\"two\") String two,\n        @Named(\"three\") @NonNull Duration three) {\n      super(one, two);\n      this.three = three;\n    }\n\n    public Baz withOne(long one) {\n      return new Baz(one, two, three);\n    }\n\n    public Baz withTwo(String two) {\n      return new Baz(one, two, three);\n    }\n\n    public @NonNull Duration getThree() {\n      return three;\n    }\n\n    public Baz withThree(@NonNull Duration three) {\n      return new Baz(one, two, three);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      Baz other = (Baz) obj;\n      if (!Objects.equals(this.one, other.one)) return false;\n      if (!Objects.equals(this.two, other.two)) return false;\n      if (!Objects.equals(this.three, other.three)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.one);\n      result = 31 * result + Objects.hashCode(this.two);\n      result = 31 * result + Objects.hashCode(this.three);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(200);\n      builder.append(Baz.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"one\", this.one);\n      appendProperty(builder, \"two\", this.two);\n      appendProperty(builder, \"three\", this.three);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/resources/org/pkl/codegen/java/Javadoc.jva",
    "content": "package my;\n\nimport java.lang.Object;\nimport java.lang.Override;\nimport java.lang.String;\nimport java.lang.StringBuilder;\nimport java.util.Objects;\nimport org.pkl.config.java.mapper.Named;\nimport org.pkl.config.java.mapper.NonNull;\n\n/**\n * module comment.\n * *emphasized* `code`.\n */\npublic final class Mod {\n  /**\n   * module property comment.\n   * *emphasized* `code`.\n   */\n  public final @NonNull Person pigeon;\n\n  public Mod(@Named(\"pigeon\") @NonNull Person pigeon) {\n    this.pigeon = pigeon;\n  }\n\n  public Mod withPigeon(@NonNull Person pigeon) {\n    return new Mod(pigeon);\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (obj == null) return false;\n    if (this.getClass() != obj.getClass()) return false;\n    Mod other = (Mod) obj;\n    if (!Objects.equals(this.pigeon, other.pigeon)) return false;\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int result = 1;\n    result = 31 * result + Objects.hashCode(this.pigeon);\n    return result;\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder builder = new StringBuilder(100);\n    builder.append(Mod.class.getSimpleName()).append(\" {\");\n    appendProperty(builder, \"pigeon\", this.pigeon);\n    builder.append(\"\\n}\");\n    return builder.toString();\n  }\n\n  private static void appendProperty(StringBuilder builder, String name, Object value) {\n    builder.append(\"\\n  \").append(name).append(\" = \");\n    String[] lines = Objects.toString(value).split(\"\\n\");\n    builder.append(lines[0]);\n    for (int i = 1; i < lines.length; i++) {\n      builder.append(\"\\n  \").append(lines[i]);\n    }\n  }\n\n  /**\n   * class comment.\n   * *emphasized* `code`.\n   */\n  public static final class Person {\n    /**\n     * class property comment.\n     * *emphasized* `code`.\n     */\n    public final @NonNull String name;\n\n    public Person(@Named(\"name\") @NonNull String name) {\n      this.name = name;\n    }\n\n    public Person withName(@NonNull String name) {\n      return new Person(name);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      Person other = (Person) obj;\n      if (!Objects.equals(this.name, other.name)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.name);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(100);\n      builder.append(Person.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"name\", this.name);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-java/src/test/resources/org/pkl/codegen/java/PropertyTypes.jva",
    "content": "package my;\n\nimport java.lang.Object;\nimport java.lang.Override;\nimport java.lang.String;\nimport java.lang.StringBuilder;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.pkl.config.java.mapper.Named;\nimport org.pkl.config.java.mapper.NonNull;\nimport org.pkl.core.DataSize;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.Duration;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.Pair;\n\npublic final class Mod {\n  private Mod() {\n  }\n\n  private static void appendProperty(StringBuilder builder, String name, Object value) {\n    builder.append(\"\\n  \").append(name).append(\" = \");\n    String[] lines = Objects.toString(value).split(\"\\n\");\n    builder.append(lines[0]);\n    for (int i = 1; i < lines.length; i++) {\n      builder.append(\"\\n  \").append(lines[i]);\n    }\n  }\n\n  public static final class PropertyTypes {\n    public final boolean _boolean;\n\n    public final long _int;\n\n    public final double _float;\n\n    public final @NonNull String string;\n\n    public final @NonNull Duration duration;\n\n    public final @NonNull DurationUnit durationUnit;\n\n    public final @NonNull DataSize dataSize;\n\n    public final @NonNull DataSizeUnit dataSizeUnit;\n\n    public final String nullable;\n\n    public final String nullable2;\n\n    public final @NonNull Pair<Object, Object> pair;\n\n    public final @NonNull Pair<@NonNull String, @NonNull Other> pair2;\n\n    public final @NonNull Collection<Object> coll;\n\n    public final @NonNull Collection<@NonNull Other> coll2;\n\n    public final @NonNull List<Object> list;\n\n    public final @NonNull List<@NonNull Other> list2;\n\n    public final @NonNull Set<Object> set;\n\n    public final @NonNull Set<@NonNull Other> set2;\n\n    public final @NonNull Map<Object, Object> map;\n\n    public final @NonNull Map<@NonNull String, @NonNull Other> map2;\n\n    public final @NonNull Map<Object, Object> container;\n\n    public final @NonNull Map<@NonNull String, @NonNull Other> container2;\n\n    public final @NonNull Other other;\n\n    public final @NonNull Pattern regex;\n\n    public final Object any;\n\n    public final @NonNull Object nonNull;\n\n    public final @NonNull Direction _enum;\n\n    public final byte[] bytes;\n\n    public PropertyTypes(@Named(\"boolean\") boolean _boolean, @Named(\"int\") long _int,\n        @Named(\"float\") double _float, @Named(\"string\") @NonNull String string,\n        @Named(\"duration\") @NonNull Duration duration,\n        @Named(\"durationUnit\") @NonNull DurationUnit durationUnit,\n        @Named(\"dataSize\") @NonNull DataSize dataSize,\n        @Named(\"dataSizeUnit\") @NonNull DataSizeUnit dataSizeUnit,\n        @Named(\"nullable\") String nullable, @Named(\"nullable2\") String nullable2,\n        @Named(\"pair\") @NonNull Pair<Object, Object> pair,\n        @Named(\"pair2\") @NonNull Pair<@NonNull String, @NonNull Other> pair2,\n        @Named(\"coll\") @NonNull Collection<Object> coll,\n        @Named(\"coll2\") @NonNull Collection<@NonNull Other> coll2,\n        @Named(\"list\") @NonNull List<Object> list,\n        @Named(\"list2\") @NonNull List<@NonNull Other> list2, @Named(\"set\") @NonNull Set<Object> set,\n        @Named(\"set2\") @NonNull Set<@NonNull Other> set2,\n        @Named(\"map\") @NonNull Map<Object, Object> map,\n        @Named(\"map2\") @NonNull Map<@NonNull String, @NonNull Other> map2,\n        @Named(\"container\") @NonNull Map<Object, Object> container,\n        @Named(\"container2\") @NonNull Map<@NonNull String, @NonNull Other> container2,\n        @Named(\"other\") @NonNull Other other, @Named(\"regex\") @NonNull Pattern regex,\n        @Named(\"any\") Object any, @Named(\"nonNull\") @NonNull Object nonNull,\n        @Named(\"enum\") @NonNull Direction _enum, @Named(\"bytes\") byte[] bytes) {\n      this._boolean = _boolean;\n      this._int = _int;\n      this._float = _float;\n      this.string = string;\n      this.duration = duration;\n      this.durationUnit = durationUnit;\n      this.dataSize = dataSize;\n      this.dataSizeUnit = dataSizeUnit;\n      this.nullable = nullable;\n      this.nullable2 = nullable2;\n      this.pair = pair;\n      this.pair2 = pair2;\n      this.coll = coll;\n      this.coll2 = coll2;\n      this.list = list;\n      this.list2 = list2;\n      this.set = set;\n      this.set2 = set2;\n      this.map = map;\n      this.map2 = map2;\n      this.container = container;\n      this.container2 = container2;\n      this.other = other;\n      this.regex = regex;\n      this.any = any;\n      this.nonNull = nonNull;\n      this._enum = _enum;\n      this.bytes = bytes;\n    }\n\n    public PropertyTypes withBoolean(boolean _boolean) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withInt(long _int) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withFloat(double _float) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withString(@NonNull String string) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withDuration(@NonNull Duration duration) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withDurationUnit(@NonNull DurationUnit durationUnit) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withDataSize(@NonNull DataSize dataSize) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withDataSizeUnit(@NonNull DataSizeUnit dataSizeUnit) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withNullable(String nullable) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withNullable2(String nullable2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withPair(@NonNull Pair<Object, Object> pair) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withPair2(@NonNull Pair<@NonNull String, @NonNull Other> pair2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withColl(@NonNull Collection<Object> coll) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withColl2(@NonNull Collection<@NonNull Other> coll2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withList(@NonNull List<Object> list) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withList2(@NonNull List<@NonNull Other> list2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withSet(@NonNull Set<Object> set) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withSet2(@NonNull Set<@NonNull Other> set2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withMap(@NonNull Map<Object, Object> map) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withMap2(@NonNull Map<@NonNull String, @NonNull Other> map2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withContainer(@NonNull Map<Object, Object> container) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withContainer2(@NonNull Map<@NonNull String, @NonNull Other> container2) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withOther(@NonNull Other other) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withRegex(@NonNull Pattern regex) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withAny(Object any) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withNonNull(@NonNull Object nonNull) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withEnum(@NonNull Direction _enum) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    public PropertyTypes withBytes(byte[] bytes) {\n      return new PropertyTypes(_boolean, _int, _float, string, duration, durationUnit, dataSize, dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map, map2, container, container2, other, regex, any, nonNull, _enum, bytes);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      PropertyTypes other = (PropertyTypes) obj;\n      if (!Objects.equals(this._boolean, other._boolean)) return false;\n      if (!Objects.equals(this._int, other._int)) return false;\n      if (!Objects.equals(this._float, other._float)) return false;\n      if (!Objects.equals(this.string, other.string)) return false;\n      if (!Objects.equals(this.duration, other.duration)) return false;\n      if (!Objects.equals(this.durationUnit, other.durationUnit)) return false;\n      if (!Objects.equals(this.dataSize, other.dataSize)) return false;\n      if (!Objects.equals(this.dataSizeUnit, other.dataSizeUnit)) return false;\n      if (!Objects.equals(this.nullable, other.nullable)) return false;\n      if (!Objects.equals(this.nullable2, other.nullable2)) return false;\n      if (!Objects.equals(this.pair, other.pair)) return false;\n      if (!Objects.equals(this.pair2, other.pair2)) return false;\n      if (!Objects.equals(this.coll, other.coll)) return false;\n      if (!Objects.equals(this.coll2, other.coll2)) return false;\n      if (!Objects.equals(this.list, other.list)) return false;\n      if (!Objects.equals(this.list2, other.list2)) return false;\n      if (!Objects.equals(this.set, other.set)) return false;\n      if (!Objects.equals(this.set2, other.set2)) return false;\n      if (!Objects.equals(this.map, other.map)) return false;\n      if (!Objects.equals(this.map2, other.map2)) return false;\n      if (!Objects.equals(this.container, other.container)) return false;\n      if (!Objects.equals(this.container2, other.container2)) return false;\n      if (!Objects.equals(this.other, other.other)) return false;\n      if (!Objects.equals(this.regex.pattern(), other.regex.pattern())) return false;\n      if (!Objects.equals(this.any, other.any)) return false;\n      if (!Objects.equals(this.nonNull, other.nonNull)) return false;\n      if (!Objects.equals(this._enum, other._enum)) return false;\n      if (!Objects.equals(this.bytes, other.bytes)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this._boolean);\n      result = 31 * result + Objects.hashCode(this._int);\n      result = 31 * result + Objects.hashCode(this._float);\n      result = 31 * result + Objects.hashCode(this.string);\n      result = 31 * result + Objects.hashCode(this.duration);\n      result = 31 * result + Objects.hashCode(this.durationUnit);\n      result = 31 * result + Objects.hashCode(this.dataSize);\n      result = 31 * result + Objects.hashCode(this.dataSizeUnit);\n      result = 31 * result + Objects.hashCode(this.nullable);\n      result = 31 * result + Objects.hashCode(this.nullable2);\n      result = 31 * result + Objects.hashCode(this.pair);\n      result = 31 * result + Objects.hashCode(this.pair2);\n      result = 31 * result + Objects.hashCode(this.coll);\n      result = 31 * result + Objects.hashCode(this.coll2);\n      result = 31 * result + Objects.hashCode(this.list);\n      result = 31 * result + Objects.hashCode(this.list2);\n      result = 31 * result + Objects.hashCode(this.set);\n      result = 31 * result + Objects.hashCode(this.set2);\n      result = 31 * result + Objects.hashCode(this.map);\n      result = 31 * result + Objects.hashCode(this.map2);\n      result = 31 * result + Objects.hashCode(this.container);\n      result = 31 * result + Objects.hashCode(this.container2);\n      result = 31 * result + Objects.hashCode(this.other);\n      result = 31 * result + Objects.hashCode(this.regex.pattern());\n      result = 31 * result + Objects.hashCode(this.any);\n      result = 31 * result + Objects.hashCode(this.nonNull);\n      result = 31 * result + Objects.hashCode(this._enum);\n      result = 31 * result + Objects.hashCode(this.bytes);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(1450);\n      builder.append(PropertyTypes.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"_boolean\", this._boolean);\n      appendProperty(builder, \"_int\", this._int);\n      appendProperty(builder, \"_float\", this._float);\n      appendProperty(builder, \"string\", this.string);\n      appendProperty(builder, \"duration\", this.duration);\n      appendProperty(builder, \"durationUnit\", this.durationUnit);\n      appendProperty(builder, \"dataSize\", this.dataSize);\n      appendProperty(builder, \"dataSizeUnit\", this.dataSizeUnit);\n      appendProperty(builder, \"nullable\", this.nullable);\n      appendProperty(builder, \"nullable2\", this.nullable2);\n      appendProperty(builder, \"pair\", this.pair);\n      appendProperty(builder, \"pair2\", this.pair2);\n      appendProperty(builder, \"coll\", this.coll);\n      appendProperty(builder, \"coll2\", this.coll2);\n      appendProperty(builder, \"list\", this.list);\n      appendProperty(builder, \"list2\", this.list2);\n      appendProperty(builder, \"set\", this.set);\n      appendProperty(builder, \"set2\", this.set2);\n      appendProperty(builder, \"map\", this.map);\n      appendProperty(builder, \"map2\", this.map2);\n      appendProperty(builder, \"container\", this.container);\n      appendProperty(builder, \"container2\", this.container2);\n      appendProperty(builder, \"other\", this.other);\n      appendProperty(builder, \"regex\", this.regex);\n      appendProperty(builder, \"any\", this.any);\n      appendProperty(builder, \"nonNull\", this.nonNull);\n      appendProperty(builder, \"_enum\", this._enum);\n      appendProperty(builder, \"bytes\", Arrays.toString(this.bytes));\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n\n  public static final class Other {\n    public final @NonNull String name;\n\n    public Other(@Named(\"name\") @NonNull String name) {\n      this.name = name;\n    }\n\n    public Other withName(@NonNull String name) {\n      return new Other(name);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n      if (this == obj) return true;\n      if (obj == null) return false;\n      if (this.getClass() != obj.getClass()) return false;\n      Other other = (Other) obj;\n      if (!Objects.equals(this.name, other.name)) return false;\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int result = 1;\n      result = 31 * result + Objects.hashCode(this.name);\n      return result;\n    }\n\n    @Override\n    public String toString() {\n      StringBuilder builder = new StringBuilder(100);\n      builder.append(Other.class.getSimpleName()).append(\" {\");\n      appendProperty(builder, \"name\", this.name);\n      builder.append(\"\\n}\");\n      return builder.toString();\n    }\n  }\n\n  public enum Direction {\n    NORTH(\"north\"),\n\n    EAST(\"east\"),\n\n    SOUTH(\"south\"),\n\n    WEST(\"west\");\n\n    private String value;\n\n    private Direction(String value) {\n      this.value = value;\n    }\n\n    @Override\n    public String toString() {\n      return this.value;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.squareup:kotlinpoet:1.6.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=runtimeClasspath,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-scripting-jsr223:2.2.20=testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-scripting-jvm-host:2.2.20=testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=runtimeClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=runtimeClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=runtimeClasspath,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,shadow,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-codegen-kotlin/pkl-codegen-kotlin.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n  pklJavaExecutable\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-codegen-kotlin\")\n        description.set(\n          \"\"\"\n          Kotlin source code generator that generates corresponding Kotlin classes for Pkl classes,\n          simplifying consumption of Pkl configuration as statically typed Kotlin objects.\n        \"\"\"\n            .trimIndent()\n        )\n      }\n    }\n  }\n}\n\ntasks.jar { manifest { attributes += mapOf(\"Main-Class\" to \"org.pkl.codegen.kotlin.Main\") } }\n\ndependencies {\n  implementation(projects.pklCommons)\n  api(projects.pklCommonsCli)\n  api(projects.pklCore)\n\n  implementation(libs.kotlinPoet) {\n    exclude(group = \"org.jetbrains.kotlin\", module = \"kotlin-reflect\")\n    exclude(group = \"org.jetbrains.kotlin\", module = \"kotlin-stdlib-jdk8\")\n  }\n  implementation(libs.kotlinReflect)\n\n  testImplementation(projects.pklConfigKotlin)\n  testImplementation(projects.pklCommonsTest)\n  testRuntimeOnly(libs.kotlinScripting)\n}\n\nexecutable {\n  javaName = \"pkl-codegen-kotlin\"\n  documentationName = \"Pkl Codegen Kotlin\"\n  javaPublicationName = \"pkl-cli-codegen-kotlin\"\n  mainClass = \"org.pkl.codegen.kotlin.Main\"\n  website = \"https://pkl-lang.org/main/current/kotlin-binding/codegen.html\"\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/CliKotlinCodeGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.kotlin\n\nimport java.io.IOException\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.writeString\nimport org.pkl.core.Closeables\nimport org.pkl.core.ModuleSource\n\n/** API for the Kotlin code generator CLI. */\nclass CliKotlinCodeGenerator(private val options: CliKotlinCodeGeneratorOptions) :\n  CliCommand(options.base) {\n\n  override fun doRun() {\n    val builder = evaluatorBuilder()\n\n    try {\n      builder.build().use { evaluator ->\n        for (moduleUri in resolvedSourceModules) {\n          val schema = evaluator.evaluateSchema(ModuleSource.uri(moduleUri))\n          val codeGenerator = KotlinCodeGenerator(schema, options.toKotlinCodeGeneratorOptions())\n          try {\n            for ((fileName, fileContents) in codeGenerator.output) {\n              val outputFile = options.outputDir.resolve(fileName)\n              try {\n                outputFile.createParentDirectories().writeString(fileContents)\n              } catch (e: IOException) {\n                throw CliException(\"I/O error writing file `$outputFile`.\\nCause: ${e.message}\")\n              }\n            }\n          } catch (e: KotlinCodeGeneratorException) {\n            throw CliException(e.message!!)\n          }\n        }\n      }\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/CliKotlinCodeGeneratorOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.kotlin\n\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\n\n/** Configuration options for [CliKotlinCodeGenerator]. */\ndata class CliKotlinCodeGeneratorOptions(\n  /** Base options shared between CLI commands. */\n  val base: CliBaseOptions,\n\n  /** The directory where generated source code is placed. */\n  val outputDir: Path,\n\n  /** The characters to use for indenting generated source code. */\n  val indent: String = \"  \",\n\n  /** Whether to preserve Pkl doc comments by generating corresponding KDoc comments. */\n  val generateKdoc: Boolean = false,\n\n  /** Whether to generate config classes for use with Spring Boot. */\n  val generateSpringBootConfig: Boolean = false,\n\n  /** Whether generated classes should implement [java.io.Serializable]. */\n  val implementSerializable: Boolean = false,\n\n  /** Whether to add the `@Generated` annotation to types */\n  val addGeneratedAnnotation: Boolean = false,\n\n  /**\n   * A rename mapping for class names.\n   *\n   * When you need to have Kotlin class or package names different from the default names derived\n   * from Pkl module names, you can define a rename mapping, where the key is a prefix of the\n   * original Pkl module name, and the value is the desired replacement.\n   */\n  val renames: Map<String, String> = emptyMap(),\n) {\n  @Suppress(\"DeprecatedCallableAddReplaceWith\")\n  @Deprecated(\"deprecated without replacement\")\n  fun toKotlinCodegenOptions(): KotlinCodeGeneratorOptions = toKotlinCodeGeneratorOptions()\n\n  internal fun toKotlinCodeGeneratorOptions(): KotlinCodeGeneratorOptions =\n    KotlinCodeGeneratorOptions(\n      indent,\n      generateKdoc,\n      generateSpringBootConfig,\n      implementSerializable,\n      addGeneratedAnnotation,\n      renames,\n    )\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/KotlinCodeGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:Suppress(\"unused\")\n\npackage org.pkl.codegen.kotlin\n\nimport com.squareup.kotlinpoet.*\nimport com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy\nimport java.io.StringWriter\nimport java.util.*\nimport org.pkl.commons.NameMapper\nimport org.pkl.core.*\nimport org.pkl.core.util.CodeGeneratorUtils\nimport org.pkl.core.util.IoUtils\n\n@Deprecated(\"renamed to KotlinCodeGeneratorOptions\", ReplaceWith(\"KotlinCodeGeneratorOptions\"))\ntypealias KotlinCodegenOptions = KotlinCodeGeneratorOptions\n\ndata class KotlinCodeGeneratorOptions(\n  /** The characters to use for indenting generated Kotlin code. */\n  val indent: String = \"  \",\n\n  /** Whether to preserve Pkl doc comments by generating corresponding KDoc comments. */\n  val generateKdoc: Boolean = false,\n\n  /** Whether to generate config classes for use with Spring Boot. */\n  val generateSpringBootConfig: Boolean = false,\n\n  /** Whether to generate classes that implement [java.io.Serializable]. */\n  val implementSerializable: Boolean = false,\n\n  /** Whether to add the `@Generated` to generated types. */\n  val addGeneratedAnnotation: Boolean = false,\n\n  /**\n   * A mapping from Pkl module name prefixes to their replacements.\n   *\n   * Can be used when the class or package name in the generated source code should be different\n   * from the corresponding name derived from the Pkl module declaration .\n   */\n  val renames: Map<String, String> = emptyMap(),\n)\n\nclass KotlinCodeGeneratorException(message: String) : RuntimeException(message)\n\n/** Entrypoint for the Kotlin code generator API. */\nclass KotlinCodeGenerator(\n  /** The schema for the module to generate */\n  private val moduleSchema: ModuleSchema,\n\n  /** The options to use for the code generator */\n  private val options: KotlinCodeGeneratorOptions,\n) {\n  companion object {\n    private val STRING = String::class.asClassName()\n    private val ANY_NULL = ANY.copy(nullable = true)\n    private val NOTHING = Nothing::class.asClassName()\n    @Suppress(\"RemoveRedundantQualifierName\")\n    private val KOTLIN_PAIR = kotlin.Pair::class.asClassName()\n    private val COLLECTION = Collection::class.asClassName()\n    private val LIST = List::class.asClassName()\n    private val SET = Set::class.asClassName()\n    private val MAP = Map::class.asClassName()\n    private val DURATION = Duration::class.asClassName()\n    private val DURATION_UNIT = DurationUnit::class.asClassName()\n    private val DATA_SIZE = DataSize::class.asClassName()\n    private val DATA_SIZE_UNIT = DataSizeUnit::class.asClassName()\n    private val PMODULE = PModule::class.asClassName()\n    private val PCLASS = PClass::class.asClassName()\n    private val REGEX = Regex::class.asClassName()\n    private val URI = java.net.URI::class.asClassName()\n    private val VERSION = Version::class.asClassName()\n\n    private const val PROPERTY_PREFIX: String = \"org.pkl.config.java.mapper.\"\n  }\n\n  val output: Map<String, String>\n    get() {\n      return mapOf(kotlinFileName to kotlinFile, propertyFileName to propertiesFile)\n    }\n\n  private val propertyFileName: String\n    get() =\n      \"resources/META-INF/org/pkl/config/java/mapper/classes/${IoUtils.encodePath(moduleSchema.moduleName)}.properties\"\n\n  private val propertiesFile: String\n    get() {\n      val props = Properties()\n      props[\"$PROPERTY_PREFIX${moduleSchema.moduleClass.qualifiedName}\"] =\n        moduleSchema.moduleClass.toKotlinPoetName().reflectionName()\n      for (pClass in moduleSchema.classes.values) {\n        props[\"$PROPERTY_PREFIX${pClass.qualifiedName}\"] =\n          pClass.toKotlinPoetName().reflectionName()\n      }\n      return StringWriter()\n        .apply { props.store(this, \"Kotlin mappings for Pkl module `${moduleSchema.moduleName}`\") }\n        .toString()\n    }\n\n  private val kotlinFileName: String\n    get() = buildString {\n      val (packageName, className) = nameMapper.map(moduleSchema.moduleName)\n      val dirPath = packageName.split('.').joinToString(\"/\", transform = IoUtils::encodePath)\n      val fileName = IoUtils.encodePath(className)\n      append(\"kot\")\n      append(\"lin/\")\n      if (dirPath.isNotEmpty()) {\n        append(\"$dirPath/\")\n      }\n      append(\"$fileName.kt\")\n    }\n\n  val kotlinFile: String\n    get() {\n      if (moduleSchema.moduleUri.scheme == \"pkl\") {\n        throw KotlinCodeGeneratorException(\n          \"Cannot generate Kotlin code for a Pkl standard library module (`${moduleSchema.moduleUri}`).\"\n        )\n      }\n\n      val pModuleClass = moduleSchema.moduleClass\n\n      val hasModuleProperties = pModuleClass.properties.any { !it.value.isHidden }\n      val isGenerateModuleClass =\n        hasModuleProperties || pModuleClass.isOpen || pModuleClass.isAbstract\n\n      fun generateCompanionRelatedCode(\n        builder: TypeSpec.Builder,\n        isModuleType: Boolean = false,\n      ): TypeSpec.Builder {\n        // ensure that at most one companion object is generated for this type\n        val companionObjectBuilder: Lazy<TypeSpec.Builder> = lazy {\n          TypeSpec.companionObjectBuilder()\n        }\n\n        // generate serialization code\n        if (\n          options.implementSerializable &&\n            (!isModuleType || isGenerateModuleClass) &&\n            !builder.modifiers.contains(KModifier.ABSTRACT)\n        ) {\n          builder.addSuperinterface(java.io.Serializable::class.java)\n          companionObjectBuilder.value.addProperty(\n            PropertySpec.builder(\n                \"serialVersionUID\",\n                Long::class.java,\n                KModifier.PRIVATE,\n                KModifier.CONST,\n              )\n              .initializer(\"0L\")\n              .build()\n          )\n        }\n\n        if (companionObjectBuilder.isInitialized()) {\n          builder.addType(companionObjectBuilder.value.build())\n        }\n\n        return builder\n      }\n\n      val moduleType =\n        if (isGenerateModuleClass) {\n          generateTypeSpec(pModuleClass, moduleSchema)\n        } else {\n          generateObjectSpec(pModuleClass)\n        }\n\n      for (pClass in moduleSchema.classes.values) {\n        moduleType.addType(\n          generateCompanionRelatedCode(generateTypeSpec(pClass, moduleSchema)).build()\n        )\n      }\n\n      val moduleName = moduleSchema.moduleName\n\n      val (packageName, moduleTypeName) = nameMapper.map(moduleName)\n\n      val fileSpec = FileSpec.builder(packageName, moduleTypeName).indent(options.indent)\n\n      for (typeAlias in moduleSchema.typeAliases.values) {\n        if (typeAlias.aliasedType is PType.Alias) {\n          // generate top-level type alias (Kotlin doesn't support nested type aliases)\n          fileSpec.addTypeAlias(generateTypeAliasSpec(typeAlias).build())\n        } else {\n          val stringLiterals = mutableSetOf<String>()\n          if (CodeGeneratorUtils.isRepresentableAsEnum(typeAlias.aliasedType, stringLiterals)) {\n            // generate nested enum class\n            moduleType.addType(generateEnumTypeSpec(typeAlias, stringLiterals).build())\n          } else {\n            // generate top-level type alias (Kotlin doesn't support nested type aliases)\n            fileSpec.addTypeAlias(generateTypeAliasSpec(typeAlias).build())\n          }\n        }\n      }\n\n      fileSpec.addType(generateCompanionRelatedCode(moduleType, isModuleType = true).build())\n      return fileSpec.build().toString()\n    }\n\n  private fun generateObjectSpec(pClass: PClass): TypeSpec.Builder {\n    val builder = TypeSpec.objectBuilder(pClass.toKotlinPoetName())\n    val docComment = pClass.docComment\n    if (docComment != null && options.generateKdoc) {\n      builder.addKdoc(renderAsKdoc(docComment))\n    }\n    return builder\n  }\n\n  private fun generateTypeSpec(pClass: PClass, schema: ModuleSchema): TypeSpec.Builder {\n    val isModuleClass = pClass == schema.moduleClass\n    val kotlinPoetClassName = pClass.toKotlinPoetName()\n    val superclass =\n      pClass.superclass?.takeIf { it.info != PClassInfo.Typed && it.info != PClassInfo.Module }\n    val superProperties = superclass?.allProperties?.filterValues { !it.isHidden } ?: mapOf()\n    val properties = pClass.properties.filterValues { !it.isHidden }\n    val allProperties = superProperties + properties\n\n    fun PClass.Property.isRegex(): Boolean =\n      (this.type as? PType.Class)?.pClass?.info == PClassInfo.Regex\n\n    fun PClass.Property.isByteArray(): Boolean =\n      (this.type as? PType.Class)?.pClass?.info == PClassInfo.Bytes\n\n    fun generateConstructor(): FunSpec {\n      val builder = FunSpec.constructorBuilder()\n      for ((name, property) in allProperties) {\n        builder.addParameter(name, property.type.toKotlinPoetName())\n      }\n      return builder.build()\n    }\n\n    fun generateCopyMethod(parameters: Map<String, PClass.Property>, isOverride: Boolean): FunSpec {\n      val methodBuilder = FunSpec.builder(\"copy\").returns(kotlinPoetClassName)\n\n      if (isOverride) {\n        methodBuilder.addModifiers(KModifier.OVERRIDE)\n      }\n      if (pClass.isOpen || pClass.isAbstract) {\n        methodBuilder.addModifiers(KModifier.OPEN)\n      }\n\n      for ((name, property) in parameters) {\n        val paramBuilder = ParameterSpec.builder(name, property.type.toKotlinPoetName())\n        if (!isOverride) {\n          paramBuilder.defaultValue(\"this.%N\", name)\n        }\n        methodBuilder.addParameter(paramBuilder.build())\n      }\n\n      val codeBuilder = CodeBlock.builder().add(\"return %T(\", kotlinPoetClassName)\n      for ((index, name) in allProperties.keys.withIndex()) {\n        codeBuilder.add(if (index == 0) \"%N\" else \", %N\", name)\n      }\n      codeBuilder.add(\")\\n\")\n\n      return methodBuilder.addCode(codeBuilder.build()).build()\n    }\n\n    fun inheritsCopyMethodWithSameArity(): Boolean {\n      val nearestNonAbstractAncestor =\n        generateSequence(pClass.superclass) { it.superclass }.firstOrNull { !it.isAbstract }\n          ?: return false\n      return nearestNonAbstractAncestor.allProperties.values.count { !it.isHidden } ==\n        allProperties.size\n    }\n\n    // besides generating copy method for current class,\n    // override copy methods inherited from parent classes\n    fun generateCopyMethods(typeBuilder: TypeSpec.Builder) {\n      // copy methods don't make sense for abstract classes\n      if (pClass.isAbstract) return\n\n      var prevParameterCount = Int.MAX_VALUE\n      for (currClass in generateSequence(pClass) { it.superclass }) {\n        if (currClass.isAbstract) continue\n\n        val currParameters = currClass.allProperties.filter { !it.value.isHidden }\n\n        // avoid generating multiple methods with same no. of parameters\n        if (currParameters.size < prevParameterCount) {\n          val isOverride = currClass !== pClass || inheritsCopyMethodWithSameArity()\n          typeBuilder.addFunction(generateCopyMethod(currParameters, isOverride))\n          prevParameterCount = currParameters.size\n        }\n      }\n    }\n\n    fun generateEqualsMethod(): FunSpec {\n      val builder =\n        FunSpec.builder(\"equals\")\n          .addModifiers(KModifier.OVERRIDE)\n          .addParameter(\"other\", ANY_NULL)\n          .returns(BOOLEAN)\n          .addStatement(\"if (this === other) return true\")\n          // generating this.javaClass instead of class literal avoids a SpotBugs warning\n          .addStatement(\"if (this.javaClass != other?.javaClass) return false\")\n          .addStatement(\"other as %T\", kotlinPoetClassName)\n\n      for ((propertyName, property) in allProperties) {\n        if (property.isByteArray()) {\n          builder.addStatement(\n            \"if (!this.%N.contentEquals(other.%N)) return false\",\n            propertyName,\n            propertyName,\n          )\n        } else {\n          val accessor = if (property.isRegex()) \"%N.pattern\" else \"%N\"\n          builder.addStatement(\n            \"if (this.$accessor != other.$accessor) return false\",\n            propertyName,\n            propertyName,\n          )\n        }\n      }\n\n      builder.addStatement(\"return true\")\n      return builder.build()\n    }\n\n    fun generateHashCodeMethod(): FunSpec {\n      val builder =\n        FunSpec.builder(\"hashCode\")\n          .addModifiers(KModifier.OVERRIDE)\n          .returns(INT)\n          .addStatement(\"var result = 1\")\n\n      for ((propertyName, property) in allProperties) {\n        if (property.isByteArray()) {\n          builder.addStatement(\"result = 31 * result + this.%N.contentHashCode()\", propertyName)\n        } else {\n          val accessor = if (property.isRegex()) \"this.%N.pattern\" else \"this.%N\"\n          // use Objects.hashCode() because Kotlin's Any?.hashCode()\n          // doesn't work for platform types (will get NPE if null)\n          builder.addStatement(\n            \"result = 31 * result + %T.hashCode($accessor)\",\n            Objects::class,\n            propertyName,\n          )\n        }\n      }\n\n      builder.addStatement(\"return result\")\n      return builder.build()\n    }\n\n    // produce same output as default toString() method of data classes\n    fun generateToStringMethod(): FunSpec {\n      return FunSpec.builder(\"toString\")\n        .addModifiers(KModifier.OVERRIDE)\n        .returns(STRING)\n        .addStatement(\n          \"return %P\",\n          CodeBlock.builder()\n            .apply {\n              add(\"%L\", pClass.toKotlinPoetName().simpleName)\n              add(\"(\")\n              for ((index, entry) in allProperties.entries.withIndex()) {\n                val (propertyName, property) = entry\n                add(if (index == 0) \"%L\" else \", %L\", propertyName)\n                if (property.isByteArray()) {\n                  add(\"=\\${%T.toString(%L)}\", Arrays::class, propertyName)\n                } else {\n                  add(\"=$\")\n                  add(\"%N\", propertyName)\n                }\n              }\n              add(\")\")\n            }\n            .build(),\n        )\n        .build()\n    }\n\n    fun generateDeprecation(\n      annotations: Collection<PObject>,\n      addAnnotation: (AnnotationSpec) -> Unit,\n    ) {\n      annotations\n        .firstOrNull { it.classInfo == PClassInfo.Deprecated }\n        ?.let { deprecation ->\n          val builder = AnnotationSpec.builder(Deprecated::class)\n          (deprecation[\"message\"] as String?)?.let { builder.addMember(\"message = %S\", it) }\n          addAnnotation(builder.build())\n        }\n    }\n\n    fun generateProperty(propertyName: String, property: PClass.Property): PropertySpec {\n      val typeName = property.type.toKotlinPoetName()\n      val builder = PropertySpec.builder(propertyName, typeName).initializer(\"%L\", propertyName)\n\n      generateDeprecation(property.annotations) { builder.addAnnotation(it) }\n\n      val docComment = property.docComment\n      if (docComment != null && options.generateKdoc) {\n        builder.addKdoc(renderAsKdoc(docComment))\n      }\n      if (propertyName in superProperties) {\n        builder.addModifiers(KModifier.OVERRIDE)\n      }\n      if (pClass.isOpen || pClass.isAbstract) {\n        builder.addModifiers(KModifier.OPEN)\n      }\n\n      return builder.build()\n    }\n\n    fun generateSpringBootAnnotations(builder: TypeSpec.Builder) {\n      if (isModuleClass) {\n        builder.addAnnotation(\n          ClassName(\"org.springframework.boot.context.properties\", \"ConfigurationProperties\")\n        )\n      } else {\n        // not very efficient to repeat computing module property base types for every class\n        val modulePropertiesWithMatchingType =\n          schema.moduleClass.allProperties.values.filter { property ->\n            var propertyType = property.type\n            while (propertyType is PType.Constrained || propertyType is PType.Nullable) {\n              if (propertyType is PType.Constrained) {\n                propertyType = propertyType.baseType\n              } else if (propertyType is PType.Nullable) {\n                propertyType = propertyType.baseType\n              }\n            }\n            propertyType is PType.Class && propertyType.pClass == pClass\n          }\n        if (modulePropertiesWithMatchingType.size == 1) {\n          // exactly one module property has this type -> make it available for direct injection\n          // (potential improvement: make type available for direct injection if it occurs exactly\n          // once in property tree)\n          builder.addAnnotation(\n            AnnotationSpec.builder(\n                ClassName(\"org.springframework.boot.context.properties\", \"ConfigurationProperties\")\n              )\n              // use \"value\" instead of \"prefix\" to entice JavaPoet to generate a single-line\n              // annotation\n              // that can easily be filtered out by JavaCodeGeneratorTest.`spring boot config`\n              .addMember(\"%S\", modulePropertiesWithMatchingType.first().simpleName)\n              .build()\n          )\n        }\n      }\n    }\n\n    fun generateRegularClass(): TypeSpec.Builder {\n      val builder = TypeSpec.classBuilder(kotlinPoetClassName)\n\n      if (options.generateSpringBootConfig) {\n        generateSpringBootAnnotations(builder)\n      }\n      if (options.addGeneratedAnnotation) {\n        builder.addAnnotation(ClassName(\"org.pkl.config.java\", \"Generated\"))\n      }\n\n      builder.primaryConstructor(generateConstructor())\n\n      val docComment = pClass.docComment\n      if (docComment != null && options.generateKdoc) {\n        builder.addKdoc(renderAsKdoc(docComment))\n      }\n\n      if (pClass.isAbstract) {\n        builder.addModifiers(KModifier.ABSTRACT)\n      } else if (pClass.isOpen) {\n        builder.addModifiers(KModifier.OPEN)\n      }\n\n      superclass?.let { superclass ->\n        val superclassName = superclass.toKotlinPoetName()\n        builder.superclass(superclassName)\n        for (propertyName in superProperties.keys) {\n          builder.addSuperclassConstructorParameter(propertyName)\n        }\n      }\n\n      for ((name, property) in properties) {\n        builder.addProperty(generateProperty(name, property))\n      }\n\n      if (!pClass.isAbstract) {\n        generateCopyMethods(builder)\n        builder\n          .addFunction(generateEqualsMethod())\n          .addFunction(generateHashCodeMethod())\n          .addFunction(generateToStringMethod())\n      }\n\n      return builder\n    }\n\n    fun generateDataClass(): TypeSpec.Builder {\n      val builder = TypeSpec.classBuilder(kotlinPoetClassName).addModifiers(KModifier.DATA)\n\n      if (options.generateSpringBootConfig) {\n        generateSpringBootAnnotations(builder)\n      }\n      if (options.addGeneratedAnnotation) {\n        builder.addAnnotation(ClassName(\"org.pkl.config.java\", \"Generated\"))\n      }\n\n      builder.primaryConstructor(generateConstructor())\n\n      generateDeprecation(pClass.annotations) { builder.addAnnotation(it) }\n\n      val docComment = pClass.docComment\n      if (docComment != null && options.generateKdoc) {\n        builder.addKdoc(renderAsKdoc(docComment))\n      }\n\n      var hasRegexOrByteArray = false\n      for ((name, property) in properties) {\n        hasRegexOrByteArray = hasRegexOrByteArray || property.isRegex() || property.isByteArray()\n        builder.addProperty(generateProperty(name, property))\n      }\n\n      // Regex and ByteArray define equaltiy as identity.\n      // To match Pkl semantics, override equals and hashCode if the data class has a property of\n      // type Regex or ByteArray.\n      if (hasRegexOrByteArray) {\n        builder.addFunction(generateEqualsMethod()).addFunction(generateHashCodeMethod())\n      }\n\n      return builder\n    }\n\n    return if (superclass == null && !pClass.isAbstract && !pClass.isOpen) generateDataClass()\n    else generateRegularClass()\n  }\n\n  private fun generateEnumTypeSpec(\n    typeAlias: TypeAlias,\n    stringLiterals: Set<String>,\n  ): TypeSpec.Builder {\n    val enumConstantToPklNames =\n      stringLiterals\n        .groupingBy { literal ->\n          CodeGeneratorUtils.toEnumConstantName(literal)\n            ?: throw KotlinCodeGeneratorException(\n              \"Cannot generate Kotlin enum class for Pkl type alias `${typeAlias.displayName}` \" +\n                \"because string literal type \\\"$literal\\\" cannot be converted to a valid enum constant name.\"\n            )\n        }\n        .reduce { enumConstantName, firstLiteral, secondLiteral ->\n          throw KotlinCodeGeneratorException(\n            \"Cannot generate Kotlin enum class for Pkl type alias `${typeAlias.displayName}` \" +\n              \"because string literal types \\\"$firstLiteral\\\" and \\\"$secondLiteral\\\" \" +\n              \"would both be converted to enum constant name `$enumConstantName`.\"\n          )\n        }\n\n    val builder =\n      TypeSpec.enumBuilder(typeAlias.simpleName)\n        .primaryConstructor(\n          FunSpec.constructorBuilder().addParameter(\"value\", String::class).build()\n        )\n        .addProperty(PropertySpec.builder(\"value\", String::class).initializer(\"value\").build())\n        .addFunction(\n          FunSpec.builder(\"toString\")\n            .addModifiers(KModifier.OVERRIDE)\n            .addStatement(\"return value\")\n            .build()\n        )\n    for ((enumConstantName, pklName) in enumConstantToPklNames) {\n      builder.addEnumConstant(\n        enumConstantName,\n        TypeSpec.anonymousClassBuilder().addSuperclassConstructorParameter(\"%S\", pklName).build(),\n      )\n    }\n\n    return builder\n  }\n\n  private fun generateTypeAliasSpec(typeAlias: TypeAlias): TypeAliasSpec.Builder {\n    val builder =\n      TypeAliasSpec.builder(typeAlias.simpleName, typeAlias.aliasedType.toKotlinPoetName())\n    for (typeParameter in typeAlias.typeParameters) {\n      builder.addTypeVariable(\n        TypeVariableName(typeParameter.name, typeParameter.variance.toKotlinPoet())\n      )\n    }\n\n    val docComment = typeAlias.docComment\n    if (docComment != null && options.generateKdoc) {\n      builder.addKdoc(renderAsKdoc(docComment))\n    }\n\n    return builder\n  }\n\n  private fun TypeParameter.Variance.toKotlinPoet(): KModifier? =\n    when (this) {\n      TypeParameter.Variance.COVARIANT -> KModifier.OUT\n      TypeParameter.Variance.CONTRAVARIANT -> KModifier.IN\n      else -> null\n    }\n\n  // do the minimum work necessary to avoid kotlin compile errors\n  // generating idiomatic KDoc would require parsing doc comments, converting member links, etc.\n  private fun renderAsKdoc(docComment: String): String = docComment\n\n  private fun PClass.toKotlinPoetName(): ClassName {\n    val (packageName, moduleTypeName) = nameMapper.map(moduleName)\n    return if (isModuleClass) {\n      ClassName(packageName, moduleTypeName)\n    } else {\n      ClassName(packageName, moduleTypeName, simpleName)\n    }\n  }\n\n  private fun TypeAlias.toKotlinPoetName(): ClassName {\n    val (packageName, moduleTypeName) = nameMapper.map(moduleName)\n\n    return when {\n      aliasedType is PType.Alias -> {\n        // Kotlin type generated for [this] is a top-level type alias\n        ClassName(packageName, simpleName)\n      }\n      CodeGeneratorUtils.isRepresentableAsEnum(aliasedType, null) -> {\n        if (isStandardLibraryMember) {\n          throw KotlinCodeGeneratorException(\n            \"Standard library typealias `${qualifiedName}` is not supported by Kotlin code generator.\" +\n              \" If you think this is an omission, please let us know.\"\n          )\n        }\n        // Kotlin type generated for [this] is a nested enum class\n        ClassName(packageName, moduleTypeName, simpleName)\n      }\n      else -> {\n        // Kotlin type generated for [this] is a top-level type alias\n        ClassName(packageName, simpleName)\n      }\n    }\n  }\n\n  private fun PType.toKotlinPoetName(): TypeName =\n    when (this) {\n      PType.UNKNOWN -> ANY_NULL\n      PType.NOTHING -> NOTHING\n      is PType.StringLiteral -> STRING\n      is PType.Class -> {\n        // if in doubt, spell it out\n        when (val classInfo = pClass.info) {\n          PClassInfo.Any -> ANY_NULL\n          PClassInfo.Typed,\n          PClassInfo.Dynamic -> ANY\n          PClassInfo.Boolean -> BOOLEAN\n          PClassInfo.String -> STRING\n          // seems more useful to generate `Double` than `kotlin.Number`\n          PClassInfo.Number -> DOUBLE\n          PClassInfo.Int -> LONG\n          PClassInfo.Float -> DOUBLE\n          PClassInfo.Duration -> DURATION\n          PClassInfo.DataSize -> DATA_SIZE\n          PClassInfo.Bytes -> BYTE_ARRAY\n          PClassInfo.Pair ->\n            KOTLIN_PAIR.parameterizedBy(\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[0].toKotlinPoetName(),\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[1].toKotlinPoetName(),\n            )\n          PClassInfo.Collection ->\n            COLLECTION.parameterizedBy(\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[0].toKotlinPoetName()\n            )\n          PClassInfo.List,\n          PClassInfo.Listing ->\n            LIST.parameterizedBy(\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[0].toKotlinPoetName()\n            )\n          PClassInfo.Set ->\n            SET.parameterizedBy(\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[0].toKotlinPoetName()\n            )\n          PClassInfo.Map,\n          PClassInfo.Mapping ->\n            MAP.parameterizedBy(\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[0].toKotlinPoetName(),\n              if (typeArguments.isEmpty()) ANY_NULL else typeArguments[1].toKotlinPoetName(),\n            )\n          PClassInfo.Module -> PMODULE\n          PClassInfo.Class -> PCLASS\n          PClassInfo.Regex -> REGEX\n          PClassInfo.Version -> VERSION\n          else ->\n            when {\n              !classInfo.isStandardLibraryClass -> pClass.toKotlinPoetName()\n              else ->\n                throw KotlinCodeGeneratorException(\n                  \"Standard library class `${pClass.qualifiedName}` is not supported by Kotlin code generator. \" +\n                    \"If you think this is an omission, please let us know.\"\n                )\n            }\n        }\n      }\n      is PType.Nullable -> baseType.toKotlinPoetName().copy(nullable = true)\n      is PType.Constrained -> baseType.toKotlinPoetName()\n      is PType.Alias ->\n        when (typeAlias.qualifiedName) {\n          \"pkl.base#NonNull\" -> ANY\n          // Not currently generating Kotlin unsigned types\n          // because it's not clear if the benefits outweigh the drawbacks:\n          // - breaking change\n          // - Kotlin unsigned types aren't intended for domain modeling\n          // - diverts from Java code generator\n          // - doesn't increase safety\n          //   - range already checked on Pkl side\n          //   - conversion to signed type doesn't perform range check\n          \"pkl.base#Int8\" -> BYTE\n          \"pkl.base#Int16\",\n          \"pkl.base#UInt8\" -> SHORT\n          \"pkl.base#Int32\",\n          \"pkl.base#UInt16\" -> INT\n          \"pkl.base#UInt\",\n          \"pkl.base#UInt32\" -> LONG\n          \"pkl.base#DurationUnit\" -> DURATION_UNIT\n          \"pkl.base#DataSizeUnit\" -> DATA_SIZE_UNIT\n          \"pkl.base#Uri\" -> URI\n          else -> {\n            val className = typeAlias.toKotlinPoetName()\n            when {\n              typeAlias.typeParameters.isEmpty() -> className\n              typeArguments.isEmpty() -> {\n                // no type arguments provided for a type alias with type parameters -> fill in\n                // `Any?` (equivalent of `unknown`)\n                val typeArgs = Array(typeAlias.typeParameters.size) { ANY_NULL }\n                className.parameterizedBy(*typeArgs)\n              }\n              else -> className.parameterizedBy(*typeArguments.toKotlinPoet())\n            }\n          }\n        }\n      is PType.Function ->\n        throw KotlinCodeGeneratorException(\n          \"Pkl function types are not supported by the Kotlin code generator.\"\n        )\n      is PType.Union ->\n        if (CodeGeneratorUtils.isRepresentableAsString(this)) STRING\n        else\n          throw KotlinCodeGeneratorException(\n            \"Pkl union types are not supported by the Kotlin code generator.\"\n          )\n\n      // occurs on RHS of generic type aliases\n      is PType.TypeVariable -> TypeVariableName(typeParameter.name)\n      else -> throw AssertionError(\"Encountered unexpected PType subclass: $this\")\n    }\n\n  private fun List<PType>.toKotlinPoet(): Array<TypeName> =\n    map { it.toKotlinPoetName() }.toTypedArray()\n\n  private val nameMapper = NameMapper(options.renames)\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/Main.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:JvmName(\"Main\")\n\npackage org.pkl.codegen.kotlin\n\nimport com.github.ajalt.clikt.core.main\nimport com.github.ajalt.clikt.parameters.options.associate\nimport com.github.ajalt.clikt.parameters.options.default\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.cliMain\nimport org.pkl.commons.cli.commands.ModulesCommand\nimport org.pkl.commons.cli.commands.installCommonOptions\nimport org.pkl.commons.toPath\nimport org.pkl.core.Release\n\n/** Main method for the Kotlin code generator CLI. */\ninternal fun main(args: Array<String>) {\n  cliMain { PklKotlinCodegenCommand().main(args) }\n}\n\nval helpLink = \"${Release.current().documentation.homepage}kotlin-binding/codegen.html#cli\"\n\nclass PklKotlinCodegenCommand : ModulesCommand(name = \"pkl-codegen-kotlin\", helpLink = helpLink) {\n  private val defaults = CliKotlinCodeGeneratorOptions(CliBaseOptions(), \"\".toPath())\n\n  private val outputDir: Path by\n    option(\n        names = arrayOf(\"-o\", \"--output-dir\"),\n        metavar = \"path\",\n        help = \"The directory where generated source code is placed.\",\n      )\n      .path()\n      .default(defaults.outputDir)\n\n  private val indent: String by\n    option(\n        names = arrayOf(\"--indent\"),\n        metavar = \"chars\",\n        help = \"The characters to use for indenting generated source code.\",\n      )\n      .default(defaults.indent)\n\n  private val generateKdoc: Boolean by\n    option(\n        names = arrayOf(\"--generate-kdoc\"),\n        help = \"Whether to preserve Pkl doc comments by generating corresponding KDoc comments.\",\n      )\n      .flag()\n\n  private val generateSpringboot: Boolean by\n    option(\n        names = arrayOf(\"--generate-spring-boot\"),\n        help = \"Whether to generate config classes for use with Spring Boot.\",\n      )\n      .flag()\n\n  private val implementSerializable: Boolean by\n    option(\n        names = arrayOf(\"--implement-serializable\"),\n        help = \"Whether to generate classes that implement java.io.Serializable.\",\n      )\n      .flag()\n\n  private val addGeneratedAnnotation: Boolean by\n    option(\n        names = arrayOf(\"--add-generated-annotation\"),\n        help = \"Whether to add a @Generated annotation to the types to be generated.\",\n      )\n      .flag()\n  private val renames: Map<String, String> by\n    option(\n        names = arrayOf(\"--rename\"),\n        metavar = \"old_name=new_name\",\n        help =\n          \"\"\"\n            Replace a prefix in the names of the generated Kotlin classes (repeatable).\n            By default, the names of generated classes are derived from the Pkl module names.\n            With this option, you can override or modify the default names, renaming entire\n            classes or just their packages.\n          \"\"\"\n            .trimIndent(),\n      )\n      .associate()\n\n  override val helpString: String = \"Generate Kotlin classes and interfaces from Pkl module(s)\"\n\n  override fun run() {\n    val options =\n      CliKotlinCodeGeneratorOptions(\n        base = baseOptions.baseOptions(modules, projectOptions),\n        outputDir = outputDir,\n        indent = indent,\n        generateKdoc = generateKdoc,\n        generateSpringBootConfig = generateSpringboot,\n        implementSerializable = implementSerializable,\n        addGeneratedAnnotation = addGeneratedAnnotation,\n        renames = renames,\n      )\n    CliKotlinCodeGenerator(options).run()\n  }\n\n  init {\n    installCommonOptions()\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/CliKotlinCodeGeneratorTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.kotlin\n\nimport java.nio.file.Path\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.readString\n\nclass CliKotlinCodeGeneratorTest {\n  @Test\n  fun `module inheritance`(@TempDir tempDir: Path) {\n    val module1 =\n      PklModule(\n        \"org.mod1\",\n        \"\"\"\n      open module org.mod1\n\n      pigeon: Person\n\n      class Person {\n        name: String\n        age: Int\n      }\n      \"\"\",\n      )\n\n    val module2 =\n      PklModule(\n        \"org.mod2\",\n        \"\"\"\n      module org.mod2\n\n      extends \"mod1.pkl\"\n\n      parrot: Person\n      \"\"\",\n      )\n\n    val module1File = module1.writeToDisk(tempDir.resolve(\"org/mod1.pkl\"))\n    val module2File = module2.writeToDisk(tempDir.resolve(\"org/mod2.pkl\"))\n    val outputDir = tempDir.resolve(\"output\")\n\n    val generator =\n      CliKotlinCodeGenerator(\n        CliKotlinCodeGeneratorOptions(\n          CliBaseOptions(listOf(module1File.toUri(), module2File.toUri())),\n          outputDir,\n        )\n      )\n\n    generator.run()\n\n    val module1KotlinFile = outputDir.resolve(\"kotlin/org/Mod1.kt\")\n    assertThat(module1KotlinFile).exists()\n\n    val module2KotlinFile = outputDir.resolve(\"kotlin/org/Mod2.kt\")\n    assertThat(module2KotlinFile).exists()\n\n    assertContains(\n      \"\"\"\n      open class Mod1(\n        open val pigeon: Person\n      ) {\n    \"\"\"\n        .trimIndent(),\n      module1KotlinFile.readString(),\n    )\n\n    assertContains(\n      \"\"\"\n      class Mod2(\n        pigeon: Mod1.Person,\n        val parrot: Mod1.Person\n      ) : Mod1(pigeon) {\n    \"\"\"\n        .trimIndent(),\n      module2KotlinFile.readString(),\n    )\n  }\n\n  @Test\n  fun `class name clashes`(@TempDir tempDir: Path) {\n    val module1 =\n      PklModule(\n        \"org.mod1\",\n        \"\"\"\n      module org.mod1\n\n      class Person {\n        name: String\n      }\n      \"\"\",\n      )\n\n    val module2 =\n      PklModule(\n        \"org.mod2\",\n        \"\"\"\n      module org.mod2\n\n      import \"mod1.pkl\"\n\n      person1: mod1.Person\n      person2: Person\n\n      class Person {\n        age: Int\n      }\n      \"\"\",\n      )\n\n    val module1PklFile = module1.writeToDisk(tempDir.resolve(\"org/mod1.pkl\"))\n    val module2PklFile = module2.writeToDisk(tempDir.resolve(\"org/mod2.pkl\"))\n    val outputDir = tempDir.resolve(\"output\")\n\n    val generator =\n      CliKotlinCodeGenerator(\n        CliKotlinCodeGeneratorOptions(\n          CliBaseOptions(listOf(module1PklFile.toUri(), module2PklFile.toUri())),\n          outputDir,\n        )\n      )\n\n    generator.run()\n\n    val module2KotlinFile = outputDir.resolve(\"kotlin/org/Mod2.kt\")\n    assertContains(\n      \"\"\"\n      data class Mod2(\n        val person1: Mod1.Person,\n        val person2: Person\n      )\n      \"\"\"\n        .trimIndent(),\n      module2KotlinFile.readString(),\n    )\n  }\n\n  @Test\n  fun `custom package names`(@TempDir tempDir: Path) {\n    val module1 =\n      PklModule(\n        \"org.foo.Module1\",\n        \"\"\"\n          module org.foo.Module1\n\n          class Person {\n            name: String\n          }\n        \"\"\",\n      )\n\n    val module2 =\n      PklModule(\n        \"org.bar.Module2\",\n        \"\"\"\n          module org.bar.Module2\n          \n          import \"../../org/foo/Module1.pkl\"\n\n          class Group {\n            owner: Module1.Person\n            name: String\n          }\n        \"\"\",\n      )\n\n    val module3 =\n      PklModule(\n        \"org.baz.Module3\",\n        \"\"\"\n          module org.baz.Module3\n          \n          import \"../../org/bar/Module2.pkl\"\n\n          class Supergroup {\n            owner: Module2.Group\n          }\n        \"\"\",\n      )\n\n    val module1PklFile = module1.writeToDisk(tempDir.resolve(\"org/foo/Module1.pkl\"))\n    val module2PklFile = module2.writeToDisk(tempDir.resolve(\"org/bar/Module2.pkl\"))\n    val module3PklFile = module3.writeToDisk(tempDir.resolve(\"org/baz/Module3.pkl\"))\n    val outputDir = tempDir.resolve(\"output\")\n\n    val generator =\n      CliKotlinCodeGenerator(\n        CliKotlinCodeGeneratorOptions(\n          CliBaseOptions(listOf(module1PklFile, module2PklFile, module3PklFile).map { it.toUri() }),\n          outputDir,\n          renames = mapOf(\"org.foo\" to \"com.foo.x\", \"org.baz\" to \"com.baz.a.b\"),\n        )\n      )\n\n    generator.run()\n\n    val module1KotlinFile = outputDir.resolve(\"kotlin/com/foo/x/Module1.kt\")\n    module1KotlinFile.readString().let {\n      assertContains(\"package com.foo.x\", it)\n\n      assertContains(\"object Module1 {\", it)\n\n      assertContains(\n        \"\"\"\n        |  data class Person(\n        |    val name: String\n        |  )\n        \"\"\",\n        it,\n      )\n    }\n\n    val module2KotlinFile = outputDir.resolve(\"kotlin/org/bar/Module2.kt\")\n    module2KotlinFile.readString().let {\n      assertContains(\"package org.bar\", it)\n\n      assertContains(\"import com.foo.x.Module1\", it)\n\n      assertContains(\"object Module2 {\", it)\n\n      assertContains(\n        \"\"\"\n        |  data class Group(\n        |    val owner: Module1.Person,\n        |    val name: String\n        |  )\n        \"\"\",\n        it,\n      )\n    }\n\n    val module3KotlinFile = outputDir.resolve(\"kotlin/com/baz/a/b/Module3.kt\")\n    module3KotlinFile.readString().let {\n      assertContains(\"package com.baz.a.b\", it)\n\n      assertContains(\"import org.bar.Module2\", it)\n\n      assertContains(\"object Module3 {\", it)\n\n      assertContains(\n        \"\"\"\n        |  data class Supergroup(\n        |    val owner: Module2.Group\n        |  )\n        \"\"\",\n        it,\n      )\n    }\n  }\n\n  private fun assertContains(part: String, code: String) {\n    val trimmedPart = part.trim().trimMargin()\n    if (!code.contains(trimmedPart)) {\n      // check for equality to get better error output (ide diff dialog)\n      assertThat(code).isEqualTo(trimmedPart)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/InMemoryKotlinCompiler.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.kotlin\n\nimport javax.script.ScriptEngineManager\nimport javax.script.ScriptException\nimport kotlin.reflect.KClass\nimport kotlin.text.RegexOption.MULTILINE\nimport kotlin.text.RegexOption.UNIX_LINES\n\nclass CompilationFailedException(msg: String?, cause: Throwable? = null) :\n  RuntimeException(msg, cause)\n\nobject InMemoryKotlinCompiler {\n  // Implementation notes:\n  // * all [sourceFiles] are currently combined into a single file\n  // * implementation makes assumptions about structure of generated source files\n  fun compile(sourceFiles: Map<String, String>): Map<String, KClass<*>> {\n    fun String.findClasses(\n      prefix: String = \"\",\n      nameGroup: Int = 2,\n      bodyGroup: Int = 4,\n      regex: String =\n        \"^(data |open |enum )?class\\\\s+(\\\\w+) *(\\\\([^)]*\\\\))?.*$\\\\n((^  .*\\\\n|^$\\\\n)*)\",\n      transform: (String, String) -> Sequence<Pair<String, String>> = { name, body ->\n        sequenceOf(Pair(name, prefix + name)) + body.findClasses(\"$prefix$name.\")\n      },\n    ): Sequence<Pair<String, String>> = // (simpleName1, qualifiedName1), ...\n    Regex(regex, setOf(MULTILINE, UNIX_LINES)).findAll(this).flatMap {\n        transform(it.groupValues[nameGroup], it.groupValues[bodyGroup].trimIndent())\n      }\n\n    fun String.findOuterObjects(): Sequence<Pair<String, String>> = // (simpleName, qualifiedName)\n    findClasses(nameGroup = 1, bodyGroup = 2, regex = \"^object\\\\s+(\\\\w+).*$\\n((^  .*$\\n|^$\\n)*)\") {\n        name,\n        body ->\n        body.findClasses(\"$name.\")\n      }\n\n    val (importLines, remainder) =\n      sourceFiles.entries\n        .filter { (filename, _) -> filename.endsWith(\".kt\") }\n        .flatMap { (_, text) -> text.lines() }\n        .partition { it.startsWith(\"import\") }\n    val importBlock = importLines.sorted().distinct()\n    val (packageLines, code) = remainder.partition { it.startsWith(\"package\") }\n    val packageBlock = packageLines.distinct()\n    assert(\n      packageBlock.size <= 1\n    ) // everything is in the same package and/or there is no package line\n    val sourceText = listOf(packageBlock, importBlock, code).flatten().joinToString(\"\\n\")\n\n    val (simpleNames, qualifiedNames) =\n      sourceText.findClasses().plus(sourceText.findOuterObjects()).unzip()\n    val instrumentation =\n      \"listOf<kotlin.reflect.KClass<*>>(${qualifiedNames.joinToString(\",\") { \"$it::class\" }})\"\n\n    // create new engine for each compilation\n    // (otherwise we sometimes get kotlin compiler exceptions)\n    val engine = ScriptEngineManager().getEngineByExtension(\"kts\")!!\n    val classes =\n      try {\n        @Suppress(\"UNCHECKED_CAST\")\n        engine.eval(\"$sourceText\\n\\n$instrumentation\") as List<KClass<*>>\n      } catch (e: ScriptException) {\n        throw CompilationFailedException(e.message, e)\n      }\n\n    return simpleNames.zip(classes).toMap()\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/KotlinCodeGeneratorTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.kotlin\n\nimport java.io.*\nimport java.nio.file.Path\nimport kotlin.reflect.KClass\nimport kotlin.reflect.full.declaredMemberProperties\nimport kotlin.reflect.full.memberProperties\nimport org.assertj.core.api.AbstractAssert\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertAll\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.test.ReflectionUtils.enumValues\nimport org.pkl.core.*\nimport org.pkl.core.util.IoUtils\n\nclass KotlinCodeGeneratorTest {\n  companion object {\n    private const val MAPPER_PREFIX = \"resources/META-INF/org/pkl/config/java/mapper/classes\"\n\n    // according to:\n    // https://github.com/JetBrains/kotlin/blob/master/core/descriptors/\n    // src/org/jetbrains/kotlin/renderer/KeywordStringsGenerated.java\n    private val kotlinKeywords =\n      setOf(\n        \"package\",\n        \"as\",\n        \"typealias\",\n        \"class\",\n        \"this\",\n        \"super\",\n        \"val\",\n        \"var\",\n        \"fun\",\n        \"for\",\n        \"null\",\n        \"true\",\n        \"false\",\n        \"is\",\n        \"in\",\n        \"throw\",\n        \"return\",\n        \"break\",\n        \"continue\",\n        \"object\",\n        \"if\",\n        \"try\",\n        \"else\",\n        \"while\",\n        \"do\",\n        \"when\",\n        \"interface\",\n        \"typeof\",\n      )\n\n    private val simpleClass: KClass<*> by lazy {\n      generateKotlinCode(\n          \"\"\"\n        module my.mod\n\n        open class Simple {\n          str: String\n          list: List<Int>\n        }\n      \"\"\"\n            .trimIndent()\n        )\n        .compile()\n        .getValue(\"Simple\")\n    }\n\n    private val propertyTypesKotlinCode: KotlinSourceCode by lazy {\n      generateKotlinCode(\n        \"\"\"\n        module my.mod\n\n        open class PropertyTypes {\n          boolean: Boolean\n          int: Int\n          float: Float\n          string: String\n          duration: Duration\n          durationUnit: DurationUnit\n          dataSize: DataSize\n          dataSizeUnit: DataSizeUnit\n          nullable: String?\n          nullable2: String?\n          pair: Pair\n          pair2: Pair<String, Other>\n          coll: Collection\n          coll2: Collection<Other>\n          list: List\n          list2: List<Other>\n          set: Set\n          set2: Set<Other>\n          map: Map\n          map2: Map<String, Other>\n          container: Mapping\n          container2: Mapping<String, Other>\n          other: Other\n          regex: Regex\n          any: Any\n          nonNull: NonNull\n          enum: Direction\n          bytes: Bytes\n        }\n\n        open class Other {\n          name: String\n        }\n\n        typealias Direction = \"north\"|\"east\"|\"south\"|\"west\"\n      \"\"\"\n          .trimIndent()\n      )\n    }\n\n    private val propertyTypesClasses: Map<String, KClass<*>> by lazy {\n      propertyTypesKotlinCode.compile()\n    }\n\n    private fun generateKotlinCode(\n      pklCode: String,\n      generateKdoc: Boolean = false,\n      generateSpringBootConfig: Boolean = false,\n      implementSerializable: Boolean = false,\n    ): KotlinSourceCode {\n\n      val module = Evaluator.preconfigured().evaluateSchema(ModuleSource.text(pklCode))\n\n      val generator =\n        KotlinCodeGenerator(\n          module,\n          KotlinCodeGeneratorOptions(\n            generateKdoc = generateKdoc,\n            generateSpringBootConfig = generateSpringBootConfig,\n            implementSerializable = implementSerializable,\n          ),\n        )\n      return KotlinSourceCode(generator.kotlinFile)\n    }\n  }\n\n  @TempDir lateinit var tempDir: Path\n\n  @Test\n  fun testEquals() {\n    val ctor = simpleClass.constructors.first()\n    val instance1 = ctor.call(\"foo\", listOf(1, 2, 3))\n    val instance2 = ctor.call(\"foo\", listOf(1, 2, 3))\n    val instance3 = ctor.call(\"foo\", listOf(1, 3, 2))\n    val instance4 = ctor.call(\"bar\", listOf(1, 2, 3))\n\n    assertThat(instance1).isEqualTo(instance1)\n    assertThat(instance1).isEqualTo(instance2)\n    assertThat(instance2).isEqualTo(instance1)\n\n    assertThat(instance3).isNotEqualTo(instance1)\n    assertThat(instance4).isNotEqualTo(instance1)\n  }\n\n  @Test\n  fun testHashCode() {\n    val ctor = simpleClass.constructors.first()\n    val instance1 = ctor.call(\"foo\", listOf(1, 2, 3))\n    val instance2 = ctor.call(\"foo\", listOf(1, 2, 3))\n    val instance3 = ctor.call(\"foo\", listOf(1, 3, 2))\n    val instance4 = ctor.call(\"bar\", listOf(1, 2, 3))\n\n    assertThat(instance1.hashCode()).isEqualTo(instance1.hashCode())\n    assertThat(instance1.hashCode()).isEqualTo(instance2.hashCode())\n    assertThat(instance3.hashCode()).isNotEqualTo(instance1.hashCode())\n    assertThat(instance4.hashCode()).isNotEqualTo(instance1.hashCode())\n  }\n\n  @Test\n  fun testToString() {\n    val (_, propertyTypes) = instantiateOtherAndPropertyTypes()\n    assertThat(propertyTypes.toString())\n      .isEqualTo(\n        \"\"\"PropertyTypes(boolean=true, int=42, float=42.3, string=string, duration=5.min, \"\"\" +\n          \"\"\"durationUnit=min, dataSize=3.gb, dataSizeUnit=gb, nullable=idea, nullable2=null, \"\"\" +\n          \"\"\"pair=(1, 2), pair2=(pigeon, Other(name=pigeon)), coll=[1, 2], \"\"\" +\n          \"\"\"coll2=[Other(name=pigeon), Other(name=pigeon)], list=[1, 2], \"\"\" +\n          \"\"\"list2=[Other(name=pigeon), Other(name=pigeon)], set=[1, 2], \"\"\" +\n          \"\"\"set2=[Other(name=pigeon)], map={1=one, 2=two}, map2={one=Other(name=pigeon), \"\"\" +\n          \"\"\"two=Other(name=pigeon)}, container={1=one, 2=two}, container2={one=Other(name=pigeon), \"\"\" +\n          \"\"\"two=Other(name=pigeon)}, other=Other(name=pigeon), regex=(i?)\\w*, any=Other(name=pigeon), \"\"\" +\n          \"\"\"nonNull=Other(name=pigeon), enum=north, \"\"\" +\n          \"\"\"bytes=[1, 2, 3, 4])\"\"\"\n      )\n  }\n\n  @Test\n  fun `quoted identifiers`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      open class `A Person` {\n        `first name`: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  open class `A Person`(\n        |    open val `first name`: String\n        |  )\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n          |  override fun toString(): String = \"\"${'\"'}A Person(first name=${'$'}`first name`)\"\"${'\"'}\n        \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n          |  open fun copy(`first name`: String = this.`first name`): `A Person` = `A Person`(`first name`)\n        \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated property with message`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      class ClassWithDeprecatedProperty {\n        @Deprecated { message = \"property deprecation message\" } \n        deprecatedProperty: Int = 1337\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |  data class ClassWithDeprecatedProperty(\n      |    @Deprecated(message = \"property deprecation message\")\n      |    val deprecatedProperty: Long\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated class with message`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      @Deprecated { message = \"class deprecation message\" }\n      class DeprecatedClass {\n        propertyOfDeprecatedClass: Int = 42\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |  @Deprecated(message = \"class deprecation message\")\n      |  data class DeprecatedClass(\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated module class with message`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      @Deprecated{ message = \"module class deprecation message\" }\n      module DeprecatedModule\n      \n      propertyInDeprecatedModuleClass : Int = 42\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |@Deprecated(message = \"module class deprecation message\")\n      |data class DeprecatedModule(\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated property`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      class ClassWithDeprecatedProperty {\n         @Deprecated\n         deprecatedProperty: Int = 1337\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |  data class ClassWithDeprecatedProperty(\n      |    @Deprecated\n      |    val deprecatedProperty: Long\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated class`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      @Deprecated\n      class DeprecatedClass {\n        propertyOfDeprecatedClass: Int = 42\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |  @Deprecated\n      |  data class DeprecatedClass(\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `deprecated module class`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      @Deprecated\n      module DeprecatedModule\n      \n      propertyInDeprecatedModuleClass : Int = 42\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |@Deprecated\n      |data class DeprecatedModule(\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun properties() {\n    val (other, propertyTypes) = instantiateOtherAndPropertyTypes()\n\n    assertThat(readProperty(other, \"name\")).isEqualTo(\"pigeon\")\n    assertThat(readProperty(propertyTypes, \"boolean\")).isEqualTo(true)\n    assertThat(readProperty(propertyTypes, \"int\")).isEqualTo(42L)\n    assertThat(readProperty(propertyTypes, \"float\")).isEqualTo(42.3)\n    assertThat(readProperty(propertyTypes, \"string\")).isEqualTo(\"string\")\n    assertThat(readProperty(propertyTypes, \"duration\"))\n      .isEqualTo(Duration(5.0, DurationUnit.MINUTES))\n    assertThat(readProperty(propertyTypes, \"dataSize\"))\n      .isEqualTo(DataSize(3.0, DataSizeUnit.GIGABYTES))\n    assertThat(readProperty(propertyTypes, \"nullable\")).isEqualTo(\"idea\")\n    assertThat(readProperty(propertyTypes, \"nullable2\")).isEqualTo(null)\n    assertThat(readProperty(propertyTypes, \"list\")).isEqualTo(listOf(1, 2))\n    assertThat(readProperty(propertyTypes, \"list2\")).isEqualTo(listOf(other, other))\n    assertThat(readProperty(propertyTypes, \"set\")).isEqualTo(setOf(1, 2))\n    assertThat(readProperty(propertyTypes, \"set2\")).isEqualTo(setOf(other))\n    assertThat(readProperty(propertyTypes, \"map\")).isEqualTo(mapOf(1 to \"one\", 2 to \"two\"))\n    assertThat(readProperty(propertyTypes, \"map2\")).isEqualTo(mapOf(\"one\" to other, \"two\" to other))\n    assertThat(readProperty(propertyTypes, \"container\")).isEqualTo(mapOf(1 to \"one\", 2 to \"two\"))\n    assertThat(readProperty(propertyTypes, \"container2\"))\n      .isEqualTo(mapOf(\"one\" to other, \"two\" to other))\n    assertThat(readProperty(propertyTypes, \"other\")).isEqualTo(other)\n    assertThat(readProperty(propertyTypes, \"regex\")).isInstanceOf(Regex::class.java)\n    assertThat(readProperty(propertyTypes, \"any\")).isEqualTo(other)\n    assertThat(readProperty(propertyTypes, \"nonNull\")).isEqualTo(other)\n    assertThat(readProperty(propertyTypes, \"bytes\")).isEqualTo(byteArrayOf(1, 2, 3, 4))\n  }\n\n  private fun readProperty(receiver: Any, name: String): Any? {\n    val property = receiver.javaClass.kotlin.memberProperties.find { it.name == name }!!\n    return property.invoke(receiver)\n  }\n\n  @Test\n  fun `properties 2`() {\n    assertThat(propertyTypesKotlinCode).isEqualToResourceFile(\"PropertyTypes.kotlin\")\n  }\n\n  @Test\n  fun `enum constant names`() {\n    val cases =\n      listOf(\n        \"camelCasedName\" to \"CAMEL_CASED_NAME\",\n        \"hyphenated-name\" to \"HYPHENATED_NAME\",\n        \"EnQuad\\u2000EmSpace\\u2003IdeographicSpace\\u3000\" to \"EN_QUAD_EM_SPACE_IDEOGRAPHIC_SPACE_\",\n        \"ᾊᾨ\" to \"ᾊᾨ\",\n        \"0-digit\" to \"_0_DIGIT\",\n        \"digit-1\" to \"DIGIT_1\",\n        \"42\" to \"_42\",\n        \"àœü\" to \"ÀŒÜ\",\n        \"日本-つくば\" to \"日本_つくば\",\n      )\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n      typealias MyTypeAlias = ${cases.joinToString(\" | \") { \"\\\"${it.first}\\\"\" }}\n    \"\"\"\n          .trimIndent()\n      )\n    val kotlinClass = kotlinCode.compile().getValue(\"MyTypeAlias\")\n\n    assertThat(kotlinClass.enumValues().size)\n      .isEqualTo(cases.size) // make sure zip doesn't drop cases\n\n    assertAll(\n      kotlinClass.enumValues().zip(cases) { enumValue, (pklName, kotlinName) ->\n        {\n          assertThat(enumValue.name).isEqualTo(kotlinName)\n          assertThat(enumValue.toString()).isEqualTo(pklName)\n        }\n      }\n    )\n  }\n\n  @Test\n  fun `conflicting enum constant names`() {\n    val exception =\n      assertThrows<KotlinCodeGeneratorException> {\n        generateKotlinCode(\n          \"\"\"\n        module my.mod\n        typealias MyTypeAlias = \"foo-bar\" | \"foo bar\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n    assertThat(exception)\n      .hasMessageContainingAll(\"both be converted to enum constant name\", \"FOO_BAR\")\n  }\n\n  @Test\n  fun `empty enum constant name`() {\n    val exception =\n      assertThrows<KotlinCodeGeneratorException> {\n        generateKotlinCode(\n          \"\"\"\n        module my.mod\n        typealias MyTypeAlias = \"foo\" | \"\" | \"bar\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n    assertThat(exception).hasMessageContaining(\"cannot be converted\")\n  }\n\n  @Test\n  fun `inconvertible enum constant name`() {\n    val exception =\n      assertThrows<KotlinCodeGeneratorException> {\n        generateKotlinCode(\n          \"\"\"\n        module my.mod\n        typealias MyTypeAlias = \"foo\" | \"✅\" | \"bar\"\n      \"\"\"\n            .trimIndent()\n        )\n      }\n    assertThat(exception).hasMessageContainingAll(\"✅\", \"cannot be converted\")\n  }\n\n  @Test\n  fun `data class`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      class Person {\n        name: String\n        age: Int\n        hobbies: List<String>\n        friends: Map<String, Person>\n        sibling: Person?\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .isEqualTo(\n        \"\"\"\n        package my\n  \n        import kotlin.Long\n        import kotlin.String\n        import kotlin.collections.List\n        import kotlin.collections.Map\n  \n        object Mod {\n          data class Person(\n            val name: String,\n            val age: Long,\n            val hobbies: List<String>,\n            val friends: Map<String, Person>,\n            val sibling: Person?\n          )\n        }\n        \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `data class with Regex property has custom equals and hashCode methods`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      class Person {\n        age: Int\n        name: Regex\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\"if (this.name.pattern != other.name.pattern) return false\")\n      .contains(\"result = 31 * result + Objects.hashCode(this.name.pattern)\")\n  }\n\n  @Test\n  fun `data class with ByteArray property has custom equals and hashCode methods`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      class Foo {\n        bytes: Bytes\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\"if (!this.bytes.contentEquals(other.bytes)) return false\")\n      .contains(\"result = 31 * result + this.bytes.contentHashCode()\")\n  }\n\n  @Test\n  fun `recursive types`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo {\n        other: Int\n        bar: Bar\n      }\n      open class Bar {\n        foo: Foo\n        other: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  open class Foo(\n        |    open val other: Long,\n        |    open val bar: Bar\n        |  )\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  open class Bar(\n        |    open val foo: Foo,\n        |    open val other: String\n        |  )\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun inheritance() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo {\n        one: Int\n      }\n      open class None extends Foo {}\n      open class Bar extends None {\n        two: String\n      }\n      class Baz extends Bar {\n        three: Duration\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  open class Foo(\n        |    open val one: Long\n        |  )\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  open class None(\n        |    one: Long\n        |  ) : Foo(one)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  open class Bar(\n        |    one: Long,\n        |    open val two: String\n        |  ) : None(one)\n      \"\"\"\n          .trimMargin()\n      )\n      .isEqualToResourceFile(\"Inheritance.kotlin\")\n  }\n\n  @Test\n  fun `stateless classes`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      class Foo\n      abstract class Bar\n      class Baz extends Bar\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |  data class Foo\n      |\n      |  abstract class Bar\n      |\n      |  class Baz : Bar() {\n      |    fun copy(): Baz = Baz()\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  // https://github.com/apple/pkl/issues/569\n  @Test\n  fun `abstract classes`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      abstract class Foo { one: Int }\n      abstract class Bar extends Foo { two: String }\n      class Baz extends Bar { three: Duration }\n      class Qux extends Bar {}\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      // missing trailing `{` proves that no methods are generated\n      .contains(\n        \"\"\"\n        |  abstract class Foo(\n        |    open val one: Long\n        |  )\n      \"\"\"\n          .trimMargin()\n      )\n      // missing trailing `{` proves that no methods are generated\n      .contains(\n        \"\"\"\n        |  abstract class Bar(\n        |    one: Long,\n        |    open val two: String\n        |  ) : Foo(one)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Baz(\n        |    one: Long,\n        |    two: String,\n        |    val three: Duration\n        |  ) : Bar(one, two) {\n        |    fun copy(\n        |      one: Long = this.one,\n        |      two: String = this.two,\n        |      three: Duration = this.three\n        |    ): Baz = Baz(one, two, three)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Qux(\n        |    one: Long,\n        |    two: String\n        |  ) : Bar(one, two) {\n        |    fun copy(one: Long = this.one, two: String = this.two): Qux = Qux(one, two)\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  // https://github.com/apple/pkl/issues/569\n  @Test\n  fun `abstract class that extends open class`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo { one: Int }\n      abstract class Bar extends Foo { two: String }\n      class Baz extends Bar { three: Duration }\n      class Qux extends Bar {}\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  open class Foo(\n        |    open val one: Long\n        |  ) {\n        |    open fun copy(one: Long = this.one): Foo = Foo(one)\n      \"\"\"\n          .trimMargin()\n      )\n      // missing trailing `{` proves that no methods are generated\n      .contains(\n        \"\"\"\n        |  abstract class Bar(\n        |    one: Long,\n        |    open val two: String\n        |  ) : Foo(one)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Baz(\n        |    one: Long,\n        |    two: String,\n        |    val three: Duration\n        |  ) : Bar(one, two) {\n        |    fun copy(\n        |      one: Long = this.one,\n        |      two: String = this.two,\n        |      three: Duration = this.three\n        |    ): Baz = Baz(one, two, three)\n        |\n        |    override fun copy(one: Long): Baz = Baz(one, two, three)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Qux(\n        |    one: Long,\n        |    two: String\n        |  ) : Bar(one, two) {\n        |    fun copy(one: Long = this.one, two: String = this.two): Qux = Qux(one, two)\n        |\n        |    override fun copy(one: Long): Qux = Qux(one, two)\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  // https://github.com/apple/pkl/issues/569\n  @Test\n  fun `abstract class that extends open class without adding properties`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      open class Foo { one: Int }\n      abstract class Bar extends Foo {}\n      class Baz extends Bar { two: Duration }\n      class Qux extends Bar {}\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |  open class Foo(\n        |    open val one: Long\n        |  ) {\n        |    open fun copy(one: Long = this.one): Foo = Foo(one)\n      \"\"\"\n          .trimMargin()\n      )\n      // missing trailing `{` proves that no methods are generated\n      .contains(\n        \"\"\"\n        |  abstract class Bar(\n        |    one: Long\n        |  ) : Foo(one)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Baz(\n        |    one: Long,\n        |    val two: Duration\n        |  ) : Bar(one) {\n        |    fun copy(one: Long = this.one, two: Duration = this.two): Baz = Baz(one, two)\n        |\n        |    override fun copy(one: Long): Baz = Baz(one, two)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Qux(\n        |    one: Long\n        |  ) : Bar(one) {\n        |    override fun copy(one: Long): Qux = Qux(one)\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun keywords() {\n    val props = kotlinKeywords.joinToString(\"\\n\") { \"`$it`: Int\" }\n\n    val fooClass =\n      generateKotlinCode(\n          \"\"\"\n      module my.mod\n\n      class Foo {\n        $props\n      }\n    \"\"\"\n            .trimIndent()\n        )\n        .compile()\n        .getValue(\"Foo\")\n\n    assertThat(fooClass.declaredMemberProperties.map { it.name }).hasSameElementsAs(kotlinKeywords)\n  }\n\n  @Test\n  fun `module properties`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      pigeon: Person\n      parrot: Person\n\n      class Person {\n        name: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .isEqualTo(\n        \"\"\"\n        package my\n\n        import kotlin.String\n  \n        data class Mod(\n          val pigeon: Person,\n          val parrot: Person\n        ) {\n          data class Person(\n            val name: String\n          )\n        }\n        \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `simple module name`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      pigeon: Person\n      parrot: Person\n\n      class Person {\n        name: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .isEqualTo(\n        \"\"\"\n        import kotlin.String\n\n        data class Mod(\n          val pigeon: Person,\n          val parrot: Person\n        ) {\n          data class Person(\n            val name: String\n          )\n        }\n        \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `hidden properties`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      hidden pigeon1: String\n      parrot1: String\n\n      class Persons {\n        hidden pigeon2: String\n        parrot2: String\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .doesNotContain(\"pigeon1: String\")\n      .contains(\"parrot1: String\")\n      .doesNotContain(\"pigeon2: String\")\n      .contains(\"parrot2: String\")\n  }\n\n  @Test\n  fun kdoc() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      /// module comment.\n      /// *emphasized* `code`.\n      module my.mod\n\n      /// module property comment.\n      /// *emphasized* `code`.\n      pigeon: Person\n\n      /// class comment.\n      /// *emphasized* `code`.\n      open class Product {\n        /// class property comment.\n        /// *emphasized* `code`.\n        price: String\n      }\n\n      /// class comment.\n      /// *emphasized* `code`.\n      class Person {\n        /// class property comment.\n        /// *emphasized* `code`.\n        name: String\n      }\n\n      /// type alias comment.\n      /// *emphasized* `code`.\n      typealias Email = String(contains(\"@\"))\n    \"\"\"\n          .trimIndent(),\n        generateKdoc = true,\n      )\n\n    assertThat(kotlinCode).compilesSuccessfully().isEqualToResourceFile(\"Kdoc.kotlin\")\n  }\n\n  @Test\n  fun `kdoc 2`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      /// module comment.\n      /// *emphasized* `code`.\n      module my.mod\n\n      class Product\n    \"\"\"\n          .trimIndent(),\n        generateKdoc = true,\n      )\n\n    assertThat(kotlinCode)\n      .isEqualTo(\n        \"\"\"\n      package my\n\n      /**\n       * module comment.\n       * *emphasized* `code`.\n       */\n      object Mod {\n        data class Product\n      }\n      \n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `pkl_base type aliases`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      uint8: UInt8\n      uint16: UInt16\n      uint32: UInt32\n      uint: UInt\n      int8: Int8\n      int16: Int16\n      int32: Int32\n      uri: Uri\n\n      pair: Pair<UInt8, UInt16>\n      list: List<UInt32>\n      set: Set<UInt>\n      map: Map<Int8, Int16>\n      listing: Listing<Int32>\n      mapping: Mapping<Uri, UInt8>\n      nullable: UInt16?\n\n      class Foo {\n        uint8: UInt8\n        uint16: UInt16\n        uint32: UInt32\n        uint: UInt\n        int8: Int8\n        int16: Int16\n        int32: Int32\n        uri: Uri\n        list: List<UInt>\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .isEqualTo(\n        \"\"\"\n        import java.net.URI\n        import kotlin.Byte\n        import kotlin.Int\n        import kotlin.Long\n        import kotlin.Pair\n        import kotlin.Short\n        import kotlin.collections.List\n        import kotlin.collections.Map\n        import kotlin.collections.Set\n  \n        data class Mod(\n          val uint8: Short,\n          val uint16: Int,\n          val uint32: Long,\n          val uint: Long,\n          val int8: Byte,\n          val int16: Short,\n          val int32: Int,\n          val uri: URI,\n          val pair: Pair<Short, Int>,\n          val list: List<Long>,\n          val set: Set<Long>,\n          val map: Map<Byte, Short>,\n          val listing: List<Int>,\n          val mapping: Map<URI, Short>,\n          val nullable: Int?\n        ) {\n          data class Foo(\n            val uint8: Short,\n            val uint16: Int,\n            val uint32: Long,\n            val uint: Long,\n            val int8: Byte,\n            val int16: Short,\n            val int32: Int,\n            val uri: URI,\n            val list: List<Long>\n          )\n        }\n        \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `user defined type aliases`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      typealias Simple = String\n      typealias Constrained = String(length >= 3)\n      typealias Parameterized = List<Int(nonZero)>\n      typealias Recursive1 = Parameterized(nonEmpty)\n      typealias Recursive2 = List<Constrained>\n\n      simple: Simple\n      constrained: Constrained\n      parameterized: Parameterized\n      recursive1: Recursive1\n      recursive2: Recursive2\n\n      class Foo {\n        simple: Simple\n        constrained: Constrained\n        parameterized: Parameterized\n        recursive1: Recursive1\n        recursive2: Recursive2\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .isEqualTo(\n        \"\"\"\n        import kotlin.Long\n        import kotlin.String\n        import kotlin.collections.List\n  \n        typealias Simple = String\n  \n        typealias Constrained = String\n  \n        typealias Parameterized = List<Long>\n  \n        typealias Recursive1 = Parameterized\n  \n        typealias Recursive2 = List<Constrained>\n  \n        data class Mod(\n          val simple: Simple,\n          val constrained: Constrained,\n          val parameterized: Parameterized,\n          val recursive1: Recursive1,\n          val recursive2: Recursive2\n        ) {\n          data class Foo(\n            val simple: Simple,\n            val constrained: Constrained,\n            val parameterized: Parameterized,\n            val recursive1: Recursive1,\n            val recursive2: Recursive2\n          )\n        }\n        \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun genericTypeAliases() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      class Person { name: String }\n\n      typealias List2<E> = List<E>\n      typealias Map2<V, K> = Map<K, V>\n      typealias StringMap<V> = Map<String, V>\n      typealias MMap<X> = Map<X, X>\n\n      res1: List2<Int>\n      res2: List2<List2<String>>\n      res3: Map2<String, Int>\n      res4: StringMap<Duration>\n      res5: MMap<Person?>\n\n      res6: List2\n      res7: Map2\n      res8: StringMap\n      res9: MMap\n\n      class Foo {\n        res1: List2<Int>\n        res2: List2<List2<String>>\n        res3: Map2<String, Int>\n        res4: StringMap<Duration>\n        res5: MMap<Person?>\n\n        res6: List2\n        res7: Map2\n        res8: StringMap\n        res9: MMap\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |data class Mod(\n        |  val res1: List2<Long>,\n        |  val res2: List2<List2<String>>,\n        |  val res3: Map2<String, Long>,\n        |  val res4: StringMap<Duration>,\n        |  val res5: MMap<Person?>,\n        |  val res6: List2<Any?>,\n        |  val res7: Map2<Any?, Any?>,\n        |  val res8: StringMap<Any?>,\n        |  val res9: MMap<Any?>\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  data class Foo(\n        |    val res1: List2<Long>,\n        |    val res2: List2<List2<String>>,\n        |    val res3: Map2<String, Long>,\n        |    val res4: StringMap<Duration>,\n        |    val res5: MMap<Person?>,\n        |    val res6: List2<Any?>,\n        |    val res7: Map2<Any?, Any?>,\n        |    val res8: StringMap<Any?>,\n        |    val res9: MMap<Any?>\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `union of string literals`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      x: \"Pigeon\"|\"Barn Owl\"|\"Parrot\"\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .compilesSuccessfully()\n      .contains(\n        \"\"\"\n        |data class Mod(\n        |  val x: String\n        |)\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `other union type`() {\n    val e =\n      assertThrows<KotlinCodeGeneratorException> {\n        generateKotlinCode(\n          \"\"\"\n          module mod\n  \n          x: \"Pigeon\"|Int|\"Parrot\"\n        \"\"\"\n            .trimIndent()\n        )\n      }\n    assertThat(e).hasMessageContaining(\"Pkl union types are not supported\")\n  }\n\n  @Test\n  fun `stringy type`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      v1: \"RELEASE\"\n      v2: \"RELEASE\"|String\n      v3: String|\"RELEASE\"\n      v4: \"RELEASE\"|String|\"LATEST\"\n      v5: Version|String|\"LATEST\"\n      v6: (Version|String)|(\"LATEST\"|String)\n      \n      typealias Version = \"RELEASE\"|String|\"LATEST\"\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\"v1: String\")\n      .contains(\"v2: String\")\n      .contains(\"v3: String\")\n      .contains(\"v4: String\")\n      .contains(\"v5: String\")\n      .contains(\"v6: String\")\n  }\n\n  @Test\n  fun `stringy type alias`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      typealias Version1 = \"RELEASE\"|String\n      typealias Version2 = String|\"RELEASE\"\n      typealias Version3 = \"RELEASE\"|String|\"LATEST\"\n      typealias Version4 = Version3|String|\"LATEST\" // ideally wouldn't be inlined\n      typealias Version5 = (Version4|String)|(\"LATEST\"|String)\n      typealias Version6 = Version5 // not inlined\n    \"\"\"\n          .trimIndent()\n      )\n\n    assertThat(kotlinCode)\n      .contains(\"typealias Version1 = String\")\n      .contains(\"typealias Version2 = String\")\n      .contains(\"typealias Version3 = String\")\n      .contains(\"typealias Version4 = String\")\n      .contains(\"typealias Version5 = String\")\n      .contains(\"typealias Version6 = Version5\")\n  }\n\n  @Test\n  fun `spring boot config`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module my.mod\n\n      server: Server\n\n      class Server {\n        port: Int\n        urls: Listing<Uri>\n      }\n    \"\"\"\n          .trimIndent(),\n        generateSpringBootConfig = true,\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n        |@ConfigurationProperties\n        |data class Mod(\n        |  val server: Server\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  @ConfigurationProperties(\"server\")\n        |  data class Server(\n        |    val port: Long,\n        |    val urls: List<URI>\n      \"\"\"\n          .trimMargin()\n      )\n      .doesNotContain(\"@ConstructorBinding\")\n\n    // not worthwhile to add spring & spring boot dependency just so that this test can compile\n    // their annotations\n    val kotlinCodeWithoutSpringAnnotations =\n      kotlinCode.deleteLines { it.contains(\"ConfigurationProperties\") }\n    assertThat(kotlinCodeWithoutSpringAnnotations).compilesSuccessfully()\n  }\n\n  @Test\n  fun `import module`() {\n    val library =\n      PklModule(\n        \"library\",\n        \"\"\"\n          module library\n    \n          class Person { name: String; age: Int }\n          \n          pigeon: Person\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val client =\n      PklModule(\n        \"client\",\n        \"\"\"\n          module client\n          \n          import \"library.pkl\"\n          \n          lib: library\n          \n          parrot: library.Person\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val kotlinSourceFiles = generateFiles(library, client)\n    assertDoesNotThrow {\n      InMemoryKotlinCompiler.compile(kotlinSourceFiles.mapValues { it.value.text })\n    }\n\n    val kotlinClientCode =\n      kotlinSourceFiles.entries.find { (fileName, _) -> fileName.endsWith(\"Client.kt\") }!!.value\n\n    assertThat(kotlinClientCode)\n      .contains(\n        \"\"\"\n        |data class Client(\n        |  val lib: Library,\n        |  val parrot: Library.Person\n        |)\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `extend module`() {\n    val base =\n      PklModule(\n        \"base\",\n        \"\"\"\n          open module base\n    \n          open class Person { name: String }\n    \n          pigeon: Person\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val derived =\n      PklModule(\n        \"derived\",\n        \"\"\"\n          module derived\n          extends \"base.pkl\"\n          \n          class Person2 extends Person { age: Int }\n          \n          person1: Person\n          person2: Person2\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val kotlinSourceFiles = generateFiles(base, derived)\n    assertDoesNotThrow {\n      InMemoryKotlinCompiler.compile(kotlinSourceFiles.mapValues { it.value.text })\n    }\n\n    val kotlinDerivedCode =\n      kotlinSourceFiles.entries.find { (filename, _) -> filename.endsWith(\"Derived.kt\") }!!.value\n\n    assertThat(kotlinDerivedCode)\n      .contains(\n        \"\"\"\n        |class Derived(\n        |  pigeon: Base.Person,\n        |  val person1: Base.Person,\n        |  val person2: Person2\n        |) : Base(pigeon)\n      \"\"\"\n          .trimMargin()\n      )\n      .contains(\n        \"\"\"\n        |  class Person2(\n        |    name: String,\n        |    val age: Long\n        |  ) : Base.Person(name)\n      \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `empty module`() {\n    val kotlinCode = generateKotlinCode(\"module mod\")\n    assertThat(kotlinCode).isEqualTo(\"object Mod\\n\")\n  }\n\n  @Test\n  fun `extend module that only contains type aliases`() {\n    val moduleOne =\n      PklModule(\n        \"base\",\n        \"\"\"\n          abstract module base\n    \n          typealias Version = \"LATEST\"|String\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val moduleTwo =\n      PklModule(\n        \"derived\",\n        \"\"\"\n          module derived\n          \n          extends \"base.pkl\"\n          \n          v: Version = \"1.2.3\"\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val kotlinSourceFiles = generateFiles(moduleOne, moduleTwo)\n    assertDoesNotThrow {\n      InMemoryKotlinCompiler.compile(kotlinSourceFiles.mapValues { it.value.text })\n    }\n\n    val kotlinDerivedCode =\n      kotlinSourceFiles.entries.find { (filename, _) -> filename.endsWith(\"Derived.kt\") }!!.value\n    assertThat(kotlinDerivedCode)\n      .contains(\n        \"\"\"\n      |class Derived(\n      |  val v: Version\n      |) : Base()\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `generated properties files`() {\n    val pklModule =\n      PklModule(\n        \"Mod.pkl\",\n        \"\"\"\n          module org.pkl.Mod\n    \n          foo: Foo\n    \n          bar: Bar\n    \n          class Foo {\n            prop: String\n          }\n    \n          class Bar {\n            prop: Int\n          }\n        \"\"\"\n          .trimIndent(),\n      )\n    val generated = generateFiles(pklModule)\n    val expectedPropertyFile =\n      \"resources/META-INF/org/pkl/config/java/mapper/classes/org.pkl.Mod.properties\"\n    assertThat(generated).containsKey(expectedPropertyFile)\n    val propertyFileContents = generated[expectedPropertyFile]!!\n    assertThat(propertyFileContents)\n      .contains(\"org.pkl.config.java.mapper.org.pkl.Mod\\\\#ModuleClass=org.pkl.Mod\")\n      .contains(\"org.pkl.config.java.mapper.org.pkl.Mod\\\\#Foo=org.pkl.Mod\\$Foo\")\n      .contains(\"org.pkl.config.java.mapper.org.pkl.Mod\\\\#Bar=org.pkl.Mod\\$Bar\")\n  }\n\n  @Test\n  fun `generates serializable classes`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n      module mod\n\n      class BigStruct {\n        boolean: Boolean\n        int: Int\n        float: Float\n        string: String\n        duration: Duration\n        dataSize: DataSize\n        pair: Pair\n        pair2: Pair<String, SmallStruct>\n        coll: Collection\n        coll2: Collection<SmallStruct>\n        list: List\n        list2: List<SmallStruct>\n        set: Set\n        set2: Set<SmallStruct>\n        map: Map\n        map2: Map<String, SmallStruct>\n        container: Mapping\n        container2: Mapping<String, SmallStruct>\n        other: SmallStruct\n        regex: Regex\n        nonNull: NonNull\n        enum: Direction\n      }\n\n      class SmallStruct {\n        name: String\n      }\n\n      typealias Direction = \"north\"|\"east\"|\"south\"|\"west\"\n      \n      abstract class NotSerializable\n    \"\"\"\n          .trimIndent(),\n        implementSerializable = true,\n      )\n\n    assertThat(kotlinCode)\n      .contains(\": Serializable\")\n      .contains(\"private const val serialVersionUID: Long = 0L\")\n      .contains(\"abstract class NotSerializable\\n\")\n\n    val classes = kotlinCode.compile()\n    val enumClass = classes.getValue(\"Direction\")\n    val enumValue = enumClass.java.enumConstants.first()\n\n    val smallStructCtor = classes.getValue(\"SmallStruct\").constructors.first()\n    val smallStruct = smallStructCtor.call(\"pigeon\")\n\n    val bigStructCtor = classes.getValue(\"BigStruct\").constructors.first()\n    val bigStruct =\n      bigStructCtor.call(\n        true,\n        42L,\n        42.3,\n        \"string\",\n        Duration(5.0, DurationUnit.MINUTES),\n        DataSize(3.0, DataSizeUnit.GIGABYTES),\n        kotlin.Pair(1, 2),\n        kotlin.Pair(\"pigeon\", smallStruct),\n        listOf(1, 2, 3),\n        listOf(smallStruct, smallStruct),\n        listOf(1, 2, 3),\n        listOf(smallStruct, smallStruct),\n        setOf(1, 2, 3),\n        setOf(smallStruct, smallStruct),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to smallStruct, \"two\" to smallStruct),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to smallStruct, \"two\" to smallStruct),\n        smallStruct,\n        Regex(\"(i?)\\\\w*\"),\n        smallStruct,\n        enumValue,\n      )\n\n    fun confirmSerDe(instance: Any) {\n      var restoredInstance: Any? = null\n\n      assertThatCode {\n          // serialize\n          val baos = ByteArrayOutputStream()\n          val oos = ObjectOutputStream(baos)\n          oos.writeObject(instance)\n          oos.flush()\n\n          // deserialize\n          val bais = ByteArrayInputStream(baos.toByteArray())\n          val ois =\n            object : ObjectInputStream(bais) {\n              override fun resolveClass(desc: ObjectStreamClass?): Class<*> {\n                return Class.forName(desc!!.name, false, instance.javaClass.classLoader)\n              }\n            }\n          restoredInstance = ois.readObject()\n        }\n        .doesNotThrowAnyException()\n\n      assertThat(restoredInstance!!).isEqualTo(instance)\n    }\n\n    confirmSerDe(enumValue)\n    confirmSerDe(smallStruct)\n    confirmSerDe(bigStruct)\n  }\n\n  @Test\n  fun `generates serializable module classes`() {\n    val kotlinCode =\n      generateKotlinCode(\n        \"\"\"\n        module Person\n        \n        address: Address\n        \n        class Address {\n          street: String\n        }\n      \"\"\",\n        implementSerializable = true,\n      )\n\n    assertThat(kotlinCode)\n      .contains(\n        \"\"\"\n      |data class Person(\n      |  val address: Address\n      |) : Serializable {\n      |  data class Address(\n      |    val street: String\n      |  ) : Serializable {\n      |    companion object {\n      |      private const val serialVersionUID: Long = 0L\n      |    }\n      |  }\n      |\n      |  companion object {\n      |    private const val serialVersionUID: Long = 0L\n      |  }\n      |}\n    \"\"\"\n          .trimMargin()\n      )\n  }\n\n  @Test\n  fun `encoded file paths`() {\n    val kotlinCode =\n      generateFiles(\n        PklModule(\n          \"FooBar.pkl\",\n          \"\"\"\n            module `Foo*Bar`\n            \n            someProp: String\n          \"\"\"\n            .trimIndent(),\n        )\n      )\n    assertThat(kotlinCode).containsKey(\"kotlin/Foo(2a)Bar.kt\")\n  }\n\n  @Test\n  fun `override names in a standalone module`() {\n    val files =\n      KotlinCodeGeneratorOptions(\n          renames = mapOf(\"a.b.c\" to \"x.y.z\", \"d.e.f.AnotherModule\" to \"u.v.w.RenamedModule\")\n        )\n        .generateFiles(\n          \"MyModule.pkl\" to\n            \"\"\"\n              module a.b.c.MyModule\n              \n              foo: String = \"abc\"\n            \"\"\"\n              .trimIndent(),\n          \"AnotherModule.pkl\" to\n            \"\"\"\n              module d.e.f.AnotherModule\n              \n              bar: Int = 123\n            \"\"\"\n              .trimIndent(),\n        )\n        .toMutableMap()\n\n    files.validateContents(\n      \"kotlin/x/y/z/MyModule.kt\" to listOf(\"package x.y.z\", \"data class MyModule(\"),\n      \"$MAPPER_PREFIX/a.b.c.MyModule.properties\" to\n        listOf(\"org.pkl.config.java.mapper.a.b.c.MyModule\\\\#ModuleClass=x.y.z.MyModule\"),\n      // ---\n      \"kotlin/u/v/w/RenamedModule.kt\" to listOf(\"package u.v.w\", \"data class RenamedModule(\"),\n      \"$MAPPER_PREFIX/d.e.f.AnotherModule.properties\" to\n        listOf(\"org.pkl.config.java.mapper.d.e.f.AnotherModule\\\\#ModuleClass=u.v.w.RenamedModule\"),\n    )\n  }\n\n  @Test\n  fun `override names based on the longest prefix`() {\n    val files =\n      KotlinCodeGeneratorOptions(\n          renames = mapOf(\"com.foo.bar.\" to \"x.\", \"com.foo.\" to \"y.\", \"com.\" to \"z.\", \"\" to \"w.\")\n        )\n        .generateFiles(\n          \"com/foo/bar/Module1\" to\n            \"\"\"\n              module com.foo.bar.Module1\n              \n              bar: String\n            \"\"\"\n              .trimIndent(),\n          \"com/Module2\" to\n            \"\"\"\n              module com.Module2\n              \n              com: String\n            \"\"\"\n              .trimIndent(),\n          \"org/baz/Module3\" to\n            \"\"\"\n              module org.baz.Module3\n              \n              baz: String\n            \"\"\"\n              .trimIndent(),\n        )\n        .toMutableMap()\n\n    files.validateContents(\n      \"kotlin/x/Module1.kt\" to listOf(\"package x\", \"data class Module1(\"),\n      \"$MAPPER_PREFIX/com.foo.bar.Module1.properties\" to\n        listOf(\"org.pkl.config.java.mapper.com.foo.bar.Module1\\\\#ModuleClass=x.Module1\"),\n      // ---\n      \"kotlin/z/Module2.kt\" to listOf(\"package z\", \"data class Module2(\"),\n      \"$MAPPER_PREFIX/com.Module2.properties\" to\n        listOf(\"org.pkl.config.java.mapper.com.Module2\\\\#ModuleClass=z.Module2\"),\n      // ---\n      \"kotlin/w/org/baz/Module3.kt\" to listOf(\"package w.org.baz\", \"data class Module3(\"),\n      \"$MAPPER_PREFIX/org.baz.Module3.properties\" to\n        listOf(\"org.pkl.config.java.mapper.org.baz.Module3\\\\#ModuleClass=w.org.baz.Module3\"),\n    )\n  }\n\n  @Test\n  fun `override names in multiple modules using each other`() {\n    val files =\n      KotlinCodeGeneratorOptions(\n          renames =\n            mapOf(\n              \"org.foo\" to \"com.foo.x\",\n              \"org.bar.Module2\" to \"org.bar.RenamedModule\",\n              \"org.baz\" to \"com.baz.a.b\",\n            )\n        )\n        .generateFiles(\n          \"org/foo/Module1\" to\n            \"\"\"\n              module org.foo.Module1\n              \n              class Person {\n                name: String\n              }\n            \"\"\"\n              .trimIndent(),\n          \"org/bar/Module2\" to\n            \"\"\"\n              module org.bar.Module2\n              \n              import \"../../org/foo/Module1.pkl\"\n\n              class Group {\n                owner: Module1.Person\n                name: String\n              }\n            \"\"\"\n              .trimIndent(),\n          \"org/baz/Module3\" to\n            \"\"\"\n              module org.baz.Module3\n              \n              import \"../../org/bar/Module2.pkl\"\n\n              class Supergroup {\n                owner: Module2.Group\n              }\n            \"\"\"\n              .trimIndent(),\n        )\n\n    files.validateContents(\n      \"kotlin/com/foo/x/Module1.kt\" to\n        listOf(\"package com.foo.x\", \"object Module1 {\", \"data class Person(\"),\n      \"$MAPPER_PREFIX/org.foo.Module1.properties\" to\n        listOf(\n          \"org.pkl.config.java.mapper.org.foo.Module1\\\\#ModuleClass=com.foo.x.Module1\",\n          \"org.pkl.config.java.mapper.org.foo.Module1\\\\#Person=com.foo.x.Module1${'$'}Person\",\n        ),\n      // ---\n      \"kotlin/org/bar/RenamedModule.kt\" to\n        listOf(\n          \"package org.bar\",\n          \"import com.foo.x.Module1\",\n          \"object RenamedModule {\",\n          \"val owner: Module1.Person\",\n        ),\n      \"$MAPPER_PREFIX/org.bar.Module2.properties\" to\n        listOf(\n          \"org.pkl.config.java.mapper.org.bar.Module2\\\\#ModuleClass=org.bar.RenamedModule\",\n          \"org.pkl.config.java.mapper.org.bar.Module2\\\\#Group=org.bar.RenamedModule${'$'}Group\",\n        ),\n      // ---\n      \"kotlin/com/baz/a/b/Module3.kt\" to\n        listOf(\n          \"package com.baz.a.b\",\n          \"import org.bar.RenamedModule\",\n          \"object Module3 {\",\n          \"val owner: RenamedModule.Group\",\n        ),\n      \"$MAPPER_PREFIX/org.baz.Module3.properties\" to\n        listOf(\n          \"org.pkl.config.java.mapper.org.baz.Module3\\\\#ModuleClass=com.baz.a.b.Module3\",\n          \"org.pkl.config.java.mapper.org.baz.Module3\\\\#Supergroup=com.baz.a.b.Module3${'$'}Supergroup\",\n        ),\n    )\n  }\n\n  @Test\n  fun `do not capitalize names of renamed classes`() {\n    val files =\n      KotlinCodeGeneratorOptions(\n          renames = mapOf(\"a.b.c.MyModule\" to \"x.y.z.renamed_module\", \"d.e.f.\" to \"u.v.w.\")\n        )\n        .generateFiles(\n          \"MyModule.pkl\" to\n            \"\"\"\n              module a.b.c.MyModule\n              \n              foo: String = \"abc\"\n            \"\"\"\n              .trimIndent(),\n          \"lower_module.pkl\" to\n            \"\"\"\n              module d.e.f.lower_module \n              \n              bar: Int = 123\n            \"\"\"\n              .trimIndent(),\n        )\n\n    files.validateContents(\n      \"kotlin/x/y/z/renamed_module.kt\" to listOf(\"package x.y.z\", \"data class renamed_module(\"),\n      \"$MAPPER_PREFIX/a.b.c.MyModule.properties\" to\n        listOf(\"org.pkl.config.java.mapper.a.b.c.MyModule\\\\#ModuleClass=x.y.z.renamed_module\"),\n      // ---\n      \"kotlin/u/v/w/Lower_module.kt\" to listOf(\"package u.v.w\", \"data class Lower_module(\"),\n      \"$MAPPER_PREFIX/d.e.f.lower_module.properties\" to\n        listOf(\"org.pkl.config.java.mapper.d.e.f.lower_module\\\\#ModuleClass=u.v.w.Lower_module\"),\n    )\n  }\n\n  @Test\n  fun `add generated annotation`() {\n    val files =\n      KotlinCodeGeneratorOptions(addGeneratedAnnotation = true)\n        .generateFiles(\"com.example.MyModule\" to \"foo: String\")\n    assertThat(files).containsKey(\"kotlin/com/example/MyModule.kt\")\n    assertThat(files[\"kotlin/com/example/MyModule.kt\"])\n      .isEqualTo(\n        \"\"\"\n      package com.example\n\n      import kotlin.String\n      import org.pkl.config.java.Generated\n\n      @Generated\n      data class MyModule(\n        val foo: String\n      )\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  private fun Map<String, String>.validateContents(\n    @Suppress(\"RemoveRedundantQualifierName\") vararg assertions: kotlin.Pair<String, List<String>>\n  ) {\n    val files = toMutableMap()\n\n    for ((fileName, lines) in assertions) {\n      assertThat(files).containsKey(fileName)\n      assertThat(files.remove(fileName)).describedAs(\"Contents of $fileName\").contains(lines)\n    }\n\n    assertThat(files).isEmpty()\n  }\n\n  private fun KotlinCodeGeneratorOptions.generateFiles(\n    vararg pklModules: PklModule\n  ): Map<String, String> {\n    val pklFiles = pklModules.map { it.writeToDisk(tempDir.resolve(\"pkl/${it.name}.pkl\")) }\n    val evaluator = Evaluator.preconfigured()\n    return pklFiles.fold(mapOf()) { acc, pklFile ->\n      val pklSchema = evaluator.evaluateSchema(ModuleSource.path(pklFile))\n      val generator = KotlinCodeGenerator(pklSchema, this)\n      acc + generator.output\n    }\n  }\n\n  private fun KotlinCodeGeneratorOptions.generateFiles(\n    @Suppress(\"RemoveRedundantQualifierName\") vararg pklModules: kotlin.Pair<String, String>\n  ): Map<String, String> =\n    generateFiles(*pklModules.map { (name, text) -> PklModule(name, text) }.toTypedArray())\n\n  private fun generateFiles(vararg pklModules: PklModule): Map<String, KotlinSourceCode> =\n    KotlinCodeGeneratorOptions().generateFiles(*pklModules).mapValues { KotlinSourceCode(it.value) }\n\n  private fun instantiateOtherAndPropertyTypes(): kotlin.Pair<Any, Any> {\n    val otherCtor = propertyTypesClasses.getValue(\"Other\").constructors.first()\n    val other = otherCtor.call(\"pigeon\")\n\n    val enumClass = propertyTypesClasses.getValue(\"Direction\").java\n    val enumValue = enumClass.enumConstants.first()\n\n    val propertyTypesCtor = propertyTypesClasses.getValue(\"PropertyTypes\").constructors.first()\n    val propertyTypes =\n      propertyTypesCtor.call(\n        true,\n        42,\n        42.3,\n        \"string\",\n        Duration(5.0, DurationUnit.MINUTES),\n        DurationUnit.MINUTES,\n        DataSize(3.0, DataSizeUnit.GIGABYTES),\n        DataSizeUnit.GIGABYTES,\n        \"idea\",\n        null,\n        kotlin.Pair(1, 2),\n        kotlin.Pair(\"pigeon\", other),\n        listOf(1, 2),\n        listOf(other, other),\n        listOf(1, 2),\n        listOf(other, other),\n        setOf(1, 2),\n        setOf(other),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to other, \"two\" to other),\n        mapOf(1 to \"one\", 2 to \"two\"),\n        mapOf(\"one\" to other, \"two\" to other),\n        other,\n        Regex(\"(i?)\\\\w*\"),\n        other,\n        other,\n        enumValue,\n        byteArrayOf(1, 2, 3, 4),\n      )\n\n    return other to propertyTypes\n  }\n\n  private fun assertThat(actual: KotlinSourceCode): KotlinSourceCodeAssert =\n    KotlinSourceCodeAssert(actual)\n\n  private class KotlinSourceCodeAssert(actual: KotlinSourceCode) :\n    AbstractAssert<KotlinSourceCodeAssert, KotlinSourceCode>(\n      actual,\n      KotlinSourceCodeAssert::class.java,\n    ) {\n    fun contains(expected: String): KotlinSourceCodeAssert {\n      if (!actual.text.contains(expected)) {\n        // check for equality to get better error output (IDE diff dialog)\n        assertThat(actual.text).isEqualTo(expected)\n      }\n      return this\n    }\n\n    fun doesNotContain(expected: String): KotlinSourceCodeAssert {\n      assertThat(actual.text).doesNotContain(expected)\n      return this\n    }\n\n    fun compilesSuccessfully(): KotlinSourceCodeAssert {\n      assertThatCode { actual.compile() }.doesNotThrowAnyException()\n      return this\n    }\n\n    fun isEqualTo(expected: String): KotlinSourceCodeAssert {\n      assertThat(actual.text).isEqualTo(expected)\n      return this\n    }\n\n    fun isEqualToResourceFile(fileName: String): KotlinSourceCodeAssert {\n      isEqualTo(IoUtils.readClassPathResourceAsString(javaClass, fileName))\n      return this\n    }\n  }\n\n  data class KotlinSourceCode(val text: String) {\n    fun compile(): Map<String, KClass<*>> =\n      InMemoryKotlinCompiler.compile(mapOf(\"my/Mod.kt\" to text))\n\n    fun deleteLines(predicate: (String) -> Boolean): KotlinSourceCode =\n      KotlinSourceCode(text.lines().filterNot(predicate).joinToString(\"\\n\"))\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/PklModule.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.codegen.kotlin\n\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.commons.writeString\n\ndata class PklModule(val name: String, val content: String) {\n  fun writeToDisk(path: Path): Path {\n    return path.createParentDirectories().writeString(content)\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/resources/org/pkl/codegen/kotlin/Inheritance.kotlin",
    "content": "package my\n\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Int\nimport kotlin.Long\nimport kotlin.String\nimport org.pkl.core.Duration\n\nobject Mod {\n  open class Foo(\n    open val one: Long\n  ) {\n    open fun copy(one: Long = this.one): Foo = Foo(one)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as Foo\n      if (this.one != other.one) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.one)\n      return result\n    }\n\n    override fun toString(): String = \"\"\"Foo(one=$one)\"\"\"\n  }\n\n  open class None(\n    one: Long\n  ) : Foo(one) {\n    open override fun copy(one: Long): None = None(one)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as None\n      if (this.one != other.one) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.one)\n      return result\n    }\n\n    override fun toString(): String = \"\"\"None(one=$one)\"\"\"\n  }\n\n  open class Bar(\n    one: Long,\n    open val two: String\n  ) : None(one) {\n    open fun copy(one: Long = this.one, two: String = this.two): Bar = Bar(one, two)\n\n    open override fun copy(one: Long): Bar = Bar(one, two)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as Bar\n      if (this.one != other.one) return false\n      if (this.two != other.two) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.one)\n      result = 31 * result + Objects.hashCode(this.two)\n      return result\n    }\n\n    override fun toString(): String = \"\"\"Bar(one=$one, two=$two)\"\"\"\n  }\n\n  class Baz(\n    one: Long,\n    two: String,\n    val three: Duration\n  ) : Bar(one, two) {\n    fun copy(\n      one: Long = this.one,\n      two: String = this.two,\n      three: Duration = this.three\n    ): Baz = Baz(one, two, three)\n\n    override fun copy(one: Long, two: String): Baz = Baz(one, two, three)\n\n    override fun copy(one: Long): Baz = Baz(one, two, three)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as Baz\n      if (this.one != other.one) return false\n      if (this.two != other.two) return false\n      if (this.three != other.three) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.one)\n      result = 31 * result + Objects.hashCode(this.two)\n      result = 31 * result + Objects.hashCode(this.three)\n      return result\n    }\n\n    override fun toString(): String = \"\"\"Baz(one=$one, two=$two, three=$three)\"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/resources/org/pkl/codegen/kotlin/Kdoc.kotlin",
    "content": "package my\n\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.Int\nimport kotlin.String\n\n/**\n * type alias comment.\n * *emphasized* `code`.\n */\ntypealias Email = String\n\n/**\n * module comment.\n * *emphasized* `code`.\n */\ndata class Mod(\n  /**\n   * module property comment.\n   * *emphasized* `code`.\n   */\n  val pigeon: Person\n) {\n  /**\n   * class comment.\n   * *emphasized* `code`.\n   */\n  open class Product(\n    /**\n     * class property comment.\n     * *emphasized* `code`.\n     */\n    open val price: String\n  ) {\n    open fun copy(price: String = this.price): Product = Product(price)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as Product\n      if (this.price != other.price) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.price)\n      return result\n    }\n\n    override fun toString(): String = \"\"\"Product(price=$price)\"\"\"\n  }\n\n  /**\n   * class comment.\n   * *emphasized* `code`.\n   */\n  data class Person(\n    /**\n     * class property comment.\n     * *emphasized* `code`.\n     */\n    val name: String\n  )\n}\n"
  },
  {
    "path": "pkl-codegen-kotlin/src/test/resources/org/pkl/codegen/kotlin/PropertyTypes.kotlin",
    "content": "package my\n\nimport java.util.Arrays\nimport java.util.Objects\nimport kotlin.Any\nimport kotlin.Boolean\nimport kotlin.ByteArray\nimport kotlin.Double\nimport kotlin.Int\nimport kotlin.Long\nimport kotlin.Pair\nimport kotlin.String\nimport kotlin.collections.Collection\nimport kotlin.collections.List\nimport kotlin.collections.Map\nimport kotlin.collections.Set\nimport kotlin.text.Regex\nimport org.pkl.core.DataSize\nimport org.pkl.core.DataSizeUnit\nimport org.pkl.core.Duration\nimport org.pkl.core.DurationUnit\n\nobject Mod {\n  open class PropertyTypes(\n    open val boolean: Boolean,\n    open val int: Long,\n    open val float: Double,\n    open val string: String,\n    open val duration: Duration,\n    open val durationUnit: DurationUnit,\n    open val dataSize: DataSize,\n    open val dataSizeUnit: DataSizeUnit,\n    open val nullable: String?,\n    open val nullable2: String?,\n    open val pair: Pair<Any?, Any?>,\n    open val pair2: Pair<String, Other>,\n    open val coll: Collection<Any?>,\n    open val coll2: Collection<Other>,\n    open val list: List<Any?>,\n    open val list2: List<Other>,\n    open val set: Set<Any?>,\n    open val set2: Set<Other>,\n    open val map: Map<Any?, Any?>,\n    open val map2: Map<String, Other>,\n    open val container: Map<Any?, Any?>,\n    open val container2: Map<String, Other>,\n    open val other: Other,\n    open val regex: Regex,\n    open val any: Any?,\n    open val nonNull: Any,\n    open val enum: Direction,\n    open val bytes: ByteArray\n  ) {\n    open fun copy(\n      boolean: Boolean = this.boolean,\n      int: Long = this.int,\n      float: Double = this.float,\n      string: String = this.string,\n      duration: Duration = this.duration,\n      durationUnit: DurationUnit = this.durationUnit,\n      dataSize: DataSize = this.dataSize,\n      dataSizeUnit: DataSizeUnit = this.dataSizeUnit,\n      nullable: String? = this.nullable,\n      nullable2: String? = this.nullable2,\n      pair: Pair<Any?, Any?> = this.pair,\n      pair2: Pair<String, Other> = this.pair2,\n      coll: Collection<Any?> = this.coll,\n      coll2: Collection<Other> = this.coll2,\n      list: List<Any?> = this.list,\n      list2: List<Other> = this.list2,\n      set: Set<Any?> = this.set,\n      set2: Set<Other> = this.set2,\n      map: Map<Any?, Any?> = this.map,\n      map2: Map<String, Other> = this.map2,\n      container: Map<Any?, Any?> = this.container,\n      container2: Map<String, Other> = this.container2,\n      other: Other = this.other,\n      regex: Regex = this.regex,\n      any: Any? = this.any,\n      nonNull: Any = this.nonNull,\n      enum: Direction = this.enum,\n      bytes: ByteArray = this.bytes\n    ): PropertyTypes = PropertyTypes(boolean, int, float, string, duration, durationUnit, dataSize,\n        dataSizeUnit, nullable, nullable2, pair, pair2, coll, coll2, list, list2, set, set2, map,\n        map2, container, container2, other, regex, any, nonNull, enum, bytes)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as PropertyTypes\n      if (this.boolean != other.boolean) return false\n      if (this.int != other.int) return false\n      if (this.float != other.float) return false\n      if (this.string != other.string) return false\n      if (this.duration != other.duration) return false\n      if (this.durationUnit != other.durationUnit) return false\n      if (this.dataSize != other.dataSize) return false\n      if (this.dataSizeUnit != other.dataSizeUnit) return false\n      if (this.nullable != other.nullable) return false\n      if (this.nullable2 != other.nullable2) return false\n      if (this.pair != other.pair) return false\n      if (this.pair2 != other.pair2) return false\n      if (this.coll != other.coll) return false\n      if (this.coll2 != other.coll2) return false\n      if (this.list != other.list) return false\n      if (this.list2 != other.list2) return false\n      if (this.set != other.set) return false\n      if (this.set2 != other.set2) return false\n      if (this.map != other.map) return false\n      if (this.map2 != other.map2) return false\n      if (this.container != other.container) return false\n      if (this.container2 != other.container2) return false\n      if (this.other != other.other) return false\n      if (this.regex.pattern != other.regex.pattern) return false\n      if (this.any != other.any) return false\n      if (this.nonNull != other.nonNull) return false\n      if (this.enum != other.enum) return false\n      if (!this.bytes.contentEquals(other.bytes)) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.boolean)\n      result = 31 * result + Objects.hashCode(this.int)\n      result = 31 * result + Objects.hashCode(this.float)\n      result = 31 * result + Objects.hashCode(this.string)\n      result = 31 * result + Objects.hashCode(this.duration)\n      result = 31 * result + Objects.hashCode(this.durationUnit)\n      result = 31 * result + Objects.hashCode(this.dataSize)\n      result = 31 * result + Objects.hashCode(this.dataSizeUnit)\n      result = 31 * result + Objects.hashCode(this.nullable)\n      result = 31 * result + Objects.hashCode(this.nullable2)\n      result = 31 * result + Objects.hashCode(this.pair)\n      result = 31 * result + Objects.hashCode(this.pair2)\n      result = 31 * result + Objects.hashCode(this.coll)\n      result = 31 * result + Objects.hashCode(this.coll2)\n      result = 31 * result + Objects.hashCode(this.list)\n      result = 31 * result + Objects.hashCode(this.list2)\n      result = 31 * result + Objects.hashCode(this.set)\n      result = 31 * result + Objects.hashCode(this.set2)\n      result = 31 * result + Objects.hashCode(this.map)\n      result = 31 * result + Objects.hashCode(this.map2)\n      result = 31 * result + Objects.hashCode(this.container)\n      result = 31 * result + Objects.hashCode(this.container2)\n      result = 31 * result + Objects.hashCode(this.other)\n      result = 31 * result + Objects.hashCode(this.regex.pattern)\n      result = 31 * result + Objects.hashCode(this.any)\n      result = 31 * result + Objects.hashCode(this.nonNull)\n      result = 31 * result + Objects.hashCode(this.enum)\n      result = 31 * result + this.bytes.contentHashCode()\n      return result\n    }\n\n    override fun toString(): String =\n        \"\"\"PropertyTypes(boolean=$boolean, int=$int, float=$float, string=$string, duration=$duration, durationUnit=$durationUnit, dataSize=$dataSize, dataSizeUnit=$dataSizeUnit, nullable=$nullable, nullable2=$nullable2, pair=$pair, pair2=$pair2, coll=$coll, coll2=$coll2, list=$list, list2=$list2, set=$set, set2=$set2, map=$map, map2=$map2, container=$container, container2=$container2, other=$other, regex=$regex, any=$any, nonNull=$nonNull, enum=$enum, bytes=${Arrays.toString(bytes)})\"\"\"\n  }\n\n  open class Other(\n    open val name: String\n  ) {\n    open fun copy(name: String = this.name): Other = Other(name)\n\n    override fun equals(other: Any?): Boolean {\n      if (this === other) return true\n      if (this.javaClass != other?.javaClass) return false\n      other as Other\n      if (this.name != other.name) return false\n      return true\n    }\n\n    override fun hashCode(): Int {\n      var result = 1\n      result = 31 * result + Objects.hashCode(this.name)\n      return result\n    }\n\n    override fun toString(): String = \"\"\"Other(name=$name)\"\"\"\n  }\n\n  enum class Direction(\n    val value: String\n  ) {\n    NORTH(\"north\"),\n\n    EAST(\"east\"),\n\n    SOUTH(\"south\"),\n\n    WEST(\"west\");\n\n    override fun toString() = value\n  }\n}\n"
  },
  {
    "path": "pkl-commons/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-commons/pkl-commons.gradle.kts",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-commons\")\n        description.set(\"Internal utilities. NOT A PUBLIC API.\")\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-commons/src/main/kotlin/org/pkl/commons/Control.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport java.util.WeakHashMap\nimport kotlin.reflect.KProperty\n\n// Adapted from https://stackoverflow.com/a/38084930\nfun <This, Return> lazyWithReceiver(\n  initializer: This.() -> Return\n): LazyWithReceiver<This, Return> = LazyWithReceiver(initializer)\n\nclass LazyWithReceiver<This, out Return>(val initializer: This.() -> Return) {\n  private val values = WeakHashMap<This, Return>()\n\n  private val lock = Object()\n\n  operator fun getValue(thisValue: This, property: KProperty<*>): Return =\n    synchronized(lock) { values.getOrPut(thisValue) { thisValue.initializer() } }\n}\n"
  },
  {
    "path": "pkl-commons/src/main/kotlin/org/pkl/commons/NameMapper.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\n/**\n * A helper class for translating names of Pkl modules to different names of classes and/or objects\n * in the target language of a code generation execution.\n *\n * The `mapping` parameter is expected to contain valid prefixes of Pkl module names, with an\n * optional dot at the end, and values should be valid class names in the language for which code\n * generation is performed.\n *\n * If the rename patterns do not explicitly rename the class, the class name is capitalized.\n *\n * When computing the appropriate target name, the longest matching prefix is used.\n *\n * Prefix replacements are literal, and therefore dots are important. When renaming packages, in\n * most cases, you must ensure that you have an ending dot on both sides of a mapping (except for\n * the empty mapping, if you use it), otherwise you may get unexpected results:\n * ```kotlin\n * val mapper = NameMapper(\n *   mapOf(\n *     \"com.foo.\" to \"x\", // Dot on the left only\n *     \"org.bar\" to \"y.\", // Dot on the right only\n *     \"net.baz\" to \"z\" // No dots\n *   )\n * )\n *\n * assertThat(mapper.map(\"com.foo.bar\")).isEqualTo(\"\" to \"xbar\") // Target prefix merged into the suffix\n * assertThat(mapper.map(\"org.bar.baz\")).isEqualTo(\"y.\" to \"Baz\") // Double dot, invalid package name\n * assertThat(mapper.map(\"net.baz.qux\")).isEqualTo(\"z\" to \"Qux\") // Looks okay, but...\n * assertThat(mapper.map(\"net.bazqux\")).isEqualTo(\"\" to \"zqux\") // ...may cut the package name in the middle.\n * ```\n */\nclass NameMapper(mapping: Map<String, String>) {\n  private val sortedMapping = mapping.toList().sortedBy { -it.first.length }\n\n  private fun doMap(sourceName: String): Pair<String, Boolean> {\n    for ((sourcePrefix, targetPrefix) in sortedMapping) {\n      if (sourceName.startsWith(sourcePrefix)) {\n        val rest = sourceName.substring(sourcePrefix.length)\n        val mapped = targetPrefix + rest\n        val wasClassRenamed =\n          !targetPrefix.endsWith('.') && (sourcePrefix.length - 1) >= sourceName.lastIndexOf('.')\n        return mapped to wasClassRenamed\n      }\n    }\n    return sourceName to false\n  }\n\n  fun map(sourceName: String): Pair<String, String> {\n    val (mappedName, wasClassRenamed) = doMap(sourceName)\n    val packageName = mappedName.substringBeforeLast(\".\", \"\")\n    val mappedClassName = mappedName.substringAfterLast(\".\")\n    val className =\n      if (wasClassRenamed) mappedClassName\n      else mappedClassName.replaceFirstChar { it.titlecaseChar() }\n    return packageName to className\n  }\n}\n"
  },
  {
    "path": "pkl-commons/src/main/kotlin/org/pkl/commons/Paths.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport java.io.*\nimport java.nio.charset.Charset\nimport java.nio.file.*\nimport java.nio.file.attribute.FileAttribute\nimport java.util.stream.Stream\nimport kotlin.io.path.copyTo\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.exists\n\n// not stored to avoid build-time initialization by native-image\nval currentWorkingDir: Path\n  get() = System.getProperty(\"user.dir\").toPath()\n\n// unlike `Path.resolve`, this works across file systems if `other` is absolute\nfun Path.resolveSafely(other: Path): Path = if (other.isAbsolute) other else resolve(other)\n\n@Throws(IOException::class)\nfun Path.walk(maxDepth: Int = Int.MAX_VALUE, vararg options: FileVisitOption): Stream<Path> =\n  Files.walk(this, maxDepth, *options)\n\n@Throws(IOException::class)\nfun Path.createTempFile(\n  prefix: String? = null,\n  suffix: String? = null,\n  vararg attributes: FileAttribute<*>,\n): Path = Files.createTempFile(this, prefix, suffix, *attributes)\n\n/** [Files.writeString] seems more efficient than [kotlin.io.path.writeText]. */\n@Throws(IOException::class)\nfun Path.writeString(\n  text: String,\n  charset: Charset = Charsets.UTF_8,\n  vararg options: OpenOption,\n): Path = Files.writeString(this, text, charset, *options)\n\n/** [Files.readString] seems more efficient than [kotlin.io.path.readText]. */\n@Throws(IOException::class)\nfun Path.readString(charset: Charset = Charsets.UTF_8): String = Files.readString(this, charset)\n\n@Throws(IOException::class)\nfun Path.copyRecursively(target: Path) {\n  if (exists()) {\n    target.createParentDirectories()\n    walk().use { paths ->\n      paths.forEach { src ->\n        val dst = target.resolve(this@copyRecursively.relativize(src))\n        src.copyTo(dst, overwrite = true)\n      }\n    }\n  }\n}\n\nprivate val isWindows by lazy { System.getProperty(\"os.name\").contains(\"Windows\") }\n\n/** Copy implementation from IoUtils.toNormalizedPathString */\nfun Path.toNormalizedPathString(): String {\n  if (isWindows) {\n    return toString().replace(\"\\\\\", \"/\")\n  }\n  return toString()\n}\n"
  },
  {
    "path": "pkl-commons/src/main/kotlin/org/pkl/commons/Strings.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport java.io.File\nimport java.net.URI\nimport java.nio.file.Path\nimport java.util.regex.Pattern\n\nfun String.toPath(): Path = Path.of(this)\n\nprivate val uriLike = Pattern.compile(\"\\\\w+:[^\\\\\\\\].*\")\n\nprivate val windowsPathLike = Pattern.compile(\"\\\\w:\\\\\\\\.*\")\n\n/** Copy of org.pkl.core.util.IoUtils.toUri */\nfun String.toUri(): URI {\n  if (uriLike.matcher(this).matches()) {\n    return URI(this)\n  }\n  if (windowsPathLike.matcher(this).matches()) {\n    return File(this).toURI()\n  }\n  return URI(null, null, this, null)\n}\n\n/** Lex a string into tokens similar to how a shell would */\nfun shlex(input: String): List<String> {\n  val result = mutableListOf<String>()\n  var inEscape = false\n  var quote: Char? = null\n  var lastCloseQuoteIndex = Int.MIN_VALUE\n  val current = StringBuilder()\n\n  for ((idx, char) in input.withIndex()) {\n    when {\n      // if in an escape always append the next character\n      inEscape -> {\n        inEscape = false\n        current.append(char)\n      }\n      // enter an escape on \\ if not in a quote or in a non-single quote\n      char == '\\\\' && quote != '\\'' -> inEscape = true\n      // if in a quote and encounter the delimiter, tentatively exit the quote\n      // this handles cases with adjoining quotes e.g. `abc'123''xyz'`\n      quote == char -> {\n        quote = null\n        lastCloseQuoteIndex = idx\n      }\n      // if not in a quote and encounter a quote character, enter a quote\n      quote == null && (char == '\\'' || char == '\"') -> {\n        quote = char\n      }\n      // if not in a quote and whitespace is encountered\n      quote == null && char.isWhitespace() -> {\n        // if the current token isn't empty or if a quote has just ended, finalize the current token\n        // otherwise do nothing, which handles multiple whitespace cases e.g. `abc     123`\n        if (current.isNotEmpty() || lastCloseQuoteIndex == (idx - 1)) {\n          result.add(current.toString())\n          current.clear()\n        }\n      }\n      // in other cases, append to the current token\n      else -> current.append(char)\n    }\n  }\n  // clean up last token\n  // if the current token isn't empty or if a quote has just ended, finalize the token\n  // if this condition is false, the input likely ended in whitespace\n  if (current.isNotEmpty() || lastCloseQuoteIndex == (input.length - 1)) {\n    result.add(current.toString())\n  }\n\n  return result\n}\n"
  },
  {
    "path": "pkl-commons/src/main/kotlin/org/pkl/commons/Throwables.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport java.io.PrintWriter\nimport java.io.StringWriter\n\n/** Same as [Throwable.printStackTrace] except that it prints to a [String]. */\nfun Throwable.printStackTraceToString(): String =\n  StringWriter().also { printStackTrace(PrintWriter(it)) }.toString()\n"
  },
  {
    "path": "pkl-commons/src/main/kotlin/org/pkl/commons/Uris.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport java.net.URI\nimport java.nio.file.Path\n\nfun URI.toPath(): Path = Path.of(this)\n"
  },
  {
    "path": "pkl-commons/src/test/kotlin/org/pkl/commons/NameMapperTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass NameMapperTest {\n  @Test\n  fun `empty prefixes everything`() {\n    val mapper = NameMapper(mapOf(\"\" to \"bar.\"))\n    assertThat(mapper.map(\"foo.bar.Baz\")).isEqualTo(\"bar.foo.bar\" to \"Baz\")\n    assertThat(mapper.map(\"Baz\")).isEqualTo(\"bar\" to \"Baz\")\n  }\n\n  @Test\n  fun `longest prefix wins`() {\n    val mapper = NameMapper(mapOf(\"bar.\" to \"com.bar.\", \"bar.baz.\" to \"foo.bar.\"))\n    assertThat(mapper.map(\"bar.baz.Buzzy\")).isEqualTo(\"foo.bar\" to \"Buzzy\")\n  }\n\n  @Test\n  fun `implicit uppercase classname`() {\n    val mapper = NameMapper(mapOf(\"foo.\" to \"bar.\"))\n    assertThat(mapper.map(\"foo.bar.baz\")).isEqualTo(\"bar.bar\" to \"Baz\")\n    assertThat(mapper.map(\"foo.bar\")).isEqualTo(\"bar\" to \"Bar\")\n    assertThat(mapper.map(\"baz\")).isEqualTo(\"\" to \"Baz\")\n    assertThat(mapper.map(\"baz\")).isEqualTo(\"\" to \"Baz\")\n  }\n\n  @Test\n  fun `no implicit uppercased classname if explicitly renamed`() {\n    val mapper = NameMapper(mapOf(\"foo.bar\" to \"bar.bar\", \"foo.c\" to \"foo.z\", \"com.foo.\" to \"x\"))\n    assertThat(mapper.map(\"foo.bar\")).isEqualTo(\"bar\" to \"bar\")\n    assertThat(mapper.map(\"foo.bar\")).isEqualTo(\"bar\" to \"bar\")\n    assertThat(mapper.map(\"foo.cow\")).isEqualTo(\"foo\" to \"zow\")\n    assertThat(mapper.map(\"com.foo.bar\")).isEqualTo(\"\" to \"xbar\")\n  }\n}\n"
  },
  {
    "path": "pkl-commons/src/test/kotlin/org/pkl/commons/ShlexTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass ShlexTest {\n\n  @Test\n  fun `empty input produces empty output`() {\n    assertThat(shlex(\"\")).isEqualTo(emptyList<String>())\n  }\n\n  @Test\n  fun `whitespace input produces empty output`() {\n    assertThat(shlex(\"  \\n \\t  \")).isEqualTo(emptyList<String>())\n  }\n\n  @Test\n  fun `regular token parsing`() {\n    assertThat(shlex(\"\\nabc  def\\tghi \")).isEqualTo(listOf(\"abc\", \"def\", \"ghi\"))\n  }\n\n  @Test\n  fun `single quoted token parsing`() {\n    assertThat(shlex(\"'this is a single token'\")).isEqualTo(listOf(\"this is a single token\"))\n  }\n\n  @Test\n  fun `double quoted token parsing`() {\n    assertThat(shlex(\"\\\"this is a single token\\\"\")).isEqualTo(listOf(\"this is a single token\"))\n  }\n\n  @Test\n  fun `escaping handles double quotes`() {\n    assertThat(shlex(\"\"\"\"\\\"this is a single double quoted token\\\"\"\"\"\"))\n      .isEqualTo(listOf(\"\\\"this is a single double quoted token\\\"\"))\n  }\n\n  @Test\n  fun `escaping does not apply within single quotes`() {\n    assertThat(shlex(\"\"\"'this is a single \\\" token'\"\"\"))\n      .isEqualTo(listOf(\"\"\"this is a single \\\" token\"\"\"))\n  }\n\n  @Test\n  fun `adjacent quoted strings are one token`() {\n    assertThat(shlex(\"\"\"\"single\"' joined 'token\"\"\")).isEqualTo(listOf(\"single joined token\"))\n    assertThat(shlex(\"\"\"\"single\"' 'token\"\"\")).isEqualTo(listOf(\"single token\"))\n  }\n\n  @Test\n  fun `space escapes do not split tokens`() {\n    assertThat(shlex(\"\"\"single\\ token\"\"\")).isEqualTo(listOf(\"single token\"))\n  }\n\n  @Test\n  fun `empty quotes produce a single empty token`() {\n    assertThat(shlex(\"\\\"\\\"\")).isEqualTo(listOf(\"\"))\n    assertThat(shlex(\"''\")).isEqualTo(listOf(\"\"))\n    assertThat(shlex(\"'' ''\")).isEqualTo(listOf(\"\", \"\"))\n    assertThat(shlex(\"''''\")).isEqualTo(listOf(\"\"))\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=runtimeClasspath,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.compiler:compiler:25.0.0=svmClasspath\norg.graalvm.espresso:espresso-svm:25.0.0=svmClasspath\norg.graalvm.nativeimage:native-image-base:25.0.0=svmClasspath\norg.graalvm.nativeimage:objectfile:25.0.0=svmClasspath\norg.graalvm.nativeimage:pointsto:25.0.0=svmClasspath\norg.graalvm.nativeimage:svm-capnproto-runtime:25.0.0=svmClasspath\norg.graalvm.nativeimage:svm-configure:25.0.0=svmClasspath\norg.graalvm.nativeimage:svm:25.0.0=svmClasspath\norg.graalvm.nativeimage:truffle-runtime-svm:25.0.0=svmClasspath\norg.graalvm.polyglot:polyglot:25.0.0=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.graalvm.sdk:jniutils:25.0.0=svmClasspath\norg.graalvm.sdk:nativeimage-libgraal:25.0.0=svmClasspath\norg.graalvm.sdk:nativeimage:25.0.0=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-compiler:25.0.0=svmClasspath\norg.graalvm.truffle:truffle-runtime:25.0.0=svmClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathSvm,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown:0.7.3=implementationDependenciesMetadata,runtimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=runtimeClasspath,svmClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=runtimeClasspath,svmClasspath,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,signatures,sourcesJar,svmAnnotationProcessor,svmApiDependenciesMetadata,svmCompileClasspath,svmCompileOnlyDependenciesMetadata,svmImplementationDependenciesMetadata,svmIntransitiveDependenciesMetadata,svmKotlinScriptDefExtensions,svmRuntimeClasspath,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-commons-cli/pkl-commons-cli.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n}\n\nval svmClasspath: Configuration by configurations.creating\n\n// used by pklNativeExecutable.gradle.kts\n@Suppress(\"unused\") val svm: SourceSet by sourceSets.creating { compileClasspath = svmClasspath }\n\ndependencies {\n  api(projects.pklCore)\n  api(libs.clikt)\n  implementation(libs.cliktMarkdown)\n\n  implementation(projects.pklCommons)\n  testImplementation(projects.pklCommonsTest)\n\n  svmClasspath(libs.svm)\n  svmClasspath(libs.truffleSvm)\n  svmClasspath(projects.pklCore)\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-commons-cli\")\n        description.set(\"Internal CLI utilities. NOT A PUBLIC API.\")\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliBaseOptions.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.time.Duration\nimport java.util.regex.Pattern\nimport org.pkl.core.evaluatorSettings.Color\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.module.ProjectDependenciesManager\nimport org.pkl.core.util.IoUtils\n\n/** Base options shared between CLI commands. */\ndata class CliBaseOptions(\n  /** The source modules to evaluate. Relative URIs are resolved against [workingDir]. */\n  val sourceModules: List<URI> = listOf(),\n\n  /**\n   * The URI patterns that determine which modules can be loaded and evaluated. Patterns are matched\n   * against the beginning of module URIs. At least one pattern needs to match for a module to be\n   * loadable. Both [sourceModules] and module imports are subject to this check.\n   */\n  val allowedModules: List<Pattern>? = null,\n\n  /**\n   * The URI patterns that determine which external resources can be read. Patterns are matched\n   * against the beginning of resource URIs. At least one pattern needs to match for a resource to\n   * be readable.\n   */\n  val allowedResources: List<Pattern>? = null,\n\n  /**\n   * The environment variables to set. Pkl code can read environment variables with\n   * `read(\"env:<NAME>\")`.\n   */\n  val environmentVariables: Map<String, String>? = null,\n\n  /**\n   * The external properties to set. Pkl code can read external properties with\n   * `read(\"prop:<name>\")`.\n   */\n  val externalProperties: Map<String, String>? = null,\n\n  /**\n   * The directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.\n   * Relative paths are resolved against [workingDir].\n   */\n  private val modulePath: List<Path>? = null,\n\n  /**\n   * The base path that relative module paths passed as command-line arguments are resolved against.\n   */\n  private val workingDir: Path = IoUtils.getCurrentWorkingDir(),\n\n  /**\n   * The root directory for `file:` modules and resources. If non-null, access to file-based modules\n   * and resources is restricted to those located under [rootDir]. Any symlinks are resolved before\n   * this check is performed.\n   */\n  private val rootDir: Path? = null,\n\n  /**\n   * The Pkl settings file to use. A settings file is a Pkl module amending the `pkl.settings`\n   * standard library module. If `null`, `~/.pkl/settings.pkl` (if present) or the defaults\n   * specified in the `pkl:settings` standard library module are used.\n   */\n  private val settings: URI? = null,\n\n  /**\n   * The root directory of the project. The directory must contain a `PklProject` that amends the\n   * `pkl.Project` standard library module.\n   *\n   * If `null`, looks for a `PklProject` file in [workingDir], traversing up to [rootDir], or `/` if\n   * [rootDir] is `null`.\n   *\n   * This can be disabled with [noProject].\n   */\n  private val projectDir: Path? = null,\n\n  /**\n   * The duration after which evaluation of a source module will be timed out. Note that a timeout\n   * is treated the same as a program error in that any subsequent source modules will not be\n   * evaluated.\n   */\n  val timeout: Duration? = null,\n\n  /** The cache directory for storing packages. */\n  private val moduleCacheDir: Path? = null,\n\n  /** Whether to render errors in ANSI color. */\n  val color: Color? = null,\n\n  /** Whether to disable the module cache. */\n  val noCache: Boolean = false,\n\n  /** Ignores any evaluator settings set in the PklProject file. */\n  val omitProjectSettings: Boolean = false,\n\n  /** Disables all behavior related to projects. */\n  val noProject: Boolean = false,\n\n  /** Tells whether to run the CLI in test mode. This is an internal option. */\n  val testMode: Boolean = false,\n\n  /**\n   * Unless -1, rewrites HTTP requests that specify port 0 to the given port. This is an internal\n   * test option.\n   */\n  val testPort: Int = -1,\n\n  /**\n   * The CA certificates to trust.\n   *\n   * The given files must contain [X.509](https://en.wikipedia.org/wiki/X.509) certificates in PEM\n   * format.\n   *\n   * If [caCertificates] is the empty list, the certificate files in `~/.pkl/cacerts/` are used. If\n   * `~/.pkl/cacerts/` does not exist or is empty, Pkl's built-in CA certificates are used.\n   */\n  val caCertificates: List<Path> = listOf(),\n\n  /** The proxy to connect to. */\n  val httpProxy: URI? = null,\n\n  /** Hostnames, IP addresses, or CIDR blocks to not proxy. */\n  val httpNoProxy: List<String>? = null,\n\n  /** URL prefixes to rewrite. */\n  val httpRewrites: Map<URI, URI>? = null,\n\n  /** External module reader process specs */\n  val externalModuleReaders: Map<String, ExternalReader> = mapOf(),\n\n  /** External resource reader process specs */\n  val externalResourceReaders: Map<String, ExternalReader> = mapOf(),\n\n  /** Defines options for the formatting of calls to the trace() method. */\n  val traceMode: TraceMode? = null,\n\n  /** Whether power assertions are enabled. */\n  val powerAssertionsEnabled: Boolean = false,\n) {\n\n  companion object {\n    tailrec fun Path.getProjectFile(rootDir: Path?): Path? {\n      val candidate = resolve(ProjectDependenciesManager.PKL_PROJECT_FILENAME)\n      return when {\n        Files.exists(candidate) -> candidate\n        parent == null -> null\n        rootDir != null && !parent.startsWith(rootDir) -> null\n        else -> parent.getProjectFile(rootDir)\n      }\n    }\n  }\n\n  /** [workingDir] after normalization. */\n  val normalizedWorkingDir: Path = IoUtils.getCurrentWorkingDir().resolve(workingDir)\n\n  /** [rootDir] after normalization. */\n  val normalizedRootDir: Path? = rootDir?.let(normalizedWorkingDir::resolve)\n\n  /** The effective project directory, if exists. */\n  val normalizedProjectFile: Path? by lazy {\n    projectDir?.resolve(ProjectDependenciesManager.PKL_PROJECT_FILENAME)\n      ?: normalizedWorkingDir.getProjectFile(rootDir)\n  }\n\n  /** [sourceModules] after normalization. */\n  val normalizedSourceModules: List<URI> =\n    sourceModules\n      .map { uri ->\n        if (uri.isAbsolute) uri\n        else if (uri.path.startsWith(\"@\") && !noProject && normalizedProjectFile != null) uri\n        else IoUtils.resolve(normalizedWorkingDir.toUri(), uri)\n      }\n      // sort modules to make cli output independent of source module order\n      .sorted()\n\n  val normalizedSettingsModule: URI? =\n    settings?.let { uri ->\n      if (uri.isAbsolute) uri else IoUtils.resolve(normalizedWorkingDir.toUri(), uri)\n    }\n\n  /** [modulePath] after normalization. */\n  val normalizedModulePath: List<Path>? = modulePath?.map(normalizedWorkingDir::resolve)\n\n  /** [moduleCacheDir] after normalization. */\n  val normalizedModuleCacheDir: Path? = moduleCacheDir?.let(normalizedWorkingDir::resolve)\n\n  /** [caCertificates] after normalization. */\n  val normalizedCaCertificates: List<Path> = caCertificates.map(normalizedWorkingDir::resolve)\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport com.github.ajalt.clikt.core.CliktError\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.util.regex.Pattern\nimport kotlin.io.path.isRegularFile\nimport org.pkl.core.*\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.externalreader.ExternalReaderProcess\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.module.ModuleKeyFactory\nimport org.pkl.core.module.ModulePathResolver\nimport org.pkl.core.project.Project\nimport org.pkl.core.resource.ResourceReader\nimport org.pkl.core.resource.ResourceReaders\nimport org.pkl.core.settings.PklSettings\nimport org.pkl.core.util.IoUtils\n\n/** Building block for CLI commands. Configured programmatically to allow for embedding. */\nabstract class CliCommand(protected val cliOptions: CliBaseOptions) {\n  /** Runs this command. */\n  fun run() {\n    if (cliOptions.testMode) {\n      IoUtils.setTestMode()\n    }\n\n    try {\n      proxyAddress?.let(IoUtils::setSystemProxy)\n      doRun()\n    } catch (e: PklException) {\n      if (e.cause is CliktError) throw e.cause!!\n      throw CliException(e.message!!)\n    } catch (e: CliException) {\n      throw e\n    } catch (e: Exception) {\n      throw CliBugException(e)\n    }\n  }\n\n  /**\n   * Implements this command. May throw [PklException] or [CliException]. Any other thrown exception\n   * is treated as a bug.\n   */\n  protected abstract fun doRun()\n\n  /** The Pkl settings used by this command. */\n  @Suppress(\"MemberVisibilityCanBePrivate\")\n  protected val settings: PklSettings by lazy {\n    try {\n      if (cliOptions.normalizedSettingsModule != null) {\n        PklSettings.load(ModuleSource.uri(cliOptions.normalizedSettingsModule))\n      } else {\n        PklSettings.loadFromPklHomeDir()\n      }\n    } catch (e: PklException) {\n      // do not use `errorRenderer` because it depends on `settings`\n      throw CliException(e.toString())\n    }\n  }\n\n  /** The Project used by this command. */\n  protected val project: Project? by lazy {\n    if (cliOptions.noProject) {\n      null\n    } else {\n      cliOptions.normalizedProjectFile?.let { loadProject(it) }\n    }\n  }\n\n  protected fun resolveModuleUri(uri: URI): URI =\n    if (uri.isAbsolute) uri\n    else { // must be @dep/mod.pkl notation!!\n      if (!uri.path.startsWith('@'))\n        throw CliBugException(\n          RuntimeException(\"tried to resolve project URI `$uri` with no @ prefix\")\n        )\n      if (project == null)\n        throw CliBugException(\n          RuntimeException(\"tried to resolve project URI `$uri` with no project present\")\n        )\n      val dep = uri.path.substringBefore('/').drop(1)\n      val path = uri.path.dropWhile { it != '/' }\n      if (path.isEmpty()) throw CliException(\"Invalid project dependency URI `$uri`.\")\n\n      val remoteDep =\n        project!!.dependencies.remoteDependencies()[dep]\n          ?: if (project!!.dependencies.localDependencies().containsKey(dep))\n            throw CliException(\n              \"Only remote project dependencies may be referenced using @-notation. Dependency `@$dep` is a local dependency.\"\n            )\n          else throw CliException(\"Project does not contain dependency `@$dep`.\")\n      remoteDep.packageUri.toPackageAssetUri(path).uri\n    }\n\n  protected val resolvedSourceModules: List<URI> by lazy {\n    if (project == null) cliOptions.normalizedSourceModules\n    else cliOptions.normalizedSourceModules.map(::resolveModuleUri)\n  }\n\n  protected fun loadProject(projectFile: Path): Project {\n    val securityManager =\n      SecurityManagers.standard(\n        cliOptions.allowedModules ?: SecurityManagers.defaultAllowedModules,\n        cliOptions.allowedResources ?: SecurityManagers.defaultAllowedResources,\n        SecurityManagers.defaultTrustLevels,\n        cliOptions.normalizedRootDir,\n      )\n    val envVars = cliOptions.environmentVariables ?: System.getenv()\n    val stackFrameTransformer =\n      if (IoUtils.isTestMode()) StackFrameTransformers.empty\n      else StackFrameTransformers.defaultTransformer\n    return Project.loadFromPath(\n      projectFile,\n      securityManager,\n      cliOptions.timeout,\n      stackFrameTransformer,\n      envVars,\n      cliOptions.powerAssertionsEnabled,\n    )\n  }\n\n  private val evaluatorSettings: PklEvaluatorSettings? by lazy {\n    @Suppress(\"PklCliDirectProjectEvaluatorSettingsAccess\")\n    if (cliOptions.omitProjectSettings) null else project?.evaluatorSettings\n  }\n\n  protected val allowedModules: List<Pattern> by lazy {\n    cliOptions.allowedModules\n      ?: evaluatorSettings?.allowedModules\n      ?: (SecurityManagers.defaultAllowedModules +\n        externalModuleReaders.keys.map { Pattern.compile(Pattern.quote(\"$it:\")) }.toList())\n  }\n\n  protected val allowedResources: List<Pattern> by lazy {\n    cliOptions.allowedResources\n      ?: evaluatorSettings?.allowedResources\n      ?: (SecurityManagers.defaultAllowedResources +\n        externalResourceReaders.keys.map { Pattern.compile(Pattern.quote(\"$it:\")) }.toList())\n  }\n\n  protected val rootDir: Path? by lazy {\n    cliOptions.normalizedRootDir ?: evaluatorSettings?.rootDir\n  }\n\n  protected val environmentVariables: Map<String, String> by lazy {\n    cliOptions.environmentVariables ?: evaluatorSettings?.env ?: System.getenv()\n  }\n\n  protected val externalProperties: Map<String, String> by lazy {\n    cliOptions.externalProperties ?: evaluatorSettings?.externalProperties ?: emptyMap()\n  }\n\n  protected val moduleCacheDir: Path? by lazy {\n    if (cliOptions.noCache) null\n    else\n      cliOptions.normalizedModuleCacheDir\n        ?: evaluatorSettings?.let { settings ->\n          if (settings.noCache == true) null else settings.moduleCacheDir\n        }\n        ?: IoUtils.getDefaultModuleCacheDir()\n  }\n\n  protected val modulePath: List<Path> by lazy {\n    cliOptions.normalizedModulePath ?: evaluatorSettings?.modulePath ?: emptyList()\n  }\n\n  protected val stackFrameTransformer: StackFrameTransformer by lazy {\n    if (cliOptions.testMode) {\n      StackFrameTransformers.empty\n    } else {\n      StackFrameTransformers.createDefault(settings)\n    }\n  }\n\n  protected val securityManager: SecurityManager by lazy {\n    SecurityManagers.standard(\n      allowedModules,\n      allowedResources,\n      SecurityManagers.defaultTrustLevels,\n      rootDir,\n    )\n  }\n\n  protected val useColor: Boolean by lazy {\n    cliOptions.color?.hasColor() ?: evaluatorSettings?.color?.hasColor() ?: false\n  }\n\n  protected val proxyAddress: URI? by lazy {\n    cliOptions.httpProxy ?: evaluatorSettings?.http?.proxy?.address ?: settings.http?.proxy?.address\n  }\n\n  protected val noProxy: List<String>? by lazy {\n    cliOptions.httpNoProxy\n      ?: evaluatorSettings?.http?.proxy?.noProxy\n      ?: settings.http?.proxy?.noProxy\n  }\n\n  protected val httpRewrites: Map<URI, URI>? by lazy {\n    cliOptions.httpRewrites ?: evaluatorSettings?.http?.rewrites ?: settings.http?.rewrites()\n  }\n\n  protected val externalModuleReaders: Map<String, PklEvaluatorSettings.ExternalReader> by lazy {\n    (evaluatorSettings?.externalModuleReaders ?: emptyMap()) + cliOptions.externalModuleReaders\n  }\n\n  protected val externalResourceReaders: Map<String, PklEvaluatorSettings.ExternalReader> by lazy {\n    (evaluatorSettings?.externalResourceReaders ?: emptyMap()) + cliOptions.externalResourceReaders\n  }\n\n  private val externalProcesses:\n    Map<PklEvaluatorSettings.ExternalReader, ExternalReaderProcess> by lazy {\n    // Share ExternalReaderProcess instances between configured external resource/module readers\n    // with the same spec. This avoids spawning multiple subprocesses if the same reader implements\n    // both reader types and/or multiple schemes.\n    (externalModuleReaders + externalResourceReaders).values.toSet().associateWith {\n      ExternalReaderProcess.of(it)\n    }\n  }\n\n  private val traceMode: TraceMode by lazy {\n    cliOptions.traceMode ?: evaluatorSettings?.traceMode ?: TraceMode.COMPACT\n  }\n\n  private fun HttpClient.Builder.addDefaultCliCertificates() {\n    val caCertsDir = IoUtils.getPklHomeDir().resolve(\"cacerts\")\n    var certsAdded = false\n    if (Files.isDirectory(caCertsDir)) {\n      Files.list(caCertsDir)\n        .filter { it.isRegularFile() }\n        .forEach { cert ->\n          certsAdded = true\n          addCertificates(cert)\n        }\n    }\n    if (!certsAdded) {\n      val defaultCerts =\n        this@CliCommand.javaClass.classLoader.getResourceAsStream(\n          \"org/pkl/commons/cli/PklCARoots.pem\"\n        ) ?: throw CliException(\"Could not find bundled certificates\")\n      addCertificates(defaultCerts.readAllBytes())\n    }\n  }\n\n  /**\n   * The HTTP client used for this command.\n   *\n   * To release resources held by the HTTP client in a timely manner, call [HttpClient.close].\n   */\n  val httpClient: HttpClient by lazy {\n    with(HttpClient.builder()) {\n      setTestPort(cliOptions.testPort)\n      if (cliOptions.normalizedCaCertificates.isEmpty()) {\n        addDefaultCliCertificates()\n      } else {\n        for (file in cliOptions.normalizedCaCertificates) addCertificates(file)\n      }\n      if ((proxyAddress ?: noProxy) != null) {\n        setProxy(proxyAddress, noProxy ?: listOf())\n      }\n      httpRewrites?.let(::setRewrites)\n      // Lazy building significantly reduces execution time of commands that do minimal work.\n      // However, it means that HTTP client initialization errors won't surface until an HTTP\n      // request is made.\n      buildLazily()\n    }\n  }\n\n  protected fun moduleKeyFactories(modulePathResolver: ModulePathResolver): List<ModuleKeyFactory> {\n    return buildList {\n      externalModuleReaders.forEach { (key, value) ->\n        add(ModuleKeyFactories.externalProcess(key, externalProcesses[value]!!))\n      }\n      add(ModuleKeyFactories.standardLibrary)\n      add(ModuleKeyFactories.modulePath(modulePathResolver))\n      add(ModuleKeyFactories.pkg)\n      add(ModuleKeyFactories.projectpackage)\n      addAll(ModuleKeyFactories.fromServiceProviders())\n      add(ModuleKeyFactories.file)\n      add(ModuleKeyFactories.http)\n      add(ModuleKeyFactories.genericUrl)\n    }\n  }\n\n  private fun resourceReaders(modulePathResolver: ModulePathResolver): List<ResourceReader> {\n    return buildList {\n      add(ResourceReaders.environmentVariable())\n      add(ResourceReaders.externalProperty())\n      add(ResourceReaders.modulePath(modulePathResolver))\n      add(ResourceReaders.pkg())\n      add(ResourceReaders.projectpackage())\n      add(ResourceReaders.file())\n      add(ResourceReaders.http())\n      add(ResourceReaders.https())\n      externalResourceReaders.forEach { (key, value) ->\n        add(ResourceReaders.externalProcess(key, externalProcesses[value]!!))\n      }\n    }\n  }\n\n  /**\n   * Creates an [EvaluatorBuilder] preconfigured according to [cliOptions]. To avoid resource leaks,\n   * `ModuleKeyFactories.closeQuietly(builder.moduleKeyFactories)` must be called once the returned\n   * builder and evaluators built by it are no longer in use.\n   */\n  protected fun evaluatorBuilder(): EvaluatorBuilder {\n    // indirectly closed by `ModuleKeyFactories.closeQuietly(builder.moduleKeyFactories)`\n    val modulePathResolver = ModulePathResolver(modulePath)\n    return EvaluatorBuilder.unconfigured()\n      .setStackFrameTransformer(stackFrameTransformer)\n      .apply { project?.let { setProjectDependencies(it.dependencies) } }\n      .setSecurityManager(securityManager)\n      .setHttpClient(httpClient)\n      .setExternalProperties(externalProperties)\n      .setEnvironmentVariables(environmentVariables)\n      .addModuleKeyFactories(moduleKeyFactories(modulePathResolver))\n      .addResourceReaders(resourceReaders(modulePathResolver))\n      .setColor(useColor)\n      .setLogger(Loggers.stdErr())\n      .setTimeout(cliOptions.timeout)\n      .setModuleCacheDir(moduleCacheDir)\n      .setTraceMode(traceMode)\n      .setPowerAssertionsEnabled(cliOptions.powerAssertionsEnabled)\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliException.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport org.pkl.commons.printStackTraceToString\n\n/** A CLI error to report back to users. */\nopen class CliException(\n  /**\n   * The error message to report back to CLI users. The message is expected to be displayed as-is\n   * without any further enrichment. As such the message should be comprehensive and designed with\n   * the CLI user in mind.\n   */\n  message: String,\n\n  /** The cause */\n  cause: Throwable?,\n\n  /** The process exit code to use. */\n  val exitCode: Int = 1,\n) : RuntimeException(message, cause) {\n  constructor(message: String, exitCode: Int = 1) : this(message, null, exitCode)\n\n  override fun toString(): String = message!!\n}\n\n/** An unexpected CLI error classified as bug. */\nclass CliBugException(\n  /** The cause for the bug. */\n  private val theCause: Exception,\n\n  /** The process exit code to use. */\n  exitCode: Int = 1,\n) :\n  CliException(\n    \"An unexpected error has occurred. Would you mind filing a bug report?\",\n    theCause,\n    exitCode,\n  ) {\n\n  override fun toString(): String = \"$message\\n\\n${theCause.printStackTraceToString()}\"\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliMain.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport java.io.PrintStream\nimport kotlin.system.exitProcess\n\n/** Building block for CLIs. Intended to be called from a `main` method. */\nfun cliMain(block: () -> Unit) {\n  fun printError(error: Throwable, stream: PrintStream) {\n    val message = error.toString()\n    stream.print(message)\n    // ensure CLI output always ends with newline\n    if (!message.endsWith('\\n')) stream.println()\n  }\n\n  // Force `native-image` to use system proxies (which does not happen with `-D`).\n  System.setProperty(\"java.net.useSystemProxies\", \"true\")\n  try {\n    block()\n  } catch (e: CliTestException) {\n    // no need to print the error, the test results will already do it\n    exitProcess(e.exitCode)\n  } catch (e: CliException) {\n    printError(e, if (e.exitCode == 0) System.out else System.err)\n    exitProcess(e.exitCode)\n  } catch (e: Exception) {\n    printError(CliBugException(e), System.err)\n    exitProcess(1)\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliTestException.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nclass CliTestException(msg: String, exitCode: Int) : CliException(msg, exitCode)\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliTestOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport java.nio.file.Path\n\nclass CliTestOptions(\n  val junitDir: Path? = null,\n  val overwrite: Boolean = false,\n  val junitAggregateReports: Boolean = false,\n  val junitAggregateSuiteName: String = \"pkl-tests\",\n)\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/BaseCommand.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.core.CliktCommand\nimport com.github.ajalt.clikt.core.Context\nimport com.github.ajalt.clikt.core.context\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\n\nabstract class BaseCommand(name: String, private val helpLink: String) : CliktCommand(name = name) {\n  init {\n    context { readArgumentFile = null }\n  }\n\n  abstract val helpString: String\n\n  override fun help(context: Context) = helpString\n\n  final override fun helpEpilog(context: Context) = \"For more information, visit $helpLink\"\n\n  val baseOptions: BaseOptions by BaseOptions()\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/BaseOptions.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.parameters.groups.OptionGroup\nimport com.github.ajalt.clikt.parameters.options.*\nimport com.github.ajalt.clikt.parameters.types.enum\nimport com.github.ajalt.clikt.parameters.types.int\nimport com.github.ajalt.clikt.parameters.types.long\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.io.File\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.nio.file.Path\nimport java.time.Duration\nimport java.util.regex.Pattern\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.shlex\nimport org.pkl.core.evaluatorSettings.Color\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.runtime.VmUtils\nimport org.pkl.core.util.IoUtils\n\n@Suppress(\"MemberVisibilityCanBePrivate\")\nclass BaseOptions : OptionGroup() {\n  companion object {\n    /**\n     * Parses [moduleName] into a URI. If scheme is not present, we expect that this is a file path\n     * and encode any possibly invalid characters, and also normalize directory separators. If a\n     * scheme is present, we expect that this is a valid URI.\n     */\n    fun parseModuleName(moduleName: String): URI =\n      when (moduleName) {\n        \"-\" -> VmUtils.REPL_TEXT_URI\n        else ->\n          // Don't use `IoUtils.toUri` here becaus we need to normalize `\\` paths to `/` on Windows.\n          try {\n            if (IoUtils.isUriLike(moduleName)) URI(moduleName)\n            // Can't just use URI constructor, because URI(null, null, \"C:/foo/bar\", null) turns\n            // into `URI(\"C\", null, \"/foo/bar\", null)`.\n            else if (IoUtils.isWindowsAbsolutePath(moduleName)) Path.of(moduleName).toUri()\n            else URI(null, null, IoUtils.toNormalizedPathString(Path.of(moduleName)), null)\n          } catch (e: URISyntaxException) {\n            val message = buildString {\n              append(\"Module URI `$moduleName` has invalid syntax (${e.reason}).\")\n              if (e.index > -1) {\n                append(\"\\n\\n\")\n                append(moduleName)\n                append(\"\\n\")\n                append(\" \".repeat(e.index))\n                append(\"^\")\n              }\n            }\n            throw CliException(message)\n          }\n      }\n\n    fun RawOption.associateProps():\n      OptionWithValues<Map<String, String>, Pair<String, String>, Pair<String, String>> {\n      return convert {\n          val eq = it.indexOf('=')\n          if (eq == -1) it to \"true\" else it.substring(0, eq) to it.substring(eq + 1)\n        }\n        .multiple()\n        .toMap()\n    }\n\n    fun OptionWithValues<String?, String, String>.parseExternalReader(\n      delimiter: String\n    ): OptionWithValues<\n      Pair<String, ExternalReader>?,\n      Pair<String, ExternalReader>,\n      Pair<String, ExternalReader>,\n    > {\n      return splitPair(delimiter).convert {\n        val cmd = shlex(it.second)\n        Pair(it.first, ExternalReader(cmd.first(), cmd.drop(1)))\n      }\n    }\n  }\n\n  private val defaults = CliBaseOptions()\n\n  private val output =\n    arrayOf(\n      \"json\",\n      \"jsonnet\",\n      \"pcf\",\n      \"properties\",\n      \"plist\",\n      \"textproto\",\n      \"xml\",\n      \"yaml\",\n      \"pkl-binary\",\n    )\n\n  val allowedModules: List<Pattern> by\n    option(\n        names = arrayOf(\"--allowed-modules\"),\n        help = \"URI patterns that determine which modules can be loaded and evaluated.\",\n      )\n      .convert(\"pattern1,pattern2\") { Pattern.compile(it) }\n      .splitAll()\n\n  val allowedResources: List<Pattern> by\n    option(\n        names = arrayOf(\"--allowed-resources\"),\n        help = \"URI patterns that determine which external resources can be read.\",\n      )\n      .convert(\"pattern1,pattern2\") { Pattern.compile(it) }\n      .splitAll()\n\n  val rootDir: Path? by\n    option(\n        names = arrayOf(\"--root-dir\"),\n        help =\n          \"Restricts access to file-based modules and resources to those located under the root directory.\",\n      )\n      .single()\n      .path()\n\n  val cacheDir: Path? by\n    option(names = arrayOf(\"--cache-dir\"), help = \"The cache directory for storing packages.\")\n      .single()\n      .path()\n\n  val workingDir: Path by\n    option(\n        names = arrayOf(\"-w\", \"--working-dir\"),\n        help = \"Base path that relative module paths are resolved against.\",\n      )\n      .single()\n      .path()\n      .default(defaults.normalizedWorkingDir)\n\n  val properties: Map<String, String> by\n    option(\n        names = arrayOf(\"-p\", \"--property\"),\n        metavar = \"name=value\",\n        help = \"External property to set (repeatable).\",\n      )\n      .associateProps()\n\n  val color: Color by\n    option(\n        names = arrayOf(\"--color\"),\n        metavar = \"when\",\n        help =\n          \"Whether to format messages in ANSI color. Possible values of <when> are 'never', 'auto', and 'always'.\",\n      )\n      .enum<Color> { it.name.lowercase() }\n      .single()\n      .default(Color.AUTO)\n\n  val noCache: Boolean by\n    option(names = arrayOf(\"--no-cache\"), help = \"Disable caching of packages\")\n      .single()\n      .flag(default = false)\n\n  val format: String? by\n    option(\n        names = arrayOf(\"-f\", \"--format\"),\n        help = \"Output format to generate. <${output.joinToString()}>\",\n        completionCandidates = CompletionCandidates.Fixed(output.toSet()),\n      )\n      .single()\n\n  val envVars: Map<String, String> by\n    option(\n        names = arrayOf(\"-e\", \"--env-var\"),\n        metavar = \"name=value\",\n        help = \"Environment variable to set (repeatable).\",\n      )\n      .associate()\n\n  val modulePath: List<Path> by\n    option(\n        names = arrayOf(\"--module-path\"),\n        metavar = \"path1${File.pathSeparator}path2\",\n        help =\n          \"Directories, ZIP archives, or JAR archives to search when resolving `modulepath:` URIs.\",\n      )\n      .path()\n      .splitAll(File.pathSeparator)\n\n  val settings: URI? by\n    option(\n        names = arrayOf(\"--settings\"),\n        help = \"Pkl settings module to use.\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .single()\n      .convert { parseModuleName(it) }\n\n  val timeout: Duration? by\n    option(\n        names = arrayOf(\"-t\", \"--timeout\"),\n        metavar = \"number\",\n        help = \"Duration, in seconds, after which evaluation of a source module will be timed out.\",\n      )\n      .single()\n      .long()\n      .convert { Duration.ofSeconds(it) }\n\n  val caCertificates: List<Path> by\n    option(\n        names = arrayOf(\"--ca-certificates\"),\n        metavar = \"path\",\n        help = \"Only trust CA certificates from the provided file(s).\",\n      )\n      .path()\n      .multiple()\n\n  val proxy: URI? by\n    option(\n        names = arrayOf(\"--http-proxy\"),\n        metavar = \"address\",\n        help = \"Proxy to use for HTTP(S) connections.\",\n      )\n      .single()\n      .convert { URI(it) }\n      .validate { uri ->\n        require(\n          uri.scheme == \"http\" && uri.host != null && uri.path.isEmpty() && uri.userInfo == null\n        ) {\n          \"Malformed proxy URI (expecting `http://<host>[:<port>]`)\"\n        }\n      }\n\n  val noProxy: List<String>? by\n    option(\n        names = arrayOf(\"--http-no-proxy\"),\n        metavar = \"pattern1,pattern\",\n        help = \"Hostnames that should not be connected to via a proxy.\",\n      )\n      .single()\n      .split(\",\")\n\n  val httpRewrites: Map<URI, URI> by\n    option(\n        names = arrayOf(\"--http-rewrite\"),\n        metavar = \"from=to\",\n        help = \"URL prefixes that should be rewritten.\",\n      )\n      .convert { it ->\n        val uris = it.split(\"=\", limit = 2)\n        require(uris.size == 2) { \"Rewrites must be in the form of <from>=<to>\" }\n        try {\n          val (fromSpec, toSpec) = uris\n          val fromUri = URI(fromSpec).also { IoUtils.validateRewriteRule(it) }\n          val toUri = URI(toSpec).also { IoUtils.validateRewriteRule(it) }\n          fromUri to toUri\n        } catch (e: IllegalArgumentException) {\n          fail(e.message!!)\n        } catch (e: URISyntaxException) {\n          val message = buildString {\n            append(\"Rewrite target `${e.input}` has invalid syntax (${e.reason}).\")\n            if (e.index > -1) {\n              append(\"\\n\\n\")\n              append(e.input)\n              append(\"\\n\")\n              append(\" \".repeat(e.index))\n              append(\"^\")\n            }\n          }\n          fail(message)\n        }\n      }\n      .multiple()\n      .toMap()\n\n  val externalModuleReaders: Map<String, ExternalReader> by\n    option(\n        names = arrayOf(\"--external-module-reader\"),\n        metavar = \"<scheme>='<executable> [<arguments>]'\",\n        help = \"External reader registrations for module URI schemes\",\n      )\n      .parseExternalReader(\"=\")\n      .multiple()\n      .toMap()\n\n  val externalResourceReaders: Map<String, ExternalReader> by\n    option(\n        names = arrayOf(\"--external-resource-reader\"),\n        metavar = \"<scheme>='<executable> [<arguments>]'\",\n        help = \"External reader registrations for resource URI schemes\",\n      )\n      .parseExternalReader(\"=\")\n      .multiple()\n      .toMap()\n\n  val traceMode: TraceMode? by\n    option(\n        names = arrayOf(\"--trace-mode\"),\n        metavar = \"style\",\n        help =\n          \"Specifies how calls to trace() are formatted. Possible values of <style> are 'compact' and 'pretty'.\",\n      )\n      .enum<TraceMode> { it.name.lowercase() }\n      .single()\n\n  // hidden option used by native tests\n  private val testPort: Int by\n    option(names = arrayOf(\"--test-port\"), help = \"Internal test option\", hidden = true)\n      .single()\n      .int()\n      .default(-1)\n\n  fun baseOptions(\n    modules: List<URI>,\n    projectOptions: ProjectOptions? = null,\n    testMode: Boolean = false,\n    powerAssertionsEnabled: Boolean = false,\n  ): CliBaseOptions {\n    return CliBaseOptions(\n      sourceModules = modules,\n      allowedModules = allowedModules.ifEmpty { null },\n      allowedResources = allowedResources.ifEmpty { null },\n      environmentVariables = envVars.ifEmpty { null },\n      externalProperties = properties.ifEmpty { null },\n      modulePath = modulePath.ifEmpty { null },\n      workingDir = workingDir,\n      settings = settings,\n      rootDir = rootDir,\n      projectDir = projectOptions?.projectDir,\n      timeout = timeout,\n      moduleCacheDir = cacheDir ?: defaults.normalizedModuleCacheDir,\n      color = color,\n      noCache = noCache,\n      testMode = testMode,\n      testPort = testPort,\n      omitProjectSettings = projectOptions?.omitProjectSettings ?: false,\n      noProject = projectOptions?.noProject ?: false,\n      caCertificates = caCertificates,\n      httpProxy = proxy,\n      httpNoProxy = noProxy,\n      httpRewrites = httpRewrites.ifEmpty { null },\n      externalModuleReaders = externalModuleReaders,\n      externalResourceReaders = externalResourceReaders,\n      traceMode = traceMode,\n      powerAssertionsEnabled = powerAssertionsEnabled,\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/ModulesCommand.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.completion.CompletionCandidates\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.convert\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport java.net.URI\n\nabstract class ModulesCommand(name: String, helpLink: String) :\n  BaseCommand(name = name, helpLink = helpLink) {\n  open val modules: List<URI> by\n    argument(\n        name = \"modules\",\n        help = \"Module paths or URIs to evaluate.\",\n        completionCandidates = CompletionCandidates.Path,\n      )\n      .convert { BaseOptions.parseModuleName(it) }\n      .multiple(required = true)\n\n  protected val projectOptions: ProjectOptions by ProjectOptions()\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/NoOpCommand.kt",
    "content": "/*\n * Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.core.NoOpCliktCommand\nimport com.github.ajalt.clikt.core.context\n\nopen class NoOpCommand(name: String? = null) : NoOpCliktCommand(name) {\n  init {\n    context { readArgumentFile = null }\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/OptionExtensions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.parameters.options.NullableOption\nimport com.github.ajalt.clikt.parameters.options.OptionWithValues\nimport com.github.ajalt.clikt.parameters.options.transformAll\n\n/** Forbid this option from being repeated. */\nfun <EachT : Any, ValueT> NullableOption<EachT, ValueT>.single(): NullableOption<EachT, ValueT> {\n  return transformAll {\n    if (it.size > 1) {\n      fail(\"Option cannot be repeated\")\n    }\n    it.lastOrNull()\n  }\n}\n\n/**\n * Allow this option to be repeated and to receive multiple values separated by [separator]. This is\n * a mix of [split][com.github.ajalt.clikt.parameters.options.split] and\n * [multiple][com.github.ajalt.clikt.parameters.options.multiple] joined together.\n */\nfun <EachT : Any, ValueT> NullableOption<EachT, ValueT>.splitAll(\n  separator: String = \",\",\n  default: List<ValueT> = emptyList(),\n): OptionWithValues<List<ValueT>, List<ValueT>, ValueT> {\n  return copy(\n    transformValue = transformValue,\n    transformEach = { it },\n    transformAll = { it.flatten().ifEmpty { default } },\n    validator = {},\n    nvalues = 1..1,\n    valueSplit = { it.split(Regex.fromLiteral(separator)) },\n  )\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/ProjectOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.parameters.groups.OptionGroup\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\n\n/**\n * Options related to projects for CLI commands that are related to normal evaluation (`pkl eval`,\n * `pkl test`).\n */\nclass ProjectOptions : OptionGroup() {\n  val projectDir: Path? by\n    option(\n        names = arrayOf(\"--project-dir\"),\n        metavar = \"path\",\n        help =\n          \"The project directory to use for this command. By default, searches up from the working directory for a PklProject file.\",\n      )\n      .single()\n      .path()\n\n  val omitProjectSettings: Boolean by\n    option(\n        names = arrayOf(\"--omit-project-settings\"),\n        help = \"Ignores evaluator settings set in the PklProject file.\",\n      )\n      .single()\n      .flag(default = false)\n\n  val noProject: Boolean by\n    option(\n        names = arrayOf(\"--no-project\"),\n        help = \"Disables loading settings and dependencies from the PklProject file.\",\n      )\n      .single()\n      .flag(default = false)\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/TestOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.parameters.groups.OptionGroup\nimport com.github.ajalt.clikt.parameters.options.default\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliTestOptions\n\nclass TestOptions : OptionGroup() {\n  private val junitReportDir: Path? by\n    option(\n        names = arrayOf(\"--junit-reports\"),\n        metavar = \"dir\",\n        help = \"Directory where to store JUnit reports.\",\n      )\n      .path()\n\n  private val junitAggregateReports: Boolean by\n    option(\n        names = arrayOf(\"--junit-aggregate-reports\"),\n        help = \"Aggregate JUnit reports into a single file.\",\n      )\n      .flag()\n\n  private val junitAggregateSuiteName: String by\n    option(\n        names = arrayOf(\"--junit-aggregate-suite-name\"),\n        metavar = \"name\",\n        help = \"The name of the root JUnit test suite.\",\n      )\n      .single()\n      .default(\"pkl-tests\")\n\n  private val overwrite: Boolean by\n    option(names = arrayOf(\"--overwrite\"), help = \"Force generation of expected examples.\").flag()\n\n  val cliTestOptions: CliTestOptions by lazy {\n    CliTestOptions(junitReportDir, overwrite, junitAggregateReports, junitAggregateSuiteName)\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/extensions.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.commands\n\nimport com.github.ajalt.clikt.core.BaseCliktCommand\nimport com.github.ajalt.clikt.core.context\nimport com.github.ajalt.clikt.core.installMordantMarkdown\nimport com.github.ajalt.clikt.core.terminal\nimport com.github.ajalt.clikt.parameters.options.versionOption\nimport com.github.ajalt.mordant.rendering.TextStyle\nimport com.github.ajalt.mordant.rendering.Theme\nimport com.github.ajalt.mordant.terminal.Terminal\nimport org.pkl.core.Release\n\nprivate val theme = Theme { styles[\"markdown.code.span\"] = TextStyle(bold = true) }\n\nfun <T : BaseCliktCommand<T>> T.installCommonOptions(includeVersion: Boolean = true) {\n  installMordantMarkdown()\n\n  if (includeVersion) {\n    versionOption(\n      Release.current().versionInfo,\n      names = setOf(\"-v\", \"--version\"),\n      message = { if (commandName == \"pkl\") it else it.replaceFirst(\"Pkl\", commandName) },\n    )\n  }\n\n  context { terminal = Terminal(theme = theme) }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/main/resources/org/pkl/commons/cli/PklCARoots.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw\nCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT\nU0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2\nMDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh\ndGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG\nByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm\nacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN\nSeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME\nGDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW\nuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp\n15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN\nb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM\nMS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx\nMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00\nMTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD\nQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN\nBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z\n4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv\nYe+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ\nkmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs\nGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln\nnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh\n3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD\n0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy\ngeBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8\nANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB\nc6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI\npw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\ndEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS\n4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs\no0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ\nqM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw\nxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM\nrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4\nAXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR\n0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY\no7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5\ndDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE\noji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf\nMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD\nEy1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw\nHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY\nMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp\nYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa\nef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz\nSDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf\niOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X\nME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3\nIuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS\nVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE\nSJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu\n+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt\n8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L\nHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt\nzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P\nAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c\nmTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ\nYKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52\ngDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA\nFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB\nJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX\nDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui\nTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5\ndHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65\nLvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp\n0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY\nQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w\nLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w\nCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0\nMTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF\nQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI\nzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X\ntXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4\nAjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2\nKCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD\naAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu\nCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo\n9H1/IISpQuQo\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw\nCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T\nZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN\nMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG\nA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT\nZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC\nWvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+\n6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B\nAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa\nqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q\n4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw\ngb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL\nEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg\nMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw\nBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0\nMB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT\nMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1\nc3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ\nbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg\nUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ\n2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E\nT+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j\n5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM\nC1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T\nDtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX\nwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A\n2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm\nnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8\ndWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl\nN4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj\nc0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD\nVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS\n5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS\nGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr\nhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/\nB7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI\nAeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw\nH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+\nb7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk\n2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol\nIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk\n5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY\nn/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD\nVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU\nZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH\nMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO\nMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv\nZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz\nf2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO\n8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq\nd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM\ntTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt\nOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB\no0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD\nAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x\nPaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM\nwiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d\nGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH\n6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby\nRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx\niN66zB+Afko=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG\nEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo\nbm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g\nRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ\nTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s\nb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw\ndjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0\nWXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS\nfvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB\nzhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq\nhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB\nCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD\n+JbNR6iC8hZVdyR+EhCVBCyj\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG\nA1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg\nSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw\nMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln\nbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v\ndCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ\nBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ\nHdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH\n3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH\nGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c\nxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1\naylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq\nTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL\nBQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87\n/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4\nkqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG\nYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT\n+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo\nWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG\nEwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx\nIDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw\nMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln\nbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND\nIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci\nMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti\nsIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O\nBBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c\n3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J\n0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV\nBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g\nUk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ\nBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ\nR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF\ndRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw\nvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ\nuIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp\nn+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs\ncpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW\nxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P\nrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF\nDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx\nDTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy\nLcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C\neWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ\nd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq\nkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC\nb6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl\nqiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0\nOJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c\nNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk\nltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO\npwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj\n03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk\nPuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE\n1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX\nQRBdJ3NghVdJIgc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE\nBhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h\ncHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1\nMDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg\nQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9\nthDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM\ncas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG\nL9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i\nNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h\nX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b\nm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy\nZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja\nEbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T\nKI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF\n6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh\nOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc\ntHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd\nIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j\nb20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC\nAG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw\nADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m\niWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF\nSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ\nhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P\nVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE\nEAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV\n1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t\nCsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR\n5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw\nf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9\nivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK\nGbqEZycPvEJdvSRUDewdcAZfpLz6IHxV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD\nVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf\nBgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3\nYXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x\nNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G\nA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0\nd2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF\nQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG\nSM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN\nFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w\nDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw\nCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh\nDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw\nCQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x\nITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1\nc3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx\nOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI\nSWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI\nb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB\nALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn\nswuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu\n7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8\n1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW\n80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP\nJqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l\nRtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw\nhI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10\ncoos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc\nBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n\ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud\nDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W\n0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe\nuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q\nlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB\naCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE\nsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT\nMaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe\nqu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh\nVicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8\nh6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9\nEEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK\nyeC2nOnOcXHebD8WpHk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD\nVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf\nBgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3\nYXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x\nNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G\nA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0\nd2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF\nQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB\nBAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ\nj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF\n1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G\nA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3\nAZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC\nMGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu\nSw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw\nCQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw\nFgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S\nQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5\nMzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL\nDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS\nQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB\nBAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH\nsbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK\nUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD\nVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu\nSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC\nMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy\nv+c=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL\nBQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x\nFjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx\nMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s\nTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc\nIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU\nAyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+\nGrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9\n8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH\nflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt\nJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim\n0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN\npGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ\nUqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW\nOXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB\nAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet\n8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd\nnxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j\nbhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM\nKar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv\nTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS\nS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr\nI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9\nb91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB\nUvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P\nTi07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven\nsBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw\nRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY\nBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz\nMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u\nLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF\nK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0\nv/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd\ne4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD\nVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw\nV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA\nAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG\nGJTO\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV\nBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE\nCgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy\ndGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy\nMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G\nA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD\nDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq\nM0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf\nOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa\n4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9\nHSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR\naZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA\nb9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ\nGp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV\nPWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO\npgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu\nUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY\nMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV\nHSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4\n9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW\ns47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5\nSm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg\ncLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM\n79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz\n/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt\nll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm\nKf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK\nQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ\nw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi\nS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07\nmKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP\nMQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0\nZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa\nFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3\nYSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw\nqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv\nVcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6\nlZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz\nQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ\nKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK\nFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj\nHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr\ny+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ\n/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM\na/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6\nfsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV\nHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG\nSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi\n7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc\nSE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza\nZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc\nXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg\niLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho\nL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF\nNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr\nkkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+\nvhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU\nYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw\nCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91\nbmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg\nUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ\nBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu\nZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS\nb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni\neUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W\np2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T\nrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV\n57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg\nMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV\nBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk\nLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv\nb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ\nBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg\nTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v\nIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv\nxie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H\nWyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB\neAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo\njbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ\n+efcMQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE\nBhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h\ncHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy\nMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg\nQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9\nthDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM\ncas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG\nL9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i\nNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h\nX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b\nm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy\nZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja\nEbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T\nKI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF\n6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh\nOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD\nVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ncm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv\nACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl\nAGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF\n661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9\nam58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1\nILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481\nPyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS\n3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k\nSeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF\n3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM\nZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g\nStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz\nQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB\njLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV\nBAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu\nMRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy\nMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx\nEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw\nggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe\nNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH\nPWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I\nx2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe\nQTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR\nyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO\nQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912\nH9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ\nQfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD\ni/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs\nnLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1\nrqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\nDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI\nhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ntCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf\nGopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb\nlvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka\n+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal\nTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i\nnSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3\ngzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr\nG5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os\nzMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x\nL4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT\nAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD\nQTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP\nMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do\n0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ\nUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d\nRdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ\nOA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv\nJoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C\nAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O\nBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ\nLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY\nMnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ\n44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I\nJd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw\ni/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN\n9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM\nMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D\nZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU\ncnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3\nWjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg\nUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw\nIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH\nUV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM\nTXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU\nBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM\nkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x\nAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV\nHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y\nsHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL\nI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8\nJ9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY\nVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG\nA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw\nFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx\nMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u\naXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq\nhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b\nRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z\nYybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3\nQWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw\nyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+\nBlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ\nSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH\nr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0\n4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me\ndKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw\nq7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2\nnKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu\nH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA\nVC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC\nXtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd\n6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf\n+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi\nkvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7\nwry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB\nTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C\nMUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn\n4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I\naFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy\nqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB\ngTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\nA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV\nBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw\nMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl\nYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P\nRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3\nUcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI\n2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8\nQ5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp\n+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+\nDT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O\nnKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW\n/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g\nPKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u\nQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY\nSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv\nIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4\nzJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd\nBA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB\nZQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL\nMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\nBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT\nIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw\nMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy\nZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N\nT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR\nFtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J\ncfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW\nBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm\nfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv\nGDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF\nMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD\nbGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha\nME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM\nHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03\nUAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42\ntSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R\nySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM\nlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp\n/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G\nA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G\nA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj\ndG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy\nMENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl\ncmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js\nL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL\nBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni\nacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\no3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K\nzCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8\nPIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y\nJohw1+qRzT65ysCQblrGXnRl11z+o+I=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF\nMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD\nbGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw\nNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV\nBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn\nljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0\n3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z\nqQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR\np75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8\nHgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw\nggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea\nHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw\nOi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh\nc3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E\nRT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt\ndHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku\nY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp\n3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\nnsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF\nCSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na\nxpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX\nKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0\nLm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW\nKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw\nNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw\nNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy\nZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV\nBAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo\nNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4\n4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9\nKlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI\nrb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi\n94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB\nsDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi\ngA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo\nkORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE\nvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t\nO1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua\nAGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP\n9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/\neu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m\n0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML\nRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp\nbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5\nIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3\nMjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3\nLmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp\nYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG\nA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq\nK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe\nsYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX\nMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT\nXTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/\nHoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH\n4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV\nHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub\nj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo\nU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\nzX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b\nu/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+\nbYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er\nfF6adulZkMV8gzURZVE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe\nMQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0\nZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe\nFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw\nIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL\nSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH\nSyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh\nijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X\nDZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1\nTBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ\nfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA\nsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU\nWH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS\nnT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH\ndmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip\nNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC\nAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF\nMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB\nuvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl\nPwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP\nJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/\ngpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2\nj6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6\n5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB\no2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS\n/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z\nGp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE\nW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D\nhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\nUm9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\nQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\nui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\nttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\nBqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\nYyRIHN8wfdVoOw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE\nBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ\nIENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0\nMTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV\nBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w\nHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj\nDp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj\nTnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u\nKU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj\nqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm\nMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12\nZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP\nzgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk\nL30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC\njGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA\nHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC\nAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg\np8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm\nDRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5\nCOmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry\nL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf\nJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg\nIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io\n2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV\n09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ\nXR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq\nT8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe\nMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK\ngXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ\nW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg\n1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K\n8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r\n2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me\nz/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR\n8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj\nmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz\n7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6\n+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI\n0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\nAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm\nUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2\nLIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\n+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS\nk5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl\n7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm\nbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl\nurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+\nfUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63\nn749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE\n76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H\n9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT\n4PsJYGw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\nIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\nVOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\njgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\nA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\nU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\nN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\no/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\nrqXRfboQnoZsG4q5WTP468SQvvG5\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\nMTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\nRgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\ngHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\nKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\nQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\nXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\nLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\nRUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\njjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\n6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\nmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\nMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\nWD9f\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\nA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\nb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\nMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\nYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\naWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\njc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\nxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\nsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\nU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\nAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\nyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\n38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\nAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\nDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\nHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh\nMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE\nYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3\nMDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo\nZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg\nMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA\nPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w\nwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi\nEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY\navx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+\nYihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE\nsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h\n/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5\nIEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\nggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy\nOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P\nTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER\ndEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf\nReYNnyicsbkqWletNw+vHX/bvZ8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\nEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\nZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz\nNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\nEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE\nAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD\nE6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH\n/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy\nDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh\nGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR\ntDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA\nAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\nFDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX\nWWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu\n9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr\ngIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo\n2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI\n4uJEvlz36hz1\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD\nVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0\nZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G\nCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y\nOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx\nFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp\nZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP\nkd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc\ncbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U\nfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7\nN4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC\nxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1\n+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM\nPcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG\nSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h\nmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk\nddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c\n2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t\nHMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG\nEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3\nMDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl\ncnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR\ndGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB\npzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM\nb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm\naWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz\nIEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT\nlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz\nAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5\nVA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG\nILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2\nBJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG\nAQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M\nU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh\nbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C\n+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F\nuLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2\nXjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\nUm9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\nQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi\n9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk\nM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB\nMAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw\nCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW\n1KyLa2tJElMzrdfkviT8tQp21KW8EA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix\nDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k\nIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT\nN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v\ndENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG\nA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh\nZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx\nQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1\ndGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\nAQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA\n4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0\nAoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10\n4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C\nojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV\n9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD\ngfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6\nY5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq\nNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko\nLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc\nBw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd\nctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I\nXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI\nM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot\n9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V\nZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea\nj8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh\nX9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ\nl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf\nbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4\npcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK\ne7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0\nvm9qp/UsQu0yrbYhnr68\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA\nMEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD\nVQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy\nMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt\nc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ\nOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG\nvGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud\n316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo\n0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE\ny132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF\nzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE\n+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN\nI/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs\nx2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa\nByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC\n4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV\nHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4\n7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg\nJuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti\n2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk\npnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF\nFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt\nrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk\nZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5\nu+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP\n4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6\nN3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3\nvouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx\nCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD\nExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw\nMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex\nHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq\nR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd\nyXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ\n7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8\n+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL\nBQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\nBgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00\nMjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV\nwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe\nrNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341\n68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh\n4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp\nUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o\nabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc\n3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G\nKubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt\nhfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO\nTk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt\nzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD\nggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\nMTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2\ncDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN\nqXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5\nYCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv\nb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2\n8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k\nNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj\nZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp\nq1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt\nnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x\nGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv\nb3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV\nBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W\nYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa\nGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg\nFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J\nWpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB\nrrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp\n+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1\nksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i\nUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz\nPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og\n/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH\noycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI\nyV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud\nEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2\nA8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL\nMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\nElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f\nBluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn\ng/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl\nfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K\nWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha\nB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc\nhLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR\nTUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD\nmbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z\nohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y\n4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza\n8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL\nBQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\nBgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00\nMjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf\nqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW\nn4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym\nc5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+\nO7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1\no9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j\nIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq\nIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz\n8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh\nvNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l\n7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG\ncC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD\nggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\nAarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC\nroijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga\nW/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n\nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE\n+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV\ncsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd\ndbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg\nKCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM\nHVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4\nWSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x\nGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv\nb3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV\nBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W\nYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM\nV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB\n4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr\nH556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd\n8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv\nvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT\nmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe\nbtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc\nT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt\nWAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ\nc6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A\n4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD\nVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG\nCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0\naXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\naWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu\ndC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw\nczALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G\nA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC\nTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg\nUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0\n7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem\nd1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd\n+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B\n4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN\nt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x\nDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57\nk8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s\nzHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j\nWy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT\nmJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK\n4SVhM7JZG+Ju1zdXtg2pEto=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL\nBQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc\nBgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00\nMjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR\n/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu\nFoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR\nU7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c\nra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR\nFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k\nA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw\neyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl\nsSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp\nVzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q\nA4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+\nydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD\nggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\nKGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI\nFUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv\noxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg\nu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP\n0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf\n3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl\n8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+\nDhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN\nPlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/\nywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK\nMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x\nGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx\nMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg\nQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ\niQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa\n/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ\njnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI\nHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7\nsFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w\ngZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw\nKaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG\nAQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L\nURYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO\nH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm\nI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY\niNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr\nMCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG\nA1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0\nMDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp\nY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD\nQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz\ni1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8\nh9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV\nMdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9\nUK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni\n8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC\nh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD\nVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB\nAKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm\nKbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ\nX5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr\nQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5\npPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN\nQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI\nMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x\nFzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz\nMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv\ncnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz\nZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO\n0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao\nwW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj\n7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS\n8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT\nBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg\nJYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC\nNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3\n6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/\n3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm\nD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS\nCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY\nMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t\ndW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5\nWjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD\nVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8\n9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ\nDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9\nMs+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N\nQV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ\nxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G\nA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T\nAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG\nkl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr\nUj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5\nBw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU\nJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot\nRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl\nMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe\nU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX\nDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy\ndXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj\nYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV\nOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr\nzbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM\nVAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ\nhNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO\nojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw\nawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs\nOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3\nDQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF\ncoJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc\nokgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8\nt/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy\n1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/\nSjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw\nPTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy\ndGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9\nMQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0\nYWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2\n1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT\nvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed\naFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0\n1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5\nr3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5\ncBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ\nwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ\n6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA\n2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH\nWyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR\neiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB\n/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u\nd0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr\nPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d\n8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi\n1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd\nrRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di\ntaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7\nlcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj\nyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn\nKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy\nyCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n\nwXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6\nOV+KmalBWQewLK8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw\nCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu\nbHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ\nBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s\neSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK\n+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2\nQNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4\nhevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm\nut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG\nBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\nMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\nU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\nNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\nZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\nDQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\n8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\n+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\nX9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\nK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\n1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\nA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\nzt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\nYXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\nbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\nL7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\neruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\nVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\nWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs\nZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw\nMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj\naG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp\nY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg\nnLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1\nHOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N\nHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN\ndloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0\nHZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO\nBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G\nCSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU\nsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3\n4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg\n8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1\nmMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\nZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\nVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\nZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\ndmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\nOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\n8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\nTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\nhRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\n6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\nDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\nAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\nbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\nve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\nqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\n0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\nsSi6\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\nBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln\nbiBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF\nMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT\nd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\nCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8\n76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+\nbbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c\n6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE\nemA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd\nMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt\nMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y\nMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y\nFGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi\naG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM\ngI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB\nqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7\nlqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn\n8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\nL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6\n45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO\nUYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5\nO1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC\nbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv\nGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a\n77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC\nhdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3\n92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp\nLd6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w\nZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt\nQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE\nBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu\nIFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow\nRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY\nU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv\nFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br\nYT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF\nnbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH\n6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt\neJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/\nc8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ\nMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH\nHTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf\njNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6\n5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB\nrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\nF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c\nwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ncDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB\nAHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp\nWJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9\nxCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ\n2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ\nIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8\naRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X\nem1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR\ndAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/\nOMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+\nhAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy\ntGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV\nBAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk\nYWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV\nBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN\nMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF\nUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD\nVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v\ndCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj\ncqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q\nyGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH\n2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX\nH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL\nzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR\np1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz\nW7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/\nSiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn\nLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3\nn5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B\nu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj\no1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC\nAgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L\n9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej\nrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK\npFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0\nvPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq\nOknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ\n/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9\n2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI\n+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2\nMjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo\ntt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw\nNzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv\nb3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD\nVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2\nMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F\nVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1\n7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X\nZ75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+\n/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs\n81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm\ndtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe\nOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu\nsDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4\npgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs\nslESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ\narMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD\nVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG\n9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl\ndxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\n0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj\nTQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed\nY2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7\nQ4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI\nOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7\nvVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW\nt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn\nHL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx\nSK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\nKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\nBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\nYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1\nOTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\naXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\nZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd\nAqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC\nFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi\n1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq\njnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ\nwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/\nWSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy\nNsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC\nuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw\nIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6\ng1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\n9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP\nBSeOE6Fuwg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\nKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\nBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\nYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1\nOTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\naXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\nZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN\n8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/\nRLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4\nhqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5\nZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM\nEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1\nA/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy\nWL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ\n1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30\n6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT\n91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ne9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p\nTpPDpFQUWw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx\nEjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT\nVFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5\nNTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT\nB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF\n10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz\n0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh\nMBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH\nzIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc\n46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2\nyKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi\nlaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP\noA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA\nBDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE\nqYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm\n4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL\n1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\nLhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF\nH6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo\nRI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+\nnile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh\n15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW\n6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW\nnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j\nwa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz\naGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy\nKwbQBM0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES\nMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU\nV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz\nWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO\nLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm\naWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE\nAcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH\nK3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX\nRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z\nrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx\n3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq\nhkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC\nMErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls\nXebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D\nlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn\naspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ\nYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg\nMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh\nbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx\nMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET\nMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI\nxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k\nZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD\naNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw\nLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw\n1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX\nk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2\nSXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h\nbguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n\nWUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY\nrZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce\nMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu\nbAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN\nnsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt\nIxg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61\n55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj\nvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf\ncDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz\noHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp\nnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs\npA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v\nJJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R\n8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4\n5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL\nBQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg\nQ2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv\nb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG\nEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u\nIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ\nn56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd\n2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF\nVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ\nGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF\nli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU\nr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2\neY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb\nMlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg\njwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB\n7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW\n5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE\nITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0\n90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z\nxiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu\nQEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4\nFstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH\n22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP\nxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn\ndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5\nXc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b\nnV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ\nCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH\nu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj\nd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB\ngjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk\nMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY\nUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx\nNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3\ndy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy\ndmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6\n38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP\nKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q\nDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4\nqEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa\nJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi\nPvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P\nBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs\njVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0\neS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD\nggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR\nvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa\nIR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy\ni6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ\nO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN\nBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl\nc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl\nbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv\nb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ\nBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj\nYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5\nMUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0\ndXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg\nQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa\njq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi\nC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep\nlSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof\nTUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw\nCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS\nVVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5\nNTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG\nA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB\nBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC\n/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD\nwpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3\nOqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g\nPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf\nY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l\ndC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1\nc3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO\nPQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA\ny/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb\ngfM0agPnIjhQW+0ZT0MW\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD\nVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk\nMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U\ncnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y\nIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV\nBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw\nIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy\ndXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig\nRUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb\n3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA\nBoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5\n3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou\nowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/\nwZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF\nZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf\nBgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/\nMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv\ncivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2\nAHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F\nhcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50\nsoIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI\nWJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi\ntJ/X5g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV\nBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw\nIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy\ndXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig\nUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk\nMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg\nQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD\nVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy\ndXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\nAoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+\nQVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq\n1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp\n2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK\nDOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape\naz6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF\n3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88\noWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM\ng9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3\nmjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh\n8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd\nBgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U\nnrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw\nDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX\ndKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+\nMWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL\n/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX\nCI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa\nZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW\n2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7\nN6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3\nSewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB\nAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp\n5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu\n1uwJ\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs\nMQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl\nc2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg\nUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL\nMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl\nYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv\nb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l\nmwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE\n4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv\na9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M\npbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw\nKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b\nLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY\nAuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB\nAGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq\nE613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr\nW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ\nCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU\nX15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3\nf5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja\nH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP\nJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P\nzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt\njBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0\n/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT\nBGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79\naPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW\nxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU\n63ZTGI0RmLo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw\nCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh\ncmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v\ndCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG\nA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj\naCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg\nQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7\nKKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y\nSTHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD\nAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw\nSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN\nnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD\nVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk\nMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U\ncnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y\nIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB\npDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h\nIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG\nA1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU\ncnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid\nRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V\nseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme\n9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV\nEY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW\nhnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/\nDeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw\nDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\nggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I\n/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf\nke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ\nyonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts\nL1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN\nzl/HHk484IkzlQsPpTLWPFp5LBk=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH\nMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF\neHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx\nMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV\nBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog\nD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS\nsPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop\nO2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk\nsHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi\nc0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj\nVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz\nKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/\nTuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G\nsx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs\n1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD\nfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN\nl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR\nap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ\nVBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5\nc6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp\n4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s\nt2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj\n2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO\nvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C\nxR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx\ncmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM\nfjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9\nMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH\nbG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x\nCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds\nb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr\nb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9\nkmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm\nVHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R\nVogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc\nC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj\ntm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY\nD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv\nj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl\nNaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6\niIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP\nO6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV\nZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj\nL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5\n1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl\n1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU\nb3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV\nPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj\ny88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb\nEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg\nDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI\n+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy\nYiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX\nUB+K+wb1whnw0A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC\nVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T\nU0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx\nNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv\ndXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv\nbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49\nAgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA\nVIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku\nWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP\nMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX\n5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ\nytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg\nh5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC\nVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T\nU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0\naW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz\nWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0\nb24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS\nb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB\nBAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI\n7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg\nCemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud\nEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD\nVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T\nkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+\ngA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE\nBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK\nDA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz\nOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv\ndXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv\nbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN\nAQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R\nxFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX\nqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC\nC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3\n6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh\n/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF\nYD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E\nJNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc\nUS4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8\nZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm\n+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi\nM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV\nHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G\nA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV\ncpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc\nHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs\nPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/\nq5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0\ncuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr\na6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I\nH37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y\nK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu\nnLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf\noYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY\nIc2wBlX7Jz9TkHCpBB5XJ7k=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT\nAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD\nVQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx\nNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT\nHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5\nIENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\nAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl\ndB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK\nULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu\n9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O\nbe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV\nBAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw\nJQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2\nMDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg\nQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\nCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r\nCmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA\nlrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG\nTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7\n9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7\n8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4\ng160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we\nGVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst\n+3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M\n0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ\nT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw\nHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS\nYpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA\nFNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd\n9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI\nUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+\nOoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke\ngr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf\niAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV\nnuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD\n2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//\n1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad\nTdJ0MN1kURXbg4NR16/9M51NZg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB\nhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\nA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\nBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5\nMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\nEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\nQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR\n6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X\npz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC\n9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV\n/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf\nZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z\n+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w\nqP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah\nSL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC\nu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf\nFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq\ncrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\nFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB\n/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl\nwFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM\n4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV\n2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna\nFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ\nCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK\nboHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke\njkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL\nS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb\nQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl\n0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB\nNVOFBkpdn627G190\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\niDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\ncnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\nBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\nMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV\nBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy\ndGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\nAoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B\n3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY\ntJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/\nFp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2\nVN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT\n79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6\nc0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT\nYo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l\nc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee\nUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE\nHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\nBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G\nA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF\nUp/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO\nVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3\nATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs\n8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR\niQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze\nSf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ\nXHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/\nqS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\nVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\nL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\njjxDah2nGN59PRbxYvnKkKj9\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl\neSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT\nJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx\nMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT\nCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg\nVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm\naWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo\nI+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng\no4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G\nA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD\nVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB\nzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW\nRNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk\nMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH\nbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX\nDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD\nQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc\n8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke\nhOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD\nVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI\nKoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg\n515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO\nxwy8p2Fp8fc74SrL+SvzZpA3\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK\nMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu\nVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw\nMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw\nJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT\n3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU\n+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp\nS0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1\nbVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi\nT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL\nvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK\nVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK\ndHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT\nc+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv\nl7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N\niGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD\nggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\n6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt\nLRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93\nnAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3\n+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK\nW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT\nAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq\nl1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG\n4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ\nmUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A\n7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN\nMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu\nVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN\nMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0\nMSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7\nekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy\nRBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS\nbdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF\n/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R\n3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw\nEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy\n9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V\nGxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ\n2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV\nWaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD\nW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN\nAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\nt2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV\nDRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9\nTaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G\nlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW\nmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df\nWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5\n+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ\ntshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA\nGaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv\n8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw\nCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg\nR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00\nMDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT\nZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw\nEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW\n+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9\nItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI\nzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW\ntL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1\n/q4AaOeMSQ+2b1tbFfLn\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50\ncnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs\nIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz\ndCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy\nNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu\ndHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt\ndGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0\naG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T\nRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN\ncCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW\nwcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1\nU1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0\njaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN\nBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/\njTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\nRkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v\n1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R\nnAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH\nVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG\nA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3\nd3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu\ndHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq\nRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy\nMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD\nVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0\nL2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g\nZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi\nA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt\nByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH\nBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O\nBBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC\nR98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX\nhTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx\nCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ\nWiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ\nBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG\nTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/\nyBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf\nBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz\nWHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF\ntBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z\n374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC\nIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL\nmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7\nwk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS\nMKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2\nZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet\nUqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H\nYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3\nLmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD\nnFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1\nRXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM\nLVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf\n77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N\nJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm\nfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp\n6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp\n1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B\n9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok\nRqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv\nuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw\nCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw\nJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT\nEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0\nWjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT\nLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX\nBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE\nKI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm\nFy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8\nEF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J\nUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn\nnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6\nMQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu\nMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV\nBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw\nMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg\nU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo\nb3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ\nn0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q\np1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq\nNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF\n8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3\nHAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa\nmqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi\n7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF\nytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P\nqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ\nv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6\nTsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1\nvALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD\nggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4\nWxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo\nzMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR\n5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ\nGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf\n5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq\n0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D\nP78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM\nqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP\n0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf\nE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU\nMQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI\nT1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz\nMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF\nSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh\nbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z\nxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ\nspDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5\n58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR\nat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll\n5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq\nnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK\nV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/\npj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO\nz2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn\njSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+\nWGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF\n7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\nAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4\nYRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli\nawLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u\n+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88\nX7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN\nSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo\nP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI\n+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz\nznfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9\neVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2\nYqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy\nr/6zcCwupvI=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw\nCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ\nVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy\nMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ\nTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS\nb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B\nIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+\n+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK\nsVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD\nAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA\n94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B\n43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx\nGDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp\nbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w\nKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0\nBgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy\ndW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG\nEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll\nIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU\nQUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT\nTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg\nLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7\na9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr\nLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr\nN3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X\nYacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/\niSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f\nAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH\nV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL\nBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh\nAHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf\nIPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4\nlzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c\n8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf\nlo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\nTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\ncmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\nWhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\nZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\nMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\nh77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\nA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\nT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\nB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\nB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\nKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\nOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\njh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\nqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\nrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\nhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\nubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\nNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\nORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\nTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\njNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\noyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\nmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\nemyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx\nCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE\nAwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1\nNTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ\nMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq\nAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9\nvVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9\nlRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD\nn3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT\n7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o\n6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC\nTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6\nWT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R\nDolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI\npEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj\nYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy\nrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\nAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ\n8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi\n0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM\nA8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS\nSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K\nTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF\n6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er\n3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt\nTy3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT\nVmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW\nysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA\nrBPuUBQemMc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt\nMQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg\nRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i\nYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x\nCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG\nb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh\nbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3\nHEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx\nWuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX\n1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk\nu7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P\n99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r\nM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB\nBAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh\ncViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5\ngSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO\nZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf\naPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic\nNc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb\nMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\nGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj\nYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL\nMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\nBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM\nGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua\nBtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe\n3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4\nYgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR\nrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm\nez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU\noBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v\nQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t\nb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF\nAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q\nGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2\nG9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi\nl2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3\nsmPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE\nAwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw\nCQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ\nBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND\nVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb\nqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY\nHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo\nG2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA\nlHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr\nIA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/\n0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH\nk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47\n4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO\nm3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa\ncXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl\nuUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI\nKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls\nZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG\nAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\nVuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT\nVfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG\nCCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA\ncgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA\nQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA\n7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA\ncgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA\nQwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA\nczAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu\naHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt\naW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud\nDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF\nBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp\nD70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU\nJyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m\nAM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD\nvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms\ntn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH\n7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\nI6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA\nh1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF\nd3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H\npPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE\nBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w\nMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\nIENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC\nSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1\nODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv\nUTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX\n4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9\nKK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/\ngCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb\nrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ\n51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F\nbe8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe\nKF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F\nv6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn\nfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7\njPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz\nezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\nifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL\ne3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70\njsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz\nWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V\nSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j\npwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX\nX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok\nfcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R\nK4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU\nZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU\nLysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT\nLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE\nBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz\ndCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL\nMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp\ncm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP\nHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr\nba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL\nMeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1\nyHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr\nVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/\nnx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ\nKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG\nXUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj\nvbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt\nZ8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g\nN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC\nnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE\nBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz\ndCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL\nMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp\ncm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y\nYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua\nkCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL\nQESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp\n6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG\nyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i\nQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ\nKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO\ntDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu\nQY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ\nLgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u\nolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48\nx3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE\nBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz\ndCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG\nA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U\ncnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf\nqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ\nJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ\n+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS\ns8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5\nHMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7\n70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG\nV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S\nqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S\n5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia\nC1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX\nOwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE\nFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\nBAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2\nKI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B\n8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ\nMKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc\n0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ\nu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF\nu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH\nYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8\nGKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO\nRtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e\nKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC\nVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ\ncmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ\nBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt\nVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D\n0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9\nss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G\nA1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G\nA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs\naobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I\nflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE\nAwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG\nEwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM\nFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC\nREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp\nNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM\nVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+\nSZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ\n4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L\ncp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi\neowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV\nHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG\nA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3\nDQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j\nvZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP\nDpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc\nmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D\nlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv\nKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL\nBQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6\nZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw\nNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L\ncmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg\nUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN\nQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT\n3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw\n3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6\n3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5\nBSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN\nXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD\nAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF\nAAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw\n8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG\nnXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP\noky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy\nd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg\nLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB\ngDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu\nQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG\nA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz\nOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ\nVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3\nb3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA\nDGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn\n0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB\nOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE\nfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E\nSv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m\no130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i\nsx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW\nOZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez\nTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS\nadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n\n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ\nF/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf\nCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29\nXN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm\ndjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/\nWjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb\nAoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq\nP/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko\nb7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj\nXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P\n5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi\nDrW5viSP\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd\nMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg\nQ2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow\nTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw\nHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB\nBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y\nZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E\nN3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9\ntznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX\n0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c\n/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X\nKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY\nzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS\nO1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D\n34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP\nK9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3\nAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv\nTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj\nQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ncSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS\nIGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2\nHJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa\nO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv\n033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u\ndmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE\nkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41\n3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD\nu79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq\n4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD\nTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y\naXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx\nMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j\naWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP\nT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03\nsQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL\nTIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5\n/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp\n7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz\nEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt\nhxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP\na931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot\naK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg\nTnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV\nPKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv\ncWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL\ntbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd\nBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\nACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT\nej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL\njOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS\nESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy\nP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19\nxIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d\nCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN\n5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe\n/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z\nAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ\n5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd\nMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg\nQ2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow\nTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw\nHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB\nBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr\n6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV\nL4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91\n1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx\nMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ\nQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB\narcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr\nUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi\nFRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS\nP/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN\n9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP\nAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz\nuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h\n9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\nA20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t\nOluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo\n+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7\nKcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2\nDISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us\nH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ\nI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7\n5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h\n3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz\nY11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL\nBQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ\nSG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n\na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5\nNDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT\nCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u\nZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\nAoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO\ndem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI\nVoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV\n9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY\n2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY\nvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt\nbNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb\nx39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+\nl2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK\nTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj\nHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e\ni9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw\nDQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG\n7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk\nMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr\ngZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk\nGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS\n3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm\nOzj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+\nl6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c\nJfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP\nL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa\nLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG\nmpv0\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM\nBQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG\nT1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0\naW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx\nCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD\nb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA\niQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH\n38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE\nHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz\nkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP\nszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq\nvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf\nnZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG\nYQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo\n0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a\nCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K\nAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I\n36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB\nAf8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN\nqo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj\ncu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm\n+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL\nhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe\nlHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7\np/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8\npiKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR\nLBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX\n5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO\ndh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul\n9XXeifdy\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ \nRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD \nVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX \nDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y \nZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy \nVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr \nmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr \nIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK \nmpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu \nXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy \ndc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye \njl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 \nBE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 \nDQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 \n9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx \njkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 \nEpn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz \nksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS \nR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp \n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv\nb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl\ncnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c\nJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP\nmDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+\nwRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4\nVYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/\nAUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB\nAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun\npyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC\ndWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf\nfwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm\nNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx\nH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv\nb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl\ncnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA\nn61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc\nbiJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp\nEgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA\nbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu\nYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB\nAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW\nBBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI\nQW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I\n0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni\nlmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9\nB5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv\nON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\nIhNzbM8m9Yop5w==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw\nCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu\nZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg\nRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu\nY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq\nhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf\nZn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q\nRSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\nBAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD\nAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY\nJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv\n6pZjamVFkpUBtA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\nMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI\n2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx\n1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ\nq2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz\ntCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ\nvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV\n5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY\n1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4\nNeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG\nFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91\n8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe\npLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw\nCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu\nZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe\nFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw\nEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x\nIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF\nK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG\nfp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO\nZ9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd\nBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx\nAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/\noAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8\nsycX\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\nZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\nMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\nLmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\nRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\nPNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\nxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\nIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\nhzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\nEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\nFLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\nnzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\neM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\nhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\nYzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n+OkuE6N36B9K\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg\nRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu\nY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y\nithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If\nxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV\nySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO\nDCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ\njdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/\nCNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi\nEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM\nfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY\nuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK\nchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t\n9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\nhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\nggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2\nSV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd\n+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc\nfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa\nsjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N\ncCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N\n0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie\n4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI\nr/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1\n/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm\ngKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4\nMQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6\nZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD\nVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j\nb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq\nscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO\nxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H\nLmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX\nuaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD\nyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+\nJrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q\nrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN\nBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L\nhij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB\nQFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+\nHMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu\nZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg\nQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB\nBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\nMCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA\nA4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb\nlaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56\nawmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo\nJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw\nLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT\nVyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk\nLhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb\nUjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/\nQnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+\nnaM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls\nQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD\nVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG\nA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw\nWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz\nIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\nAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi\nQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR\nHYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D\n9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8\np/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw\nCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU\nMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw\nMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp\nY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo\n27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w\nCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw\nTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl\nqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH\nszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8\nY/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk\nMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92\nwO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p\naDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN\nVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID\nAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb\nC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe\nQkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy\nh6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4\n7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J\nZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef\nMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/\nZ6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT\n6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ\n0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm\n2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb\nbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw\nCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU\nMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw\nMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp\nY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt\nnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY\n6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu\nMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k\nRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg\nf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV\n+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo\ndDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW\nIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa\nG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq\ngc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID\nAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H\nvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8\n0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC\nB19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u\nNmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg\nyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev\nHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6\nxLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR\nTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg\nJPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV\n7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl\n6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD\nVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG\nA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw\nWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz\nIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\nAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G\njOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2\n4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7\nVKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm\nZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD\nVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh\nbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw\nMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g\nUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT\nBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx\nuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV\nHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/\n+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147\nbmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw\nCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD\nVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw\nMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV\nUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy\nb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq\nhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR\nogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb\nhGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3\nFQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV\nL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB\niudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl\nMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw\nNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5\nIDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG\nEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N\naWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ\nNt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0\nZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1\nHLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm\ngGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ\njEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc\naDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG\nYaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6\nW6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K\nUGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH\n+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q\nW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC\nNxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC\nLgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC\ngMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6\ntZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh\nSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2\nTaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3\npvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR\nxpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp\nGWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9\ndOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN\nAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB\nRA+GsCyRxj3qrg+E\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw\nCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS\nVVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5\nNDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG\nA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB\nBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS\nzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0\nQVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/\nVbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g\nPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf\nY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l\ndC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1\nc3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO\nPQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW\nwKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV\ndWNbFJWcHwHP2NVypw87\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw\nWjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw\nMiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x\nMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD\nVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX\nBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO\nty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M\nCiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu\nI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm\nTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh\nC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf\nePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz\nIoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT\nCo/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k\nJWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5\nhwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB\nGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\nFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of\n1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov\nL3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo\ndHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr\naHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq\nhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L\n6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG\nHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6\n0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB\nlA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi\no2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1\ngPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v\nfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63\nNwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh\njWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw\n3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV\nBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X\nDTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ\nBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4\nQCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny\ngQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw\nzBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q\n130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2\nJsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw\nDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw\nZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT\nAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj\nAQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG\n9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h\nbV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc\nfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu\nHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w\nt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN\nMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT\nHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN\nNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs\nIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+\najWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0\n2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp\nwgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM\npG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD\nnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po\nsMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx\nZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd\nLvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX\nKyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe\nXoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL\ntgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv\nTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN\nAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw\nGXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H\nPNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF\nO4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ\nREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik\nAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv\n/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+\np6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw\nMUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF\nqUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK\novfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp\nZ2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2\nMDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ\nbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG\nByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS\n7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp\n0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS\nB4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49\nBAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ\nLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4\nDXZDjC5Ty3zfDBeWUA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO\nMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD\nDBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX\nDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw\nb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC\nAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP\nL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY\nt6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins\nS657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3\nPnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO\nL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3\nR2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w\ndr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS\n+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS\nd66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG\nAtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f\ngTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j\nBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z\nNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt\nhEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM\nQtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf\nR4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ\nDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW\nP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy\nlrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq\nbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w\nAgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q\nr5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji\nMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU\n98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "pkl-commons-cli/src/svm/java/org/pkl/commons/cli/svm/InitFeature.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.svm;\n\nimport org.graalvm.nativeimage.hosted.Feature;\nimport org.pkl.core.runtime.BaseModule;\n\n/**\n * This class is registered with native-image via a CLI option (see Gradle task `nativeExecutable`).\n */\n@SuppressWarnings({\"unused\", \"ResultOfMethodCallIgnored\"})\npublic final class InitFeature implements Feature {\n  /**\n   * Enforce that {@link BaseModule#getModule()}'s static initializer completes before depending\n   * static initializers are invoked. This is necessary to avoid deadlocks in native-image's\n   * multi-threaded execution of static initializers. It's not clear at this point if multi-threaded\n   * initialization on the JVM could also deadlock, i.e., if this is a Pkl bug.\n   */\n  public void duringSetup(DuringSetupAccess access) {\n    BaseModule.getModule();\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/svm/java/org/pkl/commons/cli/svm/MessagePackRecomputations.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.svm;\n\nimport com.oracle.svm.core.annotate.Alias;\nimport com.oracle.svm.core.annotate.RecomputeFieldValue;\nimport com.oracle.svm.core.annotate.TargetClass;\n\n/**\n * native-image can't determine how calls to {@link sun.misc.Unsafe#arrayBaseOffset(Class)} affect\n * static fields in msgpack's {@code MessageBuffer}.\n *\n * <p>This informs the compiler which field to re-compute.\n */\n@SuppressWarnings(\"unused\")\n@TargetClass(className = \"org.msgpack.core.buffer.MessageBuffer\")\nfinal class MessagePackRecomputations {\n  @Alias\n  @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.ArrayBaseOffset, declClass = byte[].class)\n  static int ARRAY_BYTE_BASE_OFFSET;\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/svm/java/org/pkl/commons/cli/svm/PolyglotContextImplTarget.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.svm;\n\nimport com.oracle.svm.core.annotate.Alias;\nimport com.oracle.svm.core.annotate.RecomputeFieldValue;\nimport com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;\nimport com.oracle.svm.core.annotate.TargetClass;\nimport com.oracle.svm.truffle.TruffleFeature;\nimport java.util.Map;\nimport org.pkl.core.ast.builder.AstBuilder;\n\n/**\n * Workaround to prevent the native-image build error \"Detected a started Thread in the image\n * heap.\". The cause of this error is the use of {@link org.graalvm.polyglot.Context} in the\n * (intentionally) statically reachable class {@link org.pkl.core.runtime.StdLibModule}.\n *\n * <p>A cleaner solution would be to have a separate {@link AstBuilder} for stdlib modules that\n * produces a fully initialized module object without executing any Truffle nodes.\n *\n * <p>This class is automatically discovered by native-image; no registration is required.\n */\n@SuppressWarnings({\"unused\", \"ClassName\"})\n@TargetClass(\n    className = \"com.oracle.truffle.polyglot.PolyglotContextImpl\",\n    onlyWith = {TruffleFeature.IsEnabled.class})\npublic final class PolyglotContextImplTarget {\n  @Alias\n  @RecomputeFieldValue(kind = Kind.NewInstance, declClassName = \"java.util.HashMap\")\n  public Map<?, ?> threads;\n\n  @Alias\n  @RecomputeFieldValue(kind = Kind.Reset)\n  public WeakAssumedValueTarget singleThreadValue;\n\n  @Alias\n  @RecomputeFieldValue(kind = Kind.Reset)\n  public PolyglotThreadInfoTarget cachedThreadInfo;\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/svm/java/org/pkl/commons/cli/svm/PolyglotThreadInfoTarget.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.svm;\n\nimport com.oracle.svm.core.annotate.TargetClass;\nimport com.oracle.svm.truffle.TruffleFeature;\n\n/** Makes non-public class PolyglotThreadInfo usable above. */\n@TargetClass(\n    className = \"com.oracle.truffle.polyglot.PolyglotThreadInfo\",\n    onlyWith = {TruffleFeature.IsEnabled.class})\npublic final class PolyglotThreadInfoTarget {}\n"
  },
  {
    "path": "pkl-commons-cli/src/svm/java/org/pkl/commons/cli/svm/ThreadLocalHandshakeTarget.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.svm;\n\nimport com.oracle.svm.core.annotate.Alias;\nimport com.oracle.svm.core.annotate.RecomputeFieldValue;\nimport com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;\nimport com.oracle.svm.core.annotate.TargetClass;\nimport com.oracle.svm.truffle.TruffleFeature;\nimport java.util.Map;\n\n@SuppressWarnings(\"unused\")\n@TargetClass(\n    className = \"com.oracle.truffle.api.impl.ThreadLocalHandshake\",\n    onlyWith = {TruffleFeature.IsEnabled.class})\npublic final class ThreadLocalHandshakeTarget {\n  @Alias\n  @RecomputeFieldValue(kind = Kind.NewInstance, declClassName = \"java.util.HashMap\")\n  static Map<?, ?> SAFEPOINTS;\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/svm/java/org/pkl/commons/cli/svm/WeakAssumedValueTarget.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli.svm;\n\nimport com.oracle.svm.core.annotate.TargetClass;\nimport com.oracle.svm.truffle.TruffleFeature;\n\n/** Makes non-public class WeakAssumedValue usable. */\n@TargetClass(\n    className = \"com.oracle.truffle.polyglot.WeakAssumedValue\",\n    onlyWith = {TruffleFeature.IsEnabled.class})\npublic final class WeakAssumedValueTarget {}\n"
  },
  {
    "path": "pkl-commons-cli/src/test/kotlin/org/pkl/commons/cli/BaseCommandTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport com.github.ajalt.clikt.core.BadParameterValue\nimport com.github.ajalt.clikt.core.PrintHelpMessage\nimport com.github.ajalt.clikt.core.parse\nimport java.io.File\nimport java.nio.file.Path\nimport java.util.regex.Pattern\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader\n\nclass BaseCommandTest {\n\n  private val cmd =\n    object : BaseCommand(\"test\", \"\") {\n      override fun run() = Unit\n\n      override val helpString: String = \"\"\n    }\n\n  @Test\n  fun `invalid timeout`() {\n    val e = assertThrows<BadParameterValue> { cmd.parse(arrayOf(\"--timeout\", \"abc\")) }\n    assertThat(e.message).isEqualTo(\"abc is not a valid integer\")\n  }\n\n  @Test\n  fun `help queries do not present as errors`() {\n    assertThrows<PrintHelpMessage> { cmd.parse(arrayOf(\"--help\")) }\n  }\n\n  @Test\n  fun `difficult cases for external properties`() {\n    cmd.parse(arrayOf(\"-p\", \"flag1\", \"-p\", \"flag2=\", \"-p\", \"FOO=bar\", \"-p\", \"baz=qux=quux\"))\n    val props = cmd.baseOptions.baseOptions(emptyList()).externalProperties\n\n    assertThat(props)\n      .isEqualTo(mapOf(\"flag1\" to \"true\", \"flag2\" to \"\", \"FOO\" to \"bar\", \"baz\" to \"qux=quux\"))\n  }\n\n  @Test\n  fun `--allowed-modules, --allowed-resources and --module-path can be repeated`() {\n    cmd.parse(arrayOf(\"--allowed-modules\", \"m1,m2,m3\", \"--allowed-modules\", \"m4\"))\n\n    assertThat(cmd.baseOptions.allowedModules.map(Pattern::toString))\n      .isEqualTo(listOf(\"m1\", \"m2\", \"m3\", \"m4\"))\n\n    cmd.parse(arrayOf(\"--allowed-resources\", \"r1,r2,r3\", \"--allowed-resources\", \"r4\"))\n    assertThat(cmd.baseOptions.allowedResources.map(Pattern::toString))\n      .isEqualTo(listOf(\"r1\", \"r2\", \"r3\", \"r4\"))\n\n    val sep = File.pathSeparator\n    cmd.parse(arrayOf(\"--module-path\", \"p1${sep}p2${sep}p3\", \"--module-path\", \"p4\"))\n    assertThat(cmd.baseOptions.modulePath).isEqualTo(listOf(\"p1\", \"p2\", \"p3\", \"p4\").map(Path::of))\n\n    cmd.parse(arrayOf())\n    assertThat(cmd.baseOptions.allowedModules).isEmpty()\n\n    assertThat(cmd.baseOptions.allowedResources).isEmpty()\n  }\n\n  @Test\n  fun `--external-resource-reader and --external-module-reader are parsed correctly`() {\n    cmd.parse(\n      arrayOf(\n        \"--external-module-reader\",\n        \"scheme3=reader3\",\n        \"--external-module-reader\",\n        \"scheme4=reader4 with args\",\n        \"--external-module-reader\",\n        \"scheme+ext=reader5 with args\",\n        \"--external-resource-reader\",\n        \"scheme1=reader1\",\n        \"--external-resource-reader\",\n        \"scheme2=reader2 with args\",\n        \"--external-resource-reader\",\n        \"scheme+ext=reader5 with args\",\n      )\n    )\n    assertThat(cmd.baseOptions.externalModuleReaders)\n      .isEqualTo(\n        mapOf(\n          \"scheme3\" to ExternalReader(\"reader3\", emptyList()),\n          \"scheme4\" to ExternalReader(\"reader4\", listOf(\"with\", \"args\")),\n          \"scheme+ext\" to ExternalReader(\"reader5\", listOf(\"with\", \"args\")),\n        )\n      )\n    assertThat(cmd.baseOptions.externalResourceReaders)\n      .isEqualTo(\n        mapOf(\n          \"scheme1\" to ExternalReader(\"reader1\", emptyList()),\n          \"scheme2\" to ExternalReader(\"reader2\", listOf(\"with\", \"args\")),\n          \"scheme+ext\" to ExternalReader(\"reader5\", listOf(\"with\", \"args\")),\n        )\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-commons-cli/src/test/kotlin/org/pkl/commons/cli/CliCommandTest.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.cli\n\nimport com.github.ajalt.clikt.core.parse\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.ExperimentalPathApi\nimport kotlin.io.path.writeText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.ProjectOptions\nimport org.pkl.commons.writeString\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.util.IoUtils\n\n@OptIn(ExperimentalPathApi::class)\nclass CliCommandTest {\n\n  private val cmd =\n    object : BaseCommand(\"test\", \"\") {\n      val projectOptions: ProjectOptions by ProjectOptions()\n\n      override fun run() = Unit\n\n      override val helpString: String = \"\"\n    }\n\n  class CliTest(options: CliBaseOptions) : CliCommand(options) {\n    override fun doRun() = Unit\n\n    val myResolvedSourceModules = resolvedSourceModules\n    val myAllowedModules = allowedModules\n    val myAllowedResources = allowedResources\n    val myRootDir = rootDir\n    val myModulePath = modulePath\n    val myProxyAddress = proxyAddress\n    val myNoProxy = noProxy\n    val myHttpRewrites = httpRewrites\n    val myExternalModuleReaders = externalModuleReaders\n    val myExternalResourceReaders = externalResourceReaders\n\n    fun myEvaluatorBuilder() = evaluatorBuilder()\n\n    @Suppress(\"PklCliDirectProjectEvaluatorSettingsAccess\")\n    val myProjectEvaluatorSettings = project?.evaluatorSettings\n  }\n\n  @Test\n  fun `--external-resource-reader and --external-module-reader populate allowed modules and resources`() {\n    cmd.parse(\n      arrayOf(\n        \"--external-module-reader\",\n        \"scheme3=reader3\",\n        \"--external-module-reader\",\n        \"scheme4=reader4 with args\",\n        \"--external-module-reader\",\n        \"scheme+ext=reader5 with args\",\n        \"--external-resource-reader\",\n        \"scheme1=reader1\",\n        \"--external-resource-reader\",\n        \"scheme2=reader2 with args\",\n        \"--external-resource-reader\",\n        \"scheme+ext=reader5 with args\",\n      )\n    )\n    val opts = cmd.baseOptions.baseOptions(emptyList(), testMode = true)\n    val cliTest = CliTest(opts)\n    assertThat(cliTest.myAllowedModules.map { it.pattern() })\n      .isEqualTo(\n        SecurityManagers.defaultAllowedModules.map { it.pattern() } +\n          listOf(\"\\\\Qscheme3:\\\\E\", \"\\\\Qscheme4:\\\\E\", \"\\\\Qscheme+ext:\\\\E\")\n      )\n    assertThat(cliTest.myAllowedResources.map { it.pattern() })\n      .isEqualTo(\n        SecurityManagers.defaultAllowedResources.map { it.pattern() } +\n          listOf(\"\\\\Qscheme1:\\\\E\", \"\\\\Qscheme2:\\\\E\", \"\\\\Qscheme+ext:\\\\E\")\n      )\n  }\n\n  @Test\n  fun `@-notation package URIs - treated as relative paths when no project present`(\n    @TempDir tempDir: Path\n  ) {\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\"))\n    val opts = cmd.baseOptions.baseOptions(listOf(URI(\"@foo/bar.pkl\")), testMode = true)\n    val cliTest = CliTest(opts)\n    assertThat(cliTest.myResolvedSourceModules)\n      .isEqualTo(listOf(tempDir.toUri().resolve(\"@foo/bar.pkl\")))\n  }\n\n  @Test\n  fun `@-notation package URIs - empty paths are rejected`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"PklProject\")\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n    \"\"\"\n          .trimIndent()\n      )\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\"))\n    val opts = cmd.baseOptions.baseOptions(listOf(URI(\"@no.slash\")), testMode = true)\n    val exc = assertThrows<CliException> { CliTest(opts) }\n    assertThat(exc.message).isEqualTo(\"Invalid project dependency URI `@no.slash`.\")\n  }\n\n  @Test\n  fun `@-notation package URIs - missing dependencies are rejected`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"PklProject\")\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n    \"\"\"\n          .trimIndent()\n      )\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\"))\n    val opts = cmd.baseOptions.baseOptions(listOf(URI(\"@foo/bar.pkl\")), testMode = true)\n    val exc = assertThrows<CliException> { CliTest(opts) }\n    assertThat(exc.message).isEqualTo(\"Project does not contain dependency `@foo`.\")\n  }\n\n  @Test\n  fun `@-notation package URIs - local dependencies are rejected`(\n    @TempDir tempDir: Path,\n    @TempDir depDir: Path,\n  ) {\n    depDir\n      .resolve(\"PklProject\")\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n      \n      package {\n        name = \"foo\"\n        baseUri = \"package://example.com/foo\"\n        version = \"0.0.1\"\n        packageZipUrl = \"https://example.com/foo@\\(version).zip\"\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    tempDir\n      .resolve(\"PklProject\")\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n\n      dependencies {\n        [\"foo\"] = import(\"${depDir.toUri().resolve(\"PklProject\")}\")\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\"))\n    val opts = cmd.baseOptions.baseOptions(listOf(URI(\"@foo/bar.pkl\")), testMode = true)\n    val exc = assertThrows<CliException> { CliTest(opts) }\n    assertThat(exc.message)\n      .isEqualTo(\n        \"Only remote project dependencies may be referenced using @-notation. Dependency `@foo` is a local dependency.\"\n      )\n  }\n\n  @Test\n  fun `@-notation package URIs - remote dependencies are resolved`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"PklProject\")\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n\n      dependencies {\n        [\"foo\"] {\n          uri = \"package://example.com/foo@1.2.3\"\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\"))\n    val opts = cmd.baseOptions.baseOptions(listOf(URI(\"@foo/bar.pkl\")), testMode = true)\n    val cliTest = CliTest(opts)\n    assertThat(cliTest.myResolvedSourceModules)\n      .isEqualTo(listOf(tempDir.toUri().resolve(\"package://example.com/foo@1.2.3#/bar.pkl\")))\n  }\n\n  val projectWithAllEvaluatorSettings =\n    \"\"\"\n    amends \"pkl:Project\"\n    \n    evaluatorSettings {\n      externalProperties { [\"foo\"] = \"bar\" }\n      env { [\"foo\"] = \"bar\" }\n      allowedModules { \"file:\" }\n      allowedResources { \"file:\" }\n      color = \"always\"\n      noCache = true\n      modulePath { \"/tmp/modulepath\" }\n      timeout = 30.s\n      moduleCacheDir = \"/tmp/cache\"\n      rootDir = \"/tmp/root\"\n      http {\n        proxy {\n          address = \"http://example.com:80\"\n          noProxy { \"example.com\" }\n        }\n        rewrites {\n          [\"https://example.com/foo/\"] = \"https://example.com/bar/\"\n        }\n      }\n      externalModuleReaders {\n        [\"foo\"] { executable = \"foo\" }\n      }\n      externalResourceReaders {\n        [\"foo\"] { executable = \"foo\" }\n      }\n      traceMode = \"pretty\"\n    }\n  \"\"\"\n      .trimIndent()\n\n  @Test\n  fun `test that --omit-project-settings actually omits project settings`(@TempDir tempDir: Path) {\n    val project = tempDir.resolve(\"PklProject\").writeString(projectWithAllEvaluatorSettings)\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\", \"--omit-project-settings\"))\n    val opts =\n      cmd.baseOptions.baseOptions(listOf(project.toUri()), cmd.projectOptions, testMode = true)\n    val cliTest = CliTest(opts)\n    val builder = cliTest.myEvaluatorBuilder()\n    assertThat(cliTest.myAllowedModules).isEqualTo(SecurityManagers.defaultAllowedModules)\n    assertThat(cliTest.myAllowedResources).isEqualTo(SecurityManagers.defaultAllowedResources)\n    assertThat(cliTest.myRootDir).isNull()\n    assertThat(builder.environmentVariables).isEqualTo(System.getenv())\n    assertThat(builder.externalProperties).isEmpty()\n    assertThat(builder.moduleCacheDir).isEqualTo(IoUtils.getDefaultModuleCacheDir())\n    assertThat(cliTest.myModulePath).isEmpty()\n    assertThat(builder.color).isFalse\n    assertThat(cliTest.myProxyAddress).isNull()\n    assertThat(cliTest.myNoProxy).isNull()\n    assertThat(cliTest.myHttpRewrites).isNull()\n    assertThat(cliTest.myExternalModuleReaders).isEmpty()\n    assertThat(cliTest.myExternalResourceReaders).isEmpty()\n    assertThat(builder.traceMode).isEqualTo(TraceMode.COMPACT)\n  }\n\n  // hygiene test to ensure new evaluator settings get covered by the above test\n  @Test\n  fun `test project sets all evaluator settings`(@TempDir tempDir: Path) {\n    val project = tempDir.resolve(\"PklProject\").writeString(projectWithAllEvaluatorSettings)\n    cmd.parse(arrayOf(\"--working-dir=$tempDir\"))\n    val opts = cmd.baseOptions.baseOptions(listOf(project.toUri()), testMode = true)\n    val cliTest = CliTest(opts)\n    cliTest.myProjectEvaluatorSettings\n      ?.javaClass\n      ?.declaredMethods\n      ?.filter { it.parameterCount == 0 }\n      ?.forEach {\n        assertThat(it.invoke(cliTest.myProjectEvaluatorSettings))\n          .overridingErrorMessage(\"project evaluator settings returned null for ${it.name}\")\n          .isNotNull\n      }\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=compileClasspath\norg.opentest4j:opentest4j:1.3.0=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-commons-test/pkl-commons-test.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.security.MessageDigest\n\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n}\n\n// note: no need to publish this library\n\ndependencies {\n  api(libs.junitApi)\n  api(libs.junitEngine)\n  api(libs.junitParams)\n  api(projects.pklCommons) // for convenience\n  implementation(libs.assertj)\n  implementation(libs.msgpack)\n}\n\n/**\n * Creates test packages from the `src/test/files/packages` directory.\n *\n * These packages are used by PackageServer to serve assets when running LanguageSnippetTests and\n * PackageResolversTest.\n */\nval createTestPackages by tasks.registering\n\n// make sure that declaring a dependency on this project suffices to have test fixtures generated\ntasks.processResources {\n  dependsOn(createTestPackages)\n  dependsOn(exportCerts)\n}\n\nfor (packageDir in file(\"src/main/files/packages\").listFiles()!!) {\n  if (!packageDir.isDirectory) continue\n  val destinationDir = layout.buildDirectory.dir(\"test-packages/${packageDir.name}\")\n  val metadataJson = file(\"$packageDir/${packageDir.name}.json\")\n  val packageContents = packageDir.resolve(\"package\")\n  val zipFileName = \"${packageDir.name}.zip\"\n  val archiveFile = destinationDir.map { it.file(zipFileName) }\n\n  val zipTask =\n    tasks.register(\"zip-${packageDir.name}\", Zip::class) {\n      destinationDirectory.set(destinationDir)\n      archiveFileName.set(zipFileName)\n      from(packageContents)\n      // required so that checksums are reproducible\n      isPreserveFileTimestamps = false\n      isReproducibleFileOrder = true\n    }\n\n  val copyTask =\n    tasks.register(\"copy-${packageDir.name}\", Copy::class) {\n      dependsOn(zipTask)\n      from(metadataJson)\n      into(destinationDir)\n      val shasumFile = destinationDir.map { it.file(\"${packageDir.name}.json.sha256\") }\n      outputs.file(shasumFile)\n      filter { line ->\n        line.replaceFirst(\"\\$computedChecksum\", archiveFile.get().asFile.computeChecksum())\n      }\n      doLast {\n        val outputFile = destinationDir.get().asFile.resolve(\"${packageDir.name}.json\")\n        if (buildInfo.os.isWindows) {\n          val contents = outputFile.readText()\n          // workaround for https://github.com/gradle/gradle/issues/1151\n          outputFile.writeText(contents.replace(\"\\r\\n\", \"\\n\"))\n        }\n        shasumFile.get().asFile.writeText(outputFile.computeChecksum())\n      }\n    }\n\n  createTestPackages.configure { dependsOn(copyTask) }\n}\n\nval keystoreDir = layout.buildDirectory.dir(\"keystore\")\nval keystoreName = \"localhost.p12\"\nval keystoreFile = keystoreDir.map { it.file(keystoreName) }\nval certsFileName = \"localhost.pem\"\n\nval generateKeys by\n  tasks.registering(JavaExec::class) {\n    outputs.file(keystoreFile)\n    mainClass.set(\"sun.security.tools.keytool.Main\")\n    args =\n      listOf(\n        \"-genkeypair\",\n        \"-keyalg\",\n        \"RSA\",\n        \"-alias\",\n        \"integ_tests\",\n        \"-keystore\",\n        keystoreName,\n        \"-storepass\",\n        \"password\",\n        \"-dname\",\n        \"CN=localhost\",\n      )\n    workingDir(keystoreDir)\n    doFirst {\n      workingDir.mkdirs()\n      keystoreFile.get().asFile.delete()\n    }\n  }\n\nval exportCerts by\n  tasks.registering(JavaExec::class) {\n    val outputFile = keystoreDir.map { it.file(certsFileName) }\n    dependsOn(generateKeys)\n    inputs.file(keystoreFile)\n    outputs.file(outputFile)\n    mainClass.set(\"sun.security.tools.keytool.Main\")\n    args =\n      listOf(\n        \"-exportcert\",\n        \"-alias\",\n        \"integ_tests\",\n        \"-storepass\",\n        \"password\",\n        \"-keystore\",\n        keystoreName,\n        \"-rfc\",\n        \"-file\",\n        certsFileName,\n      )\n    workingDir(keystoreDir)\n    doFirst {\n      workingDir.mkdirs()\n      outputFile.get().asFile.delete()\n    }\n  }\n\nfun toHex(hash: ByteArray): String {\n  val hexDigitTable =\n    charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')\n  return buildString(hash.size * 2) {\n    for (b in hash) {\n      append(hexDigitTable[b.toInt() shr 4 and 0xF])\n      append(hexDigitTable[b.toInt() and 0xF])\n    }\n  }\n}\n\nfun File.computeChecksum(): String {\n  val md = MessageDigest.getInstance(\"SHA-256\")\n  val hash = md.digest(readBytes())\n  return toHex(hash)\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badChecksum@1.0.0/badChecksum@1.0.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/badChecksum@1.0.0\",\n  \"name\": \"bugs\",\n  \"packageZipUrl\": \"https://localhost:0/badChecksum@1.0.0/badChecksum@1.0.0.zip\",\n  \"dependencies\": {},\n  \"version\": \"1.0.0\",\n  \"packageZipChecksums\": {\n    \"sha256\": \"intentionally bogus checksum\"\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badChecksum@1.0.0/package/Bug.pkl",
    "content": "module bugs.Bug\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badImportsWithinPackage@1.0.0/badImportsWithinPackage@1.0.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/badImportsWithinPackage@1.1.0\",\n  \"name\": \"badImportsWithinPackage\",\n  \"packageZipUrl\": \"https://localhost:0/badImportsWithinPackage@1.0.0/badImportsWithinPackage@1.0.0.zip\",\n  \"dependencies\": {},\n  \"version\": \"1.0.0\",\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badImportsWithinPackage@1.0.0/package/invalidPath.pkl",
    "content": "res = import(\"not/a/valid/path.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badImportsWithinPackage@1.0.0/package/invalidPathRead.pkl",
    "content": "res = read(\"not/a/valid/path.txt\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badImportsWithinPackage@1.0.0/package/unknownDependency.pkl",
    "content": "res = import(\"@fruits/Foo.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badImportsWithinPackage@1.0.0/package/unknownDependencyRead.pkl",
    "content": "res = read(\"@notapackage/Foo.txt\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badMetadataJson@1.0.0/badMetadataJson@1.0.0.json",
    "content": "this is not json\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badMetadataJson@1.0.0/package/Bug.pkl",
    "content": "module bugs.Bug\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badPackageZipUrl@1.0.0/badPackageZipUrl@1.0.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/badPackagezipUrl@1.1.0\",\n  \"name\": \"bugs\",\n  \"packageZipUrl\": \"ftp://wait/a/minute\",\n  \"dependencies\": {},\n  \"version\": \"1.0.0\",\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/badPackageZipUrl@1.0.0/package/Bug.pkl",
    "content": "module bugs.Bug\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/birds@0.5.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"name\": \"birds\",\n  \"packageUri\": \"package://localhost:0/birds@0.5.0\",\n  \"packageZipUrl\": \"https://localhost:0/birds@0.5.0/birds@0.5.0.zip\",\n  \"dependencies\": {\n    \"fruities\": {\n      \"uri\": \"package://localhost:0/fruit@1.0.5\",\n      \"checksums\": {\n        \"sha256\": \"8ff80e5ac882650e817f261c8af024bf0db9b07888c9d18c20017457e04ffe06\"\n      }\n    }\n  },\n  \"version\": \"0.5.0\",\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCodeUrlScheme\": \"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\n  \"sourceCode\": \"https://example.com/birds\",\n  \"documentation\": \"https://example.com/bird-docs\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"petey-bird@example.com\",\n    \"polly-bird@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/birds/issues\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/package/Bird.pkl",
    "content": "open module birds.Bird\n\nimport \"@fruities/Fruit.pkl\"\n\nname: String\n\nfavoriteFruit: Fruit\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/package/allFruit.pkl",
    "content": "module birds.allFruit\n\nfruit = import*(\"@fruities/catalog/*.pkl\")\nfruitFiles = read*(\"@fruities/catalog/*.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/package/catalog/Ostrich.pkl",
    "content": "amends \"../Bird.pkl\"\n\nname = \"Ostrich\"\n\nfavoriteFruit {\n  name = \"Orange\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/package/catalog/Swallow.pkl",
    "content": "amends \"../Bird.pkl\"\n\nimport \"@fruities/catalog/apple.pkl\"\n\nname = \"Swallow\"\n\nfavoriteFruit = apple\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/package/catalog.pkl",
    "content": "module birds.catalog\n\ncatalog = import*(\"catalog/*.pkl\")\ncatalogFiles = read*(\"catalog/*.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.5.0/package/some/dir/Bird.pkl",
    "content": "amends \"...\"\n\nname = \"Bird\"\n\nfavoriteFruit {\n  name = \"Fruit\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/birds@0.6.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"name\": \"birds\",\n  \"packageUri\": \"package://localhost:0/birds@0.6.0\",\n  \"packageZipUrl\": \"https://localhost:0/birds@0.6.0/birds@0.6.0.zip\",\n  \"dependencies\": {\n    \"fruities\": {\n      \"uri\": \"package://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c\"\n      }\n    }\n  },\n  \"version\": \"0.6.0\",\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCodeUrlScheme\": \"https://example.com/birds/v0.6.0/blob%{path}#L%{line}-L%{endLine}\",\n  \"sourceCode\": \"https://example.com/birds\",\n  \"documentation\": \"https://example.com/bird-docs\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"petey-bird@example.com\",\n    \"polly-bird@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/birds/issues\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/package/Bird.pkl",
    "content": "open module birds.Bird\n\nimport \"@fruities/Fruit.pkl\"\n\nname: String\n\nfavoriteFruit: Fruit\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/package/allFruit.pkl",
    "content": "module birds.allFruit\n\nfruit = import*(\"@fruities/catalog/*.pkl\")\nfruitFiles = read*(\"@fruities/catalog/*.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/package/catalog/Ostrich.pkl",
    "content": "amends \"../Bird.pkl\"\n\nname = \"Ostrich\"\n\nfavoriteFruit {\n  name = \"Orange\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/package/catalog/Swallow.pkl",
    "content": "amends \"../Bird.pkl\"\n\nimport \"@fruities/catalog/apple.pkl\"\n\nname = \"Swallow\"\n\nfavoriteFruit = apple\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/package/catalog.pkl",
    "content": "module birds.catalog\n\ncatalog = import*(\"catalog/*.pkl\")\ncatalogFiles = read*(\"catalog/*.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.6.0/package/some/dir/Bird.pkl",
    "content": "amends \"...\"\n\nname = \"Bird\"\n\nfavoriteFruit {\n  name = \"Fruit\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/birds@0.7.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"name\": \"birds\",\n  \"packageUri\": \"package://localhost:0/birds@0.7.0\",\n  \"packageZipUrl\": \"https://localhost:0/birds@0.7.0/birds@0.7.0.zip\",\n  \"dependencies\": {\n    \"fruities\": {\n      \"uri\": \"package://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c\"\n      }\n    }\n  },\n  \"version\": \"0.7.0\",\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCodeUrlScheme\": \"https://example.com/birds/v0.7.0/blob%{path}#L%{line}-L%{endLine}\",\n  \"sourceCode\": \"https://example.com/birds\",\n  \"documentation\": \"https://example.com/bird-docs\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"petey-bird@example.com\",\n    \"polly-bird@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/birds/issues\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/package/Bird.pkl",
    "content": "open module birds.Bird\n\nimport \"@fruities/Fruit.pkl\"\n\nname: String\n\nfavoriteFruit: Fruit\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/package/allFruit.pkl",
    "content": "module birds.allFruit\n\nfruit = import*(\"@fruities/catalog/*.pkl\")\nfruitFiles = read*(\"@fruities/catalog/*.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/package/catalog/Ostrich.pkl",
    "content": "amends \"../Bird.pkl\"\n\nname = \"Ostrich\"\n\nfavoriteFruit {\n  name = \"Orange\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/package/catalog/Swallow.pkl",
    "content": "amends \"../Bird.pkl\"\n\nimport \"@fruities/catalog/apple.pkl\"\n\nname = \"Swallow\"\n\nfavoriteFruit = apple\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/package/catalog.pkl",
    "content": "module birds.catalog\n\ncatalog = import*(\"catalog/*.pkl\")\ncatalogFiles = read*(\"catalog/*.pkl\")\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/birds@0.7.0/package/some/dir/Bird.pkl",
    "content": "amends \"...\"\n\nname = \"Bird\"\n\nfavoriteFruit {\n  name = \"Fruit\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/deprecated@1.0.0/deprecated@1.0.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/deprecated@1.0.0\",\n  \"name\": \"deprecated\",\n  \"version\": \"1.0.0\",\n  \"packageZipUrl\": \"https://localhost:0/deprecated@1.0.0/deprecated@1.0.0.zip\",\n  \"dependencies\": {},\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCode\": \"https://example.com/deprecated\",\n  \"documentation\": \"https://example.com/deprecated-docs\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"deprecated@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/deprecated/issues\",\n  \"annotations\": [\n    {\n      \"type\": \"PObject\",\n      \"classInfo\": {\n        \"moduleName\": \"pkl.base\",\n        \"class\": \"Deprecated\",\n        \"moduleUri\": \"pkl:base\"\n      },\n      \"properties\": {\n        \"since\": \"1.0.0\",\n        \"message\": \"don't use\",\n        \"replaceWith\": null\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/deprecated@1.0.0/package/deprecated.pkl",
    "content": "/// A module from a deprecated package\nmodule deprecated.deprecated\n\n/// Old foo\n@Deprecated { replaceWith = \"bar\" }\nfoo: Int = 1\n\n/// New bar\nbar: Int = 2\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.0.5/fruit@1.0.5.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/fruit@1.0.5\",\n  \"name\": \"fruit\",\n  \"version\": \"1.0.5\",\n  \"packageZipUrl\": \"https://localhost:0/fruit@1.0.5/fruit@1.0.5.zip\",\n  \"dependencies\": {},\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCode\": \"https://example.com/fruit\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"apple-1@example.com\",\n    \"banana-2@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/fruit/issues\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.0.5/package/Fruit.pkl",
    "content": "module fruit.Fruit\n\nname: String\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.0.5/package/catalog/apple.pkl",
    "content": "amends \"../Fruit.pkl\"\n\nname = \"Apple\"\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.1.0/fruit@1.1.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/fruit@1.1.0\",\n  \"name\": \"fruit\",\n  \"version\": \"1.1.0\",\n  \"packageZipUrl\": \"https://localhost:0/fruit@1.1.0/fruit@1.1.0.zip\",\n  \"dependencies\": {},\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCode\": \"https://example.com/fruit\",\n  \"documentation\": \"https://example.com/fruit-docs\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"apple-1@example.com\",\n    \"banana-2@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/fruit/issues\"\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.1.0/package/Fruit.pkl",
    "content": "module fruit.Fruit\n\nname: String\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.1.0/package/catalog/apple.pkl",
    "content": "amends \"../Fruit.pkl\"\n\nname = \"Apple 🍎\"\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/fruit@1.1.0/package/catalog/pineapple.pkl",
    "content": "amends \"../Fruit.pkl\"\n\nname = \"Pineapple 🍍\"\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/packageContainingWildcardCharacters@1.0.0/package/name with [wildcard]! characters~~.pkl",
    "content": ""
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/packageContainingWildcardCharacters@1.0.0/packageContainingWildcardCharacters@1.0.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/packageContainingWildcardCharacters@1.0.0\",\n  \"name\": \"packageContainingWildcardCharacters\",\n  \"version\": \"1.0.0\",\n  \"packageZipUrl\": \"https://localhost:0/packageContainingWildcardCharacters@1.0.0/packageContainingWildcardCharacters@1.0.0.zip\",\n  \"dependencies\": {},\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/unlisted@1.0.0/package/unlisted.pkl",
    "content": "/// No docs are actually generated for this module\nmodule unlisted.unlisted\n\n/// 1\nfoo: Int = 1\n"
  },
  {
    "path": "pkl-commons-test/src/main/files/packages/unlisted@1.0.0/unlisted@1.0.0.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"packageUri\": \"package://localhost:0/unlisted@1.0.0\",\n  \"name\": \"unlisted\",\n  \"version\": \"1.0.0\",\n  \"packageZipUrl\": \"https://localhost:0/unlisted@1.0.0/unlisted@1.0.0.zip\",\n  \"dependencies\": {},\n  \"packageZipChecksums\": {\n    \"sha256\": \"$computedChecksum\"\n  },\n  \"sourceCode\": \"https://example.com/unlisted\",\n  \"documentation\": \"https://example.com/unlisted-docs\",\n  \"license\": \"UNLICENSED\",\n  \"authors\": [\n    \"unlisted@example.com\"\n  ],\n  \"issueTracker\": \"https://example.com/unlisted/issues\",\n  \"annotations\": [\n    {\n      \"type\": \"PObject\",\n      \"classInfo\": {\n        \"moduleName\": \"pkl.base\",\n        \"class\": \"Unlisted\",\n        \"moduleUri\": \"pkl:base\"\n      },\n      \"properties\": {}\n    }\n  ]\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/Executables.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.exists\nimport org.pkl.commons.test.FileTestUtils.rootProjectDir\n\nsealed class ExecutablePaths(protected val gradleProject: String) {\n  abstract val allNative: List<Path>\n\n  val existingNative: List<Path>\n    get() = allNative.filter(Files::exists)\n\n  val firstExistingNative: Path\n    get() =\n      existingNative.firstOrNull()\n        ?: throw AssertionError(\n          \"Native executable not found on system. \" +\n            \"To fix this problem, run `./gradlew $gradleProject:assembleNative`.\"\n        )\n\n  protected fun executable(name: String): Path =\n    rootProjectDir.resolve(\"$gradleProject/build/executable\").resolve(name)\n\n  protected fun javaExecutable(name: String): Path {\n    val isWindows = System.getProperty(\"os.name\").startsWith(\"Windows\")\n    val effectiveName = if (isWindows) \"$name.bat\" else name\n    return rootProjectDir.resolve(\"$gradleProject/build/executable\").resolve(effectiveName).also {\n      path ->\n      if (!path.exists()) {\n        throw AssertionError(\n          \"Java executable not found on system. \" +\n            \"To fix this problem, run `./gradlew $gradleProject:javaExecutable`.\"\n        )\n      }\n    }\n  }\n}\n\n@Suppress(\"ClassName\")\nobject Executables {\n\n  object pkl : ExecutablePaths(\"pkl-cli\") {\n    val macAarch64: Path = executable(\"pkl-macos-aarch64\")\n    val macAmd64: Path = executable(\"pkl-macos-amd64\")\n    val linuxAarch64: Path = executable(\"pkl-linux-aarch64\")\n    val linuxAmd64: Path = executable(\"pkl-linux-amd64\")\n    val alpineAmd64: Path = executable(\"pkl-alpine-linux-amd64\")\n    val windowsAmd64: Path = executable(\"pkl-windows-amd64.exe\")\n\n    // order (aarch64 before amd64, linux before alpine) affects [firstExisting]\n    override val allNative: List<Path> =\n      listOf(macAarch64, macAmd64, linuxAarch64, linuxAmd64, alpineAmd64, windowsAmd64)\n  }\n\n  object pkldoc : ExecutablePaths(\"pkl-doc\") {\n    val macAarch64: Path = executable(\"pkldoc-macos-aarch64\")\n    val macAmd64: Path = executable(\"pkldoc-macos-amd64\")\n    val linuxAarch64: Path = executable(\"pkldoc-linux-aarch64\")\n    val linuxAmd64: Path = executable(\"pkldoc-linux-amd64\")\n    val alpineAmd64: Path = executable(\"pkldoc-alpine-linux-amd64\")\n    val windowsAmd64: Path = executable(\"pkldoc-windows-amd64.exe\")\n\n    val javaExecutable: Path by lazy { javaExecutable(\"jpkldoc\") }\n\n    // order (aarch64 before amd64, linux before alpine) affects [firstExisting]\n    override val allNative: List<Path> =\n      listOf(macAarch64, macAmd64, linuxAarch64, linuxAmd64, alpineAmd64, windowsAmd64)\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/FakeHttpResponse.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport java.net.URI\nimport java.net.http.HttpClient\nimport java.net.http.HttpHeaders\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse\nimport java.util.*\nimport javax.net.ssl.SSLSession\n\nclass FakeHttpResponse<T : Any> : HttpResponse<T> {\n  companion object {\n    @Suppress(\"unused\")\n    fun <T : Any> withBody(block: FakeHttpResponse<T>.() -> Unit): FakeHttpResponse<T> =\n      FakeHttpResponse<T>().apply(block)\n\n    fun withoutBody(block: FakeHttpResponse<Unit>.() -> Unit): FakeHttpResponse<Unit> =\n      FakeHttpResponse<Unit>().apply { body = Unit }.apply(block)\n  }\n\n  var statusCode: Int = 200\n  var request: HttpRequest = HttpRequest.newBuilder().uri(URI(\"https://example.com\")).build()\n  var uri: URI = URI(\"https://example.com\")\n  var version: HttpClient.Version = HttpClient.Version.HTTP_2\n\n  lateinit var headers: HttpHeaders\n  lateinit var body: T\n\n  override fun statusCode(): Int = statusCode\n\n  override fun request(): HttpRequest = request\n\n  override fun previousResponse(): Optional<HttpResponse<T>> = Optional.empty()\n\n  override fun headers(): HttpHeaders = headers\n\n  override fun body(): T = body\n\n  override fun sslSession(): Optional<SSLSession> = Optional.empty()\n\n  override fun uri(): URI = uri\n\n  override fun version(): HttpClient.Version = version\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/FileTestUtils.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport java.nio.file.Path\nimport java.util.stream.Collectors\nimport kotlin.io.path.*\nimport org.assertj.core.api.Assertions.fail\nimport org.opentest4j.AssertionFailedError\nimport org.pkl.commons.*\n\nobject FileTestUtils {\n  @JvmStatic\n  val rootProjectDir: Path by lazy {\n    val workingDir = currentWorkingDir\n    workingDir.takeIf { it.resolve(\"settings.gradle.kts\").exists() }\n      ?: workingDir.parent.takeIf { it.resolve(\"settings.gradle.kts\").exists() }\n      ?: workingDir.parent.parent.takeIf { it.resolve(\"settings.gradle.kts\").exists() }\n      ?: throw AssertionError(\"Failed to locate root project directory.\")\n  }\n  val selfSignedCertificate: Path by lazy {\n    rootProjectDir.resolve(\"pkl-commons-test/build/keystore/localhost.pem\")\n  }\n\n  fun writeCertificateWithMissingLines(dir: Path): Path {\n    val lines = selfSignedCertificate.readLines()\n    // drop some lines in the middle\n    return dir.resolve(\"invalidCerts.pem\").writeLines(lines.take(5) + lines.takeLast(5))\n  }\n}\n\nfun Path.listFilesRecursively(): List<Path> =\n  walk(99).use { paths ->\n    paths.filter { it.isRegularFile() || it.isSymbolicLink() }.collect(Collectors.toList())\n  }\n\ndata class SnippetOutcome(val expectedOutFile: Path, val actual: String, val success: Boolean) {\n  private val expectedErrFile =\n    expectedOutFile.resolveSibling(expectedOutFile.toString().replaceAfterLast('.', \"err\"))\n\n  private val expectedOutExists = expectedOutFile.exists()\n  private val expectedErrExists = expectedErrFile.exists()\n  private val overwrite\n    get() = System.getenv().containsKey(\"OVERWRITE_SNIPPETS\")\n\n  private val expected by lazy {\n    when {\n      expectedOutExists && expectedErrExists ->\n        fail(\"Test has both expected out and .err files: $displayName\")\n      expectedOutExists -> expectedOutFile.readString()\n      expectedErrExists -> expectedErrFile.readString()\n      else -> \"\"\n    }\n  }\n\n  private val displayName by lazy {\n    val path = expectedOutFile.toString()\n    val baseDir = \"src/test/files\"\n    val index = path.indexOf(baseDir)\n    val endIndex = path.lastIndexOf('.')\n    if (index == -1 || endIndex == -1) path else path.substring(index + baseDir.length, endIndex)\n  }\n\n  fun check() {\n    when {\n      success && !expectedOutExists && !expectedErrExists && actual.isBlank() -> return\n      !success && expectedOutExists && !overwrite ->\n        failWithDiff(\"Test was expected to succeed, but failed: $displayName\")\n      !success && expectedOutExists -> {\n        expectedOutFile.deleteExisting()\n        expectedErrFile.writeString(actual)\n        fail(\"Wrote file $expectedErrFile for $displayName and deleted $expectedOutFile\")\n      }\n      success && expectedErrExists && !overwrite ->\n        failWithDiff(\"Test was expected to fail, but succeeded: $displayName\")\n      success && expectedErrExists -> {\n        expectedErrFile.deleteExisting()\n        expectedOutFile.writeString(actual)\n        fail(\"Wrote file $expectedOutFile for $displayName and deleted $expectedErrFile\")\n      }\n      !expectedOutExists && !expectedErrExists && actual.isNotBlank() -> {\n        val file = if (success) expectedOutFile else expectedErrFile\n        file.createParentDirectories().writeString(actual)\n        failWithDiff(\"Created missing file $file for $displayName\")\n      }\n      else -> {\n        assert(success && expectedOutExists || !success && expectedErrExists)\n        if (actual != expected) {\n          if (overwrite) {\n            val file = if (success) expectedOutFile else expectedErrFile\n            file.writeString(actual)\n            fail(\"Overwrote file $file for $displayName\")\n          } else {\n            failWithDiff(\"Output was different from expected: $displayName\")\n          }\n        }\n      }\n    }\n  }\n\n  private fun failWithDiff(message: String): Nothing = failWithDiff(message, expected, actual)\n}\n\nfun failWithDiff(message: String, expected: String, actual: String): Nothing =\n  if (System.getProperty(\"sun.java.command\", \"\").contains(\"intellij\")) {\n    // IntelliJ only shows diffs for AssertionFailedError\n    throw AssertionFailedError(message, expected, actual)\n  } else {\n    // Gradle test logging/report only shows diffs for PklAssertionFailedError\n    throw PklAssertionFailedError(message, expected, actual)\n  }\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/FilteringClassLoader.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nclass FilteringClassLoader(parent: ClassLoader, private val includeFilter: (String) -> Boolean) :\n  ClassLoader(parent) {\n\n  init {\n    registerAsParallelCapable()\n  }\n\n  override fun loadClass(name: String, resolve: Boolean): Class<*> {\n    if (!includeFilter(name)) throw ClassNotFoundException(name)\n    return super.loadClass(name, resolve)\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/InputOutputTestEngine.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport java.nio.file.Path\nimport java.util.Locale\nimport kotlin.io.path.isRegularFile\nimport kotlin.io.path.useDirectoryEntries\nimport kotlin.reflect.KClass\nimport org.junit.platform.engine.*\nimport org.junit.platform.engine.TestDescriptor.Type\nimport org.junit.platform.engine.discovery.ClassSelector\nimport org.junit.platform.engine.discovery.MethodSelector\nimport org.junit.platform.engine.discovery.PackageSelector\nimport org.junit.platform.engine.discovery.UniqueIdSelector\nimport org.junit.platform.engine.support.descriptor.*\nimport org.junit.platform.engine.support.hierarchical.EngineExecutionContext\nimport org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine\nimport org.junit.platform.engine.support.hierarchical.Node\nimport org.junit.platform.engine.support.hierarchical.Node.DynamicTestExecutor\nimport org.pkl.commons.toNormalizedPathString\n\nabstract class InputOutputTestEngine :\n  HierarchicalTestEngine<InputOutputTestEngine.ExecutionContext>() {\n  protected val rootProjectDir: Path = FileTestUtils.rootProjectDir\n\n  protected abstract val testClass: KClass<*>\n\n  protected open val includedTests: List<Regex> = listOf(Regex(\".*\"))\n\n  @Suppress(\"RegExpUnexpectedAnchor\")\n  protected open val excludedTests: List<Regex> = listOf(Regex(\"$^\"))\n\n  protected abstract val inputDir: Path\n\n  protected abstract val isInputFile: (Path) -> Boolean\n\n  protected abstract fun expectedOutputFileFor(inputFile: Path): Path\n\n  protected abstract fun generateOutputFor(inputFile: Path): Pair<Boolean, String>\n\n  protected open fun beforeAll() {}\n\n  protected open fun afterAll() {}\n\n  class ExecutionContext : EngineExecutionContext\n\n  override fun getId(): String = this::class.java.simpleName\n\n  init {\n    // Enforce consistent locale for tests to avoid inconsistent formatting.\n    Locale.setDefault(Locale.ROOT)\n  }\n\n  override fun discover(\n    discoveryRequest: EngineDiscoveryRequest,\n    uniqueId: UniqueId,\n  ): TestDescriptor {\n    val packageSelectors = discoveryRequest.getSelectorsByType(PackageSelector::class.java)\n    val classSelectors = discoveryRequest.getSelectorsByType(ClassSelector::class.java)\n    val methodSelectors = discoveryRequest.getSelectorsByType(MethodSelector::class.java)\n    val uniqueIdSelectors = discoveryRequest.getSelectorsByType(UniqueIdSelector::class.java)\n\n    val packageName = testClass.java.`package`.name\n    val className = testClass.java.name\n\n    if (\n      methodSelectors.isEmpty() &&\n        (packageSelectors.isEmpty() || packageSelectors.any { it.packageName == packageName }) &&\n        (classSelectors.isEmpty() || classSelectors.any { it.className == className })\n    ) {\n\n      val rootNode =\n        object : InputDirNode(uniqueId, inputDir, ClassSource.from(testClass.java)) {\n          override fun before(context: ExecutionContext): ExecutionContext {\n            beforeAll()\n            return context\n          }\n\n          override fun after(context: ExecutionContext) {\n            afterAll()\n          }\n        }\n      return doDiscover(rootNode, uniqueIdSelectors)\n    }\n\n    // return empty descriptor w/o children\n    return EngineDescriptor(uniqueId, javaClass.simpleName)\n  }\n\n  private fun doDiscover(\n    dirNode: InputDirNode,\n    uniqueIdSelectors: List<UniqueIdSelector>,\n  ): TestDescriptor {\n    dirNode.inputDir.useDirectoryEntries { children ->\n      for (child in children) {\n        val testPath = child.toNormalizedPathString()\n        val testName = child.fileName.toString()\n        if (child.isRegularFile()) {\n          if (\n            isInputFile(child) &&\n              includedTests.any { it.matches(testPath) } &&\n              !excludedTests.any { it.matches(testPath) }\n          ) {\n            val childId = dirNode.uniqueId.append(\"inputFileNode\", testName)\n            if (\n              uniqueIdSelectors.isEmpty() ||\n                uniqueIdSelectors.any { childId.hasPrefix(it.uniqueId) }\n            ) {\n              dirNode.addChild(InputFileNode(childId, child))\n            } // else skip\n          }\n        } else {\n          val childId = dirNode.uniqueId.append(\"inputDirNode\", testName)\n          dirNode.addChild(\n            doDiscover(\n              InputDirNode(childId, child, DirectorySource.from(child.toFile())),\n              uniqueIdSelectors,\n            )\n          )\n        }\n      }\n    }\n    return dirNode\n  }\n\n  override fun createExecutionContext(request: ExecutionRequest): ExecutionContext =\n    ExecutionContext()\n\n  private open inner class InputDirNode(\n    uniqueId: UniqueId,\n    val inputDir: Path,\n    source: TestSource,\n  ) :\n    AbstractTestDescriptor(uniqueId, inputDir.fileName.toString(), source), Node<ExecutionContext> {\n    override fun getType() = Type.CONTAINER\n  }\n\n  private inner class InputFileNode(uniqueId: UniqueId, private val inputFile: Path) :\n    AbstractTestDescriptor(\n      uniqueId,\n      inputFile.fileName.toString(),\n      FileSource.from(inputFile.toFile()),\n    ),\n    Node<ExecutionContext> {\n\n    override fun getType() = Type.TEST\n\n    override fun execute(\n      context: ExecutionContext,\n      dynamicTestExecutor: DynamicTestExecutor,\n    ): ExecutionContext {\n\n      val (success, actualOutput) = generateOutputFor(inputFile)\n      val expectedOutputFile = expectedOutputFileFor(inputFile)\n\n      SnippetOutcome(expectedOutputFile, actualOutput, success).check()\n\n      return context\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/MessagePackDebugRenderer.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport java.util.*\nimport org.msgpack.core.MessagePack\nimport org.msgpack.core.MessageUnpacker\nimport org.msgpack.value.ValueType\n\n/** Renders MessagePack structures in YAML. */\nclass MessagePackDebugRenderer(bytes: ByteArray) {\n  private val unpacker: MessageUnpacker = MessagePack.newDefaultUnpacker(bytes)\n  private val currIndent = StringBuilder(\"\")\n  private val sb = StringBuilder()\n  private val indent = \"  \"\n\n  private fun incIndent() {\n    currIndent.append(indent)\n  }\n\n  private fun decIndent() {\n    currIndent.setLength(currIndent.length - indent.length)\n  }\n\n  private fun newline() {\n    sb.append(\"\\n\")\n    sb.append(currIndent)\n  }\n\n  private fun renderKey() {\n    val mf = unpacker.nextFormat\n    when (mf.valueType!!) {\n      ValueType.STRING -> emitString(unpacker.unpackString())\n      ValueType.MAP,\n      ValueType.ARRAY -> {\n        sb.append(\"? \")\n        incIndent()\n        renderValue()\n        decIndent()\n        newline()\n      }\n      else -> renderValue()\n    }\n    sb.append(\": \")\n  }\n\n  private fun renderValue() {\n    val mf = unpacker.nextFormat\n    when (mf.valueType!!) {\n      ValueType.INTEGER,\n      ValueType.FLOAT,\n      ValueType.BOOLEAN,\n      ValueType.NIL -> sb.append(unpacker.unpackValue().toJson())\n      ValueType.STRING -> emitString(unpacker.unpackString())\n      ValueType.ARRAY -> {\n        val size = unpacker.unpackArrayHeader()\n        if (size == 0) {\n          sb.append(\"[]\")\n          return\n        }\n        repeat(size) {\n          newline()\n          sb.append(\"- \")\n          incIndent()\n          renderValue()\n          decIndent()\n        }\n      }\n      ValueType.MAP -> {\n        val size = unpacker.unpackMapHeader()\n        if (size == 0) {\n          sb.append(\"{}\")\n          return\n        }\n        repeat(size) {\n          newline()\n          renderKey()\n          incIndent()\n          renderValue()\n          decIndent()\n        }\n      }\n      ValueType.BINARY -> {\n        // https://yaml.org/type/binary.html\n        sb.append(\"!!binary \")\n        val size = unpacker.unpackBinaryHeader()\n        emitString(Base64.getEncoder().encodeToString(unpacker.readPayload(size)))\n      }\n      ValueType.EXTENSION -> throw IllegalStateException(\"Unexpected value type ${mf.valueType}\")\n    }\n  }\n\n  val output: String by lazy {\n    renderValue()\n    sb.toString().removePrefix(\"\\n\")\n  }\n\n  fun emitString(str: String) {\n    val newlineIndex = str.indexOf('\\n')\n    if (newlineIndex < 0) {\n      emitSingleLineString(str)\n    } else {\n      emitMultiLineString(str, newlineIndex)\n    }\n  }\n\n  // adapted from org.pkl.core.util.yaml.YamlEmitter.emitSingleQuotedString\n  fun emitSingleLineString(str: String) {\n    sb.append('\\'')\n\n    val singleQuoteIndex = str.indexOfFirst { it == '\\'' }\n    if (singleQuoteIndex == -1) {\n      sb.append(str)\n    } else {\n      var start = 0\n      val length = str.length\n      for (i in singleQuoteIndex..<length) {\n        if (str[i] == '\\'') {\n          sb.append(str, start, i).append(\"''\")\n          start = i + 1\n        }\n      }\n      if (start < length) {\n        sb.append(str, start, length)\n      }\n    }\n\n    sb.append('\\'')\n  }\n\n  // adapted from org.pkl.core.util.yaml.YamlEmitter.emitSingleQuotedString\n  fun emitMultiLineString(str: String, newlineIndex: Int) {\n    currIndent.append(indent)\n\n    sb.append('|')\n    if (str.first() == ' ') {\n      sb.append(indent.length)\n    }\n\n    val length = str.length\n    if (str.last() == '\\n') {\n      if (length == 1 || str[length - 2] == '\\n') {\n        sb.append('+')\n      }\n    } else {\n      sb.append('-')\n    }\n\n    sb.append('\\n')\n\n    var start = 0\n    for (i in newlineIndex..<length) {\n      if (str[i] != '\\n') continue\n      if (i == start) {\n        // don't add leading indent before newline\n        sb.append('\\n')\n      } else {\n        sb.append(currIndent).append(str, start, i + 1)\n      }\n      start = i + 1\n    }\n    if (start < length) {\n      sb.append(currIndent).append(str, start, length)\n    }\n\n    currIndent.setLength(currIndent.length - indent.length)\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/PackageServer.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport com.sun.net.httpserver.*\nimport java.net.InetSocketAddress\nimport java.nio.file.*\nimport java.security.KeyStore\nimport java.util.concurrent.Executors\nimport javax.net.ssl.KeyManagerFactory\nimport javax.net.ssl.SSLContext\nimport kotlin.io.path.*\n\n/**\n * A test HTTP server that serves the Pkl packages defined under\n * `pkl-commons-test/src/main/files/packages`.\n *\n * To use this server from a test,\n * 1. Instantiate the server.\n * 2. (optional) Store the server in a companion or instance field.\n * 3. When setting up your test, pass the server [port] to one of the following:\n *     * `HttpClient.Builder.setTestPort`\n *     * `CliBaseOptions` constructor\n *     * `ExecutorOptions` constructor\n *     * `testPort` Gradle property\n *\n *   If the server isn't already running, it is automatically started.\n * 4. Use port `0` in your test. `HttpClient` will replace this port with the server port.\n * 4. [Close][close] the server, for example in [AfterAll][org.junit.jupiter.api.AfterAll].\n */\n@OptIn(ExperimentalPathApi::class)\nclass PackageServer : AutoCloseable {\n  companion object {\n    const val BIRDS_SHA = \"b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de\"\n    const val FRUIT_SHA = \"8ff80e5ac882650e817f261c8af024bf0db9b07888c9d18c20017457e04ffe06\"\n    const val FRUIT_1_1_SHA = \"8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c\"\n\n    fun populateCacheDir(cacheDir: Path) {\n      doPopulateCacheDir(cacheDir.resolve(\"package-2/localhost(3a)$PORT\"))\n    }\n\n    fun populateLegacyCacheDir(cacheDir: Path) {\n      doPopulateCacheDir(cacheDir.resolve(\"package-1/localhost:$PORT\"))\n    }\n\n    private fun doPopulateCacheDir(basePath: Path) {\n      basePath.deleteRecursively()\n      Files.walk(packagesDir).use { stream ->\n        stream.forEach { source ->\n          if (!source.isRegularFile()) return@forEach\n          val relativized =\n            source.toString().replaceFirst(packagesDir.toString(), \"\").drop(1).ifEmpty {\n              return@forEach\n            }\n          val dest = basePath.resolve(relativized)\n          dest.createParentDirectories()\n          Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING)\n        }\n      }\n    }\n\n    // Port declared in tests.\n    // Modified by RequestRewritingClient if testPort is set.\n    private const val PORT = 0\n\n    private val packagesDir: Path =\n      FileTestUtils.rootProjectDir.resolve(\"pkl-commons-test/build/test-packages\")\n\n    private val simpleHttpsConfigurator by lazy {\n      val sslContext =\n        SSLContext.getInstance(\"SSL\").apply {\n          val pass = \"password\".toCharArray()\n          val keystore =\n            FileTestUtils.rootProjectDir.resolve(\"pkl-commons-test/build/keystore/localhost.p12\")\n          keystore.inputStream().use { stream ->\n            val ks = KeyStore.getInstance(\"PKCS12\").apply { load(stream, pass) }\n            val kmf = KeyManagerFactory.getInstance(\"SunX509\").apply { init(ks, pass) }\n            init(kmf.keyManagers, null, null)\n          }\n        }\n      val engine = sslContext.createSSLEngine()\n      object : HttpsConfigurator(sslContext) {\n        override fun configure(params: HttpsParameters) {\n          params.needClientAuth = false\n          params.cipherSuites = engine.enabledCipherSuites\n          params.protocols = engine.enabledProtocols\n          params.setSSLParameters(sslContext.supportedSSLParameters)\n        }\n      }\n    }\n  }\n\n  /** The ephemeral listening port of this server. Automatically starts the server if necessary. */\n  val port: Int by lazy {\n    with(server.value) {\n      bind(InetSocketAddress(0), 0)\n      start()\n      address.port\n    }\n  }\n\n  /** Closes this server. */\n  override fun close() {\n    // don't start server just to stop it\n    if (server.isInitialized()) {\n      server.value.stop(0)\n    }\n  }\n\n  private val server: Lazy<HttpsServer> = lazy {\n    HttpsServer.create().apply {\n      httpsConfigurator = simpleHttpsConfigurator\n      createContext(\"/\", handler)\n      executor = Executors.newFixedThreadPool(1)\n    }\n  }\n\n  private val handler = HttpHandler { exchange ->\n    if (exchange.requestMethod != \"GET\") {\n      exchange.sendResponseHeaders(405, 0)\n      exchange.close()\n      return@HttpHandler\n    }\n    val path = exchange.requestURI.path\n    if (path.startsWith(\"/HTTP301/\")) {\n      exchange.responseHeaders.add(\"Location\", path.removePrefix(\"/HTTP301\"))\n      exchange.sendResponseHeaders(301, -1)\n      exchange.close()\n      return@HttpHandler\n    }\n    if (path.startsWith(\"/HTTP307/\")) {\n      exchange.responseHeaders.add(\"Location\", path.removePrefix(\"/HTTP307\"))\n      exchange.sendResponseHeaders(307, -1)\n      exchange.close()\n      return@HttpHandler\n    }\n    val localPath =\n      if (path.endsWith(\".zip\")) packagesDir.resolve(path.drop(1))\n      else packagesDir.resolve(\"${path.drop(1)}${path}.json\")\n    if (!Files.exists(localPath)) {\n      exchange.sendResponseHeaders(404, -1)\n      exchange.close()\n      return@HttpHandler\n    }\n    exchange.sendResponseHeaders(200, 0)\n    exchange.responseBody.use { outputStream -> Files.copy(localPath, outputStream) }\n    exchange.close()\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/PklAssertionFailedError.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport org.assertj.core.util.diff.DiffUtils\nimport org.opentest4j.AssertionFailedError\n\n/**\n * Makes up for the fact that [AssertionFailedError] doesn't print a diff, resulting in\n * unintelligible errors outside IDEs (which show a diff dialog).\n * https://github.com/ota4j-team/opentest4j/issues/59\n */\nclass PklAssertionFailedError(message: String, expected: Any?, actual: Any?) :\n  AssertionFailedError(message, expected, actual) {\n  override fun toString(): String {\n    val patch =\n      DiffUtils.diff(expected.stringRepresentation.lines(), actual.stringRepresentation.lines())\n    return patch.deltas.joinToString(\"\\n\\n\")\n  }\n}\n"
  },
  {
    "path": "pkl-commons-test/src/main/kotlin/org/pkl/commons/test/ReflectionUtils.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.commons.test\n\nimport kotlin.reflect.KClass\n\nobject ReflectionUtils {\n  // https://youtrack.jetbrains.com/issue/KT-14743/Reflection-Access-enum-values-and-valueOf-via-KClass#focus=Comments-27-1745309.0-0\n  @Suppress(\"UNCHECKED_CAST\")\n  fun KClass<*>.enumValues(): Array<Enum<*>> = java.enumConstants as Array<Enum<*>>\n}\n"
  },
  {
    "path": "pkl-config-java/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=pklCodegenJava\ncom.github.ajalt.clikt:clikt-core:5.0.3=pklCodegenJava\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=pklCodegenJava\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=pklCodegenJava\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=pklCodegenJava\ncom.github.ajalt.clikt:clikt:5.0.3=pklCodegenJava\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=pklCodegenJava\ncom.github.ajalt.colormath:colormath:3.6.0=pklCodegenJava\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-core:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=pklCodegenJava\ncom.github.ajalt.mordant:mordant:3.0.1=pklCodegenJava\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.palantir.javapoet:javapoet:0.7.0=pklCodegenJava\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.leangen.geantyref:geantyref:1.3.16=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\njavax.inject:javax.inject:1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=pklCodegenJava\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=pklCodegenJava,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,pklCodegenJava,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,pklCodegenJava,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=pklCodegenJava\norg.jetbrains:markdown:0.7.3=pklCodegenJava\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=compileClasspath,pklCodegenJava,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=pklCodegenJava,runtimeClasspath,testRuntimeClasspath\nempty=annotationProcessor,apiDependenciesMetadata,compileOnlyDependenciesMetadata,fatJar,firstPartySourcesJars,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,shadow,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-config-java/pkl-config-java.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklJavaLibrary\n  pklFatJar\n  pklPublishLibrary\n  signing\n}\n\nval pklCodegenJava: Configuration by configurations.creating\nval firstPartySourcesJars by configurations.existing\n\nval generateTestConfigClasses by\n  tasks.registering(JavaExec::class) {\n    val outputDir = layout.buildDirectory.dir(\"testConfigClasses\")\n    outputs.dir(outputDir)\n    inputs.dir(\"src/test/resources/codegenPkl\")\n\n    classpath = pklCodegenJava\n    mainClass.set(\"org.pkl.codegen.java.Main\")\n    argumentProviders.add(\n      CommandLineArgumentProvider {\n        listOf(\"--output-dir\", outputDir.get().asFile.path, \"--generate-javadoc\") +\n          fileTree(\"src/test/resources/codegenPkl\").map { it.path }\n      }\n    )\n  }\n\ntasks.processTestResources { dependsOn(generateTestConfigClasses) }\n\ntasks.compileTestKotlin { dependsOn(generateTestConfigClasses) }\n\nval bundleTests by tasks.registering(Jar::class) { from(sourceSets.test.get().output) }\n\n// Runs unit tests using jar'd class files as a source.\n// This is to test loading the ClassRegistry from within a jar, as opposed to directly from the file\n// system.\nval testFromJar by\n  tasks.registering(Test::class) {\n    dependsOn(bundleTests)\n\n    testClassesDirs = files(tasks.test.get().testClassesDirs)\n\n    classpath =\n      // compiled test classes\n      bundleTests.get().outputs.files +\n        // fat Jar\n        tasks.shadowJar.get().outputs.files +\n        // test-only dependencies\n        // (test dependencies that are also main dependencies must already be contained in fat Jar;\n        // to verify that, we don't want to include them here)\n        (configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())\n  }\n\n// TODO: the below snippet causes `./gradlew check` to fail specifically on\n// `pkl-codegen-java:check`. Why?\n// tasks.test {\n//  dependsOn(testFromJar)\n// }\n\nsourceSets.getByName(\"test\") {\n  java.srcDir(layout.buildDirectory.dir(\"testConfigClasses/java\"))\n  resources.srcDir(layout.buildDirectory.dir(\"testConfigClasses/resources\"))\n}\n\ndependencies {\n  // \"api\" because ConfigEvaluator extends Evaluator\n  api(projects.pklCore)\n\n  implementation(libs.geantyref)\n  implementation(libs.msgpack)\n\n  testImplementation(libs.javaxInject)\n\n  firstPartySourcesJars(project(\":pkl-core\", \"sourcesJar\"))\n\n  pklCodegenJava(projects.pklCodegenJava)\n}\n\ntasks.shadowJar { archiveBaseName.set(\"pkl-config-java-all\") }\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-config-java\")\n        description.set(\"Java config library based on the Pkl config language.\")\n      }\n    }\n\n    named<MavenPublication>(\"fatJar\") {\n      artifactId = \"pkl-config-java-all\"\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-config-java\")\n        description.set(\n          \"Shaded fat Jar for pkl-config-java, a Java config library based on the Pkl config language.\"\n        )\n      }\n    }\n  }\n}\n\nsigning { sign(publishing.publications[\"fatJar\"]) }\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/AbstractConfig.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.lang.reflect.Type;\nimport java.util.Map;\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.Composite;\n\nabstract class AbstractConfig implements Config {\n  protected final String qualifiedName;\n  protected final ValueMapper mapper;\n\n  public AbstractConfig(String qualifiedName, ValueMapper mapper) {\n    this.qualifiedName = qualifiedName;\n    this.mapper = mapper;\n  }\n\n  @Override\n  public String getQualifiedName() {\n    return qualifiedName;\n  }\n\n  @Override\n  public Config get(String propertyName) {\n    var childValue = getRawChildValue(propertyName);\n    var childName = qualifiedName.isEmpty() ? propertyName : qualifiedName + '.' + propertyName;\n    if (childValue instanceof Composite composite) {\n      return new CompositeConfig(childName, mapper, composite);\n    }\n    if (childValue instanceof Map<?, ?> map) {\n      return new MapConfig(childName, mapper, map);\n    }\n    return new LeafConfig(childName, mapper, childValue);\n  }\n\n  @Override\n  public <T> T as(Class<T> type) {\n    return as((Type) type);\n  }\n\n  @Override\n  public <T> T as(Type type) {\n    return mapper.map(getRawValue(), type);\n  }\n\n  @Override\n  public <T> T as(JavaType<T> javaType) {\n    return as(javaType.getType());\n  }\n\n  protected abstract Object getRawChildValue(String property);\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/CompositeConfig.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.Composite;\n\nclass CompositeConfig extends AbstractConfig {\n  private final Composite composite;\n\n  CompositeConfig(String qualifiedName, ValueMapper mapper, Composite composite) {\n    super(qualifiedName, mapper);\n    this.composite = composite;\n  }\n\n  @Override\n  public Object getRawValue() {\n    return composite;\n  }\n\n  @Override\n  protected Object getRawChildValue(String propertyName) {\n    var result = composite.getPropertyOrNull(propertyName);\n    if (result != null) return result;\n\n    throw new NoSuchChildException(\n        String.format(\n            \"Node `%s` of type `%s` does not have a property named `%s`. Available properties: %s\",\n            getQualifiedName(),\n            composite.getClassInfo().getQualifiedName(),\n            propertyName,\n            composite.getProperties().keySet()),\n        propertyName);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/Config.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.io.InputStream;\nimport java.lang.reflect.Type;\nimport java.util.Map;\nimport org.pkl.config.java.mapper.ConversionException;\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.Composite;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PklBinaryDecoder;\n\n/**\n * A root, intermediate, or leaf node in a configuration tree. Child nodes can be obtained by name\n * using {@link #get(String)}. To consume the node's composite or scalar value, convert the value to\n * the desired Java type, using one of the provided {@link #as} methods.\n */\npublic interface Config {\n  /**\n   * The dot-separated name of this node. For example, the node reached using {@code\n   * rootNode.get(\"foo\").get(\"bar\")} has qualified name {@code foo.bar}. Returns the empty String\n   * for the root node itself.\n   */\n  String getQualifiedName();\n\n  /**\n   * The raw value of this node, as provided by {@link Evaluator}. Typically, a node's value is not\n   * consumed directly, but converted to the desired Java type using {@link #as}.\n   */\n  Object getRawValue();\n\n  /**\n   * Returns the child node with the given unqualified name.\n   *\n   * @throws NoSuchChildException if a child with the given name does not exist\n   */\n  Config get(String childName);\n\n  /**\n   * Converts this node's value to the given {@link Class}.\n   *\n   * @throws ConversionException if the value cannot be converted to the given type\n   */\n  <T> T as(Class<T> type);\n\n  /**\n   * Converts this node's value to the given {@link Type}.\n   *\n   * <p>Note that usages of this method are not type safe.\n   *\n   * @throws ConversionException if the value cannot be converted to the given type\n   */\n  <T> T as(Type type);\n\n  /**\n   * Converts this node's value to the given {@link JavaType}.\n   *\n   * @throws ConversionException if the value cannot be converted to the given type\n   */\n  <T> T as(JavaType<T> type);\n\n  /**\n   * Decode a config from the supplied byte array.\n   *\n   * @return the encoded config\n   */\n  static Config fromPklBinary(byte[] bytes, ValueMapper mapper) {\n    return makeConfig(PklBinaryDecoder.decode(bytes), mapper);\n  }\n\n  /**\n   * Decode a config from the supplied byte array using a preconfigured {@link ValueMapper}.\n   *\n   * @return the encoded config\n   */\n  static Config fromPklBinary(byte[] bytes) {\n    return fromPklBinary(bytes, ValueMapper.preconfigured());\n  }\n\n  /**\n   * Decode a config from the supplied {@link InputStream} using a preconfigured {@link\n   * ValueMapper}.\n   *\n   * @return the encoded config\n   */\n  static Config fromPklBinary(InputStream inputStream, ValueMapper mapper) {\n    return makeConfig(PklBinaryDecoder.decode(inputStream), mapper);\n  }\n\n  /**\n   * Decode a config from the supplied {@link InputStream}.\n   *\n   * @return the encoded config\n   */\n  static Config fromPklBinary(InputStream inputStream) {\n    return fromPklBinary(inputStream, ValueMapper.preconfigured());\n  }\n\n  static Config makeConfig(Object decoded, ValueMapper mapper) {\n    if (decoded instanceof Composite composite) {\n      return new CompositeConfig(\"\", mapper, composite);\n    }\n    if (decoded instanceof Map<?, ?> map) {\n      return new MapConfig(\"\", mapper, map);\n    }\n    return new LeafConfig(\"\", mapper, decoded);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/ConfigEvaluator.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.ModuleSource;\n\n/**\n * An evaluator that returns a {@link Config} tree.\n *\n * <p>Use {@link ConfigEvaluatorBuilder} to create instances of this type, configured according to\n * your needs.\n */\npublic interface ConfigEvaluator extends AutoCloseable {\n  /** Shorthand for {@code ConfigEvaluatorBuilder.preconfigured().build()}. */\n  static ConfigEvaluator preconfigured() {\n    return ConfigEvaluatorBuilder.preconfigured().build();\n  }\n\n  /** Returns the underlying value mapper of this evaluator. */\n  ValueMapper getValueMapper();\n\n  /**\n   * Returns a new config evaluator with the same underlying evaluator and the given value mapper.\n   */\n  ConfigEvaluator setValueMapper(ValueMapper mapper);\n\n  /** Evaluates the given module source into a {@link Config} tree. */\n  Config evaluate(ModuleSource moduleSource);\n\n  /** Evaluates the given module's {@code output.value} property into a {@link Config} tree. */\n  Config evaluateOutputValue(ModuleSource moduleSource);\n\n  /** Evaluates the Pkl expression represented as {@code expression} into a {@link Config} tree. */\n  Config evaluateExpression(ModuleSource moduleSource, String expression);\n\n  /**\n   * Releases all resources held by this evaluator. If an {@code evaluate} method is currently\n   * executing, this method blocks until cancellation of that execution has completed.\n   *\n   * <p>Once an evaluator has been closed, it can no longer be used, and calling {@code evaluate}\n   * methods will throw {@link IllegalStateException}. However, objects previously returned by\n   * {@code evaluate} methods remain valid.\n   */\n  @Override\n  void close();\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/ConfigEvaluatorBuilder.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport org.pkl.config.java.mapper.ValueMapperBuilder;\nimport org.pkl.core.EvaluatorBuilder;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.project.DeclaredDependencies;\nimport org.pkl.core.project.Project;\nimport org.pkl.core.util.Nullable;\n\n/** A builder for {@link ConfigEvaluator}s. */\n@SuppressWarnings({\"UnusedReturnValue\", \"unused\"})\npublic final class ConfigEvaluatorBuilder {\n  private EvaluatorBuilder evaluatorBuilder;\n  private ValueMapperBuilder mapperBuilder;\n\n  private ConfigEvaluatorBuilder(\n      EvaluatorBuilder evaluatorBuilder, ValueMapperBuilder mapperBuilder) {\n    this.evaluatorBuilder = evaluatorBuilder;\n    this.mapperBuilder = mapperBuilder;\n  }\n\n  /** Creates a builder with preconfigured module evaluator and value mapper builders. */\n  public static ConfigEvaluatorBuilder preconfigured() {\n    return new ConfigEvaluatorBuilder(\n        EvaluatorBuilder.preconfigured(), ValueMapperBuilder.preconfigured());\n  }\n\n  /** Creates a builder with unconfigured module evaluator and value mapper builders. */\n  public static ConfigEvaluatorBuilder unconfigured() {\n    return new ConfigEvaluatorBuilder(\n        EvaluatorBuilder.unconfigured(), ValueMapperBuilder.unconfigured());\n  }\n\n  /**\n   * Sets the underlying module evaluator builder. When a config evaluator is built, the underlying\n   * module evaluator comes from this builder.\n   */\n  public ConfigEvaluatorBuilder setEvaluatorBuilder(EvaluatorBuilder evaluatorBuilder) {\n    this.evaluatorBuilder = evaluatorBuilder;\n    return this;\n  }\n\n  /** Returns the currently set module evaluator builder. */\n  public EvaluatorBuilder getEvaluatorBuilder() {\n    return evaluatorBuilder;\n  }\n\n  /**\n   * Sets the underlying value mapper builder. When a config evaluator is built, the underlying\n   * value mapper comes from this builder.\n   */\n  public ConfigEvaluatorBuilder setValueMapperBuilder(ValueMapperBuilder mapperBuilder) {\n    this.mapperBuilder = mapperBuilder;\n    return this;\n  }\n\n  /** Returns the currently set value mapper builder. */\n  public ValueMapperBuilder getValueMapperBuilder() {\n    return mapperBuilder;\n  }\n\n  /**\n   * Adds the given environment variable, overriding any environment variable previously added under\n   * the same name.\n   *\n   * <p>Modules can read environment variables with {@code read(\"env:<NAME>\")}.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder addEnvironmentVariable(String name, String value) {\n    evaluatorBuilder.addEnvironmentVariable(name, value);\n    return this;\n  }\n\n  /**\n   * Adds the given environment variables, overriding any environment variables previously added\n   * under the same name.\n   *\n   * <p>Modules can read environment variables with {@code read(\"env:<NAME>\")}.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder addEnvironmentVariables(Map<String, String> envVars) {\n    evaluatorBuilder.addEnvironmentVariables(envVars);\n    return this;\n  }\n\n  /**\n   * Removes any existing environment variables, then adds the given environment variables.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setEnvironmentVariables(Map<String, String> envVars) {\n    evaluatorBuilder.setEnvironmentVariables(envVars);\n    return this;\n  }\n\n  /**\n   * Returns the currently set environment variables.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public Map<String, String> getEnvironmentVariables() {\n    return evaluatorBuilder.getEnvironmentVariables();\n  }\n\n  /**\n   * Adds the given external property, overriding any property previously set under the same name.\n   *\n   * <p>Modules can read external properties with {@code read(\"prop:<name>\")}.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder addExternalProperty(String name, String value) {\n    evaluatorBuilder.addExternalProperty(name, value);\n    return this;\n  }\n\n  /**\n   * Adds the given external properties, overriding any properties previously set under the same\n   * name.\n   *\n   * <p>Modules can read external properties with {@code read(\"prop:<name>\")}.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder addExternalProperties(Map<String, String> properties) {\n    evaluatorBuilder.addExternalProperties(properties);\n    return this;\n  }\n\n  /**\n   * Removes any existing external properties, then adds the given properties.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setExternalProperties(Map<String, String> properties) {\n    evaluatorBuilder.setExternalProperties(properties);\n    return this;\n  }\n\n  /**\n   * Returns the currently set external properties.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public Map<String, String> getExternalProperties() {\n    return evaluatorBuilder.getExternalProperties();\n  }\n\n  /**\n   * Sets the given security manager, replacing any previously set security manager.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setSecurityManager(SecurityManager manager) {\n    evaluatorBuilder.setSecurityManager(manager);\n    return this;\n  }\n\n  /**\n   * Returns the currently set security manager.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public @Nullable SecurityManager getSecurityManager() {\n    return evaluatorBuilder.getSecurityManager();\n  }\n\n  /**\n   * Sets the given stack frame transformer, replacing any previously set transformer.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setStackFrameTransformer(\n      StackFrameTransformer stackFrameTransformer) {\n    evaluatorBuilder.setStackFrameTransformer(stackFrameTransformer);\n    return this;\n  }\n\n  /**\n   * Returns the currently set stack frame transformer.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public @Nullable StackFrameTransformer getStackFrameTransformer() {\n    return evaluatorBuilder.getStackFrameTransformer();\n  }\n\n  /**\n   * Sets the project for the evaluator, without applying evaluator settings in the project.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setProjectDependencies(DeclaredDependencies dependencies) {\n    evaluatorBuilder.setProjectDependencies(dependencies);\n    return this;\n  }\n\n  /**\n   * Sets the project for the evaluator, and applies any settings if set.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   *\n   * @throws IllegalStateException if {@link #setSecurityManager(SecurityManager)} was also called.\n   */\n  public ConfigEvaluatorBuilder applyFromProject(Project project) {\n    evaluatorBuilder.applyFromProject(project);\n    return this;\n  }\n\n  /**\n   * Sets an evaluation timeout to be enforced by the {@link ConfigEvaluator}'s {@code evaluate}\n   * methods.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setTimeout(Duration timeout) {\n    evaluatorBuilder.setTimeout(timeout);\n    return this;\n  }\n\n  /**\n   * Returns the currently set evaluation timeout.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public @Nullable Duration getTimeout() {\n    return evaluatorBuilder.getTimeout();\n  }\n\n  /**\n   * Sets the set of URI patterns to be allowed when importing modules.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   *\n   * @throws IllegalStateException if {@link #setSecurityManager(SecurityManager)} was also called.\n   */\n  public ConfigEvaluatorBuilder setAllowedModules(Collection<Pattern> patterns) {\n    evaluatorBuilder.setAllowedModules(patterns);\n    return this;\n  }\n\n  /**\n   * Returns the set of patterns to be allowed when importing modules.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public List<Pattern> getAllowedModules() {\n    return evaluatorBuilder.getAllowedModules();\n  }\n\n  /**\n   * Sets the set of URI patterns to be allowed when reading resources.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   *\n   * @throws IllegalStateException if {@link #setSecurityManager(SecurityManager)} was also called.\n   */\n  public ConfigEvaluatorBuilder setAllowedResources(Collection<Pattern> patterns) {\n    evaluatorBuilder.setAllowedResources(patterns);\n    return this;\n  }\n\n  /**\n   * Returns the set of patterns to be allowed when reading resources.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public List<Pattern> getAllowedResources() {\n    return evaluatorBuilder.getAllowedResources();\n  }\n\n  /**\n   * Sets the root directory, which restricts access to file-based modules and resources located\n   * under this directory.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public ConfigEvaluatorBuilder setRootDir(@Nullable Path rootDir) {\n    evaluatorBuilder.setRootDir(rootDir);\n    return this;\n  }\n\n  /**\n   * Returns the currently set root directory, if set.\n   *\n   * <p>This is a convenience method that delegates to the underlying evaluator builder.\n   */\n  public @Nullable Path getRootDir() {\n    return evaluatorBuilder.getRootDir();\n  }\n\n  /**\n   * Sets the HTTP Client to be used.\n   *\n   * <p>Defaults to {@code HttpClient.builder().buildLazily()}.\n   *\n   * @since 0.29.0\n   */\n  public ConfigEvaluatorBuilder setHttpClient(HttpClient httpClient) {\n    evaluatorBuilder.setHttpClient(httpClient);\n    return this;\n  }\n\n  /**\n   * Returns the currently set HTTP client.\n   *\n   * @since 0.29.0\n   */\n  public HttpClient getHttpClient() {\n    return evaluatorBuilder.getHttpClient();\n  }\n\n  /**\n   * Builds a config evaluator whose underlying module evaluator and value mapper is built using the\n   * configured builders. The same builder can be used to build multiple config evaluators.\n   */\n  public ConfigEvaluator build() {\n    return new ConfigEvaluatorImpl(evaluatorBuilder.build(), mapperBuilder.build());\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/ConfigEvaluatorImpl.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.ModuleSource;\n\nfinal class ConfigEvaluatorImpl implements ConfigEvaluator {\n  private final Evaluator evaluator;\n  private final ValueMapper mapper;\n\n  ConfigEvaluatorImpl(Evaluator evaluator, ValueMapper mapper) {\n    this.evaluator = evaluator;\n    this.mapper = mapper;\n  }\n\n  @Override\n  public Config evaluate(ModuleSource moduleSource) {\n    var module = evaluator.evaluate(moduleSource);\n    return new CompositeConfig(\"\", mapper, module);\n  }\n\n  @Override\n  public Config evaluateOutputValue(ModuleSource moduleSource) {\n    var value = evaluator.evaluateOutputValue(moduleSource);\n    return Config.makeConfig(value, mapper);\n  }\n\n  @Override\n  public Config evaluateExpression(ModuleSource moduleSource, String expression) {\n    var value = evaluator.evaluateExpression(moduleSource, expression);\n    return Config.makeConfig(value, mapper);\n  }\n\n  @Override\n  public ValueMapper getValueMapper() {\n    return mapper;\n  }\n\n  @Override\n  public ConfigEvaluator setValueMapper(ValueMapper mapper) {\n    return new ConfigEvaluatorImpl(evaluator, mapper);\n  }\n\n  @Override\n  public void close() {\n    evaluator.close();\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/Generated.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/** Indicates that the annotated class was generated by Pkl. */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.CLASS)\npublic @interface Generated {}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/InvalidMappingException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.lang.reflect.Type;\n\n/**\n * Thrown by {@link Config#as(Type)} when the determined Java class for a Pkl value cannot be found\n * on the classpath.\n *\n * <p>When this happens, the most likely explanation is that the generated code is not up-to-date.\n */\npublic class InvalidMappingException extends RuntimeException {\n  private final String pklName;\n\n  private final String javaName;\n\n  public InvalidMappingException(String pklName, String javaName, Exception cause) {\n    super(cause);\n    this.pklName = pklName;\n    this.javaName = javaName;\n  }\n\n  @Override\n  public String getMessage() {\n    return \"Did not find expected Java class `\"\n        + javaName\n        + \"` on the classpath for Pkl class `\"\n        + pklName\n        + \"`. Is your generated code up to date?\";\n  }\n\n  public String getPklName() {\n    return pklName;\n  }\n\n  public String getJavaName() {\n    return javaName;\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/JavaType.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.*;\nimport org.pkl.config.java.mapper.Types;\nimport org.pkl.core.Pair;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Runtime representation of a possibly parameterized Java type. Factory methods are provided to\n * ease construction of commonly used Java standard library types. For example, a {@code JavaType}\n * for {@code List<String>} can be constructed using {@code JavaType.listOf(String.class)}.\n *\n * <p>Parameterizations of other types can be constructed using the <em>super type token</em> idiom:\n *\n * <p>\n *\n * <pre>{@code\n * class Mapping<T> {} // some user-defined type\n * Config config = ...\n *\n * Mapping<String> container = config.as(\n *   // construct super type token for Mapping<String>\n *   new JavaType<Mapping<String>>() {}\n * );\n * }</pre>\n *\n * @param <T> the type reified by this {@code JavaType} instance\n */\n@SuppressWarnings(\"unused\")\npublic class JavaType<T> {\n  private final Type type;\n\n  protected JavaType() {\n    var superclass = getClass().getGenericSuperclass();\n    if (!(superclass instanceof ParameterizedType parameterizedType)) {\n      throw new IllegalStateException(\"JavaType token must be parameterized.\");\n    }\n    type = parameterizedType.getActualTypeArguments()[0];\n  }\n\n  private JavaType(Type type) {\n    this.type = type;\n  }\n\n  /** Creates a {@code JavaType} for the given {@code Class}. */\n  public static <T> JavaType<T> of(Class<T> type) {\n    return new JavaType<>(type);\n  }\n\n  /**\n   * Creates a {@code JavaType} for the given {@code Type}.\n   *\n   * <p>Note: This method is not type safe, and should be used with care.\n   */\n  public static <T> JavaType<T> of(Type type) {\n    return new JavaType<>(type);\n  }\n\n  /** Creates an {@link Optional} type with the given element type. */\n  public static <E> JavaType<Optional<E>> optionalOf(Class<E> elementType) {\n    return JavaType.of(Types.optionalOf(elementType));\n  }\n\n  /** Creates an {@link Optional} type with the given element type. */\n  public static <E> JavaType<Optional<E>> optionalOf(JavaType<E> elementType) {\n    return JavaType.of(Types.optionalOf(elementType.type));\n  }\n\n  /** Creates a {@link Pair} type with the given first and second element types. */\n  public static <F, S> JavaType<Pair<F, S>> pairOf(Class<F> firstType, Class<S> secondType) {\n    return JavaType.of(Types.pairOf(firstType, secondType));\n  }\n\n  /** Creates a {@link Pair} type with the given first and second element types. */\n  public static <F, S> JavaType<Pair<F, S>> pairOf(JavaType<F> firstType, JavaType<S> secondType) {\n    return JavaType.of(Types.pairOf(firstType.type, secondType.type));\n  }\n\n  /** Creates an array type with the given element type. */\n  public static <E> JavaType<E[]> arrayOf(Class<E> elementType) {\n    return JavaType.of(Types.arrayOf(elementType));\n  }\n\n  /** Creates an array type with the given element type. */\n  public static <E> JavaType<E[]> arrayOf(JavaType<E> elementType) {\n    return JavaType.of(Types.arrayOf(elementType.type));\n  }\n\n  /** Creates an {@link Iterable} type with the given element type. */\n  public static <E> JavaType<Iterable<E>> iterableOf(Class<E> elementType) {\n    return JavaType.of(Types.iterableOf(elementType));\n  }\n\n  /** Creates an {@link Iterable} type with the given element type. */\n  public static <E> JavaType<Iterable<E>> iterableOf(JavaType<E> elementType) {\n    return JavaType.of(Types.iterableOf(elementType.type));\n  }\n\n  /** Creates a {@link Collection} type with the given element type. */\n  public static <E> JavaType<Collection<E>> collectionOf(Class<E> elementType) {\n    return JavaType.of(Types.collectionOf(elementType));\n  }\n\n  /** Creates a {@link Collection} type with the given element type. */\n  public static <E> JavaType<Collection<E>> collectionOf(JavaType<E> elementType) {\n    return JavaType.of(Types.collectionOf(elementType.type));\n  }\n\n  /** Creates a {@link List} type with the given element type. */\n  public static <E> JavaType<List<E>> listOf(Class<E> elementType) {\n    return JavaType.of(Types.listOf(elementType));\n  }\n\n  /** Creates a {@link List} type with the given element type. */\n  public static <E> JavaType<List<E>> listOf(JavaType<E> elementType) {\n    return JavaType.of(Types.listOf(elementType.type));\n  }\n\n  /** Creates a {@link Set} type with the given element type. */\n  public static <E> JavaType<Set<E>> setOf(Class<E> elementType) {\n    return JavaType.of(Types.setOf(elementType));\n  }\n\n  /** Creates a {@link Set} type with the given element type. */\n  public static <E> JavaType<Set<E>> setOf(JavaType<E> elementType) {\n    return JavaType.of(Types.setOf(elementType.type));\n  }\n\n  /** Creates a {@link Map} type with the given key and value types. */\n  public static <K, V> JavaType<Map<K, V>> mapOf(Class<K> keyType, Class<V> valueType) {\n    return JavaType.of(Types.mapOf(keyType, valueType));\n  }\n\n  /** Creates a {@link Map} type with the given key and value types. */\n  public static <K, V> JavaType<Map<K, V>> mapOf(JavaType<K> keyType, JavaType<V> valueType) {\n    return JavaType.of(Types.mapOf(keyType.type, valueType.type));\n  }\n\n  /** Returns the underlying {@link Type}. */\n  public Type getType() {\n    return type;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof JavaType<?> other)) return false;\n    return type.equals(other.type);\n  }\n\n  @Override\n  public int hashCode() {\n    return type.hashCode();\n  }\n\n  @Override\n  public String toString() {\n    return type.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/LeafConfig.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.PClassInfo;\n\nclass LeafConfig extends AbstractConfig {\n  private final Object value;\n\n  LeafConfig(String qualifiedName, ValueMapper mapper, Object value) {\n    super(qualifiedName, mapper);\n    this.value = value;\n  }\n\n  @Override\n  public Object getRawValue() {\n    return value;\n  }\n\n  @Override\n  protected Object getRawChildValue(String propertyName) {\n    throw new NoSuchChildException(\n        String.format(\n            \"Leaf node `%s` of type `%s` does not have a child named `%s`.\",\n            qualifiedName, PClassInfo.forValue(value).getQualifiedName(), propertyName),\n        propertyName);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/MapConfig.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.util.Map;\nimport org.pkl.config.java.mapper.ValueMapper;\nimport org.pkl.core.PClassInfo;\n\nclass MapConfig extends AbstractConfig {\n  private final Map<?, ?> map;\n\n  MapConfig(String qualifiedName, ValueMapper mapper, Map<?, ?> map) {\n    super(qualifiedName, mapper);\n    this.map = map;\n  }\n\n  @Override\n  public Object getRawValue() {\n    return map;\n  }\n\n  @Override\n  protected Object getRawChildValue(String propertyName) {\n    var result = map.get(propertyName);\n    if (result != null) return result;\n\n    throw new NoSuchChildException(\n        String.format(\n            \"Node `%s` of type `%s` does not have a key named `%s`. Available keys: %s\",\n            getQualifiedName(), PClassInfo.Map.getQualifiedName(), propertyName, map.keySet()),\n        propertyName);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/NoSuchChildException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\n/**\n * Thrown by {@link Config#get} when a child node with the given name does not exist, or when the\n * current config node is a leaf node.\n */\npublic class NoSuchChildException extends RuntimeException {\n  private final String childName;\n\n  public NoSuchChildException(String message, String childName) {\n    super(message);\n    this.childName = childName;\n  }\n\n  public String getChildName() {\n    return childName;\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ClassRegistry.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.util.HashSet;\nimport java.util.Properties;\nimport java.util.Set;\nimport org.pkl.config.java.InvalidMappingException;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Describes mappings of Pkl class names to their corresponding Java classes.\n *\n * <p>This is used by {@link ValueMapper} to pick the correct Java class when mapping Pkl into Java.\n *\n * <p>Mappings are determined by scanning the <code>\n * /META-INF/org/pkl/config/java/mapper/classes</code> directory for properties files.\n *\n * <p>Property files should be in the form of <code>\n * org.pkl.config.java.mapper.[PKL_CLASS_NAME]=[JAVA_REFLECTION_CLASS_NAME]</code>\n *\n * <p>Mappings are optional, and only required if Pkl types are polymorphic.\n *\n * <p>They are generated by the Java and Kotlin code generators, and can be handwritten if not using\n * codegen.\n */\npublic class ClassRegistry {\n\n  private static final Properties classMappings = new Properties();\n\n  private static final Object lock = new Object();\n\n  private static final String CLASSES_DIRECTORY = \"/META-INF/org/pkl/config/java/mapper/classes\";\n\n  private static final String PREFIX = \"org.pkl.config.java.mapper.\";\n\n  private static final Set<String> loadedModules = new HashSet<>();\n\n  private ClassRegistry() {}\n\n  static @Nullable Class<?> get(PClassInfo<?> pklClassInfo) {\n    var pklModuleName = pklClassInfo.getModuleName();\n    var pklClassName = pklClassInfo.getQualifiedName();\n    initClassMappings(pklModuleName);\n    var javaName = classMappings.getProperty(PREFIX + pklClassInfo.getQualifiedName());\n    if (javaName == null) {\n      return null;\n    }\n    try {\n      return Class.forName(javaName);\n    } catch (ClassNotFoundException e) {\n      throw new InvalidMappingException(pklClassName, javaName, e);\n    }\n  }\n\n  private static void initClassMappings(String pklModuleName) {\n    synchronized (lock) {\n      if (loadedModules.contains(pklModuleName)) {\n        return;\n      }\n      loadedModules.add(pklModuleName);\n      var url =\n          ClassRegistry.class.getResourceAsStream(\n              CLASSES_DIRECTORY + \"/\" + IoUtils.encodePath(pklModuleName) + \".properties\");\n      if (url == null) {\n        return;\n      }\n      try {\n        classMappings.load(url);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Conversion.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport org.pkl.core.PClassInfo;\n\n/**\n * Describes a conversion from a Pkl source type to a (possibly parameterized) Java target type,\n * performed by the given {@link Converter}.\n *\n * @param <S> Java type representing the Pkl source type\n * @param <T> Java target type\n */\npublic final class Conversion<S, T> {\n  public final PClassInfo<S> sourceType;\n  public final Type targetType;\n  public final Converter<? super S, ? extends T> converter;\n\n  private Conversion(\n      PClassInfo<S> sourceType, Type targetType, Converter<? super S, ? extends T> converter) {\n    this.sourceType = sourceType;\n    this.targetType = targetType;\n    this.converter = converter;\n  }\n\n  /**\n   * Creates a conversion from the given Pkl source type to the given (possibly parameterized) Java\n   * type, using the given converter.\n   */\n  public static <S, T> Conversion<S, T> of(\n      PClassInfo<S> sourceType, Type targetType, Converter<? super S, ? extends T> converter) {\n    return new Conversion<>(sourceType, targetType, converter);\n  }\n\n  /**\n   * Creates a conversion from the given Pkl source type to the given non-parameterized Java type,\n   * using the given converter. This overload is provided to allow for better type inference.\n   */\n  public static <S, T> Conversion<S, T> of(\n      PClassInfo<S> sourceType, Class<T> targetType, Converter<? super S, ? extends T> converter) {\n    return new Conversion<>(sourceType, targetType, converter);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ConversionException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\n/** Thrown when a {@link ValueMapper} conversion fails. */\npublic class ConversionException extends RuntimeException {\n  public ConversionException(String message) {\n    super(message);\n  }\n\n  public ConversionException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Conversions.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.io.File;\nimport java.math.BigDecimal;\nimport java.math.BigInteger;\nimport java.net.MalformedURLException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.nio.file.InvalidPathException;\nimport java.nio.file.Path;\nimport java.util.*;\nimport java.util.regex.*;\nimport org.pkl.core.*;\n\n/** Predefined conversions for scalar types. */\npublic final class Conversions {\n  private Conversions() {}\n\n  /**\n   * Conversion from {@code pkl.base#Int} to {@link Byte}. Throws {@link ConversionException} if the\n   * value is too large.\n   */\n  public static final Conversion<Long, Byte> pIntToByte =\n      Conversion.of(\n          PClassInfo.Int,\n          byte.class,\n          (value, mapper) -> {\n            if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) {\n              throw new ConversionException(\n                  String.format(\n                      \"Cannot convert pkl.base#Int `%s` to java.lang.Byte because it is outside range `%s..%s`\",\n                      value, Byte.MIN_VALUE, Byte.MAX_VALUE));\n            }\n            return value.byteValue();\n          });\n\n  /**\n   * Conversion from {@code pkl.base#Int} to {@link Short}. Throws {@link ConversionException} if\n   * the value is too large.\n   */\n  public static final Conversion<Long, Short> pIntToShort =\n      Conversion.of(\n          PClassInfo.Int,\n          short.class,\n          (value, mapper) -> {\n            if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {\n              throw new ConversionException(\n                  String.format(\n                      \"Cannot convert pkl.base#Int `%s` to java.lang.Short because it is outside range `%s..%s`\",\n                      value, Short.MIN_VALUE, Short.MAX_VALUE));\n            }\n            return value.shortValue();\n          });\n\n  /**\n   * Conversion from {@code pkl.base#Int} to {@link Integer}. Throws {@link ConversionException} if\n   * the value is too large.\n   */\n  public static final Conversion<Long, Integer> pIntToInteger =\n      Conversion.of(\n          PClassInfo.Int,\n          int.class,\n          (value, mapper) -> {\n            if (value < Integer.MIN_VALUE || value > Integer.MAX_VALUE) {\n              throw new ConversionException(\n                  String.format(\n                      \"Cannot convert pkl.base#Int `%s` to java.lang.Integer because it is outside range `%s..%s`\",\n                      value, Integer.MIN_VALUE, Integer.MAX_VALUE));\n            }\n            return value.intValue();\n          });\n\n  /** Conversion from {@code pkl.base#Int} to {@link Float}. May lose precision. */\n  public static final Conversion<Long, Float> pIntToFloat =\n      Conversion.of(PClassInfo.Int, float.class, (value, mapper) -> value.floatValue());\n\n  /** Conversion from {@code pkl.base#Int} to {@link Double}. May lose precision. */\n  public static final Conversion<Long, Double> pIntToDouble =\n      Conversion.of(PClassInfo.Int, double.class, (value, mapper) -> value.doubleValue());\n\n  /** Conversion from {@code pkl.base#Int} to {@link BigInteger}. */\n  public static final Conversion<Long, BigInteger> pIntToBigInteger =\n      Conversion.of(PClassInfo.Int, BigInteger.class, (value, mapper) -> BigInteger.valueOf(value));\n\n  /** Conversion from {@code pkl.base#Int} to {@link BigDecimal}. */\n  public static final Conversion<Long, BigDecimal> pIntToBigDecimal =\n      Conversion.of(PClassInfo.Int, BigDecimal.class, (value, mapper) -> BigDecimal.valueOf(value));\n\n  /** Conversion from {@code pkl.base#Float} to {@link Float}. May lose precision. */\n  public static final Conversion<Double, Float> pFloatToFloat =\n      Conversion.of(PClassInfo.Float, float.class, (value, mapper) -> value.floatValue());\n\n  /** Conversion from {@code pkl.base#Float} to {@link BigDecimal}. */\n  public static final Conversion<Double, BigDecimal> pFloatToBigDecimal =\n      Conversion.of(\n          PClassInfo.Float, BigDecimal.class, (value, mapper) -> BigDecimal.valueOf(value));\n\n  /**\n   * Conversion from {@code pkl.base#String} to {@link Character}. Throws {@link\n   * ConversionException} if the String value is not of length one.\n   */\n  public static final Conversion<String, Character> pStringToCharacter =\n      Conversion.of(\n          PClassInfo.String,\n          Character.class,\n          (value, mapper) -> {\n            if (value.length() != 1) {\n              throw new ConversionException(\n                  String.format(\n                      \"Cannot convert pkl.base#String `%s` to java.lang.Character because it is not of length 1.\",\n                      value));\n            }\n            return value.charAt(0);\n          });\n\n  /**\n   * Conversion from {@code pkl.base#String} to {@link URI}. Throws {@link ConversionException} if\n   * the String value is not a syntactically valid URI.\n   */\n  public static final Conversion<String, URI> pStringToURI =\n      Conversion.of(\n          PClassInfo.String,\n          URI.class,\n          (value, mapper) -> {\n            try {\n              return new URI(value);\n            } catch (URISyntaxException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.base#String` to `java.net.URI`.\", e);\n            }\n          });\n\n  /**\n   * Conversion from {@code pkl.base#String} to {@link URL}. Throws {@link ConversionException} if\n   * the String value is not a syntactically valid URL.\n   */\n  public static final Conversion<String, URL> pStringToURL =\n      Conversion.of(\n          PClassInfo.String,\n          URL.class,\n          (value, mapper) -> {\n            try {\n              return new URL(value);\n            } catch (MalformedURLException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.base#String` to `java.net.URL`.\", e);\n            }\n          });\n\n  /** Conversion from {@code pkl.base#String} to {@link File}. */\n  public static final Conversion<String, File> pStringToFile =\n      Conversion.of(PClassInfo.String, File.class, (value, mapper) -> new File(value));\n\n  /**\n   * Conversion from {@code pkl.base#String} to {@link Path}. Throws {@link ConversionException} if\n   * the String value is not a syntactically valid path.\n   */\n  public static final Conversion<String, Path> pStringToPath =\n      Conversion.of(\n          PClassInfo.String,\n          Path.class,\n          (value, mapper) -> {\n            try {\n              return Path.of(value);\n            } catch (InvalidPathException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.base#String` to `java.nio.file.Path`.\", e);\n            }\n          });\n\n  /** Conversion from {@code pkl.base#String} to {@link Pattern}. */\n  public static final Conversion<String, Pattern> pStringToPattern =\n      Conversion.of(\n          PClassInfo.String,\n          Pattern.class,\n          (value, mapper) -> {\n            try {\n              return Pattern.compile(value);\n            } catch (PatternSyntaxException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.base#String` to `java.util.regex.Pattern`.\", e);\n            }\n          });\n\n  /** Conversion from {@code pkl.base#Regex} to {@link String}. */\n  public static final Conversion<Pattern, String> pRegexToString =\n      Conversion.of(PClassInfo.Regex, String.class, (value, mapper) -> value.pattern());\n\n  /** Conversion from {@code pkl.base#Duration} to {@link java.time.Duration}. */\n  public static final Conversion<Duration, java.time.Duration> pDurationToDuration =\n      Conversion.of(\n          PClassInfo.Duration, java.time.Duration.class, (value, mapper) -> value.toJavaDuration());\n\n  /** Conversion from {@code pkl.semver#Version} to {@link Version}. */\n  // Cannot leave this to `ConverterFactories.pObjectToDataObject`\n  // because `Version` is part of pkl-core and thus cannot be annotated with `@Named`.\n  public static final Conversion<PObject, Version> pVersionToVersion =\n      Conversion.of(\n          PClassInfo.Version,\n          Version.class,\n          (value, mapper) -> {\n            try {\n              return new Version(\n                  Math.toIntExact((Long) value.getProperty(\"major\")),\n                  Math.toIntExact((Long) value.getProperty(\"minor\")),\n                  Math.toIntExact((Long) value.getProperty(\"patch\")),\n                  (String) value.get(\"preRelease\"),\n                  (String) value.get(\"build\"));\n            } catch (ArithmeticException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.semver#Version` to `org.pkl.core.Version`.\", e);\n            }\n          });\n\n  public static final Conversion<PObject, String> pVersionToString =\n      Conversion.of(\n          PClassInfo.Version,\n          String.class,\n          (value, mapper) -> {\n            var builder = new StringBuilder();\n            builder.append(value.get(\"major\"));\n            builder.append('.');\n            builder.append(value.get(\"minor\"));\n            builder.append('.');\n            builder.append(value.get(\"patch\"));\n            var preRelease = value.get(\"preRelease\");\n            if (preRelease != null) {\n              builder.append('-');\n              builder.append(preRelease);\n            }\n            var build = value.get(\"build\");\n            if (build != null) {\n              builder.append('+');\n              builder.append(build);\n            }\n            return builder.toString();\n          });\n\n  public static final Conversion<String, Version> pStringToVersion =\n      Conversion.of(\n          PClassInfo.String,\n          Version.class,\n          (value, mapper) -> {\n            try {\n              return Version.parse(value);\n            } catch (IllegalArgumentException e) {\n              throw new ConversionException(\n                  \"Failed to convert `pkl.base#String` to `org.pkl.core.Version`.\", e);\n            }\n          });\n\n  /**\n   * Identity conversions used when the Java representation of the Pkl type matches the target type\n   * or when the target type is {@link Object}.\n   */\n  public static final Collection<Conversion<?, ?>> identities =\n      List.of(\n          Conversion.of(PClassInfo.Boolean, boolean.class, Converter.identity()),\n          Conversion.of(PClassInfo.Boolean, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.String, String.class, Converter.identity()),\n          Conversion.of(PClassInfo.String, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Int, long.class, Converter.identity()),\n          Conversion.of(PClassInfo.Int, Number.class, Converter.identity()),\n          Conversion.of(PClassInfo.Int, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Float, double.class, Converter.identity()),\n          Conversion.of(PClassInfo.Float, Number.class, Converter.identity()),\n          Conversion.of(PClassInfo.Float, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Duration, Duration.class, Converter.identity()),\n          Conversion.of(PClassInfo.Duration, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.DataSize, DataSize.class, Converter.identity()),\n          Conversion.of(PClassInfo.DataSize, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Module, PModule.class, Converter.identity()),\n          Conversion.of(PClassInfo.Module, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Class, PClass.class, Converter.identity()),\n          Conversion.of(PClassInfo.Class, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Regex, Pattern.class, Converter.identity()),\n          Conversion.of(PClassInfo.Regex, Object.class, Converter.identity()),\n          Conversion.of(PClassInfo.Null, PNull.class, Converter.identity()),\n          Conversion.of(PClassInfo.Bytes, byte[].class, Converter.identity())\n          // PClassInfo.Null -> Object.class is covered by PNullToAny (returns null rather than\n          // PNull.getInstance())\n          );\n\n  /** Numeric conversions. Does not include identity conversions. */\n  public static final Collection<Conversion<?, ?>> numeric =\n      List.of(\n          pIntToByte,\n          pIntToShort,\n          pIntToInteger,\n          pIntToFloat,\n          pIntToDouble,\n          pIntToBigInteger,\n          pIntToBigDecimal,\n          pFloatToFloat,\n          pFloatToBigDecimal);\n\n  /** Conversions that don't fit any other category. */\n  public static final Collection<Conversion<?, ?>> misc =\n      List.of(\n          pStringToCharacter,\n          pStringToURI,\n          pStringToURL,\n          pStringToFile,\n          pStringToPath,\n          pStringToPattern,\n          pRegexToString,\n          pDurationToDuration,\n          pVersionToVersion,\n          pVersionToString,\n          pStringToVersion);\n\n  /** All conversions defined in this class. */\n  public static final Collection<Conversion<?, ?>> all = collectAll();\n\n  private static Collection<Conversion<?, ?>> collectAll() {\n    var result = new ArrayList<Conversion<?, ?>>(identities.size() + numeric.size() + misc.size());\n    result.addAll(identities);\n    result.addAll(numeric);\n    result.addAll(misc);\n    return Collections.unmodifiableList(result);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Converter.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\n/**\n * Converter for a particular source and target type.\n *\n * @param <S> the converter's source type\n * @param <T> the converter's target type\n */\n@FunctionalInterface\npublic interface Converter<S, T> {\n  /**\n   * Converts the given value. The given {@link ValueMapper} can be used to convert nested values of\n   * composite values (objects, collections, etc.).\n   */\n  T convert(S value, ValueMapper valueMapper);\n\n  /** Returns an identity converter for the requested type. */\n  static <S> Converter<S, S> identity() {\n    return (value, valueMapper) -> value;\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ConverterFactories.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.util.*;\nimport org.pkl.core.PObject;\nimport org.pkl.core.Pair;\n\n/** Predefined conversions for composite types (objects, collections, etc.). */\npublic final class ConverterFactories {\n  private ConverterFactories() {}\n\n  /**\n   * Conversion from {@code pkl.base#Null} to any non-primitive type. The conversion result is\n   * always {@code null}.\n   */\n  public static final ConverterFactory pNullToAny = new PNullToAny();\n\n  /** Identity conversion for {@link PObject}. */\n  public static final ConverterFactory pObjectToPObject = new PObjectToPObject();\n\n  /**\n   * Conversion from {@code pkl.base#String} to Java Enum type. If there is no exact match between\n   * string and enum value, some variations are tried. For example, both {@code \"house-of-cards\"}\n   * and {@code \"house of cards\"} will be successfully matched to enum value {@code HOUSE_OF_CARDS}.\n   */\n  public static final ConverterFactory pStringToEnum = new PStringToEnum();\n\n  /**\n   * Conversion from any Pkl value to {@link java.util.Optional}. Returns an empty optional for\n   * {@code pkl.base#Null} and a present optional otherwise.\n   */\n  public static final ConverterFactory pAnyToOptional = new PAnyToOptional();\n\n  /** Conversion from {@code pkl.base#Collection} to Java primitive or object array. */\n  public static final ConverterFactory pCollectionToArray = new PCollectionToArray();\n\n  /**\n   * Conversion from {@code pkl.base#Collection} to {@link Collection}. The concrete implementation\n   * type is determined using {@link TypeMapping}s.\n   */\n  public static final ConverterFactory pCollectionToCollection = new PCollectionToCollection();\n\n  /**\n   * Conversion from {@code pkl.base#Map} to {@link Map}. The concrete implementation type is\n   * determined using {@link TypeMapping}s.\n   */\n  public static final ConverterFactory pMapToMap = new PMapToMap();\n\n  /**\n   * Conversion from Pkl module or object to Java data object. The conversion is performed as\n   * follows:\n   *\n   * <p>\n   *\n   * <ol>\n   *   <li>Find the Java class constructor with the highest number of parameters.\n   *   <li>Correlate constructor parameters with Pkl object properties by name.\n   *   <li>Convert each Pkl property value to the corresponding constructor parameter's type.\n   *   <li>Invoke the constructor.\n   * </ol>\n   *\n   * <p>Dynamic and class based Pkl objects are equally supported. The Pkl object must contain all\n   * properties defined by the Java class constructor. Any additional Pkl object properties are\n   * ignored.\n   *\n   * <p>Unless the Java 8+ compiler option {@code -parameters} is set, constructor parameters must\n   * be annotated with {@link Named} or {@code javax.inject.Named}.\n   */\n  public static final ConverterFactory pObjectToDataObject = new PObjectToDataObject();\n\n  public static final ConverterFactory pObjectToMap = new PObjectToMap();\n\n  /** Conversion from {@code pkl.base#Pair} to {@link Pair}. */\n  public static final ConverterFactory pPairToPair = new PPairToPair();\n\n  /** All conversions defined in this class. */\n  public static final Collection<ConverterFactory> all =\n      List.of(\n          pAnyToOptional,\n          pNullToAny,\n          pObjectToPObject,\n          pStringToEnum,\n          pCollectionToArray,\n          pCollectionToCollection,\n          pMapToMap,\n          pObjectToDataObject,\n          pObjectToMap,\n          pPairToPair);\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ConverterFactory.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport java.util.Optional;\nimport java.util.function.Predicate;\nimport org.pkl.core.PClassInfo;\n\n/**\n * A factory for {@link Converter}s. Used to implement conversions to generic Java classes. In such\n * a case a single {@link Converter} does not suffice. Instead, the factory creates a new converter\n * for every parameterization of the target type. Once created, the converter is cached for later\n * use, and the factory is never again invoked for the same parameterized target type.\n *\n * <p>For best performance, all introspection of target types (for example using {@link Reflection})\n * should happen in the factory rather than the returned converters.\n */\n@FunctionalInterface\npublic interface ConverterFactory {\n  /**\n   * Returns a converter for the given source and target types, or {@code Optional.empty()} if the\n   * factory cannot handle the requested types.\n   */\n  // idea: return Success/Failure providing an explanation of why this factory wasn't applicable\n  Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType);\n\n  /**\n   * Returns a new factory that restricts use of this factory to target types for which the given\n   * predicate holds.\n   */\n  default ConverterFactory when(Predicate<Type> predicate) {\n    return (sourceType, targetType) -> {\n      if (!predicate.test(targetType)) return Optional.empty();\n      return create(sourceType, targetType);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Named.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Names a constructor parameter for Pkl-to-Java object mapping. Alternatively, the {@code\n * javax.inject.Named} annotation can be used, or parameter names can be retained by setting the\n * Java 8+ compiler option {@code -parameters}.\n */\n@Target({ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Named {\n  String value();\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/NonNull.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/** Indicates that a type does not accept {@code null} as a value. */\n@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})\n@Retention(RetentionPolicy.CLASS)\n@Documented\npublic @interface NonNull {}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PAnyToOptional.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Optional;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PNull;\n\nfinal class PAnyToOptional implements ConverterFactory {\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    if (!(Reflection.toRawType(targetType) == Optional.class)) {\n      return Optional.empty();\n    }\n\n    // may seem redundant but is used to handle case where targetType is erased\n    var optionalType = (ParameterizedType) Reflection.getExactSupertype(targetType, Optional.class);\n\n    var elementType = optionalType.getActualTypeArguments()[0];\n    return Optional.of(new ConverterImpl(elementType));\n  }\n\n  private static class ConverterImpl implements Converter<Object, Optional<?>> {\n    private final Type elementType;\n\n    public ConverterImpl(Type elementType) {\n      this.elementType = elementType;\n    }\n\n    @Override\n    public Optional<?> convert(Object value, ValueMapper valueMapper) {\n      return value instanceof PNull\n          ? Optional.empty()\n          : Optional.of(valueMapper.map(value, elementType));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PCollectionToArray.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Type;\nimport java.util.Collection;\nimport java.util.Optional;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.util.Nullable;\n\nfinal class PCollectionToArray implements ConverterFactory {\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    var targetClass = Reflection.toRawType(targetType);\n    if (!(sourceType.isConcreteCollectionClass() && targetClass.isArray())) {\n      return Optional.empty();\n    }\n\n    if (targetClass.getComponentType().isPrimitive()) {\n      if (targetClass == boolean[].class) {\n        return Optional.of(new BooleanArrayConverterImpl());\n      }\n      if (targetClass == char[].class) {\n        return Optional.of(new CharArrayConverterImpl());\n      }\n      if (targetClass == long[].class) {\n        return Optional.of(new LongArrayConverterImpl());\n      }\n      if (targetClass == int[].class) {\n        return Optional.of(new IntArrayConverterImpl());\n      }\n      if (targetClass == short[].class) {\n        return Optional.of(new ShortArrayConverterImpl());\n      }\n      if (targetClass == byte[].class) {\n        return Optional.of(new ByteArrayConverterImpl());\n      }\n      if (targetClass == double[].class) {\n        return Optional.of(new DoubleArrayConverterImpl());\n      }\n      if (targetClass == float[].class) {\n        return Optional.of(new FloatArrayConverterImpl());\n      }\n      throw new AssertionError(\"unreachable code\");\n    }\n\n    var elementType = Reflection.getArrayElementType(targetType);\n    return Optional.of(new ObjectArrayConverterImpl<>(elementType));\n  }\n\n  // having a separate converter for each primitive array type\n  // saves some reflection at the expense of some code duplication\n  private static final class BooleanArrayConverterImpl\n      implements Converter<Collection<Object>, boolean[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Boolean> cachedConverter;\n\n    @Override\n    public boolean[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new boolean[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, boolean.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class CharArrayConverterImpl\n      implements Converter<Collection<Object>, char[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Character> cachedConverter;\n\n    @Override\n    public char[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new char[value.size()];\n      var i = 0;\n      for (var elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, char.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class ByteArrayConverterImpl\n      implements Converter<Collection<Object>, byte[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Byte> cachedConverter;\n\n    @Override\n    public byte[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new byte[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, byte.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class ShortArrayConverterImpl\n      implements Converter<Collection<Object>, short[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Short> cachedConverter;\n\n    @Override\n    public short[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new short[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, short.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class IntArrayConverterImpl implements Converter<Collection<Object>, int[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Integer> cachedConverter;\n\n    @Override\n    public int[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new int[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, int.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class LongArrayConverterImpl\n      implements Converter<Collection<Object>, long[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Long> cachedConverter;\n\n    @Override\n    public long[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new long[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, long.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class FloatArrayConverterImpl\n      implements Converter<Collection<Object>, float[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Float> cachedConverter;\n\n    @Override\n    public float[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new float[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, float.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class DoubleArrayConverterImpl\n      implements Converter<Collection<Object>, double[]> {\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, Double> cachedConverter;\n\n    @Override\n    public double[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = new double[value.size()];\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, double.class);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n\n  private static final class ObjectArrayConverterImpl<T>\n      implements Converter<Collection<Object>, T[]> {\n    private final Type componentType;\n    private final Class<T> rawComponentType;\n\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, T> cachedConverter;\n\n    private ObjectArrayConverterImpl(Type componentType) {\n      this.componentType = componentType;\n\n      @SuppressWarnings(\"unchecked\")\n      var rawComponentType = (Class<T>) Reflection.toRawType(componentType);\n      this.rawComponentType = rawComponentType;\n    }\n\n    @Override\n    public T[] convert(Collection<Object> value, ValueMapper valueMapper) {\n      @SuppressWarnings(\"unchecked\")\n      var result = (T[]) Array.newInstance(rawComponentType, value.size());\n      var i = 0;\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, componentType);\n        }\n        assert cachedConverter != null;\n        result[i++] = cachedConverter.convert(elem, valueMapper);\n      }\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PCollectionToCollection.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.invoke.MethodHandles;\nimport java.lang.invoke.MethodHandles.Lookup;\nimport java.lang.invoke.MethodType;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Collection;\nimport java.util.Optional;\nimport java.util.function.Function;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.util.Nullable;\n\nclass PCollectionToCollection implements ConverterFactory {\n  private static final Lookup lookup = MethodHandles.lookup();\n\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    var targetClass = Reflection.toRawType(targetType);\n    if (!(sourceType.isConcreteCollectionClass()\n        && Collection.class.isAssignableFrom(targetClass))) {\n      return Optional.empty();\n    }\n\n    var iterableType =\n        (ParameterizedType) Reflection.getExactSupertype(targetType, Collection.class);\n    var elementType = Reflection.normalize(iterableType.getActualTypeArguments()[0]);\n\n    return createInstantiator(targetClass)\n        .map(instantiator -> new ConverterImpl<>(instantiator, elementType));\n  }\n\n  private <T> Optional<Function<Integer, Collection<T>>> createInstantiator(Class<T> clazz) {\n    try {\n      try {\n        // constructor with capacity and load factor parameters, e.g. HashSet\n        var ctor2 =\n            lookup.findConstructor(\n                clazz, MethodType.methodType(void.class, int.class, float.class));\n        return Optional.of(\n            length -> {\n              try {\n                //noinspection unchecked\n                return (Collection<T>) ctor2.invoke((int) (length / .75f) + 1, .75f);\n              } catch (Throwable t) {\n                throw new ConversionException(\n                    String.format(\"Error invoking constructor of class `%s`.\", clazz), t);\n              }\n            });\n      } catch (NoSuchMethodException e2) {\n        try {\n          // constructor with size parameter, e.g. ArrayList\n          var ctor1 = lookup.findConstructor(clazz, MethodType.methodType(void.class, int.class));\n          return Optional.of(\n              length -> {\n                try {\n                  //noinspection unchecked\n                  return (Collection<T>) ctor1.invoke(length);\n                } catch (Throwable t) {\n                  throw new ConversionException(\n                      String.format(\"Error invoking constructor of class `%s`.\", clazz), t);\n                }\n              });\n        } catch (NoSuchMethodException e1) {\n          try {\n            // default constructor\n            var ctor0 = lookup.findConstructor(clazz, MethodType.methodType(void.class));\n            return Optional.of(\n                length -> {\n                  try {\n                    //noinspection unchecked\n                    return (Collection<T>) ctor0.invoke();\n                  } catch (Throwable t) {\n                    throw new ConversionException(\n                        String.format(\"Error invoking constructor of class `%s`.\", clazz), t);\n                  }\n                });\n          } catch (NoSuchMethodException e0) {\n            return Optional.empty();\n          }\n        }\n      }\n    } catch (IllegalAccessException e) {\n      throw new ConversionException(\n          String.format(\"Error accessing constructor of class `%s`.\", clazz), e);\n    }\n  }\n\n  private static class ConverterImpl<T> implements Converter<Collection<Object>, Collection<T>> {\n    private final Function<Integer, Collection<T>> targetInstantiator;\n    private final Type targetElementType;\n\n    private PClassInfo<Object> cachedElementType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, T> cachedConverter;\n\n    private ConverterImpl(\n        Function<Integer, Collection<T>> targetInstantiator, Type targetElementType) {\n      this.targetInstantiator = targetInstantiator;\n      this.targetElementType = targetElementType;\n    }\n\n    @Override\n    public Collection<T> convert(Collection<Object> value, ValueMapper valueMapper) {\n      var result = targetInstantiator.apply(value.size());\n\n      for (Object elem : value) {\n        if (!cachedElementType.isExactClassOf(elem)) {\n          cachedElementType = PClassInfo.forValue(elem);\n          cachedConverter = valueMapper.getConverter(cachedElementType, targetElementType);\n        }\n        assert cachedConverter != null;\n        result.add(cachedConverter.convert(elem, valueMapper));\n      }\n\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PMapToMap.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.invoke.MethodHandles;\nimport java.lang.invoke.MethodHandles.Lookup;\nimport java.lang.invoke.MethodType;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Properties;\nimport java.util.function.Function;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.util.Nullable;\n\nclass PMapToMap implements ConverterFactory {\n  private static final Lookup lookup = MethodHandles.lookup();\n\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    var targetClass = Reflection.toRawType(targetType);\n    if (!(sourceType == PClassInfo.Map && Map.class.isAssignableFrom(targetClass))) {\n      return Optional.empty();\n    }\n\n    ParameterizedType mapType;\n    if (Properties.class.isAssignableFrom(targetClass)) {\n      // Properties is-a Map<Object,Object> but is supposed to only contain String keys/values\n      mapType = Types.mapOf(String.class, String.class);\n    } else {\n      mapType = (ParameterizedType) Reflection.getExactSupertype(targetType, Map.class);\n    }\n    var typeArguments = mapType.getActualTypeArguments();\n    var keyType = Reflection.normalize(typeArguments[0]);\n    var valueType = Reflection.normalize(typeArguments[1]);\n    return createInstantiator(targetClass)\n        .map(instantiator -> new ConverterImpl<>(instantiator, keyType, valueType));\n  }\n\n  private <K, V> Optional<Function<Integer, Map<K, V>>> createInstantiator(Class<?> clazz) {\n    try {\n      // constructor with capacity and load factor arguments\n      var ctor2 =\n          lookup.findConstructor(clazz, MethodType.methodType(void.class, int.class, float.class));\n      return Optional.of(\n          length -> {\n            try {\n              //noinspection unchecked\n              return (Map<K, V>) ctor2.invoke((int) (length / .75f) + 1, .75f);\n            } catch (Throwable t) {\n              throw new ConversionException(\n                  String.format(\"Error invoking constructor of class `%s`.\", clazz), t);\n            }\n          });\n    } catch (NoSuchMethodException e2) {\n      try {\n        // default constructor\n        var ctor0 = lookup.findConstructor(clazz, MethodType.methodType(void.class));\n        return Optional.of(\n            length -> {\n              try {\n                //noinspection unchecked\n                return (Map<K, V>) ctor0.invoke();\n              } catch (Throwable t) {\n                throw new ConversionException(\n                    String.format(\"Error invoking constructor of class `%s`.\", clazz), t);\n              }\n            });\n      } catch (NoSuchMethodException e0) {\n        return Optional.empty();\n      } catch (IllegalAccessException e) {\n        throw new ConversionException(\n            String.format(\"Error accessing constructor of class `%s`.\", clazz), e);\n      }\n    } catch (IllegalAccessException e) {\n      throw new ConversionException(\n          String.format(\"Error accessing constructor of class `%s`.\", clazz), e);\n    }\n  }\n\n  private static class ConverterImpl<K, V> implements Converter<Map<Object, Object>, Map<K, V>> {\n    private final Function<Integer, Map<K, V>> targetInstantiator;\n    private final Type targetKeyType;\n    private final Type targetValueType;\n\n    private PClassInfo<Object> cachedKeyType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, K> cachedKeyConverter;\n\n    private PClassInfo<Object> cachedValueType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, V> cachedValueConverter;\n\n    private ConverterImpl(\n        Function<Integer, Map<K, V>> targetInstantiator, Type targetKeyType, Type targetValueType) {\n      this.targetInstantiator = targetInstantiator;\n      this.targetKeyType = targetKeyType;\n      this.targetValueType = targetValueType;\n    }\n\n    @Override\n    public Map<K, V> convert(Map<Object, Object> map, ValueMapper valueMapper) {\n      var result = targetInstantiator.apply(map.size());\n\n      for (Map.Entry<Object, Object> entry : map.entrySet()) {\n        var key = entry.getKey();\n        if (!cachedKeyType.isExactClassOf(key)) {\n          cachedKeyType = PClassInfo.forValue(key);\n          cachedKeyConverter = valueMapper.getConverter(cachedKeyType, targetKeyType);\n        }\n        assert cachedKeyConverter != null;\n\n        var value = entry.getValue();\n        if (!cachedValueType.isExactClassOf(value)) {\n          cachedValueType = PClassInfo.forValue(value);\n          cachedValueConverter = valueMapper.getConverter(cachedValueType, targetValueType);\n        }\n        assert cachedValueConverter != null;\n\n        result.put(\n            cachedKeyConverter.convert(key, valueMapper),\n            cachedValueConverter.convert(value, valueMapper));\n      }\n\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PNullToAny.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport java.util.Optional;\nimport org.pkl.core.PClassInfo;\n\nfinal class PNullToAny implements ConverterFactory {\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    if (sourceType != PClassInfo.Null\n        || (targetType instanceof Class<?> clazz && clazz.isPrimitive())) {\n      return Optional.empty();\n    }\n\n    //noinspection ConstantConditions\n    return Optional.of((value, valueMapper) -> null);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PObjectToDataObject.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.beans.ConstructorProperties;\nimport java.lang.annotation.Annotation;\nimport java.lang.invoke.MethodHandle;\nimport java.lang.invoke.MethodHandles;\nimport java.lang.invoke.MethodHandles.Lookup;\nimport java.lang.reflect.*;\nimport java.util.*;\nimport org.pkl.core.Composite;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\nimport org.pkl.core.util.Nullable;\n\npublic class PObjectToDataObject implements ConverterFactory {\n  private static final Lookup lookup = MethodHandles.lookup();\n\n  @SuppressWarnings(\"unchecked\")\n  private static final @Nullable Class<? extends Annotation> javaxInjectNamedClass =\n      (Class<? extends Annotation>) Reflection.tryLoadClass(\"javax.inject.Named\");\n\n  private static final @Nullable Method javaxInjectNamedValueMethod;\n\n  static {\n    try {\n      javaxInjectNamedValueMethod =\n          javaxInjectNamedClass == null ? null : javaxInjectNamedClass.getMethod(\"value\");\n    } catch (NoSuchMethodException e) {\n      throw new AssertionError(e);\n    }\n  }\n\n  protected PObjectToDataObject() {}\n\n  @Override\n  public final Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    if (!(sourceType == PClassInfo.Module || sourceType.getJavaClass() == PObject.class)) {\n      return Optional.empty();\n    }\n\n    return selectConstructor(Reflection.toRawType(targetType))\n        .flatMap(\n            constructor ->\n                getParameters(constructor, targetType)\n                    .map(\n                        parameters -> {\n                          try {\n                            return new ConverterImpl<>(\n                                targetType, lookup.unreflectConstructor(constructor), parameters);\n                          } catch (IllegalAccessException e) {\n                            throw new ConversionException(\n                                String.format(\"Error accessing constructor `%s`.\", constructor), e);\n                          }\n                        }));\n  }\n\n  protected Optional<Constructor<?>> selectConstructor(Class<?> clazz) {\n    return Arrays.stream(clazz.getDeclaredConstructors())\n        .max(Comparator.comparingInt(Constructor::getParameterCount));\n  }\n\n  protected Optional<List<String>> getParameterNames(Constructor<?> constructor) {\n    var paramNames = new ArrayList<String>(constructor.getParameterCount());\n\n    var properties = getAnnotation(constructor, ConstructorProperties.class);\n    if (properties != null) {\n      return Optional.of(Arrays.asList(properties.value()));\n    }\n\n    for (Parameter parameter : constructor.getParameters()) {\n      var name = getParameterName(parameter);\n      if (name == null) return Optional.empty();\n      paramNames.add(name);\n    }\n    return Optional.of(paramNames);\n  }\n\n  private Optional<List<Tuple2<String, Type>>> getParameters(\n      Constructor<?> constructor, Type targetType) {\n    return getParameterNames(constructor)\n        .map(\n            paramNames -> {\n              var paramTypes = Reflection.getExactParameterTypes(constructor, targetType);\n              var parameters = new ArrayList<Tuple2<String, Type>>(paramNames.size());\n              for (int i = 0; i < paramNames.size(); i++) {\n                var name = paramNames.get(i);\n                parameters.add(Tuple2.of(name, paramTypes[i]));\n              }\n              return parameters;\n            });\n  }\n\n  private static @Nullable String getParameterName(Parameter parameter) {\n    if (parameter.isNamePresent()) {\n      return parameter.getName();\n    }\n\n    Named named = getAnnotation(parameter, Named.class);\n    if (named != null) {\n      return named.value();\n    }\n\n    if (javaxInjectNamedClass != null) {\n      assert javaxInjectNamedValueMethod != null;\n      var ann = getAnnotation(parameter, javaxInjectNamedClass);\n      if (ann != null) {\n        try {\n          return (String) javaxInjectNamedValueMethod.invoke(ann);\n        } catch (IllegalAccessException | InvocationTargetException e) {\n          throw new ConversionException(\"Failed to invoke `javax.inject.Named.value()`.\", e);\n        }\n      }\n    }\n\n    return null;\n  }\n\n  private static @Nullable <T extends Annotation> T getAnnotation(\n      Constructor<?> constructor, Class<T> annotationClass) {\n    try {\n      return constructor.getAnnotation(annotationClass);\n    } catch (IndexOutOfBoundsException e) {\n      // workaround for https://bugs.openjdk.java.net/browse/JDK-8025806\n      return null;\n    }\n  }\n\n  private static @Nullable <T extends Annotation> T getAnnotation(\n      Parameter parameter, Class<T> annotationClass) {\n    try {\n      return parameter.getAnnotation(annotationClass);\n    } catch (\n        IndexOutOfBoundsException\n            e) { // workaround for https://bugs.openjdk.java.net/browse/JDK-8025806\n      return null;\n    }\n  }\n\n  private static class ConverterImpl<T> implements Converter<Composite, T> {\n    private final Type targetType;\n    private final MethodHandle constructorHandle;\n    private final Collection<Tuple2<String, Type>> parameters;\n    private final PClassInfo<Object>[] cachedPropertyTypes;\n    private final Converter<Object, T>[] cachedConverters;\n\n    ConverterImpl(\n        Type targetType,\n        MethodHandle constructorHandle,\n        Collection<Tuple2<String, Type>> parameters) {\n      this.targetType = targetType;\n      this.constructorHandle = constructorHandle;\n      this.parameters = parameters;\n\n      @SuppressWarnings(\"unchecked\")\n      PClassInfo<Object>[] cachedPropertyTypes = new PClassInfo[parameters.size()];\n      this.cachedPropertyTypes = cachedPropertyTypes;\n      Arrays.fill(cachedPropertyTypes, PClassInfo.Unavailable);\n\n      @SuppressWarnings(\"unchecked\")\n      Converter<Object, T>[] cachedConverters = new Converter[parameters.size()];\n      this.cachedConverters = cachedConverters;\n    }\n\n    @Override\n    public T convert(Composite value, ValueMapper valueMapper) {\n      var properties = value.getProperties();\n      var args = new Object[parameters.size()];\n      var i = 0;\n\n      for (var param : parameters) {\n        var property = properties.get(param.first);\n        if (property == null) {\n          var message =\n              String.format(\n                  \"Cannot convert Pkl object to Java object.\"\n                      + \"%nPkl type             : %s\"\n                      + \"%nJava type            : %s\"\n                      + \"%nMissing Pkl property : %s\"\n                      + \"%nActual Pkl properties: %s\",\n                  value.getClassInfo(), targetType.getTypeName(), param.first, properties.keySet());\n          throw new ConversionException(message);\n        }\n\n        try {\n          var cachedPropertyType = cachedPropertyTypes[i];\n          if (!cachedPropertyType.isExactClassOf(property)) {\n            cachedPropertyType = PClassInfo.forValue(property);\n            cachedPropertyTypes[i] = cachedPropertyType;\n            cachedConverters[i] = valueMapper.getConverter(cachedPropertyType, param.second);\n          }\n          assert cachedConverters[i] != null;\n          args[i] = cachedConverters[i].convert(property, valueMapper);\n          i += 1;\n        } catch (ConversionException e) {\n          throw new ConversionException(\n              String.format(\n                  \"Error converting property `%s` in Pkl object of type `%s` \"\n                      + \"to equally named constructor parameter in Java class `%s`: \"\n                      + e.getMessage(),\n                  param.first,\n                  value.getClassInfo(),\n                  Reflection.toRawType(targetType).getTypeName()),\n              e.getCause());\n        }\n      }\n\n      try {\n        @SuppressWarnings(\"unchecked\")\n        var result = (T) constructorHandle.invokeWithArguments(args);\n        return result;\n      } catch (Throwable t) {\n        throw new ConversionException(\n            String.format(\"Error invoking constructor `%s`.\", constructorHandle), t);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PObjectToMap.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.*;\nimport java.util.*;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\n\npublic final class PObjectToMap implements ConverterFactory {\n  private final ConverterFactory pMapToMap = new PMapToMap();\n\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    var targetClass = Reflection.toRawType(targetType);\n\n    if (!((sourceType == PClassInfo.Module || sourceType.getJavaClass() == PObject.class)\n        && Map.class.isAssignableFrom(targetClass))) {\n      return Optional.empty();\n    }\n\n    @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n    Optional<Converter<Map<?, ?>, Map<?, ?>>> underlying =\n        (Optional) pMapToMap.create(PClassInfo.Map, targetType);\n\n    return underlying.map(\n        converter ->\n            (Converter<PObject, Map<?, ?>>)\n                (value, valueMapper) -> converter.convert(value.getProperties(), valueMapper));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PObjectToPObject.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport java.util.Optional;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\n\nfinal class PObjectToPObject implements ConverterFactory {\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    if (!(sourceType.getJavaClass() == PObject.class\n        && (targetType == Object.class || targetType == PObject.class))) {\n      return Optional.empty();\n    }\n    return Optional.of(Converter.identity());\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PPairToPair.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Optional;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.Pair;\nimport org.pkl.core.util.Nullable;\n\nfinal class PPairToPair implements ConverterFactory {\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    if (sourceType != PClassInfo.Pair) return Optional.empty();\n\n    var targetClass = Reflection.toRawType(targetType);\n    if (!Pair.class.isAssignableFrom(targetClass)) {\n      return Optional.empty();\n    }\n\n    var pairType = (ParameterizedType) Reflection.getExactSupertype(targetType, Pair.class);\n    return Optional.of(\n        new ConverterImpl<>(\n            pairType.getActualTypeArguments()[0], pairType.getActualTypeArguments()[1]));\n  }\n\n  private static class ConverterImpl<F, S> implements Converter<Pair<Object, Object>, Pair<F, S>> {\n    private final Type firstTargetType;\n    private final Type secondTargetType;\n\n    private PClassInfo<Object> firstCachedType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, F> firstCachedConverter;\n\n    private PClassInfo<Object> secondCachedType = PClassInfo.Unavailable;\n    private @Nullable Converter<Object, S> secondCachedConverter;\n\n    public ConverterImpl(Type firstTargetType, Type secondTargetType) {\n      this.firstTargetType = firstTargetType;\n      this.secondTargetType = secondTargetType;\n    }\n\n    @Override\n    public Pair<F, S> convert(Pair<Object, Object> value, ValueMapper valueMapper) {\n      var first = value.getFirst();\n      if (!firstCachedType.isExactClassOf(first)) {\n        firstCachedType = PClassInfo.forValue(first);\n        firstCachedConverter = valueMapper.getConverter(firstCachedType, firstTargetType);\n      }\n\n      var second = value.getSecond();\n      if (!secondCachedType.isExactClassOf(second)) {\n        secondCachedType = PClassInfo.forValue(second);\n        secondCachedConverter = valueMapper.getConverter(secondCachedType, secondTargetType);\n      }\n\n      assert firstCachedConverter != null;\n      assert secondCachedConverter != null;\n      return new Pair<>(\n          firstCachedConverter.convert(first, valueMapper),\n          secondCachedConverter.convert(second, valueMapper));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/PStringToEnum.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.util.CodeGeneratorUtils;\nimport org.pkl.core.util.CollectionUtils;\n\nfinal class PStringToEnum implements ConverterFactory {\n  @Override\n  public Optional<Converter<?, ?>> create(PClassInfo<?> sourceType, Type targetType) {\n    var rawTargetType = Reflection.toRawType(targetType);\n    if (sourceType != PClassInfo.String || !rawTargetType.isEnum()) return Optional.empty();\n\n    return Optional.of(new ConverterImpl(rawTargetType));\n  }\n\n  private static final class ConverterImpl implements Converter<String, Enum<?>> {\n    private final Class<?> enumType;\n    private final Map<String, Enum<?>> enumValuesByName;\n\n    private ConverterImpl(Class<?> enumType) {\n      this.enumType = enumType;\n      var values = (Enum<?>[]) enumType.getEnumConstants();\n      enumValuesByName = CollectionUtils.newConcurrentHashMap(values.length);\n      // special-case: enums in the standard library have a different name compared to the Pkl\n      // string\n      if (enumType == DataSizeUnit.class) {\n        for (var value : values) {\n          var unit = (DataSizeUnit) value;\n          enumValuesByName.put(CodeGeneratorUtils.toEnumConstantName(unit.getSymbol()), value);\n        }\n      } else if (enumType == DurationUnit.class) {\n        for (var value : values) {\n          var unit = (DurationUnit) value;\n          enumValuesByName.put(CodeGeneratorUtils.toEnumConstantName(unit.getSymbol()), value);\n        }\n      } else {\n        for (Enum<?> value : values) {\n          enumValuesByName.put(value.name(), value);\n        }\n      }\n    }\n\n    @Override\n    public Enum<?> convert(String value, ValueMapper valueMapper) {\n      var enumValue = enumValuesByName.get(value);\n      if (enumValue == null) {\n        enumValue = enumValuesByName.get(CodeGeneratorUtils.toEnumConstantName(value));\n        if (enumValue != null) {\n          enumValuesByName.put(value, enumValue);\n        }\n      }\n      if (enumValue != null) {\n        return enumValue;\n      }\n      throw new ConversionException(\n          String.format(\n              \"Cannot convert String `%s` to Enum value of type `%s`.\",\n              value, enumType.getTypeName()));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Reflection.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static java.util.Arrays.stream;\n\nimport io.leangen.geantyref.CaptureType;\nimport io.leangen.geantyref.GenericTypeReflector;\nimport java.lang.reflect.*;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Reflection utilities for implementing {@link ConverterFactory}s. Mostly covers introspection of\n * parameterized types, which is not covered by the {@code java.util.reflect} API.\n *\n * <p>The heavy lifting under the covers is done by the excellent ge(a)ntyref library.\n */\npublic final class Reflection {\n  private Reflection() {}\n\n  /**\n   * Returns the class with the given fully qualified name, or {@code null} if a class with the\n   * given name cannot be found.\n   */\n  public static @Nullable Class<?> tryLoadClass(String qualifiedName) {\n    try {\n      // use Class.forName() rather than ClassLoader.loadClass()\n      // because Class.getClassLoader() is not supported by AOT\n      return Class.forName(qualifiedName);\n    } catch (ClassNotFoundException e) {\n      return null;\n    }\n  }\n\n  public static boolean isMissingTypeArguments(Type type) {\n    if (type instanceof WildcardType wildcardType) {\n      var baseType =\n          wildcardType.getLowerBounds().length > 0\n              ? wildcardType.getLowerBounds()[0]\n              : wildcardType.getUpperBounds()[0];\n      return isMissingTypeArguments(baseType);\n    }\n    return GenericTypeReflector.isMissingTypeParameters(type);\n  }\n\n  /**\n   * Returns the normalized form of the given type. A normalized type is concrete (no wildcards) and\n   * instantiable (not an interface or abstract class).\n   */\n  public static Type normalize(Type type) {\n    if (type instanceof WildcardType wildcardType) {\n      var bounds = wildcardType.getLowerBounds();\n      if (bounds.length > 0) return bounds[0];\n      bounds = wildcardType.getUpperBounds();\n      if (bounds.length > 0) return bounds[0];\n    }\n    return getExactSupertype(type, toRawType(type));\n  }\n\n  /**\n   * Returns the raw (erased) type for the given parameterized type, type bound for the given\n   * wildcard type, or the given type otherwise.\n   */\n  public static Class<?> toRawType(Type type) {\n    return GenericTypeReflector.erase(type);\n  }\n\n  /**\n   * Returns the wrapper type for the given primitive type. If the given type is not a primitive\n   * type, returns the given type.\n   */\n  @SuppressWarnings(\"unchecked\")\n  // casts are safe as (say) boolean.class and Boolean.class are both of type Class<Boolean>\n  public static <T> Class<T> toWrapperType(Class<T> type) {\n    if (type == boolean.class) return (Class<T>) Boolean.class;\n    if (type == char.class) return (Class<T>) Character.class;\n    if (type == long.class) return (Class<T>) Long.class;\n    if (type == int.class) return (Class<T>) Integer.class;\n    if (type == short.class) return (Class<T>) Short.class;\n    if (type == byte.class) return (Class<T>) Byte.class;\n    if (type == double.class) return (Class<T>) Double.class;\n    if (type == float.class) return (Class<T>) Float.class;\n\n    return type;\n  }\n\n  /** Returns the (possibly parameterized) element type for the given array type. */\n  public static Type getArrayElementType(Type type) {\n    return GenericTypeReflector.getArrayComponentType(type);\n  }\n\n  /**\n   * Returns a parameterization of the given raw supertype, taking into account type arguments of\n   * the given subtype. For example, {@code getExactSupertype(listOf(String.class),\n   * Collection.class)} will return {@code collectionOf(String.class)}. If the given subtype is not\n   * a parameterized type, returns the given raw supertype. If the given types have no inheritance\n   * relationship, returns {@code null}.\n   */\n  // call sites typically know that the given types have an inheritance relationship\n  // annotating the return type with @Nullable would lead to annoying IDE\n  // nullability warnings in these cases\n  public static Type getExactSupertype(Type type, Class<?> rawSupertype) {\n    return uncapture(GenericTypeReflector.getExactSuperType(type, rawSupertype));\n  }\n\n  /**\n   * Returns a parameterization of the given raw subtype, taking into account type arguments of the\n   * given supertype. For example, {@code getExactSubtype(collectionOf(String.class), List.class)}\n   * will return {@code listOf(String.class)}. If the given supertype is not a parameterized type,\n   * returns the given raw subtype. If the given types have no inheritance relationship, returns\n   * {@code null}.\n   */\n  // call sites typically know that the given types have an inheritance relationship\n  // annotating the return type with @Nullable would lead to annoying IDE\n  // nullability warnings in these cases\n  public static Type getExactSubtype(Type type, Class<?> rawSubtype) {\n    return uncapture(GenericTypeReflector.getExactSubType(type, rawSubtype));\n  }\n\n  /**\n   * Returns the exact parameter types of the given method or constructor, taking into account type\n   * arguments of the given declaring type. For example, {@code\n   * getExactParameterTypes(List.class.getDeclaredMethod(\"get\"), listOf(optionalOf(String.class)}\n   * will return {@code optionalOf(String.class)}. Throws {@link IllegalArgumentException} if the\n   * given method or constructor is not declared by the given type.\n   */\n  public static Type[] getExactParameterTypes(Executable m, Type declaringType) {\n    return stream(\n            GenericTypeReflector.getExactParameterTypes(\n                m, GenericTypeReflector.annotate(declaringType)))\n        .map(annType -> uncapture(annType.getType()))\n        .toArray(Type[]::new);\n  }\n\n  /**\n   * Undoes the capture of a wildcard type, or returns the given type otherwise. Unlike wildcard\n   * types, capture types are not represented in the Java reflection API, but may be returned by\n   * geantyref's getExactXXX methods. This leads to problems, which is why our getExactXXX methods\n   * eliminate them.\n   */\n  private static Type uncapture(Type type) {\n    if (type instanceof CaptureType captureType) {\n      return captureType.getWildcardType();\n    }\n    return type;\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Tuple2.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.util.Objects;\nimport org.pkl.core.util.Nullable;\n\n// avoid name clash with org.pkl.core.Pair\nfinal class Tuple2<S, T> {\n  final S first;\n  final T second;\n\n  private Tuple2(S first, T second) {\n    this.first = Objects.requireNonNull(first);\n    this.second = Objects.requireNonNull(second);\n  }\n\n  static <S, T> Tuple2<S, T> of(S first, T second) {\n    return new Tuple2<>(first, second);\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Tuple2<?, ?> other)) return false;\n    return first.equals(other.first) && second.equals(other.second);\n  }\n\n  @Override\n  public int hashCode() {\n    return 31 * first.hashCode() + second.hashCode();\n  }\n\n  @Override\n  public String toString() {\n    return \"Tuple2(\" + first + \", \" + second + \")\";\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/TypeMapping.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Modifier;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Maps a type requested during conversion to the implementation type to be instantiated. The\n * requested type is often an interface type. The implementation type is always a class type. A\n * typical example is mapping {@link java.util.List} to {@link java.util.ArrayList}.\n */\n// kept simple for now\n// if we wanted to have more sophisticated mappings, we could:\n// * support mapping factories/strategies (cf. ConverterFactory/Converter)\n// * support parameterized mappings (e.g. Set<MyEnum> -> EnumSet<MyEnum>)\npublic final class TypeMapping<S, T extends S> {\n  public final Class<S> requestedType;\n  public final Class<T> implementationType;\n\n  private TypeMapping(Class<S> requestedType, Class<T> implementationType) {\n    if (Modifier.isAbstract(implementationType.getModifiers())) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"`implementationType` must not be abstract, but `%s` is.\",\n              implementationType.getTypeName()));\n    }\n    if (!requestedType.isAssignableFrom(implementationType)) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"`implementationType` must be assignable to `requestedType`, but `%s` is not assignable to `%s`.\",\n              implementationType.getTypeName(), requestedType.getTypeName()));\n    }\n    if (requestedType.isArray() || implementationType.isArray()) {\n      throw new IllegalArgumentException(\"Type mappings are not supported for array types.\");\n    }\n    this.requestedType = requestedType;\n    this.implementationType = implementationType;\n  }\n\n  public static <S, T extends S> TypeMapping<S, T> of(\n      Class<S> requestedType, Class<T> implementationType) {\n    return new TypeMapping<>(requestedType, implementationType);\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof TypeMapping<?, ?> other)) return false;\n    return requestedType == other.requestedType && implementationType == other.implementationType;\n  }\n\n  @Override\n  public int hashCode() {\n    return requestedType.hashCode() * 31 + implementationType.hashCode();\n  }\n\n  @Override\n  public String toString() {\n    return String.format(\n        \"TypeMapping(%s, %s)\", requestedType.getTypeName(), implementationType.getTypeName());\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/TypeMappings.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.util.*;\n\n/** Predefined type mappings that can be registered with {@link ValueMapperBuilder}. */\npublic final class TypeMappings {\n  private TypeMappings() {}\n\n  /** Type mappings for collection types. */\n  public static final Collection<TypeMapping<?, ?>> collections =\n      List.of(\n          TypeMapping.of(Iterable.class, ArrayList.class),\n          TypeMapping.of(Collection.class, ArrayList.class),\n          TypeMapping.of(List.class, ArrayList.class),\n          TypeMapping.of(Set.class, HashSet.class),\n          TypeMapping.of(Map.class, HashMap.class),\n          TypeMapping.of(SortedSet.class, TreeSet.class),\n          TypeMapping.of(SortedMap.class, TreeMap.class),\n          TypeMapping.of(Queue.class, ArrayDeque.class),\n          TypeMapping.of(Deque.class, ArrayDeque.class));\n\n  /** All type mappings defined in this class. */\n  public static final Collection<TypeMapping<?, ?>> all = collections;\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/Types.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport io.leangen.geantyref.TypeArgumentNotInBoundException;\nimport io.leangen.geantyref.TypeFactory;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.*;\nimport org.pkl.core.Pair;\n\n/**\n * A factory for parameterized type literals such as {@code List<String>} or {@code MyClass<Foo,\n * Bar>}. Used to express the desired target type in {@link ValueMapper#map(Object, Type)}.\n */\npublic final class Types {\n  private Types() {}\n\n  public static ParameterizedType parameterizedType(Class<?> rawType, Type... typeArguments) {\n    var typeParamsCount = rawType.getTypeParameters().length;\n    if (typeParamsCount == 0) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"Cannot parameterize `%s` because it does not have any type parameters.\",\n              rawType.getTypeName()));\n    }\n    if (typeArguments.length != typeParamsCount) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"Expected %d type arguments for `%s`, but got %d.\",\n              typeParamsCount, rawType.getTypeName(), typeArguments.length));\n    }\n    for (Type arg : typeArguments) {\n      if (arg instanceof Class<?> clazz) {\n        if (clazz.isPrimitive()) {\n          throw new IllegalArgumentException(\n              String.format(\n                  \"`%s.class` is not a valid type argument. Did you mean `%s.class`?\",\n                  clazz, Reflection.toWrapperType(clazz).getSimpleName()));\n        }\n      }\n    }\n    try {\n      return (ParameterizedType) TypeFactory.parameterizedClass(rawType, typeArguments);\n    } catch (TypeArgumentNotInBoundException e) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"Type argument `%s` for type parameter `%s` is not within bound `%s`.\",\n              e.getArgument().getTypeName(),\n              e.getParameter().getTypeName(),\n              e.getBound().getTypeName()));\n    }\n  }\n\n  public static ParameterizedType optionalOf(Type elementType) {\n    return parameterizedType(Optional.class, elementType);\n  }\n\n  public static Type arrayOf(Type elementType) {\n    return TypeFactory.arrayOf(elementType);\n  }\n\n  public static ParameterizedType pairOf(Type firstType, Type secondType) {\n    return parameterizedType(Pair.class, firstType, secondType);\n  }\n\n  public static ParameterizedType iterableOf(Type elementType) {\n    return parameterizedType(Iterable.class, elementType);\n  }\n\n  public static ParameterizedType collectionOf(Type elementType) {\n    return parameterizedType(Collection.class, elementType);\n  }\n\n  public static ParameterizedType listOf(Type elementType) {\n    return parameterizedType(List.class, elementType);\n  }\n\n  public static ParameterizedType setOf(Type elementType) {\n    return parameterizedType(Set.class, elementType);\n  }\n\n  public static ParameterizedType mapOf(Type keyType, Type valueType) {\n    return parameterizedType(Map.class, keyType, valueType);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ValueMapper.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PModule;\n\n/**\n * Automatically converts Pkl objects to Java objects. Use {@link ValueMapperBuilder} to create an\n * instance of this type, configured according to your needs.\n */\npublic interface ValueMapper {\n  /** Shorthand for {@code ValueMapperBuilder.preconfigured().build()}. */\n  static ValueMapper preconfigured() {\n    return ValueMapperBuilder.preconfigured().build();\n  }\n\n  /**\n   * Converts the given Pkl object to the given Java target type. The Pkl object can be an entire\n   * {@link PModule} or any value contained therein. See {@link PClassInfo#forValue} for which Java\n   * types are used to represent Pkl objects.\n   *\n   * <p>When mapping to a generic target type, a fully parameterized type needs to be passed, e.g.\n   * {@code List<String>}. Parameterized type literals can be created using {@link Types}, e.g.\n   * {@code Types.listOf(String.class)}.\n   *\n   * <p>If an error occurs during conversion, or if {@link ValueMapper} does not know how to convert\n   * from the given object to the given target type, a {@link ConversionException} is thrown.\n   */\n  <S, T> T map(S model, Type targetType);\n\n  /**\n   * Same as {@link #map(Object, Type)}, except that the target type is narrowed from {@link Type}\n   * to {@link Class} to allow for better type inference.\n   */\n  default <S, T> T map(S model, Class<T> targetType) {\n    return map(model, (Type) targetType);\n  }\n\n  /**\n   * Returns the converter with the given source and target types. Throws {@link\n   * ConversionException} if no such converter exists.\n   */\n  <S, T> Converter<S, T> getConverter(PClassInfo<S> sourceType, Type targetType);\n\n  /**\n   * Same as {@link #getConverter(PClassInfo, Type)}, except that the target type is narrowed from\n   * {@link Type} to {@link Class} to allow for better type inference.\n   */\n  default <S, T> Converter<S, T> getConverter(PClassInfo<S> sourceType, Class<T> targetType) {\n    return getConverter(sourceType, (Type) targetType);\n  }\n\n  /**\n   * Returns a value mapper builder that, unless further configured, will build value mappers with\n   * the same configuration as this value mapper. In other words, this is the inverse operation of\n   * {@link ValueMapperBuilder#build()}, except that a new builder is returned.\n   */\n  ValueMapperBuilder toBuilder();\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ValueMapperBuilder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * Builds a {@link ValueMapper} configured with appropriate conversions, converter factories, and\n * type mappings.\n */\n@SuppressWarnings(\"UnusedReturnValue\")\npublic final class ValueMapperBuilder {\n  private final List<Conversion<?, ?>> conversions = new ArrayList<>();\n  private final List<ConverterFactory> factories = new ArrayList<>();\n  private final List<TypeMapping<?, ?>> mappings = new ArrayList<>();\n\n  private ValueMapperBuilder() {}\n\n  /**\n   * Creates a builder without any preconfigured conversions, converter factories, or type mappings.\n   *\n   * @return a builder without any preconfigured conversions, converter factories, or type mappings\n   */\n  public static ValueMapperBuilder unconfigured() {\n    return new ValueMapperBuilder();\n  }\n\n  /**\n   * Creates a builder preconfigured with all conversions, converter factories, and type mappings\n   * defined in this module.\n   *\n   * @return a builder preconfigured with all conversions, converter factories, and type mappings\n   *     defined in this module\n   */\n  public static ValueMapperBuilder preconfigured() {\n    return unconfigured()\n        .addConversions(Conversions.all)\n        .addConverterFactories(ConverterFactories.all)\n        .addTypeMappings(TypeMappings.all);\n  }\n\n  /**\n   * Adds the given conversion. For conversions to a primitive type, a conversion to the\n   * corresponding wrapper type is automatically added.\n   *\n   * @param conversion the conversion to be added\n   * @return this\n   */\n  @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n  public ValueMapperBuilder addConversion(Conversion<?, ?> conversion) {\n    conversions.add(conversion);\n    if (conversion.targetType instanceof Class<?> clazz) {\n      if (clazz.isPrimitive()) {\n        conversions.add(\n            Conversion.of(\n                conversion.sourceType,\n                Reflection.toWrapperType(clazz),\n                (Converter) conversion.converter));\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Adds the given conversions. For conversions to a primitive type, a conversion to the\n   * corresponding wrapper type is automatically added.\n   *\n   * @param conversions the conversions to be added\n   * @return this\n   */\n  public ValueMapperBuilder addConversions(Collection<Conversion<?, ?>> conversions) {\n    conversions.forEach(this::addConversion);\n    return this;\n  }\n\n  /** Removes any existing conversions, then adds the given conversions. */\n  public ValueMapperBuilder setConversions(Collection<Conversion<?, ?>> conversions) {\n    this.conversions.clear();\n    return addConversions(conversions);\n  }\n\n  /** Returns the currently set conversions. */\n  public List<Conversion<?, ?>> getConversions() {\n    return conversions;\n  }\n\n  /**\n   * Adds the given converter factory. Factories will be queried for converters in the same order as\n   * they are being added to this builder.\n   *\n   * @param factory the converter factory to be added\n   * @return this\n   */\n  public ValueMapperBuilder addConverterFactory(ConverterFactory factory) {\n    factories.add(factory);\n    return this;\n  }\n\n  /**\n   * Adds the given converter factories. Factories will be queried for converters in the same order\n   * as they are being added to this builder.\n   *\n   * @param factories the converter factories to be added\n   * @return this\n   */\n  public ValueMapperBuilder addConverterFactories(Collection<ConverterFactory> factories) {\n    factories.forEach(this::addConverterFactory);\n    return this;\n  }\n\n  /** Removes any existing converter factories, then adds the given factories. */\n  public ValueMapperBuilder setConverterFactories(Collection<ConverterFactory> factories) {\n    this.factories.clear();\n    return addConverterFactories(factories);\n  }\n\n  /** Returns the currently set converter factories. */\n  public List<ConverterFactory> getConverterFactories() {\n    return factories;\n  }\n\n  /**\n   * Adds the given type mapping.\n   *\n   * @param mapping the type mapping to be added\n   * @return this\n   */\n  public ValueMapperBuilder addTypeMapping(TypeMapping<?, ?> mapping) {\n    mappings.add(mapping);\n    return this;\n  }\n\n  /**\n   * Adds the given type mappings.\n   *\n   * @param mappings the type mappings to be added\n   * @return this\n   */\n  public ValueMapperBuilder addTypeMappings(Collection<TypeMapping<?, ?>> mappings) {\n    mappings.forEach(this::addTypeMapping);\n    return this;\n  }\n\n  /** Removes any existing type mappings, then adds the given mappings. */\n  public ValueMapperBuilder setTypeMappings(Collection<TypeMapping<?, ?>> mappings) {\n    this.mappings.clear();\n    return addTypeMappings(mappings);\n  }\n\n  /** Returns the currently set type mappings. */\n  public List<TypeMapping<?, ?>> getTypeMappings() {\n    return mappings;\n  }\n\n  /**\n   * Builds a mapper with the configured conversions, converter factories, and type mappings. If\n   * desired, the same builder can be used to build multiple mappers.\n   *\n   * @return a mapper with the configured conversions, converter factories, and type mappings\n   */\n  public ValueMapper build() {\n    return new ValueMapperImpl(\n        // copy to shield against subsequent modification through builder\n        new ArrayList<>(conversions), new ArrayList<>(factories), new ArrayList<>(mappings));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/ValueMapperImpl.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport java.lang.reflect.Type;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.util.CollectionUtils;\n\nclass ValueMapperImpl implements ValueMapper {\n  private final Collection<Conversion<?, ?>> conversions;\n  private final Collection<ConverterFactory> factories;\n  private final Collection<TypeMapping<?, ?>> typeMappings;\n\n  private final Map<Tuple2<PClassInfo<?>, Type>, Converter<?, ?>> convertersMap;\n  private final Map<Class<?>, Class<?>> typeMappingsMap;\n\n  ValueMapperImpl(\n      Collection<Conversion<?, ?>> conversions,\n      Collection<ConverterFactory> factories,\n      Collection<TypeMapping<?, ?>> typeMappings) {\n    this.conversions = conversions;\n    this.factories = factories;\n    this.typeMappings = typeMappings;\n\n    convertersMap = CollectionUtils.newHashMap(conversions.size());\n    for (var conversion : conversions) {\n      convertersMap.put(\n          Tuple2.of(conversion.sourceType, conversion.targetType), conversion.converter);\n    }\n\n    this.typeMappingsMap = CollectionUtils.newHashMap(typeMappings.size());\n    for (var mapping : typeMappings) {\n      this.typeMappingsMap.put(mapping.requestedType, mapping.implementationType);\n    }\n  }\n\n  @Override\n  @SuppressWarnings(\"unchecked\")\n  public <S, T> T map(S model, Type targetType) {\n    var sourceType = PClassInfo.forValue(model);\n    return (T) getConverter(sourceType, targetType).convert(model, this);\n  }\n\n  private <S> Class<?> getTargetType(PClassInfo<S> sourceType, Type targetType) {\n    var rawTargetType = Reflection.toRawType(targetType);\n    var determinedClass = ClassRegistry.get(sourceType);\n    if (determinedClass == null) {\n      return rawTargetType;\n    }\n    var rawRegisteredSchema = Reflection.toRawType(determinedClass);\n    if (rawTargetType.isAssignableFrom(rawRegisteredSchema)) {\n      return rawRegisteredSchema;\n    }\n    return rawTargetType;\n  }\n\n  @Override\n  public <S, T> Converter<S, T> getConverter(PClassInfo<S> sourceType, Type targetType) {\n    Tuple2<PClassInfo<?>, Type> key = Tuple2.of(sourceType, targetType);\n\n    @SuppressWarnings(\"unchecked\")\n    Converter<S, T> converter = (Converter<S, T>) convertersMap.get(key);\n    if (converter != null) return converter;\n\n    if (Reflection.isMissingTypeArguments(targetType)) {\n      throw new IllegalArgumentException(\n          String.format(\"Target type `%s` is missing type arguments.\", targetType));\n    }\n\n    Class<?> rawTargetType = getTargetType(sourceType, targetType);\n    @SuppressWarnings(\"unchecked\")\n    var rawImplType = (Class<T>) typeMappingsMap.getOrDefault(rawTargetType, rawTargetType);\n    var implType = Reflection.getExactSubtype(targetType, rawImplType);\n\n    // look up implType converter\n    // because implType has wildcards removed, conversion to\n    // `? extends Number` or `? super Number` finds converter for `Number`\n    // (assuming `converters` has such a converter)\n    var implKey = Tuple2.of(sourceType, implType);\n    @SuppressWarnings(\"unchecked\")\n    var implConverter = (Converter<S, T>) convertersMap.get(implKey);\n    if (implConverter != null) {\n      // TODO: give converter a chance to copy itself to avoid pollution of its inline caches\n      convertersMap.put(key, implConverter);\n      return implConverter;\n    }\n\n    // create implType converter\n    for (ConverterFactory factory : factories) {\n      @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n      Optional<Converter<S, T>> newConverter = (Optional) factory.create(sourceType, implType);\n      if (newConverter.isPresent()) {\n        convertersMap.put(key, newConverter.get());\n        return newConverter.get();\n      }\n    }\n\n    throw new ConversionException(\n        String.format(\n            \"Cannot convert `%s` to `%s` because no conversion was found.\",\n            sourceType.getQualifiedName(), targetType.getTypeName()));\n  }\n\n  @Override\n  public ValueMapperBuilder toBuilder() {\n    return ValueMapperBuilder.unconfigured()\n        .setConversions(conversions)\n        .setConverterFactories(factories)\n        .setTypeMappings(typeMappings);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/mapper/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.config.java.mapper;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-config-java/src/main/java/org/pkl/config/java/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.config.java;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/AbstractConfigTest.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport static org.assertj.core.api.Assertions.*;\n\nimport java.nio.file.Path;\nimport java.util.List;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.config.java.mapper.Named;\nimport org.pkl.config.java.mapper.Types;\nimport org.pkl.core.PObject;\n\npublic abstract class AbstractConfigTest {\n\n  private final Config pigeonConfig = getPigeonConfig();\n  private final Config pigeonModuleConfig = getPigeonModuleConfig();\n  private final Config pairConfig = getPairConfig();\n  private final Config mapConfig = getMapConfig();\n\n  protected abstract Config getPigeonConfig();\n\n  protected abstract Config getPigeonModuleConfig();\n\n  protected abstract Config getPairConfig();\n\n  protected abstract Config getMapConfig();\n\n  @Test\n  public void navigate() {\n    var pigeon = pigeonConfig.get(\"pigeon\");\n    assertThat(pigeon.getQualifiedName()).isEqualTo(\"pigeon\");\n    assertThat(pigeon.getRawValue()).isInstanceOf(PObject.class);\n\n    var address = pigeon.get(\"address\");\n    assertThat(address.getQualifiedName()).isEqualTo(\"pigeon.address\");\n    assertThat(address.getRawValue()).isInstanceOf(PObject.class);\n\n    var street = address.get(\"street\");\n    assertThat(street.getQualifiedName()).isEqualTo(\"pigeon.address.street\");\n    assertThat(street.getRawValue()).isInstanceOf(String.class);\n\n    assertThat(street.as(String.class)).isEqualTo(\"Fuzzy St.\");\n  }\n\n  @Test\n  public void navigateToNonExistingObjectChild() {\n    var pigeon = pigeonConfig.get(\"pigeon\");\n    var t = catchThrowable(() -> pigeon.get(\"non-existing\"));\n\n    assertThat(t)\n        .isInstanceOf(NoSuchChildException.class)\n        .hasMessageStartingWith(\n            \"Node `pigeon` of type `pkl.base#Dynamic` \"\n                + \"does not have a property named `non-existing`.\");\n  }\n\n  @Test\n  public void navigateToNonExistingMapChild() {\n    var map = mapConfig.get(\"x\");\n    var t = catchThrowable(() -> map.get(\"non-existing\"));\n\n    assertThat(t)\n        .isInstanceOf(NoSuchChildException.class)\n        .hasMessageStartingWith(\n            \"Node `x` of type `pkl.base#Map` does not have a key named `non-existing`.\");\n  }\n\n  @Test\n  public void navigateToNonExistingLeafChild() {\n    var age = pigeonConfig.get(\"pigeon\").get(\"age\");\n    var t = catchThrowable(() -> age.get(\"non-existing\"));\n\n    assertThat(t)\n        .isInstanceOf(NoSuchChildException.class)\n        .hasMessageStartingWith(\n            \"Leaf node `pigeon.age` of type `pkl.base#Int` does not have a child named `non-existing`.\");\n  }\n\n  @Test\n  public void convertObjectToPojoByType() {\n    Person pigeon = pigeonConfig.get(\"pigeon\").as(Person.class);\n    checkPigeon(pigeon);\n  }\n\n  @Test\n  public void convertObjectToPojoByJavaType() {\n    var pigeon = pigeonConfig.get(\"pigeon\").as(JavaType.of(Person.class));\n    checkPigeon(pigeon);\n  }\n\n  @Test\n  public void convertModuleToPojoByType() {\n    var pigeon = pigeonModuleConfig.as(Person.class);\n    checkPigeon(pigeon);\n  }\n\n  @Test\n  public void convertModuleToPojoByJavaType() {\n    var pigeon = pigeonModuleConfig.as(JavaType.of(Person.class));\n    checkPigeon(pigeon);\n  }\n\n  private void checkPigeon(Person pigeon) {\n    assertThat(pigeon).isNotNull();\n    assertThat(pigeon.age).isEqualTo(30);\n    assertThat(pigeon.friends).containsExactly(\"john\", \"mary\");\n    assertThat(pigeon.address.street).isEqualTo(\"Fuzzy St.\");\n  }\n\n  @Test\n  public void convertToParameterizedTypeByType() {\n    Pair<Path, Integer> pair =\n        pairConfig.get(\"x\").as(Types.parameterizedType(Pair.class, Path.class, Integer.class));\n    checkPair(pair);\n  }\n\n  @Test\n  public void convertToParameterizedTypeByJavaType() {\n    var pair = pairConfig.get(\"x\").as(new JavaType<Pair<Path, Integer>>() {});\n    checkPair(pair);\n  }\n\n  private void checkPair(Pair<?, ?> pair) {\n    assertThat(pair).isNotNull();\n    assertThat(pair.first).isEqualTo(Path.of(\"file/path\"));\n    assertThat(pair.second).isEqualTo(42);\n  }\n\n  public static class Person {\n    final int age;\n    final List<String> friends;\n    final Address address;\n\n    public Person(\n        @Named(\"age\") int age,\n        @Named(\"friends\") List<String> friends,\n        @Named(\"address\") Address address) {\n      this.age = age;\n      this.friends = friends;\n      this.address = address;\n    }\n  }\n\n  public static class Address {\n    final String street;\n\n    public Address(@Named(\"street\") String street) {\n      this.street = street;\n    }\n  }\n\n  public static class Pair<S, T> {\n    final S first;\n    final T second;\n\n    public Pair(@Named(\"first\") S first, @Named(\"second\") T second) {\n      this.first = first;\n      this.second = second;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/ConfigEvaluatorBuilderTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.*;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.config.java.mapper.ConverterFactories;\nimport org.pkl.core.SecurityManagers;\n\npublic class ConfigEvaluatorBuilderTest {\n  @Test\n  public void preconfiguredBuilderHasPreconfiguredUnderlyingBuilders() {\n    var builder = ConfigEvaluatorBuilder.preconfigured();\n\n    var evaluatorBuilder = builder.getEvaluatorBuilder();\n    assertThat(evaluatorBuilder).isNotNull();\n    assertThat(evaluatorBuilder.getEnvironmentVariables()).isEqualTo(System.getenv());\n    assertThat(evaluatorBuilder.getExternalProperties()).isEqualTo(System.getProperties());\n\n    var mapperBuilder = builder.getValueMapperBuilder();\n    assertThat(mapperBuilder).isNotNull();\n    assertThat(mapperBuilder.getConverterFactories()).isEqualTo(ConverterFactories.all);\n  }\n\n  @Test\n  public void unconfiguredBuilderHasUnconfiguredUnderlyingBuilders() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n\n    var evaluatorBuilder = builder.getEvaluatorBuilder();\n    assertThat(evaluatorBuilder).isNotNull();\n    assertThat(evaluatorBuilder.getEnvironmentVariables()).isEmpty();\n    assertThat(evaluatorBuilder.getExternalProperties()).isEmpty();\n\n    var mapperBuilder = builder.getValueMapperBuilder();\n    assertThat(mapperBuilder).isNotNull();\n    assertThat(mapperBuilder.getConverterFactories()).isEmpty();\n  }\n\n  @Test\n  public void preconfiguredBuilderContainsProcessEnvironmentVariables() {\n    var builder = ConfigEvaluatorBuilder.preconfigured();\n    assertThat(builder.getEnvironmentVariables()).isEqualTo(System.getenv());\n  }\n\n  @Test\n  public void unconfiguredBuilderContainsNoEnvironmentVariables() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n    assertThat(builder.getEnvironmentVariables()).isEmpty();\n  }\n\n  @Test\n  public void addEnvironmentVariables() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n    builder.addEnvironmentVariable(\"ONE\", \"one\");\n    var envVars = Map.of(\"TWO\", \"two\", \"THREE\", \"three\");\n    builder.addEnvironmentVariables(envVars);\n\n    assertThat(builder.getEnvironmentVariables()).hasSize(3);\n    assertThat(builder.getEnvironmentVariables()).containsEntry(\"ONE\", \"one\");\n    assertThat(builder.getEnvironmentVariables()).containsAllEntriesOf(envVars);\n  }\n\n  @Test\n  public void overrideEnvironmentVariables() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n\n    var envVars1 = Map.of(\"TWO\", \"two\", \"THREE\", \"three\");\n    builder.addEnvironmentVariables(envVars1);\n\n    var envVars2 = Map.of(\"FOUR\", \"four\", \"FIVE\", \"five\");\n    builder.setEnvironmentVariables(envVars2);\n\n    assertThat(builder.getEnvironmentVariables()).hasSize(2);\n    assertThat(builder.getEnvironmentVariables()).containsAllEntriesOf(envVars2);\n  }\n\n  @Test\n  public void preconfiguredBuilderContainsSystemProperties() {\n    var builder = ConfigEvaluatorBuilder.preconfigured();\n    assertThat(builder.getExternalProperties()).isEqualTo(System.getProperties());\n  }\n\n  @Test\n  public void unconfiguredBuilderContainsNoExternalProperties() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n    assertThat(builder.getExternalProperties()).isEmpty();\n  }\n\n  @Test\n  public void addExternalProperties() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n    builder.addExternalProperty(\"ONE\", \"one\");\n    var properties = Map.of(\"TWO\", \"two\", \"THREE\", \"three\");\n    builder.addExternalProperties(properties);\n\n    assertThat(builder.getExternalProperties()).hasSize(3);\n    assertThat(builder.getExternalProperties()).containsEntry(\"ONE\", \"one\");\n    assertThat(builder.getExternalProperties()).containsAllEntriesOf(properties);\n  }\n\n  @Test\n  public void overrideExternalProperties() {\n    var builder = ConfigEvaluatorBuilder.unconfigured();\n\n    var properties1 = Map.of(\"TWO\", \"two\", \"THREE\", \"three\");\n    builder.addExternalProperties(properties1);\n\n    var properties2 = Map.of(\"FOUR\", \"four\", \"FIVE\", \"five\");\n    builder.setExternalProperties(properties2);\n\n    assertThat(builder.getExternalProperties()).hasSize(2);\n    assertThat(builder.getExternalProperties()).containsAllEntriesOf(properties2);\n  }\n\n  @Test\n  public void setSecurityManager() {\n    var builder = ConfigEvaluatorBuilder.preconfigured();\n\n    assertThat(builder.getAllowedModules()).isEqualTo(SecurityManagers.defaultAllowedModules);\n    assertThat(builder.getAllowedResources()).isEqualTo(SecurityManagers.defaultAllowedResources);\n\n    var manager =\n        SecurityManagers.standard(List.of(), List.of(), SecurityManagers.defaultTrustLevels, null);\n\n    builder = ConfigEvaluatorBuilder.preconfigured().setSecurityManager(manager);\n\n    assertThat(builder.getSecurityManager()).isSameAs(manager);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/ConfigPklBinaryDecoderTest.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport java.util.Base64;\n\npublic class ConfigPklBinaryDecoderTest extends AbstractConfigTest {\n  // generate via: pbpaste | ./pkl-cli/build/executable/jpkl eval /dev/stdin -f pkl-binary | base64\n\n  @Override\n  protected Config getPigeonConfig() {\n    // pigeon { age = 30; friends = List(\"john\", \"mary\"); address { street = \"Fuzzy St.\" } }\n    return Config.fromPklBinary(\n        Base64.getDecoder()\n            .decode(\n                \"lAGkdGVzdNklZmlsZTovLy9Vc2Vycy9qYmFzY2gvc3JjL3BrbC90ZXN0LnBrbJGTEKZwaWdlb26UAadEeW5hbWljqHBrbDpiYXNlk5MQo2FnZR6TEKdmcmllbmRzkgSSpGpvaG6kbWFyeZMQp2FkZHJlc3OUAadEeW5hbWljqHBrbDpiYXNlkZMQpnN0cmVldKlGdXp6eSBTdC4=\"));\n  }\n\n  @Override\n  protected Config getPigeonModuleConfig() {\n    // age = 30; friends = List(\"john\", \"mary\"); address { street = \"Fuzzy St.\" }\n    return Config.fromPklBinary(\n        Base64.getDecoder()\n            .decode(\n                \"lAGlc3RkaW6xZmlsZTovLy9kZXYvc3RkaW6TkxCjYWdlHpMQp2ZyaWVuZHOSBJKkam9obqRtYXJ5kxCnYWRkcmVzc5QBp0R5bmFtaWOocGtsOmJhc2WRkxCmc3RyZWV0qUZ1enp5IFN0Lg==\"));\n  }\n\n  @Override\n  protected Config getPairConfig() {\n    // x { first = \"file/path\"; second = 42 }\n    return Config.fromPklBinary(\n        Base64.getDecoder()\n            .decode(\n                \"lAGlc3RkaW6xZmlsZTovLy9kZXYvc3RkaW6RkxCheJQBp0R5bmFtaWOocGtsOmJhc2WSkxClZmlyc3SpZmlsZS9wYXRokxCmc2Vjb25kKg==\"));\n  }\n\n  @Override\n  protected Config getMapConfig() {\n    // x = Map(\"one\", 1, \"two\", 2)\n    return Config.fromPklBinary(\n        Base64.getDecoder().decode(\"lAGlc3RkaW6xZmlsZTovLy9kZXYvc3RkaW6RkxCheJICgqNvbmUBo3R3bwI=\"));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/ConfigTest.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.pkl.core.ModuleSource.text;\n\nimport org.junit.jupiter.api.Test;\n\npublic class ConfigTest extends AbstractConfigTest {\n  private static final ConfigEvaluator evaluator = ConfigEvaluator.preconfigured();\n\n  private static final String pigeonText =\n      \"pigeon { age = 30; friends = List(\\\"john\\\", \\\"mary\\\"); address { street = \\\"Fuzzy St.\\\" } }\";\n\n  @Override\n  protected Config getPigeonConfig() {\n    return evaluator.evaluate(text(pigeonText));\n  }\n\n  @Override\n  protected Config getPigeonModuleConfig() {\n    return evaluator.evaluate(\n        text(\"age = 30; friends = List(\\\"john\\\", \\\"mary\\\"); address { street = \\\"Fuzzy St.\\\" }\"));\n  }\n\n  @Override\n  protected Config getPairConfig() {\n    return evaluator.evaluate(text(\"x { first = \\\"file/path\\\"; second = 42 }\"));\n  }\n\n  @Override\n  protected Config getMapConfig() {\n    return evaluator.evaluate(text(\"x = Map(\\\"one\\\", 1, \\\"two\\\", 2)\"));\n  }\n\n  @Test\n  public void evaluateOutputValue() {\n    var valueConfig =\n        evaluator.evaluateOutputValue(\n            text(pigeonText + \"\\noutput { value = (outer) { pigeon { age = 99 } } }\"));\n    var pigeon = valueConfig.get(\"pigeon\").as(Person.class);\n    assertThat(pigeon.age).isEqualTo(99);\n  }\n\n  @Test\n  public void evaluateExpression() {\n    var addressConfig = evaluator.evaluateExpression(text(pigeonText), \"pigeon.address\");\n    var address = addressConfig.as(Address.class);\n    assertThat(address.street).isEqualTo(\"Fuzzy St.\");\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/JavaTypeTest.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java;\n\nimport static org.assertj.core.api.Assertions.*;\n\nimport java.net.URI;\nimport java.net.URL;\nimport java.nio.file.Path;\nimport java.util.*;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.config.java.mapper.Reflection;\nimport org.pkl.config.java.mapper.Types;\n\npublic class JavaTypeTest {\n  @Test\n  public void constructOptionalType() {\n    var type = JavaType.optionalOf(String.class);\n    assertThat(type).isEqualTo(new JavaType<Optional<String>>() {});\n    assertThat(type).isEqualTo(JavaType.optionalOf(JavaType.of(String.class)));\n    assertThat(Reflection.toRawType(type.getType())).isEqualTo(Optional.class);\n  }\n\n  @Test\n  public void constructArrayType() {\n    var type = JavaType.arrayOf(String.class);\n    assertThat(type).isEqualTo(new JavaType<String[]>() {});\n    assertThat(type).isEqualTo(JavaType.arrayOf(JavaType.of(String.class)));\n    assertThat(Reflection.toRawType(type.getType()).isArray()).isTrue();\n  }\n\n  @Test\n  public void constructIterableType() {\n    var type = JavaType.iterableOf(String.class);\n    assertThat(type).isEqualTo(new JavaType<Iterable<String>>() {});\n    assertThat(type).isEqualTo(JavaType.iterableOf(JavaType.of(String.class)));\n    assertThat(Reflection.toRawType(type.getType())).isEqualTo(Iterable.class);\n  }\n\n  @Test\n  public void constructCollectionType() {\n    var type = JavaType.collectionOf(String.class);\n    assertThat(type).isEqualTo(new JavaType<Collection<String>>() {});\n    assertThat(type).isEqualTo(JavaType.collectionOf(JavaType.of(String.class)));\n    assertThat(Reflection.toRawType(type.getType())).isEqualTo(Collection.class);\n  }\n\n  @Test\n  public void constructListType() {\n    var type = JavaType.listOf(String.class);\n    assertThat(type).isEqualTo(new JavaType<List<String>>() {});\n    assertThat(type).isEqualTo(JavaType.listOf(JavaType.of(String.class)));\n    assertThat(Reflection.toRawType(type.getType())).isEqualTo(List.class);\n  }\n\n  @Test\n  public void constructSetType() {\n    var type = JavaType.setOf(String.class);\n    assertThat(type).isEqualTo(new JavaType<Set<String>>() {});\n    assertThat(type).isEqualTo(JavaType.setOf(JavaType.of(String.class)));\n    assertThat(Reflection.toRawType(type.getType())).isEqualTo(Set.class);\n  }\n\n  @Test\n  public void constructMapType() {\n    var type = JavaType.mapOf(String.class, URI.class);\n    assertThat(type).isEqualTo(new JavaType<Map<String, URI>>() {});\n    assertThat(type).isEqualTo(JavaType.mapOf(JavaType.of(String.class), JavaType.of(URI.class)));\n    assertThat(Reflection.toRawType(type.getType())).isEqualTo(Map.class);\n  }\n\n  @Test\n  public void usageAsTypeToken() {\n    var javaType = new JavaType<Map<String, List<URI>>>() {};\n\n    assertThat(javaType.getType()).isEqualTo(Types.mapOf(String.class, Types.listOf(URI.class)));\n  }\n\n  @SuppressWarnings({\"EqualsWithItself\", \"AssertBetweenInconvertibleTypes\"})\n  @Test\n  public void sameTypesConstructedInDifferentWaysAreEqual() {\n    var type1 = JavaType.mapOf(JavaType.of(String.class), JavaType.listOf(URI.class));\n    var type2 = new JavaType<Map<String, List<URI>>>() {};\n    var type3 = JavaType.of(Types.mapOf(String.class, Types.listOf(URI.class)));\n\n    assertThat(type1).isEqualTo(type1);\n    assertThat(type2).isEqualTo(type1);\n    assertThat(type3).isEqualTo(type2);\n\n    assertThat(type2.hashCode()).isEqualTo(type1.hashCode());\n    assertThat(type3.hashCode()).isEqualTo(type2.hashCode());\n  }\n\n  @Test\n  public void differentTypesAreNotEqual() {\n    var type1 = JavaType.mapOf(JavaType.of(String.class), JavaType.listOf(URI.class));\n    var type2 = new JavaType<Map<String, List<URL>>>() {};\n    var type3 = JavaType.of(Types.mapOf(String.class, Types.listOf(Path.class)));\n\n    assertThat(type2).isNotEqualTo(type1);\n    assertThat(type3).isNotEqualTo(type1);\n    assertThat(type2).isNotEqualTo(type3);\n\n    // hopefully\n    assertThat(type2.hashCode()).isNotEqualTo(type1.hashCode());\n    assertThat(type3.hashCode()).isNotEqualTo(type1.hashCode());\n    assertThat(type3.hashCode()).isNotEqualTo(type2.hashCode());\n  }\n\n  @Test\n  public void sameStringRepresentationAsJavaLangReflectType() {\n    var type = JavaType.mapOf(String.class, URI.class);\n    assertThat(type.toString()).isEqualTo(\"java.util.Map<java.lang.String, java.net.URI>\");\n    assertThat(type.toString()).isEqualTo(type.getType().toString());\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/BytesToByteArrayTest.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class BytesToByteArrayTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/BytesToByteArrayTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n    var mapped = mapper.map(ex1, Types.arrayOf(byte.class));\n    assertThat(mapped).isEqualTo(new byte[] {});\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n    var mapped = mapper.map(ex2, Types.arrayOf(byte.class));\n    assertThat(mapped).isEqualTo(new byte[] {1, 2, 3, 4});\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/ConversionsTest.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\n\nimport java.io.File;\nimport java.nio.file.Path;\nimport java.time.temporal.ChronoUnit;\nimport java.util.regex.Pattern;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Duration;\nimport org.pkl.core.DurationUnit;\n\npublic class ConversionsTest {\n  @Test\n  public void pStringToFile() {\n    var file =\n        Conversions.pStringToFile.converter.convert(\"relative/path\", ValueMapper.preconfigured());\n    assertThat(file).isEqualTo(new File(\"relative/path\"));\n\n    var file2 =\n        Conversions.pStringToFile.converter.convert(\"/absolute/path\", ValueMapper.preconfigured());\n    assertThat(file2).isEqualTo(new File(\"/absolute/path\"));\n\n    var file3 = Conversions.pStringToFile.converter.convert(\"\", ValueMapper.preconfigured());\n    assertThat(file3).isEqualTo(new File(\"\"));\n  }\n\n  @Test\n  public void pStringToPath() {\n    var path =\n        Conversions.pStringToPath.converter.convert(\"relative/path\", ValueMapper.preconfigured());\n    assertThat(path).isEqualTo(Path.of(\"relative/path\"));\n\n    var path2 =\n        Conversions.pStringToPath.converter.convert(\"/absolute/path\", ValueMapper.preconfigured());\n    assertThat(path2).isEqualTo(Path.of(\"/absolute/path\"));\n\n    var path3 = Conversions.pStringToPath.converter.convert(\"\", ValueMapper.preconfigured());\n    assertThat(path3).isEqualTo(Path.of(\"\"));\n  }\n\n  @Test\n  public void pStringToPattern() {\n    var str = \"(?i)\\\\w*\";\n    var pattern = Conversions.pStringToPattern.converter.convert(str, ValueMapper.preconfigured());\n    assertThat(pattern.pattern()).isEqualTo(str);\n  }\n\n  @Test\n  public void pRegexToString() {\n    var regex = Pattern.compile(\"(?i)\\\\w*\");\n    var str = Conversions.pRegexToString.converter.convert(regex, ValueMapper.preconfigured());\n    assertThat(str).isEqualTo(\"(?i)\\\\w*\");\n  }\n\n  @Test\n  public void pDurationToDuration() {\n    var pDuration = new Duration(100, DurationUnit.MINUTES);\n    var duration =\n        Conversions.pDurationToDuration.converter.convert(pDuration, ValueMapper.preconfigured());\n    assertThat(duration).isEqualTo(java.time.Duration.of(100, ChronoUnit.MINUTES));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PAnyToOptionalTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.*;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class PAnyToOptionalTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PAnyToOptionalTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n    Optional<String> mapped = mapper.map(ex1, Types.optionalOf(String.class));\n\n    assertThat(mapped).isEmpty();\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n    Optional<String> mapped = mapper.map(ex2, Types.optionalOf(String.class));\n\n    assertThat(mapped).contains(\"str\");\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.getProperty(\"ex3\");\n    Optional<List<Integer>> mapped = mapper.map(ex3, Types.optionalOf(Types.listOf(Integer.class)));\n\n    assertThat(mapped).contains(List.of(1, 2, 3));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PCollectionToArrayTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class PCollectionToArrayTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PCollectionToArrayTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n    assertThat(mapper.map(ex1, byte[].class)).isEqualTo(new byte[0]);\n    assertThat(mapper.map(ex1, short[].class)).isEqualTo(new short[0]);\n    assertThat(mapper.map(ex1, int[].class)).isEqualTo(new int[0]);\n    assertThat(mapper.map(ex1, long[].class)).isEqualTo(new long[0]);\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n    assertThat(mapper.map(ex2, byte[].class)).isEqualTo(new byte[] {1, 2, 3});\n    assertThat(mapper.map(ex2, short[].class)).isEqualTo(new short[] {1, 2, 3});\n    assertThat(mapper.map(ex2, int[].class)).isEqualTo(new int[] {1, 2, 3});\n    assertThat(mapper.map(ex2, long[].class)).isEqualTo(new long[] {1, 2, 3});\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.getProperty(\"ex3\");\n    assertThat(mapper.map(ex3, byte[].class)).isEqualTo(new byte[] {1, 2, 3});\n    assertThat(mapper.map(ex3, short[].class)).isEqualTo(new short[] {1, 2, 3});\n    assertThat(mapper.map(ex3, int[].class)).isEqualTo(new int[] {1, 2, 3});\n    assertThat(mapper.map(ex3, long[].class)).isEqualTo(new long[] {1, 2, 3});\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.getProperty(\"ex4\");\n    assertThat(mapper.map(ex4, float[].class)).isEqualTo(new float[] {1f, 2f, 3.3f});\n    assertThat(mapper.map(ex4, double[].class)).isEqualTo(new double[] {1d, 2d, 3.3d});\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.getProperty(\"ex5\");\n    assertThat(mapper.map(ex5, boolean[].class)).isEqualTo(new boolean[] {true, false, true});\n  }\n\n  @Test\n  public void ex6() {\n    var ex6 = module.getProperty(\"ex6\");\n    assertThat(mapper.map(ex6, Person[].class))\n        .isEqualTo(new Person[] {new Person(\"pigeon\", 40), new Person(\"parrot\", 30)});\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PCollectionToCollectionTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.List;\nimport org.assertj.core.api.Assertions;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class PCollectionToCollectionTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PCollectionToCollectionTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n\n    List<Byte> mapped1 = mapper.map(ex1, Types.listOf(Byte.class));\n    assertThat(mapped1).isEmpty();\n\n    List<Short> mapped2 = mapper.map(ex1, Types.listOf(Short.class));\n    assertThat(mapped2).isEmpty();\n\n    List<Integer> mapped3 = mapper.map(ex1, Types.listOf(Integer.class));\n    assertThat(mapped3).isEmpty();\n\n    List<Long> mapped4 = mapper.map(ex1, Types.listOf(Long.class));\n    assertThat(mapped4).isEmpty();\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n\n    List<Byte> mapped1 = mapper.map(ex2, Types.listOf(Byte.class));\n    assertThat(mapped1).containsExactly((byte) 1, (byte) 2, (byte) 3);\n\n    List<Short> mapped2 = mapper.map(ex2, Types.listOf(Short.class));\n    assertThat(mapped2).containsExactly((short) 1, (short) 2, (short) 3);\n\n    List<Integer> mapped3 = mapper.map(ex2, Types.listOf(Integer.class));\n    assertThat(mapped3).containsExactly(1, 2, 3);\n\n    List<Long> mapped4 = mapper.map(ex2, Types.listOf(Long.class));\n    assertThat(mapped4).containsExactly(1L, 2L, 3L);\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.getProperty(\"ex3\");\n\n    List<Byte> mapped1 = mapper.map(ex3, Types.listOf(Byte.class));\n    assertThat(mapped1).containsExactly((byte) 1, (byte) 2, (byte) 3);\n\n    List<Short> mapped2 = mapper.map(ex3, Types.listOf(Short.class));\n    assertThat(mapped2).containsExactly((short) 1, (short) 2, (short) 3);\n\n    List<Integer> mapped3 = mapper.map(ex3, Types.listOf(Integer.class));\n    assertThat(mapped3).containsExactly(1, 2, 3);\n\n    List<Long> mapped4 = mapper.map(ex3, Types.listOf(Long.class));\n    assertThat(mapped4).containsExactly(1L, 2L, 3L);\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.getProperty(\"ex4\");\n\n    List<Float> mapped1 = mapper.map(ex4, Types.listOf(Float.class));\n    assertThat(mapped1).containsExactly(1f, 2f, 3.3f);\n\n    List<Double> mapped2 = mapper.map(ex4, Types.listOf(Double.class));\n    assertThat(mapped2).containsExactly(1d, 2d, 3.3d);\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.getProperty(\"ex5\");\n    List<Boolean> mapped = mapper.map(ex5, Types.listOf(Boolean.class));\n    assertThat(mapped).containsExactly(true, false, true);\n  }\n\n  @Test\n  public void ex6() {\n    var ex6 = module.getProperty(\"ex6\");\n    List<Person> mapped = mapper.map(ex6, Types.listOf(Person.class));\n    Assertions.assertThat(mapped)\n        .containsExactly(new Person(\"pigeon\", 40), new Person(\"parrot\", 30));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PMapToMapTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.Map;\nimport java.util.Properties;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.*;\n\npublic class PMapToMapTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PMapToMapTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n    Map<Integer, Integer> mapped = mapper.map(ex1, Types.mapOf(Integer.class, Integer.class));\n\n    assertThat(mapped).isEmpty();\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n    Map<Integer, Integer> mapped = mapper.map(ex2, Types.mapOf(Integer.class, Integer.class));\n    assertThat(mapped).containsOnly(entry(1, 2), entry(2, 4), entry(3, 6));\n\n    Map<Byte, Double> mapped2 = mapper.map(ex2, Types.mapOf(Byte.class, Double.class));\n    assertThat(mapped2).containsOnly(entry((byte) 1, 2d), entry((byte) 2, 4d), entry((byte) 3, 6d));\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.getProperty(\"ex3\");\n    Map<Integer, Double> mapped = mapper.map(ex3, Types.mapOf(Integer.class, Double.class));\n\n    assertThat(mapped).containsOnly(entry(1, 2d), entry(2, 4d), entry(3, 6.6d));\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.getProperty(\"ex4\");\n\n    Map<String, Map<String, Object>> mapped =\n        mapper.map(ex4, Types.mapOf(String.class, Types.mapOf(String.class, Object.class)));\n\n    Map<String, Object> pigeon = Map.of(\"name\", \"pigeon\", \"age\", 40L);\n    Map<String, Object> parrot = Map.of(\"name\", \"parrot\", \"age\", 30L);\n\n    assertThat(mapped).containsOnly(entry(\"pigeon\", pigeon), entry(\"parrot\", parrot));\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.getProperty(\"ex5\");\n    Map<String, Person> mapped = mapper.map(ex5, Types.mapOf(String.class, Person.class));\n\n    assertThat(mapped)\n        .containsOnly(\n            entry(\"pigeon\", new Person(\"pigeon\", 40)), entry(\"parrot\", new Person(\"parrot\", 30)));\n  }\n\n  @Test\n  public void ex6() {\n    var ex6 = module.getProperty(\"ex6\");\n    Map<Person, String> mapped = mapper.map(ex6, Types.mapOf(Person.class, String.class));\n\n    assertThat(mapped)\n        .containsOnly(\n            entry(new Person(\"pigeon\", 40), \"pigeon\"), entry(new Person(\"parrot\", 30), \"parrot\"));\n  }\n\n  @Test\n  public void ex7() {\n    var mapper =\n        ValueMapperBuilder.preconfigured()\n            .addConversion(\n                Conversion.of(PClassInfo.Int, String.class, (num, mapper2) -> String.valueOf(num)))\n            .build();\n    var ex7 = module.getProperty(\"ex7\");\n    // conversion from PInt to String kicks in because PMapToMap treats Properties as\n    // Map<String,String>\n    var properties = mapper.map(ex7, Properties.class);\n\n    assertThat(properties).hasSize(2);\n    assertThat(properties.getProperty(\"1\")).isEqualTo(\"2\");\n    assertThat(properties.getProperty(\"2\")).isEqualTo(\"4\");\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PModuleToDataObjectTest.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.*;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.config.java.mapper.PObjectToDataObjectTest.Address;\nimport org.pkl.config.java.mapper.PObjectToDataObjectTest.Hobby;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class PModuleToDataObjectTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PModuleToDataObjectTest.pkl\"));\n  private final PObjectToDataObjectTest.Person pigeon =\n      new PObjectToDataObjectTest.Person(\n          \"pigeon\",\n          40,\n          EnumSet.of(Hobby.SURFING, Hobby.SWIMMING),\n          new Address(\"sesame street\", 94105));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void doit() {\n    assertThat(mapper.map(module, PObjectToDataObjectTest.Person.class)).isEqualTo(pigeon);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PNullToAnyTest.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.assertj.core.api.Assertions.assertThatThrownBy;\n\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.PNull;\n\npublic class PNullToAnyTest {\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @SuppressWarnings(\"DataFlowIssue\")\n  @Test\n  public void test() {\n    // due to Conversions.identities\n    assertThat(mapper.map(PNull.getInstance(), PNull.class)).isEqualTo(PNull.getInstance());\n\n    assertThat(mapper.map(PNull.getInstance(), String.class)).isNull();\n    assertThat(mapper.map(PNull.getInstance(), Person.class)).isNull();\n    assertThat(mapper.map(PNull.getInstance(), Integer.class)).isNull();\n\n    assertThatThrownBy(() -> mapper.map(PNull.getInstance(), int.class))\n        .isInstanceOf(ConversionException.class);\n  }\n\n  public static class Person {}\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PObjectToDataObjectJavaxInjectTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.EnumSet;\nimport java.util.Objects;\nimport java.util.Set;\nimport javax.inject.Named;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\nimport org.pkl.core.util.Nullable;\n\npublic class PObjectToDataObjectJavaxInjectTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PObjectToDataObjectTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  private static final Person pigeon =\n      new Person(\n          \"pigeon\",\n          40,\n          EnumSet.of(Hobby.SURFING, Hobby.SWIMMING),\n          new Address(\"sesame street\", 94105));\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n\n    assertThat(mapper.map(ex1, Person.class)).isEqualTo(pigeon);\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n\n    assertThat(mapper.map(ex2, Person.class)).isEqualTo(pigeon);\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.getProperty(\"ex3\");\n    Object mapped =\n        mapper.map(ex3, Types.parameterizedType(Pair.class, String.class, Integer.class));\n\n    assertThat(mapped).isEqualTo(new Pair<>(\"foo\", 42));\n  }\n\n  static class Person {\n    final String name;\n    final int age;\n    final Set<Hobby> hobbies;\n    final Address address;\n\n    Person(\n        @Named(\"name\") String name,\n        @Named(\"age\") int age,\n        @Named(\"hobbies\") Set<Hobby> hobbies,\n        @Named(\"address\") Address address) {\n      this.name = name;\n      this.age = age;\n      this.hobbies = hobbies;\n      this.address = address;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Person other)) return false;\n      return name.equals(other.name)\n          && age == other.age\n          && hobbies.equals(other.hobbies)\n          && address.equals(other.address);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(name, age, hobbies, address);\n    }\n  }\n\n  static class Address {\n    final String street;\n    final int zip;\n\n    Address(@Named(\"street\") String street, @Named(\"zip\") int zip) {\n      this.street = street;\n      this.zip = zip;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Address other)) return false;\n      return street.equals(other.street) && zip == other.zip;\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(street, zip);\n    }\n  }\n\n  public enum Hobby {\n    SWIMMING,\n    SURFING,\n    READING\n  }\n\n  public static class Pair<S, T> {\n    public final S first;\n    public final T second;\n\n    public Pair(@Named(\"first\") S first, @Named(\"second\") T second) {\n      this.first = first;\n      this.second = second;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Pair<?, ?> other)) return false;\n      return first.equals(other.first) && second.equals(other.second);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(first, second);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PObjectToDataObjectOverriddenPropertyTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport com.example.OverriddenProperty;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.config.java.ConfigEvaluator;\nimport org.pkl.core.ModuleSource;\n\nclass PObjectToDataObjectOverriddenPropertyTest {\n  @Test\n  void overriddenProperty() {\n    try (var evaluator = ConfigEvaluator.preconfigured()) {\n      var result =\n          evaluator\n              .evaluate(ModuleSource.modulePath(\"/codegenPkl/OverriddenProperty.pkl\"))\n              .as(OverriddenProperty.class);\n      assertThat(result.theClass.bar.get(0).prop1).isEqualTo(\"hello\");\n      assertThat(result.theClass.bar.get(0).prop2).isEqualTo(\"hello again\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PObjectToDataObjectTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.beans.ConstructorProperties;\nimport java.util.*;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\nimport org.pkl.core.util.Nullable;\n\npublic class PObjectToDataObjectTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PObjectToDataObjectTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  private static final Person pigeon =\n      new Person(\n          \"pigeon\",\n          40,\n          EnumSet.of(Hobby.SURFING, Hobby.SWIMMING),\n          new Address(\"sesame street\", 94105));\n\n  private static final PersonConstructorProperties pigeon2 =\n      new PersonConstructorProperties(\n          \"pigeon\",\n          40,\n          EnumSet.of(Hobby.SURFING, Hobby.SWIMMING),\n          new Address(\"sesame street\", 94105));\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n\n    assertThat(mapper.map(ex1, Person.class)).isEqualTo(pigeon);\n  }\n\n  @Test\n  public void ex1_constructor_properties() {\n    var ex1 = module.getProperty(\"ex1\");\n    assertThat(mapper.map(ex1, PersonConstructorProperties.class)).isEqualTo(pigeon2);\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n\n    assertThat(mapper.map(ex2, Person.class)).isEqualTo(pigeon);\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.getProperty(\"ex3\");\n    Object mapped =\n        mapper.map(ex3, Types.parameterizedType(Pair.class, String.class, Integer.class));\n\n    assertThat(mapped).isEqualTo(new Pair<>(\"foo\", 42));\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.getProperty(\"ex4\");\n    var t = catchThrowable(() -> mapper.map(ex4, Address.class));\n\n    assertThat(t).isInstanceOf(ConversionException.class);\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.getProperty(\"ex5\");\n\n    assertThat(mapper.map(ex5, UpperBounds.class).numbers).isEqualTo(List.of(1L, 2L, 3L));\n    assertThat(mapper.map(ex5, LowerBounds.class).numbers).isEqualTo(List.of(1, 2, 3));\n  }\n\n  @Test\n  public void errorMessageNamesPropertyWhoseConversionFailed() {\n    var ex3 = module.getProperty(\"ex3\");\n\n    var t =\n        catchThrowable(\n            () ->\n                mapper.map(ex3, Types.parameterizedType(Pair.class, Integer.class, Integer.class)));\n\n    assertThat(t).isInstanceOf(ConversionException.class);\n    assertThat(t.getMessage())\n        .startsWith(\n            \"Error converting property `first` in Pkl object of type `Dynamic` \"\n                + \"to equally named constructor parameter in Java class \"\n                + \"`org.pkl.config.java.mapper.\"\n                + \"PObjectToDataObjectTest$Pair`:\");\n  }\n\n  static class Person {\n    final String name;\n    final int age;\n    final Set<Hobby> hobbies;\n    final Address address;\n\n    Person(\n        @Named(\"name\") String name,\n        @Named(\"age\") int age,\n        @Named(\"hobbies\") Set<Hobby> hobbies,\n        @Named(\"address\") Address address) {\n      this.name = name;\n      this.age = age;\n      this.hobbies = hobbies;\n      this.address = address;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Person other)) return false;\n      return name.equals(other.name)\n          && age == other.age\n          && hobbies.equals(other.hobbies)\n          && address.equals(other.address);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(name, age, hobbies, address);\n    }\n  }\n\n  static class PersonConstructorProperties {\n    final String name;\n    final int age;\n    final Set<Hobby> hobbies;\n    final Address address;\n\n    @ConstructorProperties({\"name\", \"age\", \"hobbies\", \"address\"})\n    PersonConstructorProperties(String name, int age, Set<Hobby> hobbies, Address address) {\n      this.name = name;\n      this.age = age;\n      this.hobbies = hobbies;\n      this.address = address;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof PersonConstructorProperties other)) return false;\n      return name.equals(other.name)\n          && age == other.age\n          && hobbies.equals(other.hobbies)\n          && address.equals(other.address);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(name, age, hobbies, address);\n    }\n  }\n\n  static class Address {\n    final String street;\n    final int zip;\n\n    Address(@Named(\"street\") String street, @Named(\"zip\") int zip) {\n      this.street = street;\n      this.zip = zip;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Address other)) return false;\n      return street.equals(other.street) && zip == other.zip;\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(street, zip);\n    }\n  }\n\n  enum Hobby {\n    SWIMMING,\n    SURFING,\n    READING\n  }\n\n  static class Pair<S, T> {\n    final S first;\n    final T second;\n\n    Pair(@Named(\"first\") S first, @Named(\"second\") T second) {\n      this.first = first;\n      this.second = second;\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Pair<?, ?> other)) return false;\n      return first.equals(other.first) && second.equals(other.second);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(first, second);\n    }\n  }\n\n  static class UpperBounds {\n    final List<? extends Number> numbers;\n\n    UpperBounds(@Named(\"numbers\") List<? extends Number> numbers) {\n      this.numbers = numbers;\n    }\n  }\n\n  static class LowerBounds {\n    final List<? super Integer> numbers;\n\n    LowerBounds(@Named(\"numbers\") List<? super Integer> numbers) {\n      this.numbers = numbers;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PObjectToInnerClassTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.text;\n\nimport org.junit.jupiter.api.Test;\nimport org.pkl.config.java.ConfigEvaluator;\n\npublic class PObjectToInnerClassTest {\n  @SuppressWarnings(\"InnerClassMayBeStatic\")\n  public class InnerConfig {\n    final String text;\n\n    public InnerConfig(@Named(\"text\") String text) {\n      this.text = text;\n    }\n  }\n\n  // verify that a workaround for https://bugs.openjdk.java.net/browse/JDK-8025806 is in place\n  // conversion to inner class is still expected to fail but with the usual `ConversionException`\n  @Test\n  public void attemptToConvertToInnerClassDoesNotFailWithIndexOutOfBoundsException() {\n    try (var evaluator = ConfigEvaluator.preconfigured()) {\n      var config =\n          evaluator.evaluate(\n              text(\n                  \"\"\"\n                  class Inner {\n                    text: String = \"Bar\"\n                  }\n                  inner: Inner\n                  \"\"\"));\n\n      assertThatExceptionOfType(ConversionException.class)\n          .isThrownBy(() -> config.get(\"inner\").as(InnerConfig.class));\n    } catch (Exception e) {\n      throw new RuntimeException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PObjectToPObjectTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.List;\nimport java.util.Map;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.*;\n\npublic class PObjectToPObjectTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PObjectToPObjectTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  private PObject pigeon;\n  private PObject parrot;\n\n  @BeforeEach\n  public void before() {\n    Map<String, Object> pigeonProps = Map.of(\"name\", \"pigeon\", \"age\", 40L);\n    pigeon = new PObject(PClassInfo.Dynamic, pigeonProps);\n\n    Map<String, Object> parrotProps = Map.of(\"name\", \"parrot\", \"age\", 30L);\n    parrot = new PObject(PClassInfo.Dynamic, parrotProps);\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n\n    assertThat(mapper.map(ex1, PObject.class)).isEqualTo(pigeon);\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n    List<PObject> mapped = mapper.map(ex2, Types.listOf(PObject.class));\n\n    assertThat(mapped).containsExactly(pigeon, parrot);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PPairToPairTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.assertj.core.api.Assertions.entry;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.*;\n\npublic class PPairToPairTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PPairToPairTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.getProperty(\"ex1\");\n    Pair<Integer, Duration> mapped = mapper.map(ex1, Types.pairOf(Integer.class, Duration.class));\n    assertThat(mapped).isEqualTo(new Pair<>(1, new Duration(3.0, DurationUnit.SECONDS)));\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.getProperty(\"ex2\");\n    Pair<PObject, PObject> mapped = mapper.map(ex2, Types.pairOf(PObject.class, PObject.class));\n\n    assertThat(mapped.getFirst().getProperties())\n        .containsOnly(entry(\"name\", \"pigeon\"), entry(\"age\", 40L));\n\n    assertThat(mapped.getSecond().getProperties())\n        .containsOnly(entry(\"name\", \"parrot\"), entry(\"age\", 30L));\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PStringToEnumTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport java.util.List;\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class PStringToEnumTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PStringToEnumTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  public enum Hobby {\n    READING,\n    SWIMMING,\n    COUCH_SURFING\n  }\n\n  @Test\n  public void ex1() {\n    assertThat(mapper.map(module.getProperty(\"ex1\"), Hobby.class)).isEqualTo(Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex2() {\n    assertThat(mapper.map(module.getProperty(\"ex2\"), Hobby.class)).isEqualTo(Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex3() {\n    assertThat(mapper.map(module.getProperty(\"ex3\"), Hobby.class)).isEqualTo(Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex4() {\n    assertThat(mapper.map(module.getProperty(\"ex4\"), Hobby.class)).isEqualTo(Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex5() {\n    assertThat(mapper.map(module.getProperty(\"ex5\"), Hobby.class)).isEqualTo(Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex6() {\n    assertThat(mapper.map(module.getProperty(\"ex6\"), Hobby.class)).isEqualTo(Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex7() {\n    List<Hobby> mapped = mapper.map(module.getProperty(\"ex7\"), Types.listOf(Hobby.class));\n\n    assertThat(mapped).containsExactly(Hobby.SWIMMING, Hobby.READING, Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex8() {\n    List<Hobby> mapped = mapper.map(module.getProperty(\"ex8\"), Types.listOf(Hobby.class));\n\n    assertThat(mapped).containsExactly(Hobby.COUCH_SURFING, Hobby.COUCH_SURFING);\n  }\n\n  @Test\n  public void ex9() {\n    var t = catchThrowable(() -> mapper.map(module.getProperty(\"ex9\"), Types.listOf(Hobby.class)));\n\n    assertThat(t)\n        .isInstanceOf(ConversionException.class)\n        .hasMessage(\n            \"Cannot convert String `other` to Enum value \"\n                + \"of type `org.pkl.config.java.mapper.PStringToEnumTest$Hobby`.\");\n  }\n\n  @Test\n  public void ex11() {\n    var unit = mapper.map(module.getProperty(\"ex11\"), DurationUnit.class);\n    assertThat(unit).isEqualTo(DurationUnit.MINUTES);\n  }\n\n  @Test\n  public void ex12() {\n    var unit = mapper.map(module.getProperty(\"ex12\"), DataSizeUnit.class);\n    assertThat(unit).isEqualTo(DataSizeUnit.GIGABYTES);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PStringToVersionTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.assertj.core.api.Assertions.assertThatThrownBy;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\nimport org.pkl.core.Version;\n\npublic class PStringToVersionTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PStringToVersionTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.get(\"ex1\");\n    assert ex1 != null;\n    var mapped = mapper.map(ex1, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3\"));\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.get(\"ex2\");\n    assert ex2 != null;\n    var mapped = mapper.map(ex2, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3-rc.1\"));\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.get(\"ex3\");\n    assert ex3 != null;\n    var mapped = mapper.map(ex3, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3+456.789\"));\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.get(\"ex4\");\n    assert ex4 != null;\n    var mapped = mapper.map(ex4, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3-rc.1+456.789\"));\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.get(\"ex5\");\n    assertThatThrownBy(\n            () -> {\n              assert ex5 != null;\n              mapper.map(ex5, Version.class);\n            })\n        .isInstanceOf(ConversionException.class)\n        .hasCauseInstanceOf(IllegalArgumentException.class);\n  }\n\n  @Test\n  public void ex6() {\n    var ex6 = module.get(\"ex6\");\n    assertThatThrownBy(\n            () -> {\n              assert ex6 != null;\n              mapper.map(ex6, Version.class);\n            })\n        .isInstanceOf(ConversionException.class)\n        .hasCauseInstanceOf(IllegalArgumentException.class);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PVersionToStringTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.assertThat;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.PModule;\n\npublic class PVersionToStringTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PVersionToVersionTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.get(\"ex1\");\n    assert ex1 != null;\n    var mapped = mapper.map(ex1, String.class);\n    assertThat(mapped).isEqualTo(\"1.2.3\");\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.get(\"ex2\");\n    assert ex2 != null;\n    var mapped = mapper.map(ex2, String.class);\n    assertThat(mapped).isEqualTo(\"1.2.3-rc.1\");\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.get(\"ex3\");\n    assert ex3 != null;\n    var mapped = mapper.map(ex3, String.class);\n    assertThat(mapped).isEqualTo(\"1.2.3+456.789\");\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.get(\"ex4\");\n    assert ex4 != null;\n    var mapped = mapper.map(ex4, String.class);\n    assertThat(mapped).isEqualTo(\"1.2.3-rc.1+456.789\");\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.get(\"ex5\");\n    assert ex5 != null;\n    var mapped = mapper.map(ex5, String.class);\n    assertThat(mapped).isEqualTo(\"999999999999999.0.0\");\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PVersionToVersionTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\nimport static org.pkl.core.ModuleSource.modulePath;\n\nimport org.junit.jupiter.api.AfterAll;\nimport org.junit.jupiter.api.Test;\nimport org.pkl.core.*;\n\npublic class PVersionToVersionTest {\n  private static final Evaluator evaluator = Evaluator.preconfigured();\n\n  private static final PModule module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/java/mapper/PVersionToVersionTest.pkl\"));\n\n  private static final ValueMapper mapper = ValueMapperBuilder.preconfigured().build();\n\n  @AfterAll\n  public static void afterAll() {\n    evaluator.close();\n  }\n\n  @Test\n  public void ex1() {\n    var ex1 = module.get(\"ex1\");\n    assert ex1 != null;\n    var mapped = mapper.map(ex1, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3\"));\n  }\n\n  @Test\n  public void ex2() {\n    var ex2 = module.get(\"ex2\");\n    assert ex2 != null;\n    var mapped = mapper.map(ex2, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3-rc.1\"));\n  }\n\n  @Test\n  public void ex3() {\n    var ex3 = module.get(\"ex3\");\n    assert ex3 != null;\n    var mapped = mapper.map(ex3, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3+456.789\"));\n  }\n\n  @Test\n  public void ex4() {\n    var ex4 = module.get(\"ex4\");\n    assert ex4 != null;\n    var mapped = mapper.map(ex4, Version.class);\n    assertThat(mapped).isEqualTo(Version.parse(\"1.2.3-rc.1+456.789\"));\n  }\n\n  @Test\n  public void ex5() {\n    var ex5 = module.get(\"ex5\");\n    assertThatThrownBy(\n            () -> {\n              assert ex5 != null;\n              mapper.map(ex5, Version.class);\n            })\n        .isInstanceOf(ConversionException.class)\n        .hasCauseInstanceOf(ArithmeticException.class);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/Person.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport org.pkl.core.util.Nullable;\n\npublic class Person {\n  public final String name;\n  public final int age;\n\n  public Person(@Named(\"name\") String name, @Named(\"age\") int age) {\n    this.name = name;\n    this.age = age;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Person other)) return false;\n    return name.equals(other.name) && age == other.age;\n  }\n\n  @Override\n  public int hashCode() {\n    return name.hashCode() * 31 + Integer.hashCode(age);\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/PolymorphicTest.kt",
    "content": "/**\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper\n\nimport com.example.Lib\nimport com.example.PolymorphicModuleTest\nimport com.example.PolymorphicModuleTest.Strudel\nimport com.example.PolymorphicModuleTest.TurkishDelight\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.config.java.ConfigEvaluator\nimport org.pkl.core.ModuleSource\n\nclass PolymorphicTest {\n  @Test\n  fun `deserializing polymorphic objects`() {\n    val evaluator = ConfigEvaluator.preconfigured()\n    val module =\n      evaluator\n        .evaluate(ModuleSource.modulePath(\"/codegenPkl/PolymorphicModuleTest.pkl\"))\n        .`as`(PolymorphicModuleTest::class.java)\n    assertThat(module.desserts[0]).isInstanceOf(Strudel::class.java)\n    assertThat(module.desserts[1]).isInstanceOf(TurkishDelight::class.java)\n    assertThat(module.planes[0]).isInstanceOf(Lib.Jet::class.java)\n    assertThat(module.planes[1]).isInstanceOf(Lib.Propeller::class.java)\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/ReflectionTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\n\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport org.junit.jupiter.api.Test;\n\npublic class ReflectionTest {\n  @SuppressWarnings(\"unused\")\n  static class Container<T> {\n    Container(T element) {}\n\n    void setElement(T element) {}\n  }\n\n  static class Person {}\n\n  @Test\n  public void isMissingTypeArguments() {\n    assertThat(\n            Reflection.isMissingTypeArguments(\n                Types.parameterizedType(Container.class, Person.class)))\n        .isFalse();\n    assertThat(Reflection.isMissingTypeArguments(Container.class)).isTrue();\n    assertThat(Reflection.isMissingTypeArguments(Person.class)).isFalse();\n  }\n\n  @Test\n  public void toRawType() {\n    var type = Types.listOf(Person.class);\n\n    assertThat(Reflection.toRawType(type)).isEqualTo(List.class);\n    assertThat(Reflection.toRawType(List.class)).isEqualTo(List.class);\n  }\n\n  @Test\n  public void toWrapperType() {\n    assertThat(Reflection.toWrapperType(float.class)).isEqualTo(Float.class);\n    assertThat(Reflection.toWrapperType(Person.class)).isEqualTo(Person.class);\n  }\n\n  @Test\n  public void getArrayElementType() {\n    assertThat(Reflection.getArrayElementType(int[].class)).isEqualTo(int.class);\n    assertThat(Reflection.getArrayElementType(Person[].class)).isEqualTo(Person.class);\n\n    var containerOfPerson = Types.parameterizedType(Container.class, Person.class);\n    assertThat(Reflection.getArrayElementType(Types.arrayOf(containerOfPerson)))\n        .isEqualTo(containerOfPerson);\n  }\n\n  @Test\n  public void getExactSupertype() {\n    assertThat(\n            Reflection.getExactSupertype(\n                Types.parameterizedType(ArrayList.class, Person.class), Collection.class))\n        .isEqualTo(Types.parameterizedType(Collection.class, Person.class));\n  }\n\n  @Test\n  public void getExactSubtype() {\n    assertThat(\n            Reflection.getExactSubtype(\n                Types.parameterizedType(Collection.class, Person.class), ArrayList.class))\n        .isEqualTo(Types.parameterizedType(ArrayList.class, Person.class));\n  }\n\n  @Test\n  public void getExactParameterTypes() {\n    var type = Types.parameterizedType(Container.class, Person.class);\n\n    var ctor = Container.class.getDeclaredConstructors()[0];\n    assertThat(Reflection.getExactParameterTypes(ctor, type)).isEqualTo(new Type[] {Person.class});\n\n    var method = Container.class.getDeclaredMethods()[0];\n    assertThat(Reflection.getExactParameterTypes(method, type))\n        .isEqualTo(new Type[] {Person.class});\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/java/org/pkl/config/java/mapper/TypesTest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.java.mapper;\n\nimport static org.assertj.core.api.Assertions.*;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.net.URL;\nimport java.util.*;\nimport org.junit.jupiter.api.Test;\n\npublic class TypesTest {\n  @Test\n  public void createParameterizedType() {}\n\n  @Test\n  public void createParameterizedTypeForClassWithoutTypeParameters() {\n    var t = catchThrowable(() -> Types.parameterizedType(String.class));\n\n    assertThat(t)\n        .isInstanceOf(IllegalArgumentException.class)\n        .hasMessage(\n            \"Cannot parameterize `java.lang.String` \"\n                + \"because it does not have any type parameters.\");\n  }\n\n  @Test\n  public void createParameterizedTypeWithWrongNumberOfTypeArguments() {\n    var t =\n        catchThrowable(\n            () -> Types.parameterizedType(Map.class, Integer.class, String.class, URL.class));\n\n    assertThat(t)\n        .isInstanceOf(IllegalArgumentException.class)\n        .hasMessage(\"Expected 2 type arguments for `java.util.Map`, but got 3.\");\n  }\n\n  @Test\n  public void createParameterizedTypeWithPrimitiveTypeArgument() {\n    Throwable t = catchThrowable(() -> Types.parameterizedType(List.class, int.class));\n\n    assertThat(t)\n        .isInstanceOf(IllegalArgumentException.class)\n        .hasMessage(\"`int.class` is not a valid type argument. Did you mean `Integer.class`?\");\n  }\n\n  @SuppressWarnings(\"unused\")\n  static class Foo<T extends Bar> {}\n\n  static class Bar {}\n\n  @Test\n  public void createParameterizedTypeWithIncompatibleTypeArgument() {\n    Throwable t = catchThrowable(() -> Types.parameterizedType(Foo.class, String.class));\n\n    assertThat(t)\n        .isInstanceOf(IllegalArgumentException.class)\n        .hasMessage(\n            \"Type argument `java.lang.String` for type parameter `T` is \"\n                + \"not within bound `org.pkl.config.java.mapper.TypesTest$Bar`.\");\n  }\n\n  @Test\n  public void createPrimitiveArrayType() {\n    assertThat(Types.arrayOf(int.class)).isEqualTo(int[].class);\n  }\n\n  static class Person {}\n\n  @Test\n  public void createObjectArrayType() {\n    assertThat(Types.arrayOf(Person.class)).isEqualTo(Person[].class);\n  }\n\n  @Test\n  public void createIterableType() {\n    ParameterizedType type = Types.iterableOf(Person.class);\n    assertThat(type.getRawType()).isEqualTo(Iterable.class);\n    assertThat(type.getActualTypeArguments()).isEqualTo(new Type[] {Person.class});\n  }\n\n  @Test\n  public void createCollectionType() {\n    ParameterizedType type = Types.collectionOf(Person.class);\n    assertThat(type.getRawType()).isEqualTo(Collection.class);\n    assertThat(type.getActualTypeArguments()).isEqualTo(new Type[] {Person.class});\n  }\n\n  @Test\n  public void createListType() {\n    ParameterizedType type = Types.listOf(Person.class);\n    assertThat(type.getRawType()).isEqualTo(List.class);\n    assertThat(type.getActualTypeArguments()).isEqualTo(new Type[] {Person.class});\n  }\n\n  @Test\n  public void createSetType() {\n    ParameterizedType type = Types.setOf(Person.class);\n    assertThat(type.getRawType()).isEqualTo(Set.class);\n    assertThat(type.getActualTypeArguments()).isEqualTo(new Type[] {Person.class});\n  }\n\n  @Test\n  public void createMapType() {\n    ParameterizedType type = Types.mapOf(String.class, Person.class);\n    assertThat(type.getRawType()).isEqualTo(Map.class);\n    assertThat(type.getActualTypeArguments()).isEqualTo(new Type[] {String.class, Person.class});\n  }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/codegenPkl/OverriddenProperty.pkl",
    "content": "module com.example.OverriddenProperty\n\nabstract class BaseClass {\n  fixed bar: Listing<BaseBar> = new {\n    new {\n      prop1 = \"hello\"\n    }\n  }\n}\n\ntheClass: TheClass\n\nclass TheClass extends BaseClass {\n  fixed bar: Listing<Bar> = new {\n    new {\n      prop1 = \"hello\"\n      prop2 = \"hello again\"\n    }\n  }\n}\n\nopen class BaseBar {\n  prop1: String\n}\n\nclass Bar extends BaseBar {\n  prop2: String\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/codegenPkl/PolymorphicLib.pkl",
    "content": "module com.example.lib\n\nopen class Airplane {\n  name: String\n  numSeats: Int\n}\n\nclass Jet extends Airplane {\n  isSuperSonic: Boolean\n}\n\nclass Propeller extends Airplane {\n  isTurboprop: Boolean\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/codegenPkl/PolymorphicModuleTest.pkl",
    "content": "/// Gets generated into a Java via Gradle task `generateTestConfigClasses`.\nmodule com.example.PolymorphicModuleTest\n\nimport \"PolymorphicLib.pkl\"\n\nabstract class Dessert\n\nclass Strudel extends Dessert {\n  numberOfRolls: Int\n}\n\nclass TurkishDelight extends Dessert {\n  isOfferedToEdmund: Boolean\n}\n\ndesserts: Listing<Dessert> = new {\n  new Strudel { numberOfRolls = 3 }\n  new TurkishDelight { isOfferedToEdmund = true }\n}\n\nplanes: Listing<PolymorphicLib.Airplane> = new {\n  new PolymorphicLib.Jet { name = \"Concorde\"; numSeats = 128; isSuperSonic = true }\n  new PolymorphicLib.Propeller { name = \"Cessna 172\"; numSeats = 4; isTurboprop = true }\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/BytesToByteArrayTest.pkl",
    "content": "ex1 = Bytes()\nex2 = Bytes(1, 2, 3, 4)\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PAnyToOptionalTest.pkl",
    "content": "ex1 = null\nex2 = \"str\"\nex3 = List(1, 2, 3)\n\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PCollectionToArrayTest.pkl",
    "content": "ex1 = List()\nex2 = List(1, 2, 3)\nex3 = Set(1, 2, 3)\nex4 = List(1, 2, 3.3)\nex5 = List(true, false, true)\nex6 = List(new Dynamic { name = \"pigeon\"; age = 40 }, new Dynamic { name = \"parrot\"; age = 30 })\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PCollectionToCollectionTest.pkl",
    "content": "ex1 = List()\nex2 = List(1, 2, 3)\nex3 = Set(1, 2, 3)\nex4 = List(1, 2, 3.3)\nex5 = List(true, false, true)\nex6 = List(new Dynamic { name = \"pigeon\"; age = 40 }, new Dynamic { name = \"parrot\"; age = 30 })\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PMapToMapTest.pkl",
    "content": "ex1 = Map()\nex2 = Map(1, 2, 2, 4, 3, 6)\nex3 = Map(1, 2, 2, 4, 3, 6.6)\nex4 = Map(\"pigeon\", Map(\"name\", \"pigeon\", \"age\", 40), \"parrot\", Map(\"name\", \"parrot\", \"age\", 30))\nex5 = Map(\"pigeon\", new Dynamic { name = \"pigeon\"; age = 40 }, \"parrot\", new Dynamic { name = \"parrot\"; age = 30 })\nex6 = Map(new Dynamic { name = \"pigeon\"; age = 40 }, \"pigeon\", new Dynamic { name = \"parrot\"; age = 30 }, \"parrot\")\nex7 = Map(1, 2, 2, 4)\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PModuleToDataObjectTest.pkl",
    "content": "name = \"pigeon\"\nage = 40\nhobbies = List(\"swimming\", \"surfing\")\naddress {\n  street = \"sesame street\"\n  zip = 94105\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PObjectToDataObjectPolymorphismTest.pkl",
    "content": "module org.pkl.test.PObjectToDataObject\n\nabstract class Thing {\n  isThing: Boolean\n}\n\nclass Person extends Thing {\n  name: String\n}\n\nthing: Thing = new Person {\n  name = \"Bob\"\n  isThing = true\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PObjectToDataObjectTest.pkl",
    "content": "ex1 {\n  name = \"pigeon\"\n  age = 40\n  hobbies = List(\"swimming\", \"surfing\")\n  address {\n    street = \"sesame street\"\n    zip = 94105\n  }\n}\n\nex2 = new Person {\n  name = \"pigeon\"\n  age = 40\n  hobbies = List(\"swimming\", \"surfing\")\n  address {\n    street = \"sesame street\"\n    zip = 94105\n  }\n}\n\nex3 {\n  first = \"foo\"\n  second = 42\n}\n\nex4 {\n  street = \"sesame street\"\n  zipp = 94105 // intentional typo\n}\n\nex5 {\n  numbers = List(1, 2, 3)\n}\n\nclass Person {\n  name: String\n  age: Int\n  hobbies: List<String>\n  address: Address\n}\n\nclass Address {\n  street: String\n  zip: Int\n}\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PObjectToPObjectTest.pkl",
    "content": "ex1 = new { name = \"pigeon\"; age = 40 }\nex2 = List(new Dynamic { name = \"pigeon\"; age = 40 }, new Dynamic { name = \"parrot\"; age = 30 })\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PPairToPairTest.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nex1 = Pair(1, 3.s)\nex2 = Pair(new Person { name = \"pigeon\"; age = 40 }, new Dynamic { name = \"parrot\"; age = 30 })\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PStringToEnumTest.pkl",
    "content": "ex1 = \"couch surfing\"\nex2 = \"couch_surfing\"\nex3 = \"COUCH SURFING\"\nex4 = \"COUCH_SURFING\"\nex5 = \"couchSurfing\"\nex6 = \"couch Surfing\"\nex7 = List(\"swimming\", \"reading\", \"couch surfing\")\nex8 = List(\"couch surfing\", \"COUCH_SURFING\")\nex9 = List(\"couch surfing\", \"other\")\nex10 = \"couchSurfing\"\nex11 = \"min\"\nex12 = \"gb\"\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PStringToVersionTest.pkl",
    "content": "import \"pkl:semver\"\n\nex1 = \"1.2.3\"\nex2 = \"1.2.3-rc.1\"\nex3 = \"1.2.3+456.789\"\nex4 = \"1.2.3-rc.1+456.789\"\nex5 = \"999999999999999.0.0\"\nex6 = \"not a version number\"\n"
  },
  {
    "path": "pkl-config-java/src/test/resources/org/pkl/config/java/mapper/PVersionToVersionTest.pkl",
    "content": "import \"pkl:semver\"\n\nex1 = semver.Version(\"1.2.3\")\nex2 = semver.Version(\"1.2.3-rc.1\")\nex3 = semver.Version(\"1.2.3+456.789\")\nex4 = semver.Version(\"1.2.3-rc.1+456.789\")\nex5 = semver.Version(\"999999999999999.0.0\")\n"
  },
  {
    "path": "pkl-config-kotlin/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=pklCodegenKotlin\ncom.github.ajalt.clikt:clikt-core:5.0.3=pklCodegenKotlin\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=pklCodegenKotlin\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=pklCodegenKotlin\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=pklCodegenKotlin\ncom.github.ajalt.clikt:clikt:5.0.3=pklCodegenKotlin\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=pklCodegenKotlin\ncom.github.ajalt.colormath:colormath:3.6.0=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-core:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=pklCodegenKotlin\ncom.github.ajalt.mordant:mordant:3.0.1=pklCodegenKotlin\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.squareup:kotlinpoet:1.6.0=pklCodegenKotlin\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.leangen.geantyref:geantyref:1.3.16=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=pklCodegenKotlin\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=pklCodegenKotlin,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=pklCodegenKotlin,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=pklCodegenKotlin,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=pklCodegenKotlin,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=pklCodegenKotlin,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=pklCodegenKotlin,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,pklCodegenKotlin,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,pklCodegenKotlin,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,pklCodegenKotlin,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,pklCodegenKotlin,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,pklCodegenKotlin,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=pklCodegenKotlin\norg.jetbrains:markdown:0.7.3=pklCodegenKotlin\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=compileClasspath,pklCodegenKotlin,pklConfigJava,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=pklCodegenKotlin,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=pklCodegenKotlin,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,pklConfigJava,pklConfigJavaAll,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-config-kotlin/pkl-config-kotlin.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n}\n\nval pklConfigJava: Configuration by configurations.creating\n\nval pklConfigJavaAll: Configuration by configurations.creating\n\nval pklCodegenKotlin: Configuration by configurations.creating\n\nval buildInfo = project.extensions.getByType<BuildInfo>()\n\ndependencies {\n  pklCodegenKotlin(projects.pklCodegenKotlin)\n  implementation(libs.kotlinReflect)\n  implementation(libs.msgpack)\n\n  // Don't declare a runtime dependency to pkl-config-java because Gradle cannot resolve\n  // the correct publication (library vs fatJar) when generating the POM.\n  // We add the dependency manually to the POM later.\n  //\n  // Avoids this error during publish:\n  //\n  //  > Failed to query the value of property 'dependencies'.\n  //  > Publishing is not able to resolve a dependency on a project with multiple publications that\n  // have different coordinates.\n  //  Found the following publications in project ':pkl-config-java':\n  //  - Maven publication 'fatJar' with coordinates org.pkl-lang:pkl-config-java-all:0.30.0-SNAPSHOT\n  //  - Maven publication 'library' with coordinates org.pkl-lang:pkl-config-java:0.30.0-SNAPSHOT\n  compileOnly(projects.pklConfigJava)\n  testImplementation(projects.pklConfigJava)\n  testImplementation(libs.geantyref)\n}\n\nval generateTestConfigClasses by\n  tasks.registering(JavaExec::class) {\n    val outputDir = layout.buildDirectory.dir(\"testConfigClasses\")\n    outputs.dir(outputDir)\n    inputs.dir(\"src/test/resources/codegenPkl\")\n\n    classpath = pklCodegenKotlin\n    mainClass.set(\"org.pkl.codegen.kotlin.Main\")\n    argumentProviders.add(\n      CommandLineArgumentProvider {\n        listOf(\"--output-dir\", outputDir.get().asFile.absolutePath) +\n          fileTree(\"src/test/resources/codegenPkl\").map { it.absolutePath }\n      }\n    )\n  }\n\nsourceSets.getByName(\"test\") {\n  java.srcDir(layout.buildDirectory.dir(\"testConfigClasses/kotlin\"))\n  resources.srcDir(layout.buildDirectory.dir(\"testConfigClasses/resources\"))\n}\n\ntasks.processTestResources { dependsOn(generateTestConfigClasses) }\n\ntasks.compileTestKotlin { dependsOn(generateTestConfigClasses) }\n\n// disable publishing of .module until we find a way to manipulate it like POM (or ideally both\n// together)\ntasks.withType<GenerateModuleMetadata> { enabled = false }\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-config-kotlin\")\n        description.set(\n          \"Kotlin extensions for pkl-config-java, a Java config library based on the Pkl config language.\"\n        )\n\n        // Modify POM and add pkl-config-java-all dependency\n        withXml {\n          val dependenciesNode = asNode().get(\"dependencies\") as groovy.util.NodeList\n          val dependencies =\n            if (dependenciesNode.isNotEmpty()) {\n              dependenciesNode[0] as groovy.util.Node\n            } else {\n              asNode().appendNode(\"dependencies\")\n            }\n\n          dependencies.appendNode(\"dependency\").apply {\n            appendNode(\"groupId\", \"org.pkl-lang\")\n            appendNode(\"artifactId\", \"pkl-config-java-all\")\n            appendNode(\"version\", project.version)\n            appendNode(\"scope\", \"runtime\")\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin/ConfigExtensions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin\n\nimport org.pkl.config.java.Config\nimport org.pkl.config.java.ConfigEvaluator\nimport org.pkl.config.java.ConfigEvaluatorBuilder\nimport org.pkl.config.java.JavaType\nimport org.pkl.config.java.mapper.ConversionException\nimport org.pkl.config.java.mapper.ValueMapperBuilder\nimport org.pkl.config.kotlin.mapper.KotlinConversions\nimport org.pkl.config.kotlin.mapper.KotlinConverterFactories\n\n/**\n * Converts this [Config] node to type [T] using the configured\n * [org.pkl.config.java.mapper.ValueMapper].\n *\n * To allow `null` values, specify a nullable type, for example `to<String?>()`.\n *\n * Kotlin code should prefer this method over [Config. as] for the following reasons:\n * * does not clash with Kotlin's `as` keyword\n * * throws [ConversionException] if conversion to non-nullable type returns `null`\n * * easier to use with parameterized types: `to<List<String>>()` vs.\n *   `as(JavaType.listOf(String::class.java))`\n */\ninline fun <reified T> Config.to(): T {\n  val javaType = object : JavaType<T>() {}\n  // `as T?` may no longer be required after switching to JSpecify\n  val result = `as`<T>(javaType.type) as T?\n  if (result == null && null !is T) {\n    throw ConversionException(\n      \"Expected a non-null value but got `null`. \" +\n        \"To allow null values, convert to a nullable Kotlin type, for example `String?`.\"\n    )\n  }\n  return result as T\n}\n\n/**\n * Configures this [ValueMapperBuilder] with conversions and converter factories for Kotlin types.\n */\nfun ValueMapperBuilder.forKotlin(): ValueMapperBuilder =\n  addConversions(KotlinConversions.all).addConverterFactories(KotlinConverterFactories.all)\n\n/**\n * Configures this [ConfigEvaluatorBuilder] with conversions and converter factories for Kotlin\n * types.\n */\nfun ConfigEvaluatorBuilder.forKotlin(): ConfigEvaluatorBuilder =\n  setValueMapperBuilder(valueMapperBuilder.forKotlin())\n\nfun ConfigEvaluator.forKotlin(): ConfigEvaluator =\n  setValueMapper(valueMapper.toBuilder().forKotlin().build())\n"
  },
  {
    "path": "pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin/mapper/KotlinConversions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport java.util.*\nimport java.util.regex.Pattern\nimport org.pkl.config.java.mapper.Conversion\nimport org.pkl.config.java.mapper.ConversionException\nimport org.pkl.core.PClassInfo\n\nobject KotlinConversions {\n  val pIntToULong: Conversion<Long, ULong> =\n    Conversion.of(PClassInfo.Int, ULong::class.java) { value, _ ->\n      if (value < 0) {\n        throw ConversionException(\n          \"Cannot convert pkl.base#Int `$value` to kotlin.ULong \" +\n            // use Long.MAX_VALUE instead of ULong.MAX_VALUE\n            \"because it is outside range `0...${Long.MAX_VALUE}`\"\n        )\n      }\n      value.toULong()\n    }\n\n  val pIntToUInt: Conversion<Long, UInt> =\n    Conversion.of(PClassInfo.Int, UInt::class.java) { value, _ ->\n      val max = 0xFFFFFFFF // use literal instead of `UInt.MAX_VALUE.toLong()`\n      if (value < 0 || value > max) {\n        throw ConversionException(\n          \"Cannot convert pkl.base#Int `$value` to kotlin.UInt \" +\n            \"because it is outside range `0...$max`\"\n        )\n      }\n      value.toUInt()\n    }\n\n  val pIntToUShort: Conversion<Long, UShort> =\n    Conversion.of(PClassInfo.Int, UShort::class.java) { value, _ ->\n      val max = 0xFFFF // use literal instead of `UShort.MAX_VALUE.toLong()`\n      if (value < 0 || value > max) {\n        throw ConversionException(\n          \"Cannot convert pkl.base#Int `$value` to kotlin.UShort \" +\n            \"because it is outside range `0...$max`\"\n        )\n      }\n      value.toUShort()\n    }\n\n  val pIntToUByte: Conversion<Long, UByte> =\n    Conversion.of(PClassInfo.Int, UByte::class.java) { value, _ ->\n      val max = 0xFF // use literal instead of `UByte.MAX_VALUE.toLong()`\n      if (value < 0 || value > max) {\n        throw ConversionException(\n          \"Cannot convert pkl.base#Int `$value` to kotlin.UByte \" +\n            \"because it is outside range `0...$max`\"\n        )\n      }\n      value.toUByte()\n    }\n\n  val pStringToKotlinRegex: Conversion<String, Regex> =\n    Conversion.of(PClassInfo.String, Regex::class.java) { value, _ -> Regex(value) }\n\n  val pRegexToKotlinRegex: Conversion<Pattern, Regex> =\n    Conversion.of(PClassInfo.Regex, Regex::class.java) { value, _ -> value.toRegex() }\n\n  val all: Collection<Conversion<*, *>> =\n    Collections.unmodifiableList(\n      listOf(\n        pIntToULong,\n        pIntToUInt,\n        pIntToUShort,\n        pIntToUByte,\n        pStringToKotlinRegex,\n        pRegexToKotlinRegex,\n      )\n    )\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin/mapper/KotlinConverterFactories.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport java.lang.reflect.Constructor\nimport java.util.*\nimport kotlin.reflect.full.primaryConstructor\nimport kotlin.reflect.jvm.javaConstructor\nimport kotlin.reflect.jvm.kotlinFunction\nimport org.pkl.config.java.mapper.ConverterFactories\nimport org.pkl.config.java.mapper.ConverterFactory\nimport org.pkl.config.java.mapper.Named\nimport org.pkl.config.java.mapper.PObjectToDataObject\n\n/** [ConverterFactory]s for use with Kotlin. */\nobject KotlinConverterFactories {\n  /**\n   * Variation of [ConverterFactories.pObjectToDataObject] for Kotlin objects. Uses the primary\n   * constructor of the Kotlin target class. Constructor parameters do *not* need to be annotated\n   * with [Named]. Supports both regular Kotlin classes and Kotlin data classes.\n   */\n  val pObjectToDataObject: ConverterFactory =\n    object : PObjectToDataObject() {\n      override fun selectConstructor(clazz: Class<*>): Optional<Constructor<*>> =\n        Optional.ofNullable(clazz.kotlin.primaryConstructor?.javaConstructor)\n\n      override fun getParameterNames(constructor: Constructor<*>): Optional<List<String>> {\n        val params = constructor.kotlinFunction?.parameters\n        val paramNames = params?.mapNotNull { it.name }\n        return Optional.ofNullable(paramNames?.takeIf { it.size == params.size })\n      }\n    }\n\n  val pPairToKotlinPair: ConverterFactory = PPairToKotlinPair()\n\n  val all: Collection<ConverterFactory> =\n    Collections.unmodifiableList(listOf(pObjectToDataObject, pPairToKotlinPair))\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/main/kotlin/org/pkl/config/kotlin/mapper/PPairToKotlinPair.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport java.lang.reflect.ParameterizedType\nimport java.lang.reflect.Type\nimport java.util.*\nimport kotlin.Any\nimport kotlin.Pair\nimport org.pkl.config.java.mapper.Converter\nimport org.pkl.config.java.mapper.ConverterFactory\nimport org.pkl.config.java.mapper.Reflection\nimport org.pkl.config.java.mapper.ValueMapper\nimport org.pkl.core.PClassInfo\nimport org.pkl.core.Pair as PPair\n\ninternal class PPairToKotlinPair : ConverterFactory {\n  override fun create(sourceType: PClassInfo<*>, targetType: Type): Optional<Converter<*, *>> {\n    if (sourceType !== PClassInfo.Pair) return Optional.empty()\n\n    val targetClass = Reflection.toRawType(targetType)\n    if (!Pair::class.java.isAssignableFrom(targetClass)) {\n      return Optional.empty()\n    }\n\n    val pairType = Reflection.getExactSupertype(targetType, Pair::class.java) as ParameterizedType\n    return Optional.of(\n      ConverterImpl<Any, Any>(pairType.actualTypeArguments[0], pairType.actualTypeArguments[1])\n    )\n  }\n\n  private class ConverterImpl<F, S>(\n    private val firstTargetType: Type,\n    private val secondTargetType: Type,\n  ) : Converter<PPair<Any, Any>, Pair<F, S>> {\n\n    private var firstCachedType = PClassInfo.Unavailable\n    private var firstCachedConverter: Converter<Any, F>? = null\n\n    private var secondCachedType = PClassInfo.Unavailable\n    private var secondCachedConverter: Converter<Any, S>? = null\n\n    override fun convert(value: PPair<Any, Any>, valueMapper: ValueMapper): Pair<F, S> {\n      val first = value.first\n      if (!firstCachedType.isExactClassOf(first)) {\n        firstCachedType = PClassInfo.forValue(first)\n        firstCachedConverter = valueMapper.getConverter(firstCachedType, firstTargetType)\n      }\n\n      val second = value.second\n      if (!secondCachedType.isExactClassOf(second)) {\n        secondCachedType = PClassInfo.forValue(second)\n        secondCachedConverter = valueMapper.getConverter(secondCachedType, secondTargetType)\n      }\n\n      return Pair(\n        firstCachedConverter!!.convert(first, valueMapper),\n        secondCachedConverter!!.convert(second, valueMapper),\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/java/org/pkl/config/kotlin/JavaPerson.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin;\n\nimport java.util.List;\nimport org.pkl.config.java.mapper.Named;\n\npublic class JavaPerson {\n  private final String name;\n  private final int age;\n  private final List<String> hobbies;\n\n  public JavaPerson(@Named(\"name\") String name) {\n    this.name = name;\n    age = 0;\n    hobbies = List.of();\n  }\n\n  public JavaPerson(\n      @Named(\"name\") String name, @Named(\"age\") int age, @Named(\"hobbies\") List<String> hobbies) {\n    this.name = name;\n    this.age = age;\n    this.hobbies = hobbies;\n  }\n\n  public JavaPerson(@Named(\"age\") int age) {\n    this.age = age;\n    name = \"Default\";\n    hobbies = List.of();\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public int getAge() {\n    return age;\n  }\n\n  public List<String> getHobbies() {\n    return hobbies;\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin/ConfigExtensionsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.config.java.ConfigEvaluator\nimport org.pkl.config.java.ConfigEvaluatorBuilder\nimport org.pkl.config.java.mapper.ConversionException\nimport org.pkl.config.kotlin.ConfigExtensionsTest.Hobby.READING\nimport org.pkl.config.kotlin.ConfigExtensionsTest.Hobby.SWIMMING\nimport org.pkl.core.ModuleSource.text\n\nclass ConfigExtensionsTest {\n  private val evaluator = ConfigEvaluator.preconfigured().forKotlin()\n\n  @Test\n  fun `convert to kotlin classes`() {\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"\n        pigeon {\n          name = \"pigeon\"\n          age = 30\n          hobbies = List(\"swimming\", \"reading\")\n          address {\n            street = \"Fuzzy St.\"\n          }\n        }\n        \"\"\"\n        )\n      )\n\n    val address = config[\"pigeon\"][\"address\"].to<Address<String>>()\n    assertThat(address.street).isEqualTo(\"Fuzzy St.\")\n\n    val pigeon = config[\"pigeon\"].to<Person<String>>()\n    assertThat(pigeon).isNotNull\n    assertThat(pigeon.name).isEqualTo(\"pigeon\")\n    assertThat(pigeon.age).isEqualTo(30)\n    assertThat(pigeon.hobbies).isEqualTo(setOf(READING, SWIMMING))\n    assertThat(pigeon.address.street).isEqualTo(\"Fuzzy St.\")\n  }\n\n  @Test\n  fun `convert to kotlin class with nullable property`() {\n    // cover ConfigEvaluatorBuilder.preconfigured()\n    val evaluator = ConfigEvaluatorBuilder.preconfigured().forKotlin().build()\n\n    val config = evaluator.evaluate(text(\"pigeon { address = null }\"))\n\n    val pigeon = config[\"pigeon\"].to<Person2>()\n    assertThat(pigeon.address).isNull()\n  }\n\n  @Test\n  fun `convert to kotlin class with covariant collection property type`() {\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"pigeon { addresses = List(new Dynamic { street = \"Fuzzy St.\" }, new Dynamic { street = \"Other St.\" }) }\"\"\"\n        )\n      )\n\n    config[\"pigeon\"].to<Person3>()\n  }\n\n  @Test\n  fun `convert to nullable type`() {\n    val config =\n      evaluator.evaluate(text(\"\"\"pigeon { address1 { street = \"Fuzzy St.\" }; address2 = null }\"\"\"))\n\n    val address1 = config[\"pigeon\"][\"address1\"].to<Address<String>?>()\n    assertThat(address1).isEqualTo(Address(street = \"Fuzzy St.\"))\n\n    val address2 = config[\"pigeon\"][\"address2\"].to<Address<String>?>()\n    assertThat(address2).isNull()\n\n    val e = assertThrows<ConversionException> { config[\"pigeon\"][\"address2\"].to<Address<String>>() }\n    assertThat(e)\n      .hasMessage(\n        \"Expected a non-null value but got `null`. \" +\n          \"To allow null values, convert to a nullable Kotlin type, for example `String?`.\"\n      )\n  }\n\n  @Test\n  fun `convert to kotlin class that has defaults for constructor args`() {\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"\n        pigeon {\n          name = \"Pigeon\"\n          age = 42\n          hobbies = List()\n        }\n        \"\"\"\n        )\n      )\n\n    val pigeon = config[\"pigeon\"].to<PersonWithDefaults>()\n    assertThat(pigeon.name).isEqualTo(\"Pigeon\")\n    assertThat(pigeon.age).isEqualTo(42)\n    assertThat(pigeon.hobbies).isEqualTo(listOf<String>())\n  }\n\n  // check that java converter factory still kicks in\n  @Test\n  fun `convert to java class with multiple constructors`() {\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"\n        pigeon {\n          name = \"Pigeon\"\n          age = 42\n          hobbies = List()\n        }\n        \"\"\"\n        )\n      )\n\n    val pigeon = config[\"pigeon\"].to<JavaPerson>()\n    assertThat(pigeon.name).isEqualTo(\"Pigeon\")\n    assertThat(pigeon.age).isEqualTo(42)\n    assertThat(pigeon.hobbies).isEqualTo(listOf<String>())\n  }\n\n  @Test\n  fun `convert list to parameterized list`() {\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"friends = List(new Dynamic { name = \"lilly\"}, new Dynamic {name = \"bob\"}, new Dynamic {name = \"susan\"})\"\"\"\n        )\n      )\n\n    val friends = config[\"friends\"].to<List<SimplePerson>>()\n    assertThat(friends)\n      .isEqualTo(listOf(SimplePerson(\"lilly\"), SimplePerson(\"bob\"), SimplePerson(\"susan\")))\n  }\n\n  @Test\n  fun `convert map to parameterized map`() {\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"friends = Map(\"l\", new Dynamic { name = \"lilly\"}, \"b\", new Dynamic { name = \"bob\"}, \"s\", new Dynamic { name = \"susan\"})\"\"\"\n        )\n      )\n\n    val friends = config[\"friends\"].to<Map<String, SimplePerson>>()\n    assertThat(friends)\n      .isEqualTo(\n        mapOf(\n          \"l\" to SimplePerson(\"lilly\"),\n          \"b\" to SimplePerson(\"bob\"),\n          \"s\" to SimplePerson(\"susan\"),\n        )\n      )\n  }\n\n  @Test\n  fun `convert container to parameterized map`() {\n    val config =\n      evaluator.evaluate(\n        text(\"\"\"friends {l { name = \"lilly\"}; b { name = \"bob\"}; s { name = \"susan\"}}\"\"\")\n      )\n\n    val friends = config[\"friends\"].to<Map<String, SimplePerson>>()\n    assertThat(friends)\n      .isEqualTo(\n        mapOf(\n          \"l\" to SimplePerson(\"lilly\"),\n          \"b\" to SimplePerson(\"bob\"),\n          \"s\" to SimplePerson(\"susan\"),\n        )\n      )\n  }\n\n  @Test\n  fun `convert enum with mangled names`() {\n    val values = MangledNameEnum.entries.map { \"\\\"$it\\\"\" }\n    val config =\n      evaluator.evaluate(\n        text(\n          \"\"\"\n      typealias MangledNameEnum = ${values.joinToString(\" | \")}\n      allEnumValues: Set<MangledNameEnum> = Set(${values.joinToString(\", \")})\n      \"\"\"\n            .trimIndent()\n        )\n      )\n    val allEnumValues = config[\"allEnumValues\"].to<Set<MangledNameEnum>>()\n    assertThat(allEnumValues).isEqualTo(MangledNameEnum.entries.toSet())\n  }\n\n  data class SimplePerson(val name: String)\n\n  class Person<T>(val name: String, val age: Int, val hobbies: Set<Hobby>, val address: Address<T>)\n\n  enum class Hobby {\n    SWIMMING,\n    @Suppress(\"unused\") SURFING,\n    READING,\n  }\n\n  data class Address<out T>(val street: T)\n\n  class Person2(val address: Address<String>?)\n\n  class Person3(@Suppress(\"unused\") val addresses: List<OpenAddress>)\n\n  open class OpenAddress(val street: String) {\n    override fun equals(other: Any?): Boolean {\n      return other is OpenAddress && street == other.street\n    }\n\n    override fun hashCode(): Int {\n      return street.hashCode()\n    }\n  }\n\n  class PersonWithDefaults(\n    val name: String = \"Pigeon\",\n    val age: Int = 42,\n    val hobbies: List<String>,\n  )\n\n  @Suppress(\"NonAsciiCharacters\", \"EnumEntryName\")\n  enum class MangledNameEnum(val value: String) {\n    FROM_CAMEL_CASE(\"fromCamelCase\"),\n    HYPHENATED_NAME(\"hyphenated-name\"),\n    EN_QUAD_EM_SPACE_IDEOGRAPHIC_SPACE_(\"EnQuad\\\\u2000EmSpace\\\\u2003IdeographicSpace\\\\u3000\"),\n    ᾊ_ᾨ(\"ᾊ\\u0ABFᾨ\"),\n    _42_FROM_INVALID_START(\"42-from-invalid-start\"),\n    __EMOJI__(\"❎Emoji✅✅\"),\n    ÀŒÜ(\"àœü\"),\n    日本_つくば(\"日本-つくば\"),\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin/KotlinObjectMappingTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.pkl.config.java.ConfigEvaluator\nimport org.pkl.core.ModuleSource.text\n\nclass KotlinObjectMappingTest {\n  data class TypedKey(val value: Int)\n\n  data class KotlinGenericTypesTest(\n    // Sets\n    val stringSet: Set<String>,\n    val intSet: Set<Int>,\n    val booleanSetSet: Set<Set<Boolean>>,\n\n    // Lists\n    val stringList: List<String>,\n    val intList: List<Int>,\n    val booleanListList: List<List<Boolean>>,\n\n    // Maps\n    val intStringMap: Map<Int, String>,\n    val booleanIntStringMapMap: Map<Boolean, Map<Int, String>>,\n    val booleanIntMapStringMap: Map<Map<Boolean, Int>, String>,\n    val intSetListStringMap: Map<List<Set<Int>>, String>,\n    val typedStringMap: Map<TypedKey, String>,\n    val dynamicStringMap: Map<Map<String, Any>, String>,\n\n    // Listings\n    val stringSetListing: List<Set<String>>,\n    val intListingListing: List<List<Int>>,\n\n    // Mapping\n    val intStringMapping: Map<Int, String>,\n    val stringStringSetMapping: Map<String, Set<String>>,\n\n    // Map & Mapping with structured keys\n    val intListingStringMapping: Map<List<Int>, String>,\n    val intSetListStringMapping: Map<List<Set<Int>>, String>,\n    val thisOneGoesToEleven: Map<List<Set<Int>>, Map<List<Int>, Map<Int, String>>>,\n  )\n\n  @Test\n  fun `generic types correspond`() {\n    val code =\n      \"\"\"\n      module KotlinGenericTypesTest\n      \n      class Foo {\n        value: Int\n      }\n      \n      // Sets\n      stringSet: Set<String> = Set(\"in set\")\n      intSet: Set<Int> = Set(1,2,4,8,16,32)\n      booleanSetSet: Set<Set<Boolean>> = Set(Set(false), Set(true), Set(true, false))\n      \n      // Lists\n      stringList: List<String> = List(\"in list\")\n      intList: List<Int> = List(1,2,3,5,7,11)\n      booleanListList: List<List<Boolean>> = List(List(false), List(true), List(true, false))\n      \n      // Maps\n      intStringMap: Map<Int, String> = Map(0, \"in map\")\n      booleanIntStringMapMap: Map<Boolean, Map<Int, String>> = Map(false, Map(0, \"in map in map\"))\n      booleanIntMapStringMap: Map<Map<Boolean, Int>, String> = Map(Map(true, 42), \"in map with map keys\")\n      \n      // Listings\n      stringSetListing: Listing<Set<String>> = new { Set(\"in set in listing\") }\n      intListingListing: Listing<Listing<Int>> = new { new { 1337 } new { 100 } }\n      \n      // Mappings\n      intStringMapping: Mapping<Int, String> = new { [42] = \"in map\" }\n      stringStringSetMapping: Mapping<String, Set<String>> = new { [\"key\"] = Set(\"in set in map\") }\n      \n      // Map & Mappings with structured keys\n      intSetListStringMap: Map<List<Set<Int>>, String> = Map(List(Set(27)), \"in map with structured key\")\n      typedStringMap: Map<Foo, String> = Map(\n        new Foo { value = 1 }, \"using typed objects\",\n        new Foo { value = 2 }, \"also works\")\n      dynamicStringMap: Map<Dynamic, String> = Map(\n        new Dynamic { value = 42 }, \"using Dynamics\",\n        new Dynamic { hello = \"world\" }, \"also works\")\n      \n      intListingStringMapping: Mapping<Listing<Int>, String> = new {\n        [new Listing { 42 1337 }] = \"structured key works\"\n      }\n      intSetListStringMapping: Mapping<List<Set<Int>>, String> = new {\n        [List(Set(27))] = \"in mapping with structured key\"\n      }\n      local intListing: Listing<Int> = new { 0 0 7 }\n      thisOneGoesToEleven: Mapping<List<Set<Int>>, Map<Listing<Int>, Mapping<Int, String>>> = new {\n        [List(Set(0), Set(0), Set(7))] = Map(intListing, intStringMapping)\n      }\n    \"\"\"\n        .trimIndent()\n    val result = ConfigEvaluator.preconfigured().forKotlin().evaluate(text(code))\n    assertDoesNotThrow { result.to<KotlinGenericTypesTest>() }\n      .apply {\n        assertThat(typedStringMap.keys).isEqualTo(setOf(TypedKey(1), TypedKey(2)))\n        assertThat(dynamicStringMap.keys)\n          .isEqualTo(setOf(hashMapOf(\"hello\" to \"world\"), hashMapOf(\"value\" to 42.toLong())))\n      }\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin/mapper/KotlinConversionsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport java.util.regex.Pattern\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.config.java.mapper.ConversionException\nimport org.pkl.config.java.mapper.ValueMapperBuilder\n\nclass KotlinConversionsTest {\n  private val mapper = ValueMapperBuilder.unconfigured().build()\n\n  @Test\n  fun pStringToKotlinRegex() {\n    val result = KotlinConversions.pStringToKotlinRegex.converter.convert(\"(?i)\\\\w*\", mapper)\n    assertThat(result.pattern).isEqualTo(\"(?i)\\\\w*\")\n    assertThat(result.options).isEqualTo(setOf(RegexOption.IGNORE_CASE))\n  }\n\n  @Test\n  fun pRegexToKotlinRegex() {\n    val result =\n      KotlinConversions.pRegexToKotlinRegex.converter.convert(Pattern.compile(\"(?i)\\\\w*\"), mapper)\n    assertThat(result.pattern).isEqualTo(\"(?i)\\\\w*\")\n    assertThat(result.options).isEqualTo(setOf(RegexOption.IGNORE_CASE))\n  }\n\n  @Test\n  fun pIntToULong() {\n    assertThat(KotlinConversions.pIntToULong.converter.convert(0L, mapper)).isEqualTo(0UL)\n\n    assertThat(KotlinConversions.pIntToULong.converter.convert(Long.MAX_VALUE, mapper))\n      .isEqualTo(Long.MAX_VALUE.toULong())\n\n    assertThrows<ConversionException> {\n      KotlinConversions.pIntToULong.converter.convert(-1L, mapper)\n    }\n  }\n\n  @Test\n  fun pIntToUInt() {\n    assertThat(KotlinConversions.pIntToUInt.converter.convert(0L, mapper)).isEqualTo(0u)\n\n    assertThat(KotlinConversions.pIntToUInt.converter.convert(UInt.MAX_VALUE.toLong(), mapper))\n      .isEqualTo(UInt.MAX_VALUE)\n\n    assertThrows<ConversionException> {\n      KotlinConversions.pIntToUInt.converter.convert(UInt.MAX_VALUE.toLong() + 1, mapper)\n    }\n\n    assertThrows<ConversionException> {\n      KotlinConversions.pIntToUInt.converter.convert(-1L, mapper)\n    }\n  }\n\n  @Test\n  fun pIntToUShort() {\n    assertThat(KotlinConversions.pIntToUShort.converter.convert(0L, mapper)).isEqualTo(0.toUShort())\n\n    assertThat(KotlinConversions.pIntToUShort.converter.convert(UShort.MAX_VALUE.toLong(), mapper))\n      .isEqualTo(UShort.MAX_VALUE)\n\n    assertThrows<ConversionException> {\n      KotlinConversions.pIntToUShort.converter.convert(UShort.MAX_VALUE.toLong() + 1, mapper)\n    }\n\n    assertThrows<ConversionException> {\n      KotlinConversions.pIntToUShort.converter.convert(-1L, mapper)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin/mapper/OverriddenPropertyTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport com.example.OverriddenProperty\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.config.java.ConfigEvaluatorBuilder\nimport org.pkl.config.kotlin.forKotlin\nimport org.pkl.config.kotlin.to\nimport org.pkl.core.ModuleSource\n\nclass OverriddenPropertyTest {\n  @Test\n  fun `overridden property`() {\n    ConfigEvaluatorBuilder.preconfigured().forKotlin().build().use { evaluator ->\n      val config = evaluator.evaluate(ModuleSource.modulePath(\"/codegenPkl/OverriddenProperty.pkl\"))\n      val module = config.to<OverriddenProperty>()\n      assertThat(module.theClass.bar[0].prop1).isEqualTo(\"hello\")\n      assertThat(module.theClass.bar[0].prop2).isEqualTo(\"hello again\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin/mapper/PPairToKotlinPairTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport kotlin.Pair\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.entry\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.pkl.config.java.mapper.Types\nimport org.pkl.config.java.mapper.ValueMapperBuilder\nimport org.pkl.config.kotlin.forKotlin\nimport org.pkl.core.*\nimport org.pkl.core.ModuleSource.modulePath\n\nclass PPairToKotlinPairTest {\n  companion object {\n    private val evaluator = Evaluator.preconfigured()\n\n    private val module =\n      evaluator.evaluate(modulePath(\"org/pkl/config/kotlin/mapper/PPairToKotlinPairTest.pkl\"))\n\n    private val mapper = ValueMapperBuilder.preconfigured().forKotlin().build()\n\n    @AfterAll\n    @Suppress(\"unused\")\n    @JvmStatic\n    fun afterAll() {\n      evaluator.close()\n    }\n  }\n\n  @Test\n  fun ex1() {\n    val ex1 = module.getProperty(\"ex1\")\n    val mapped: Pair<Int, Duration> =\n      mapper.map(\n        ex1,\n        Types.parameterizedType(Pair::class.java, Integer::class.java, Duration::class.java),\n      )\n    assertThat(mapped).isEqualTo(Pair(1, Duration(3.0, DurationUnit.SECONDS)))\n  }\n\n  @Test\n  fun ex2() {\n    val ex2 = module.getProperty(\"ex2\")\n    val mapped: Pair<PObject, PObject> =\n      mapper.map(\n        ex2,\n        Types.parameterizedType(Pair::class.java, PObject::class.java, PObject::class.java),\n      )\n\n    assertThat(mapped.first.properties).containsOnly(entry(\"name\", \"pigeon\"), entry(\"age\", 40L))\n\n    assertThat(mapped.second.properties).containsOnly(entry(\"name\", \"parrot\"), entry(\"age\", 30L))\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/kotlin/org/pkl/config/kotlin/mapper/PolymorphicTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.config.kotlin.mapper\n\nimport com.example.PolymorphicLib\nimport com.example.PolymorphicModuleTest\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.config.java.ConfigEvaluatorBuilder\nimport org.pkl.config.kotlin.forKotlin\nimport org.pkl.config.kotlin.to\nimport org.pkl.core.ModuleSource.modulePath\n\nclass PolymorphicTest {\n  @Test\n  fun `deserializing polymorphic objects`() {\n    val evaluator = ConfigEvaluatorBuilder.preconfigured().forKotlin().build()\n    val config = evaluator.evaluate(modulePath(\"/codegenPkl/PolymorphicModuleTest.pkl\"))\n    val module = config.to<PolymorphicModuleTest>()\n    assertThat(module.desserts[0]).isInstanceOf(PolymorphicModuleTest.Strudel::class.java)\n    assertThat(module.desserts[1]).isInstanceOf(PolymorphicModuleTest.TurkishDelight::class.java)\n    assertThat(module.planes[0]).isInstanceOf(PolymorphicLib.Jet::class.java)\n    assertThat(module.planes[1]).isInstanceOf(PolymorphicLib.Propeller::class.java)\n  }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/resources/codegenPkl/OverriddenProperty.pkl",
    "content": "module com.example.OverriddenProperty\n\nabstract class BaseClass {\n  fixed bar: Listing<BaseBar> = new {\n    new {\n      prop1 = \"hello\"\n    }\n  }\n}\n\ntheClass: TheClass\n\nclass TheClass extends BaseClass {\n  fixed bar: Listing<Bar> = new {\n    new {\n      prop1 = \"hello\"\n      prop2 = \"hello again\"\n    }\n  }\n}\n\nopen class BaseBar {\n  prop1: String\n}\n\nclass Bar extends BaseBar {\n  prop2: String\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/resources/codegenPkl/PolymorphicLib.pkl",
    "content": "module com.example.PolymorphicLib\n\nopen class Airplane {\n  name: String\n  numSeats: Int\n}\n\nclass Jet extends Airplane {\n  isSuperSonic: Boolean\n}\n\nclass Propeller extends Airplane {\n  isTurboprop: Boolean\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/resources/codegenPkl/PolymorphicModuleTest.pkl",
    "content": "/// Gets generated into a Kotlin via Gradle task `generateTestConfigClasses`.\nmodule com.example.PolymorphicModuleTest\n\nimport \"PolymorphicLib.pkl\"\n\nabstract class Dessert\n\nclass Strudel extends Dessert {\n  numberOfRolls: Int\n}\n\nclass TurkishDelight extends Dessert {\n  isOfferedToEdmund: Boolean\n}\n\ndesserts: Listing<Dessert> = new {\n  new Strudel { numberOfRolls = 3 }\n  new TurkishDelight { isOfferedToEdmund = true }\n}\n\nplanes: Listing<PolymorphicLib.Airplane> = new {\n  new PolymorphicLib.Jet { name = \"Concorde\"; numSeats = 128; isSuperSonic = true }\n  new PolymorphicLib.Propeller { name = \"Cessna 172\"; numSeats = 4; isTurboprop = true }\n}\n"
  },
  {
    "path": "pkl-config-kotlin/src/test/resources/org/pkl/config/kotlin/mapper/PPairToKotlinPairTest.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nex1 = Pair(1, 3.s)\nex2 = Pair(new Person {name = \"pigeon\"; age = 40}, new Dynamic {name = \"parrot\"; age = 30})\n"
  },
  {
    "path": "pkl-core/README.adoc",
    "content": "Core implementation of the Pkl language. Includes Java APIs for embedding the\nlanguage into JVM applications, and for building libraries and tools on top of\nthe language.\n"
  },
  {
    "path": "pkl-core/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.code.findbugs:jsr305:3.0.2=compileClasspath,compileOnlyDependenciesMetadata\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.palantir.javapoet:javapoet:0.7.0=generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=compileClasspath,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=compileClasspath,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=compileClasspath,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=compileClasspath,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=compileClasspath,generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.truffle:truffle-dsl-processor:25.0.0=annotationProcessor\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=generatorCompileClasspath,generatorImplementationDependenciesMetadata,generatorRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=generatorCompileClasspath,generatorRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathGenerator,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=apiDependenciesMetadata,generatorAnnotationProcessor,generatorApiDependenciesMetadata,generatorCompileOnlyDependenciesMetadata,generatorIntransitiveDependenciesMetadata,generatorKotlinScriptDefExtensions,intransitiveDependenciesMetadata,javaExecutable,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-core/pkl-core.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport org.apache.tools.ant.filters.ReplaceTokens\n\nplugins {\n  kotlin(\"jvm\") // for `src/generator/kotlin`\n  pklAllProjects\n  pklJavaLibrary\n  pklPublishLibrary\n  pklNativeLifecycle\n  idea\n}\n\nval generatorSourceSet = sourceSets.register(\"generator\")\n\nidea {\n  module {\n    // mark generated/truffle as generated source dir\n    sourceDirs = sourceDirs + files(\"generated/truffle\")\n    generatedSourceDirs = generatedSourceDirs + files(\"generated/truffle\")\n  }\n}\n\nval javaExecutableConfiguration: Configuration = configurations.create(\"javaExecutable\")\n\ndependencies {\n  annotationProcessor(libs.truffleDslProcessor)\n  annotationProcessor(generatorSourceSet.get().runtimeClasspath)\n\n  compileOnly(libs.jsr305)\n  // pkl-core implements pkl-executor's ExecutorSpi, but the SPI doesn't ship with pkl-core\n  compileOnly(projects.pklExecutor)\n\n  implementation(projects.pklParser)\n  implementation(libs.msgpack)\n  implementation(libs.truffleApi)\n  implementation(libs.graalSdk)\n\n  implementation(libs.paguro) { exclude(group = \"org.jetbrains\", module = \"annotations\") }\n\n  implementation(libs.snakeYaml)\n\n  testImplementation(projects.pklCommonsTest)\n\n  add(\"generatorImplementation\", libs.javaPoet)\n  add(\"generatorImplementation\", libs.truffleApi)\n  add(\"generatorImplementation\", libs.kotlinStdLib)\n\n  javaExecutableConfiguration(project(\":pkl-cli\", \"javaExecutable\"))\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-core\")\n        description.set(\n          \"\"\"\n          Core implementation of the Pkl configuration language.\n          Includes Java APIs for embedding the language into JVM applications,\n          and for building libraries and tools on top of the language.\n        \"\"\"\n            .trimIndent()\n        )\n      }\n    }\n  }\n}\n\ntasks.processResources {\n  inputs.property(\"version\", buildInfo.pklVersion)\n  inputs.property(\"commitId\", buildInfo.commitId)\n\n  filesMatching(\"org/pkl/core/Release.properties\") {\n    val stdlibModules =\n      fileTree(\"$rootDir/stdlib\") {\n          include(\"*.pkl\")\n          exclude(\"doc-package-info.pkl\")\n        }\n        .map { \"pkl:\" + it.nameWithoutExtension }\n        .sortedBy { it.lowercase() }\n\n    filter<ReplaceTokens>(\n      \"tokens\" to\n        mapOf(\n          \"version\" to buildInfo.pklVersion,\n          \"commitId\" to buildInfo.commitId,\n          \"stdlibModules\" to stdlibModules.joinToString(\",\"),\n        )\n    )\n  }\n\n  into(\"org/pkl/core/stdlib\") { from(\"$rootDir/stdlib\") { include(\"*.pkl\") } }\n}\n\ntasks.compileJava { options.generatedSourceOutputDirectory.set(file(\"generated/truffle\")) }\n\ntasks.compileKotlin { enabled = false }\n\ntasks.test {\n  configureTest()\n  useJUnitPlatform {\n    excludeEngines(\"MacAmd64LanguageSnippetTestsEngine\")\n    excludeEngines(\"MacAarch64LanguageSnippetTestsEngine\")\n    excludeEngines(\"LinuxAmd64LanguageSnippetTestsEngine\")\n    excludeEngines(\"LinuxAarch64LanguageSnippetTestsEngine\")\n    excludeEngines(\"AlpineLanguageSnippetTestsEngine\")\n    excludeEngines(\"WindowsLanguageSnippetTestsEngine\")\n  }\n\n  // testing very large lists requires more memory than the default 512m!\n  maxHeapSize = \"1g\"\n}\n\nval testJavaExecutable by\n  tasks.registering(Test::class) {\n    configureExecutableTest(\"LanguageSnippetTestsEngine\")\n    classpath =\n      // compiled test classes\n      sourceSets.test.get().output +\n        // java executable\n        javaExecutableConfiguration +\n        // test-only dependencies\n        // (test dependencies that are also main dependencies must already be contained in java\n        // executable;\n        // to verify that we don't want to include them here)\n        (configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())\n\n    // testing very large lists requires more memory than the default 512m!\n    maxHeapSize = \"1g\"\n  }\n\ntasks.check { dependsOn(testJavaExecutable) }\n\nval testMacExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:macExecutableAmd64\")\n    configureExecutableTest(\"MacAmd64LanguageSnippetTestsEngine\")\n  }\n\nval testMacExecutableAarch64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:macExecutableAarch64\")\n    configureExecutableTest(\"MacAarch64LanguageSnippetTestsEngine\")\n  }\n\nval testLinuxExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:linuxExecutableAmd64\")\n    configureExecutableTest(\"LinuxAmd64LanguageSnippetTestsEngine\")\n  }\n\nval testLinuxExecutableAarch64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:linuxExecutableAarch64\")\n    configureExecutableTest(\"LinuxAarch64LanguageSnippetTestsEngine\")\n  }\n\nval testAlpineExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:alpineExecutableAmd64\")\n    configureExecutableTest(\"AlpineLanguageSnippetTestsEngine\")\n  }\n\nval testWindowsExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:windowsExecutableAmd64\")\n    configureExecutableTest(\"WindowsLanguageSnippetTestsEngine\")\n  }\n\ntasks.testNativeMacOsAarch64 { dependsOn(testMacExecutableAarch64) }\n\ntasks.testNativeMacOsAmd64 { dependsOn(testMacExecutableAmd64) }\n\ntasks.testNativeLinuxAarch64 { dependsOn(testLinuxExecutableAarch64) }\n\ntasks.testNativeLinuxAmd64 { dependsOn(testLinuxExecutableAmd64) }\n\ntasks.testNativeAlpineLinuxAmd64 { dependsOn(testAlpineExecutableAmd64) }\n\ntasks.testNativeWindowsAmd64 { dependsOn(testWindowsExecutableAmd64) }\n\ntasks.clean {\n  delete(\"generated/\")\n  delete(layout.buildDirectory.dir(\"test-packages\"))\n}\n\nprivate fun Test.configureTest() {\n  inputs\n    .dir(\"src/test/files/LanguageSnippetTests/input\")\n    .withPropertyName(\"languageSnippetTestsInput\")\n    .withPathSensitivity(PathSensitivity.RELATIVE)\n  inputs\n    .dir(\"src/test/files/LanguageSnippetTests/input-helper\")\n    .withPropertyName(\"languageSnippetTestsInputHelper\")\n    .withPathSensitivity(PathSensitivity.RELATIVE)\n  inputs\n    .dir(\"src/test/files/LanguageSnippetTests/output\")\n    .withPropertyName(\"languageSnippetTestsOutput\")\n    .withPathSensitivity(PathSensitivity.RELATIVE)\n}\n\nprivate fun Test.configureExecutableTest(engineName: String) {\n  configureTest()\n  testClassesDirs = files(tasks.test.get().testClassesDirs)\n  classpath = tasks.test.get().classpath\n  useJUnitPlatform { includeEngines(engineName) }\n}\n"
  },
  {
    "path": "pkl-core/src/generator/kotlin/org/pkl/core/generator/MemberRegistryGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.generator\n\nimport com.oracle.truffle.api.dsl.GeneratedBy\nimport com.palantir.javapoet.ClassName\nimport com.palantir.javapoet.JavaFile\nimport com.palantir.javapoet.MethodSpec\nimport com.palantir.javapoet.TypeSpec\nimport javax.annotation.processing.AbstractProcessor\nimport javax.annotation.processing.RoundEnvironment\nimport javax.lang.model.SourceVersion\nimport javax.lang.model.element.*\nimport javax.lang.model.type.TypeMirror\n\n/**\n * Generates a subclass of `org.pkl.core.stdlib.registry.ExternalMemberRegistry` for each stdlib\n * module and a factory to instantiate them. Generated classes are written to\n * `generated/truffle/org/pkl/core/stdlib/registry`.\n *\n * Inputs:\n * - Generated Truffle node classes for stdlib members. These classes are located in subpackages of\n *   `org.pkl.core.stdlib` and identified via their `@GeneratedBy` annotations.\n * - `@PklName` annotations on handwritten node classes from which Truffle node classes are\n *   generated.\n */\nclass MemberRegistryGenerator : AbstractProcessor() {\n  private val truffleNodeClassSuffix = \"NodeGen\"\n  private val truffleNodeFactorySuffix = \"NodesFactory\"\n  private val stdLibPackageName: String = \"org.pkl.core.stdlib\"\n  private val registryPackageName: String = \"$stdLibPackageName.registry\"\n  private val modulePackageName: String = \"org.pkl.core.module\"\n\n  private val externalMemberRegistryClassName: ClassName =\n    ClassName.get(registryPackageName, \"ExternalMemberRegistry\")\n  private val emptyMemberRegistryClassName: ClassName =\n    ClassName.get(registryPackageName, \"EmptyMemberRegistry\")\n  private val memberRegistryFactoryClassName: ClassName =\n    ClassName.get(registryPackageName, \"MemberRegistryFactory\")\n  private val moduleKeyClassName: ClassName = ClassName.get(modulePackageName, \"ModuleKey\")\n  private val moduleKeysClassName: ClassName = ClassName.get(modulePackageName, \"ModuleKeys\")\n\n  override fun getSupportedAnnotationTypes(): Set<String> = setOf(GeneratedBy::class.java.name)\n\n  override fun getSupportedSourceVersion(): SourceVersion = SourceVersion.RELEASE_17\n\n  override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {\n    if (annotations.isEmpty()) return true\n\n    val nodeClassesByPackage = collectNodeClasses(roundEnv)\n    generateRegistryClasses(nodeClassesByPackage)\n    generateRegistryFactoryClass(nodeClassesByPackage.keys)\n\n    return true\n  }\n\n  private fun collectNodeClasses(roundEnv: RoundEnvironment) =\n    roundEnv\n      .getElementsAnnotatedWith(GeneratedBy::class.java)\n      .asSequence()\n      .filterIsInstance<TypeElement>()\n      .filter { it.qualifiedName.toString().startsWith(stdLibPackageName) }\n      .filter { it.simpleName.toString().endsWith(truffleNodeClassSuffix) }\n      .sortedWith(\n        compareBy(\n          {\n            if (it.enclosingElement.kind == ElementKind.PACKAGE) \"\"\n            else it.enclosingElement.simpleName.toString()\n          },\n          { it.simpleName.toString() },\n        )\n      )\n      .groupBy { processingEnv.elementUtils.getPackageOf(it) }\n\n  private fun generateRegistryClasses(\n    nodeClassesByPackage: Map<PackageElement, List<TypeElement>>\n  ) {\n    for ((pkg, nodeClasses) in nodeClassesByPackage) {\n      generateRegistryClass(pkg, nodeClasses)\n    }\n  }\n\n  private fun generateRegistryClass(pkg: PackageElement, nodeClasses: List<TypeElement>) {\n    val pklModuleName = getAnnotatedPklName(pkg) ?: pkg.simpleName.toString()\n    val pklModuleNameCapitalized = pklModuleName.capitalize()\n    val registryClassName =\n      ClassName.get(registryPackageName, \"${pklModuleNameCapitalized}MemberRegistry\")\n\n    val registryClass =\n      TypeSpec.classBuilder(registryClassName)\n        .addJavadoc(\"Generated by {@link ${this::class.qualifiedName}}.\")\n        .addModifiers(Modifier.FINAL)\n        .superclass(externalMemberRegistryClassName)\n    val registryClassConstructor = MethodSpec.constructorBuilder()\n\n    for (nodeClass in nodeClasses) {\n      val enclosingClass = nodeClass.enclosingElement\n      val pklClassName =\n        getAnnotatedPklName(enclosingClass)\n          ?: enclosingClass.simpleName.toString().removeSuffix(truffleNodeFactorySuffix)\n      val pklMemberName =\n        getAnnotatedPklName(nodeClass)\n          ?: nodeClass.simpleName.toString().removeSuffix(truffleNodeClassSuffix)\n      val pklMemberNameQualified =\n        when (pklClassName) {\n          // By convention, the top-level class containing node classes\n          // for *module* members is named `<SimpleModuleName>Nodes`.\n          // Example: `BaseNodes` for pkl.base\n          pklModuleNameCapitalized -> \"pkl.$pklModuleName#$pklMemberName\"\n          else -> \"pkl.$pklModuleName#$pklClassName.$pklMemberName\"\n        }\n      registryClass.addOriginatingElement(nodeClass)\n      registryClassConstructor.addStatement(\n        \"register(\\$S, \\$T::create)\",\n        pklMemberNameQualified,\n        nodeClass,\n      )\n    }\n\n    registryClass.addMethod(registryClassConstructor.build())\n    val javaFile = JavaFile.builder(registryPackageName, registryClass.build()).build()\n    javaFile.writeTo(processingEnv.filer)\n  }\n\n  private fun generateRegistryFactoryClass(packages: Collection<PackageElement>) {\n    val registryFactoryClass =\n      TypeSpec.classBuilder(memberRegistryFactoryClassName)\n        .addJavadoc(\"Generated by {@link ${this::class.qualifiedName}}.\")\n        .addModifiers(Modifier.PUBLIC, Modifier.FINAL)\n    val registryFactoryConstructor = MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE)\n    registryFactoryClass.addMethod(registryFactoryConstructor.build())\n    val registryFactoryGetMethod =\n      MethodSpec.methodBuilder(\"get\")\n        .addModifiers(Modifier.PUBLIC, Modifier.STATIC)\n        .addParameter(moduleKeyClassName, \"moduleKey\")\n        .returns(externalMemberRegistryClassName)\n        .beginControlFlow(\"if (!\\$T.isStdLibModule(moduleKey))\", moduleKeysClassName)\n        .addStatement(\"return \\$T.INSTANCE\", emptyMemberRegistryClassName)\n        .endControlFlow()\n        .beginControlFlow(\"switch (moduleKey.getUri().getSchemeSpecificPart())\")\n\n    for (pkg in packages) {\n      val pklModuleName = getAnnotatedPklName(pkg) ?: pkg.simpleName.toString()\n      val pklModuleNameCapitalized = pklModuleName.capitalize()\n      val registryClassName =\n        ClassName.get(registryPackageName, \"${pklModuleNameCapitalized}MemberRegistry\")\n\n      // declare dependency on package-info.java (for `@PklName`)\n      registryFactoryClass.addOriginatingElement(pkg)\n      registryFactoryGetMethod\n        .addCode(\"case \\$S:\\n\", pklModuleName)\n        .addStatement(\"  return new \\$T()\", registryClassName)\n    }\n\n    registryFactoryGetMethod\n      .addCode(\"default:\\n\")\n      .addStatement(\"  return \\$T.INSTANCE\", emptyMemberRegistryClassName)\n      .endControlFlow()\n    registryFactoryClass.addMethod(registryFactoryGetMethod.build())\n    val javaFile = JavaFile.builder(registryPackageName, registryFactoryClass.build()).build()\n    javaFile.writeTo(processingEnv.filer)\n  }\n\n  private fun getAnnotatedPklName(element: Element): String? {\n    for (annotation in element.annotationMirrors) {\n      when (annotation.annotationType.asElement().simpleName.toString()) {\n        \"PklName\" -> return annotation.elementValues.values.iterator().next().value.toString()\n        \"GeneratedBy\" -> {\n          val annotationValue = annotation.elementValues.values.first().value as TypeMirror\n          return getAnnotatedPklName(processingEnv.typeUtils.asElement(annotationValue))\n        }\n      }\n    }\n    return null\n  }\n\n  private fun String.capitalize(): String = replaceFirstChar { it.titlecaseChar() }\n}\n"
  },
  {
    "path": "pkl-core/src/generator/resources/META-INF/gradle/incremental.annotation.processors",
    "content": "# https://docs.gradle.org/current/userguide/java_plugin.html#aggregating_annotation_processors\norg.pkl.core.generator.MemberRegistryGenerator,aggregating\n"
  },
  {
    "path": "pkl-core/src/generator/resources/META-INF/services/javax.annotation.processing.Processor",
    "content": "org.pkl.core.generator.MemberRegistryGenerator\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Analyzer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport org.graalvm.polyglot.Context;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.module.ModuleKeyFactory;\nimport org.pkl.core.module.ProjectDependenciesManager;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.project.DeclaredDependencies;\nimport org.pkl.core.runtime.ModuleResolver;\nimport org.pkl.core.runtime.ResourceManager;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmImportAnalyzer;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Utility library for static analysis of Pkl programs. */\npublic class Analyzer {\n  private final StackFrameTransformer transformer;\n  private final boolean color;\n  private final SecurityManager securityManager;\n  private final @Nullable Path moduleCacheDir;\n  private final @Nullable DeclaredDependencies projectDependencies;\n  private final ModuleResolver moduleResolver;\n  private final HttpClient httpClient;\n  private final TraceMode traceMode;\n\n  public Analyzer(\n      StackFrameTransformer transformer,\n      boolean color,\n      SecurityManager securityManager,\n      Collection<ModuleKeyFactory> moduleKeyFactories,\n      @Nullable Path moduleCacheDir,\n      @Nullable DeclaredDependencies projectDependencies,\n      HttpClient httpClient,\n      TraceMode traceMode) {\n    this.transformer = transformer;\n    this.color = color;\n    this.securityManager = securityManager;\n    this.moduleCacheDir = moduleCacheDir;\n    this.projectDependencies = projectDependencies;\n    this.moduleResolver = new ModuleResolver(moduleKeyFactories);\n    this.httpClient = httpClient;\n    this.traceMode = traceMode;\n  }\n\n  /**\n   * Builds a graph of imports from the provided source modules.\n   *\n   * <p>For details, see {@link ImportGraph}.\n   */\n  public ImportGraph importGraph(URI... sources) {\n    var context = createContext();\n    try {\n      context.enter();\n      var vmContext = VmContext.get(null);\n      return VmImportAnalyzer.analyze(sources, vmContext);\n    } catch (SecurityManagerException\n        | IOException\n        | PackageLoadError\n        | HttpClientInitException e) {\n      throw new PklException(e.getMessage(), e);\n    } catch (PklException err) {\n      throw err;\n    } catch (VmException err) {\n      throw err.toPklException(transformer, color);\n    } catch (Exception e) {\n      throw new PklBugException(e);\n    } finally {\n      context.leave();\n      context.close();\n    }\n  }\n\n  private Context createContext() {\n    var packageResolver =\n        PackageResolver.getInstance(\n            securityManager, HttpClient.builder().buildLazily(), moduleCacheDir);\n    return VmUtils.createContext(\n        () -> {\n          VmContext vmContext = VmContext.get(null);\n          vmContext.initialize(\n              new VmContext.Holder(\n                  transformer,\n                  securityManager,\n                  httpClient,\n                  moduleResolver,\n                  new ResourceManager(securityManager, List.of()),\n                  Loggers.stdErr(),\n                  Map.of(),\n                  Map.of(),\n                  moduleCacheDir,\n                  null,\n                  packageResolver,\n                  projectDependencies == null\n                      ? null\n                      : new ProjectDependenciesManager(\n                          projectDependencies, moduleResolver, securityManager),\n                  traceMode,\n                  false));\n        });\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/BufferedLogger.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/** A logger that keeps messages locally and can return them. */\npublic final class BufferedLogger implements Logger {\n\n  private final StringBuilder builder = new StringBuilder();\n  private final Logger logger;\n\n  public BufferedLogger(Logger logger) {\n    this.logger = logger;\n  }\n\n  @Override\n  public void trace(String message, StackFrame frame) {\n    builder.append(message).append(\"\\n\");\n    logger.trace(message, frame);\n  }\n\n  @Override\n  public void warn(String message, StackFrame frame) {\n    builder.append(message).append(\"\\n\");\n    logger.warn(message, frame);\n  }\n\n  public void clear() {\n    builder.setLength(0);\n  }\n\n  public String getLogs() {\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Closeables.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\npublic final class Closeables {\n  private Closeables() {}\n\n  /** Closes the given readers, ignoring any exceptions. */\n  public static void closeQuietly(Iterable<? extends AutoCloseable> readers) {\n    for (var reader : readers) {\n      try {\n        reader.close();\n      } catch (Exception ignored) {\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/CommandSpec.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.net.URI;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\nimport org.pkl.core.util.Nullable;\n\npublic record CommandSpec(\n    String name,\n    @Nullable String helpText,\n    boolean hidden,\n    boolean noOp,\n    Iterable<Option> options,\n    List<CommandSpec> subcommands,\n    ApplyFunction apply) {\n\n  public sealed interface Option {\n    String name();\n\n    String[] getNames();\n\n    class MissingOption extends RuntimeException {\n      public MissingOption() {}\n    }\n\n    class BadValue extends RuntimeException {\n      public BadValue(String message) {\n        super(message);\n      }\n\n      public static BadValue invalid(String value, String type) {\n        return new BadValue(String.format(\"%s is not a valid %s\", value, type));\n      }\n\n      public static BadValue badKeyValue(String value) {\n        return new BadValue(String.format(\"%s is not a valid key=value pair\", value));\n      }\n\n      public static BadValue invalidChoice(String value, List<String> choices) {\n        return new BadValue(\n            String.format(\n                \"invalid choice: %s. (choose from %s)\", value, String.join(\", \", choices)));\n      }\n\n      public static BadValue invalidChoice(String value, String choice) {\n        return new BadValue(String.format(\"invalid choice: %s. (choose from %s)\", value, choice));\n      }\n    }\n  }\n\n  public abstract static sealed class CompletionCandidates {\n    public static final CompletionCandidates PATH = new StaticCompletionCandidates();\n\n    public static final class Fixed extends CompletionCandidates {\n      private final Set<String> values;\n\n      public Fixed(Set<String> values) {\n        this.values = values;\n      }\n\n      public Set<String> getValues() {\n        return values;\n      }\n    }\n\n    private static final class StaticCompletionCandidates extends CompletionCandidates {}\n  }\n\n  public record Flag(\n      String name,\n      @Nullable String helpText,\n      boolean showAsRequired,\n      BiFunction<String, URI, Object> transformEach,\n      BiFunction<List<Object>, URI, Object> transformAll,\n      @Nullable CompletionCandidates completionCandidates,\n      @Nullable String shortName,\n      String metavar,\n      boolean hidden,\n      @Nullable String defaultValue)\n      implements Option {\n    @Override\n    public String[] getNames() {\n      return shortName == null\n          ? new String[] {\"--\" + name}\n          : new String[] {\"-\" + shortName, \"--\" + name};\n    }\n  }\n\n  public record BooleanFlag(\n      String name,\n      @Nullable String helpText,\n      @Nullable String shortName,\n      boolean hidden,\n      @Nullable Boolean defaultValue)\n      implements Option {\n    @Override\n    public String[] getNames() {\n      return shortName == null\n          ? new String[] {\"--\" + name}\n          : new String[] {\"-\" + shortName, \"--\" + name};\n    }\n  }\n\n  public record CountedFlag(\n      String name, @Nullable String helpText, @Nullable String shortName, boolean hidden)\n      implements Option {\n    @Override\n    public String[] getNames() {\n      return shortName == null\n          ? new String[] {\"--\" + name}\n          : new String[] {\"-\" + shortName, \"--\" + name};\n    }\n  }\n\n  public record Argument(\n      String name,\n      @Nullable String helpText,\n      BiFunction<String, URI, Object> transformEach,\n      BiFunction<List<Object>, URI, Object> transformAll,\n      @Nullable CompletionCandidates completionCandidates,\n      boolean repeated)\n      implements Option {\n    @Override\n    public String[] getNames() {\n      return new String[] {name};\n    }\n  }\n\n  public interface ApplyFunction {\n    State apply(Map<String, Object> options, @Nullable State parent);\n  }\n\n  public record State(Object contents, Function<Object, Result> reify) {\n    public Result evaluate() {\n      return reify.apply(contents);\n    }\n  }\n\n  public record Result(byte[] outputBytes, Map<String, FileOutput> outputFiles) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Composite.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.Map;\nimport org.pkl.core.util.Nullable;\n\n/** A container of properties. */\npublic interface Composite extends Value {\n  /** Shorthand for {@code getProperties.containsKey(name)}. */\n  default boolean hasProperty(String name) {\n    return getProperties().containsKey(name);\n  }\n\n  /**\n   * Returns the value of the property with the given name, or throws {@link\n   * NoSuchPropertyException} if no such property exists.\n   */\n  Object getProperty(String name);\n\n  /** Shorthand for {@code getProperties().get(name)}; */\n  default @Nullable Object getPropertyOrNull(String name) {\n    return getProperties().get(name);\n  }\n\n  /**\n   * Same as {@link #getProperty} except that this method returns {@code null} instead of {@link\n   * PNull} for Pkl value {@code null}.\n   */\n  default @Nullable Object get(String name) {\n    var result = getProperty(name);\n    return result instanceof PNull ? null : result;\n  }\n\n  /** Returns the properties of this composite. */\n  Map<String, Object> getProperties();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/DataSize.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport static org.pkl.core.DataSizeUnit.*;\n\nimport java.io.Serial;\nimport java.util.Objects;\nimport org.pkl.core.util.MathUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a {@code pkl.base#DataSize} value. */\npublic final class DataSize implements Value {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final double value;\n  private final DataSizeUnit unit;\n\n  /** Constructs a new data size with the given value and unit. */\n  public DataSize(double value, DataSizeUnit unit) {\n    this.value = value;\n    this.unit = Objects.requireNonNull(unit, \"unit\");\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#BYTES}. */\n  public static DataSize ofBytes(double value) {\n    return new DataSize(value, BYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#KILOBYTES}. */\n  public static DataSize ofKilobytes(double value) {\n    return new DataSize(value, KILOBYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#KIBIBYTES}. */\n  public static DataSize ofKibibytes(double value) {\n    return new DataSize(value, KIBIBYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#MEGABYTES}. */\n  public static DataSize ofMegabytes(double value) {\n    return new DataSize(value, MEGABYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#MEBIBYTES}. */\n  public static DataSize ofMebibytes(double value) {\n    return new DataSize(value, MEBIBYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#GIGABYTES}. */\n  public static DataSize ofGigabytes(double value) {\n    return new DataSize(value, GIGABYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#GIBIBYTES}. */\n  public static DataSize ofGibibytes(double value) {\n    return new DataSize(value, GIBIBYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#TERABYTES}. */\n  public static DataSize ofTerabytes(double value) {\n    return new DataSize(value, TERABYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#TEBIBYTES}. */\n  public static DataSize ofTebibytes(double value) {\n    return new DataSize(value, TEBIBYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#PETABYTES}. */\n  public static DataSize ofPetabytes(double value) {\n    return new DataSize(value, PETABYTES);\n  }\n\n  /** Constructs a new data size with the given value and unit {@link DataSizeUnit#PEBIBYTES}. */\n  public static DataSize ofPebibytes(double value) {\n    return new DataSize(value, PEBIBYTES);\n  }\n\n  /** Returns the value of this data size. The value is relative to the unit and may be negative. */\n  public double getValue() {\n    return value;\n  }\n\n  /** Returns the unit of this data size. */\n  public DataSizeUnit getUnit() {\n    return unit;\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#BYTES}. */\n  public double inBytes() {\n    return convertValueTo(BYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#KILOBYTES}. */\n  public double inKilobytes() {\n    return convertValueTo(KILOBYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#KIBIBYTES}. */\n  public double inKibibytes() {\n    return convertValueTo(KIBIBYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#MEGABYTES}. */\n  public double inMegabytes() {\n    return convertValueTo(MEGABYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#MEBIBYTES}. */\n  public double inMebibytes() {\n    return convertValueTo(MEBIBYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#GIGABYTES}. */\n  public double inGigabytes() {\n    return convertValueTo(GIGABYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#GIBIBYTES}. */\n  public double inGibibytes() {\n    return convertValueTo(GIBIBYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#TERABYTES}. */\n  public double inTerabytes() {\n    return convertValueTo(TERABYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#TEBIBYTES}. */\n  public double inTebibytes() {\n    return convertValueTo(TEBIBYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#PETABYTES}. */\n  public double inPetabytes() {\n    return convertValueTo(PETABYTES);\n  }\n\n  /** Returns the value of this data size measured in {@link DataSizeUnit#PEBIBYTES}. */\n  public double inPebibytes() {\n    return convertValueTo(PEBIBYTES);\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#BYTES}. */\n  public long inWholeBytes() {\n    return Math.round(inBytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#KILOBYTES}. */\n  public long inWholeKilobytes() {\n    return Math.round(inKilobytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#KIBIBYTES}. */\n  public long inWholeKibibytes() {\n    return Math.round(inKibibytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#MEGABYTES}. */\n  public long inWholeMegabytes() {\n    return Math.round(inMegabytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#MEBIBYTES}. */\n  public long inWholeMebibytes() {\n    return Math.round(inMebibytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#GIGABYTES}. */\n  public long inWholeGigabytes() {\n    return Math.round(inGigabytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#GIBIBYTES}. */\n  public long inWholeGibibytes() {\n    return Math.round(inGibibytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#TERABYTES}. */\n  public long inWholeTerabytes() {\n    return Math.round(inTerabytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#TEBIBYTES}. */\n  public long inWholeTebibytes() {\n    return Math.round(inTebibytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#PETABYTES}. */\n  public long inWholePetabytes() {\n    return Math.round(inPetabytes());\n  }\n\n  /** Returns the value of this data size measured in whole {@link DataSizeUnit#PEBIBYTES}. */\n  public long inWholePebibytes() {\n    return Math.round(inPebibytes());\n  }\n\n  /** Returns a new data size with the given unit and this value converted to the given unit. */\n  public DataSize convertTo(DataSizeUnit other) {\n    return new DataSize(convertValueTo(other), other);\n  }\n\n  /** Returns the value of this data size converted to the given unit. */\n  public double convertValueTo(DataSizeUnit other) {\n    return value * unit.getBytes() / other.getBytes();\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitDataSize(this);\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertDataSize(this);\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public PClassInfo<?> getClassInfo() {\n    return PClassInfo.DataSize;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof DataSize other)) return false;\n    return convertValueTo(DataSizeUnit.BYTES) == other.convertValueTo(DataSizeUnit.BYTES);\n  }\n\n  @Override\n  public int hashCode() {\n    return Double.hashCode(convertValueTo(DataSizeUnit.BYTES));\n  }\n\n  @Override\n  public String toString() {\n    return MathUtils.isMathematicalInteger(value) ? (long) value + \".\" + unit : value + \".\" + unit;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/DataSizeUnit.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport org.pkl.core.util.Nullable;\n\n/**\n * The unit of a {@link DataSize}. In Pkl, data size units are represented as String {@link\n * #getSymbol() symbols}.\n */\npublic enum DataSizeUnit {\n  BYTES(1, \"b\"),\n  KILOBYTES(1000, \"kb\"),\n  KIBIBYTES(1024, \"kib\"),\n  MEGABYTES(1000 * 1000, \"mb\"),\n  MEBIBYTES(1024 * 1024, \"mib\"),\n  GIGABYTES(1000 * 1000 * 1000, \"gb\"),\n  GIBIBYTES(1024 * 1024 * 1024, \"gib\"),\n  TERABYTES(1000L * 1000 * 1000 * 1000, \"tb\"),\n  TEBIBYTES(1024L * 1024 * 1024 * 1024, \"tib\"),\n  PETABYTES(1000L * 1000 * 1000 * 1000 * 1000, \"pb\"),\n  PEBIBYTES(1024L * 1024 * 1024 * 1024 * 1024, \"pib\");\n\n  private final long bytes;\n\n  private final String symbol;\n\n  DataSizeUnit(long bytes, String symbol) {\n    this.bytes = bytes;\n    this.symbol = symbol;\n  }\n\n  /**\n   * Returns the unit with the given symbol, or {@code null} if no unit with the given symbol\n   * exists.\n   */\n  public static @Nullable DataSizeUnit parse(String symbol) {\n    return switch (symbol) {\n      case \"b\" -> BYTES;\n      case \"kb\" -> KILOBYTES;\n      case \"kib\" -> KIBIBYTES;\n      case \"mb\" -> MEGABYTES;\n      case \"mib\" -> MEBIBYTES;\n      case \"gb\" -> GIGABYTES;\n      case \"gib\" -> GIBIBYTES;\n      case \"tb\" -> TERABYTES;\n      case \"tib\" -> TEBIBYTES;\n      case \"pb\" -> PETABYTES;\n      case \"pib\" -> PEBIBYTES;\n      default -> null;\n    };\n  }\n\n  /** Returns the String symbol of this unit. */\n  public String getSymbol() {\n    return symbol;\n  }\n\n  /** Returns the conversion factor from this unit to bytes. */\n  public long getBytes() {\n    return bytes;\n  }\n\n  public String toString() {\n    return symbol;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Duration.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport static org.pkl.core.DurationUnit.*;\n\nimport java.io.Serial;\nimport java.util.Objects;\nimport org.pkl.core.util.DurationUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a {@code pkl.base#Duration} value. */\npublic final class Duration implements Value {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final double value;\n  private final DurationUnit unit;\n\n  /** Constructs a new duration with the given value and unit. */\n  public Duration(double value, DurationUnit unit) {\n    this.value = value;\n    this.unit = Objects.requireNonNull(unit, \"unit\");\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#NANOS}. */\n  public static Duration ofNanos(double value) {\n    return new Duration(value, NANOS);\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#MICROS}. */\n  public static Duration ofMicros(double value) {\n    return new Duration(value, MICROS);\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#MILLIS}. */\n  public static Duration ofMillis(double value) {\n    return new Duration(value, MILLIS);\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#SECONDS}. */\n  public static Duration ofSeconds(double value) {\n    return new Duration(value, SECONDS);\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#MINUTES}. */\n  public static Duration ofMinutes(double value) {\n    return new Duration(value, MINUTES);\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#HOURS}. */\n  public static Duration ofHours(double value) {\n    return new Duration(value, HOURS);\n  }\n\n  /** Constructs a new duration with the given value and unit {@link DurationUnit#DAYS}. */\n  public static Duration ofDays(double value) {\n    return new Duration(value, DAYS);\n  }\n\n  /** Returns the value of this duration. The value is relative to the unit and may be negative. */\n  public double getValue() {\n    return value;\n  }\n\n  /** Returns an ISO 8601 representation of this duration. */\n  public String toIsoString() {\n    return DurationUtils.toIsoString(value, unit);\n  }\n\n  /** Returns the unit of this duration. */\n  public DurationUnit getUnit() {\n    return unit;\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#NANOS}. */\n  public double inNanos() {\n    return convertValueTo(NANOS);\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#MICROS}. */\n  public double inMicros() {\n    return convertValueTo(MICROS);\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#MILLIS}. */\n  public double inMillis() {\n    return convertValueTo(MILLIS);\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#SECONDS}. */\n  public double inSeconds() {\n    return convertValueTo(SECONDS);\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#MINUTES}. */\n  public double inMinutes() {\n    return convertValueTo(MINUTES);\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#HOURS}. */\n  public double inHours() {\n    return convertValueTo(HOURS);\n  }\n\n  /** Returns the value of this duration measured in {@link DurationUnit#DAYS}. */\n  public double inDays() {\n    return convertValueTo(DAYS);\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#NANOS}. */\n  public long inWholeNanos() {\n    return Math.round(inNanos());\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#MICROS}. */\n  public long inWholeMicros() {\n    return Math.round(inMicros());\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#MILLIS}. */\n  public long inWholeMillis() {\n    return Math.round(inMillis());\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#SECONDS}. */\n  public long inWholeSeconds() {\n    return Math.round(inSeconds());\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#MINUTES}. */\n  public long inWholeMinutes() {\n    return Math.round(inMinutes());\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#HOURS}. */\n  public long inWholeHours() {\n    return Math.round(inHours());\n  }\n\n  /** Returns the value of this duration measured in whole {@link DurationUnit#DAYS}. */\n  public long inWholeDays() {\n    return Math.round(inDays());\n  }\n\n  /**\n   * Converts this duration to a {@link java.time.Duration}. If {@link #getValue()} is NaN,\n   * +/-Infinity or too large to fit into {@link java.time.Duration}, {@link ArithmeticException} is\n   * thrown.\n   */\n  public java.time.Duration toJavaDuration() {\n    if (!Double.isFinite(value)) {\n      throw new ArithmeticException(\n          \"Cannot convert Pkl duration `\" + this + \"` to `java.time.Duration`.\");\n    }\n\n    var l = (long) value;\n    if (l == value) {\n      // `value` is a mathematical integer that fits into a long.\n      // Hence this duration is easy to convert without risk of rounding errors.\n      // Throws ArithmeticException if this duration doesn't fit into java.time.Duration (e.g.,\n      // Long.MAX_VALUE days).\n      return java.time.Duration.of(l, unit.toChronoUnit());\n    }\n\n    var seconds = convertValueTo(DurationUnit.SECONDS);\n    var secondsPart = (long) seconds;\n    var nanosPart = (long) ((seconds - secondsPart) * 1_000_000_000);\n    // If `seconds` is infinite or too large to fit into java.time.Duration,\n    // this throws ArithmeticException because one the following holds:\n    //   secondsPart == Long.MAX_VALUE && nanosPart >= 1_000_000_000\n    //   secondsPart == Long.MIN_VALUE && nanosPart <= -1_000_000_000.\n    return java.time.Duration.ofSeconds(secondsPart, nanosPart);\n  }\n\n  /** Returns a new duration with the given unit and this value converted to the given unit. */\n  public Duration convertTo(DurationUnit other) {\n    return new Duration(convertValueTo(other), other);\n  }\n\n  /** Returns the value of this duration converted to the given unit. */\n  public double convertValueTo(DurationUnit other) {\n    return value * unit.getNanos() / other.getNanos();\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitDuration(this);\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertDuration(this);\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public PClassInfo<?> getClassInfo() {\n    return PClassInfo.Duration;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Duration other)) return false;\n    return convertValueTo(DurationUnit.NANOS) == other.convertValueTo(DurationUnit.NANOS);\n  }\n\n  @Override\n  public int hashCode() {\n    return Double.hashCode(convertValueTo(DurationUnit.NANOS));\n  }\n\n  @Override\n  public String toString() {\n    return DurationUtils.toPklString(value, unit);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/DurationUnit.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.time.temporal.ChronoUnit;\nimport java.util.concurrent.TimeUnit;\nimport org.pkl.core.util.Nullable;\n\n/**\n * The unit of a {@link Duration}. In Pkl, duration units are represented as String {@link\n * #getSymbol() symbols}.\n */\npublic enum DurationUnit {\n  NANOS(1, \"ns\"),\n  MICROS(1000, \"us\"),\n  MILLIS(1000 * 1000, \"ms\"),\n  SECONDS(1000 * 1000 * 1000, \"s\"),\n  MINUTES(1000L * 1000 * 1000 * 60, \"min\"),\n  HOURS(1000L * 1000 * 1000 * 60 * 60, \"h\"),\n  DAYS(1000L * 1000 * 1000 * 60 * 60 * 24, \"d\");\n\n  private final long nanos;\n\n  private final String symbol;\n\n  DurationUnit(long nanos, String symbol) {\n    this.nanos = nanos;\n    this.symbol = symbol;\n  }\n\n  /**\n   * Returns the unit with the given symbol, or {@code null} if no unit with the given symbol\n   * exists.\n   */\n  public static @Nullable DurationUnit parse(String symbol) {\n    return switch (symbol) {\n      case \"ns\" -> NANOS;\n      case \"us\" -> MICROS;\n      case \"ms\" -> MILLIS;\n      case \"s\" -> SECONDS;\n      case \"min\" -> MINUTES;\n      case \"h\" -> HOURS;\n      case \"d\" -> DAYS;\n      default -> null;\n    };\n  }\n\n  /** Returns the string symbol of this unit. */\n  public String getSymbol() {\n    return symbol;\n  }\n\n  /** Returns the conversion factor from this unit to nanoseconds. */\n  public long getNanos() {\n    return nanos;\n  }\n\n  /** Converts this unit to a {@link java.time.temporal.ChronoUnit}. */\n  public ChronoUnit toChronoUnit() {\n    return switch (this) {\n      case NANOS -> ChronoUnit.NANOS;\n      case MICROS -> ChronoUnit.MICROS;\n      case MILLIS -> ChronoUnit.MILLIS;\n      case SECONDS -> ChronoUnit.SECONDS;\n      case MINUTES -> ChronoUnit.MINUTES;\n      case HOURS -> ChronoUnit.HOURS;\n      case DAYS -> ChronoUnit.DAYS;\n    };\n  }\n\n  /** Converts this unit to a {@link java.util.concurrent.TimeUnit}. */\n  public TimeUnit toTimeUnit() {\n    return switch (this) {\n      case NANOS -> TimeUnit.NANOSECONDS;\n      case MICROS -> TimeUnit.MICROSECONDS;\n      case MILLIS -> TimeUnit.MILLISECONDS;\n      case SECONDS -> TimeUnit.SECONDS;\n      case MINUTES -> TimeUnit.MINUTES;\n      case HOURS -> TimeUnit.HOURS;\n      case DAYS -> TimeUnit.DAYS;\n    };\n  }\n\n  @Override\n  public String toString() {\n    return symbol;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Evaluator.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.function.Consumer;\nimport org.pkl.core.runtime.VmEvalException;\n\n/**\n * Evaluates a Pkl module through different modes of evaluation. Throws {@link VmEvalException} if\n * an error occurs during evaluation.\n *\n * <p>Evaluated modules, and modules imported by them, are cached based on their origin. This is\n * important to guarantee consistent evaluation results, for example when the same module is used by\n * multiple other modules. To reset the cache, {@link #close()} the current instance and create a\n * new one.\n *\n * <p>Construct an evaluator through {@link EvaluatorBuilder}.\n */\n@SuppressWarnings(\"unused\")\npublic interface Evaluator extends AutoCloseable {\n\n  /** Shorthand for {@code EvaluatorBuilder.preconfigured().build()}. */\n  static Evaluator preconfigured() {\n    return EvaluatorBuilder.preconfigured().build();\n  }\n\n  /**\n   * Evaluates the module, returning the Java representation of the module object.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  PModule evaluate(ModuleSource moduleSource);\n\n  /**\n   * Evaluates a module's {@code output.text} property.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  String evaluateOutputText(ModuleSource moduleSource);\n\n  /**\n   * Evaluates a module's {@code output.bytes} property.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   * @since 0.29.0\n   */\n  byte[] evaluateOutputBytes(ModuleSource moduleSource);\n\n  /**\n   * Evaluates a module's {@code output.value} property.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  Object evaluateOutputValue(ModuleSource moduleSource);\n\n  /**\n   * Evaluates a module's {@code output.files} property.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  Map<String, FileOutput> evaluateOutputFiles(ModuleSource moduleSource);\n\n  /**\n   * Evaluates the Pkl expression represented as {@code expression}, returning the Java\n   * representation of the result.\n   *\n   * <p>The following table describes how Pkl types are represented in Java:\n   *\n   * <table>\n   *   <thead>\n   *     <tr>\n   *       <th>Pkl type</th>\n   *       <th>Java type</th>\n   *     </tr>\n   *   </thead>\n   *   <tbody>\n   *     <tr>\n   *       <td>Null</td>\n   *       <td>{@link PNull}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>String</td>\n   *       <td>{@link String}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Boolean</td>\n   *       <td>{@link Boolean}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Int</td>\n   *       <td>{@link Long}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Float</td>\n   *       <td>{@link Double}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Typed, Dynamic</td>\n   *       <td>{@link PObject} ({@link PModule} if the object is a module)</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Mapping, Map</td>\n   *       <td>{@link Map}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Listing, List</td>\n   *       <td>{@link java.util.List}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Set</td>\n   *       <td>{@link java.util.Set}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Pair</td>\n   *       <td>{@link Pair}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Regex</td>\n   *       <td>{@link java.util.regex.Pattern}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>DataSize</td>\n   *       <td>{@link DataSize}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Duration</td>\n   *       <td>{@link Duration}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Class</td>\n   *       <td>{@link PClass}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>TypeAlias</td>\n   *       <td>{@link TypeAlias}</td>\n   *     </tr>\n   *     <tr>\n   *       <td>Bytes</td>\n   *       <td>{@code byte[]}</td>\n   *     </tr>\n   *   </tbody>\n   * </table>\n   *\n   * <p>The following Pkl types have no Java representation, and an error is thrown if an expression\n   * computes to a value of these types:\n   *\n   * <ul>\n   *   <li>IntSeq\n   *   <li>Function\n   * </ul>\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  Object evaluateExpression(ModuleSource moduleSource, String expression);\n\n  /**\n   * Evaluates the Pkl expression represented as {@code expression}, returning a byte array of the\n   * <code>pkl-binary</code>-encoded representation of the result.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  byte[] evaluateExpressionPklBinary(ModuleSource moduleSource, String expression);\n\n  /**\n   * Evaluates the Pkl expression, returning the stringified result.\n   *\n   * <p>This is equivalent to wrapping the expression with {@code .toString()}\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  String evaluateExpressionString(ModuleSource moduleSource, String expression);\n\n  /**\n   * Evaluates the module's schema, which describes the properties, methods, and classes of a\n   * module.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  ModuleSchema evaluateSchema(ModuleSource moduleSource);\n\n  /**\n   * Evaluates the module's {@code output.value} property, and validates that its type matches the\n   * provided class info.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  <T> T evaluateOutputValueAs(ModuleSource moduleSource, PClassInfo<T> classInfo);\n\n  /**\n   * Runs tests within the module, and returns the test results.\n   *\n   * <p>This requires that the target module be a test module; it must either amend or extend module\n   * {@code \"pkl:test\"}. Otherwise, a type mismatch error is thrown.\n   *\n   * <p>This method will write possibly {@code pkl-expected.pcf} and {@code pkl-actual.pcf} files as\n   * a sibling of the test module. The {@code overwrite} parameter causes the evaluator to overwrite\n   * {@code pkl-expected.pkl} files if they currently exist.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  TestResults evaluateTest(ModuleSource moduleSource, boolean overwrite);\n\n  /**\n   * Parses the command module into a spec that describes the CLI options and subcommands.\n   *\n   * <p>This requires that the target module be a {@code \"pkl:Command\"} instance.\n   *\n   * <p>Unlike other evaluator methods, the resulting {@link CommandSpec} must be handled in a\n   * closure. This is because specs must be applied to parsed CLI options to produce command state\n   * that is eventually evaluated, which must happen in the active context of an evaluator.\n   *\n   * @throws PklException if an error occurs during evaluation\n   * @throws IllegalStateException if this evaluator has already been closed\n   */\n  void evaluateCommand(\n      ModuleSource moduleSource,\n      Set<String> reservedFlagNames,\n      Set<String> reservedFlagShortNames,\n      Consumer<CommandSpec> run);\n\n  /**\n   * Releases all resources held by this evaluator. If an {@code evaluate} method is currently\n   * executing, this method blocks until cancellation of that execution has completed.\n   *\n   * <p>Once an evaluator has been closed, it can no longer be used, and calling {@code evaluate}\n   * methods will throw {@link IllegalStateException}. However, objects previously returned by\n   * {@code evaluate} methods remain valid.\n   */\n  @Override\n  void close();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/EvaluatorBuilder.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport com.oracle.truffle.api.TruffleOptions;\nimport java.nio.file.Path;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport org.pkl.core.SecurityManagers.StandardBuilder;\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.externalreader.ExternalReaderProcess;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.module.ModuleKeyFactory;\nimport org.pkl.core.module.ModulePathResolver;\nimport org.pkl.core.project.DeclaredDependencies;\nimport org.pkl.core.project.Project;\nimport org.pkl.core.resource.ResourceReader;\nimport org.pkl.core.resource.ResourceReaders;\nimport org.pkl.core.runtime.LoggerImpl;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/** A builder for an {@link Evaluator}. Can be reused to build multiple evaluators. */\n@SuppressWarnings({\"UnusedReturnValue\", \"unused\"})\npublic final class EvaluatorBuilder {\n  private final StandardBuilder securityManagerBuilder = SecurityManagers.standardBuilder();\n\n  private @Nullable SecurityManager securityManager;\n\n  // Default to a client with a fixed set of built-in certificates.\n  // Make it lazy to avoid creating a client unnecessarily.\n  private HttpClient httpClient = HttpClient.builder().buildLazily();\n\n  private Logger logger = Loggers.noop();\n\n  private final List<ModuleKeyFactory> moduleKeyFactories = new ArrayList<>();\n\n  private final List<ResourceReader> resourceReaders = new ArrayList<>();\n\n  private final Map<String, String> environmentVariables = new HashMap<>();\n\n  private final Map<String, String> externalProperties = new HashMap<>();\n\n  private @Nullable java.time.Duration timeout;\n\n  private @Nullable Path moduleCacheDir = IoUtils.getDefaultModuleCacheDir();\n\n  private @Nullable String outputFormat;\n\n  private boolean color = false;\n\n  private @Nullable StackFrameTransformer stackFrameTransformer;\n\n  private @Nullable DeclaredDependencies dependencies;\n\n  private TraceMode traceMode = TraceMode.COMPACT;\n\n  private boolean powerAssertionsEnabled = false;\n\n  private EvaluatorBuilder() {}\n\n  /**\n   * Creates a builder preconfigured with:\n   *\n   * <ul>\n   *   <li>{@link SecurityManagers#defaultAllowedModules}\n   *   <li>{@link SecurityManagers#defaultAllowedResources}\n   *   <li>{@link Loggers#noop()}\n   *   <li>{@link ModuleKeyFactories#standardLibrary}\n   *   <li>{@link ModuleKeyFactories#classPath}\n   *   <li>{@link ModuleKeyFactories#fromServiceProviders}\n   *   <li>{@link ModuleKeyFactories#file}\n   *   <li>{@link ModuleKeyFactories#pkg}\n   *   <li>{@link ModuleKeyFactories#projectpackage}\n   *   <li>{@link ModuleKeyFactories#genericUrl}\n   *   <li>{@link ResourceReaders#environmentVariable}\n   *   <li>{@link ResourceReaders#externalProperty}\n   *   <li>{@link ResourceReaders#classPath}\n   *   <li>{@link ResourceReaders#file}\n   *   <li>{@link ResourceReaders#http}\n   *   <li>{@link ResourceReaders#https}\n   *   <li>{@link ResourceReaders#pkg}\n   *   <li>{@link ResourceReaders#projectpackage}\n   *   <li>{@link ResourceReaders#fromServiceProviders}\n   *   <li>{@link System#getProperties}\n   * </ul>\n   */\n  public static EvaluatorBuilder preconfigured() {\n    EvaluatorBuilder builder = new EvaluatorBuilder();\n\n    builder\n        .setStackFrameTransformer(StackFrameTransformers.defaultTransformer)\n        .setAllowedModules(SecurityManagers.defaultAllowedModules)\n        .setAllowedResources(SecurityManagers.defaultAllowedResources)\n        .addResourceReader(ResourceReaders.environmentVariable())\n        .addResourceReader(ResourceReaders.externalProperty())\n        .addResourceReader(ResourceReaders.file())\n        .addResourceReader(ResourceReaders.http())\n        .addResourceReader(ResourceReaders.https())\n        .addResourceReader(ResourceReaders.pkg())\n        .addResourceReader(ResourceReaders.projectpackage())\n        .addResourceReaders(ResourceReaders.fromServiceProviders())\n        .addModuleKeyFactory(ModuleKeyFactories.standardLibrary);\n\n    if (!TruffleOptions.AOT) {\n      // AOT does not support class loader API\n      var classLoader = EvaluatorBuilder.class.getClassLoader();\n      builder\n          .addModuleKeyFactory(ModuleKeyFactories.classPath(classLoader))\n          .addResourceReader(ResourceReaders.classPath(classLoader));\n\n      // only add system properties when running on JVM\n      addSystemProperties(builder);\n    }\n\n    builder\n        .addModuleKeyFactories(ModuleKeyFactories.fromServiceProviders())\n        .addModuleKeyFactory(ModuleKeyFactories.file)\n        .addModuleKeyFactory(ModuleKeyFactories.http)\n        .addModuleKeyFactory(ModuleKeyFactories.pkg)\n        .addModuleKeyFactory(ModuleKeyFactories.projectpackage)\n        .addModuleKeyFactory(ModuleKeyFactories.genericUrl)\n        .addEnvironmentVariables(System.getenv());\n\n    return builder;\n  }\n\n  @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n  private static void addSystemProperties(EvaluatorBuilder builder) {\n    builder.addExternalProperties((Map) System.getProperties());\n  }\n\n  /**\n   * Creates a builder that is unconfigured. At a minimum, a security manager will need to be set\n   * before building an instance.\n   */\n  public static EvaluatorBuilder unconfigured() {\n    return new EvaluatorBuilder();\n  }\n\n  /** Sets the option to render errors in ANSI color. */\n  public EvaluatorBuilder setColor(boolean color) {\n    this.color = color;\n    return this;\n  }\n\n  /** Returns the current setting of the option to render errors in ANSI color. */\n  public boolean getColor() {\n    return color;\n  }\n\n  /** Sets the given stack frame transformer, replacing any previously set transformer. */\n  public EvaluatorBuilder setStackFrameTransformer(StackFrameTransformer stackFrameTransformer) {\n    this.stackFrameTransformer = stackFrameTransformer;\n    return this;\n  }\n\n  /** Returns the currently set stack frame transformer. */\n  public @Nullable StackFrameTransformer getStackFrameTransformer() {\n    return stackFrameTransformer;\n  }\n\n  /** Sets the given security manager, replacing any previously set security manager. */\n  public EvaluatorBuilder setSecurityManager(@Nullable SecurityManager manager) {\n    this.securityManager = manager;\n    return this;\n  }\n\n  public EvaluatorBuilder unsetSecurityManager() {\n    this.securityManager = null;\n    return this;\n  }\n\n  /** Returns the currently set security manager. */\n  public @Nullable SecurityManager getSecurityManager() {\n    return securityManager;\n  }\n\n  /**\n   * Sets the set of URI patterns to be allowed when importing modules.\n   *\n   * @throws IllegalStateException if {@link #setSecurityManager(SecurityManager)} was also called.\n   */\n  public EvaluatorBuilder setAllowedModules(Collection<Pattern> patterns) {\n    if (securityManager != null) {\n      throw new IllegalStateException(\n          \"Cannot call both `setSecurityManager` and `setAllowedModules`, because both define security manager settings.\");\n    }\n    securityManagerBuilder.setAllowedModules(patterns);\n    return this;\n  }\n\n  /** Returns the set of patterns to be allowed when importing modules. */\n  public List<Pattern> getAllowedModules() {\n    return securityManagerBuilder.getAllowedModules();\n  }\n\n  /**\n   * Sets the set of URI patterns to be allowed when reading resources.\n   *\n   * @throws IllegalStateException if {@link #setSecurityManager(SecurityManager)} was also called.\n   */\n  public EvaluatorBuilder setAllowedResources(Collection<Pattern> patterns) {\n    if (securityManager != null) {\n      throw new IllegalStateException(\n          \"Cannot call both `setSecurityManager` and `setAllowedResources`, because both define security manager settings.\");\n    }\n    securityManagerBuilder.setAllowedResources(patterns);\n    return this;\n  }\n\n  /** Returns the set of patterns to be allowed when reading resources. */\n  public List<Pattern> getAllowedResources() {\n    return securityManagerBuilder.getAllowedResources();\n  }\n\n  /**\n   * Sets the root directory, which restricts access to file-based modules and resources located\n   * under this directory.\n   */\n  public EvaluatorBuilder setRootDir(@Nullable Path rootDir) {\n    securityManagerBuilder.setRootDir(rootDir);\n    return this;\n  }\n\n  /** Returns the currently set root directory, if set. */\n  public @Nullable Path getRootDir() {\n    return securityManagerBuilder.getRootDir();\n  }\n\n  /** Sets the given logger, replacing any previously set logger. */\n  public EvaluatorBuilder setLogger(Logger logger) {\n    this.logger = logger;\n    return this;\n  }\n\n  /** Returns the currently set logger. */\n  public Logger getLogger() {\n    return logger;\n  }\n\n  /**\n   * Sets the HTTP client to be used.\n   *\n   * <p>Defaults to {@code HttpClient.builder().buildLazily()}.\n   */\n  public EvaluatorBuilder setHttpClient(HttpClient httpClient) {\n    this.httpClient = httpClient;\n    return this;\n  }\n\n  /** Returns the currently set HTTP client. */\n  public HttpClient getHttpClient() {\n    return httpClient;\n  }\n\n  /**\n   * Adds the given module key factory. Factories will be asked to resolve module keys in the order\n   * they have been added to this builder.\n   */\n  public EvaluatorBuilder addModuleKeyFactory(ModuleKeyFactory factory) {\n    moduleKeyFactories.add(factory);\n    return this;\n  }\n\n  /**\n   * Adds the given module key factories. Factories will be asked to resolve module keys in the\n   * order they have been added to this builder.\n   */\n  public EvaluatorBuilder addModuleKeyFactories(Collection<ModuleKeyFactory> factories) {\n    moduleKeyFactories.addAll(factories);\n    return this;\n  }\n\n  /** Removes any existing module key factories, then adds the given factories. */\n  public EvaluatorBuilder setModuleKeyFactories(Collection<ModuleKeyFactory> factories) {\n    moduleKeyFactories.clear();\n    return addModuleKeyFactories(factories);\n  }\n\n  /** Returns the currently set module key factories. */\n  public List<ModuleKeyFactory> getModuleKeyFactories() {\n    return moduleKeyFactories;\n  }\n\n  public EvaluatorBuilder addResourceReader(ResourceReader reader) {\n    resourceReaders.add(reader);\n    return this;\n  }\n\n  public EvaluatorBuilder addResourceReaders(Collection<ResourceReader> readers) {\n    resourceReaders.addAll(readers);\n    return this;\n  }\n\n  public EvaluatorBuilder setResourceReaders(Collection<ResourceReader> readers) {\n    resourceReaders.clear();\n    return addResourceReaders(readers);\n  }\n\n  /** Returns the currently set resource readers. */\n  public List<ResourceReader> getResourceReaders() {\n    return resourceReaders;\n  }\n\n  /**\n   * Adds the given environment variable, overriding any environment variable previously added under\n   * the same name.\n   *\n   * <p>Pkl code can read environment variables with {@code read(\"env:<NAME>\")}.\n   */\n  public EvaluatorBuilder addEnvironmentVariable(String name, String value) {\n    environmentVariables.put(name, value);\n    return this;\n  }\n\n  /**\n   * Adds the given environment variables, overriding any environment variables previously added\n   * under the same name.\n   *\n   * <p>Pkl code can read environment variables with {@code read(\"env:<NAME>\")}.\n   */\n  public EvaluatorBuilder addEnvironmentVariables(Map<String, String> envVars) {\n    environmentVariables.putAll(envVars);\n    return this;\n  }\n\n  /** Removes any existing environment variables, then adds the given environment variables. */\n  public EvaluatorBuilder setEnvironmentVariables(Map<String, String> envVars) {\n    environmentVariables.clear();\n    return addEnvironmentVariables(envVars);\n  }\n\n  /** Returns the currently set environment variables. */\n  public Map<String, String> getEnvironmentVariables() {\n    return environmentVariables;\n  }\n\n  /**\n   * Adds the given external property, overriding any property previously set under the same name.\n   *\n   * <p>Pkl code can read external properties with {@code read(\"prop:<name>\")}.\n   */\n  public EvaluatorBuilder addExternalProperty(String name, String value) {\n    externalProperties.put(name, value);\n    return this;\n  }\n\n  /**\n   * Adds the given external properties, overriding any properties previously set under the same\n   * name.\n   *\n   * <p>Pkl code can read external properties with {@code read(\"prop:<name>\")}.\n   */\n  public EvaluatorBuilder addExternalProperties(Map<String, String> properties) {\n    externalProperties.putAll(properties);\n    return this;\n  }\n\n  /** Removes any existing external properties, then adds the given properties. */\n  public EvaluatorBuilder setExternalProperties(Map<String, String> properties) {\n    externalProperties.clear();\n    return addExternalProperties(properties);\n  }\n\n  /** Returns the currently set external properties. */\n  public Map<String, String> getExternalProperties() {\n    return externalProperties;\n  }\n\n  /**\n   * Sets an evaluation timeout to be enforced by the {@link Evaluator}'s {@code evaluate} methods.\n   */\n  public EvaluatorBuilder setTimeout(@Nullable java.time.Duration timeout) {\n    this.timeout = timeout;\n    return this;\n  }\n\n  /** Returns the currently set evaluation timeout. */\n  public java.time.@Nullable Duration getTimeout() {\n    return timeout;\n  }\n\n  /**\n   * Sets the directory where `package:` modules are cached.\n   *\n   * <p>If {@code null}, the module cache is disabled.\n   */\n  public EvaluatorBuilder setModuleCacheDir(@Nullable Path moduleCacheDir) {\n    this.moduleCacheDir = moduleCacheDir;\n    return this;\n  }\n\n  /**\n   * Returns the directory where `package:` modules are cached. If {@code null}, the module cache is\n   * disabled.\n   */\n  public @Nullable Path getModuleCacheDir() {\n    return moduleCacheDir;\n  }\n\n  /**\n   * Sets the desired output format, if any.\n   *\n   * <p>By default, modules support the formats described by {@link OutputFormat}. and fall back to\n   * {@link OutputFormat#PCF} if no format is specified.\n   *\n   * <p>Modules that override {@code output.renderer} in their source code may ignore this option or\n   * may support formats other than those described by {@link OutputFormat}. In particular, most\n   * templates ignore this option and always render the same format.\n   */\n  public EvaluatorBuilder setOutputFormat(@Nullable String outputFormat) {\n    this.outputFormat = outputFormat;\n    return this;\n  }\n\n  /**\n   * Sets the desired output format, if any.\n   *\n   * <p>By default, modules support the formats described by {@link OutputFormat}. and fall back to\n   * {@link OutputFormat#PCF} if no format is specified.\n   *\n   * <p>Modules that override {@code output.renderer} in their source code may ignore this option or\n   * may support formats other than those described by {@link OutputFormat}. In particular, most\n   * templates ignore this option and always render the same format.\n   */\n  public EvaluatorBuilder setOutputFormat(@Nullable OutputFormat outputFormat) {\n    this.outputFormat = outputFormat == null ? null : outputFormat.toString();\n    return this;\n  }\n\n  /** Returns the currently set output format, if any. */\n  public @Nullable String getOutputFormat() {\n    return outputFormat;\n  }\n\n  /** Sets the project dependencies for the evaluator. */\n  public EvaluatorBuilder setProjectDependencies(DeclaredDependencies dependencies) {\n    this.dependencies = dependencies;\n    return this;\n  }\n\n  public @Nullable DeclaredDependencies getProjectDependencies() {\n    return this.dependencies;\n  }\n\n  /** Sets whether calls to trace() produce indented, multi-line output. */\n  public EvaluatorBuilder setTraceMode(TraceMode traceMode) {\n    this.traceMode = traceMode;\n    return this;\n  }\n\n  /** Returns whether calls to trace() produce indented, multi-line output. */\n  public TraceMode getTraceMode() {\n    return this.traceMode;\n  }\n\n  /** Sets whether power assertions are enabled. */\n  public EvaluatorBuilder setPowerAssertionsEnabled(boolean powerAssertions) {\n    this.powerAssertionsEnabled = powerAssertions;\n    return this;\n  }\n\n  /** Returns whether power assertions are enabled. */\n  public boolean getPowerAssertionsEnabled() {\n    return powerAssertionsEnabled;\n  }\n\n  /**\n   * Given a project, sets its dependencies, and also applies any evaluator settings if set.\n   *\n   * @throws IllegalStateException if {@link #setSecurityManager(SecurityManager)} was also called.\n   */\n  public EvaluatorBuilder applyFromProject(Project project) {\n    this.dependencies = project.getDependencies();\n    var settings = project.getEvaluatorSettings();\n    if (securityManager != null) {\n      throw new IllegalStateException(\n          \"Cannot call both `setSecurityManager` and `setProject`, because both define security manager settings. Call `setProjectOnly` if the security manager is desired.\");\n    }\n    if (settings.allowedModules() != null) {\n      setAllowedModules(settings.allowedModules());\n    }\n    if (settings.allowedResources() != null) {\n      setAllowedResources(settings.allowedResources());\n    }\n    if (settings.externalProperties() != null) {\n      setExternalProperties(settings.externalProperties());\n    }\n    if (settings.env() != null) {\n      setEnvironmentVariables(settings.env());\n    }\n    if (settings.timeout() != null) {\n      setTimeout(settings.timeout().toJavaDuration());\n    }\n    if (settings.modulePath() != null) {\n      // indirectly closed by `ModuleKeyFactories.closeQuietly(builder.moduleKeyFactories)`\n      var modulePathResolver = new ModulePathResolver(settings.modulePath());\n      addResourceReader(ResourceReaders.modulePath(modulePathResolver));\n      addModuleKeyFactory(ModuleKeyFactories.modulePath(modulePathResolver));\n    }\n    if (settings.rootDir() != null) {\n      setRootDir(settings.rootDir());\n    }\n    if (settings.color() != null) {\n      setColor(settings.color().hasColor());\n    }\n    if (Boolean.TRUE.equals(settings.noCache())) {\n      setModuleCacheDir(null);\n    } else if (settings.moduleCacheDir() != null) {\n      setModuleCacheDir(settings.moduleCacheDir());\n    }\n\n    // this isn't ideal as project and non-project ExternalReaderProcess instances can be dupes\n    var procs = new HashMap<ExternalReader, ExternalReaderProcess>();\n    if (settings.externalModuleReaders() != null) {\n      for (var entry : settings.externalModuleReaders().entrySet()) {\n        addModuleKeyFactory(\n            ModuleKeyFactories.externalProcess(\n                entry.getKey(),\n                procs.computeIfAbsent(entry.getValue(), ExternalReaderProcess::of)));\n      }\n    }\n    if (settings.externalResourceReaders() != null) {\n      for (var entry : settings.externalResourceReaders().entrySet()) {\n        addResourceReader(\n            ResourceReaders.externalProcess(\n                entry.getKey(),\n                procs.computeIfAbsent(entry.getValue(), ExternalReaderProcess::of)));\n      }\n    }\n\n    if (settings.http() != null) {\n      var httpClientBuilder = HttpClient.builder();\n      if (settings.http().proxy() != null) {\n        var noProxy = settings.http().proxy().noProxy();\n        if (noProxy == null) {\n          noProxy = Collections.emptyList();\n        }\n        httpClientBuilder.setProxy(settings.http().proxy().address(), noProxy);\n      }\n      if (settings.http().rewrites() != null) {\n        httpClientBuilder.setRewrites(settings.http().rewrites());\n      }\n      setHttpClient(httpClientBuilder.buildLazily());\n    }\n\n    if (settings.traceMode() != null) {\n      setTraceMode(settings.traceMode());\n    }\n\n    return this;\n  }\n\n  public Evaluator build() {\n    if (securityManager == null) {\n      securityManager = securityManagerBuilder.build();\n    }\n\n    if (stackFrameTransformer == null) {\n      throw new IllegalStateException(\"No stack frame transformer set.\");\n    }\n\n    return new EvaluatorImpl(\n        stackFrameTransformer,\n        color,\n        securityManager,\n        httpClient,\n        new LoggerImpl(logger, stackFrameTransformer),\n        // copy to shield against subsequent modification through builder\n        new ArrayList<>(moduleKeyFactories),\n        new ArrayList<>(resourceReaders),\n        new HashMap<>(environmentVariables),\n        new HashMap<>(externalProperties),\n        timeout,\n        moduleCacheDir,\n        dependencies,\n        outputFormat,\n        traceMode,\n        powerAssertionsEnabled);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/EvaluatorImpl.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.TimeUnit;\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\nimport org.graalvm.polyglot.Context;\nimport org.msgpack.core.MessageBufferPacker;\nimport org.msgpack.core.MessagePack;\nimport org.pkl.core.ast.ConstantValueNode;\nimport org.pkl.core.ast.internal.ToStringNodeGen;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ModuleKeyFactory;\nimport org.pkl.core.module.ProjectDependenciesManager;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.project.DeclaredDependencies;\nimport org.pkl.core.resource.ResourceReader;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.CommandSpecParser;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.ModuleResolver;\nimport org.pkl.core.runtime.ResourceManager;\nimport org.pkl.core.runtime.TestRunner;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmPklBinaryEncoder;\nimport org.pkl.core.runtime.VmStackOverflowException;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.runtime.VmValue;\nimport org.pkl.core.runtime.VmValueRenderer;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\npublic final class EvaluatorImpl implements Evaluator {\n  private final StackFrameTransformer frameTransformer;\n  private final boolean color;\n  private final ModuleResolver moduleResolver;\n  private final Context polyglotContext;\n  private final @Nullable Duration timeout;\n  private final @Nullable ScheduledExecutorService timeoutExecutor;\n  private final SecurityManager securityManager;\n  private final BufferedLogger logger;\n  private final PackageResolver packageResolver;\n  private final VmValueRenderer vmValueRenderer = VmValueRenderer.singleLine(1000);\n  private @Nullable MessageBufferPacker messagePacker;\n\n  public EvaluatorImpl(\n      StackFrameTransformer transformer,\n      boolean color,\n      SecurityManager manager,\n      HttpClient httpClient,\n      Logger logger,\n      Collection<ModuleKeyFactory> factories,\n      Collection<ResourceReader> readers,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      @Nullable Duration timeout,\n      @Nullable Path moduleCacheDir,\n      @Nullable DeclaredDependencies projectDependencies,\n      @Nullable String outputFormat,\n      TraceMode traceMode,\n      boolean powerAssertions) {\n\n    securityManager = manager;\n    frameTransformer = transformer;\n    this.color = color;\n    moduleResolver = new ModuleResolver(factories);\n    this.logger = new BufferedLogger(logger);\n    packageResolver = PackageResolver.getInstance(securityManager, httpClient, moduleCacheDir);\n    polyglotContext =\n        VmUtils.createContext(\n            () -> {\n              VmContext vmContext = VmContext.get(null);\n              vmContext.initialize(\n                  new VmContext.Holder(\n                      transformer,\n                      manager,\n                      httpClient,\n                      moduleResolver,\n                      new ResourceManager(manager, readers),\n                      this.logger,\n                      environmentVariables,\n                      externalProperties,\n                      moduleCacheDir,\n                      outputFormat,\n                      packageResolver,\n                      projectDependencies == null\n                          ? null\n                          : new ProjectDependenciesManager(\n                              projectDependencies, moduleResolver, securityManager),\n                      traceMode,\n                      powerAssertions));\n            });\n    this.timeout = timeout;\n    // NOTE: would probably make sense to share executor between evaluators\n    // (blocked on https://github.com/oracle/graal/issues/1230)\n    timeoutExecutor =\n        timeout == null\n            ? null\n            : Executors.newSingleThreadScheduledExecutor(\n                runnable -> {\n                  Thread t = new Thread(runnable, \"Pkl Timeout Scheduler\");\n                  t.setDaemon(true);\n                  return t;\n                });\n  }\n\n  @Override\n  public PModule evaluate(ModuleSource moduleSource) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          module.force(false);\n          return (PModule) module.export();\n        });\n  }\n\n  @Override\n  public String evaluateOutputText(ModuleSource moduleSource) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var output = VmUtils.readModuleOutput(module);\n          return VmUtils.readTextProperty(output);\n        });\n  }\n\n  public byte[] evaluateOutputBytes(ModuleSource moduleSource) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var output = VmUtils.readModuleOutput(module);\n          var vmBytes = VmUtils.readBytesProperty(output);\n          return vmBytes.export();\n        });\n  }\n\n  @Override\n  public Object evaluateOutputValue(ModuleSource moduleSource) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var output = VmUtils.readModuleOutput(module);\n          var value = VmUtils.readMember(output, Identifier.VALUE);\n          if (value instanceof VmValue vmValue) {\n            vmValue.force(false);\n            return vmValue.export();\n          }\n          return value;\n        });\n  }\n\n  @Override\n  public Map<String, FileOutput> evaluateOutputFiles(ModuleSource moduleSource) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var output = VmUtils.readModuleOutput(module);\n          return VmUtils.readFilesProperty(\n              output, (fileOutput) -> new FileOutputImpl(this, fileOutput));\n        });\n  }\n\n  @Override\n  public Object evaluateExpression(ModuleSource moduleSource, String expression) {\n    // optimization: if the expression is `output.text`, `output.value` or `output.bytes` (the\n    // common cases), read members directly instead of creating new truffle nodes.\n    return switch (expression) {\n      case \"output.text\" -> evaluateOutputText(moduleSource);\n      case \"output.value\" -> evaluateOutputValue(moduleSource);\n      case \"output.bytes\" -> evaluateOutputBytes(moduleSource);\n      default ->\n          doEvaluate(\n              moduleSource,\n              (module) -> {\n                var expressionResult =\n                    VmUtils.evaluateExpression(module, expression, securityManager, moduleResolver);\n                if (expressionResult instanceof VmValue value) {\n                  value.force(false);\n                  return value.export();\n                }\n                return expressionResult;\n              });\n    };\n  }\n\n  private MessageBufferPacker getMessagePacker() {\n    if (messagePacker == null) {\n      messagePacker = MessagePack.newDefaultBufferPacker();\n    }\n    messagePacker.clear();\n    return messagePacker;\n  }\n\n  @Override\n  public byte[] evaluateExpressionPklBinary(ModuleSource moduleSource, String expression) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var expressionResult =\n              switch (expression) {\n                case \"module\" -> module;\n                case \"output.text\" -> VmUtils.readTextProperty(VmUtils.readModuleOutput(module));\n                case \"output.value\" ->\n                    VmUtils.readMember(VmUtils.readModuleOutput(module), Identifier.VALUE);\n                case \"output.bytes\" -> VmUtils.readBytesProperty(VmUtils.readModuleOutput(module));\n                default ->\n                    VmUtils.evaluateExpression(module, expression, securityManager, moduleResolver);\n              };\n          VmValue.force(expressionResult, false);\n\n          var packer = getMessagePacker();\n          new VmPklBinaryEncoder(packer).renderDocument(expressionResult);\n          return packer.toByteArray();\n        });\n  }\n\n  @Override\n  public String evaluateExpressionString(ModuleSource moduleSource, String expression) {\n    // optimization: if the expression is `output.text` (the common case), read members\n    // directly instead of creating new truffle nodes.\n    if (expression.equals(\"output.text\")) {\n      return evaluateOutputText(moduleSource);\n    }\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var expressionResult =\n              VmUtils.evaluateExpression(module, expression, securityManager, moduleResolver);\n          var toStringNode =\n              ToStringNodeGen.create(\n                  VmUtils.unavailableSourceSection(), new ConstantValueNode(expressionResult));\n          var stringified = toStringNode.executeGeneric(VmUtils.createEmptyMaterializedFrame());\n          return (String) stringified;\n        });\n  }\n\n  @Override\n  public ModuleSchema evaluateSchema(ModuleSource moduleSource) {\n    return doEvaluate(moduleSource, (module) -> module.getModuleInfo().getModuleSchema(module));\n  }\n\n  @Override\n  public TestResults evaluateTest(ModuleSource moduleSource, boolean overwrite) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var testRunner = new TestRunner(logger, frameTransformer, overwrite, color);\n          return testRunner.run(module);\n        });\n  }\n\n  @Override\n  public void evaluateCommand(\n      ModuleSource moduleSource,\n      Set<String> reservedFlagNames,\n      Set<String> reservedFlagShortNames,\n      Consumer<CommandSpec> run) {\n    doEvaluate(\n        moduleSource,\n        (module) -> {\n          var commandRunner =\n              new CommandSpecParser(\n                  moduleResolver,\n                  securityManager,\n                  frameTransformer,\n                  color,\n                  reservedFlagNames,\n                  reservedFlagShortNames,\n                  (fileOutput) -> new FileOutputImpl(this, fileOutput));\n          run.accept(commandRunner.parse(module));\n          return null;\n        });\n  }\n\n  @Override\n  public <T> T evaluateOutputValueAs(ModuleSource moduleSource, PClassInfo<T> classInfo) {\n    return doEvaluate(\n        moduleSource,\n        (module) -> {\n          var output = VmUtils.readModuleOutput(module);\n          var value = VmUtils.readMember(output, Identifier.VALUE);\n          var valueClassInfo = VmUtils.getClass(value).getPClassInfo();\n          if (valueClassInfo.equals(classInfo)) {\n            if (value instanceof VmValue vmValue) {\n              vmValue.force(false);\n              //noinspection unchecked\n              return (T) vmValue.export();\n            }\n            //noinspection unchecked\n            return (T) value;\n          }\n          throw moduleOutputValueTypeMismatch(module, classInfo, value, output);\n        });\n  }\n\n  @Override\n  public void close() {\n    // if currently executing, blocks until cancellation has completed (see\n    // https://github.com/oracle/graal/issues/1230)\n    polyglotContext.close(true);\n    try {\n      packageResolver.close();\n    } catch (IOException ignored) {\n    }\n\n    if (timeoutExecutor != null) {\n      timeoutExecutor.shutdown();\n    }\n  }\n\n  String evaluateOutputText(VmTyped fileOutput) {\n    return doEvaluate(() -> VmUtils.readTextProperty(fileOutput));\n  }\n\n  byte[] evaluateOutputBytes(VmTyped fileOutput) {\n    return doEvaluate(() -> VmUtils.readBytesProperty(fileOutput).export());\n  }\n\n  private <T> T doEvaluate(Supplier<T> supplier) {\n    @Nullable TimeoutTask timeoutTask = null;\n    logger.clear();\n    if (timeout != null) {\n      assert timeoutExecutor != null;\n      timeoutTask = new TimeoutTask();\n      timeoutExecutor.schedule(timeoutTask, timeout.toMillis(), TimeUnit.MILLISECONDS);\n    }\n\n    polyglotContext.enter();\n    T evalResult;\n    // There is a chance that a timeout is triggered just when evaluation completes on its own.\n    // In this case, if evaluation completed normally or with an expected exception (VmException),\n    // nevertheless report the timeout. (For technical reasons, timeout implies that evaluator is\n    // being closed,\n    // which needs to be communicated to the client.)\n    // If evaluation completed with an unexpected exception (translated to PklBugException) or\n    // error,\n    // report that instead of the timeout so as not to swallow a fundamental problem.\n    try {\n      evalResult = supplier.get();\n    } catch (VmStackOverflowException e) {\n      if (VmUtils.isPklBug(e)) {\n        throw new VmExceptionBuilder()\n            .bug(\"Stack overflow\")\n            .withCause(e.getCause())\n            .build()\n            .toPklException(frameTransformer, color);\n      }\n      handleTimeout(timeoutTask);\n      throw e.toPklException(frameTransformer, color);\n    } catch (VmException e) {\n      handleTimeout(timeoutTask);\n      throw e.toPklException(frameTransformer, color);\n    } catch (PklException e) {\n      // evaluateCommand can throw PklException from the CLI layer, pass them through\n      throw e;\n    } catch (Exception e) {\n      throw new PklBugException(e);\n    } catch (ExceptionInInitializerError e) {\n      if (!(e.getCause() instanceof VmException vmException)) {\n        throw new PklBugException(e);\n      }\n      var pklException = vmException.toPklException(frameTransformer, color);\n      var error = new ExceptionInInitializerError(pklException);\n      error.setStackTrace(e.getStackTrace());\n      throw new PklBugException(error);\n    } catch (Throwable e) {\n      if (e.getClass()\n          .getName()\n          .equals(\"com.oracle.truffle.polyglot.PolyglotEngineImpl$CancelExecution\")) {\n        // Truffle canceled evaluation in response to polyglotContext.close(true) triggered by\n        // TimeoutTask\n        handleTimeout(timeoutTask);\n        throw PklBugException.unreachableCode();\n      } else {\n        throw e;\n      }\n    } finally {\n      try {\n        polyglotContext.leave();\n      } catch (IllegalStateException ignored) {\n        // happens if evaluation has already been canceled with polyglotContext.close(true)\n      }\n    }\n\n    handleTimeout(timeoutTask);\n    return evalResult;\n  }\n\n  private <T> T doEvaluate(ModuleSource moduleSource, Function<VmTyped, T> doEvaluate) {\n    return doEvaluate(\n        () -> {\n          var moduleKey = moduleResolver.resolve(moduleSource);\n          var module = VmLanguage.get(null).loadModule(moduleKey);\n          return doEvaluate.apply(module);\n        });\n  }\n\n  private void handleTimeout(@Nullable TimeoutTask timeoutTask) {\n    if (timeoutTask == null || timeoutTask.cancel()) return;\n\n    assert timeout != null;\n    // TODO: use a different exception type so that clients can tell apart timeouts from other\n    // errors\n    throw new PklException(\n        ErrorMessages.create(\n            \"evaluationTimedOut\", (timeout.getSeconds() + timeout.getNano() / 1_000_000_000d)));\n  }\n\n  private VmException moduleOutputValueTypeMismatch(\n      VmTyped module, PClassInfo<?> expectedClassInfo, Object value, VmTyped output) {\n    var moduleUri = module.getModuleInfo().getModuleKey().getUri();\n    var builder =\n        new VmExceptionBuilder()\n            .evalError(\n                \"invalidModuleOutput\",\n                \"output.value\",\n                expectedClassInfo.getDisplayName(),\n                VmUtils.getClass(value).getPClassInfo().getDisplayName(),\n                moduleUri);\n    var outputValueMember = output.getMember(Identifier.VALUE);\n    assert outputValueMember != null;\n    var uriOfValueMember = outputValueMember.getSourceSection().getSource().getURI();\n    // If `value` was explicitly re-assigned, show that in the stack trace.\n    // Otherwise, show the module header.\n    if (!uriOfValueMember.equals(PClassInfo.pklBaseUri)) {\n      return builder\n          .withSourceSection(outputValueMember.getBodySection())\n          .withMemberName(\"value\")\n          .build();\n    } else {\n      // if the module does not extend or amend anything, suggest amending the module URI\n      if (module.getParent() != null\n          && module.getParent().getVmClass().equals(BaseModule.getModuleClass())\n          && expectedClassInfo.isModuleClass()) {\n        builder.withHint(\n            String.format(\n                \"Try adding `amends %s` to the module header.\",\n                vmValueRenderer.render(expectedClassInfo.getModuleUri().toString())));\n      }\n      return builder\n          .withSourceSection(module.getModuleInfo().getHeaderSection())\n          .withMemberName(module.getModuleInfo().getModuleName())\n          .build();\n    }\n  }\n\n  // ScheduledFuture.cancel() is problematic, so let's handle cancellation on our own\n  private final class TimeoutTask implements Runnable {\n    // both fields guarded by synchronizing on `this`\n    private boolean started = false;\n    private boolean cancelled = false;\n\n    @Override\n    public void run() {\n      synchronized (this) {\n        if (cancelled) return;\n\n        started = true;\n      }\n\n      // may take a while\n      close();\n    }\n\n    /** Returns `true` if this task was successfully cancelled before it had started. */\n    public synchronized boolean cancel() {\n      if (started) return false;\n\n      cancelled = true;\n      return true;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/FileOutput.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/** Java representation of {@code pkl.base#FileOutput}. */\npublic interface FileOutput {\n  /**\n   * Returns the text content of this file.\n   *\n   * @throws PklException if an error occurs during evaluation.\n   */\n  String getText();\n\n  /**\n   * Returns the byte contents of this file.\n   *\n   * @throws PklException if an error occurs during evaluation.\n   */\n  byte[] getBytes();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/FileOutputImpl.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport org.graalvm.polyglot.PolyglotException;\nimport org.pkl.core.runtime.VmTyped;\n\nfinal class FileOutputImpl implements FileOutput {\n  private final VmTyped fileOutput;\n  private final EvaluatorImpl evaluator;\n\n  FileOutputImpl(EvaluatorImpl evaluator, VmTyped fileOutput) {\n    this.evaluator = evaluator;\n    this.fileOutput = fileOutput;\n  }\n\n  /**\n   * Evaluates the text output of this file.\n   *\n   * <p>Will throw {@link PklException} if a normal evaluator error occurs.\n   *\n   * <p>If the evaluator that produced this {@link FileOutput} is closed, an error will be thrown.\n   */\n  public String getText() {\n    try {\n      return evaluator.evaluateOutputText(fileOutput);\n    } catch (PolyglotException e) {\n      if (e.isCancelled()) {\n        throw new PklException(\"The evaluator is no longer available\", e);\n      }\n      throw new PklBugException(e);\n    }\n  }\n\n  @Override\n  public byte[] getBytes() {\n    try {\n      return evaluator.evaluateOutputBytes(fileOutput);\n    } catch (PolyglotException e) {\n      if (e.isCancelled()) {\n        throw new PklException(\"The evaluator is no longer available\", e);\n      }\n      throw new PklBugException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ImportGraph.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.TreeMap;\nimport java.util.TreeSet;\nimport org.pkl.core.util.json.Json;\nimport org.pkl.core.util.json.Json.FormatException;\nimport org.pkl.core.util.json.Json.JsArray;\nimport org.pkl.core.util.json.Json.JsObject;\nimport org.pkl.core.util.json.Json.JsonParseException;\nimport org.pkl.core.util.json.Json.MappingException;\n\n/**\n * Java representation of {@code pkl.analyze#ImportGraph}.\n *\n * @param imports The graph of imports declared within the program.\n *     <p>Each key is a module inside the program, and each value is the module URIs declared as\n *     imports inside that module. The set of all dependent modules within a program is the set of\n *     keys in this map.\n * @param resolvedImports A mapping of a module's in-language URI, and the URI that it resolves to.\n *     <p>For example, a local package dependency is represented with scheme {@code\n *     projectpackage:}, and (typically) resolves to a {@code file:} scheme.\n */\npublic record ImportGraph(Map<URI, Set<Import>> imports, Map<URI, URI> resolvedImports) {\n  /**\n   * Java representation of {@code pkl.analyze#Import}.\n   *\n   * @param uri The absolute URI of the import.\n   */\n  public record Import(URI uri) implements Comparable<Import> {\n    @Override\n    public int compareTo(Import o) {\n      return uri.compareTo(o.uri());\n    }\n  }\n\n  /** Parses the provided JSON into an import graph. */\n  public static ImportGraph parseFromJson(String input) throws JsonParseException {\n    var parsed = Json.parseObject(input);\n    var imports = parseImports(parsed.getObject(\"imports\"));\n    var resolvedImports = parseResolvedImports(parsed.getObject(\"resolvedImports\"));\n    return new ImportGraph(imports, resolvedImports);\n  }\n\n  private static Map<URI, Set<Import>> parseImports(Json.JsObject jsObject)\n      throws JsonParseException {\n    var ret = new TreeMap<URI, Set<Import>>();\n    for (var entry : jsObject.entrySet()) {\n      try {\n        var key = new URI(entry.getKey());\n        var value = entry.getValue();\n        var set = new TreeSet<Import>();\n        if (!(value instanceof JsArray array)) {\n          throw new FormatException(\"array\", value.getClass());\n        }\n        for (var elem : array) {\n          if (!(elem instanceof JsObject importObj)) {\n            throw new FormatException(\"object\", elem.getClass());\n          }\n          set.add(parseImport(importObj));\n        }\n        ret.put(key, set);\n      } catch (URISyntaxException e) {\n        throw new MappingException(entry.getKey(), e);\n      }\n    }\n    return ret;\n  }\n\n  private static ImportGraph.Import parseImport(Json.JsObject jsObject) throws JsonParseException {\n    var uri = jsObject.getURI(\"uri\");\n    return new Import(uri);\n  }\n\n  private static Map<URI, URI> parseResolvedImports(Json.JsObject jsObject)\n      throws JsonParseException {\n    var ret = new TreeMap<URI, URI>();\n    for (var entry : jsObject.entrySet()) {\n      try {\n        var key = new URI(entry.getKey());\n        var value = entry.getValue();\n        if (!(value instanceof String str)) {\n          throw new FormatException(\"string\", value.getClass());\n        }\n        var valueUri = new URI(str);\n        ret.put(key, valueUri);\n      } catch (URISyntaxException e) {\n        throw new MappingException(entry.getKey(), e);\n      }\n    }\n    return ret;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/JsonRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.io.Writer;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.json.JsonWriter;\n\nfinal class JsonRenderer implements ValueRenderer {\n  private final JsonWriter writer;\n  private final boolean omitNullProperties;\n\n  public JsonRenderer(Writer writer, String indent, boolean omitNullProperties) {\n    this.writer = new JsonWriter(writer);\n    this.writer.setIndent(indent);\n    this.omitNullProperties = omitNullProperties;\n  }\n\n  @Override\n  public void renderDocument(Object value) {\n    // JSON document can have any top-level value\n    // https://stackoverflow.com/a/3833312\n    // http://www.ietf.org/rfc/rfc7159.txt\n    renderValue(value);\n    try {\n      writer.newline();\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n  }\n\n  @Override\n  public void renderValue(Object value) {\n    new Visitor().visit(value);\n  }\n\n  private class Visitor implements ValueVisitor {\n    @Override\n    public void visitString(String value) {\n      try {\n        writer.value(value);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      try {\n        writer.value(value);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      try {\n        writer.value(value);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      try {\n        writer.value(value);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitDuration(Duration value) {\n      throw new RendererException(\n          String.format(\"Values of type `Duration` cannot be rendered as JSON. Value: %s\", value));\n    }\n\n    @Override\n    public void visitDataSize(DataSize value) {\n      throw new RendererException(\n          String.format(\"Values of type `DataSize` cannot be rendered as JSON. Value: %s\", value));\n    }\n\n    @Override\n    public void visitBytes(byte[] value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Bytes` cannot be rendered as JSON. Value: %s\", (Object) value));\n    }\n\n    @Override\n    public void visitPair(Pair<?, ?> value) {\n      try {\n        writer.beginArray();\n        visit(value.getFirst());\n        visit(value.getSecond());\n        writer.endArray();\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitList(List<?> value) {\n      doVisitCollection(value);\n    }\n\n    @Override\n    public void visitSet(Set<?> value) {\n      doVisitCollection(value);\n    }\n\n    @Override\n    public void visitMap(Map<?, ?> value) {\n      for (var key : value.keySet()) {\n        if (!(key instanceof String)) {\n          throw new RendererException(\n              String.format(\n                  \"Maps containing non-String keys cannot be rendered as JSON. Key: %s\", key));\n        }\n      }\n\n      @SuppressWarnings(\"unchecked\")\n      var mapValue = (Map<String, ?>) value;\n      doVisitProperties(mapValue);\n    }\n\n    @Override\n    public void visitObject(PObject value) {\n      doVisitProperties(value.getProperties());\n    }\n\n    @Override\n    public void visitModule(PModule value) {\n      doVisitProperties(value.getProperties());\n    }\n\n    @Override\n    public void visitNull() {\n      try {\n        writer.nullValue();\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitClass(PClass value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Class` cannot be rendered as JSON. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitTypeAlias(TypeAlias value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `TypeAlias` cannot be rendered as JSON. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitRegex(Pattern value) {\n      throw new RendererException(\n          String.format(\"Values of type `Regex` cannot be rendered as JSON. Value: %s\", value));\n    }\n\n    private void doVisitCollection(Collection<?> collection) {\n      try {\n        writer.beginArray();\n        for (var elem : collection) visit(elem);\n        writer.endArray();\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    private void doVisitProperties(Map<String, ?> properties) {\n      try {\n        writer.beginObject();\n\n        for (var entry : properties.entrySet()) {\n          var value = entry.getValue();\n\n          if (omitNullProperties && value instanceof PNull) continue;\n\n          writer.name(entry.getKey());\n          visit(value);\n        }\n\n        writer.endObject();\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Logger.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/**\n * SPI for log messages emitted by the Pkl evaluator. Use {@link EvaluatorBuilder#setLogger} to set\n * a logger. See {@link Loggers} for predefined loggers.\n */\n@SuppressWarnings(\"unused\")\npublic interface Logger {\n  /** Logs the given message on level TRACE. */\n  default void trace(String message, StackFrame frame) {}\n\n  /** Logs the given message on level WARN. */\n  default void warn(String message, StackFrame frame) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Loggers.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.PrintStream;\nimport java.io.PrintWriter;\n\n/** Predefined {@link Logger}s. */\n@SuppressWarnings(\"unused\")\npublic final class Loggers {\n  private Loggers() {}\n\n  /** Returns a logger that discards log messages. */\n  public static Logger noop() {\n    return new Logger() {\n      @Override\n      public void trace(String message, StackFrame frame) {\n        // do nothing\n      }\n\n      @Override\n      public void warn(String message, StackFrame frame) {\n        // do nothing\n      }\n    };\n  }\n\n  /** Returns a logger that sends log messages to standard error. */\n  public static Logger stdErr() {\n    return stream(System.err);\n  }\n\n  /** Returns a logger that sends log messages to the given stream. */\n  @SuppressWarnings(\"DuplicatedCode\")\n  public static Logger stream(PrintStream stream) {\n    return new Logger() {\n      @Override\n      public void trace(String message, StackFrame frame) {\n        stream.println(formatMessage(\"TRACE\", message, frame));\n        stream.flush();\n      }\n\n      @Override\n      public void warn(String message, StackFrame frame) {\n        stream.println(formatMessage(\"WARN\", message, frame));\n        stream.flush();\n      }\n    };\n  }\n\n  /** Returns a logger that sends log messages to the given writer. */\n  @SuppressWarnings(\"DuplicatedCode\")\n  public static Logger writer(PrintWriter writer) {\n    return new Logger() {\n      @Override\n      public void trace(String message, StackFrame frame) {\n        writer.println(formatMessage(\"TRACE\", message, frame));\n        writer.flush();\n      }\n\n      @Override\n      public void warn(String message, StackFrame frame) {\n        writer.println(formatMessage(\"WARN\", message, frame));\n        writer.flush();\n      }\n    };\n  }\n\n  private static String formatMessage(String level, String message, StackFrame frame) {\n    return \"pkl: \"\n        + level\n        + \": \"\n        + message\n        + (message.endsWith(\"\\n\") ? \"\" : \" \")\n        + \"(\"\n        + frame.getModuleUri()\n        + ')';\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Member.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport org.pkl.core.util.Nullable;\n\n/** Common base class for TypeAlias, PClass, PClass.Property, and PClass.Method. */\npublic abstract class Member implements Serializable {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final @Nullable String docComment;\n  private final SourceLocation sourceLocation;\n  private final Set<Modifier> modifiers;\n  private final List<PObject> annotations;\n  private final String simpleName;\n\n  public Member(\n      @Nullable String docComment,\n      SourceLocation sourceLocation,\n      Set<Modifier> modifiers,\n      List<PObject> annotations,\n      String simpleName) {\n    this.docComment = docComment;\n    this.sourceLocation = Objects.requireNonNull(sourceLocation, \"sourceLocation\");\n    this.modifiers = Objects.requireNonNull(modifiers, \"modifiers\");\n    this.annotations = Objects.requireNonNull(annotations, \"annotations\");\n    this.simpleName = Objects.requireNonNull(simpleName, \"simpleName\");\n  }\n\n  /** Returns the name of the module that this member is declared in. */\n  public abstract String getModuleName();\n\n  /** Returns the documentation comment of this member. */\n  public @Nullable String getDocComment() {\n    return docComment;\n  }\n\n  /** Returns the source location, such as start and end line, of this member. */\n  public SourceLocation getSourceLocation() {\n    return sourceLocation;\n  }\n\n  /** Returns the modifiers of this member. */\n  public Set<Modifier> getModifiers() {\n    return modifiers;\n  }\n\n  /** Returns the annotations of this member. */\n  public List<PObject> getAnnotations() {\n    return annotations;\n  }\n\n  /** Tells if this member has an {@code external} modifier. */\n  public boolean isExternal() {\n    return modifiers.contains(Modifier.EXTERNAL);\n  }\n\n  /** Tells if this member has an {@code abstract} modifier. */\n  public boolean isAbstract() {\n    return modifiers.contains(Modifier.ABSTRACT);\n  }\n\n  /** Tells if this member has a {@code hidden} modifier. */\n  public boolean isHidden() {\n    return modifiers.contains(Modifier.HIDDEN);\n  }\n\n  /** Tells if this member has an {@code open} modifier. */\n  public boolean isOpen() {\n    return modifiers.contains(Modifier.OPEN);\n  }\n\n  /** Tells if this member is defined in Pkl's standard library. */\n  public final boolean isStandardLibraryMember() {\n    return getModuleName().startsWith(\"pkl.\");\n  }\n\n  /** Returns the unqualified name of this member. */\n  public String getSimpleName() {\n    return simpleName;\n  }\n\n  /**\n   * The source location of a {@link Member}.\n   *\n   * @param startLine the first line of the member\n   * @param endLine the last line of the member\n   */\n  public record SourceLocation(int startLine, int endLine) implements Serializable {\n    @Serial private static final long serialVersionUID = 0L;\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #startLine()}.\n     */\n    @Deprecated(forRemoval = true)\n    public int getStartLine() {\n      return startLine;\n    }\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #endLine()}.\n     */\n    @Deprecated(forRemoval = true)\n    public int getEndLine() {\n      return endLine;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Modifier.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\npublic enum Modifier {\n  ABSTRACT(\"abstract\"),\n  OPEN(\"open\"),\n  HIDDEN(\"hidden\"),\n  EXTERNAL(\"external\");\n\n  private final String displayName;\n\n  Modifier(String displayName) {\n    this.displayName = displayName;\n  }\n\n  @Override\n  public String toString() {\n    return displayName;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ModuleSchema.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.net.URI;\nimport java.util.*;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\n/** Describes the property, method and class members of a module. */\npublic final class ModuleSchema {\n  private final URI moduleUri;\n  private final String moduleName;\n  private final boolean isAmend;\n  private final @Nullable ModuleSchema supermodule;\n  private final PClass moduleClass;\n  private final @Nullable String docComment;\n  private final List<PObject> annotations;\n  private final Map<String, PClass> classes;\n  private final Map<String, TypeAlias> typeAliases;\n  private final Map<String, URI> imports;\n\n  @LateInit private Map<String, PClass> __allClasses;\n  @LateInit private Map<String, TypeAlias> __allTypeAliases;\n\n  /** Constructs a {@code ModuleSchema} instance. */\n  public ModuleSchema(\n      URI moduleUri,\n      String moduleName,\n      boolean isAmend,\n      @Nullable ModuleSchema supermodule,\n      PClass moduleClass,\n      @Nullable String docComment,\n      List<PObject> annotations,\n      Map<String, PClass> classes,\n      Map<String, TypeAlias> typeAliases,\n      Map<String, URI> imports) {\n    this.moduleUri = moduleUri;\n    this.moduleName = moduleName;\n    this.isAmend = isAmend;\n    this.supermodule = supermodule;\n    this.moduleClass = moduleClass;\n    this.docComment = docComment;\n    this.annotations = annotations;\n    this.classes = classes;\n    this.typeAliases = typeAliases;\n    this.imports = imports;\n  }\n\n  /** Returns the absolute URI from which this module was first loaded. */\n  public URI getModuleUri() {\n    return moduleUri;\n  }\n\n  /**\n   * Returns the name of this module.\n   *\n   * <p>Note that module names are not guaranteed to be unique, especially if they are not declared\n   * but inferred from the module URI.\n   */\n  public String getModuleName() {\n    return moduleName;\n  }\n\n  /**\n   * Returns the last name part of a dot-separated {@link #getModuleName}, or the entire {@link\n   * #getModuleName} if it is not dot-separated.\n   */\n  public String getShortModuleName() {\n    var index = moduleName.lastIndexOf('.');\n    return moduleName.substring(index + 1);\n  }\n\n  /**\n   * Returns this module's supermodule, or {@code null} if this module does not amend or extend\n   * another module.\n   */\n  public @Nullable ModuleSchema getSupermodule() {\n    return supermodule;\n  }\n\n  /** Tells if this module amends a module (namely {@link #getSupermodule()}). */\n  public boolean isAmend() {\n    return isAmend;\n  }\n\n  /** Tells if this module extends a module (namely {@link #getSupermodule()}). */\n  public boolean isExtend() {\n    return supermodule != null && !isAmend;\n  }\n\n  /** Returns the doc comment of this module (if any). */\n  public @Nullable String getDocComment() {\n    return docComment;\n  }\n\n  /** Returns the annotations of this module. */\n  public List<PObject> getAnnotations() {\n    return annotations;\n  }\n\n  /**\n   * Returns the class of this module, which describes the properties and methods defined in this\n   * module.\n   */\n  public PClass getModuleClass() {\n    return moduleClass;\n  }\n\n  /**\n   * Returns the imports declared in this module.\n   *\n   * <p>Map keys are the identifiers by which imports are accessed within this module. Map values\n   * are the URIs of the imported modules.\n   *\n   * <p>Does not cover import expressions.\n   */\n  public Map<String, URI> getImports() {\n    return imports;\n  }\n\n  /** Returns the classes defined in this module in declaration order. */\n  public Map<String, PClass> getClasses() {\n    return classes;\n  }\n\n  /**\n   * Returns all classes defined in this module and its supermodules in declaration order.\n   * Supermodule classes are ordered before submodule classes.\n   */\n  public Map<String, PClass> getAllClasses() {\n    if (__allClasses == null) {\n      if (supermodule == null) {\n        __allClasses = classes;\n      } else if (classes.isEmpty()) {\n        __allClasses = supermodule.getAllClasses();\n      } else {\n        __allClasses = new LinkedHashMap<>();\n        __allClasses.putAll(supermodule.getAllClasses());\n        __allClasses.putAll(classes);\n      }\n    }\n    return __allClasses;\n  }\n\n  /** Returns the type aliases defined in this module in declaration order. */\n  public Map<String, TypeAlias> getTypeAliases() {\n    return typeAliases;\n  }\n\n  /**\n   * Returns all type aliases defined in this module and its supermodules in declaration order.\n   * Supermodule type aliases are ordered before submodule type aliases.\n   */\n  public Map<String, TypeAlias> getAllTypeAliases() {\n    if (__allTypeAliases == null) {\n      if (supermodule == null) {\n        __allTypeAliases = typeAliases;\n      } else if (typeAliases.isEmpty()) {\n        __allTypeAliases = supermodule.getAllTypeAliases();\n      } else {\n        __allTypeAliases = new LinkedHashMap<>();\n        __allTypeAliases.putAll(supermodule.getAllTypeAliases());\n        __allTypeAliases.putAll(typeAliases);\n      }\n    }\n    return __allTypeAliases;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ModuleSource.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.File;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * A representation for a Pkl module's source URI, and optionally its source text.\n *\n * <p>Create a new module source via {@link #create(URI, String)}, or one of the various helper\n * factory methods.\n */\npublic final class ModuleSource {\n  public static ModuleSource create(URI uri, @Nullable String text) {\n    return new ModuleSource(uri, text);\n  }\n\n  public static ModuleSource path(Path path) {\n    return new ModuleSource(path.toUri(), null);\n  }\n\n  public static ModuleSource path(String path) {\n    return path(Path.of(path));\n  }\n\n  public static ModuleSource text(String text) {\n    return new ModuleSource(VmUtils.REPL_TEXT_URI, text);\n  }\n\n  public static ModuleSource file(String file) {\n    return file(new File(file));\n  }\n\n  public static ModuleSource file(File file) {\n    // File.toPath.toUri() gives more complaint file URIs\n    // than File.toUri() (file:/// vs. file:/ for local files)\n    return new ModuleSource(file.toPath().toUri(), null);\n  }\n\n  public static ModuleSource uri(String uri) {\n    return uri(URI.create(uri));\n  }\n\n  public static ModuleSource uri(URI uri) {\n    return new ModuleSource(uri, null);\n  }\n\n  public static ModuleSource modulePath(String path) {\n    URI uri;\n    if (path.charAt(0) == '/') {\n      uri = URI.create(\"modulepath:\" + path);\n    } else {\n      uri = URI.create(\"modulepath:/\" + path);\n    }\n    return uri(uri);\n  }\n\n  private final URI uri;\n\n  @Nullable private final String contents;\n\n  private ModuleSource(URI uri, @Nullable String contents) {\n    this.uri = uri;\n    this.contents = contents;\n  }\n\n  public URI getUri() {\n    return uri;\n  }\n\n  public @Nullable String getContents() {\n    return contents;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/NoSuchPropertyException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/**\n * Indicates that a nonexistent property was requested for a {@link Composite}. To check if a\n * property exists, use {@link Composite#hasProperty(String)}.\n */\npublic final class NoSuchPropertyException extends RuntimeException {\n  private final String propertyName;\n\n  public NoSuchPropertyException(String message, String propertyName) {\n    super(message);\n    this.propertyName = propertyName;\n  }\n\n  public String getPropertyName() {\n    return propertyName;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/OutputFormat.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/** The output formats that Pkl supports out-of-the-box. */\npublic enum OutputFormat {\n  JSON(\"json\"),\n  JSONNET(\"jsonnet\"),\n  PCF(\"pcf\"),\n  PROPERTIES(\"properties\"),\n  PLIST(\"plist\"),\n  TEXTPROTO(\"textproto\"),\n  XML(\"xml\"),\n  YAML(\"yaml\");\n\n  private final String cliArgument;\n\n  OutputFormat(String cliArgument) {\n    this.cliArgument = cliArgument;\n  }\n\n  /** The argument for CLI option <code>--format</code> that selects this output format. */\n  @Override\n  public String toString() {\n    return cliArgument;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PClass.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.util.*;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a {@code pkl.base#Class} value. */\npublic final class PClass extends Member implements Value {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final PClassInfo<?> classInfo;\n  private final List<TypeParameter> typeParameters;\n  private final Map<String, Property> properties;\n  private final Map<String, Method> methods;\n\n  private @Nullable PType supertype;\n  private @Nullable PClass superclass;\n\n  private @Nullable Map<String, Property> allProperties;\n  private @Nullable Map<String, Method> allMethods;\n\n  public PClass(\n      @Nullable String docComment,\n      SourceLocation sourceLocation,\n      Set<Modifier> modifiers,\n      List<PObject> annotations,\n      PClassInfo<?> classInfo,\n      List<TypeParameter> typeParameters,\n      Map<String, Property> properties,\n      Map<String, Method> methods) {\n    super(docComment, sourceLocation, modifiers, annotations, classInfo.getSimpleName());\n    this.classInfo = classInfo;\n    this.typeParameters = typeParameters;\n    this.properties = properties;\n    this.methods = methods;\n  }\n\n  public void initSupertype(PType supertype, PClass superclass) {\n    this.supertype = supertype;\n    this.superclass = superclass;\n  }\n\n  /**\n   * Returns the name of the module that this class is declared in. Note that a module name is not\n   * guaranteed to be unique, especially if it not declared but inferred from the module URI.\n   */\n  public String getModuleName() {\n    return classInfo.getModuleName();\n  }\n\n  /**\n   * Returns the qualified name of this class, `moduleName#className`. Note that a qualified class\n   * name is not guaranteed to be unique, especially if the module name is not declared but inferred\n   * from the module URI.\n   */\n  public String getQualifiedName() {\n    return classInfo.getQualifiedName();\n  }\n\n  public String getDisplayName() {\n    return classInfo.getDisplayName();\n  }\n\n  public PClassInfo<?> getInfo() {\n    return classInfo;\n  }\n\n  /** Tells if this class is the class of a module. */\n  public boolean isModuleClass() {\n    return getInfo().isModuleClass();\n  }\n\n  public List<TypeParameter> getTypeParameters() {\n    return typeParameters;\n  }\n\n  public @Nullable PType getSupertype() {\n    return supertype;\n  }\n\n  public @Nullable PClass getSuperclass() {\n    return superclass;\n  }\n\n  public Map<String, Property> getProperties() {\n    return properties;\n  }\n\n  public Map<String, Method> getMethods() {\n    return methods;\n  }\n\n  public Map<String, Property> getAllProperties() {\n    if (allProperties == null) {\n      allProperties = collectAllProperties(this, new LinkedHashMap<>());\n    }\n    return allProperties;\n  }\n\n  public Map<String, Method> getAllMethods() {\n    if (allMethods == null) {\n      allMethods = collectAllMethods(this, new LinkedHashMap<>());\n    }\n    return allMethods;\n  }\n\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitClass(this);\n  }\n\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertClass(this);\n  }\n\n  @Override\n  public PClassInfo<?> getClassInfo() {\n    return PClassInfo.Class;\n  }\n\n  public String toString() {\n    return getDisplayName();\n  }\n\n  public abstract static class ClassMember extends Member {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final PClass owner;\n\n    public ClassMember(\n        @Nullable String docComment,\n        SourceLocation sourceLocation,\n        Set<Modifier> modifiers,\n        List<PObject> annotations,\n        String simpleName,\n        PClass owner) {\n      super(docComment, sourceLocation, modifiers, annotations, simpleName);\n      this.owner = owner;\n    }\n\n    /**\n     * @inheritDoc\n     */\n    @Override\n    public String getModuleName() {\n      return owner.getInfo().getModuleName();\n    }\n\n    /** Returns the class declaring this member. */\n    public PClass getOwner() {\n      return owner;\n    }\n\n    /**\n     * Returns the documentation comment of this member. If this member does not have a\n     * documentation comment, returns the documentation comment of the nearest documented ancestor,\n     * if any.\n     */\n    public abstract @Nullable String getInheritedDocComment();\n  }\n\n  public static final class Property extends ClassMember {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final PType type;\n\n    public Property(\n        PClass owner,\n        @Nullable String docComment,\n        SourceLocation sourceLocation,\n        Set<Modifier> modifiers,\n        List<PObject> annotations,\n        String simpleName,\n        PType type) {\n      super(docComment, sourceLocation, modifiers, annotations, simpleName, owner);\n      this.type = type;\n    }\n\n    public PType getType() {\n      return type;\n    }\n\n    @Override\n    public @Nullable String getInheritedDocComment() {\n      if (getDocComment() != null) return getDocComment();\n\n      for (var clazz = getOwner().getSuperclass(); clazz != null; clazz = clazz.getSuperclass()) {\n        var property = clazz.getProperties().get(getSimpleName());\n        if (property != null && property.getDocComment() != null) {\n          return property.getDocComment();\n        }\n      }\n\n      return null;\n    }\n  }\n\n  public static final class Method extends ClassMember {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final List<TypeParameter> typeParameters;\n    private final Map<String, PType> parameters;\n    private final PType returnType;\n\n    public Method(\n        PClass owner,\n        @Nullable String docComment,\n        SourceLocation sourceLocation,\n        Set<Modifier> modifiers,\n        List<PObject> annotations,\n        String simpleName,\n        List<TypeParameter> typeParameters,\n        Map<String, PType> parameters,\n        PType returnType) {\n      super(docComment, sourceLocation, modifiers, annotations, simpleName, owner);\n      this.typeParameters = typeParameters;\n      this.parameters = parameters;\n      this.returnType = returnType;\n    }\n\n    public List<TypeParameter> getTypeParameters() {\n      return typeParameters;\n    }\n\n    public Map<String, PType> getParameters() {\n      return parameters;\n    }\n\n    public PType getReturnType() {\n      return returnType;\n    }\n\n    @Override\n    public @Nullable String getInheritedDocComment() {\n      if (getDocComment() != null) return getDocComment();\n\n      for (var clazz = getOwner().getSuperclass(); clazz != null; clazz = clazz.getSuperclass()) {\n        var method = clazz.getMethods().get(getSimpleName());\n        if (method != null && method.getDocComment() != null) {\n          return method.getDocComment();\n        }\n      }\n\n      return null;\n    }\n  }\n\n  private Map<String, Property> collectAllProperties(\n      PClass clazz, Map<String, Property> collector) {\n    if (clazz.superclass != null) {\n      collectAllProperties(clazz.superclass, collector);\n    }\n    collector.putAll(clazz.properties);\n    return collector;\n  }\n\n  private Map<String, Method> collectAllMethods(PClass clazz, Map<String, Method> collector) {\n    if (clazz.superclass != null) {\n      collectAllMethods(clazz.superclass, collector);\n    }\n    collector.putAll(clazz.methods);\n    return collector;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PClassInfo.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport static java.util.Map.*;\n\nimport java.io.Serial;\nimport java.io.Serializable;\nimport java.net.URI;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.Nullable;\n\n/** Information about a Pkl class and its Java representation. */\n@SuppressWarnings(\"rawtypes\")\npublic final class PClassInfo<T> implements Serializable {\n  @Serial private static final long serialVersionUID = 0L;\n\n  // Simple name of a module's class.\n  // User-facing via `module.getClass()` and error messages.\n  // \"Module\" would result in a name clash between\n  // the module class of `pkl.base` and class `Module` defined in `pkl.base`.\n  public static final String MODULE_CLASS_NAME = \"ModuleClass\";\n\n  public static final URI pklBaseUri = URI.create(\"pkl:base\");\n  public static final URI pklSemverUri = URI.create(\"pkl:semver\");\n  public static final URI pklSettingsUri = URI.create(\"pkl:settings\");\n  public static final URI pklProjectUri = URI.create(\"pkl:Project\");\n\n  public static final PClassInfo<Void> Any = pklBaseClassInfo(\"Any\", Void.class);\n  public static final PClassInfo<PNull> Null = pklBaseClassInfo(\"Null\", PNull.class);\n  public static final PClassInfo<String> String = pklBaseClassInfo(\"String\", String.class);\n  public static final PClassInfo<Boolean> Boolean = pklBaseClassInfo(\"Boolean\", boolean.class);\n  public static final PClassInfo<Void> Number = pklBaseClassInfo(\"Number\", Void.class);\n  public static final PClassInfo<Long> Int = pklBaseClassInfo(\"Int\", long.class);\n  public static final PClassInfo<Double> Float = pklBaseClassInfo(\"Float\", double.class);\n  public static final PClassInfo<Duration> Duration = pklBaseClassInfo(\"Duration\", Duration.class);\n  public static final PClassInfo<DataSize> DataSize = pklBaseClassInfo(\"DataSize\", DataSize.class);\n  public static final PClassInfo<byte[]> Bytes = pklBaseClassInfo(\"Bytes\", byte[].class);\n  public static final PClassInfo<Pair> Pair = pklBaseClassInfo(\"Pair\", Pair.class);\n  public static final PClassInfo<Void> Collection = pklBaseClassInfo(\"Collection\", Void.class);\n  public static final PClassInfo<ArrayList> List = pklBaseClassInfo(\"List\", ArrayList.class);\n  public static final PClassInfo<LinkedHashSet> Set = pklBaseClassInfo(\"Set\", LinkedHashSet.class);\n  public static final PClassInfo<LinkedHashMap> Map = pklBaseClassInfo(\"Map\", LinkedHashMap.class);\n  public static final PClassInfo<PObject> Object = pklBaseClassInfo(\"Object\", PObject.class);\n  public static final PClassInfo<PObject> Dynamic = pklBaseClassInfo(\"Dynamic\", PObject.class);\n  public static final PClassInfo<PObject> Typed = pklBaseClassInfo(\"Typed\", PObject.class);\n  public static final PClassInfo<ArrayList> Listing = pklBaseClassInfo(\"Listing\", ArrayList.class);\n  public static final PClassInfo<LinkedHashMap> Mapping =\n      pklBaseClassInfo(\"Mapping\", LinkedHashMap.class);\n  public static final PClassInfo<PModule> Module = pklBaseClassInfo(\"Module\", PModule.class);\n  public static final PClassInfo<PObject> ModuleOutput =\n      pklBaseClassInfo(\"ModuleOutput\", PObject.class);\n  public static final PClassInfo<PClass> Class = pklBaseClassInfo(\"Class\", PClass.class);\n  public static final PClassInfo<TypeAlias> TypeAlias =\n      pklBaseClassInfo(\"TypeAlias\", TypeAlias.class);\n  public static final PClassInfo<Pattern> Regex = pklBaseClassInfo(\"Regex\", Pattern.class);\n  public static final PClassInfo<PObject> Deprecated =\n      pklBaseClassInfo(\"Deprecated\", PObject.class);\n  public static final PClassInfo<PObject> AlsoKnownAs =\n      pklBaseClassInfo(\"AlsoKnownAs\", PObject.class);\n  public static final PClassInfo<PObject> Unlisted = pklBaseClassInfo(\"Unlisted\", PObject.class);\n  public static final PClassInfo<PObject> DocExample =\n      pklBaseClassInfo(\"DocExample\", PObject.class);\n  public static final PClassInfo<PObject> PcfRenderDirective =\n      pklBaseClassInfo(\"PcfRenderDirective\", PObject.class);\n  public static final PClassInfo<PObject> ModuleInfo =\n      pklBaseClassInfo(\"ModuleInfo\", PObject.class);\n  public static final PClassInfo<PObject> Version =\n      new PClassInfo<>(\"pkl.semver\", \"Version\", PObject.class, pklSemverUri);\n  public static final PClassInfo<PObject> Project =\n      new PClassInfo<>(\"pkl.Project\", \"ModuleClass\", PObject.class, pklProjectUri);\n  public static final PClassInfo<PObject> Settings =\n      new PClassInfo<>(\"pkl.settings\", \"ModuleClass\", PObject.class, pklSettingsUri);\n\n  public static final PClassInfo<Object> Unavailable =\n      new PClassInfo<>(\"unavailable\", \"unavailable\", Object.class, URI.create(\"pkl:unavailable\"));\n\n  /** Returns the class info for the class with the given module and class name. */\n  public static PClassInfo<?> get(String moduleName, String className, URI moduleUri) {\n    if (moduleName.equals(\"pkl.base\")) {\n      var classInfo = pooledPklBaseClassInfos.get(className);\n      if (classInfo != null) return classInfo;\n    }\n    return new PClassInfo<>(moduleName, className, PObject.class, moduleUri);\n  }\n\n  /** Returns the class info for the module class with the given module name. */\n  public static PClassInfo<?> forModuleClass(String moduleName, URI moduleUri) {\n    return get(moduleName, MODULE_CLASS_NAME, moduleUri);\n  }\n\n  /** Returns the class info for the given value's class. */\n  @SuppressWarnings(\"unchecked\")\n  public static <T> PClassInfo<T> forValue(T value) {\n    if (value instanceof Value v) return (PClassInfo<T>) v.getClassInfo();\n\n    if (value instanceof String) return (PClassInfo<T>) String;\n    if (value instanceof Boolean) return (PClassInfo<T>) Boolean;\n    if (value instanceof Long) return (PClassInfo<T>) Int;\n    if (value instanceof Double) return (PClassInfo<T>) Float;\n    if (value instanceof List) return (PClassInfo<T>) List;\n    if (value instanceof Set) return (PClassInfo<T>) Set;\n    if (value instanceof Map) return (PClassInfo<T>) Map;\n    if (value instanceof Pattern) return (PClassInfo<T>) Regex;\n    if (value instanceof byte[]) return (PClassInfo<T>) Bytes;\n\n    throw new IllegalArgumentException(\"Not a Pkl value: \" + value);\n  }\n\n  /**\n   * Returns the name of the module that this Pkl class is declared in. Note that a module name is\n   * not guaranteed to be unique, especially if it not declared but inferred.\n   */\n  public String getModuleName() {\n    return moduleName;\n  }\n\n  /** Returns the simple name of this Pkl class. */\n  public String getSimpleName() {\n    return className;\n  }\n\n  /**\n   * Returns the qualified name of this Pkl class, `moduleName/className`. Note that a qualified\n   * class name is not guaranteed to be unique, especially if the module name is not declared but\n   * inferred.\n   */\n  public String getQualifiedName() {\n    return qualifiedName;\n  }\n\n  public String getDisplayName() {\n    // display `String` rather than `pkl.base#String`, etc.\n    return moduleName.equals(\"pkl.base\") ? className : isModuleClass() ? moduleName : qualifiedName;\n  }\n\n  public boolean isModuleClass() {\n    // should have a better way but this is what we got\n    return className.equals(MODULE_CLASS_NAME);\n  }\n\n  /**\n   * Returns the concrete Java class used to represent values of this Pkl class in Java. Returns\n   * {@code Void.class} for abstract Pkl classes.\n   */\n  public Class<T> getJavaClass() {\n    return javaClass;\n  }\n\n  /** Tells if this Pkl class is external (built-in). */\n  public boolean isExternalClass() {\n    return javaClass != PObject.class;\n  }\n\n  /** Tells if this class is defined in Pkl's standard library. */\n  public boolean isStandardLibraryClass() {\n    return moduleName.startsWith(\"pkl.\");\n  }\n\n  public boolean isConcreteCollectionClass() {\n    return this == PClassInfo.List || this == PClassInfo.Set;\n  }\n\n  public boolean isExactClassOf(Object value) {\n    var clazz = value.getClass();\n    if (clazz != javaClass) return false;\n    if (clazz != PObject.class) return true;\n\n    var pObject = (PObject) value;\n    return pObject.getClassInfo().equals(this);\n  }\n\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof PClassInfo<?> other)) return false;\n    return qualifiedName.equals(other.qualifiedName);\n  }\n\n  public int hashCode() {\n    return qualifiedName.hashCode();\n  }\n\n  public String toString() {\n    return getDisplayName();\n  }\n\n  private static final Map<String, PClassInfo<?>> pooledPklBaseClassInfos =\n      java.util.Map.ofEntries(\n          entry(Any.className, Any),\n          entry(Null.className, Null),\n          entry(Boolean.className, Boolean),\n          entry(String.className, String),\n          entry(Number.className, Number),\n          entry(Int.className, Int),\n          entry(Float.className, Float),\n          entry(Duration.className, Duration),\n          entry(DataSize.className, DataSize),\n          entry(Pair.className, Pair),\n          entry(Collection.className, Collection),\n          entry(List.className, List),\n          entry(Set.className, Set),\n          entry(Map.className, Map),\n          entry(Object.className, Object),\n          entry(Dynamic.className, Dynamic),\n          entry(Typed.className, Typed),\n          entry(Listing.className, Listing),\n          entry(Mapping.className, Mapping),\n          entry(Module.className, Module),\n          entry(ModuleOutput.className, ModuleOutput),\n          entry(Class.className, Class),\n          entry(TypeAlias.className, TypeAlias),\n          entry(Regex.className, Regex),\n          entry(Deprecated.className, Deprecated),\n          entry(AlsoKnownAs.className, AlsoKnownAs),\n          entry(Unlisted.className, Unlisted),\n          entry(DocExample.className, DocExample),\n          entry(PcfRenderDirective.className, PcfRenderDirective));\n\n  private final String moduleName;\n  private final String className;\n  private final URI moduleUri;\n  private final String qualifiedName;\n  private final Class<T> javaClass;\n\n  private PClassInfo(String moduleName, String className, Class<T> javaClass, URI moduleUri) {\n    this.moduleName = moduleName;\n    this.className = className;\n    this.moduleUri = moduleUri;\n    this.qualifiedName = moduleName + \"#\" + className;\n    this.javaClass = javaClass;\n  }\n\n  private static <T> PClassInfo<T> pklBaseClassInfo(String className, Class<T> javaType) {\n    return new PClassInfo<>(\"pkl.base\", className, javaType, pklBaseUri);\n  }\n\n  public URI getModuleUri() {\n    return moduleUri;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PListRenderer.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.io.Writer;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.ArrayCharEscaper;\nimport org.pkl.core.util.ByteArrayUtils;\n\n// To instantiate this class, use ValueRenderers.plist().\nfinal class PListRenderer implements ValueRenderer {\n  private static final String LINE_BREAK = \"\\n\";\n\n  // it's safe (though not required) to escape all of the following characters in XML text nodes\n  private static final ArrayCharEscaper charEscaper =\n      ArrayCharEscaper.builder()\n          .withEscape('\"', \"&quot;\")\n          .withEscape('\\'', \"&apos;\")\n          .withEscape('<', \"&lt;\")\n          .withEscape('>', \"&gt;\")\n          .withEscape('&', \"&amp;\")\n          .build();\n\n  private final Writer writer;\n  private final String indent;\n\n  public PListRenderer(Writer writer, String indent) {\n    this.writer = writer;\n    this.indent = indent;\n  }\n\n  @Override\n  public void renderDocument(Object value) {\n    if (!(value instanceof Collection || value instanceof Map || value instanceof Composite)) {\n      // as far as I can tell, only arrays and dicts are allowed as top-level values\n      // see:\n      // https://github.com/apple/swift/blob/2bf6b88585ba0bc756c8a50c95081fc08f47fbf0/stdlib/public/SDK/Foundation/PlistEncoder.swift#L79\n      throw new RendererException(\n          String.format(\n              \"The top-level value of an XML property list must have type `Collection`, `Map`, or `Composite`, but got type `%s`.\",\n              value.getClass().getTypeName()));\n    }\n\n    write(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\");\n    write(LINE_BREAK);\n    write(\n        \"<!DOCTYPE plist PUBLIC \\\"-//Apple//DTD PLIST 1.0//EN\\\" \\\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\\">\");\n    write(LINE_BREAK);\n    write(\"<plist version=\\\"1.0\\\">\");\n    write(LINE_BREAK);\n\n    new Visitor().visit(value);\n\n    write(LINE_BREAK);\n    write(\"</plist>\");\n    write(LINE_BREAK);\n  }\n\n  @Override\n  public void renderValue(Object value) {\n    new Visitor().visit(value);\n  }\n\n  // keep in sync with org.pkl.core.stdlib.PListRendererNodes.PListRenderer\n  private class Visitor implements ValueVisitor {\n    private String currIndent = \"\";\n\n    @Override\n    public void visitString(String value) {\n      write(\"<string>\");\n      write(charEscaper.escape(value));\n      write(\"</string>\");\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      write(\"<integer>\");\n      write(value.toString());\n      write(\"</integer>\");\n    }\n\n    // according to:\n    // https://www.apple.com/DTDs/PropertyList-1.0.dtd\n    // http://www.atomicbird.com/blog/json-vs-plists (nan, infinity)\n    @Override\n    @SuppressWarnings(\"Duplicates\")\n    public void visitFloat(Double value) {\n      write(\"<real>\");\n\n      if (value.isNaN()) {\n        write(\"nan\");\n      } else if (value == Double.POSITIVE_INFINITY) {\n        write(\"+infinity\");\n      } else if (value == Double.NEGATIVE_INFINITY) {\n        write(\"-infinity\");\n      } else {\n        write(value.toString());\n      }\n\n      write(\"</real>\");\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      write(value ? \"<true/>\" : \"<false/>\");\n    }\n\n    @Override\n    public void visitDuration(Duration value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Duration` cannot be rendered as XML property list. Value: %s\",\n              value));\n    }\n\n    @Override\n    public void visitDataSize(DataSize value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `DataSize` cannot be rendered as XML property list. Value: %s\",\n              value));\n    }\n\n    @Override\n    public void visitBytes(byte[] value) {\n      write(\"<data>\");\n      write(ByteArrayUtils.base64(value));\n      write(\"</data>\");\n    }\n\n    @Override\n    public void visitPair(Pair<?, ?> value) {\n      doVisitIterable(value, false);\n    }\n\n    @Override\n    public void visitList(List<?> value) {\n      doVisitIterable(value, value.isEmpty());\n    }\n\n    @Override\n    public void visitSet(Set<?> value) {\n      doVisitIterable(value, value.isEmpty());\n    }\n\n    @Override\n    public void visitMap(Map<?, ?> map) {\n      var renderedAtLeastOneEntry = false;\n\n      for (var entry : map.entrySet()) {\n        var key = entry.getKey();\n        if (!(key instanceof String)) {\n          throw new RendererException(\n              String.format(\n                  \"Maps with non-String keys cannot be rendered as XML property list. Key: %s\",\n                  key));\n        }\n\n        var value = entry.getValue();\n        if (value instanceof PNull) continue;\n\n        if (!renderedAtLeastOneEntry) {\n          write(\"<dict>\");\n          write(LINE_BREAK);\n          currIndent += indent;\n          renderedAtLeastOneEntry = true;\n        }\n\n        write(currIndent);\n        write(\"<key>\");\n        write(charEscaper.escape((String) key));\n        write(\"</key>\");\n        write(LINE_BREAK);\n\n        write(currIndent);\n        visit(value);\n        write(LINE_BREAK);\n      }\n\n      if (renderedAtLeastOneEntry) {\n        currIndent = currIndent.substring(0, currIndent.length() - indent.length());\n        write(currIndent);\n        write(\"</dict>\");\n      } else {\n        write(\"<dict/>\");\n      }\n    }\n\n    @Override\n    public void visitObject(PObject value) {\n      doVisitComposite(value);\n    }\n\n    @Override\n    public void visitModule(PModule value) {\n      doVisitComposite(value);\n    }\n\n    @Override\n    public void visitNull() {\n      throw new RendererException(\"`null` values cannot be rendered as XML property list.\");\n    }\n\n    @Override\n    public void visitClass(PClass value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Class` cannot be rendered as XML property list. Value: %s\", value));\n    }\n\n    @Override\n    public void visitTypeAlias(TypeAlias value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `TypeAlias` cannot be rendered as XML property list. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitRegex(Pattern value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Regex` cannot be rendered as XML property list. Value: %s\", value));\n    }\n\n    private void doVisitIterable(Iterable<?> iterable, boolean isEmpty) {\n      if (isEmpty) {\n        write(\"<array/>\");\n        return;\n      }\n\n      write(\"<array>\");\n      write(LINE_BREAK);\n      currIndent += indent;\n\n      for (var elem : iterable) {\n        write(currIndent);\n        visit(elem);\n        write(LINE_BREAK);\n      }\n\n      currIndent = currIndent.substring(0, currIndent.length() - indent.length());\n      write(currIndent);\n      write(\"</array>\");\n    }\n\n    private void doVisitComposite(Composite composite) {\n      var renderedAtLeastOneProperty = false;\n\n      for (var entry : composite.getProperties().entrySet()) {\n        var value = entry.getValue();\n        if (value instanceof PNull) continue;\n\n        if (!renderedAtLeastOneProperty) {\n          write(\"<dict>\");\n          write(LINE_BREAK);\n          currIndent += indent;\n          renderedAtLeastOneProperty = true;\n        }\n\n        write(currIndent);\n        write(\"<key>\");\n        write(charEscaper.escape(entry.getKey()));\n        write(\"</key>\");\n        write(LINE_BREAK);\n\n        write(currIndent);\n        visit(value);\n        write(LINE_BREAK);\n      }\n\n      if (renderedAtLeastOneProperty) {\n        currIndent = currIndent.substring(0, currIndent.length() - indent.length());\n        write(currIndent);\n        write(\"</dict>\");\n      } else {\n        write(\"<dict/>\");\n      }\n    }\n  }\n\n  private void write(String str) {\n    try {\n      writer.write(str);\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.net.URI;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a Pkl module. */\npublic final class PModule extends PObject {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final URI moduleUri;\n  private final String moduleName;\n\n  public PModule(\n      URI moduleUri, String moduleName, PClassInfo<?> classInfo, Map<String, Object> properties) {\n    super(classInfo, properties);\n    this.moduleUri = Objects.requireNonNull(moduleUri, \"moduleUri\");\n    this.moduleName = Objects.requireNonNull(moduleName, \"moduleName\");\n  }\n\n  public URI getModuleUri() {\n    return moduleUri;\n  }\n\n  public String getModuleName() {\n    return moduleName;\n  }\n\n  @Override\n  public Object getProperty(String name) {\n    var result = properties.get(name);\n    if (result != null) return result;\n\n    throw new NoSuchPropertyException(\n        String.format(\n            \"Module `%s` does not have a property named `%s`. Available properties: %s\",\n            moduleName, name, properties.keySet()),\n        name);\n  }\n\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitModule(this);\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof PModule other)) return false;\n    return moduleUri.equals(other.moduleUri)\n        && moduleName.equals(other.moduleName)\n        && classInfo.equals(other.classInfo)\n        && properties.equals(other.properties);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(moduleUri, moduleName, classInfo, properties);\n  }\n\n  @Override\n  public String toString() {\n    return render(moduleName);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PNull.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\n\n/** Java representation of a {@code pkl.base#Null} value. */\npublic final class PNull implements Value {\n  @Serial private static final long serialVersionUID = 0L;\n  private static final PNull INSTANCE = new PNull();\n\n  /** Returns the sole instance of this class. */\n  public static PNull getInstance() {\n    return INSTANCE;\n  }\n\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitNull();\n  }\n\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertNull();\n  }\n\n  @Override\n  public PClassInfo<?> getClassInfo() {\n    return PClassInfo.Null;\n  }\n\n  @Override\n  public String toString() {\n    return \"null\";\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PObject.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a Pkl object. */\npublic class PObject implements Composite {\n  @Serial private static final long serialVersionUID = 0L;\n\n  protected final PClassInfo<?> classInfo;\n  protected final Map<String, Object> properties;\n\n  public PObject(PClassInfo<?> classInfo, Map<String, Object> properties) {\n    this.classInfo = Objects.requireNonNull(classInfo, \"classInfo\");\n    this.properties = Objects.requireNonNull(properties, \"properties\");\n  }\n\n  @Override\n  public final PClassInfo<?> getClassInfo() {\n    return classInfo;\n  }\n\n  @Override\n  public final Map<String, Object> getProperties() {\n    return properties;\n  }\n\n  @Override\n  public Object getProperty(String name) {\n    var result = properties.get(name);\n    if (result != null) return result;\n\n    throw new NoSuchPropertyException(\n        String.format(\n            \"Object of type `%s` does not have a property named `%s`. Available properties: %s\",\n            classInfo.getQualifiedName(), name, properties.keySet()),\n        name);\n  }\n\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitObject(this);\n  }\n\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertObject(this);\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (obj == null) return false;\n    if (getClass() != obj.getClass()) return false;\n\n    var other = (PObject) obj;\n    return classInfo.equals(other.classInfo) && properties.equals(other.properties);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(classInfo, properties);\n  }\n\n  @Override\n  public String toString() {\n    return render(getClassInfo().getDisplayName());\n  }\n\n  protected String render(@Nullable String prefix) {\n    var builder = new StringBuilder();\n\n    if (prefix != null) {\n      builder.append(prefix);\n      builder.append(\" { \");\n    } else {\n      builder.append(\"{ \");\n    }\n\n    var first = true;\n    for (var property : properties.entrySet()) {\n      if (first) {\n        first = false;\n      } else {\n        builder.append(\"; \");\n      }\n      builder.append(property.getKey()).append(\" = \").append(property.getValue());\n    }\n\n    builder.append(\" }\");\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PType.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.io.Serializable;\nimport java.util.*;\n\n/** A Pkl type as used in type annotations. */\npublic abstract class PType implements Serializable {\n  @Serial private static final long serialVersionUID = 0L;\n\n  /** The `unknown` type. Omitting a type annotation is equivalent to stating this type. */\n  public static final PType UNKNOWN =\n      new PType() {\n        @Serial private static final long serialVersionUID = 0L;\n      };\n\n  /** The bottom type. */\n  public static final PType NOTHING =\n      new PType() {\n        @Serial private static final long serialVersionUID = 0L;\n      };\n\n  /** The type of the enclosing module. */\n  public static final PType MODULE =\n      new PType() {\n        @Serial private static final long serialVersionUID = 0L;\n      };\n\n  private PType() {}\n\n  public List<PType> getTypeArguments() {\n    return List.of();\n  }\n\n  public static final class StringLiteral extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final String literal;\n\n    public StringLiteral(String literal) {\n      this.literal = literal;\n    }\n\n    public String getLiteral() {\n      return literal;\n    }\n  }\n\n  public static final class Class extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final PClass pClass;\n    private final List<PType> typeArguments;\n\n    public Class(PClass pClass, List<PType> typeArguments) {\n      this.pClass = pClass;\n      this.typeArguments = typeArguments;\n    }\n\n    public Class(PClass pClass) {\n      this(pClass, List.of());\n    }\n\n    public Class(PClass pClass, PType typeArgument1) {\n      this(pClass, List.of(typeArgument1));\n    }\n\n    public Class(PClass pClass, PType typeArgument1, PType typeArgument2) {\n      this(pClass, List.of(typeArgument1, typeArgument2));\n    }\n\n    public PClass getPClass() {\n      return pClass;\n    }\n\n    @Override\n    public List<PType> getTypeArguments() {\n      return typeArguments;\n    }\n  }\n\n  public static final class Nullable extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final PType baseType;\n\n    public Nullable(PType baseType) {\n      this.baseType = baseType;\n    }\n\n    public PType getBaseType() {\n      return baseType;\n    }\n  }\n\n  public static final class Constrained extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final PType baseType;\n    private final List<String> constraints;\n\n    public Constrained(PType baseType, List<String> constraints) {\n      this.baseType = baseType;\n      this.constraints = constraints;\n    }\n\n    public PType getBaseType() {\n      return baseType;\n    }\n\n    public List<String> getConstraints() {\n      return constraints;\n    }\n  }\n\n  public static final class Alias extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final TypeAlias typeAlias;\n    private final List<PType> typeArguments;\n    private final PType aliasedType;\n\n    public Alias(TypeAlias typeAlias) {\n      this(typeAlias, List.of(), typeAlias.getAliasedType());\n    }\n\n    public Alias(TypeAlias typeAlias, List<PType> typeArguments, PType aliasedType) {\n      this.typeAlias = typeAlias;\n      this.typeArguments = typeArguments;\n      this.aliasedType = aliasedType;\n    }\n\n    public TypeAlias getTypeAlias() {\n      return typeAlias;\n    }\n\n    @Override\n    public List<PType> getTypeArguments() {\n      return typeArguments;\n    }\n\n    /**\n     * Returns the aliased type, namely {@code getTypeAlias().getAliasedType()} with type arguments\n     * substituted for type variables.\n     */\n    public PType getAliasedType() {\n      return aliasedType;\n    }\n  }\n\n  public static final class Function extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final List<PType> parameterTypes;\n    private final PType returnType;\n\n    public Function(List<PType> parameterTypes, PType returnType) {\n      this.parameterTypes = parameterTypes;\n      this.returnType = returnType;\n    }\n\n    public List<PType> getParameterTypes() {\n      return parameterTypes;\n    }\n\n    public PType getReturnType() {\n      return returnType;\n    }\n  }\n\n  public static final class Union extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final List<PType> elementTypes;\n\n    public Union(List<PType> elementTypes) {\n      this.elementTypes = elementTypes;\n    }\n\n    public List<PType> getElementTypes() {\n      return elementTypes;\n    }\n  }\n\n  public static final class TypeVariable extends PType {\n    @Serial private static final long serialVersionUID = 0L;\n\n    private final TypeParameter typeParameter;\n\n    public TypeVariable(TypeParameter typeParameter) {\n      this.typeParameter = typeParameter;\n    }\n\n    public String getName() {\n      return typeParameter.getName();\n    }\n\n    public TypeParameter getTypeParameter() {\n      return typeParameter;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Pair.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.util.Iterator;\nimport java.util.NoSuchElementException;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a {@code pkl.base#Pair} value. */\npublic final class Pair<F, S> implements Value, Iterable<Object> {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final F first;\n  private final S second;\n\n  /** Constructs a pair with the given elements. */\n  public Pair(F first, S second) {\n    this.first = first;\n    this.second = second;\n  }\n\n  /** Returns the first element of this pair. */\n  public F getFirst() {\n    return first;\n  }\n\n  /** Returns the second element of this pair. */\n  public S getSecond() {\n    return second;\n  }\n\n  @Override\n  public Iterator<Object> iterator() {\n    return new Iterator<>() {\n      int pos = 0;\n\n      @Override\n      public boolean hasNext() {\n        return pos < 2;\n      }\n\n      @Override\n      public Object next() {\n        return switch (pos++) {\n          case 0 -> first;\n          case 1 -> second;\n          default -> throw new NoSuchElementException(\"Pair only has two elements.\");\n        };\n      }\n    };\n  }\n\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitPair(this);\n  }\n\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertPair(this);\n  }\n\n  @Override\n  public PClassInfo<?> getClassInfo() {\n    return PClassInfo.Pair;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Pair<?, ?> other)) return false;\n    return first.equals(other.first) && second.equals(other.second);\n  }\n\n  @Override\n  public int hashCode() {\n    return first.hashCode() * 31 + second.hashCode();\n  }\n\n  @Override\n  public String toString() {\n    return \"Pair(\" + first + \", \" + second + \")\";\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PcfRenderer.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport org.pkl.parser.Lexer;\n\n// To instantiate this class, use ValueRenderers.pcf().\nfinal class PcfRenderer implements ValueRenderer {\n  private static final String LINE_SEPARATOR = \"\\n\";\n\n  private final Writer writer;\n  private final String indent;\n  private final boolean omitNullProperties;\n  private final ValueFormatter valueFormatter;\n\n  private String currIndent = \"\";\n\n  public PcfRenderer(\n      Writer writer, String indent, boolean omitNullProperties, boolean useCustomStringDelimiters) {\n    this.writer = writer;\n    this.indent = indent;\n    this.omitNullProperties = omitNullProperties;\n    this.valueFormatter = new ValueFormatter(true, useCustomStringDelimiters);\n  }\n\n  @Override\n  public void renderDocument(Object value) {\n    if (!(value instanceof Composite composite)) {\n      throw new RendererException(\n          String.format(\n              \"The top-level value of a Pcf document must have type `Composite`, but got type `%s`.\",\n              value.getClass().getTypeName()));\n    }\n\n    new Visitor().doVisitProperties(composite.getProperties());\n  }\n\n  @Override\n  public void renderValue(Object value) {\n    new Visitor().visit(value);\n  }\n\n  private class Visitor implements ValueVisitor {\n    @Override\n    public void visitString(String value) {\n      try {\n        valueFormatter.formatStringValue(value, currIndent + indent, writer);\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      write(value.toString());\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      write(value.toString());\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      write(value.toString());\n    }\n\n    @Override\n    public void visitDuration(Duration value) {\n      write(value.toString());\n    }\n\n    @Override\n    public void visitDataSize(DataSize value) {\n      write(value.toString());\n    }\n\n    @Override\n    public void visitBytes(byte[] value) {\n      write(\"Bytes(\\\"\");\n      var isFirst = true;\n      for (var byt : value) {\n        if (isFirst) {\n          isFirst = false;\n        } else {\n          write(\", \");\n        }\n        write(Integer.valueOf(Byte.toUnsignedInt(byt)).toString());\n      }\n      write(\")\");\n    }\n\n    @Override\n    public void visitPair(Pair<?, ?> value) {\n      doVisitIterable(value, \"Pair(\");\n    }\n\n    @Override\n    public void visitList(List<?> value) {\n      doVisitIterable(value, \"List(\");\n    }\n\n    @Override\n    public void visitSet(Set<?> value) {\n      doVisitIterable(value, \"Set(\");\n    }\n\n    @Override\n    public void visitMap(Map<?, ?> value) {\n      var first = true;\n      write(\"Map(\");\n      for (var entry : value.entrySet()) {\n        if (first) {\n          first = false;\n        } else {\n          write(\", \");\n        }\n        if (entry.getKey() instanceof Composite) {\n          write(\"new \");\n        }\n        visit(entry.getKey());\n        write(\", \");\n        if (entry.getValue() instanceof Composite) {\n          write(\"new \");\n        }\n        visit(entry.getValue());\n      }\n      write(')');\n    }\n\n    @Override\n    public void visitObject(PObject value) {\n      doVisitComposite(value);\n    }\n\n    @Override\n    public void visitModule(PModule value) {\n      doVisitComposite(value);\n    }\n\n    @Override\n    public void visitClass(PClass value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Class` cannot be rendered as Pcf. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitTypeAlias(TypeAlias value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `TypeAlias` cannot be rendered as Pcf. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitNull() {\n      write(\"null\");\n    }\n\n    @Override\n    public void visitRegex(Pattern value) {\n      write(\"Regex(\");\n      visitString(value.pattern());\n      write(')');\n    }\n\n    private void doVisitIterable(Iterable<?> iterable, String prefix) {\n      var first = true;\n      write(prefix);\n      for (var elem : iterable) {\n        if (first) {\n          first = false;\n        } else {\n          write(\", \");\n        }\n        if (elem == null) { // unevaluated property\n          write(\"?\");\n          continue;\n        }\n        if (elem instanceof Composite) {\n          write(\"new \");\n        }\n        visit(elem);\n      }\n      write(')');\n    }\n\n    private void doVisitComposite(Composite composite) {\n      if (composite.getProperties().isEmpty()) {\n        write(\"{}\");\n        return;\n      }\n\n      write('{');\n      write(LINE_SEPARATOR);\n      currIndent += indent;\n      doVisitProperties(composite.getProperties());\n      currIndent = currIndent.substring(0, currIndent.length() - indent.length());\n      write(currIndent);\n      write('}');\n    }\n\n    private void doVisitProperties(Map<String, Object> properties) {\n      properties.forEach(\n          (name, value) -> {\n            if (omitNullProperties && value instanceof PNull) return;\n\n            write(currIndent);\n            writeIdentifier(name);\n\n            if (value == null) { // unevaluated property\n              write(\" = ?\");\n            } else if (value instanceof Composite) {\n              write(' ');\n              visit(value);\n            } else {\n              write(\" = \");\n              visit(value);\n            }\n\n            write(LINE_SEPARATOR);\n          });\n    }\n\n    private void write(char ch) {\n      try {\n        writer.write(ch);\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n    }\n\n    private void write(String str) {\n      try {\n        writer.write(str);\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n    }\n\n    private void writeIdentifier(String identifier) {\n      if (Lexer.isRegularIdentifier(identifier)) {\n        write(identifier);\n      } else {\n        write('`');\n        write(identifier);\n        write('`');\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PklBinaryDecoder.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.regex.Pattern;\nimport org.msgpack.core.MessagePack;\nimport org.msgpack.core.MessageUnpacker;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.pklbinary.AbstractPklBinaryDecoder;\n\n/**\n * A decoder/parser for <code>pkl-binary</code>.\n *\n * <p>For how pkl-binary turns Java, see {@link Value}.\n */\npublic class PklBinaryDecoder extends AbstractPklBinaryDecoder {\n\n  private PklBinaryDecoder(MessageUnpacker unpacker) {\n    super(unpacker);\n  }\n\n  /** Decode a value from the supplied byte array. */\n  public static Object decode(byte[] bytes) {\n    return new PklBinaryDecoder(MessagePack.newDefaultUnpacker(bytes)).decode();\n  }\n\n  /** Decode a value from the supplied {@link InputStream}. */\n  public static Object decode(InputStream inputStream) {\n    return new PklBinaryDecoder(MessagePack.newDefaultUnpacker(inputStream)).decode();\n  }\n\n  @Override\n  protected RuntimeException doFail(Exception cause, long offset, List<String> path) {\n    return new RuntimeException(\n        String.format(\n            \"Exception while decoding binary data at offset %d, path [%s]\",\n            offset, String.join(\", \", path)),\n        cause);\n  }\n\n  @Override\n  protected RuntimeException doIOFail(IOException cause) {\n    return new UncheckedIOException(\"IO exception during decoding\", cause);\n  }\n\n  @Override\n  protected Object doDecodeNull() {\n    return PNull.getInstance();\n  }\n\n  @Override\n  protected Object doDecodeDuration(double value, DurationUnit unit) {\n    return new Duration(value, unit);\n  }\n\n  @Override\n  protected Object doDecodeObject(\n      String className, URI moduleUri, DecodeIterator<DecodedObjectMember> iter) {\n    var properties = CollectionUtils.<String, Object>newLinkedHashMap(iter.getSize());\n    while (iter.hasNext()) {\n      var member = iter.next();\n      properties.put(member.key().toString(), member.value());\n    }\n\n    if (moduleUri.equals(PClassInfo.pklBaseUri)) {\n      // dynamic\n      if (className.equals(BaseModule.getDynamicClass().getDisplayName())) {\n        return new PObject(PClassInfo.Dynamic, properties);\n      }\n\n      // pkl:base typed\n      if (!className.equals(BaseModule.getModule().getVmClass().getDisplayName())) {\n        return new PObject(PClassInfo.get(\"pkl.base\", className, moduleUri), properties);\n      }\n      // fall through to module case\n    }\n\n    // module\n    var hashIndex = className.lastIndexOf(\"#\");\n    if (hashIndex < 0) {\n      return new PModule(\n          moduleUri, className, PClassInfo.get(className, \"ModuleClass\", moduleUri), properties);\n    }\n\n    // non-pkl:base class\n    return new PObject(\n        PClassInfo.get(\n            className.substring(0, hashIndex), className.substring(hashIndex + 1), moduleUri),\n        properties);\n  }\n\n  @Override\n  protected Object doDecodeMap(MapDecodeIterator iter) {\n    var map = CollectionUtils.newLinkedHashMap(iter.getSize());\n    while (iter.hasNext()) {\n      var entry = iter.next();\n      map.put(entry.getFirst(), entry.getSecond());\n    }\n    return map;\n  }\n\n  @Override\n  protected Object doDecodeMapping(MapDecodeIterator iter) {\n    return doDecodeMap(iter); // same exported result!\n  }\n\n  @Override\n  protected Object doDecodeList(CollectionDecodeIterator iter) {\n    var listing = new ArrayList<>(iter.getSize());\n    while (iter.hasNext()) {\n      listing.add(iter.next());\n    }\n    return listing;\n  }\n\n  @Override\n  protected Object doDecodeListing(CollectionDecodeIterator iter) {\n    return doDecodeList(iter); // same exported result!\n  }\n\n  @Override\n  protected Object doDecodeSet(CollectionDecodeIterator iter) {\n    var set = CollectionUtils.newLinkedHashSet(iter.getSize());\n    while (iter.hasNext()) {\n      set.add(iter.next());\n    }\n    return set;\n  }\n\n  @Override\n  protected Object doDecodeDataSize(double value, DataSizeUnit unit) {\n    return new DataSize(value, unit);\n  }\n\n  @Override\n  protected Object doDecodePair(Object first, Object second) {\n    return new Pair<>(first, second);\n  }\n\n  @Override\n  protected Object doDecodeIntSeq(long start, long end, long step) {\n    throw new DecodeException(\"Cannot decode IntSeq value\");\n  }\n\n  @Override\n  protected Object doDecodeRegex(Pattern pattern) {\n    return pattern;\n  }\n\n  @Override\n  protected Object doDecodeClass(String qualifiedName, URI moduleUri) {\n    throw new DecodeException(\"Cannot decode Class value\");\n  }\n\n  @Override\n  protected Object doDecodeTypeAlias(String qualifiedName, URI moduleUri) {\n    throw new DecodeException(\"Cannot decode TypeAlias value\");\n  }\n\n  @Override\n  protected Object doDecodeBytes(byte[] bytes) {\n    return bytes;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PklBugException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\npublic final class PklBugException extends PklException {\n  public static PklBugException unreachableCode() {\n    return new PklBugException(\"Unreachable code.\");\n  }\n\n  public PklBugException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public PklBugException(Throwable cause) {\n    super(\"An unexpected error has occurred. Would you mind filing a bug report?\", cause);\n  }\n\n  public PklBugException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PklException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\npublic class PklException extends RuntimeException {\n  public PklException(String message, Throwable cause) {\n    super(message, cause);\n  }\n\n  public PklException(String message) {\n    super(message);\n  }\n\n  public PklException(Throwable cause) {\n    super(cause);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PklInfo.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/** Information about the Pkl package index. */\npublic final class PklInfo {\n  private static final String PACKAGE_INDEX_HOMEPAGE = \"https://pkl-lang.org/package-docs/\";\n\n  private static final PklInfo CURRENT;\n  private final PackageIndex packageIndex;\n\n  static {\n    CURRENT = new PklInfo(new PackageIndex(PACKAGE_INDEX_HOMEPAGE));\n  }\n\n  /** The current {@link PklInfo}. */\n  public static PklInfo current() {\n    return CURRENT;\n  }\n\n  /** Constructs a {@link PklInfo}. */\n  PklInfo(PackageIndex packageIndex) {\n    this.packageIndex = packageIndex;\n  }\n\n  /** The Pkl package index. */\n  public PackageIndex getPackageIndex() {\n    return packageIndex;\n  }\n\n  /**\n   * A Pkl package index.\n   *\n   * @param homepage The homepage of this package index.\n   */\n  public record PackageIndex(String homepage) {\n    /** Returns the homepage of the given package. */\n    public String getPackagePage(String packageName, String packageVersion) {\n      return homepage + packageName + \"/\" + packageVersion + \"/\";\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Platform.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport com.oracle.truffle.api.Truffle;\nimport com.oracle.truffle.api.TruffleOptions;\nimport org.graalvm.home.Version;\n\n/**\n * Information about the Pkl release that the current program runs on. This class is the Java\n * equivalent of standard library module {@code pkl.platform}.\n *\n * @param language the language implementation of this platform\n * @param runtime the language runtime of this platform\n * @param virtualMachine the virtual machine of this platform\n * @param operatingSystem the operating system of this platform\n * @param processor the processor of this platform\n */\npublic record Platform(\n    Language language,\n    Runtime runtime,\n    VirtualMachine virtualMachine,\n    OperatingSystem operatingSystem,\n    Processor processor) {\n  private static final Platform CURRENT;\n\n  static {\n    var pklVersion = Release.current().version().toString();\n    var osName = System.getProperty(\"os.name\");\n    if (osName.equals(\"Mac OS X\")) osName = \"macOS\";\n    if (osName.contains(\"Windows\")) osName = \"Windows\";\n    var osVersion = System.getProperty(\"os.version\");\n    var architecture = System.getProperty(\"os.arch\");\n\n    var runtimeName = Truffle.getRuntime().getName();\n    var runtimeVersion = Version.getCurrent().toString();\n    var vmName = TruffleOptions.AOT ? runtimeName : System.getProperty(\"java.vm.name\");\n    var vmVersion = TruffleOptions.AOT ? runtimeVersion : System.getProperty(\"java.vm.version\");\n\n    CURRENT =\n        new Platform(\n            new Language(pklVersion),\n            new Runtime(runtimeName, runtimeVersion),\n            new VirtualMachine(vmName, vmVersion),\n            new OperatingSystem(osName, osVersion),\n            new Processor(architecture));\n  }\n\n  /** The Pkl release that the current program runs on. */\n  public static Platform current() {\n    return CURRENT;\n  }\n\n  /**\n   * The language implementation of a platform.\n   *\n   * @param version the version of this language implementation\n   */\n  public record Language(String version) {}\n\n  /**\n   * The language runtime of a platform.\n   *\n   * @param name the name of this language runtime\n   * @param version the version of this language runtime\n   */\n  public record Runtime(String name, String version) {}\n\n  /**\n   * The virtual machine of a platform.\n   *\n   * @param name the name of this virtual machine\n   * @param version the version of this virtual machine\n   */\n  public record VirtualMachine(String name, String version) {}\n\n  /**\n   * The operating system of a platform.\n   *\n   * @param name the name of this operating system\n   * @param version the version of this operating system\n   */\n  public record OperatingSystem(String name, String version) {}\n\n  /**\n   * The processor of a platform.\n   *\n   * @param architecture the instruction set architecture of this processor\n   */\n  public record Processor(String architecture) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/PropertiesRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.properties.PropertiesUtils;\n\n// To instantiate this class, use ValueRenderers.properties().\nfinal class PropertiesRenderer implements ValueRenderer {\n  private final Writer writer;\n  private final boolean omitNullProperties;\n  private final boolean restrictCharset;\n\n  public PropertiesRenderer(Writer writer, boolean omitNullProperties, boolean restrictCharset) {\n    this.writer = writer;\n    this.omitNullProperties = omitNullProperties;\n    this.restrictCharset = restrictCharset;\n  }\n\n  @Override\n  public void renderDocument(Object value) {\n    new Visitor().renderDocument(value);\n  }\n\n  @Override\n  public void renderValue(Object value) {\n    new Visitor().renderValue(value);\n  }\n\n  private class Visitor implements ValueConverter<String> {\n\n    public void renderDocument(Object value) {\n      if (value instanceof Composite composite) {\n        doVisitMap(null, composite.getProperties());\n      } else if (value instanceof Map<?, ?> map) {\n        doVisitMap(null, map);\n      } else if (value instanceof Pair<?, ?> pair) {\n        doVisitKeyAndValue(null, pair.getFirst(), pair.getSecond());\n      } else {\n        throw new RendererException(\n            String.format(\n                \"The top-level value of a Java properties file must have type `Composite`, `Map`, or `Pair`, but got type `%s`.\",\n                value.getClass().getTypeName()));\n      }\n    }\n\n    public void renderValue(Object value) {\n      write(convert(value), false, restrictCharset);\n    }\n\n    @Override\n    public String convertNull() {\n      return \"\";\n    }\n\n    @Override\n    public String convertString(String value) {\n      return value;\n    }\n\n    @Override\n    public String convertInt(Long value) {\n      return value.toString();\n    }\n\n    @Override\n    public String convertFloat(Double value) {\n      return value.toString();\n    }\n\n    @Override\n    public String convertBoolean(Boolean value) {\n      return value.toString();\n    }\n\n    @Override\n    public String convertDuration(Duration value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Duration` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertDataSize(DataSize value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `DataSize` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertBytes(byte[] value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Bytes` cannot be rendered as Properties. Value: %s\",\n              (Object) value));\n    }\n\n    @Override\n    public String convertPair(Pair<?, ?> value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Pair` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertList(List<?> value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `List` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertSet(Set<?> value) {\n      throw new RendererException(\n          String.format(\"Values of type `Set` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertMap(Map<?, ?> value) {\n      throw new RendererException(\n          String.format(\"Values of type `Map` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertObject(PObject value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Object` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertModule(PModule value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Module` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    @Override\n    public String convertClass(PClass value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Class` cannot be rendered as Properties. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public String convertTypeAlias(TypeAlias value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `TypeAlias` cannot be rendered as Properties. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public String convertRegex(Pattern value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Regex` cannot be rendered as Properties. Value: %s\", value));\n    }\n\n    private void doVisitMap(@Nullable String keyPrefix, Map<?, ?> map) {\n      for (Map.Entry<?, ?> entry : map.entrySet()) {\n        doVisitKeyAndValue(keyPrefix, entry.getKey(), entry.getValue());\n      }\n    }\n\n    private void doVisitKeyAndValue(@Nullable String keyPrefix, Object key, Object value) {\n      if (omitNullProperties && value instanceof PNull) return;\n\n      var keyString = keyPrefix == null ? convert(key) : keyPrefix + \".\" + convert(key);\n\n      if (value instanceof Composite composite) {\n        doVisitMap(keyString, composite.getProperties());\n      } else if (value instanceof Map<?, ?> map) {\n        doVisitMap(keyString, map);\n      } else {\n        write(keyString, true, restrictCharset);\n        writeSeparator();\n        write(convert(value), false, restrictCharset);\n        writeLineBreak();\n      }\n    }\n\n    private void write(String value, boolean escapeSpace, boolean restrictCharset) {\n      try {\n        writer.write(\n            PropertiesUtils.renderPropertiesKeyOrValue(value, escapeSpace, restrictCharset));\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n    }\n\n    private void writeSeparator() {\n      try {\n        writer.write(' ');\n        writer.write('=');\n        writer.write(' ');\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n    }\n\n    private void writeLineBreak() {\n      try {\n        writer.write('\\n');\n      } catch (IOException e) {\n        throw new RuntimeException(e);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Release.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport com.oracle.truffle.api.TruffleOptions;\nimport java.io.IOException;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Properties;\nimport java.util.Set;\n\n/**\n * Information about the Pkl release that the current program runs on. This class is the Java\n * equivalent of standard library module {@code pkl.release}.\n *\n * @param version the version of this release\n * @param os the operating system (name and version) this release is running on\n * @param flavor the flavor of this release (native, or Java and JVM version)\n * @param versionInfo the output of {@code pkl --version} for this release\n * @param commitId the Git commit ID of this release\n * @param sourceCode the source code of this release\n * @param documentation the documentation of this release\n * @param standardLibrary the standard library of this release\n */\npublic record Release(\n    Version version,\n    String os,\n    String flavor,\n    String versionInfo,\n    String commitId,\n    SourceCode sourceCode,\n    Documentation documentation,\n    StandardLibrary standardLibrary) {\n  private static final String SOURCE_CODE_HOMEPAGE = \"https://github.com/apple/pkl/\";\n  private static final String DOCUMENTATION_HOMEPAGE = \"https://pkl-lang.org/main/\";\n\n  private static final Release CURRENT;\n\n  static {\n    var properties = new Properties();\n\n    try (var stream = Release.class.getResourceAsStream(\"Release.properties\")) {\n      if (stream == null) {\n        throw new AssertionError(\"Failed to locate `Release.properties`.\");\n      }\n      properties.load(stream);\n    } catch (IOException e) {\n      throw new AssertionError(\"Failed to load `Release.properties`.\", e);\n    }\n\n    var version = Version.parse(properties.getProperty(\"version\"));\n    var commitId = properties.getProperty(\"commitId\");\n    var osName = System.getProperty(\"os.name\");\n    if (osName.equals(\"Mac OS X\")) osName = \"macOS\";\n    if (osName.contains(\"Windows\")) osName = \"Windows\";\n    var osVersion = System.getProperty(\"os.version\");\n    var os = osName + \" \" + osVersion;\n    var flavor = TruffleOptions.AOT ? \"native\" : \"Java \" + System.getProperty(\"java.version\");\n    var versionInfo = \"Pkl \" + version + \" (\" + os + \", \" + flavor + \")\";\n    var commitish = version.isNormal() ? version.toString() : commitId;\n    var docsVersion = version.isNormal() ? version.toString() : \"latest\";\n    var docsHomepage = DOCUMENTATION_HOMEPAGE + docsVersion + \"/\";\n    var stdlibModules =\n        new LinkedHashSet<>(List.of(properties.getProperty(\"stdlibModules\").split(\",\")));\n\n    CURRENT =\n        new Release(\n            version,\n            os,\n            flavor,\n            versionInfo,\n            commitId,\n            new SourceCode(SOURCE_CODE_HOMEPAGE, commitish),\n            new Documentation(docsHomepage),\n            new StandardLibrary(stdlibModules));\n  }\n\n  /** The Pkl release that the current program runs on. */\n  public static Release current() {\n    return CURRENT;\n  }\n\n  /**\n   * The source code of a Pkl release.\n   *\n   * @param homepage the homepage of this source code\n   * @param version the version of this source code\n   */\n  public record SourceCode(String homepage, String version) {\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #version()}.\n     */\n    @Deprecated(forRemoval = true)\n    public String getVersion() {\n      return version;\n    }\n\n    /**\n     * Returns the source code page of the file with the given path. <b>Note:</b> Files may be moved\n     * or deleted anytime.\n     */\n    public String getFilePage(String path) {\n      return homepage + \"blob/\" + version + \"/\" + path;\n    }\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #sourceCodeUrlScheme()}.\n     */\n    @Deprecated(forRemoval = true)\n    public String getSourceCodeUrlScheme() {\n      return sourceCodeUrlScheme();\n    }\n\n    /** Returns the source code scheme for the stdlib module. */\n    public String sourceCodeUrlScheme() {\n      return homepage + \"blob/\" + version + \"/stdlib%{path}#L%{line}-L%{endLine}\";\n    }\n  }\n\n  /**\n   * The documentation of a Pkl release.\n   *\n   * @param homepage the homepage of this documentation\n   */\n  public record Documentation(String homepage) {}\n\n  /**\n   * The standard library of a Pkl release.\n   *\n   * @since 0.21.0\n   * @param modules the modules of this standard library\n   */\n  public record StandardLibrary(Set<String> modules) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/RendererException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\npublic final class RendererException extends RuntimeException {\n  public RendererException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/SecurityManager.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Enforces a security model during {@link Evaluator evaluation}.\n *\n * <p>Use {@link SecurityManagers} to obtain or construct an instance of this type.\n */\npublic interface SecurityManager {\n  /**\n   * Checks if the given module may be resolved. This check is required before any attempt is made\n   * to access the given URI.\n   */\n  void checkResolveModule(URI uri) throws SecurityManagerException;\n\n  /** Checks if the given importing module may import the given imported module. */\n  void checkImportModule(URI importingModule, URI importedModule) throws SecurityManagerException;\n\n  /** Checks if the given resource may be read. */\n  void checkReadResource(URI resource) throws SecurityManagerException;\n\n  /**\n   * Checks if the given resource may be resolved. This check is required before any attempt is made\n   * to access the given URI.\n   */\n  void checkResolveResource(URI resource) throws SecurityManagerException;\n\n  /**\n   * Resolves the given {@code file:} URI to a secure, symlink-free path that has been verified to\n   * be within the root directory (if one is configured). The returned path can be opened with\n   * {@link java.nio.file.LinkOption#NOFOLLOW_LINKS}.\n   *\n   * <p>Returns {@code null} for non-{@code file:} URIs or if no root directory is configured.\n   *\n   * @param uri the URI to resolve\n   * @return the resolved, symlink-free path under root directory, or {@code null}\n   * @throws SecurityManagerException if the resolved path is not within the root directory\n   * @throws IOException if the path cannot be resolved\n   */\n  default @Nullable Path resolveSecurePath(URI uri) throws SecurityManagerException, IOException {\n    return null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/SecurityManagerBuilder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.nio.file.Path;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Parent interface to builder classes for configuring a {@link SecurityManager}.\n *\n * @param <B> concrete type of the builder class to maintain covariance in inherited methods\n */\npublic interface SecurityManagerBuilder<B extends SecurityManagerBuilder<B>> {\n  B addAllowedModule(Pattern pattern);\n\n  B addAllowedModules(Collection<Pattern> patterns);\n\n  B setAllowedModules(Collection<Pattern> patterns);\n\n  List<Pattern> getAllowedModules();\n\n  B addAllowedResource(Pattern pattern);\n\n  B addAllowedResources(Collection<Pattern> patterns);\n\n  B setAllowedResources(Collection<Pattern> patterns);\n\n  List<Pattern> getAllowedResources();\n\n  B setRootDir(@Nullable Path rootDir);\n\n  @Nullable\n  Path getRootDir();\n\n  SecurityManager build();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/SecurityManagerException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/**\n * A SecurityManagerException declares that a violation occurred during an external i/o operation.\n *\n * <p>{@link SecurityManagerException#getMessage()} is passed to users when errors arise.\n */\npublic final class SecurityManagerException extends Exception {\n  public SecurityManagerException(String message) {\n    super(message);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/SecurityManagers.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.*;\nimport java.util.function.Function;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/** A provider for {@link SecurityManager}s. */\npublic final class SecurityManagers {\n  private SecurityManagers() {}\n\n  /**\n   * Returns the list of module patterns that the {@link #defaultManager default security manager}\n   * will use to determine if a module import may be resolved.\n   */\n  public static final List<Pattern> defaultAllowedModules =\n      List.of(\n          Pattern.compile(\"repl:\"),\n          Pattern.compile(\"file:\"),\n\n          // for evaluating URLs returned by `Class(Loader).getResource()`\n          Pattern.compile(\"jar:file:\"),\n          Pattern.compile(\"jar:nested:\"),\n          Pattern.compile(\"modulepath:\"),\n          Pattern.compile(\"https:\"),\n          Pattern.compile(\"pkl:\"),\n          Pattern.compile(\"package:\"),\n          Pattern.compile(\"projectpackage:\"));\n\n  /**\n   * Returns the list of resource patterns that the {@link #defaultManager default security manager}\n   * will use to determine if an external resource may be read.\n   */\n  public static final List<Pattern> defaultAllowedResources =\n      List.of(\n          Pattern.compile(\"prop:\"),\n          Pattern.compile(\"env:\"),\n          Pattern.compile(\"file:\"),\n          Pattern.compile(\"modulepath:\"),\n          Pattern.compile(\"package:\"),\n          Pattern.compile(\"projectpackage:\"),\n          Pattern.compile(\"https:\"));\n\n  /**\n   * Returns the mapping from module URIs to trust levels used by the {@link #defaultManager default\n   * security manager}.\n   *\n   * <p>Trust levels are used to determine whether a module may import another module. Only modules\n   * with the same or a lower trust level may be imported.\n   *\n   * <p>This mapping supports a fixed set of module URI schemes. Local modules are given a higher\n   * trust level than remote modules. For example, a local file may import a remote file, but not\n   * the other way around.\n   */\n  public static final Function<URI, Integer> defaultTrustLevels =\n      SecurityManagers::getDefaultTrustLevel;\n\n  private static int getDefaultTrustLevel(URI uri) {\n    return switch (uri.getScheme()) {\n      case \"repl\" -> 40;\n      case \"file\" -> uri.getHost() == null ? 30 : 10;\n      case \"jar\" -> {\n        if (uri.getSchemeSpecificPart().startsWith(\"nested:\")) {\n          // treat jar:nested: URIs as same level as modulepath URIs\n          yield 20;\n        } else {\n          // use trust level of embedded URL\n          yield getDefaultTrustLevel(URI.create(uri.toString().substring(4)));\n        }\n      }\n      case \"modulepath\" -> 20;\n      case \"pkl\" -> 0;\n      default -> 10;\n    };\n  }\n\n  /**\n   * Returns a {@link #standard standard security manager} with {@link #defaultAllowedModules\n   * default allowed modules}, {@link #defaultAllowedResources default allowed resources}, {@link\n   * #defaultTrustLevels default trust levels}, and no root directory for modules and resources.\n   */\n  public static final SecurityManager defaultManager =\n      new Standard(defaultAllowedModules, defaultAllowedResources, defaultTrustLevels, null);\n\n  /**\n   * Creates a {@link SecurityManager} that determines whether a module can be resolved based on the\n   * given list of module URI patterns, whether an external resources can be read based on the given\n   * list of resource URI patterns, and whether a module can import another module based on the\n   * given module trust levels. A module can only import modules with the same or a lower trust\n   * level.\n   *\n   * <p>If {@code rootDir} is non-null, access to file-based modules and resources is restricted to\n   * those located under {@code rootDir}. Any symlinks are resolved before this check is performed.\n   */\n  public static SecurityManager standard(\n      List<Pattern> allowedModules,\n      List<Pattern> allowedResources,\n      Function<URI, Integer> trustLevels,\n      @Nullable Path rootDir) {\n    return new Standard(allowedModules, allowedResources, trustLevels, rootDir);\n  }\n\n  /** Creates an unconfigured builder for setting up a standard {@link SecurityManager}. */\n  public static StandardBuilder standardBuilder() {\n    return new StandardBuilder();\n  }\n\n  private static class Standard implements SecurityManager {\n    private final List<Pattern> allowedModules;\n    private final List<Pattern> allowedResources;\n    private final Function<URI, Integer> trustLevels;\n    private final @Nullable Path rootDir;\n\n    Standard(\n        List<Pattern> allowedModules,\n        List<Pattern> allowedResources,\n        Function<URI, Integer> trustLevels,\n        @Nullable Path rootDir) {\n      this.allowedModules = allowedModules;\n      this.allowedResources = allowedResources;\n      this.trustLevels = trustLevels;\n      this.rootDir = normalizePath(rootDir);\n    }\n\n    @Override\n    public void checkResolveModule(URI uri) throws SecurityManagerException {\n      checkRead(uri, allowedModules, false);\n    }\n\n    @Override\n    public void checkResolveResource(URI resource) throws SecurityManagerException {\n      checkRead(resource, allowedResources, true);\n    }\n\n    @Override\n    public void checkReadResource(URI uri) throws SecurityManagerException {\n      checkRead(uri, allowedResources, true);\n    }\n\n    @Override\n    public void checkImportModule(URI importingModule, URI importedModule)\n        throws SecurityManagerException {\n      var importingTrustLevel = trustLevels.apply(importingModule);\n      var importedTrustLevel = trustLevels.apply(importedModule);\n\n      if (importingTrustLevel < importedTrustLevel) {\n        var message =\n            ErrorMessages.create(\"insufficientModuleTrustLevel\", importedModule, importingModule);\n        throw new SecurityManagerException(message);\n      }\n    }\n\n    @Override\n    public @Nullable Path resolveSecurePath(URI uri) throws SecurityManagerException, IOException {\n      if (rootDir == null || !uri.isAbsolute() || !uri.getScheme().equals(\"file\")) {\n        return null;\n      }\n      var path = Path.of(uri);\n      var realPath = path.toRealPath();\n      if (!realPath.startsWith(rootDir)) {\n        throw new SecurityManagerException(ErrorMessages.create(\"modulePastRootDir\", uri, rootDir));\n      }\n      return realPath;\n    }\n\n    private @Nullable Path normalizePath(@Nullable Path path) {\n      if (path == null) {\n        return null;\n      }\n      try {\n        if (Files.exists(path)) {\n          return path.toRealPath();\n        }\n        return path.toAbsolutePath();\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    private void checkRead(URI uri, List<Pattern> allowedPatterns, boolean isResource)\n        throws SecurityManagerException {\n      for (var pattern : allowedPatterns) {\n        if (pattern.matcher(uri.toString()).lookingAt()) {\n          checkIsUnderRootDir(uri, isResource);\n          return;\n        }\n      }\n\n      var messageKey = isResource ? \"resourceNotInAllowList\" : \"moduleNotInAllowList\";\n      var message = ErrorMessages.create(messageKey, uri);\n      throw new SecurityManagerException(message);\n    }\n\n    private void checkIsUnderRootDir(URI uri, boolean isResource) throws SecurityManagerException {\n      // handle jar:file: URIs correctly:\n      var checkUri =\n          uri.getScheme().equals(\"jar\") ? IoUtils.createUri(uri.getSchemeSpecificPart()) : uri;\n\n      if (!checkUri.isAbsolute()) {\n        throw new AssertionError(\"Expected absolute URI but got: \" + checkUri);\n      }\n\n      if (rootDir == null || !checkUri.getScheme().equals(\"file\")) return;\n\n      var path = Path.of(checkUri);\n      if (Files.exists(path)) {\n        try {\n          path = path.toRealPath();\n        } catch (IOException e) {\n          throw new UncheckedIOException(e);\n        }\n      } else {\n        // perform check even if file doesn't exist\n        // to avoid leaking information on whether files outside root dir exist\n        path = path.normalize();\n      }\n\n      if (!path.startsWith(rootDir)) {\n        var errorMessageKey = isResource ? \"resourcePastRootDir\" : \"modulePastRootDir\";\n        var message = ErrorMessages.create(errorMessageKey, uri, rootDir);\n        throw new SecurityManagerException(message);\n      }\n    }\n  }\n\n  public static class StandardBuilder implements SecurityManagerBuilder<StandardBuilder> {\n\n    private final List<Pattern> allowedModules = new ArrayList<>();\n\n    private final List<Pattern> allowedResources = new ArrayList<>();\n\n    private Path rootDir;\n\n    private StandardBuilder() {}\n\n    @Override\n    public StandardBuilder addAllowedModule(Pattern pattern) {\n      allowedModules.add(pattern);\n      return this;\n    }\n\n    @Override\n    public StandardBuilder addAllowedModules(Collection<Pattern> patterns) {\n      allowedModules.addAll(patterns);\n      return this;\n    }\n\n    @Override\n    public StandardBuilder setAllowedModules(Collection<Pattern> patterns) {\n      allowedModules.clear();\n      allowedModules.addAll(patterns);\n      return this;\n    }\n\n    @Override\n    public List<Pattern> getAllowedModules() {\n      return allowedModules;\n    }\n\n    @Override\n    public StandardBuilder addAllowedResource(Pattern pattern) {\n      allowedResources.add(pattern);\n      return this;\n    }\n\n    @Override\n    public StandardBuilder addAllowedResources(Collection<Pattern> patterns) {\n      allowedResources.addAll(patterns);\n      return this;\n    }\n\n    @Override\n    public StandardBuilder setAllowedResources(Collection<Pattern> patterns) {\n      allowedResources.clear();\n      allowedResources.addAll(patterns);\n      return this;\n    }\n\n    @Override\n    public List<Pattern> getAllowedResources() {\n      return allowedResources;\n    }\n\n    @Override\n    public StandardBuilder setRootDir(@Nullable Path rootDir) {\n      this.rootDir = rootDir;\n      return this;\n    }\n\n    @Override\n    public @Nullable Path getRootDir() {\n      return rootDir;\n    }\n\n    @Override\n    public SecurityManager build() {\n      if (allowedResources.isEmpty() && allowedModules.isEmpty()) {\n        throw new IllegalStateException(\"No security manager set.\");\n      }\n\n      return new Standard(allowedModules, allowedResources, defaultTrustLevels, rootDir);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/StackFrame.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.core.util.Nullable;\n\n/** An element of a Pkl stack trace. */\n// better name would be `StackTraceElement`\npublic final class StackFrame {\n  private final String moduleUri;\n\n  // TODO: can we make this non-null?\n  private final @Nullable String memberName;\n\n  private final List<String> sourceLines;\n  private final int startLine;\n  private final int startColumn;\n  private final int endLine;\n  private final int endColumn;\n\n  public StackFrame(\n      String moduleUri,\n      @Nullable String memberName,\n      List<String> sourceLines,\n      int startLine,\n      int startColumn,\n      int endLine,\n      int endColumn) {\n\n    assert startLine >= 1;\n    assert startColumn >= 1;\n    assert endLine >= 1;\n    assert endColumn >= 1;\n    assert startLine <= endLine;\n    assert startLine < endLine || startColumn <= endColumn;\n\n    this.moduleUri = moduleUri;\n    this.memberName = memberName;\n    this.sourceLines = sourceLines;\n    this.startLine = startLine;\n    this.startColumn = startColumn;\n    this.endLine = endLine;\n    this.endColumn = endColumn;\n  }\n\n  /** Returns the module URI to display for this frame. May not be a syntactically valid URI. */\n  public String getModuleUri() {\n    return moduleUri;\n  }\n\n  /** Returns a copy of this frame with the given module URI. */\n  public StackFrame withModuleUri(String moduleUri) {\n    return new StackFrame(\n        moduleUri, memberName, sourceLines, startLine, startColumn, endLine, endColumn);\n  }\n\n  /** Returns the qualified name of the property or function corresponding to this frame, if any. */\n  public @Nullable String getMemberName() {\n    return memberName;\n  }\n\n  /**\n   * Returns the lines of source code corresponding to this frame. The first line has line number\n   * {@link #getStartLine}. The last line has line number {@link #getEndLine()}.\n   */\n  public List<String> getSourceLines() {\n    return sourceLines;\n  }\n\n  /** Returns the start line number (1-based) corresponding to this frame. */\n  public int getStartLine() {\n    return startLine;\n  }\n\n  /** Returns the start column number (1-based) corresponding to this frame. */\n  public int getStartColumn() {\n    return startColumn;\n  }\n\n  /** Returns the end line number (1-based) corresponding to this frame. */\n  public int getEndLine() {\n    return endLine;\n  }\n\n  /** Returns the end column number (1-based) corresponding to this frame. */\n  public int getEndColumn() {\n    return endColumn;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof StackFrame other)) return false;\n    if (startLine != other.startLine) return false;\n    if (startColumn != other.startColumn) return false;\n    if (endLine != other.endLine) return false;\n    if (endColumn != other.endColumn) return false;\n    if (!moduleUri.equals(other.moduleUri)) return false;\n    if (!Objects.equals(memberName, other.memberName)) return false;\n    return sourceLines.equals(other.sourceLines);\n  }\n\n  @Override\n  public int hashCode() {\n    var result = moduleUri.hashCode();\n    result = 31 * result + Objects.hashCode(memberName);\n    result = 31 * result + sourceLines.hashCode();\n    result = 31 * result + startLine;\n    result = 31 * result + startColumn;\n    result = 31 * result + endLine;\n    result = 31 * result + endColumn;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/StackFrameTransformer.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.function.Function;\n\n/** Transforms stack frames to make Pkl stack trace output more useful. */\n@FunctionalInterface\npublic interface StackFrameTransformer extends Function<StackFrame, StackFrame> {\n  default StackFrameTransformer andThen(StackFrameTransformer transformer) {\n    return stackTrace -> transformer.apply(apply(stackTrace));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/StackFrameTransformers.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.stream.StreamSupport;\nimport org.pkl.core.packages.PackageAssetUri;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.settings.PklSettings;\nimport org.pkl.core.util.IoUtils;\n\n/** Static factory for stack frame transformers. */\npublic final class StackFrameTransformers {\n\n  private StackFrameTransformers() {}\n\n  public static final StackFrameTransformer empty = s -> s;\n\n  public static final StackFrameTransformer convertStdLibUrlToExternalUrl =\n      frame -> {\n        var uri = frame.getModuleUri();\n        if (uri.startsWith(\"pkl:\")) {\n          var moduleName = uri.substring(4);\n          return frame.withModuleUri(\n              Release.current()\n                  .sourceCode()\n                  .getFilePage(\"stdlib/\" + moduleName + \".pkl#L\" + frame.getStartLine()));\n        }\n        return frame;\n      };\n\n  public static final StackFrameTransformer replacePackageUriWithSourceCodeUrl =\n      frame -> {\n        var uri = URI.create(frame.getModuleUri());\n        if (!uri.getScheme().equalsIgnoreCase(\"package\")) {\n          return frame;\n        }\n        try {\n          var assetUri = new PackageAssetUri(uri);\n          var packageResolver = VmContext.get(null).getPackageResolver();\n          assert packageResolver != null;\n          var pkg = packageResolver.getDependencyMetadata(assetUri.getPackageUri(), null);\n          var sourceCode = pkg.getSourceCodeUrlScheme();\n          if (sourceCode == null) {\n            return frame;\n          }\n          return transformUri(frame, uri.getFragment(), sourceCode);\n        } catch (IOException | URISyntaxException | SecurityManagerException e) {\n          // should never get here. by this point, we should have already performed all validation\n          // and downloaded all assets.\n          throw PklBugException.unreachableCode();\n        }\n      };\n\n  public static final StackFrameTransformer fromServiceProviders = loadFromServiceProviders();\n\n  public static final StackFrameTransformer defaultTransformer =\n      fromServiceProviders\n          .andThen(convertStdLibUrlToExternalUrl)\n          .andThen(replacePackageUriWithSourceCodeUrl);\n\n  private static StackFrame transformUri(StackFrame frame, String path, String format) {\n    var uri = frame.getModuleUri();\n    var newUri =\n        format\n            .replace(\"%{path}\", path)\n            .replace(\"%{url}\", uri)\n            .replace(\"%{line}\", String.valueOf(frame.getStartLine()))\n            .replace(\"%{endLine}\", String.valueOf(frame.getEndLine()))\n            .replace(\"%{column}\", String.valueOf(frame.getStartColumn()))\n            .replace(\"%{endColumn}\", String.valueOf(frame.getEndColumn()));\n    return frame.withModuleUri(newUri);\n  }\n\n  public static StackFrameTransformer convertFilePathToUriScheme(String scheme) {\n    return frame -> {\n      var uri = frame.getModuleUri();\n      if (!uri.startsWith(\"file:\")) return frame;\n\n      return transformUri(frame, IoUtils.pathOf(URI.create(uri)).toString(), scheme);\n    };\n  }\n\n  public static StackFrameTransformer relativizeModuleUri(URI baseUri) {\n    return frame -> {\n      var uri = URI.create(frame.getModuleUri());\n      var relativized = baseUri.relativize(uri);\n      return frame.withModuleUri(relativized.toString());\n    };\n  }\n\n  public static StackFrameTransformer createDefault(PklSettings settings) {\n    return defaultTransformer\n        // order is relevant\n        .andThen(convertFilePathToUriScheme(settings.editor().urlScheme()));\n  }\n\n  private static StackFrameTransformer loadFromServiceProviders() {\n    var loader = IoUtils.createServiceLoader(StackFrameTransformer.class);\n    return StreamSupport.stream(loader.spliterator(), false)\n        .reduce((t1, t2) -> t1.andThen(t2))\n        .orElse(t -> t); // use no-op transformer if no service providers found\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/TestResults.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.pkl.core.util.Nullable;\n\n/**\n * The results of testing a Pkl test module.\n *\n * <p>A test module is a module that amends {@code pkl:test}, and is evaluated with {@link\n * Evaluator#evaluateTest(ModuleSource, boolean)}.\n *\n * <p>Test results have two sections; facts, and examples. Each section has multiple individual\n * results, which themselves contain individual assertions.\n *\n * @since 0.27.0\n * @param moduleName The name of the module that was tested.\n * @param displayUri A location URI formatted to be displayed.\n * @param facts The result of testing facts.\n * @param examples The result of testing examples.\n * @param logs The log output resulting from running the test.\n * @param error An error that arose from evaluating the test module itself.\n *     <p>If non-null, {@code facts} and {@code examples} are guaranteed to have 0 results.\n */\n@SuppressWarnings(\"UnusedReturnValue\")\npublic record TestResults(\n    String moduleName,\n    String displayUri,\n    TestSectionResults facts,\n    TestSectionResults examples,\n    String logs,\n    @Nullable Error error) {\n\n  /** The total number of tests between facts and examples. */\n  public int totalTests() {\n    return facts.totalTests() + examples.totalTests();\n  }\n\n  /**\n   * The total number of failed {@linkplain TestResult test results}.\n   *\n   * <p>A {@link TestResult} has failed if any of its assertions have a {@link Failure} or an {@link\n   * Error}.\n   */\n  public int totalFailures() {\n    return facts.totalFailures() + examples.totalFailures();\n  }\n\n  /** The total number of assertions between facts and examples. */\n  public int totalAsserts() {\n    return facts.totalAsserts() + examples.totalAsserts();\n  }\n\n  /**\n   * The total number of individual assertions that have failed.\n   *\n   * <p>A single test can have multiple failed assertions.\n   */\n  public int totalAssertsFailed() {\n    return facts.totalAssertsFailedOrErrored() + examples.totalAssertsFailedOrErrored();\n  }\n\n  /**\n   * Whether the test in aggregate has failed or not.\n   *\n   * <p>An individual {@link TestResult} has failed if any of its assertions have a {@link Failure}\n   * or an {@link Error}.\n   */\n  public boolean failed() {\n    return error != null || facts.failed() || examples.failed();\n  }\n\n  /**\n   * Whether the test result has failed due to examples being written.\n   *\n   * <p>Returns {@code true} if and only if there are failures, and all failures are due to examples\n   * being written.\n   */\n  public boolean isExampleWrittenFailure() {\n    if (!failed() || facts.failed() || !examples.failed()) return false;\n    for (var testResult : examples.results) {\n      if (!testResult.isExampleWritten) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  public static class Builder {\n\n    private final String moduleName;\n    private final String displayUri;\n    private TestSectionResults factsSection =\n        new TestSectionResults(TestSectionName.FACTS, List.of());\n    private TestSectionResults examplesSection =\n        new TestSectionResults(TestSectionName.EXAMPLES, List.of());\n    private String stdErr = \"\";\n    private @Nullable Error error = null;\n\n    public Builder(String moduleName, String displayUri) {\n      this.moduleName = moduleName;\n      this.displayUri = displayUri;\n    }\n\n    public Builder setError(Error error) {\n      this.error = error;\n      return this;\n    }\n\n    public Builder setStdErr(String stdErr) {\n      this.stdErr = stdErr;\n      return this;\n    }\n\n    public Builder setFactsSection(TestSectionResults factsSection) {\n      assert factsSection.name() == TestSectionName.FACTS;\n      this.factsSection = factsSection;\n      return this;\n    }\n\n    public Builder setExamplesSection(TestSectionResults examplesSection) {\n      assert examplesSection.name() == TestSectionName.EXAMPLES;\n      this.examplesSection = examplesSection;\n      return this;\n    }\n\n    public TestResults build() {\n      return new TestResults(moduleName, displayUri, factsSection, examplesSection, stdErr, error);\n    }\n  }\n\n  public enum TestSectionName {\n    FACTS(\"facts\"),\n    EXAMPLES(\"examples\");\n\n    private final String name;\n\n    TestSectionName(final String name) {\n      this.name = name;\n    }\n\n    @Override\n    public String toString() {\n      return name;\n    }\n  }\n\n  /**\n   * The results of either facts or examples.\n   *\n   * @param name The name of this section\n   * @param results The results of the individual tests in this section.\n   */\n  public record TestSectionResults(TestSectionName name, List<TestResult> results) {\n    public int totalTests() {\n      return results.size();\n    }\n\n    public int totalAsserts() {\n      var total = 0;\n      for (var res : results) {\n        total += res.totalAsserts();\n      }\n      return total;\n    }\n\n    public int totalAssertsFailedOrErrored() {\n      var total = 0;\n      for (var res : results) {\n        total += res.totalAssertsFailedOrErrored();\n      }\n      return total;\n    }\n\n    public int totalFailures() {\n      var total = 0;\n      for (var res : results) {\n        if (res.isFailure()) {\n          total++;\n        }\n      }\n      return total;\n    }\n\n    public boolean failed() {\n      for (var res : results) {\n        if (res.isFailure()) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    public boolean hasError() {\n      for (var res : results) {\n        if (res.hasErrors()) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }\n\n  /**\n   * The result of a single test.\n   *\n   * <p>A test can have multiple assertions, where the assertion itself can have failed, or have\n   * thrown an exception.\n   *\n   * @param name The name of the test.\n   * @param totalAsserts The total number of assertions in the test.\n   * @param failures The number of assertion failures in the test.\n   * @param errors The number of errors that were thrown when the test was run.\n   * @param isExampleWritten Whether the test is considered as having its example written or not.\n   */\n  public record TestResult(\n      String name,\n      int totalAsserts,\n      List<Failure> failures,\n      List<Error> errors,\n      boolean isExampleWritten) {\n\n    public int totalAssertsFailedOrErrored() {\n      return failures().size() + errors.size();\n    }\n\n    public boolean isFailure() {\n      return totalAssertsFailedOrErrored() > 0;\n    }\n\n    public boolean hasErrors() {\n      return !errors().isEmpty();\n    }\n\n    public boolean hasFailures() {\n      return !failures.isEmpty();\n    }\n\n    public static class Builder {\n\n      private final String name;\n      private final List<Failure> failures = new ArrayList<>();\n      private final List<Error> errors = new ArrayList<>();\n      private boolean isExampleWritten;\n      private int count = 0;\n\n      public Builder(String name) {\n        this.name = name;\n      }\n\n      public Builder addSuccess() {\n        count++;\n        return this;\n      }\n\n      public int getCount() {\n        return count;\n      }\n\n      public Builder addFailure(Failure failure) {\n        this.failures.add(failure);\n        count++;\n        return this;\n      }\n\n      public Builder addError(Error error) {\n        this.errors.add(error);\n        count++;\n        return this;\n      }\n\n      public Builder setExampleWritten(boolean exampleWritten) {\n        this.isExampleWritten = exampleWritten;\n        return this;\n      }\n\n      public TestResult build() {\n        return new TestResult(name, count, failures, errors, isExampleWritten);\n      }\n    }\n  }\n\n  /**\n   * Indicates that an exception was thrown when evaluating the assertion.\n   *\n   * @param message The message of the underlying exception.\n   * @param exception The exception thrown by Pkl\n   */\n  public record Error(String message, PklException exception) {}\n\n  /**\n   * Indicates that an assertion failed.\n   *\n   * @param kind The type of assertion failure.\n   * @param message The detailed message for the failure.\n   */\n  public record Failure(String kind, String message) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/TypeAlias.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.util.List;\nimport java.util.Set;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of a {@code pkl.base#TypeAlias} value. */\npublic final class TypeAlias extends Member implements Value {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final String moduleName;\n  private final String qualifiedName;\n  private final List<TypeParameter> typeParameters;\n\n  @LateInit private PType aliasedType;\n\n  public TypeAlias(\n      @Nullable String docComment,\n      SourceLocation sourceLocation,\n      Set<Modifier> modifiers,\n      List<PObject> annotations,\n      String simpleName,\n      String moduleName,\n      String qualifiedName,\n      List<TypeParameter> typeParameters) {\n    super(docComment, sourceLocation, modifiers, annotations, simpleName);\n    this.moduleName = moduleName;\n    this.qualifiedName = qualifiedName;\n    this.typeParameters = typeParameters;\n  }\n\n  public void initAliasedType(PType type) {\n    assert aliasedType == null;\n    aliasedType = type;\n  }\n\n  /**\n   * Returns the name of the module that this type alias is declared in. Note that a module name is\n   * not guaranteed to be unique, especially if it is not declared but inferred from the module URI.\n   */\n  public String getModuleName() {\n    return moduleName;\n  }\n\n  /**\n   * Returns the qualified name of this type alias, `moduleName#typeAliasName`. Note that a\n   * qualified type alias name is not guaranteed to be unique, especially if the module name is not\n   * declared but inferred from the module URI.\n   */\n  public String getQualifiedName() {\n    return qualifiedName;\n  }\n\n  /** Returns the name of this type alias for use in user-facing messages. */\n  public String getDisplayName() {\n    // display `String` rather than `pkl.base#String`, etc.\n    return moduleName.equals(\"pkl.base\") ? getSimpleName() : qualifiedName;\n  }\n\n  public List<TypeParameter> getTypeParameters() {\n    return typeParameters;\n  }\n\n  /** Returns the type that this type alias stands for. */\n  public PType getAliasedType() {\n    assert aliasedType != null;\n    return aliasedType;\n  }\n\n  @Override\n  public void accept(ValueVisitor visitor) {\n    visitor.visitTypeAlias(this);\n  }\n\n  @Override\n  public <T> T accept(ValueConverter<T> converter) {\n    return converter.convertTypeAlias(this);\n  }\n\n  @Override\n  public PClassInfo<?> getClassInfo() {\n    return PClassInfo.TypeAlias;\n  }\n\n  public String toString() {\n    return getDisplayName();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/TypeParameter.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serial;\nimport java.io.Serializable;\nimport org.pkl.core.util.LateInit;\n\n/** A type parameter of a generic class, type alias, or method. */\npublic final class TypeParameter implements Serializable {\n  @Serial private static final long serialVersionUID = 0L;\n\n  private final Variance variance;\n  private final String name;\n  private final int index;\n\n  @LateInit private volatile Member owner;\n\n  public TypeParameter(Variance variance, String name, int index) {\n    this.variance = variance;\n    this.name = name;\n    this.index = index;\n  }\n\n  /**\n   * Initializes the generic class, type alias, or method that this type parameter belongs to. This\n   * method must be called as part of initializing this object. It is kept separate from the\n   * constructor to help clients avoid circular evaluation.\n   */\n  public void initOwner(Member owner) {\n    assert this.owner == null;\n    this.owner = owner;\n  }\n\n  /** Returns the generic class, type alias, or method that this type parameter belongs to. */\n  public Member getOwner() {\n    assert owner != null;\n    return owner;\n  }\n\n  /** Returns the variance of this type parameter. */\n  public Variance getVariance() {\n    return variance;\n  }\n\n  /** Returns the name of this type parameter. */\n  public String getName() {\n    return name;\n  }\n\n  /**\n   * Returns the index of this type parameter in its owner's type parameter list, starting from\n   * zero.\n   */\n  public int getIndex() {\n    return index;\n  }\n\n  /** The variance of a type parameter. */\n  public enum Variance {\n    INVARIANT,\n    /** An `out` parameter. */\n    COVARIANT,\n    /** An `in` parameter. */\n    CONTRAVARIANT\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Value.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Serializable;\n\n/**\n * Java representation of a Pkl value.\n *\n * <p>The following Pkl values aren't represented as {@code Value} but as instances of Java standard\n * library classes:\n *\n * <ul>\n *   <li>{@code pkl.base#String}: {@link java.lang.String}\n *   <li>{@code pkl.base#Boolean}: {@link java.lang.Boolean}\n *   <li>{@code pkl.base#Int}: {@link java.lang.Long}\n *   <li>{@code pkl.base#Float}: {@link java.lang.Double}\n *   <li>{@code pkl.base#List}: {@link java.util.List}\n *   <li>{@code pkl.base#Set}: {@link java.util.Set}\n *   <li>{@code pkl.base#Map}: {@link java.util.Map}\n *   <li>{@code pkl.base#Listing}: {@link java.util.List}\n *   <li>{@code pkl.base#Mapping}: {@link java.util.Map}\n *   <li>{@code pkl.base#Regex}: {@link java.util.regex.Pattern}\n * </ul>\n */\npublic interface Value extends Serializable {\n  /** Invokes the given visitor's visit method for this {@code Value}. */\n  void accept(ValueVisitor visitor);\n\n  /** Invokes the given converters's convert method for this {@code Value}. */\n  <T> T accept(ValueConverter<T> converter);\n\n  /** Returns information about the Pkl class associated with this {@code Value}. */\n  PClassInfo<?> getClassInfo();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ValueConverter.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.regex.Pattern;\n\n/** Converter for data models generated by [Evaluator]. */\n@SuppressWarnings(\"unused\")\npublic interface ValueConverter<T> {\n  T convertNull();\n\n  T convertString(String value);\n\n  T convertBoolean(Boolean value);\n\n  T convertInt(Long value);\n\n  T convertFloat(Double value);\n\n  T convertDuration(Duration value);\n\n  T convertDataSize(DataSize value);\n\n  T convertBytes(byte[] value);\n\n  T convertPair(Pair<?, ?> value);\n\n  T convertList(List<?> value);\n\n  T convertSet(Set<?> value);\n\n  T convertMap(Map<?, ?> value);\n\n  T convertObject(PObject value);\n\n  T convertModule(PModule value);\n\n  T convertClass(PClass value);\n\n  T convertTypeAlias(TypeAlias value);\n\n  T convertRegex(Pattern value);\n\n  default T convert(Object value) {\n    if (value instanceof Value v) {\n      return (v.accept(this));\n    } else if (value instanceof String string) {\n      return convertString(string);\n    } else if (value instanceof Boolean b) {\n      return convertBoolean(b);\n    } else if (value instanceof Long l) {\n      return convertInt(l);\n    } else if (value instanceof Double d) {\n      return convertFloat(d);\n    } else if (value instanceof List<?> list) {\n      return convertList(list);\n    } else if (value instanceof Set<?> set) {\n      return convertSet(set);\n    } else if (value instanceof Map<?, ?> map) {\n      return convertMap(map);\n    } else if (value instanceof Pattern pattern) {\n      return convertRegex(pattern);\n    } else {\n      throw new IllegalArgumentException(\"Cannot convert value with unexpected type: \" + value);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ValueFormatter.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\n\npublic final class ValueFormatter {\n  private static final ValueFormatter BASIC = new ValueFormatter(false, false);\n\n  private static final ValueFormatter WITH_CUSTOM_DELIMITERS = new ValueFormatter(false, true);\n\n  private final boolean useMultilineStrings;\n  private final boolean useCustomStringDelimiters;\n\n  /** Equivalent to {@code new ValueFormatter(false, false)}. */\n  public static ValueFormatter basic() {\n    return BASIC;\n  }\n\n  /** Equivalent to {@code new ValueFormatter(false, true)}. */\n  public static ValueFormatter withCustomStringDelimiters() {\n    return WITH_CUSTOM_DELIMITERS;\n  }\n\n  /**\n   * Constructs an instance of a {@link ValueFormatter}.\n   *\n   * <p>If {@code useMultilineStrings} is {@code true}, string values containing newline characters\n   * are formatted as multiline string literals.\n   *\n   * <p>If {@code useCustomStringDelimiters} is {@code true}, custom string delimiters (such as\n   * {@code #\"...\"#}) are preferred over escaping quotes and backslashes.\n   */\n  public ValueFormatter(boolean useMultilineStrings, boolean useCustomStringDelimiters) {\n    this.useMultilineStrings = useMultilineStrings;\n    this.useCustomStringDelimiters = useCustomStringDelimiters;\n  }\n\n  /**\n   * Formats {@code value} as a Pkl/Pcf string literal (including quotes).\n   *\n   * <p>If {@code value} contains a {@code \\n} character, a multiline string literal is returned,\n   * and subsequent lines are indented by {@code lineIndent}. Otherwise, a single line string\n   * literal is returned.\n   */\n  @SuppressWarnings(\"unused\")\n  public String formatStringValue(String value, CharSequence lineIndent) {\n    StringBuilder builder = new StringBuilder(value.length() * 2);\n    formatStringValue(value, lineIndent, builder);\n    return builder.toString();\n  }\n\n  /**\n   * Same as {@link #formatStringValue(String, CharSequence)}, except that output goes to {@code\n   * builder}.\n   */\n  public void formatStringValue(String value, CharSequence lineIndent, StringBuilder builder) {\n    try {\n      formatStringValue(value, lineIndent, (Appendable) builder);\n    } catch (IOException e) {\n      throw new AssertionError(\"unreachable\");\n    }\n  }\n\n  /**\n   * Same as {@link #formatStringValue(String, CharSequence)}, except that output goes to {@code\n   * appendable} (which may cause {@link IOException}).\n   */\n  public void formatStringValue(String value, CharSequence lineIndent, Appendable appendable)\n      throws IOException {\n    // Optimization: if we are rendering single line strings and not rendering custom string\n    // delimiters, there is no need to gather string facts.\n    if (!useMultilineStrings && !useCustomStringDelimiters) {\n      formatSingleLineString(value, appendable, \"\");\n      return;\n    }\n    var stringFacts = StringFacts.gather(value);\n    var isMultiline = useMultilineStrings && stringFacts.isMultiline;\n    if (isMultiline) {\n      var poundChars =\n          useCustomStringDelimiters ? \"#\".repeat(stringFacts.poundCharCountMultiline) : \"\";\n      formatMultilineString(value, lineIndent, appendable, poundChars);\n    } else {\n      var poundChars =\n          useCustomStringDelimiters ? \"#\".repeat(stringFacts.poundCharCountSingleLine) : \"\";\n      formatSingleLineString(value, appendable, poundChars);\n    }\n  }\n\n  private void formatSingleLineString(String value, Appendable appendable, String poundChars)\n      throws IOException {\n    appendable.append(poundChars).append('\"');\n\n    var i = 0;\n    var escapeSequence = \"\\\\\" + poundChars;\n\n    if (useCustomStringDelimiters) {\n      if (value.equals(\"\\\"\")) {\n        // Edge case 1: If the string consists of a single quote, we must escape it. Otherwise the\n        // output is `#\"\"\"#`.\n        appendable.append(escapeSequence).append(value);\n        i = 1;\n      } else if (value.startsWith(\"\\\"\\\"\")) {\n        // Edge case 2: If the string starts with two quotes, we must escape the second one.\n        // Otherwise, it will\n        // be interpreted as a multiline string start (e.g. `\"\"\"`).\n        appendable.append('\"').append(escapeSequence).append('\"');\n        i = 2;\n      }\n    }\n\n    for (; i < value.length(); i++) {\n      var ch = value.charAt(i);\n      switch (ch) {\n        case '\\n' -> appendable.append(escapeSequence).append('n');\n        case '\\r' -> appendable.append(escapeSequence).append('r');\n        case '\\t' -> appendable.append(escapeSequence).append('t');\n        case '\\\\' -> {\n          if (useCustomStringDelimiters) {\n            appendable.append(ch);\n          } else {\n            appendable.append(\"\\\\\\\\\");\n          }\n        }\n        case '\"' -> {\n          if (useCustomStringDelimiters) {\n            appendable.append(ch);\n          } else {\n            appendable.append(\"\\\\\\\"\");\n          }\n        }\n        default -> appendable.append(ch);\n      }\n    }\n\n    appendable.append('\"').append(poundChars);\n  }\n\n  private void formatMultilineString(\n      String value, CharSequence lineIndent, Appendable appendable, String poundChars)\n      throws IOException {\n    var consecutiveQuotes = 0;\n    var escapeSequence = \"\\\\\" + poundChars;\n\n    appendable.append(poundChars).append(\"\\\"\\\"\\\"\\n\").append(lineIndent);\n\n    for (var i = 0; i < value.length(); i++) {\n      var ch = value.charAt(i);\n      switch (ch) {\n        case '\\n' -> {\n          appendable.append('\\n').append(lineIndent);\n          consecutiveQuotes = 0;\n        }\n        case '\\r' -> {\n          appendable.append(escapeSequence).append('r');\n          consecutiveQuotes = 0;\n        }\n        case '\\t' -> {\n          appendable.append(escapeSequence).append('t');\n          consecutiveQuotes = 0;\n        }\n        case '\\\\' -> {\n          if (useCustomStringDelimiters) {\n            appendable.append(ch);\n          } else {\n            appendable.append(\"\\\\\\\\\");\n          }\n          consecutiveQuotes = 0;\n        }\n        case '\"' -> {\n          if (consecutiveQuotes == 2 && !useCustomStringDelimiters) {\n            appendable.append(\"\\\\\\\"\");\n            consecutiveQuotes = 0;\n          } else {\n            appendable.append('\"');\n            consecutiveQuotes += 1;\n          }\n        }\n        default -> {\n          appendable.append(ch);\n          consecutiveQuotes = 0;\n        }\n      }\n    }\n\n    appendable.append(\"\\n\").append(lineIndent).append(\"\\\"\\\"\\\"\").append(poundChars);\n  }\n\n  /**\n   * Stores basic facts about a string. This is used to assist with pretty-formatting Pcf strings;\n   * e.g. determining whether to render as a multiline string, and whether to wrap the string with\n   * {@code #} delimiters.\n   */\n  private static final class StringFacts {\n    private final boolean isMultiline;\n\n    /** The number of pound characters that should wrap a string if rendering as single line. */\n    private final int poundCharCountSingleLine;\n\n    /** The number of pound characters that should wrap a string if rendering as multiline. */\n    private final int poundCharCountMultiline;\n\n    private StringFacts(\n        boolean isMultiline, int poundCharCountSingleLine, int poundCharCountMultiline) {\n      this.isMultiline = isMultiline;\n      this.poundCharCountSingleLine = poundCharCountSingleLine;\n      this.poundCharCountMultiline = poundCharCountMultiline;\n    }\n\n    /**\n     * Gathers the following pieces of information about a string:\n     *\n     * <ul>\n     *   <li>What is the maximum number of consecutive pound characters that follow a multiline\n     *       quote ({@code \"\"\"})?\n     *   <li>What is the maximum number of consecutive pound characters that follow a single line\n     *       quote ({@code \"})?\n     *   <li>Are there newline characters in the string?\n     * </ul>\n     *\n     * This is used to assist with rendering custom delimited strings (e.g. {@code #\"...\"#}).\n     *\n     * <p>Algorithm:\n     *\n     * <ol>\n     *   <li>Determine the current token context (backlash, single line quote, multiline quote,\n     *       other).\n     *   <li>If there is a current token context, count the number of pound characters succeeding\n     *       that token.\n     *   <li>Keep track of the maximum number of pound characters for each token type.\n     * </ol>\n     */\n    static StringFacts gather(final String value) {\n      var isMultiline = false;\n      var consecutiveQuoteCount = 0;\n      var currentPoundContext = PoundContext.OTHER;\n      var currentPoundCountSingleQuote = 0;\n      var currentPoundCountMultilineQuote = 0;\n      var currentPoundCountBackslash = 0;\n      var poundCountSingleQuote = 0;\n      var poundCountMultilineQuote = 0;\n      var poundCountBackslash = 0;\n      for (var i = 0; i < value.length(); i++) {\n        var ch = value.charAt(i);\n        switch (ch) {\n          case '\\\\' -> {\n            currentPoundContext = PoundContext.BACKSLASH;\n            currentPoundCountBackslash = 1;\n            poundCountBackslash = Math.max(poundCountBackslash, currentPoundCountBackslash);\n          }\n          case '\"' -> {\n            consecutiveQuoteCount += 1;\n            if (consecutiveQuoteCount < 3) {\n              currentPoundContext = PoundContext.SINGLELINE_QUOTE;\n              currentPoundCountSingleQuote = 1;\n              poundCountSingleQuote = Math.max(poundCountSingleQuote, currentPoundCountSingleQuote);\n            } else {\n              currentPoundContext = PoundContext.MULTILINE_QUOTE;\n              currentPoundCountMultilineQuote = 1;\n              poundCountMultilineQuote =\n                  Math.max(poundCountMultilineQuote, currentPoundCountMultilineQuote);\n            }\n          }\n          case '#' -> {\n            consecutiveQuoteCount = 0;\n            switch (currentPoundContext) {\n              case SINGLELINE_QUOTE -> {\n                currentPoundCountSingleQuote += 1;\n                poundCountSingleQuote =\n                    Math.max(poundCountSingleQuote, currentPoundCountSingleQuote);\n              }\n              case MULTILINE_QUOTE -> {\n                currentPoundCountMultilineQuote += 1;\n                poundCountMultilineQuote =\n                    Math.max(poundCountMultilineQuote, currentPoundCountMultilineQuote);\n              }\n              case BACKSLASH -> {\n                currentPoundCountBackslash += 1;\n                poundCountBackslash = Math.max(poundCountBackslash, currentPoundCountBackslash);\n              }\n              default -> {}\n            }\n          }\n          case '\\n' -> {\n            isMultiline = true;\n            consecutiveQuoteCount = 0;\n            currentPoundContext = PoundContext.OTHER;\n          }\n          default -> {\n            consecutiveQuoteCount = 0;\n            currentPoundContext = PoundContext.OTHER;\n          }\n        }\n      }\n      return new StringFacts(\n          isMultiline,\n          Math.max(poundCountBackslash, poundCountSingleQuote),\n          Math.max(poundCountBackslash, poundCountMultilineQuote));\n    }\n\n    /** Represents the context in which the pound character ({@code #}) succeeds. */\n    private enum PoundContext {\n      OTHER,\n      SINGLELINE_QUOTE,\n      MULTILINE_QUOTE,\n      BACKSLASH,\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ValueRenderer.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\n/** Renders Pkl values in some output format. */\npublic interface ValueRenderer {\n  /**\n   * Renders the given value as a complete document.\n   *\n   * <p>Some renderers impose restrictions on which types of values can be rendered as document.\n   *\n   * <p>A typical implementation of this method renders a document header/footer and otherwise\n   * delegates to {@link #renderValue}.\n   */\n  void renderDocument(Object value);\n\n  /** Renders the given value. */\n  void renderValue(Object value);\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ValueRenderers.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.Writer;\n\n/** Predefined {@link ValueRenderer}s for Pcf, JSON, YAML, and XML property lists. */\npublic final class ValueRenderers {\n  private ValueRenderers() {}\n\n  /**\n   * Creates a renderer for Pcf, a static subset of Pkl. If {@code omitNullProperties} is {@code\n   * true}, object properties whose value is {@code null} will not be rendered. If {@code\n   * useCustomDelimiters} is {@code true}, custom string delimiters (such as {@code #\"...\"#}) are\n   * preferred over escaping quotes and backslashes.\n   */\n  public static ValueRenderer pcf(\n      Writer writer, String indent, boolean omitNullProperties, boolean useCustomStringDelimiters) {\n    return new PcfRenderer(writer, indent, omitNullProperties, useCustomStringDelimiters);\n  }\n\n  /**\n   * Creates a renderer for JSON. If {@code omitNullProperties} is {@code true}, object properties\n   * whose value is {@code null} will not be rendered.\n   */\n  public static ValueRenderer json(Writer writer, String indent, boolean omitNullProperties) {\n    return new JsonRenderer(writer, indent, omitNullProperties);\n  }\n\n  /**\n   * Creates a renderer for YAML. If {@code omitNullProperties} is {@code true}, object properties\n   * whose value is {@code null} will not be rendered. If {@code isStream} is {@code true}, {@link\n   * ValueRenderer#renderDocument} expects an argument of type {@link Iterable} and renders it as\n   * YAML stream.\n   */\n  public static ValueRenderer yaml(\n      Writer writer, int indent, boolean omitNullProperties, boolean isStream) {\n    return new YamlRenderer(writer, indent, omitNullProperties, isStream);\n  }\n\n  /** Creates a renderer for XML property lists. */\n  public static ValueRenderer plist(Writer writer, String indent) {\n    return new PListRenderer(writer, indent);\n  }\n\n  /**\n   * Creates a renderer for {@link java.util.Properties} file format. If {@code omitNullProperties}\n   * is {@code true}, object properties and map entries whose value is {@code null} will not be\n   * rendered. If {@code restrictCharset} is {@code true} characters outside the printable US-ASCII\n   * charset range will be rendered as <a\n   * href=\"https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.3\">Unicode\n   * escapes</a>.\n   */\n  public static ValueRenderer properties(\n      Writer writer, boolean omitNullProperties, boolean restrictCharset) {\n    return new PropertiesRenderer(writer, omitNullProperties, restrictCharset);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ValueVisitor.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.Nullable;\n\n/** Visitor for data models generated by [Evaluator]. */\npublic interface ValueVisitor {\n  default void visitDefault(@Nullable Object value) {}\n\n  default void visitNull() {\n    visitDefault(null);\n  }\n\n  default void visitString(String value) {\n    visitDefault(value);\n  }\n\n  default void visitBoolean(Boolean value) {\n    visitDefault(value);\n  }\n\n  default void visitInt(Long value) {\n    visitDefault(value);\n  }\n\n  default void visitFloat(Double value) {\n    visitDefault(value);\n  }\n\n  default void visitDuration(Duration value) {\n    visitDefault(value);\n  }\n\n  default void visitDataSize(DataSize value) {\n    visitDefault(value);\n  }\n\n  default void visitBytes(byte[] value) {\n    visitDefault(value);\n  }\n\n  default void visitPair(Pair<?, ?> value) {\n    visitDefault(value);\n  }\n\n  default void visitList(List<?> value) {\n    visitDefault(value);\n  }\n\n  default void visitSet(Set<?> value) {\n    visitDefault(value);\n  }\n\n  default void visitMap(Map<?, ?> value) {\n    visitDefault(value);\n  }\n\n  default void visitObject(PObject value) {\n    visitDefault(value);\n  }\n\n  default void visitModule(PModule value) {\n    visitDefault(value);\n  }\n\n  default void visitClass(PClass value) {\n    visitDefault(value);\n  }\n\n  default void visitTypeAlias(TypeAlias value) {\n    visitDefault(value);\n  }\n\n  default void visitRegex(Pattern value) {\n    visitDefault(value);\n  }\n\n  default void visit(Object value) {\n    if (value instanceof Value v) {\n      v.accept(this);\n    } else if (value instanceof String string) {\n      visitString(string);\n    } else if (value instanceof Boolean b) {\n      visitBoolean(b);\n    } else if (value instanceof Long l) {\n      visitInt(l);\n    } else if (value instanceof Double d) {\n      visitFloat(d);\n    } else if (value instanceof List<?> list) {\n      visitList(list);\n    } else if (value instanceof Set<?> set) {\n      visitSet(set);\n    } else if (value instanceof Map<?, ?> map) {\n      visitMap(map);\n    } else if (value instanceof Pattern pattern) {\n      visitRegex(pattern);\n    } else if (value instanceof byte[] bytes) {\n      visitBytes(bytes);\n    } else {\n      throw new IllegalArgumentException(\"Cannot visit value with unexpected type: \" + value);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/Version.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.util.*;\nimport java.util.regex.*;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\n/**\n * A <a href=\"https://semver.org/spec/v2.0.0.html\">semantic version</a>.\n *\n * <p>This class guarantees that valid semantic version numbers are handled correctly, but does\n * <em>not</em> guarantee that invalid semantic version numbers are rejected.\n */\n// copied by `org.pkl.executor.Version` to avoid dependency on pkl-core\n@SuppressWarnings(\"Duplicates\")\npublic final class Version implements Comparable<Version> {\n  // https://semver.org/#backusnaur-form-grammar-for-valid-semver-versions\n  private static final Pattern VERSION =\n      Pattern.compile(\"(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)(?:-([^+]+))?(?:\\\\+(.+))?\");\n\n  private static final Pattern NUMERIC_IDENTIFIER = Pattern.compile(\"(0|[1-9]\\\\d*)\");\n\n  private static final Comparator<Version> COMPARATOR =\n      Comparator.comparingInt(Version::getMajor)\n          .thenComparingInt(Version::getMinor)\n          .thenComparingInt(Version::getPatch)\n          .thenComparing(\n              (v1, v2) -> {\n                if (v1.preRelease == null) return v2.preRelease == null ? 0 : 1;\n                if (v2.preRelease == null) return -1;\n                var ids1 = v1.getPreReleaseIdentifiers();\n                var ids2 = v2.getPreReleaseIdentifiers();\n                var minSize = Math.min(ids1.length, ids2.length);\n                for (var i = 0; i < minSize; i++) {\n                  var result = ids1[i].compareTo(ids2[i]);\n                  if (result != 0) return result;\n                }\n                return Integer.compare(ids1.length, ids2.length);\n              });\n\n  private final int major;\n  private final int minor;\n  private final int patch;\n  private final @Nullable String preRelease;\n  private final @Nullable String build;\n\n  @LateInit private volatile Identifier[] __preReleaseIdentifiers;\n\n  /** Constructs a semantic version. */\n  public Version(\n      int major, int minor, int patch, @Nullable String preRelease, @Nullable String build) {\n    this.major = major;\n    this.minor = minor;\n    this.patch = patch;\n    this.preRelease = preRelease;\n    this.build = build;\n  }\n\n  /**\n   * Parses the given string as a semantic version number.\n   *\n   * <p>Throws {@link IllegalArgumentException} if the given string could not be parsed as a\n   * semantic version number or is too large to fit into a {@link Version}.\n   */\n  public static Version parse(String version) {\n    var result = parseOrNull(version);\n    if (result != null) return result;\n\n    if (VERSION.matcher(version).matches()) {\n      throw new IllegalArgumentException(\n          String.format(\"`%s` is too large to fit into a Version.\", version));\n    }\n\n    throw new IllegalArgumentException(\n        String.format(\"`%s` could not be parsed as a semantic version number.\", version));\n  }\n\n  /**\n   * Parses the given string as a semantic version number.\n   *\n   * <p>Returns {@code null} if the given string could not be parsed as a semantic version number or\n   * is too large to fit into a {@link Version}.\n   */\n  public static @Nullable Version parseOrNull(String version) {\n    var matcher = VERSION.matcher(version);\n    if (!matcher.matches()) return null;\n\n    try {\n      return new Version(\n          Integer.parseInt(matcher.group(1)),\n          Integer.parseInt(matcher.group(2)),\n          Integer.parseInt(matcher.group(3)),\n          matcher.group(4),\n          matcher.group(5));\n    } catch (NumberFormatException e) {\n      return null;\n    }\n  }\n\n  /** Returns a comparator for semantic versions. */\n  public static Comparator<Version> comparator() {\n    return COMPARATOR;\n  }\n\n  /** Returns the major version. */\n  public int getMajor() {\n    return major;\n  }\n\n  /** Returns a copy of this version with the given major version. */\n  public Version withMajor(int major) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the minor version. */\n  public int getMinor() {\n    return minor;\n  }\n\n  /** Returns a copy of this version with the given minor version. */\n  public Version withMinor(int minor) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the patch version. */\n  public int getPatch() {\n    return patch;\n  }\n\n  /** Returns a copy of this version with the given patch version. */\n  public Version withPatch(int patch) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the pre-release version (if any). */\n  public @Nullable String getPreRelease() {\n    return preRelease;\n  }\n\n  /** Returns a copy of this version with the given pre-release version. */\n  public Version withPreRelease(@Nullable String preRelease) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the build metadata (if any). */\n  public @Nullable String getBuild() {\n    return build;\n  }\n\n  /** Returns a copy of this version with the given build metadata. */\n  public Version withBuild(@Nullable String build) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Tells if this version has no pre-release version or build metadata. */\n  public boolean isNormal() {\n    return preRelease == null && build == null;\n  }\n\n  /** Tells if this version has a non-zero major version and no pre-release version. */\n  public boolean isStable() {\n    return major != 0 && preRelease == null;\n  }\n\n  /** Strips any pre-release version and build metadata from this version. */\n  public Version toNormal() {\n    return preRelease == null && build == null\n        ? this\n        : new Version(major, minor, patch, null, null);\n  }\n\n  /** Compares this version to the given version according to semantic versioning rules. */\n  @Override\n  public int compareTo(Version other) {\n    return COMPARATOR.compare(this, other);\n  }\n\n  /** Tells if this version is equal to {@code obj} according to semantic versioning rules. */\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Version other)) return false;\n    return major == other.major\n        && minor == other.minor\n        && patch == other.patch\n        && Objects.equals(preRelease, other.preRelease);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(major, minor, patch, preRelease);\n  }\n\n  @Override\n  public String toString() {\n    return major\n        + \".\"\n        + minor\n        + \".\"\n        + patch\n        + (preRelease != null ? \"-\" + preRelease : \"\")\n        + (build != null ? \"+\" + build : \"\");\n  }\n\n  private Identifier[] getPreReleaseIdentifiers() {\n    if (__preReleaseIdentifiers == null) {\n      __preReleaseIdentifiers =\n          preRelease == null\n              ? new Identifier[0]\n              : Arrays.stream(preRelease.split(\"\\\\.\"))\n                  .map(\n                      str ->\n                          NUMERIC_IDENTIFIER.matcher(str).matches()\n                              ? new Identifier(Long.parseLong(str), null)\n                              : new Identifier(-1, str))\n                  .toArray(Identifier[]::new);\n    }\n    return __preReleaseIdentifiers;\n  }\n\n  private static final class Identifier implements Comparable<Identifier> {\n    private final long numericId;\n    private final @Nullable String alphanumericId;\n\n    Identifier(long numericId, @Nullable String alphanumericId) {\n      this.numericId = numericId;\n      this.alphanumericId = alphanumericId;\n    }\n\n    @Override\n    public int compareTo(Identifier other) {\n      return alphanumericId != null\n          ? other.alphanumericId != null ? alphanumericId.compareTo(other.alphanumericId) : 1\n          : other.alphanumericId != null ? -1 : Long.compare(numericId, other.numericId);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/YamlRenderer.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.io.Writer;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.yaml.snake.YamlUtils;\nimport org.snakeyaml.engine.v2.api.ConstructNode;\nimport org.snakeyaml.engine.v2.api.DumpSettings;\nimport org.snakeyaml.engine.v2.api.StreamDataWriter;\nimport org.snakeyaml.engine.v2.common.FlowStyle;\nimport org.snakeyaml.engine.v2.emitter.Emitter;\nimport org.snakeyaml.engine.v2.events.*;\nimport org.snakeyaml.engine.v2.nodes.Tag;\nimport org.snakeyaml.engine.v2.resolver.ScalarResolver;\nimport org.snakeyaml.engine.v2.schema.Schema;\n\nfinal class YamlRenderer implements ValueRenderer {\n  private final ScalarResolver resolver = YamlUtils.getEmitterResolver(\"compat\");\n  private final Visitor visitor = new Visitor();\n  private final Emitter emitter;\n  private final boolean omitNullProperties;\n  private final boolean isStream;\n\n  public YamlRenderer(Writer writer, int indent, boolean omitNullProperties, boolean isStream) {\n    var dumpSettings =\n        DumpSettings.builder()\n            .setIndent(indent)\n            .setBestLineBreak(\"\\n\")\n            .setSchema(\n                new Schema() {\n                  @Override\n                  public ScalarResolver getScalarResolver() {\n                    return resolver;\n                  }\n\n                  @Override\n                  public Map<Tag, ConstructNode> getSchemaTagConstructors() {\n                    throw new AssertionError(\"emitters don't use tag constructors\");\n                  }\n                })\n            .build();\n\n    emitter =\n        new Emitter(\n            dumpSettings,\n            new StreamDataWriter() {\n              @Override\n              public void write(String str) {\n                try {\n                  writer.write(str);\n                } catch (IOException e) {\n                  throw new UncheckedIOException(e);\n                }\n              }\n\n              @Override\n              public void write(String str, int off, int len) {\n                try {\n                  writer.write(str, off, len);\n                } catch (IOException e) {\n                  throw new UncheckedIOException(e);\n                }\n              }\n            });\n\n    this.omitNullProperties = omitNullProperties;\n    this.isStream = isStream;\n  }\n\n  @Override\n  public void renderDocument(Object value) {\n    if (isStream) {\n      if (!(value instanceof Iterable<?> iterable)) {\n        throw new RendererException(\n            String.format(\n                \"The top-level value of a YAML stream must have type `Collection`, but got type `%s`.\",\n                value.getClass().getTypeName()));\n      }\n      emitter.emit(new StreamStartEvent());\n      for (var elem : iterable) {\n        emitter.emit(new DocumentStartEvent(false, Optional.empty(), Map.of()));\n        visitor.visit(elem);\n        emitter.emit(new DocumentEndEvent(false));\n      }\n      emitter.emit(new StreamEndEvent());\n    } else {\n      // a top-level YAML value can have any type\n      renderValue(value);\n    }\n  }\n\n  @Override\n  public void renderValue(Object value) {\n    emitter.emit(new StreamStartEvent());\n    emitter.emit(new DocumentStartEvent(false, Optional.empty(), Map.of()));\n\n    visitor.visit(value);\n\n    emitter.emit(new DocumentEndEvent(false));\n    emitter.emit(new StreamEndEvent());\n  }\n\n  protected class Visitor implements ValueVisitor {\n    @Override\n    public void visitString(String value) {\n      emitter.emit(YamlUtils.stringScalar(value, resolver));\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      emitter.emit(YamlUtils.plainScalar(value.toString(), Tag.INT));\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      emitter.emit(YamlUtils.plainScalar(value.toString(), Tag.FLOAT));\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      emitter.emit(YamlUtils.plainScalar(value.toString(), Tag.BOOL));\n    }\n\n    @Override\n    public void visitDuration(Duration value) {\n      throw new RendererException(\n          String.format(\"Values of type `Duration` cannot be rendered as YAML. Value: %s\", value));\n    }\n\n    @Override\n    public void visitDataSize(DataSize value) {\n      throw new RendererException(\n          String.format(\"Values of type `DataSize` cannot be rendered as YAML. Value: %s\", value));\n    }\n\n    @Override\n    public void visitBytes(byte[] value) {\n      emitter.emit(YamlUtils.bytesScalar(value));\n    }\n\n    @Override\n    public void visitPair(Pair<?, ?> value) {\n      doVisitIterable(value, null);\n    }\n\n    @Override\n    public void visitList(List<?> value) {\n      doVisitIterable(value, null);\n    }\n\n    @Override\n    public void visitSet(Set<?> value) {\n      doVisitIterable(value, \"!!set\");\n    }\n\n    @Override\n    public void visitMap(Map<?, ?> value) {\n      for (var key : value.keySet()) {\n        if (!(key instanceof String)) {\n          // http://stackoverflow.com/questions/33987316/what-is-a-complex-mapping-key-in-yaml\n          throw new RendererException(\n              String.format(\n                  \"Maps with non-String keys cannot currently be rendered as YAML. Key: %s\", key));\n        }\n      }\n\n      @SuppressWarnings(\"unchecked\")\n      var mapValue = (Map<String, ?>) value;\n      doVisitProperties(mapValue);\n    }\n\n    @Override\n    public void visitObject(PObject value) {\n      doVisitProperties(value.getProperties());\n    }\n\n    @Override\n    public void visitModule(PModule value) {\n      doVisitProperties(value.getProperties());\n    }\n\n    @Override\n    public void visitClass(PClass value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Class` cannot be rendered as YAML. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitTypeAlias(TypeAlias value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `TypeAlias` cannot be rendered as YAML. Value: %s\",\n              value.getSimpleName()));\n    }\n\n    @Override\n    public void visitNull() {\n      emitter.emit(YamlUtils.plainScalar(\"null\", Tag.NULL));\n    }\n\n    @Override\n    public void visitRegex(Pattern value) {\n      throw new RendererException(\n          String.format(\"Values of type `Regex` cannot be rendered as YAML. Value: %s\", value));\n    }\n\n    private void doVisitIterable(Iterable<?> iterable, @Nullable String tag) {\n      emitter.emit(\n          new SequenceStartEvent(\n              Optional.empty(), Optional.ofNullable(tag), true, FlowStyle.BLOCK));\n      for (var elem : iterable) visit(elem);\n      emitter.emit(new SequenceEndEvent(Optional.empty(), Optional.empty()));\n    }\n\n    private void doVisitProperties(Map<String, ?> properties) {\n      emitter.emit(\n          new MappingStartEvent(Optional.empty(), Optional.empty(), true, FlowStyle.BLOCK));\n\n      for (var entry : properties.entrySet()) {\n        var value = entry.getValue();\n\n        if (omitNullProperties && value instanceof PNull) {\n          continue;\n        }\n\n        emitter.emit(YamlUtils.stringScalar(entry.getKey(), resolver));\n        visit(value);\n      }\n\n      emitter.emit(new MappingEndEvent(Optional.empty(), Optional.empty()));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/ByteConstantValueNode.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\n\npublic class ByteConstantValueNode extends ExpressionNode implements ConstantNode {\n\n  private final byte value;\n\n  public ByteConstantValueNode(byte value) {\n    this.value = value;\n  }\n\n  @Override\n  public Long getValue() {\n    return (long) value;\n  }\n\n  public byte getByteValue() {\n    return value;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return getValue();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/ConstantNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\npublic interface ConstantNode {\n  Object getValue();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/ConstantValueNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\n\n@NodeInfo(shortName = \"const\")\npublic final class ConstantValueNode extends ExpressionNode implements ConstantNode {\n  private final Object value;\n\n  public ConstantValueNode(SourceSection sourceSection, Object value) {\n    super(sourceSection);\n    this.value = value;\n  }\n\n  public ConstantValueNode(Object value) {\n    this.value = value;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return value;\n  }\n\n  @Override\n  public Object getValue() {\n    return value;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/ExpressionNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.instrumentation.GenerateWrapper;\nimport com.oracle.truffle.api.instrumentation.InstrumentableNode;\nimport com.oracle.truffle.api.instrumentation.ProbeNode;\nimport com.oracle.truffle.api.instrumentation.Tag;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.PklTags;\nimport org.pkl.core.runtime.VmTypesGen;\nimport org.pkl.core.runtime.VmUtils;\n\n@GenerateWrapper\npublic abstract class ExpressionNode extends PklNode implements InstrumentableNode {\n  protected ExpressionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  protected ExpressionNode() {\n    this(VmUtils.unavailableSourceSection());\n  }\n\n  public abstract Object executeGeneric(VirtualFrame frame);\n\n  public long executeInt(VirtualFrame frame) throws UnexpectedResultException {\n    return VmTypesGen.expectLong(executeGeneric(frame));\n  }\n\n  public double executeFloat(VirtualFrame frame) throws UnexpectedResultException {\n    return VmTypesGen.expectDouble(executeGeneric(frame));\n  }\n\n  public boolean executeBoolean(VirtualFrame frame) throws UnexpectedResultException {\n    return VmTypesGen.expectBoolean(executeGeneric(frame));\n  }\n\n  @Override\n  public boolean hasTag(Class<? extends Tag> tag) {\n    return tag == PklTags.Expression.class;\n  }\n\n  @Override\n  public boolean isInstrumentable() {\n    return true;\n  }\n\n  @Override\n  public WrapperNode createWrapper(ProbeNode probe) {\n    return new ExpressionNodeWrapper(this, probe);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/MemberLookupMode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\npublic enum MemberLookupMode {\n  /** Lookup of a local member in the lexical scope. */\n  IMPLICIT_LOCAL,\n\n  /** Lookup of a non-local member in the lexical scope. */\n  IMPLICIT_LEXICAL,\n\n  /** Member lookup whose implicit receiver is the {@code pkl.base} module. */\n  IMPLICIT_BASE,\n\n  /** Member lookup whose implicit receiver is {@code this}. */\n  IMPLICIT_THIS,\n\n  /** Member lookup with explicit receiver (e.g., {@code foo.bar}). */\n  EXPLICIT_RECEIVER\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/MemberNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.member.DefaultPropertyBodyNode;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class MemberNode extends PklRootNode {\n  @Child protected ExpressionNode bodyNode;\n\n  protected MemberNode(\n      @Nullable VmLanguage language, FrameDescriptor descriptor, ExpressionNode bodyNode) {\n\n    super(language, descriptor);\n    this.bodyNode = bodyNode;\n  }\n\n  public abstract SourceSection getHeaderSection();\n\n  public final SourceSection getBodySection() {\n    return bodyNode.getSourceSection();\n  }\n\n  public final ExpressionNode getBodyNode() {\n    return bodyNode;\n  }\n\n  protected final VmExceptionBuilder exceptionBuilder() {\n    return new VmExceptionBuilder().withSourceSection(getHeaderSection());\n  }\n\n  public boolean isUndefined(VirtualFrame frame) {\n    return bodyNode instanceof DefaultPropertyBodyNode propBodyNode\n        && propBodyNode.isUndefined(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/PklNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.TypeSystemReference;\nimport com.oracle.truffle.api.instrumentation.InstrumentableNode.WrapperNode;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmTypes;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeInfo(language = \"Pkl\")\n@TypeSystemReference(VmTypes.class)\npublic abstract class PklNode extends Node {\n  protected final SourceSection sourceSection;\n\n  protected PklNode(SourceSection sourceSection) {\n    this.sourceSection = sourceSection;\n  }\n\n  protected PklNode() {\n    this(VmUtils.unavailableSourceSection());\n  }\n\n  @Override\n  public final SourceSection getSourceSection() {\n    if (this instanceof WrapperNode wrapperNode) {\n      return wrapperNode.getDelegateNode().getSourceSection();\n    }\n    return sourceSection;\n  }\n\n  @TruffleBoundary\n  protected VmExceptionBuilder exceptionBuilder() {\n    return new VmExceptionBuilder().withLocation(this);\n  }\n\n  @TruffleBoundary\n  protected final String getShortName() {\n    return VmUtils.getNodeInfo(this).shortName();\n  }\n\n  @Override\n  @TruffleBoundary\n  public String toString() {\n    return String.format(\n        \"(%s:%d) %s\",\n        sourceSection.getSource().getName(),\n        sourceSection.getStartLine(),\n        sourceSection.getCharacters());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/PklRootNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.TypeSystemReference;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.nodes.RootNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.type.VmTypeMismatchException;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n@NodeInfo(language = \"Pkl\")\n@TypeSystemReference(VmTypes.class)\npublic abstract class PklRootNode extends RootNode {\n  protected PklRootNode(@Nullable VmLanguage language, FrameDescriptor descriptor) {\n    super(language, descriptor);\n  }\n\n  public abstract SourceSection getSourceSection();\n\n  public abstract @Nullable String getName();\n\n  // name must start with `execute` (see Javadoc of @Specialization)\n  protected abstract Object executeImpl(VirtualFrame frame);\n\n  @Override\n  public final Object execute(VirtualFrame frame) {\n    try {\n      return executeImpl(frame);\n    } catch (VmTypeMismatchException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw e.toVmException();\n    } catch (VmException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw e;\n    } catch (StackOverflowError e) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmStackOverflowException(e);\n    } catch (Exception e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().bug(e.getMessage()).withCause(e).build();\n    }\n  }\n\n  protected VmExceptionBuilder exceptionBuilder() {\n    return new VmExceptionBuilder().withLocation(this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/SimpleRootNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmLanguage;\n\npublic final class SimpleRootNode extends PklRootNode {\n  private final SourceSection sourceSection;\n  private final String qualifiedName;\n  @Child private ExpressionNode bodyNode;\n\n  public SimpleRootNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      SourceSection sourceSection,\n      String qualifiedName,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor);\n    this.sourceSection = sourceSection;\n    this.qualifiedName = qualifiedName;\n    this.bodyNode = bodyNode;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  @Override\n  public String getName() {\n    return qualifiedName;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    return bodyNode.executeGeneric(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/VmModifier.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast;\n\nimport java.util.EnumSet;\nimport java.util.Set;\nimport org.pkl.core.Modifier;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmSet;\n\npublic final class VmModifier {\n  private VmModifier() {}\n\n  // user-facing modifiers\n\n  public static final int ABSTRACT = 0x1;\n\n  public static final int OPEN = 0x2;\n\n  public static final int LOCAL = 0x4;\n\n  // absent from rendered output but present in module schema (e.g. for pkldoc purposes)\n  public static final int HIDDEN = 0x8;\n\n  public static final int EXTERNAL = 0x10;\n\n  public static final int FIXED = 0x20;\n\n  public static final int CONST = 0x40;\n\n  // internal modifiers\n\n  public static final int IMPORT = 0x80;\n\n  public static final int CLASS = 0x100;\n\n  public static final int TYPE_ALIAS = 0x200;\n\n  public static final int ENTRY = 0x400;\n\n  public static final int ELEMENT = 0x800;\n\n  public static final int GLOB = 0x1000;\n\n  // modifier sets\n\n  public static final int NONE = 0;\n\n  public static final int VALID_MODULE_MODIFIERS = ABSTRACT | OPEN;\n\n  public static final int VALID_AMENDING_MODULE_MODIFIERS = 0;\n\n  public static final int VALID_CLASS_MODIFIERS = ABSTRACT | OPEN | LOCAL | EXTERNAL;\n\n  public static final int VALID_TYPE_ALIAS_MODIFIERS = LOCAL | EXTERNAL;\n\n  public static final int VALID_METHOD_MODIFIERS = ABSTRACT | LOCAL | EXTERNAL | CONST;\n\n  public static final int VALID_PROPERTY_MODIFIERS =\n      ABSTRACT | LOCAL | HIDDEN | EXTERNAL | FIXED | CONST;\n\n  public static final int VALID_OBJECT_MEMBER_MODIFIERS = LOCAL | CONST;\n\n  public static final int TYPEALIAS_OBJECT_MEMBER = TYPE_ALIAS | CONST;\n\n  public static final int LOCAL_TYPEALIAS_OBJECT_MEMBER = LOCAL | TYPEALIAS_OBJECT_MEMBER;\n\n  public static final int CLASS_OBJECT_MEMBER = CLASS | CONST;\n\n  public static final int LOCAL_CLASS_OBJECT_MEMBER = LOCAL | CLASS_OBJECT_MEMBER;\n\n  public static boolean isLocal(int modifiers) {\n    return (modifiers & LOCAL) != 0;\n  }\n\n  public static boolean isAbstract(int modifiers) {\n    return (modifiers & ABSTRACT) != 0;\n  }\n\n  public static boolean isFixed(int modifiers) {\n    return (modifiers & FIXED) != 0;\n  }\n\n  public static boolean isOpen(int modifiers) {\n    return (modifiers & OPEN) != 0;\n  }\n\n  public static boolean isHidden(int modifiers) {\n    return (modifiers & HIDDEN) != 0;\n  }\n\n  public static boolean isExternal(int modifiers) {\n    return (modifiers & EXTERNAL) != 0;\n  }\n\n  public static boolean isClass(int modifiers) {\n    return (modifiers & CLASS) != 0;\n  }\n\n  public static boolean isTypeAlias(int modifiers) {\n    return (modifiers & TYPE_ALIAS) != 0;\n  }\n\n  public static boolean isImport(int modifiers) {\n    return (modifiers & IMPORT) != 0;\n  }\n\n  public static boolean isGlob(int modifiers) {\n    return (modifiers & GLOB) != 0;\n  }\n\n  public static boolean isConst(int modifiers) {\n    return (modifiers & CONST) != 0;\n  }\n\n  public static boolean isElement(int modifiers) {\n    return (modifiers & ELEMENT) != 0;\n  }\n\n  public static boolean isEntry(int modifiers) {\n    return (modifiers & ENTRY) != 0;\n  }\n\n  public static boolean isType(int modifiers) {\n    return (modifiers & (CLASS | TYPE_ALIAS | IMPORT)) != 0 && (modifiers & GLOB) == 0;\n  }\n\n  public static boolean isLocalOrExternalOrHidden(int modifiers) {\n    return (modifiers & (LOCAL | EXTERNAL | HIDDEN)) != 0;\n  }\n\n  public static boolean isLocalOrExternalOrAbstract(int modifiers) {\n    return (modifiers & (LOCAL | EXTERNAL | ABSTRACT)) != 0;\n  }\n\n  public static boolean isLocalOrExternalOrAbstractOrFixedOrConst(int modifiers) {\n    return (modifiers & (LOCAL | EXTERNAL | ABSTRACT | FIXED | CONST)) != 0;\n  }\n\n  public static boolean isConstOrFixed(int modifiers) {\n    return (modifiers & (CONST | FIXED)) != 0;\n  }\n\n  public static Set<Modifier> export(int modifiers, boolean isClass) {\n    var result = EnumSet.noneOf(Modifier.class);\n\n    if (isAbstract(modifiers)) result.add(Modifier.ABSTRACT);\n    if (isOpen(modifiers)) result.add(Modifier.OPEN);\n    if (isHidden(modifiers)) result.add(Modifier.HIDDEN);\n    // `external` modifier is part of class contract but not part of property/method contract\n    if (isExternal(modifiers) && isClass) result.add(Modifier.EXTERNAL);\n\n    return result;\n  }\n\n  public static String toString(int modifier) {\n    return switch (modifier) {\n      case ABSTRACT -> \"abstract\";\n      case OPEN -> \"open\";\n      case LOCAL -> \"local\";\n      case HIDDEN -> \"hidden\";\n      case EXTERNAL -> \"external\";\n      case FIXED -> \"fixed\";\n      case CONST -> \"const\";\n      default ->\n          throw new VmExceptionBuilder()\n              .bug(\"Cannot convert internal modifier `%s` to a string.\", toString(modifier))\n              .build();\n    };\n  }\n\n  public static VmSet getMirrors(int modifiers, boolean isClass) {\n    var builder = VmSet.EMPTY.builder();\n\n    if (isAbstract(modifiers)) builder.add(toString(ABSTRACT));\n    if (isOpen(modifiers)) builder.add(toString(OPEN));\n    if (isHidden(modifiers)) builder.add(toString(HIDDEN));\n    // `external` modifier is part of class contract but not part of property/method contract\n    if (isExternal(modifiers) && isClass) builder.add(toString(EXTERNAL));\n    if (isFixed(modifiers)) builder.add(toString(FIXED));\n    if (isConst(modifiers)) builder.add(toString(CONST));\n\n    return builder.build();\n  }\n\n  public static boolean isClosed(int modifiers) {\n    return (modifiers & (ABSTRACT | OPEN)) == 0;\n  }\n\n  public static boolean isInstantiable(int modifiers) {\n    return (modifiers & (ABSTRACT | EXTERNAL)) == 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/AbstractAstBuilder.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\nimport com.oracle.truffle.api.source.Source;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.BaseParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.syntax.DocComment;\nimport org.pkl.parser.syntax.Modifier;\nimport org.pkl.parser.syntax.Modifier.ModifierValue;\nimport org.pkl.parser.syntax.Node;\n\npublic abstract class AbstractAstBuilder<T> extends BaseParserVisitor<T> {\n\n  protected final Source source;\n\n  protected abstract VmExceptionBuilder exceptionBuilder();\n\n  protected AbstractAstBuilder(Source source) {\n    this.source = source;\n  }\n\n  protected final @Nullable SourceSection createSourceSection(@Nullable Node node) {\n    return node == null\n        ? null\n        : source.createSection(node.span().charIndex(), node.span().length());\n  }\n\n  protected SourceSection @Nullable [] createDocSourceSection(@Nullable DocComment node) {\n    return createDocSourceSection(source, node);\n  }\n\n  protected SourceSection createSourceSection(Span span) {\n    return source.createSection(span.charIndex(), span.length());\n  }\n\n  protected final SourceSection createSourceSection(\n      List<? extends Modifier> modifiers, ModifierValue symbol) {\n\n    var modifierCtx =\n        modifiers.stream().filter(mod -> mod.getValue() == symbol).findFirst().orElseThrow();\n\n    return createSourceSection(modifierCtx);\n  }\n\n  protected static @Nullable SourceSection createSourceSection(Source source, @Nullable Node node) {\n    if (node == null) return null;\n    return createSourceSection(source, node.span());\n  }\n\n  protected static SourceSection @Nullable [] createDocSourceSection(\n      Source source, @Nullable DocComment node) {\n    if (node == null) return null;\n    var spans = node.getSpans();\n    var sections = new SourceSection[spans.size()];\n    for (var i = 0; i < sections.length; i++) {\n      var span = spans.get(i);\n      sections[i] = source.createSection(span.charIndex(), span.length());\n    }\n    return sections;\n  }\n\n  protected static SourceSection createSourceSection(Source source, Span span) {\n    return source.createSection(span.charIndex(), span.length());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilder.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.FrameSlotKind;\nimport com.oracle.truffle.api.source.Source;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.ArrayList;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.function.BiFunction;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.TypeParameter.Variance;\nimport org.pkl.core.ast.ByteConstantValueNode;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ConstantValueNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberLookupMode;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.builder.SymbolTable.AnnotationScope;\nimport org.pkl.core.ast.builder.SymbolTable.ClassScope;\nimport org.pkl.core.ast.expression.binary.AdditionNodeGen;\nimport org.pkl.core.ast.expression.binary.DivisionNodeGen;\nimport org.pkl.core.ast.expression.binary.EqualNodeGen;\nimport org.pkl.core.ast.expression.binary.ExponentiationNodeGen;\nimport org.pkl.core.ast.expression.binary.GreaterThanNodeGen;\nimport org.pkl.core.ast.expression.binary.GreaterThanOrEqualNodeGen;\nimport org.pkl.core.ast.expression.binary.LessThanNodeGen;\nimport org.pkl.core.ast.expression.binary.LessThanOrEqualNodeGen;\nimport org.pkl.core.ast.expression.binary.LetExprNode;\nimport org.pkl.core.ast.expression.binary.LogicalAndNodeGen;\nimport org.pkl.core.ast.expression.binary.LogicalOrNodeGen;\nimport org.pkl.core.ast.expression.binary.MultiplicationNodeGen;\nimport org.pkl.core.ast.expression.binary.NotEqualNodeGen;\nimport org.pkl.core.ast.expression.binary.NullCoalescingNodeGen;\nimport org.pkl.core.ast.expression.binary.PipeNodeGen;\nimport org.pkl.core.ast.expression.binary.RemainderNodeGen;\nimport org.pkl.core.ast.expression.binary.SubscriptNodeGen;\nimport org.pkl.core.ast.expression.binary.SubtractionNodeGen;\nimport org.pkl.core.ast.expression.binary.TruncatingDivisionNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorElementNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorEntryNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorForNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorMemberNode;\nimport org.pkl.core.ast.expression.generator.GeneratorObjectLiteralNode;\nimport org.pkl.core.ast.expression.generator.GeneratorObjectLiteralNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorPredicateMemberNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorPropertyNode;\nimport org.pkl.core.ast.expression.generator.GeneratorPropertyNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorSpreadNodeGen;\nimport org.pkl.core.ast.expression.generator.GeneratorWhenNode;\nimport org.pkl.core.ast.expression.generator.RestoreForBindingsNode;\nimport org.pkl.core.ast.expression.literal.AmendModuleNodeGen;\nimport org.pkl.core.ast.expression.literal.BytesLiteralNode;\nimport org.pkl.core.ast.expression.literal.CheckIsAnnotationClassNode;\nimport org.pkl.core.ast.expression.literal.ConstantEntriesLiteralNodeGen;\nimport org.pkl.core.ast.expression.literal.ElementsEntriesLiteralNodeGen;\nimport org.pkl.core.ast.expression.literal.ElementsLiteralNodeGen;\nimport org.pkl.core.ast.expression.literal.EmptyObjectLiteralNodeGen;\nimport org.pkl.core.ast.expression.literal.EntriesLiteralNodeGen;\nimport org.pkl.core.ast.expression.literal.FalseLiteralNode;\nimport org.pkl.core.ast.expression.literal.FloatLiteralNode;\nimport org.pkl.core.ast.expression.literal.FunctionLiteralNode;\nimport org.pkl.core.ast.expression.literal.IntLiteralNode;\nimport org.pkl.core.ast.expression.literal.InterpolatedStringLiteralNode;\nimport org.pkl.core.ast.expression.literal.ListLiteralNode;\nimport org.pkl.core.ast.expression.literal.MapLiteralNode;\nimport org.pkl.core.ast.expression.literal.PropertiesLiteralNodeGen;\nimport org.pkl.core.ast.expression.literal.SetLiteralNode;\nimport org.pkl.core.ast.expression.literal.TrueLiteralNode;\nimport org.pkl.core.ast.expression.member.InferParentWithinMethodNode;\nimport org.pkl.core.ast.expression.member.InferParentWithinObjectMethodNode;\nimport org.pkl.core.ast.expression.member.InferParentWithinPropertyNodeGen;\nimport org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen;\nimport org.pkl.core.ast.expression.member.InvokeSuperMethodNodeGen;\nimport org.pkl.core.ast.expression.member.ReadPropertyNodeGen;\nimport org.pkl.core.ast.expression.member.ReadSuperEntryNode;\nimport org.pkl.core.ast.expression.member.ReadSuperPropertyNode;\nimport org.pkl.core.ast.expression.member.ResolveMethodNode;\nimport org.pkl.core.ast.expression.primary.GetEnclosingOwnerNode;\nimport org.pkl.core.ast.expression.primary.GetEnclosingReceiverNode;\nimport org.pkl.core.ast.expression.primary.GetMemberKeyNode;\nimport org.pkl.core.ast.expression.primary.GetModuleNode;\nimport org.pkl.core.ast.expression.primary.GetOwnerNode;\nimport org.pkl.core.ast.expression.primary.GetReceiverNode;\nimport org.pkl.core.ast.expression.primary.OuterNode;\nimport org.pkl.core.ast.expression.primary.ResolveVariableNode;\nimport org.pkl.core.ast.expression.primary.ThisNode;\nimport org.pkl.core.ast.expression.ternary.IfElseNode;\nimport org.pkl.core.ast.expression.unary.AbstractImportNode;\nimport org.pkl.core.ast.expression.unary.AbstractReadNode;\nimport org.pkl.core.ast.expression.unary.ImportGlobNode;\nimport org.pkl.core.ast.expression.unary.ImportNode;\nimport org.pkl.core.ast.expression.unary.LogicalNotNodeGen;\nimport org.pkl.core.ast.expression.unary.NonNullNode;\nimport org.pkl.core.ast.expression.unary.NullPropagatingOperationNode;\nimport org.pkl.core.ast.expression.unary.PropagateNullReceiverNodeGen;\nimport org.pkl.core.ast.expression.unary.ReadGlobNodeGen;\nimport org.pkl.core.ast.expression.unary.ReadNodeGen;\nimport org.pkl.core.ast.expression.unary.ReadOrNullNodeGen;\nimport org.pkl.core.ast.expression.unary.ThrowNodeGen;\nimport org.pkl.core.ast.expression.unary.TraceNode;\nimport org.pkl.core.ast.expression.unary.UnaryMinusNodeGen;\nimport org.pkl.core.ast.internal.GetBaseModuleClassNode;\nimport org.pkl.core.ast.internal.GetClassNodeGen;\nimport org.pkl.core.ast.internal.ToStringNodeGen;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1NodeGen;\nimport org.pkl.core.ast.member.ClassNode;\nimport org.pkl.core.ast.member.ElementOrEntryNodeGen;\nimport org.pkl.core.ast.member.Lambda;\nimport org.pkl.core.ast.member.ModuleNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.member.ObjectMethodNode;\nimport org.pkl.core.ast.member.TypeAliasNode;\nimport org.pkl.core.ast.member.UnresolvedFunctionNode;\nimport org.pkl.core.ast.member.UnresolvedMethodNode;\nimport org.pkl.core.ast.member.UnresolvedPropertyNode;\nimport org.pkl.core.ast.member.UntypedObjectMemberNode;\nimport org.pkl.core.ast.type.GetParentForTypeNode;\nimport org.pkl.core.ast.type.ResolveDeclaredTypeNode;\nimport org.pkl.core.ast.type.ResolveQualifiedDeclaredTypeNode;\nimport org.pkl.core.ast.type.ResolveSimpleDeclaredTypeNode;\nimport org.pkl.core.ast.type.TypeCastNode;\nimport org.pkl.core.ast.type.TypeConstraintNode;\nimport org.pkl.core.ast.type.TypeConstraintNodeGen;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeTestNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode.Constrained;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.ModuleInfo;\nimport org.pkl.core.runtime.ModuleResolver;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.LanguageAwareNode;\nimport org.pkl.core.stdlib.registry.ExternalMemberRegistry;\nimport org.pkl.core.stdlib.registry.MemberRegistryFactory;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.Pair;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.syntax.Annotation;\nimport org.pkl.parser.syntax.ArgumentList;\nimport org.pkl.parser.syntax.Class;\nimport org.pkl.parser.syntax.ClassMethod;\nimport org.pkl.parser.syntax.ClassProperty;\nimport org.pkl.parser.syntax.Expr;\nimport org.pkl.parser.syntax.Expr.AmendsExpr;\nimport org.pkl.parser.syntax.Expr.BinaryOperatorExpr;\nimport org.pkl.parser.syntax.Expr.BoolLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FloatLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FunctionLiteralExpr;\nimport org.pkl.parser.syntax.Expr.IfExpr;\nimport org.pkl.parser.syntax.Expr.ImportExpr;\nimport org.pkl.parser.syntax.Expr.IntLiteralExpr;\nimport org.pkl.parser.syntax.Expr.LetExpr;\nimport org.pkl.parser.syntax.Expr.LogicalNotExpr;\nimport org.pkl.parser.syntax.Expr.ModuleExpr;\nimport org.pkl.parser.syntax.Expr.MultiLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.NewExpr;\nimport org.pkl.parser.syntax.Expr.NonNullExpr;\nimport org.pkl.parser.syntax.Expr.NullLiteralExpr;\nimport org.pkl.parser.syntax.Expr.OuterExpr;\nimport org.pkl.parser.syntax.Expr.ParenthesizedExpr;\nimport org.pkl.parser.syntax.Expr.QualifiedAccessExpr;\nimport org.pkl.parser.syntax.Expr.ReadExpr;\nimport org.pkl.parser.syntax.Expr.SingleLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.SubscriptExpr;\nimport org.pkl.parser.syntax.Expr.SuperAccessExpr;\nimport org.pkl.parser.syntax.Expr.SuperSubscriptExpr;\nimport org.pkl.parser.syntax.Expr.ThisExpr;\nimport org.pkl.parser.syntax.Expr.ThrowExpr;\nimport org.pkl.parser.syntax.Expr.TraceExpr;\nimport org.pkl.parser.syntax.Expr.TypeCastExpr;\nimport org.pkl.parser.syntax.Expr.TypeCheckExpr;\nimport org.pkl.parser.syntax.Expr.UnaryMinusExpr;\nimport org.pkl.parser.syntax.Expr.UnqualifiedAccessExpr;\nimport org.pkl.parser.syntax.ExtendsOrAmendsClause;\nimport org.pkl.parser.syntax.Identifier;\nimport org.pkl.parser.syntax.ImportClause;\nimport org.pkl.parser.syntax.Modifier;\nimport org.pkl.parser.syntax.Modifier.ModifierValue;\nimport org.pkl.parser.syntax.Module;\nimport org.pkl.parser.syntax.Node;\nimport org.pkl.parser.syntax.ObjectBody;\nimport org.pkl.parser.syntax.ObjectMember.ForGenerator;\nimport org.pkl.parser.syntax.ObjectMember.MemberPredicate;\nimport org.pkl.parser.syntax.ObjectMember.ObjectElement;\nimport org.pkl.parser.syntax.ObjectMember.ObjectEntry;\nimport org.pkl.parser.syntax.ObjectMember.ObjectMethod;\nimport org.pkl.parser.syntax.ObjectMember.ObjectProperty;\nimport org.pkl.parser.syntax.ObjectMember.ObjectSpread;\nimport org.pkl.parser.syntax.ObjectMember.WhenGenerator;\nimport org.pkl.parser.syntax.Parameter;\nimport org.pkl.parser.syntax.Parameter.TypedIdentifier;\nimport org.pkl.parser.syntax.ParameterList;\nimport org.pkl.parser.syntax.QualifiedIdentifier;\nimport org.pkl.parser.syntax.StringConstant;\nimport org.pkl.parser.syntax.StringPart;\nimport org.pkl.parser.syntax.StringPart.StringChars;\nimport org.pkl.parser.syntax.StringPart.StringInterpolation;\nimport org.pkl.parser.syntax.Type;\nimport org.pkl.parser.syntax.Type.ConstrainedType;\nimport org.pkl.parser.syntax.Type.DeclaredType;\nimport org.pkl.parser.syntax.Type.FunctionType;\nimport org.pkl.parser.syntax.Type.ModuleType;\nimport org.pkl.parser.syntax.Type.NothingType;\nimport org.pkl.parser.syntax.Type.NullableType;\nimport org.pkl.parser.syntax.Type.ParenthesizedType;\nimport org.pkl.parser.syntax.Type.StringConstantType;\nimport org.pkl.parser.syntax.Type.UnionType;\nimport org.pkl.parser.syntax.Type.UnknownType;\nimport org.pkl.parser.syntax.TypeAlias;\nimport org.pkl.parser.syntax.TypeAnnotation;\nimport org.pkl.parser.syntax.TypeParameterList;\n\npublic class AstBuilder extends AbstractAstBuilder<Object> {\n  private final VmLanguage language;\n  private final ModuleInfo moduleInfo;\n\n  private final ModuleKey moduleKey;\n  private final ModuleResolver moduleResolver;\n  private final boolean isBaseModule;\n  private final boolean isStdLibModule;\n  private final ExternalMemberRegistry externalMemberRegistry;\n  private final SymbolTable symbolTable;\n  private final boolean isMethodReturnTypeChecked;\n\n  public AstBuilder(\n      Source source, VmLanguage language, ModuleInfo moduleInfo, ModuleResolver moduleResolver) {\n    super(source);\n    this.language = language;\n    this.moduleInfo = moduleInfo;\n\n    moduleKey = moduleInfo.getModuleKey();\n    this.moduleResolver = moduleResolver;\n    isBaseModule = ModuleKeys.isBaseModule(moduleKey);\n    isStdLibModule = ModuleKeys.isStdLibModule(moduleKey);\n    externalMemberRegistry = MemberRegistryFactory.get(moduleKey);\n    symbolTable = new SymbolTable(moduleInfo);\n    isMethodReturnTypeChecked = !isStdLibModule || IoUtils.isTestMode();\n  }\n\n  public static AstBuilder create(\n      Source source,\n      VmLanguage language,\n      Module ctx,\n      ModuleKey moduleKey,\n      ResolvedModuleKey resolvedModuleKey,\n      ModuleResolver moduleResolver) {\n    var moduleDecl = ctx.getDecl();\n    var sourceSection = createSourceSection(source, ctx);\n    var headerSection =\n        moduleDecl != null\n            ? createSourceSection(source, moduleDecl.headerSpan())\n            :\n            // no explicit module declaration; designate start of file as header section\n            source.createSection(0, 0);\n    var docComment =\n        moduleDecl != null ? createDocSourceSection(source, moduleDecl.getDocComment()) : null;\n\n    ModuleInfo moduleInfo;\n    if (moduleDecl == null) {\n      var moduleName = IoUtils.inferModuleName(moduleKey);\n      moduleInfo =\n          new ModuleInfo(\n              sourceSection, headerSection, null, moduleName, moduleKey, resolvedModuleKey, false);\n    } else {\n      var declaredModuleName = moduleDecl.getName();\n      var moduleName =\n          declaredModuleName != null\n              ? declaredModuleName.text()\n              : IoUtils.inferModuleName(moduleKey);\n      var clause = moduleDecl.getExtendsOrAmendsDecl();\n      var isAmend = clause != null && clause.getType() == ExtendsOrAmendsClause.Type.AMENDS;\n      moduleInfo =\n          new ModuleInfo(\n              sourceSection,\n              headerSection,\n              docComment,\n              moduleName,\n              moduleKey,\n              resolvedModuleKey,\n              isAmend);\n    }\n\n    return new AstBuilder(source, language, moduleInfo, moduleResolver);\n  }\n\n  @Override\n  public UnresolvedTypeNode visitUnknownType(UnknownType type) {\n    return new UnresolvedTypeNode.Unknown(createSourceSection(type));\n  }\n\n  @Override\n  public UnresolvedTypeNode visitNothingType(NothingType type) {\n    return new UnresolvedTypeNode.Nothing(createSourceSection(type));\n  }\n\n  @Override\n  public UnresolvedTypeNode visitModuleType(ModuleType type) {\n    return new UnresolvedTypeNode.Module(createSourceSection(type));\n  }\n\n  @Override\n  public UnresolvedTypeNode visitStringConstantType(StringConstantType type) {\n    return new UnresolvedTypeNode.StringLiteral(\n        createSourceSection(type), type.getStr().getString());\n  }\n\n  @Override\n  public UnresolvedTypeNode visitDeclaredType(DeclaredType type) {\n    var identifier = type.getName();\n    var args = type.getArgs();\n\n    if (args == null) {\n      if (identifier.getIdentifiers().size() == 1) {\n        var text = identifier.getIdentifiers().get(0).getValue();\n        var typeParameter = symbolTable.findTypeParameter(text);\n        if (typeParameter != null) {\n          return new UnresolvedTypeNode.TypeVariable(createSourceSection(type), typeParameter);\n        }\n      }\n\n      return new UnresolvedTypeNode.Declared(\n          createSourceSection(type), doVisitTypeName(identifier));\n    }\n\n    var targs = args.getTypes();\n    var argTypes = new UnresolvedTypeNode[targs.size()];\n    for (var i = 0; i < targs.size(); i++) {\n      argTypes[i] = visitType(targs.get(i));\n    }\n\n    return new UnresolvedTypeNode.Parameterized(\n        createSourceSection(type), language, doVisitTypeName(identifier), argTypes);\n  }\n\n  @Override\n  public UnresolvedTypeNode visitParenthesizedType(ParenthesizedType type) {\n    return visitType(type.getType());\n  }\n\n  @Override\n  public UnresolvedTypeNode visitNullableType(NullableType type) {\n    return new UnresolvedTypeNode.Nullable(createSourceSection(type), visitType(type.getType()));\n  }\n\n  @Override\n  public UnresolvedTypeNode visitConstrainedType(ConstrainedType type) {\n    var childNode = visitType(type.getType());\n\n    return symbolTable.enterCustomThisScope(\n        scope -> {\n          var exprs = type.getExprs();\n          var constraints = new TypeConstraintNode[exprs.size()];\n          for (int i = 0; i < constraints.length; i++) {\n            var expr = visitExpr(exprs.get(i));\n            constraints[i] = TypeConstraintNodeGen.create(expr.getSourceSection(), expr);\n          }\n          return new Constrained(createSourceSection(type), language, childNode, constraints);\n        });\n  }\n\n  @Override\n  public UnresolvedTypeNode visitUnionType(UnionType type) {\n    var elementTypes = type.getTypes();\n\n    boolean isUnionOfStringLiterals = true;\n    for (var typ : elementTypes) {\n      if (!(typ instanceof StringConstantType)) {\n        isUnionOfStringLiterals = false;\n        break;\n      }\n    }\n    int defaultIndex = type.getDefaultIndex();\n\n    if (isUnionOfStringLiterals) {\n      return new UnresolvedTypeNode.UnionOfStringLiterals(\n          createSourceSection(type),\n          defaultIndex,\n          elementTypes.stream()\n              .map(it -> ((StringConstantType) it).getStr().getString())\n              .collect(Collectors.toCollection(LinkedHashSet::new)));\n    }\n\n    var elements = new UnresolvedTypeNode[elementTypes.size()];\n    for (int i = 0; i < elementTypes.size(); i++) {\n      elements[i] = visitType(elementTypes.get(i));\n    }\n\n    return new UnresolvedTypeNode.Union(createSourceSection(type), defaultIndex, elements);\n  }\n\n  @Override\n  public UnresolvedTypeNode visitFunctionType(FunctionType type) {\n    var pars = new UnresolvedTypeNode[type.getArgs().size()];\n    for (int i = 0; i < pars.length; i++) {\n      pars[i] = visitType(type.getArgs().get(i));\n    }\n\n    return new UnresolvedTypeNode.Function(\n        createSourceSection(type), pars, visitType(type.getRet()));\n  }\n\n  @Override\n  public ExpressionNode visitThisExpr(ThisExpr expr) {\n    if (!(expr.parent() instanceof QualifiedAccessExpr)) {\n      var currentScope = symbolTable.getCurrentScope();\n      var needsConst =\n          currentScope.getConstLevel() == ConstLevel.ALL\n              && currentScope.getConstDepth() == -1\n              && !currentScope.isCustomThisScope();\n      if (needsConst) {\n        throw exceptionBuilder()\n            .withSourceSection(createSourceSection(expr))\n            .evalError(\"thisIsNotConst\")\n            .build();\n      }\n    }\n    return VmUtils.createThisNode(\n        createSourceSection(expr), symbolTable.getCurrentScope().isCustomThisScope());\n  }\n\n  // TODO: `outer.` should probably have semantics similar to `super.`,\n  // rather than just performing a lookup in the immediately enclosing object\n  // also, consider interpreting `x = ... x ...` as `x = ... outer.x ...`\n  @Override\n  public OuterNode visitOuterExpr(OuterExpr expr) {\n    if (!(expr.parent() instanceof QualifiedAccessExpr)) {\n      var constLevel = symbolTable.getCurrentScope().getConstLevel();\n      var outerScope = getParentLexicalScope();\n      if (outerScope != null && constLevel.bigger(outerScope.getConstLevel())) {\n        throw exceptionBuilder()\n            .evalError(\"outerIsNotConst\")\n            .withSourceSection(createSourceSection(expr))\n            .build();\n      }\n    }\n    return new OuterNode(createSourceSection(expr));\n  }\n\n  @Override\n  public GetModuleNode visitModuleExpr(ModuleExpr expr) {\n    // cannot use unqualified `module` in a const context\n    if (symbolTable.getCurrentScope().getConstLevel().isConst()\n        && !(expr.parent() instanceof QualifiedAccessExpr)) {\n      var scope = symbolTable.getCurrentScope();\n      while (scope != null\n          && !(scope instanceof AnnotationScope)\n          && !(scope instanceof ClassScope)) {\n        scope = scope.getParent();\n      }\n      if (scope == null) {\n        throw exceptionBuilder()\n            .evalError(\"moduleIsNotConst\", symbolTable.getCurrentScope().getName().toString())\n            .withSourceSection(createSourceSection(expr))\n            .build();\n      }\n      var messageKey =\n          scope instanceof AnnotationScope ? \"moduleIsNotConstAnnotation\" : \"moduleIsNotConstClass\";\n      throw exceptionBuilder()\n          .evalError(messageKey)\n          .withSourceSection(createSourceSection(expr))\n          .build();\n    }\n    return new GetModuleNode(createSourceSection(expr));\n  }\n\n  @Override\n  public ConstantValueNode visitNullLiteralExpr(NullLiteralExpr expr) {\n    return new ConstantValueNode(createSourceSection(expr), VmNull.withoutDefault());\n  }\n\n  @Override\n  public ExpressionNode visitBoolLiteralExpr(BoolLiteralExpr expr) {\n    if (expr.isB()) {\n      return new TrueLiteralNode(createSourceSection(expr));\n    } else {\n      return new FalseLiteralNode(createSourceSection(expr));\n    }\n  }\n\n  private <T> T parseNumber(IntLiteralExpr expr, BiFunction<String, Integer, T> parser) {\n    var text = remove_(expr.getNumber());\n\n    var radix = 10;\n    if (text.startsWith(\"0x\") || text.startsWith(\"0b\") || text.startsWith(\"0o\")) {\n      radix =\n          switch (text.charAt(1)) {\n            case 'x' -> 16;\n            case 'b' -> 2;\n            default -> 8;\n          };\n\n      text = text.substring(2);\n    }\n\n    // relies on grammar rule nesting depth, but a breakage won't go unnoticed by tests\n    if (expr.parent() instanceof UnaryMinusExpr) {\n      // handle negation here to make parsing of base.MinInt work\n      // also moves negation from runtime to parse time\n      text = \"-\" + text;\n    }\n    return parser.apply(text, radix);\n  }\n\n  @Override\n  public IntLiteralNode visitIntLiteralExpr(IntLiteralExpr expr) {\n    var section = createSourceSection(expr);\n    try {\n      var num = parseNumber(expr, Long::parseLong);\n      return new IntLiteralNode(section, num);\n    } catch (NumberFormatException e) {\n      var text = expr.getNumber();\n      throw exceptionBuilder().evalError(\"intTooLarge\", text).withSourceSection(section).build();\n    }\n  }\n\n  @Override\n  public FloatLiteralNode visitFloatLiteralExpr(FloatLiteralExpr expr) {\n    var section = createSourceSection(expr);\n    var text = remove_(expr.getNumber());\n    // relies on grammar rule nesting depth, but a breakage won't go unnoticed by tests\n    if (expr.parent() instanceof UnaryMinusExpr) {\n      // handle negation here for consistency with visitIntegerLiteral\n      // also moves negation from runtime to parse time\n      text = \"-\" + text;\n    }\n\n    try {\n      var num = Double.parseDouble(text);\n      return new FloatLiteralNode(section, num);\n    } catch (NumberFormatException e) {\n      throw exceptionBuilder().evalError(\"floatTooLarge\", text).withSourceSection(section).build();\n    }\n  }\n\n  private static String remove_(String number) {\n    var builder = new StringBuilder(number.length());\n    for (var i = 0; i < number.length(); i++) {\n      var ch = number.charAt(i);\n      if (ch == '_') continue;\n      builder.append(ch);\n    }\n    return builder.toString();\n  }\n\n  @Override\n  public ExpressionNode visitThrowExpr(ThrowExpr expr) {\n    return ThrowNodeGen.create(createSourceSection(expr), visitExpr(expr.getExpr()));\n  }\n\n  @Override\n  public TraceNode visitTraceExpr(TraceExpr expr) {\n    return new TraceNode(createSourceSection(expr), visitExpr(expr.getExpr()));\n  }\n\n  @Override\n  public AbstractImportNode visitImportExpr(ImportExpr expr) {\n    var importUriCtx = expr.getImportStr();\n    return doVisitImport(expr.isGlob(), expr, importUriCtx);\n  }\n\n  private AbstractImportNode doVisitImport(\n      boolean isGlobImport, Node node, StringConstant importUriNode) {\n    var section = createSourceSection(node);\n    var importUri = importUriNode.getString();\n    if (isGlobImport && importUri.startsWith(\"...\")) {\n      throw exceptionBuilder().evalError(\"cannotGlobTripleDots\").withSourceSection(section).build();\n    }\n    var resolvedUri = resolveImport(importUri, importUriNode);\n    if (isGlobImport) {\n      return new ImportGlobNode(section, moduleInfo.getResolvedModuleKey(), resolvedUri, importUri);\n    }\n    return new ImportNode(language, section, moduleInfo.getResolvedModuleKey(), resolvedUri);\n  }\n\n  @Override\n  public AbstractReadNode visitReadExpr(ReadExpr expr) {\n    return switch (expr.getReadType()) {\n      case READ ->\n          ReadNodeGen.create(createSourceSection(expr), moduleKey, visitExpr(expr.getExpr()));\n      case NULL ->\n          ReadOrNullNodeGen.create(createSourceSection(expr), moduleKey, visitExpr(expr.getExpr()));\n      case GLOB ->\n          ReadGlobNodeGen.create(createSourceSection(expr), moduleKey, visitExpr(expr.getExpr()));\n    };\n  }\n\n  @Override\n  public ExpressionNode visitUnqualifiedAccessExpr(UnqualifiedAccessExpr expr) {\n    var identifier = toIdentifier(expr.getIdentifier().getValue());\n    var argList = expr.getArgumentList();\n\n    if (argList == null) {\n      return createResolveVariableNode(createSourceSection(expr), identifier);\n    }\n\n    // TODO: make sure that no user-defined List/Set/Map method is in scope\n    // TODO: support qualified calls (e.g., `import \"pkl:base\"; x =\n    // base.List()/Set()/Map()/Bytes()`) for correctness\n    if (identifier == org.pkl.core.runtime.Identifier.LIST) {\n      return doVisitListLiteral(expr, argList);\n    }\n\n    if (identifier == org.pkl.core.runtime.Identifier.SET) {\n      return doVisitSetLiteral(expr, argList);\n    }\n\n    if (identifier == org.pkl.core.runtime.Identifier.MAP) {\n      return doVisitMapLiteral(expr, argList);\n    }\n\n    if (identifier == org.pkl.core.runtime.Identifier.BYTES_CONSTRUCTOR) {\n      return doVisitBytesLiteral(expr, argList);\n    }\n\n    var scope = symbolTable.getCurrentScope();\n\n    return new ResolveMethodNode(\n        createSourceSection(expr),\n        identifier,\n        visitArgumentList(argList),\n        isBaseModule,\n        scope.isCustomThisScope(),\n        scope.getConstLevel(),\n        scope.getConstDepth());\n  }\n\n  @Override\n  public ExpressionNode visitStringConstant(StringConstant expr) {\n    return new ConstantValueNode(createSourceSection(expr), expr.getString());\n  }\n\n  @Override\n  public ExpressionNode visitStringPart(StringPart spart) {\n    return doVisitStringPart(spart, spart.span());\n  }\n\n  private ExpressionNode doVisitStringPart(StringPart spart, Span span) {\n    if (spart instanceof StringInterpolation si) {\n      return ToStringNodeGen.create(createSourceSection(span), visitExpr(si.getExpr()));\n    }\n    if (spart instanceof StringChars sparts) {\n      return new ConstantValueNode(createSourceSection(span), sparts.getString());\n    }\n    throw exceptionBuilder().unreachableCode().build();\n  }\n\n  @Override\n  public ExpressionNode visitSingleLineStringLiteralExpr(SingleLineStringLiteralExpr expr) {\n    var parts = expr.getParts();\n    if (parts.isEmpty()) {\n      return new ConstantValueNode(createSourceSection(expr), \"\");\n    }\n    if (parts.size() == 1) {\n      return doVisitStringPart(parts.get(0), expr.span());\n    }\n\n    var nodes = new ExpressionNode[parts.size()];\n    for (int i = 0; i < nodes.length; i++) {\n      nodes[i] = visitStringPart(parts.get(i));\n    }\n    return new InterpolatedStringLiteralNode(createSourceSection(expr), nodes);\n  }\n\n  @Override\n  public ExpressionNode visitMultiLineStringLiteralExpr(MultiLineStringLiteralExpr expr) {\n    var parts = expr.getParts();\n\n    if (parts.size() == 1) {\n      return doVisitStringPart(parts.get(0), expr.span());\n    }\n\n    var nodes = new ExpressionNode[parts.size()];\n    for (int i = 0; i < nodes.length; i++) {\n      nodes[i] = visitStringPart(parts.get(i));\n    }\n    return new InterpolatedStringLiteralNode(createSourceSection(expr), nodes);\n  }\n\n  @Override\n  public ExpressionNode visitNewExpr(NewExpr expr) {\n    var type = expr.getType();\n    return type != null\n        ? doVisitNewExprWithExplicitParent(expr, type)\n        : doVisitNewExprWithInferredParent(expr);\n  }\n\n  // `new Listing<Person> {}` is sugar for: `new Listing<Person> {} as Listing<Person>`\n  private ExpressionNode doVisitNewExprWithExplicitParent(NewExpr newExpr, Type type) {\n    var parentType = visitType(type);\n    var expr =\n        doVisitObjectBody(\n            newExpr.getBody(),\n            new GetParentForTypeNode(\n                createSourceSection(newExpr),\n                parentType,\n                symbolTable.getCurrentScope().getQualifiedName()));\n    if (type instanceof DeclaredType declaredType && declaredType.getArgs() != null) {\n      return new TypeCastNode(parentType.getSourceSection(), expr, parentType);\n    }\n    return expr;\n  }\n\n  private ExpressionNode doVisitNewExprWithInferredParent(NewExpr expr) {\n    ExpressionNode inferredParentNode;\n\n    Node child = expr;\n    var parent = expr.parent();\n    var scope = symbolTable.getCurrentScope();\n    var levelsUp = 0;\n\n    while (parent instanceof IfExpr\n        || parent instanceof TraceExpr\n        || parent instanceof LetExpr letExpr && letExpr.getExpr() == child) {\n\n      if (parent instanceof LetExpr) {\n        assert scope != null;\n        scope = scope.getParent();\n        levelsUp += 1;\n      }\n      child = parent;\n      parent = parent.parent();\n    }\n\n    assert scope != null;\n\n    if (parent instanceof ClassProperty || parent instanceof ObjectProperty) {\n      inferredParentNode =\n          InferParentWithinPropertyNodeGen.create(\n              createSourceSection(expr.newSpan()),\n              scope.getName(),\n              levelsUp == 0 ? new GetOwnerNode() : new GetEnclosingOwnerNode(levelsUp));\n    } else if (parent instanceof ObjectElement\n        || parent instanceof ObjectEntry objectEntry && objectEntry.getValue() == child) {\n      inferredParentNode =\n          ApplyVmFunction1NodeGen.create(\n              ReadPropertyNodeGen.create(\n                  createSourceSection(expr.newSpan()),\n                  org.pkl.core.runtime.Identifier.DEFAULT,\n                  levelsUp == 0 ? new GetReceiverNode() : new GetEnclosingReceiverNode(levelsUp)),\n              new GetMemberKeyNode());\n    } else if (parent instanceof ClassMethod || parent instanceof ObjectMethod) {\n      var isObjectMethod =\n          parent instanceof ObjectMethod\n              || parent.parent() instanceof Module && moduleInfo.isAmend();\n      org.pkl.core.runtime.Identifier scopeName = scope.getName();\n      inferredParentNode =\n          isObjectMethod\n              ? new InferParentWithinObjectMethodNode(\n                  createSourceSection(expr.newSpan()),\n                  language,\n                  scopeName,\n                  levelsUp == 0 ? new GetOwnerNode() : new GetEnclosingOwnerNode(levelsUp))\n              : new InferParentWithinMethodNode(\n                  createSourceSection(expr.newSpan()),\n                  language,\n                  scopeName,\n                  levelsUp == 0 ? new GetOwnerNode() : new GetEnclosingOwnerNode(levelsUp));\n    } else if (parent instanceof LetExpr letExpr && letExpr.getBindingExpr() == child) {\n      // TODO (unclear how to infer type now that let-expression is implemented as lambda\n      // invocation)\n      throw exceptionBuilder()\n          .evalError(\"cannotInferParent\")\n          .withSourceSection(createSourceSection(expr.newSpan()))\n          .build();\n    } else {\n      throw exceptionBuilder()\n          .evalError(\"cannotInferParent\")\n          .withSourceSection(createSourceSection(expr.newSpan()))\n          .build();\n    }\n\n    return doVisitObjectBody(expr.getBody(), inferredParentNode);\n  }\n\n  @Override\n  public ExpressionNode visitAmendsExpr(AmendsExpr expr) {\n    // parentExpr is always New, Amends or Parenthesized. The parser makes sure of it in\n    // `Parser.parseExprRest`\n    return doVisitObjectBody(expr.getBody(), visitExpr(expr.getExpr()));\n  }\n\n  @Override\n  public ExpressionNode visitSuperAccessExpr(SuperAccessExpr expr) {\n    var sourceSection = createSourceSection(expr);\n    var memberName = toIdentifier(expr.getIdentifier().getValue());\n    var argCtx = expr.getArgumentList();\n    var currentScope = symbolTable.getCurrentScope();\n    var needsConst =\n        currentScope.getConstLevel() == ConstLevel.ALL && currentScope.getConstDepth() == -1;\n\n    if (argCtx != null) { // supermethod call\n      if (!symbolTable.getCurrentScope().isClassMemberScope()) {\n        throw exceptionBuilder()\n            .evalError(\"cannotInvokeSupermethodFromHere\")\n            .withSourceSection(sourceSection)\n            .build();\n      }\n\n      return InvokeSuperMethodNodeGen.create(\n          sourceSection, memberName, visitArgumentList(argCtx), needsConst);\n    }\n\n    // superproperty call\n    return new ReadSuperPropertyNode(createSourceSection(expr), memberName, needsConst);\n  }\n\n  @Override\n  public ExpressionNode visitSuperSubscriptExpr(SuperSubscriptExpr expr) {\n    return new ReadSuperEntryNode(createSourceSection(expr), visitExpr(expr.getArg()));\n  }\n\n  @Override\n  public ExpressionNode visitQualifiedAccessExpr(QualifiedAccessExpr expr) {\n    if (expr.getArgumentList() != null) {\n      return doVisitMethodAccessExpr(expr);\n    }\n\n    return doVisitPropertyInvocationExpr(expr);\n  }\n\n  @Override\n  public ExpressionNode visitSubscriptExpr(SubscriptExpr expr) {\n    return SubscriptNodeGen.create(\n        createSourceSection(expr), visitExpr(expr.getExpr()), visitExpr(expr.getArg()));\n  }\n\n  @Override\n  public ExpressionNode visitNonNullExpr(NonNullExpr expr) {\n    return new NonNullNode(createSourceSection(expr), visitExpr(expr.getExpr()));\n  }\n\n  @Override\n  public ExpressionNode visitUnaryMinusExpr(UnaryMinusExpr expr) {\n    var childNode = expr.getExpr();\n    var childExpr = visitExpr(childNode);\n    if (childNode instanceof IntLiteralExpr || childNode instanceof FloatLiteralExpr) {\n      // negation already handled (see visitIntLiteral/visitFloatLiteral)\n      return childExpr;\n    }\n    return UnaryMinusNodeGen.create(createSourceSection(expr), childExpr);\n  }\n\n  @Override\n  public ExpressionNode visitLogicalNotExpr(LogicalNotExpr expr) {\n    return LogicalNotNodeGen.create(createSourceSection(expr), visitExpr(expr.getExpr()));\n  }\n\n  @Override\n  public ExpressionNode visitBinaryOperatorExpr(BinaryOperatorExpr expr) {\n    return switch (expr.getOp()) {\n      case POW ->\n          ExponentiationNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case MULT ->\n          MultiplicationNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case DIV ->\n          DivisionNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case INT_DIV ->\n          TruncatingDivisionNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case MOD ->\n          RemainderNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case PLUS ->\n          AdditionNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case MINUS ->\n          SubtractionNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case LT ->\n          LessThanNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case GT ->\n          GreaterThanNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case LTE ->\n          LessThanOrEqualNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case GTE ->\n          GreaterThanOrEqualNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case EQ_EQ ->\n          EqualNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case NOT_EQ ->\n          NotEqualNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case AND ->\n          LogicalAndNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getRight()), visitExpr(expr.getLeft()));\n      case OR ->\n          LogicalOrNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getRight()), visitExpr(expr.getLeft()));\n      case PIPE ->\n          PipeNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getLeft()), visitExpr(expr.getRight()));\n      case NULL_COALESCE ->\n          NullCoalescingNodeGen.create(\n              createSourceSection(expr), visitExpr(expr.getRight()), visitExpr(expr.getLeft()));\n      default -> throw PklBugException.unreachableCode();\n    };\n  }\n\n  @Override\n  public ExpressionNode visitTypeCheckExpr(TypeCheckExpr expr) {\n    return new TypeTestNode(\n        createSourceSection(expr), visitExpr(expr.getExpr()), visitType(expr.getType()));\n  }\n\n  @Override\n  public ExpressionNode visitTypeCastExpr(TypeCastExpr expr) {\n    return new TypeCastNode(\n        createSourceSection(expr), visitExpr(expr.getExpr()), visitType(expr.getType()));\n  }\n\n  @Override\n  public ExpressionNode visitIfExpr(IfExpr expr) {\n    return new IfElseNode(\n        createSourceSection(expr),\n        visitExpr(expr.getCond()),\n        visitExpr(expr.getThen()),\n        visitExpr(expr.getEls()));\n  }\n\n  @Override\n  public ExpressionNode visitLetExpr(LetExpr letExpr) {\n    var sourceSection = createSourceSection(letExpr);\n    var parameter = letExpr.getParameter();\n    var frameBuilder = FrameDescriptor.newBuilder();\n    UnresolvedTypeNode[] typeNodes;\n    if (parameter instanceof TypedIdentifier par) {\n      typeNodes = new UnresolvedTypeNode[] {visitTypeAnnotation(par.getTypeAnnotation())};\n      frameBuilder.addSlot(\n          FrameSlotKind.Illegal, toIdentifier(par.getIdentifier().getValue()), null);\n    } else {\n      typeNodes = new UnresolvedTypeNode[0];\n    }\n\n    var isCustomThisScope = symbolTable.getCurrentScope().isCustomThisScope();\n\n    UnresolvedFunctionNode functionNode =\n        symbolTable.enterLambda(\n            frameBuilder,\n            scope -> {\n              var expr = visitExpr(letExpr.getExpr());\n              return new UnresolvedFunctionNode(\n                  language,\n                  scope.buildFrameDescriptor(),\n                  new Lambda(createSourceSection(letExpr.getExpr()), scope.getQualifiedName()),\n                  1,\n                  typeNodes,\n                  null,\n                  expr);\n            });\n\n    return new LetExprNode(\n        sourceSection, functionNode, visitExpr(letExpr.getBindingExpr()), isCustomThisScope);\n  }\n\n  @Override\n  public ExpressionNode visitFunctionLiteralExpr(FunctionLiteralExpr expr) {\n    var sourceSection = createSourceSection(expr);\n    var params = expr.getParameterList();\n    var descriptorBuilder = createFrameDescriptorBuilder(params);\n    var paramCount = params.getParameters().size();\n\n    if (paramCount > 5) {\n      throw exceptionBuilder()\n          .evalError(\"tooManyFunctionParameters\")\n          .withSourceSection(sourceSection)\n          .build();\n    }\n\n    var isCustomThisScope = symbolTable.getCurrentScope().isCustomThisScope();\n\n    return symbolTable.enterLambda(\n        descriptorBuilder,\n        scope -> {\n          var exprNode = visitExpr(expr.getExpr());\n          var functionNode =\n              new UnresolvedFunctionNode(\n                  language,\n                  scope.buildFrameDescriptor(),\n                  new Lambda(sourceSection, scope.getQualifiedName()),\n                  paramCount,\n                  doVisitParameterTypes(params),\n                  null,\n                  exprNode);\n\n          return new FunctionLiteralNode(sourceSection, functionNode, isCustomThisScope);\n        });\n  }\n\n  @Override\n  public ExpressionNode visitParenthesizedExpr(ParenthesizedExpr expr) {\n    return visitExpr(expr.getExpr());\n  }\n\n  private ExpressionNode doVisitListLiteral(Expr expr, ArgumentList argList) {\n    var elementNodes = createCollectionArgumentNodes(argList);\n\n    if (elementNodes.first.length == 0) {\n      return new ConstantValueNode(VmList.EMPTY);\n    }\n\n    return elementNodes.second\n        ? new ConstantValueNode(\n            createSourceSection(expr), VmList.createFromConstantNodes(elementNodes.first))\n        : new ListLiteralNode(createSourceSection(expr), elementNodes.first);\n  }\n\n  private ExpressionNode doVisitSetLiteral(Expr expr, ArgumentList argList) {\n    var elementNodes = createCollectionArgumentNodes(argList);\n\n    if (elementNodes.first.length == 0) {\n      return new ConstantValueNode(VmSet.EMPTY);\n    }\n\n    return elementNodes.second\n        ? new ConstantValueNode(\n            createSourceSection(expr), VmSet.createFromConstantNodes(elementNodes.first))\n        : new SetLiteralNode(createSourceSection(expr), elementNodes.first);\n  }\n\n  private ExpressionNode doVisitMapLiteral(Expr expr, ArgumentList argList) {\n    var keyAndValueNodes = createCollectionArgumentNodes(argList);\n\n    if (keyAndValueNodes.first.length == 0) {\n      return new ConstantValueNode(VmMap.EMPTY);\n    }\n\n    if (keyAndValueNodes.first.length % 2 != 0) {\n      throw exceptionBuilder()\n          .evalError(\"missingMapValue\")\n          .withSourceSection(createSourceSection(argList.span().stopSpan()))\n          .build();\n    }\n\n    return keyAndValueNodes.second\n        ? new ConstantValueNode(\n            createSourceSection(expr), VmMap.createFromConstantNodes(keyAndValueNodes.first))\n        : new MapLiteralNode(createSourceSection(expr), keyAndValueNodes.first);\n  }\n\n  private ExpressionNode doVisitBytesLiteral(Expr expr, ArgumentList argList) {\n    var elementNodes = createCollectionArgumentBytesNodes(argList);\n\n    if (elementNodes.first.length == 0) {\n      return new ConstantValueNode(VmBytes.EMPTY);\n    }\n    return elementNodes.second\n        ? new ConstantValueNode(\n            createSourceSection(expr), VmBytes.createFromConstantNodes(elementNodes.first))\n        : new BytesLiteralNode(createSourceSection(expr), elementNodes.first);\n  }\n\n  private Pair<ExpressionNode[], Boolean> createCollectionArgumentNodes(ArgumentList exprs) {\n    var args = exprs.getArguments();\n    var elementNodes = new ExpressionNode[args.size()];\n    var isConstantNodes = true;\n\n    for (var i = 0; i < elementNodes.length; i++) {\n      var exprNode = visitExpr(args.get(i));\n      elementNodes[i] = exprNode;\n      isConstantNodes = isConstantNodes && exprNode instanceof ConstantNode;\n    }\n\n    return Pair.of(elementNodes, isConstantNodes);\n  }\n\n  private Pair<ExpressionNode[], Boolean> createCollectionArgumentBytesNodes(ArgumentList exprs) {\n    var args = exprs.getArguments();\n    var expressionNodes = new ExpressionNode[args.size()];\n    var isAllByteLiterals = true;\n\n    for (var i = 0; i < args.size(); i++) {\n      var expr = args.get(i);\n      if (expr instanceof IntLiteralExpr intLiteralExpr && isAllByteLiterals) {\n        try {\n          var byt = parseNumber(intLiteralExpr, Byte::parseByte);\n          expressionNodes[i] = new ByteConstantValueNode(byt);\n        } catch (NumberFormatException e) {\n          // proceed with initializing a constant value node; we'll throw an error inside\n          // BytesLiteralNode.\n          isAllByteLiterals = false;\n          expressionNodes[i] = visitExpr(expr);\n        }\n      } else {\n        isAllByteLiterals = false;\n        expressionNodes[i] = visitExpr(expr);\n      }\n    }\n\n    return Pair.of(expressionNodes, isAllByteLiterals);\n  }\n\n  public GeneratorMemberNode visitObjectMember(org.pkl.parser.syntax.ObjectMember member) {\n    return (GeneratorMemberNode) member.accept(this);\n  }\n\n  @Override\n  public GeneratorPropertyNode visitObjectProperty(ObjectProperty member) {\n    checkNotInsideForGenerator(member, \"forGeneratorCannotGenerateProperties\");\n    var memberNode = doVisitObjectProperty(member);\n    return GeneratorPropertyNodeGen.create(memberNode);\n  }\n\n  @Override\n  public GeneratorMemberNode visitObjectMethod(ObjectMethod memberNode) {\n    checkNotInsideForGenerator(memberNode, \"forGeneratorCannotGenerateMethods\");\n    var member = doVisitObjectMethod(memberNode);\n    return GeneratorPropertyNodeGen.create(member);\n  }\n\n  @Override\n  public GeneratorMemberNode visitMemberPredicate(MemberPredicate ctx) {\n    var keyNode = symbolTable.enterCustomThisScope(scope -> visitExpr(ctx.getPred()));\n    var member =\n        doVisitObjectEntryBody(createSourceSection(ctx), keyNode, ctx.getExpr(), ctx.getBodyList());\n    var isFrameStored =\n        member.getMemberNode() != null && symbolTable.getCurrentScope().isForGeneratorScope();\n    return GeneratorPredicateMemberNodeGen.create(keyNode, member, isFrameStored);\n  }\n\n  @Override\n  public GeneratorMemberNode visitObjectElement(ObjectElement member) {\n    var memberNode = doVisitObjectElement(member);\n    var isFrameStored =\n        memberNode.getMemberNode() != null && symbolTable.getCurrentScope().isForGeneratorScope();\n    return GeneratorElementNodeGen.create(memberNode, isFrameStored);\n  }\n\n  @Override\n  public GeneratorMemberNode visitObjectEntry(ObjectEntry member) {\n    var keyNodeAndMember = doVisitObjectEntry(member);\n    var keyNode = keyNodeAndMember.first;\n    var memberNode = keyNodeAndMember.second;\n    var isFrameStored =\n        memberNode.getMemberNode() != null && symbolTable.getCurrentScope().isForGeneratorScope();\n\n    return GeneratorEntryNodeGen.create(keyNode, memberNode, isFrameStored);\n  }\n\n  @Override\n  public GeneratorMemberNode visitObjectSpread(ObjectSpread member) {\n    var expr = visitExpr(member.getExpr());\n    return GeneratorSpreadNodeGen.create(createSourceSection(member), expr, member.isNullable());\n  }\n\n  @Override\n  public GeneratorMemberNode visitWhenGenerator(WhenGenerator member) {\n    var sourceSection = createSourceSection(member);\n    var thenNodes = doVisitForWhenBody(member.getThenClause());\n    var elseNodes =\n        member.getElseClause() == null\n            ? new GeneratorMemberNode[0]\n            : doVisitForWhenBody(member.getElseClause());\n\n    return new GeneratorWhenNode(\n        sourceSection, visitExpr(member.getPredicate()), thenNodes, elseNodes);\n  }\n\n  private GeneratorMemberNode[] doVisitForWhenBody(ObjectBody body) {\n    if (!body.getParameters().isEmpty()) {\n      throw exceptionBuilder()\n          .evalError(\"forWhenBodyCannotHaveParameters\")\n          .withSourceSection(createSourceSection(body.getParameters().get(0)))\n          .build();\n    }\n    return doVisitGeneratorMemberNodes(body.getMembers());\n  }\n\n  @Override\n  public GeneratorMemberNode visitForGenerator(ForGenerator ctx) {\n    var keyParameter = ctx.getP2() == null ? null : ctx.getP1();\n    var valueParameter = ctx.getP2() == null ? ctx.getP1() : ctx.getP2();\n    TypedIdentifier keyTypedIdentifier = null;\n    if (keyParameter instanceof TypedIdentifier ti) keyTypedIdentifier = ti;\n    TypedIdentifier valueTypedIdentifier = null;\n    if (valueParameter instanceof TypedIdentifier ti) valueTypedIdentifier = ti;\n\n    var keyIdentifier =\n        keyTypedIdentifier == null\n            ? null\n            : toIdentifier(keyTypedIdentifier.getIdentifier().getValue());\n    var valueIdentifier =\n        valueTypedIdentifier == null\n            ? null\n            : toIdentifier(valueTypedIdentifier.getIdentifier().getValue());\n    if (valueIdentifier != null && valueIdentifier == keyIdentifier) {\n      throw exceptionBuilder()\n          .evalError(\"duplicateDefinition\", valueIdentifier)\n          .withSourceSection(createSourceSection(valueTypedIdentifier.getIdentifier()))\n          .build();\n    }\n    var currentScope = symbolTable.getCurrentScope();\n    var generatorDescriptorBuilder = currentScope.newFrameDescriptorBuilder();\n    var memberDescriptorBuilder = currentScope.newForGeneratorMemberDescriptorBuilder();\n    var keySlot = -1;\n    var valueSlot = -1;\n    if (keyIdentifier != null) {\n      keySlot = generatorDescriptorBuilder.addSlot(FrameSlotKind.Illegal, keyIdentifier, null);\n      memberDescriptorBuilder.addSlot(FrameSlotKind.Illegal, keyIdentifier, null);\n    }\n    if (valueIdentifier != null) {\n      valueSlot = generatorDescriptorBuilder.addSlot(FrameSlotKind.Illegal, valueIdentifier, null);\n      memberDescriptorBuilder.addSlot(FrameSlotKind.Illegal, valueIdentifier, null);\n    }\n    var unresolvedKeyTypeNode =\n        keyTypedIdentifier == null\n            ? null\n            : visitTypeAnnotation(keyTypedIdentifier.getTypeAnnotation());\n    var unresolvedValueTypeNode =\n        valueTypedIdentifier == null\n            ? null\n            : visitTypeAnnotation(valueTypedIdentifier.getTypeAnnotation());\n    // if possible, initialize immediately to avoid later insert\n    var keyTypeNode =\n        unresolvedKeyTypeNode == null && keySlot != -1\n            ? new TypeNode.UnknownTypeNode(VmUtils.unavailableSourceSection())\n                .initWriteSlotNode(keySlot)\n            : null;\n    // if possible, initialize immediately to avoid later insert\n    var valueTypeNode =\n        unresolvedValueTypeNode == null && valueSlot != -1\n            ? new TypeNode.UnknownTypeNode(VmUtils.unavailableSourceSection())\n                .initWriteSlotNode(valueSlot)\n            : null;\n    var iterableNode = visitExpr(ctx.getExpr());\n    var memberNodes =\n        symbolTable.enterForGenerator(\n            generatorDescriptorBuilder,\n            memberDescriptorBuilder,\n            scope -> doVisitForWhenBody(ctx.getBody()));\n    return GeneratorForNodeGen.create(\n        createSourceSection(ctx),\n        generatorDescriptorBuilder.build(),\n        iterableNode,\n        unresolvedKeyTypeNode,\n        unresolvedValueTypeNode,\n        memberNodes,\n        keyTypeNode,\n        valueTypeNode);\n  }\n\n  @Override\n  public PklRootNode visitModule(Module mod) {\n    var moduleDecl = mod.getDecl();\n\n    var annotationNodes =\n        moduleDecl != null\n            ? doVisitAnnotations(moduleDecl.getAnnotations())\n            : new ExpressionNode[] {};\n\n    int modifiers;\n    if (moduleDecl == null) {\n      modifiers = VmModifier.NONE;\n    } else {\n      var modifierNodes = moduleDecl.getModifiers();\n      modifiers =\n          doVisitModifiers(\n              modifierNodes, VmModifier.VALID_MODULE_MODIFIERS, \"invalidModuleModifier\");\n      // doing this in a second step gives better error messages\n      if (moduleInfo.isAmend()) {\n        modifiers =\n            doVisitModifiers(\n                modifierNodes,\n                VmModifier.VALID_AMENDING_MODULE_MODIFIERS,\n                \"invalidAmendingModuleModifier\");\n      }\n    }\n\n    var extendsOrAmendsClause = moduleDecl != null ? moduleDecl.getExtendsOrAmendsDecl() : null;\n\n    var supermoduleNode =\n        extendsOrAmendsClause == null\n            ? resolveBaseModuleClass(\n                org.pkl.core.runtime.Identifier.MODULE, BaseModule::getModuleClass)\n            : doVisitImport(false, extendsOrAmendsClause, extendsOrAmendsClause.getUrl());\n\n    var propertyNames =\n        CollectionUtils.<String>newHashSet(\n            mod.getImports().size()\n                + mod.getClasses().size()\n                + mod.getTypeAliases().size()\n                + mod.getProperties().size());\n\n    if (!moduleInfo.isAmend()) {\n      var supertypeNode =\n          new UnresolvedTypeNode.Declared(supermoduleNode.getSourceSection(), supermoduleNode);\n      var moduleProperties =\n          doVisitModuleProperties(\n              mod.getImports(),\n              mod.getClasses(),\n              mod.getTypeAliases(),\n              List.of(),\n              propertyNames,\n              moduleInfo);\n      var unresolvedPropertyNodes = doVisitClassProperties(mod.getProperties(), propertyNames);\n\n      var classNode =\n          new ClassNode(\n              moduleInfo.getSourceSection(),\n              moduleInfo.getHeaderSection(),\n              moduleInfo.getDocComment(),\n              annotationNodes,\n              modifiers,\n              PClassInfo.forModuleClass(\n                  moduleInfo.getModuleName(), moduleInfo.getModuleKey().getUri()),\n              List.of(),\n              moduleInfo,\n              supertypeNode,\n              moduleProperties,\n              unresolvedPropertyNodes,\n              doVisitMethodDefs(mod.getMethods()));\n\n      return new ModuleNode(\n          language, moduleInfo.getSourceSection(), moduleInfo.getModuleName(), classNode);\n    }\n\n    var moduleProperties =\n        doVisitModuleProperties(\n            mod.getImports(),\n            mod.getClasses(),\n            mod.getTypeAliases(),\n            mod.getProperties(),\n            propertyNames,\n            moduleInfo);\n\n    for (var methodCtx : mod.getMethods()) {\n      assert methodCtx.getExpr() != null;\n      var localMethod =\n          doVisitObjectMethod(\n              methodCtx,\n              methodCtx.getModifiers(),\n              methodCtx.getHeaderSpan(),\n              methodCtx.getName(),\n              methodCtx.getParameterList(),\n              methodCtx.getTypeParameterList(),\n              methodCtx.getExpr(),\n              methodCtx.getTypeAnnotation(),\n              true);\n      EconomicMaps.put(moduleProperties, localMethod.getName(), localMethod);\n    }\n\n    var moduleNode =\n        AmendModuleNodeGen.create(\n            moduleInfo.getHeaderSection(),\n            language,\n            annotationNodes,\n            moduleProperties,\n            moduleInfo,\n            supermoduleNode);\n\n    return new ModuleNode(\n        language, moduleInfo.getSourceSection(), moduleInfo.getModuleName(), moduleNode);\n  }\n\n  private EconomicMap<Object, ObjectMember> doVisitModuleProperties(\n      List<ImportClause> imports,\n      List<Class> classes,\n      List<TypeAlias> typeAliases,\n      List<ClassProperty> properties,\n      Set<String> propertyNames,\n      ModuleInfo moduleInfo) {\n\n    var totalSize = imports.size() + classes.size() + typeAliases.size() + properties.size();\n    var result = EconomicMaps.<Object, ObjectMember>create(totalSize);\n\n    for (var _import : imports) {\n      var member = visitImportClause(_import);\n      checkDuplicateMember(member.getName(), member.getHeaderSection(), propertyNames);\n      EconomicMaps.put(result, member.getName(), member);\n    }\n\n    for (var clazz : classes) {\n      ObjectMember member = visitClass(clazz);\n\n      if (moduleInfo.isAmend() && !member.isLocal()) {\n        throw exceptionBuilder()\n            .evalError(\"classMustBeLocal\")\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n\n      checkDuplicateMember(member.getName(), member.getHeaderSection(), propertyNames);\n      EconomicMaps.put(result, member.getName(), member);\n    }\n\n    for (var typeAlias : typeAliases) {\n      var member = visitTypeAlias(typeAlias);\n\n      if (moduleInfo.isAmend() && !member.isLocal()) {\n        throw exceptionBuilder()\n            .evalError(\"typeAliasMustBeLocal\")\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n\n      checkDuplicateMember(member.getName(), member.getHeaderSection(), propertyNames);\n      EconomicMaps.put(result, member.getName(), member);\n    }\n\n    for (var ctx : properties) {\n      var member =\n          doVisitObjectProperty(\n              ctx,\n              ctx.getModifiers(),\n              ctx.getName(),\n              ctx.getTypeAnnotation(),\n              ctx.getExpr(),\n              ctx.getBodyList());\n\n      if (moduleInfo.isAmend() && !member.isLocal() && ctx.getTypeAnnotation() != null) {\n        throw exceptionBuilder()\n            .evalError(\"nonLocalObjectPropertyCannotHaveTypeAnnotation\")\n            .withSourceSection(createSourceSection(ctx.getTypeAnnotation().getType()))\n            .build();\n      }\n\n      checkDuplicateMember(member.getName(), member.getHeaderSection(), propertyNames);\n      EconomicMaps.put(result, member.getName(), member);\n    }\n\n    return result;\n  }\n\n  @Override\n  public ObjectMember visitImportClause(ImportClause imp) {\n    var importNode = doVisitImport(imp.isGlob(), imp, imp.getImportStr());\n    var moduleKey = moduleResolver.resolve(importNode.getImportUri());\n    var importName =\n        org.pkl.core.runtime.Identifier.property(\n            imp.getAlias() != null ? imp.getAlias().getValue() : IoUtils.inferModuleName(moduleKey),\n            true);\n\n    return symbolTable.enterProperty(\n        importName,\n        ConstLevel.NONE,\n        scope -> {\n          var modifiers = VmModifier.IMPORT | VmModifier.LOCAL | VmModifier.CONST;\n          if (imp.isGlob()) {\n            modifiers = modifiers | VmModifier.GLOB;\n          }\n          var result =\n              new ObjectMember(\n                  importNode.getSourceSection(),\n                  importNode.getSourceSection(),\n                  modifiers,\n                  scope.getName(),\n                  scope.getQualifiedName());\n\n          result.initMemberNode(\n              new UntypedObjectMemberNode(\n                  language, scope.buildFrameDescriptor(), result, importNode));\n\n          return result;\n        });\n  }\n\n  @Override\n  public ObjectMember visitClass(Class clazz) {\n    var sourceSection = createSourceSection(clazz);\n    var headerSection = createSourceSection(clazz.getHeaderSpan());\n\n    var bodyNode = clazz.getBody();\n\n    var typeParameters = visitTypeParameterList(clazz.getTypeParameterList());\n\n    List<ClassProperty> properties = bodyNode != null ? bodyNode.getProperties() : List.of();\n    List<ClassMethod> methods = bodyNode != null ? bodyNode.getMethods() : List.of();\n\n    var modifiers =\n        doVisitModifiers(\n                clazz.getModifiers(), VmModifier.VALID_CLASS_MODIFIERS, \"invalidClassModifier\")\n            | VmModifier.CLASS;\n\n    var className =\n        org.pkl.core.runtime.Identifier.property(\n            clazz.getName().getValue(), VmModifier.isLocal(modifiers));\n\n    return symbolTable.enterClass(\n        className,\n        typeParameters,\n        scope -> {\n          var supertypeCtx = clazz.getSuperClass();\n\n          // needs to be inside `enterClass` so that class' type parameters are in scope\n          var supertypeNode =\n              supertypeCtx != null\n                  ? visitType(supertypeCtx)\n                  : isBaseModule && className == org.pkl.core.runtime.Identifier.ANY\n                      ? null\n                      : new UnresolvedTypeNode.Declared(\n                          VmUtils.unavailableSourceSection(),\n                          resolveBaseModuleClass(\n                              org.pkl.core.runtime.Identifier.TYPED, BaseModule::getTypedClass));\n\n          if (!(supertypeNode == null\n              || supertypeNode instanceof UnresolvedTypeNode.Declared\n              || supertypeNode instanceof UnresolvedTypeNode.Parameterized\n              || supertypeNode instanceof UnresolvedTypeNode.Module)) {\n            throw exceptionBuilder()\n                .evalError(\"invalidSupertype\", supertypeNode.getSourceSection().getCharacters())\n                .withSourceSection(supertypeNode.getSourceSection())\n                .build();\n          }\n\n          var classInfo =\n              PClassInfo.get(\n                  moduleInfo.getModuleName(),\n                  className.toString(),\n                  moduleInfo.getModuleKey().getUri());\n          var propertyNames = CollectionUtils.<String>newHashSet(properties.size());\n\n          var classNode =\n              new ClassNode(\n                  sourceSection,\n                  headerSection,\n                  createDocSourceSection(clazz.getDocComment()),\n                  doVisitAnnotations(clazz.getAnnotations()),\n                  modifiers,\n                  classInfo,\n                  typeParameters,\n                  null,\n                  supertypeNode,\n                  EconomicMaps.create(),\n                  doVisitClassProperties(properties, propertyNames),\n                  doVisitMethodDefs(methods));\n\n          var isLocal = VmModifier.isLocal(modifiers);\n\n          var result =\n              new ObjectMember(\n                  sourceSection,\n                  headerSection,\n                  isLocal ? VmModifier.LOCAL_CLASS_OBJECT_MEMBER : VmModifier.CLASS_OBJECT_MEMBER,\n                  scope.getName(),\n                  scope.getQualifiedName());\n\n          result.initMemberNode(\n              new UntypedObjectMemberNode(\n                  language, scope.buildFrameDescriptor(), result, classNode));\n\n          return result;\n        });\n  }\n\n  private ExpressionNode resolveBaseModuleClass(\n      org.pkl.core.runtime.Identifier className, Supplier<VmClass> clazz) {\n    return isBaseModule\n        ?\n        // Can't access BaseModule.getXYZClass() while parsing base module\n        new GetBaseModuleClassNode(className)\n        : new ConstantValueNode(clazz.get());\n  }\n\n  @Override\n  public Integer visitModifier(Modifier modifier) {\n    return switch (modifier.getValue()) {\n      case EXTERNAL -> VmModifier.EXTERNAL;\n      case ABSTRACT -> VmModifier.ABSTRACT;\n      case OPEN -> VmModifier.OPEN;\n      case LOCAL -> VmModifier.LOCAL;\n      case HIDDEN -> VmModifier.HIDDEN;\n      case FIXED -> VmModifier.FIXED;\n      case CONST -> VmModifier.CONST;\n    };\n  }\n\n  private UnresolvedPropertyNode[] doVisitClassProperties(\n      List<ClassProperty> propertyContexts, Set<String> propertyNames) {\n    var propertyNodes = new UnresolvedPropertyNode[propertyContexts.size()];\n\n    for (var i = 0; i < propertyNodes.length; i++) {\n      var propertyNode = visitClassProperty(propertyContexts.get(i));\n      checkDuplicateMember(propertyNode.getName(), propertyNode.getHeaderSection(), propertyNames);\n      propertyNodes[i] = propertyNode;\n    }\n\n    return propertyNodes;\n  }\n\n  private UnresolvedMethodNode[] doVisitMethodDefs(List<ClassMethod> methodDefs) {\n    var methodNodes = new UnresolvedMethodNode[methodDefs.size()];\n    var methodNames = CollectionUtils.<String>newHashSet(methodDefs.size());\n\n    for (var i = 0; i < methodNodes.length; i++) {\n      var methodNode = visitClassMethod(methodDefs.get(i));\n      checkDuplicateMember(methodNode.getName(), methodNode.getHeaderSection(), methodNames);\n      methodNodes[i] = methodNode;\n    }\n\n    return methodNodes;\n  }\n\n  @Override\n  public UnresolvedPropertyNode visitClassProperty(ClassProperty entry) {\n    var docCom = entry.getDocComment();\n    var annotations = entry.getAnnotations();\n    var modifierList = entry.getModifiers();\n    var name = entry.getName();\n    var typeAnnotation = entry.getTypeAnnotation();\n    var expr = entry.getExpr();\n    var objectBodies = entry.getBodyList();\n    var docComment = createDocSourceSection(docCom);\n    var annotationNodes = doVisitAnnotations(annotations);\n    var sourceSection = createSourceSection(entry);\n    var headerStart = !modifierList.isEmpty() ? modifierList.get(0).span() : name.span();\n    var headerEnd = typeAnnotation != null ? typeAnnotation.span() : name.span();\n    var headerSection = createSourceSection(headerStart.endWith(headerEnd));\n\n    var modifiers =\n        doVisitModifiers(\n            modifierList, VmModifier.VALID_PROPERTY_MODIFIERS, \"invalidPropertyModifier\");\n\n    var isLocal = VmModifier.isLocal(modifiers);\n    var propertyName = org.pkl.core.runtime.Identifier.property(name.getValue(), isLocal);\n\n    return symbolTable.enterProperty(\n        propertyName,\n        getConstLevel(modifiers),\n        scope -> {\n          ExpressionNode bodyNode;\n\n          if (expr != null) { // prop = expr\n            if (VmModifier.isExternal(modifiers)) {\n              throw exceptionBuilder()\n                  .evalError(\"externalMemberCannotHaveBody\")\n                  .withSourceSection(headerSection)\n                  .build();\n            }\n            if (VmModifier.isAbstract(modifiers)) {\n              throw exceptionBuilder()\n                  .evalError(\"abstractMemberCannotHaveBody\")\n                  .withSourceSection(headerSection)\n                  .build();\n            }\n            bodyNode = visitExpr(expr);\n          } else if (!objectBodies.isEmpty()) { // prop { ... }\n            if (typeAnnotation != null) {\n              throw exceptionBuilder()\n                  .evalError(\"cannotAmendPropertyDefinition\")\n                  .withSourceSection(createSourceSection(entry))\n                  .build();\n            }\n            bodyNode =\n                doVisitObjectBody(\n                    objectBodies,\n                    new ReadSuperPropertyNode(\n                        unavailableSourceSection(),\n                        scope.getName(),\n                        scope.getConstLevel() == ConstLevel.ALL));\n          } else { // no value given\n            if (isLocal) {\n              assert typeAnnotation != null;\n              throw missingLocalPropertyValue(typeAnnotation);\n            }\n            if (VmModifier.isExternal(modifiers)) {\n              bodyNode =\n                  externalMemberRegistry.getPropertyBody(scope.getQualifiedName(), headerSection);\n              if (bodyNode instanceof LanguageAwareNode languageAwareNode) {\n                languageAwareNode.initLanguage(language);\n              }\n            } else if (VmModifier.isAbstract(modifiers)) {\n              bodyNode =\n                  new CannotInvokeAbstractPropertyNode(headerSection, scope.getQualifiedName());\n            } else {\n              bodyNode = null; // will be given a default by UnresolvedPropertyNode\n            }\n          }\n\n          var typeAnnNode = visitTypeAnnotation(typeAnnotation);\n\n          return new UnresolvedPropertyNode(\n              language,\n              sourceSection,\n              headerSection,\n              createSourceSection(name),\n              scope.buildFrameDescriptor(),\n              docComment,\n              annotationNodes,\n              modifiers,\n              scope.getName(),\n              scope.getQualifiedName(),\n              typeAnnNode,\n              bodyNode);\n        });\n  }\n\n  @Override\n  public UnresolvedMethodNode visitClassMethod(ClassMethod entry) {\n    var headerSection = createSourceSection(entry.getHeaderSpan());\n\n    var typeParameters = visitTypeParameterList(entry.getTypeParameterList());\n\n    var modifiers =\n        doVisitModifiers(\n            entry.getModifiers(), VmModifier.VALID_METHOD_MODIFIERS, \"invalidMethodModifier\");\n\n    var isLocal = VmModifier.isLocal(modifiers);\n    var methodName = org.pkl.core.runtime.Identifier.method(entry.getName().getValue(), isLocal);\n\n    var bodyContext = entry.getExpr();\n    var paramListCtx = entry.getParameterList();\n    var descriptorBuilder = createFrameDescriptorBuilder(paramListCtx);\n    var paramCount = paramListCtx.getParameters().size();\n\n    return symbolTable.enterMethod(\n        methodName,\n        getConstLevel(modifiers),\n        descriptorBuilder,\n        typeParameters,\n        scope -> {\n          ExpressionNode bodyNode;\n          if (bodyContext != null) {\n            if (VmModifier.isExternal(modifiers)) {\n              throw exceptionBuilder()\n                  .evalError(\"externalMemberCannotHaveBody\")\n                  .withSourceSection(headerSection)\n                  .build();\n            }\n            if (VmModifier.isAbstract(modifiers)) {\n              throw exceptionBuilder()\n                  .evalError(\"abstractMemberCannotHaveBody\")\n                  .withSourceSection(headerSection)\n                  .build();\n            }\n            bodyNode = visitExpr(bodyContext);\n          } else {\n            if (VmModifier.isExternal(modifiers)) {\n              bodyNode =\n                  externalMemberRegistry.getFunctionBody(\n                      scope.getQualifiedName(), headerSection, paramCount);\n              if (bodyNode instanceof LanguageAwareNode languageAwareNode) {\n                languageAwareNode.initLanguage(language);\n              }\n            } else if (VmModifier.isAbstract(modifiers)) {\n              bodyNode =\n                  new CannotInvokeAbstractFunctionNode(headerSection, scope.getQualifiedName());\n            } else {\n              throw exceptionBuilder()\n                  .evalError(\"missingMethodBody\", methodName)\n                  .withSourceSection(headerSection)\n                  .build();\n            }\n          }\n\n          return new UnresolvedMethodNode(\n              language,\n              createSourceSection(entry),\n              headerSection,\n              scope.buildFrameDescriptor(),\n              createDocSourceSection(entry.getDocComment()),\n              doVisitAnnotations(entry.getAnnotations()),\n              modifiers,\n              methodName,\n              scope.getQualifiedName(),\n              paramCount,\n              typeParameters,\n              doVisitParameterTypes(paramListCtx),\n              visitTypeAnnotation(entry.getTypeAnnotation()),\n              isMethodReturnTypeChecked,\n              bodyNode);\n        });\n  }\n\n  @Override\n  public ObjectMember visitTypeAlias(TypeAlias typeAlias) {\n    var sourceSection = createSourceSection(typeAlias);\n    var headerSection = createSourceSection(typeAlias.getHeaderSpan());\n\n    var modifiers =\n        doVisitModifiers(\n                typeAlias.getModifiers(),\n                VmModifier.VALID_TYPE_ALIAS_MODIFIERS,\n                \"invalidTypeAliasModifier\")\n            | VmModifier.TYPE_ALIAS;\n\n    var isLocal = VmModifier.isLocal(modifiers);\n    var name = org.pkl.core.runtime.Identifier.property(typeAlias.getName().getValue(), isLocal);\n\n    var typeParameters = visitTypeParameterList(typeAlias.getTypeParameterList());\n\n    return symbolTable.enterTypeAlias(\n        name,\n        typeParameters,\n        scope -> {\n          var scopeName = scope.getName();\n          var typeAliasNode =\n              new TypeAliasNode(\n                  sourceSection,\n                  headerSection,\n                  createDocSourceSection(typeAlias.getDocComment()),\n                  doVisitAnnotations(typeAlias.getAnnotations()),\n                  modifiers,\n                  scopeName.toString(),\n                  scope.getQualifiedName(),\n                  typeParameters,\n                  visitType(typeAlias.getType()));\n\n          var result =\n              new ObjectMember(\n                  sourceSection,\n                  headerSection,\n                  isLocal\n                      ? VmModifier.LOCAL_TYPEALIAS_OBJECT_MEMBER\n                      : VmModifier.TYPEALIAS_OBJECT_MEMBER,\n                  scopeName,\n                  scope.getQualifiedName());\n\n          result.initMemberNode(\n              new UntypedObjectMemberNode(\n                  language, scope.buildFrameDescriptor(), result, typeAliasNode));\n\n          return result;\n        });\n  }\n\n  @Override\n  public ExpressionNode visitAnnotation(Annotation annotation) {\n    var verifyNode = new CheckIsAnnotationClassNode(visitType(annotation.getType()));\n\n    var bodyCtx = annotation.getBody();\n    if (bodyCtx == null) {\n      var currentScope = symbolTable.getCurrentScope();\n      //noinspection ConstantConditions\n      return PropertiesLiteralNodeGen.create(\n          createSourceSection(annotation),\n          language,\n          currentScope.getQualifiedName(),\n          currentScope.isCustomThisScope(),\n          null,\n          new UnresolvedTypeNode[0],\n          EconomicMaps.create(),\n          verifyNode);\n    }\n\n    return symbolTable.enterAnnotationScope((scope) -> doVisitObjectBody(bodyCtx, verifyNode));\n  }\n\n  private ExpressionNode[] doVisitAnnotations(List<? extends Annotation> annotations) {\n    var nodes = new ExpressionNode[annotations.size()];\n    for (var i = 0; i < nodes.length; i++) {\n      nodes[i] = visitAnnotation(annotations.get(i));\n    }\n    return nodes;\n  }\n\n  public UnresolvedTypeNode visitType(Type type) {\n    return (UnresolvedTypeNode) type.accept(this);\n  }\n\n  public ExpressionNode visitExpr(Expr expr) {\n    return (ExpressionNode) expr.accept(this);\n  }\n\n  @Override\n  public List<TypeParameter> visitTypeParameterList(@Nullable TypeParameterList ctx) {\n    if (ctx == null) return List.of();\n\n    if (!(ctx.parent() instanceof TypeAlias) && !isStdLibModule) {\n      throw exceptionBuilder()\n          .evalError(\"cannotDeclareTypeParameter\")\n          .withSourceSection(createSourceSection(ctx.getParameters().get(0)))\n          .build();\n    }\n\n    var params = ctx.getParameters();\n    var size = params.size();\n    var result = new ArrayList<TypeParameter>(size);\n    for (var i = 0; i < size; i++) {\n      var paramCtx = params.get(i);\n      Variance variance;\n      var nodeVariance = paramCtx.getVariance();\n      if (nodeVariance == null) {\n        variance = TypeParameter.Variance.INVARIANT;\n      } else {\n        variance =\n            switch (nodeVariance) {\n              case IN -> TypeParameter.Variance.CONTRAVARIANT;\n              case OUT -> TypeParameter.Variance.COVARIANT;\n            };\n      }\n      var parameterName = paramCtx.getIdentifier().getValue();\n      if (result.stream().anyMatch(it -> it.getName().equals(parameterName))) {\n        throw exceptionBuilder()\n            .evalError(\"duplicateTypeParameter\", parameterName)\n            .withSourceSection(createSourceSection(paramCtx))\n            .build();\n      }\n      result.add(new TypeParameter(variance, parameterName, i));\n    }\n    return result;\n  }\n\n  @Override\n  public @Nullable UnresolvedTypeNode visitTypeAnnotation(@Nullable TypeAnnotation typeAnnotation) {\n    return typeAnnotation == null ? null : visitType(typeAnnotation.getType());\n  }\n\n  @Override\n  public ExpressionNode[] visitArgumentList(ArgumentList argumentList) {\n    var args = argumentList.getArguments();\n    var res = new ExpressionNode[args.size()];\n    for (int i = 0; i < res.length; i++) {\n      res[i] = visitExpr(args.get(i));\n    }\n    return res;\n  }\n\n  @Override\n  protected Object defaultValue() {\n    throw PklBugException.unreachableCode();\n  }\n\n  private ResolveDeclaredTypeNode doVisitTypeName(QualifiedIdentifier ctx) {\n    var identifiers = ctx.getIdentifiers();\n    return switch (identifiers.size()) {\n      case 1 -> {\n        var identifier = identifiers.get(0);\n        yield new ResolveSimpleDeclaredTypeNode(\n            createSourceSection(identifier),\n            org.pkl.core.runtime.Identifier.get(identifier.getValue()),\n            isBaseModule);\n      }\n      case 2 -> {\n        var identifier1 = identifiers.get(0);\n        var identifier2 = identifiers.get(1);\n        yield new ResolveQualifiedDeclaredTypeNode(\n            createSourceSection(ctx),\n            createSourceSection(identifier1),\n            createSourceSection(identifier2),\n            org.pkl.core.runtime.Identifier.localProperty(identifier1.getValue()),\n            org.pkl.core.runtime.Identifier.get(identifier2.getValue()));\n      }\n      default ->\n          throw exceptionBuilder()\n              .evalError(\"invalidTypeName\", ctx.text())\n              .withSourceSection(createSourceSection(ctx))\n              .build();\n    };\n  }\n\n  private ExpressionNode doVisitObjectBody(\n      List<? extends ObjectBody> bodies, ExpressionNode parentNode) {\n    for (var ctx : bodies) {\n      parentNode = doVisitObjectBody(ctx, parentNode);\n    }\n    return parentNode;\n  }\n\n  private ExpressionNode doVisitObjectBody(ObjectBody body, ExpressionNode parentNode) {\n    return symbolTable.enterObjectScope(\n        (scope) -> {\n          var objectMembers = body.getMembers();\n          if (objectMembers.isEmpty()) {\n            return EmptyObjectLiteralNodeGen.create(\n                Objects.requireNonNull(createSourceSection(body.parent())), parentNode);\n          }\n          var sourceSection = createSourceSection(body.parent());\n\n          var parametersDescriptorBuilder = createFrameDescriptorBuilder(body);\n          var parameterTypes = doVisitParameterTypes(body);\n\n          var members = EconomicMaps.<Object, ObjectMember>create();\n          var elements = new ArrayList<ObjectMember>();\n          var keyNodes = new ArrayList<ExpressionNode>();\n          var values = new ArrayList<ObjectMember>();\n          var isConstantKeyNodes = true;\n\n          checkSpaceSeparatedObjectMembers(body);\n          for (var memberCtx : objectMembers) {\n            if (memberCtx instanceof ObjectProperty property) {\n              addProperty(members, doVisitObjectProperty(property));\n              continue;\n            }\n\n            if (memberCtx instanceof ObjectEntry entry) {\n              var keyAndValue = doVisitObjectEntry(entry);\n              var key = keyAndValue.first;\n              keyNodes.add(key);\n              isConstantKeyNodes = isConstantKeyNodes && key instanceof ConstantNode;\n              values.add(keyAndValue.second);\n              continue;\n            }\n\n            if (memberCtx instanceof ObjectElement elementCtx) {\n              var element = doVisitObjectElement(elementCtx);\n              elements.add(element);\n              continue;\n            }\n\n            if (memberCtx instanceof ObjectMethod methodCtx) {\n              addProperty(members, doVisitObjectMethod(methodCtx));\n              continue;\n            }\n\n            assert memberCtx instanceof ForGenerator\n                || memberCtx instanceof WhenGenerator\n                || memberCtx instanceof MemberPredicate\n                || memberCtx instanceof ObjectSpread;\n            // bail out and create GeneratorObjectLiteralNode instead\n            // (but can't we easily reuse members/elements/keyNodes/values?)\n            return doVisitGeneratorObjectBody(body, parentNode);\n          }\n\n          var currentScope = symbolTable.getCurrentScope();\n          var parametersDescriptor =\n              parametersDescriptorBuilder == null ? null : parametersDescriptorBuilder.build();\n          if (!elements.isEmpty()) {\n            if (isConstantKeyNodes) { // true if zero key nodes\n              addConstantEntries(members, keyNodes, values);\n              //noinspection ConstantConditions\n              return ElementsLiteralNodeGen.create(\n                  sourceSection,\n                  language,\n                  currentScope.getQualifiedName(),\n                  currentScope.isCustomThisScope(),\n                  parametersDescriptor,\n                  parameterTypes,\n                  members,\n                  elements.toArray(new ObjectMember[0]),\n                  parentNode);\n            }\n            //noinspection ConstantConditions\n            return ElementsEntriesLiteralNodeGen.create(\n                sourceSection,\n                language,\n                currentScope.getQualifiedName(),\n                currentScope.isCustomThisScope(),\n                parametersDescriptor,\n                parameterTypes,\n                members,\n                elements.toArray(new ObjectMember[0]),\n                keyNodes.toArray(new ExpressionNode[0]),\n                values.toArray(new ObjectMember[0]),\n                parentNode);\n          }\n\n          if (!keyNodes.isEmpty()) {\n            if (isConstantKeyNodes) {\n              addConstantEntries(members, keyNodes, values);\n              //noinspection ConstantConditions\n              return ConstantEntriesLiteralNodeGen.create(\n                  sourceSection,\n                  language,\n                  currentScope.getQualifiedName(),\n                  currentScope.isCustomThisScope(),\n                  parametersDescriptor,\n                  parameterTypes,\n                  members,\n                  parentNode);\n            }\n            //noinspection ConstantConditions\n            return EntriesLiteralNodeGen.create(\n                sourceSection,\n                language,\n                currentScope.getQualifiedName(),\n                currentScope.isCustomThisScope(),\n                parametersDescriptor,\n                parameterTypes,\n                members,\n                keyNodes.toArray(new ExpressionNode[0]),\n                values.toArray(new ObjectMember[0]),\n                parentNode);\n          }\n          //noinspection ConstantConditions\n          return PropertiesLiteralNodeGen.create(\n              sourceSection,\n              language,\n              currentScope.getQualifiedName(),\n              currentScope.isCustomThisScope(),\n              parametersDescriptor,\n              parameterTypes,\n              members,\n              parentNode);\n        });\n  }\n\n  private void checkSpaceSeparatedObjectMembers(ObjectBody objectBody) {\n    var members = objectBody.getMembers();\n    if (members.size() < 2) {\n      return;\n    }\n    var previous = members.get(0).span();\n    for (var i = 1; i < members.size(); i++) {\n      var member = members.get(i);\n      if (previous.adjacent(member.span())) {\n        throw exceptionBuilder()\n            .evalError(\"unseparatedObjectMembers\")\n            .withSourceSection(createSourceSection(member.span()))\n            .build();\n      }\n      previous = member.span();\n    }\n  }\n\n  private ObjectMember doVisitObjectProperty(ObjectProperty prop) {\n    var modifierNodes = prop.getModifiers();\n    var propertyName = prop.getIdentifier();\n    var modifiers =\n        doVisitModifiers(\n            modifierNodes, VmModifier.VALID_OBJECT_MEMBER_MODIFIERS, \"invalidObjectMemberModifier\");\n    if (VmModifier.isConst(modifiers) && !VmModifier.isLocal(modifiers)) {\n      @SuppressWarnings(\"OptionalGetWithoutIsPresent\")\n      var constModifierCtx =\n          modifierNodes.stream()\n              .filter((it) -> it.getValue() == ModifierValue.CONST)\n              .findFirst()\n              .get();\n      throw exceptionBuilder()\n          .evalError(\"invalidConstObjectMemberModifier\")\n          .withSourceSection(createSourceSection(constModifierCtx))\n          .build();\n    }\n    return doVisitObjectProperty(\n        createSourceSection(prop),\n        createSourceSection(propertyName),\n        modifiers,\n        propertyName.getValue(),\n        prop.getTypeAnnotation(),\n        prop.getExpr(),\n        prop.getBodyList());\n  }\n\n  private ObjectMember doVisitObjectProperty(\n      Node node,\n      List<? extends Modifier> modifierNodes,\n      Identifier propertyName,\n      @Nullable TypeAnnotation typeAnn,\n      @Nullable Expr expr,\n      @Nullable List<? extends ObjectBody> bodies) {\n    var modifiers =\n        doVisitModifiers(\n            modifierNodes, VmModifier.VALID_OBJECT_MEMBER_MODIFIERS, \"invalidObjectMemberModifier\");\n    if (VmModifier.isConst(modifiers) && !VmModifier.isLocal(modifiers)) {\n      @SuppressWarnings(\"OptionalGetWithoutIsPresent\")\n      var constModifierCtx =\n          modifierNodes.stream()\n              .filter((it) -> it.getValue() == ModifierValue.CONST)\n              .findFirst()\n              .get();\n      throw exceptionBuilder()\n          .evalError(\"invalidConstObjectMemberModifier\")\n          .withSourceSection(createSourceSection(constModifierCtx))\n          .build();\n    }\n    return doVisitObjectProperty(\n        createSourceSection(node),\n        createSourceSection(propertyName),\n        modifiers,\n        propertyName.getValue(),\n        typeAnn,\n        expr,\n        bodies);\n  }\n\n  private ObjectMember doVisitObjectProperty(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      int modifiers,\n      String propertyName,\n      @Nullable TypeAnnotation typeAnn,\n      @Nullable Expr expr,\n      @Nullable List<? extends ObjectBody> body) {\n\n    var isLocal = VmModifier.isLocal(modifiers);\n    var identifier = org.pkl.core.runtime.Identifier.property(propertyName, isLocal);\n\n    return symbolTable.enterProperty(\n        identifier,\n        getConstLevel(modifiers),\n        scope -> {\n          if (isLocal) {\n            if (expr == null\n                && typeAnn != null) { // module property that has type annotation but no value\n              throw missingLocalPropertyValue(typeAnn);\n            }\n          } else {\n            if (typeAnn != null) {\n              throw exceptionBuilder()\n                  .evalError(\"nonLocalObjectPropertyCannotHaveTypeAnnotation\")\n                  .withSourceSection(createSourceSection(typeAnn.getType()))\n                  .build();\n            }\n          }\n\n          ExpressionNode bodyNode;\n          if (body != null && !body.isEmpty()) { // foo { ... }\n            if (isLocal) {\n              throw exceptionBuilder()\n                  .evalError(\"cannotAmendLocalPropertyDefinition\")\n                  .withSourceSection(createSourceSection(body.get(0)))\n                  .build();\n            }\n            bodyNode =\n                doVisitObjectBody(\n                    body,\n                    new ReadSuperPropertyNode(\n                        unavailableSourceSection(),\n                        scope.getName(),\n                        // Never need a const check for amends declarations. In `foo { ... }`:\n                        // 1. if `foo` is const, i.e. `const foo { ... }`, `super.foo` is required\n                        // to be const (the const-ness of a property cannot be changed)\n                        // 2. if in a const scope (i.e. `const bar = new { foo { ... } }`),\n                        // `super.foo` does not reference something outside the scope.\n                        false));\n          } else { // foo = ...\n            assert expr != null;\n            bodyNode = visitExpr(expr);\n          }\n\n          return isLocal\n              ? VmUtils.createLocalObjectProperty(\n                  language,\n                  sourceSection,\n                  headerSection,\n                  scope.getName(),\n                  scope.getQualifiedName(),\n                  scope.buildFrameDescriptor(),\n                  modifiers,\n                  bodyNode,\n                  visitTypeAnnotation(typeAnn))\n              : VmUtils.createObjectProperty(\n                  language,\n                  sourceSection,\n                  headerSection,\n                  scope.getName(),\n                  scope.getQualifiedName(),\n                  scope.buildFrameDescriptor(),\n                  modifiers,\n                  bodyNode,\n                  null);\n        });\n  }\n\n  private Pair<ExpressionNode, ObjectMember> doVisitObjectEntry(ObjectEntry entry) {\n    var keyNode = visitExpr(entry.getKey());\n\n    var member =\n        doVisitObjectEntryBody(\n            createSourceSection(entry), keyNode, entry.getValue(), entry.getBodyList());\n    return Pair.of(keyNode, member);\n  }\n\n  private ObjectMember doVisitObjectElement(ObjectElement element) {\n    var isForGeneratorScope = symbolTable.getCurrentScope().isForGeneratorScope();\n    return symbolTable.enterEntry(\n        null,\n        scope -> {\n          var elementNode = visitExpr(element.getExpr());\n\n          var modifier = VmModifier.ELEMENT;\n          var member =\n              new ObjectMember(\n                  createSourceSection(element),\n                  elementNode.getSourceSection(),\n                  modifier,\n                  null,\n                  scope.getQualifiedName());\n\n          if (elementNode instanceof ConstantNode constantNode) {\n            member.initConstantValue(constantNode);\n          } else {\n            if (isForGeneratorScope) {\n              elementNode = new RestoreForBindingsNode(elementNode);\n            }\n            member.initMemberNode(\n                ElementOrEntryNodeGen.create(\n                    language, scope.buildFrameDescriptor(), member, elementNode));\n          }\n\n          return member;\n        });\n  }\n\n  private ObjectMember doVisitObjectMethod(ObjectMethod method) {\n    return doVisitObjectMethod(method, false);\n  }\n\n  private ObjectMember doVisitObjectMethod(ObjectMethod method, boolean isModuleMethod) {\n    return doVisitObjectMethod(\n        method,\n        method.getModifiers(),\n        method.headerSpan(),\n        method.getIdentifier(),\n        method.getParamList(),\n        method.getTypeParameterList(),\n        method.getExpr(),\n        method.getTypeAnnotation(),\n        isModuleMethod);\n  }\n\n  private ObjectMember doVisitObjectMethod(\n      Node method,\n      List<Modifier> modifierNodes,\n      Span headerSpan,\n      Identifier identifier,\n      ParameterList paramList,\n      @Nullable TypeParameterList typeParamList,\n      Expr expr,\n      @Nullable TypeAnnotation typeAnnotation,\n      boolean isModuleMethod) {\n    var modifiers =\n        doVisitModifiers(\n            modifierNodes, VmModifier.VALID_OBJECT_MEMBER_MODIFIERS, \"invalidObjectMemberModifier\");\n\n    if (!VmModifier.isLocal(modifiers)) {\n      throw exceptionBuilder()\n          .evalError(isModuleMethod ? \"moduleMethodMustBeLocal\" : \"objectMethodMustBeLocal\")\n          .withSourceSection(createSourceSection(headerSpan))\n          .build();\n    }\n\n    var methodName = org.pkl.core.runtime.Identifier.method(identifier.getValue(), true);\n\n    var frameDescriptorBuilder = createFrameDescriptorBuilder(paramList);\n\n    return symbolTable.enterMethod(\n        methodName,\n        getConstLevel(modifiers),\n        frameDescriptorBuilder,\n        List.of(),\n        scope -> {\n          if (typeParamList != null) {\n            throw exceptionBuilder()\n                .evalError(\"cannotDeclareTypeParameter\")\n                .withSourceSection(createSourceSection(typeParamList))\n                .build();\n          }\n\n          var member =\n              new ObjectMember(\n                  createSourceSection(method),\n                  createSourceSection(headerSpan),\n                  modifiers,\n                  scope.getName(),\n                  scope.getQualifiedName());\n          var body = visitExpr(expr);\n          var node =\n              new ObjectMethodNode(\n                  language,\n                  scope.buildFrameDescriptor(),\n                  member,\n                  body,\n                  paramList.getParameters().size(),\n                  doVisitParameterTypes(paramList),\n                  visitTypeAnnotation(typeAnnotation));\n\n          member.initMemberNode(node);\n          return member;\n        });\n  }\n\n  private GeneratorObjectLiteralNode doVisitGeneratorObjectBody(\n      ObjectBody body, ExpressionNode parentNode) {\n    var parametersDescriptor = createFrameDescriptorBuilder(body);\n    var parameterTypes = doVisitParameterTypes(body);\n    var memberNodes = doVisitGeneratorMemberNodes(body.getMembers());\n    var currentScope = symbolTable.getCurrentScope();\n    //noinspection ConstantConditions\n    return GeneratorObjectLiteralNodeGen.create(\n        createSourceSection(body.parent()),\n        language,\n        currentScope.getQualifiedName(),\n        currentScope.isCustomThisScope(),\n        parametersDescriptor == null ? null : parametersDescriptor.build(),\n        parameterTypes,\n        memberNodes,\n        parentNode);\n  }\n\n  private GeneratorMemberNode[] doVisitGeneratorMemberNodes(\n      List<? extends org.pkl.parser.syntax.ObjectMember> members) {\n    var result = new GeneratorMemberNode[members.size()];\n    for (var i = 0; i < result.length; i++) {\n      result[i] = visitObjectMember(members.get(i));\n    }\n    return result;\n  }\n\n  private ExpressionNode doVisitPropertyInvocationExpr(QualifiedAccessExpr expr) {\n    var sourceSection = createSourceSection(expr);\n    var propertyName = toIdentifier(expr.getIdentifier().getValue());\n    var receiver = visitExpr(expr.getExpr());\n\n    if (receiver instanceof IntLiteralNode intLiteralNode) {\n      var durationUnit = VmDuration.toUnit(propertyName);\n      if (durationUnit != null) {\n        //noinspection ConstantConditions\n        return new ConstantValueNode(\n            sourceSection, new VmDuration(intLiteralNode.executeInt(null), durationUnit));\n      }\n      var dataSizeUnit = VmDataSize.toUnit(propertyName);\n      if (dataSizeUnit != null) {\n        //noinspection ConstantConditions\n        return new ConstantValueNode(\n            sourceSection, new VmDataSize(intLiteralNode.executeInt(null), dataSizeUnit));\n      }\n    }\n\n    if (receiver instanceof FloatLiteralNode floatLiteralNode) {\n      var durationUnit = VmDuration.toUnit(propertyName);\n      if (durationUnit != null) {\n        //noinspection ConstantConditions\n        return new ConstantValueNode(\n            sourceSection, new VmDuration(floatLiteralNode.executeFloat(null), durationUnit));\n      }\n      var dataSizeUnit = VmDataSize.toUnit(propertyName);\n      if (dataSizeUnit != null) {\n        //noinspection ConstantConditions\n        return new ConstantValueNode(\n            sourceSection, new VmDataSize(floatLiteralNode.executeFloat(null), dataSizeUnit));\n      }\n    }\n\n    var needsConst = needsConst(receiver);\n    if (expr.isNullable()) {\n      return new NullPropagatingOperationNode(\n          sourceSection,\n          ReadPropertyNodeGen.create(\n              sourceSection,\n              propertyName,\n              needsConst,\n              PropagateNullReceiverNodeGen.create(unavailableSourceSection(), receiver)));\n    }\n\n    return ReadPropertyNodeGen.create(sourceSection, propertyName, needsConst, receiver);\n  }\n\n  private ExpressionNode doVisitMethodAccessExpr(QualifiedAccessExpr expr) {\n    var sourceSection = createSourceSection(expr);\n    var functionName = toIdentifier(expr.getIdentifier().getValue());\n    var argCtx = expr.getArgumentList();\n    var receiver = visitExpr(expr.getExpr());\n    var needsConst = needsConst(receiver);\n\n    if (expr.isNullable()) {\n      //noinspection ConstantConditions\n      return new NullPropagatingOperationNode(\n          sourceSection,\n          InvokeMethodVirtualNodeGen.create(\n              sourceSection,\n              functionName,\n              visitArgumentList(argCtx),\n              MemberLookupMode.EXPLICIT_RECEIVER,\n              needsConst,\n              PropagateNullReceiverNodeGen.create(unavailableSourceSection(), receiver),\n              GetClassNodeGen.create(null)));\n    }\n\n    //noinspection ConstantConditions\n    return InvokeMethodVirtualNodeGen.create(\n        sourceSection,\n        functionName,\n        visitArgumentList(argCtx),\n        MemberLookupMode.EXPLICIT_RECEIVER,\n        needsConst,\n        receiver,\n        GetClassNodeGen.create(null));\n  }\n\n  private void addConstantEntries(\n      EconomicMap<Object, ObjectMember> members,\n      List<ExpressionNode> keyNodes,\n      List<ObjectMember> values) {\n\n    for (var i = 0; i < keyNodes.size(); i++) {\n      var key = ((ConstantNode) keyNodes.get(i)).getValue();\n      var value = values.get(i);\n      var previousValue = EconomicMaps.put(members, key, value);\n      if (previousValue != null) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"duplicateDefinition\", new ProgramValue(\"\", key))\n            .withSourceSection(value.getHeaderSection())\n            .build();\n      }\n    }\n  }\n\n  private int doVisitModifiers(\n      List<? extends Modifier> modifiers, int validModifiers, String errorMessage) {\n\n    var result = VmModifier.NONE;\n    for (var ctx : modifiers) {\n      int modifier = visitModifier(ctx);\n      if ((modifier & validModifiers) == 0) {\n        throw exceptionBuilder()\n            .evalError(errorMessage, ctx.getValue().name().toLowerCase())\n            .withSourceSection(createSourceSection(ctx))\n            .build();\n      }\n      result += modifier;\n    }\n\n    // flag modifier combinations that are never valid right away\n\n    if (VmModifier.isExternal(result) && !ModuleKeys.isStdLibModule(moduleKey)) {\n      throw exceptionBuilder()\n          .evalError(\"cannotDefineExternalMember\")\n          .withSourceSection(createSourceSection(modifiers, ModifierValue.EXTERNAL))\n          .build();\n    }\n\n    if (VmModifier.isLocal(result) && VmModifier.isHidden(result)) {\n      throw exceptionBuilder()\n          .evalError(\"redundantHiddenModifier\")\n          .withSourceSection(createSourceSection(modifiers, ModifierValue.HIDDEN))\n          .build();\n    }\n\n    if (VmModifier.isLocal(result) && VmModifier.isFixed(result)) {\n      throw exceptionBuilder()\n          .evalError(\"redundantFixedModifier\")\n          .withSourceSection(createSourceSection(modifiers, ModifierValue.FIXED))\n          .build();\n    }\n\n    if (VmModifier.isAbstract(result) && VmModifier.isOpen(result)) {\n      throw exceptionBuilder()\n          .evalError(\"redundantOpenModifier\")\n          .withSourceSection(createSourceSection(modifiers, ModifierValue.OPEN))\n          .build();\n    }\n\n    return result;\n  }\n\n  private UnresolvedTypeNode[] doVisitParameterTypes(ObjectBody body) {\n    return doVisitParameterTypes(body.getParameters());\n  }\n\n  private UnresolvedTypeNode[] doVisitParameterTypes(ParameterList paramList) {\n    return doVisitParameterTypes(paramList.getParameters());\n  }\n\n  private UnresolvedTypeNode[] doVisitParameterTypes(List<Parameter> params) {\n    var typeNodes = new UnresolvedTypeNode[params.size()];\n    for (int i = 0; i < typeNodes.length; i++) {\n      if (params.get(i) instanceof TypedIdentifier typedIdentifier) {\n        typeNodes[i] = visitTypeAnnotation(typedIdentifier.getTypeAnnotation());\n      } else {\n        typeNodes[i] = null;\n      }\n    }\n    return typeNodes;\n  }\n\n  // TODO: use Set<String> and checkDuplicateMember() to find duplicates between local and non-local\n  //       properties\n  private void addProperty(EconomicMap<Object, ObjectMember> objectMembers, ObjectMember property) {\n    if (EconomicMaps.put(objectMembers, property.getName(), property) != null) {\n      throw exceptionBuilder()\n          .evalError(\"duplicateDefinition\", property.getName())\n          .withSourceSection(property.getHeaderSection())\n          .build();\n    }\n  }\n\n  private ObjectMember doVisitObjectEntryBody(\n      SourceSection sourceSection,\n      ExpressionNode keyNode,\n      @Nullable Expr valueCtx,\n      @Nullable List<? extends ObjectBody> objectBodyCtxs) {\n    var isForGeneratorScope = symbolTable.getCurrentScope().isForGeneratorScope();\n    return symbolTable.enterEntry(\n        keyNode,\n        scope -> {\n          var modifier = VmModifier.ENTRY;\n          var member =\n              new ObjectMember(\n                  sourceSection,\n                  keyNode.getSourceSection(),\n                  modifier,\n                  null,\n                  scope.getQualifiedName());\n          if (valueCtx != null) { // [\"key\"] = value\n            var valueNode = visitExpr(valueCtx);\n            if (valueNode instanceof ConstantNode constantNode) {\n              member.initConstantValue(constantNode);\n            } else {\n              if (isForGeneratorScope) {\n                valueNode = new RestoreForBindingsNode(valueNode);\n              }\n              member.initMemberNode(\n                  ElementOrEntryNodeGen.create(\n                      language, scope.buildFrameDescriptor(), member, valueNode));\n            }\n          } else { // [\"key\"] { ... }\n            assert objectBodyCtxs != null;\n            var objectBody =\n                doVisitObjectBody(\n                    objectBodyCtxs,\n                    new ReadSuperEntryNode(unavailableSourceSection(), new GetMemberKeyNode()));\n            if (isForGeneratorScope) {\n              objectBody = new RestoreForBindingsNode(objectBody);\n            }\n            member.initMemberNode(\n                ElementOrEntryNodeGen.create(\n                    language, scope.buildFrameDescriptor(), member, objectBody));\n          }\n\n          return member;\n        });\n  }\n\n  private boolean needsConst(ExpressionNode receiver) {\n    var scope = symbolTable.getCurrentScope();\n    var constLevel = scope.getConstLevel();\n    var needsConst = false;\n    if (receiver instanceof OuterNode) {\n      var outerScope = getParentLexicalScope();\n      if (outerScope != null) {\n        needsConst =\n            switch (constLevel) {\n              case MODULE -> outerScope.isModuleScope();\n              case ALL -> outerScope.getConstLevel() != ConstLevel.ALL;\n              case NONE -> false;\n            };\n      }\n    } else if (receiver instanceof GetModuleNode) {\n      needsConst = constLevel != ConstLevel.NONE;\n    } else if (receiver instanceof ThisNode) {\n      var constDepth = scope.getConstDepth();\n      needsConst = constLevel == ConstLevel.ALL && constDepth == -1;\n    }\n    return needsConst;\n  }\n\n  private FrameDescriptor.Builder createFrameDescriptorBuilder(ParameterList params) {\n    var builder = FrameDescriptor.newBuilder(params.getParameters().size());\n    for (var param : params.getParameters()) {\n      org.pkl.core.runtime.Identifier identifier = null;\n      if (param instanceof TypedIdentifier typedIdentifier) {\n        identifier = toIdentifier(typedIdentifier.getIdentifier().getValue());\n      }\n      builder.addSlot(FrameSlotKind.Illegal, identifier, null);\n    }\n    return builder;\n  }\n\n  private @Nullable FrameDescriptor.Builder createFrameDescriptorBuilder(ObjectBody body) {\n    if (body.getParameters().isEmpty()) return null;\n\n    var builder = FrameDescriptor.newBuilder(body.getParameters().size());\n    for (var param : body.getParameters()) {\n      org.pkl.core.runtime.Identifier identifier = null;\n      if (param instanceof TypedIdentifier typedIdentifier) {\n        identifier = toIdentifier(typedIdentifier.getIdentifier().getValue());\n      }\n      builder.addSlot(FrameSlotKind.Illegal, identifier, null);\n    }\n    return builder;\n  }\n\n  private void checkNotInsideForGenerator(Node ctx, String errorMessageKey) {\n    if (!symbolTable.getCurrentScope().isForGeneratorScope()) {\n      return;\n    }\n    var forExprCtx = ctx.parent();\n    while (forExprCtx != null\n        && forExprCtx.getClass() != org.pkl.parser.syntax.ObjectMember.ForGenerator.class) {\n      forExprCtx = forExprCtx.parent();\n    }\n    assert forExprCtx != null;\n    throw exceptionBuilder()\n        .evalError(errorMessageKey)\n        .withSourceSection(\n            createSourceSection(\n                ((org.pkl.parser.syntax.ObjectMember.ForGenerator) forExprCtx).forSpan()))\n        .build();\n  }\n\n  private void checkDuplicateMember(\n      org.pkl.core.runtime.Identifier memberName,\n      SourceSection headerSection,\n      // use Set<String> rather than Set<Identifier>\n      // to detect conflicts between local and non-local identifiers\n      Set<String> visited) {\n\n    if (!visited.add(memberName.toString())) {\n      throw exceptionBuilder()\n          .evalError(\"duplicateDefinition\", memberName)\n          .withSourceSection(headerSection)\n          .build();\n    }\n  }\n\n  protected VmExceptionBuilder exceptionBuilder() {\n    return new VmExceptionBuilder()\n        .withMemberName(symbolTable.getCurrentScope().getQualifiedName());\n  }\n\n  private @Nullable SymbolTable.Scope getParentLexicalScope() {\n    var parent = symbolTable.getCurrentScope().getLexicalScope().getParent();\n    if (parent != null) return parent.getLexicalScope();\n    return null;\n  }\n\n  private org.pkl.core.runtime.Identifier toIdentifier(String text) {\n    return org.pkl.core.runtime.Identifier.get(text);\n  }\n\n  private ExpressionNode createResolveVariableNode(\n      SourceSection section, org.pkl.core.runtime.Identifier propertyName) {\n    var scope = symbolTable.getCurrentScope();\n    return new ResolveVariableNode(\n        section,\n        propertyName,\n        isBaseModule,\n        scope.isCustomThisScope(),\n        scope.getConstLevel(),\n        scope.getConstDepth());\n  }\n\n  private URI resolveImport(String importUri, StringConstant ctx) {\n    URI parsedUri;\n    try {\n      parsedUri = IoUtils.toUri(importUri);\n    } catch (URISyntaxException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidModuleUri\", importUri)\n          .withHint(e.getReason())\n          .withSourceSection(createSourceSection(ctx))\n          .build();\n    }\n    URI resolvedUri;\n    var context = VmContext.get(null);\n    try {\n      resolvedUri = IoUtils.resolve(context.getSecurityManager(), moduleKey, parsedUri);\n    } catch (FileNotFoundException e) {\n\n      var exceptionBuilder =\n          exceptionBuilder()\n              .evalError(\"cannotFindModule\", importUri)\n              .withSourceSection(createSourceSection(ctx));\n      var path = parsedUri.getPath();\n      if (path != null && path.contains(\"\\\\\")) {\n        exceptionBuilder.withHint(\n            \"To resolve modules in nested directories, use `/` as the directory separator.\");\n      }\n      throw exceptionBuilder.build();\n    } catch (URISyntaxException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidModuleUri\", importUri)\n          .withHint(e.getReason())\n          .withSourceSection(createSourceSection(ctx))\n          .build();\n    } catch (IOException e) {\n      throw exceptionBuilder()\n          .evalError(\"ioErrorLoadingModule\", importUri)\n          .withCause(e)\n          .withSourceSection(createSourceSection(ctx))\n          .build();\n    } catch (SecurityManagerException | PackageLoadError e) {\n      throw exceptionBuilder().withSourceSection(createSourceSection(ctx)).withCause(e).build();\n    } catch (VmException e) {\n      throw exceptionBuilder()\n          .evalError(e.getMessage(), e.getMessageArguments())\n          .withCause(e.getCause())\n          .withHintBuilder(e.getHintBuilder())\n          .withSourceSection(createSourceSection(ctx))\n          .build();\n    } catch (ExternalReaderProcessException e) {\n      throw exceptionBuilder()\n          .evalError(\"externalReaderFailure\")\n          .withCause(e.getCause())\n          .withSourceSection(createSourceSection(ctx))\n          .build();\n    }\n\n    if (!resolvedUri.isAbsolute()) {\n      throw exceptionBuilder()\n          .evalError(\"cannotHaveRelativeImport\", moduleKey.getUri())\n          .withSourceSection(createSourceSection(ctx))\n          .build();\n    }\n    return resolvedUri;\n  }\n\n  private ConstLevel getConstLevel(int modifiers) {\n    if (VmModifier.isConst(modifiers)) return ConstLevel.ALL;\n    return symbolTable.getCurrentScope().getConstLevel();\n  }\n\n  private VmException missingLocalPropertyValue(TypeAnnotation typeAnn) {\n    var stop = typeAnn.span().stopIndex();\n    return exceptionBuilder()\n        .evalError(\"missingLocalPropertyValue\")\n        .withSourceSection(source.createSection(stop + 1, 0))\n        .build();\n  }\n\n  private static SourceSection unavailableSourceSection() {\n    return VmUtils.unavailableSourceSection();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/CannotInvokeAbstractFunctionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\n\npublic final class CannotInvokeAbstractFunctionNode extends ExpressionNode {\n  private final String functionName;\n\n  public CannotInvokeAbstractFunctionNode(SourceSection section, String functionName) {\n    super(section);\n    this.functionName = functionName;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"cannotInvokeAbstractMethod\", functionName).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/CannotInvokeAbstractPropertyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\n\npublic final class CannotInvokeAbstractPropertyNode extends ExpressionNode {\n  private final String propertyName;\n\n  public CannotInvokeAbstractPropertyNode(SourceSection section, String propertyName) {\n    super(section);\n    this.propertyName = propertyName;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"cannotInvokeAbstractProperty\", propertyName).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/ConstLevel.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\npublic enum ConstLevel {\n  NONE,\n  MODULE,\n  ALL;\n\n  public boolean isConst() {\n    return this != NONE;\n  }\n\n  public boolean biggerOrEquals(ConstLevel other) {\n    return this.ordinal() >= other.ordinal();\n  }\n\n  public boolean bigger(ConstLevel other) {\n    return this.ordinal() > other.ordinal();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/ImportsAndReadsParser.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\nimport com.oracle.truffle.api.source.Source;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport org.pkl.core.ast.builder.ImportsAndReadsParser.Entry;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.Parser;\nimport org.pkl.parser.ParserError;\nimport org.pkl.parser.syntax.Expr;\nimport org.pkl.parser.syntax.Expr.ImportExpr;\nimport org.pkl.parser.syntax.Expr.ReadExpr;\nimport org.pkl.parser.syntax.Expr.ReadType;\nimport org.pkl.parser.syntax.Expr.SingleLineStringLiteralExpr;\nimport org.pkl.parser.syntax.ExtendsOrAmendsClause;\nimport org.pkl.parser.syntax.ExtendsOrAmendsClause.Type;\nimport org.pkl.parser.syntax.ImportClause;\nimport org.pkl.parser.syntax.StringPart.StringChars;\n\n/**\n * Collects module uris and resource uris imported within a module.\n *\n * <p>Gathers the following:\n *\n * <ul>\n *   <li>amends/extends URI's\n *   <li>import declarations\n *   <li>import expressions\n *   <li>read expressions\n * </ul>\n */\npublic class ImportsAndReadsParser extends AbstractAstBuilder<@Nullable List<Entry>> {\n\n  public record Entry(\n      boolean isModule,\n      boolean isGlob,\n      boolean isExtends,\n      boolean isAmends,\n      String stringValue,\n      SourceSection sourceSection) {}\n\n  /** Parses a module, and collects all imports and reads. */\n  public static List<Entry> parse(ModuleKey moduleKey, ResolvedModuleKey resolvedModuleKey)\n      throws IOException {\n    var parser = new Parser();\n    var text = resolvedModuleKey.loadSource();\n    var source = VmUtils.createSource(moduleKey, text);\n    var importListParser = new ImportsAndReadsParser(source);\n    try {\n      return parser.parseModule(text).accept(importListParser);\n    } catch (ParserError e) {\n      var moduleName = IoUtils.inferModuleName(moduleKey);\n      throw VmUtils.toVmException(e, source, moduleName);\n    }\n  }\n\n  public ImportsAndReadsParser(Source source) {\n    super(source);\n  }\n\n  @Override\n  protected VmExceptionBuilder exceptionBuilder() {\n    return new VmExceptionBuilder();\n  }\n\n  @Override\n  public @Nullable List<Entry> visitExtendsOrAmendsClause(ExtendsOrAmendsClause decl) {\n    var importStr = decl.getUrl().getString();\n    var sourceSection = createSourceSection(decl.getUrl());\n    return Collections.singletonList(\n        new Entry(\n            true,\n            false,\n            decl.getType() == Type.EXTENDS,\n            decl.getType() == Type.AMENDS,\n            importStr,\n            sourceSection));\n  }\n\n  @Override\n  public List<Entry> visitImportClause(ImportClause imp) {\n    var importStr = imp.getImportStr().getString();\n    var sourceSection = createSourceSection(imp.getImportStr());\n    return Collections.singletonList(\n        new Entry(true, imp.isGlob(), false, false, importStr, sourceSection));\n  }\n\n  @Override\n  public List<Entry> visitImportExpr(ImportExpr expr) {\n    var importStr = expr.getImportStr().getString();\n    var sourceSection = createSourceSection(expr.getImportStr());\n    return Collections.singletonList(\n        new Entry(true, expr.isGlob(), false, false, importStr, sourceSection));\n  }\n\n  @Override\n  public @Nullable List<Entry> visitReadExpr(ReadExpr expr) {\n    return doVisitReadExpr(expr.getExpr(), expr.getReadType() == ReadType.GLOB);\n  }\n\n  public List<Entry> doVisitReadExpr(Expr expr, boolean isGlob) {\n    if (!(expr instanceof SingleLineStringLiteralExpr slStr)) {\n      return Collections.emptyList();\n    }\n    // best-effort approach; only collect read expressions that are string constants.\n    String importString;\n    var singleParts = slStr.getParts();\n    if (singleParts.isEmpty()) {\n      importString = \"\";\n    } else if (singleParts.size() == 1 && singleParts.get(0) instanceof StringChars cparts) {\n      importString = cparts.getString();\n    } else {\n      return Collections.emptyList();\n    }\n\n    return Collections.singletonList(\n        new Entry(false, isGlob, false, false, importString, createSourceSection(slStr)));\n  }\n\n  @Override\n  protected @Nullable List<Entry> aggregateResult(\n      @Nullable List<Entry> aggregate, @Nullable List<Entry> nextResult) {\n    if (aggregate == null || aggregate.isEmpty()) {\n      return nextResult;\n    }\n    if (nextResult == null || nextResult.isEmpty()) {\n      return aggregate;\n    }\n    var ret = new ArrayList<Entry>(aggregate.size() + nextResult.size());\n    ret.addAll(aggregate);\n    ret.addAll(nextResult);\n    return ret;\n  }\n\n  @Override\n  protected List<Entry> defaultValue() {\n    return List.of();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/SymbolTable.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.FrameDescriptor.Builder;\nimport java.util.*;\nimport java.util.function.Function;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.expression.generator.GeneratorMemberNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.ModuleInfo;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.Lexer;\n\npublic final class SymbolTable {\n  private Scope currentScope;\n\n  public SymbolTable(ModuleInfo moduleInfo) {\n    currentScope = new ModuleScope(moduleInfo);\n  }\n\n  public Scope getCurrentScope() {\n    return currentScope;\n  }\n\n  public @Nullable TypeParameter findTypeParameter(String name) {\n    TypeParameter result;\n    for (var scope = currentScope; scope != null; scope = scope.getParent()) {\n      result = scope.getTypeParameter(name);\n      if (result != null) return result;\n    }\n    return null;\n  }\n\n  public ObjectMember enterClass(\n      Identifier name,\n      List<TypeParameter> typeParameters,\n      Function<ClassScope, ObjectMember> nodeFactory) {\n    return doEnter(\n        new ClassScope(\n            currentScope,\n            name,\n            toQualifiedName(name),\n            FrameDescriptor.newBuilder(),\n            typeParameters),\n        nodeFactory);\n  }\n\n  public ObjectMember enterTypeAlias(\n      Identifier name,\n      List<TypeParameter> typeParameters,\n      Function<TypeAliasScope, ObjectMember> nodeFactory) {\n    return doEnter(\n        new TypeAliasScope(\n            currentScope,\n            name,\n            toQualifiedName(name),\n            FrameDescriptor.newBuilder(),\n            typeParameters),\n        nodeFactory);\n  }\n\n  public <T> T enterMethod(\n      Identifier name,\n      ConstLevel constLevel,\n      Builder frameDescriptorBuilder,\n      List<TypeParameter> typeParameters,\n      Function<MethodScope, T> nodeFactory) {\n    return doEnter(\n        new MethodScope(\n            currentScope,\n            name,\n            toQualifiedName(name),\n            constLevel,\n            frameDescriptorBuilder,\n            typeParameters),\n        nodeFactory);\n  }\n\n  public <T> T enterForGenerator(\n      FrameDescriptor.Builder frameDescriptorBuilder,\n      FrameDescriptor.Builder memberDescriptorBuilder,\n      Function<ForGeneratorScope, T> nodeFactory) {\n    return doEnter(\n        new ForGeneratorScope(\n            currentScope,\n            currentScope.qualifiedName,\n            frameDescriptorBuilder,\n            memberDescriptorBuilder),\n        nodeFactory);\n  }\n\n  public <T> T enterLambda(\n      FrameDescriptor.Builder frameDescriptorBuilder, Function<LambdaScope, T> nodeFactory) {\n\n    // flatten names of lambdas nested inside other lambdas for presentation purposes\n    var parentScope = currentScope;\n    while (parentScope instanceof LambdaScope) {\n      parentScope = parentScope.getParent();\n    }\n\n    assert parentScope != null;\n    var qualifiedName = parentScope.qualifiedName + \".\" + parentScope.getNextLambdaName();\n\n    return doEnter(\n        new LambdaScope(currentScope, qualifiedName, frameDescriptorBuilder), nodeFactory);\n  }\n\n  public <T> T enterProperty(\n      Identifier name, ConstLevel constLevel, Function<PropertyScope, T> nodeFactory) {\n    return doEnter(\n        new PropertyScope(\n            currentScope, name, toQualifiedName(name), constLevel, FrameDescriptor.newBuilder()),\n        nodeFactory);\n  }\n\n  public <T> T enterEntry(\n      @Nullable ExpressionNode keyNode, // null for listing elements\n      Function<EntryScope, T> nodeFactory) {\n\n    var qualifiedName = currentScope.getQualifiedName() + currentScope.getNextEntryName(keyNode);\n    var builder =\n        currentScope instanceof ForGeneratorScope forScope\n            ? forScope.memberDescriptorBuilder\n            : FrameDescriptor.newBuilder();\n    return doEnter(new EntryScope(currentScope, qualifiedName, builder), nodeFactory);\n  }\n\n  public <T> T enterCustomThisScope(Function<CustomThisScope, T> nodeFactory) {\n    return doEnter(\n        new CustomThisScope(currentScope, currentScope.frameDescriptorBuilder), nodeFactory);\n  }\n\n  public <T> T enterAnnotationScope(Function<AnnotationScope, T> nodeFactory) {\n    return doEnter(\n        new AnnotationScope(currentScope, currentScope.frameDescriptorBuilder), nodeFactory);\n  }\n\n  public <T> T enterObjectScope(Function<ObjectScope, T> nodeFactory) {\n    return doEnter(new ObjectScope(currentScope, currentScope.frameDescriptorBuilder), nodeFactory);\n  }\n\n  private <T, S extends Scope> T doEnter(S scope, Function<S, T> nodeFactory) {\n    var parentScope = currentScope;\n    currentScope = scope;\n    try {\n      return nodeFactory.apply(scope);\n    } finally {\n      currentScope = parentScope;\n    }\n  }\n\n  private String toQualifiedName(Identifier name) {\n    var separator = currentScope instanceof ModuleScope ? \"#\" : \".\";\n    return currentScope.qualifiedName + separator + Lexer.maybeQuoteIdentifier(name.toString());\n  }\n\n  public abstract static class Scope {\n    private final @Nullable Scope parent;\n    private final @Nullable Identifier name;\n    private final String qualifiedName;\n    private int lambdaCount = 0;\n    private int entryCount = 0;\n    private final FrameDescriptor.Builder frameDescriptorBuilder;\n    private final ConstLevel constLevel;\n\n    private Scope(\n        @Nullable Scope parent,\n        @Nullable Identifier name,\n        String qualifiedName,\n        ConstLevel constLevel,\n        FrameDescriptor.Builder frameDescriptorBuilder) {\n      this.parent = parent;\n      this.name = name;\n      this.qualifiedName = qualifiedName;\n      this.frameDescriptorBuilder = frameDescriptorBuilder;\n      // const level can never decrease\n      this.constLevel =\n          parent != null && parent.constLevel.biggerOrEquals(constLevel)\n              ? parent.constLevel\n              : constLevel;\n    }\n\n    public final @Nullable Scope getParent() {\n      return parent;\n    }\n\n    public final Identifier getName() {\n      assert name != null;\n      return name;\n    }\n\n    public final @Nullable Identifier getNameOrNull() {\n      return name;\n    }\n\n    public final String getQualifiedName() {\n      return qualifiedName;\n    }\n\n    public FrameDescriptor buildFrameDescriptor() {\n      return frameDescriptorBuilder.build();\n    }\n\n    /**\n     * Returns a new descriptor builder that contains the same slots as the current scope's frame\n     * descriptor.\n     */\n    public FrameDescriptor.Builder newFrameDescriptorBuilder() {\n      return newFrameDescriptorBuilder(buildFrameDescriptor());\n    }\n\n    /** Returns a new descriptor builder for a {@link GeneratorMemberNode} in the current scope. */\n    public FrameDescriptor.Builder newForGeneratorMemberDescriptorBuilder() {\n      return this instanceof ForGeneratorScope forScope\n          ? newFrameDescriptorBuilder(forScope.buildMemberDescriptor())\n          : FrameDescriptor.newBuilder();\n    }\n\n    private static FrameDescriptor.Builder newFrameDescriptorBuilder(FrameDescriptor descriptor) {\n      var builder = FrameDescriptor.newBuilder();\n      for (var i = 0; i < descriptor.getNumberOfSlots(); i++) {\n        builder.addSlot(\n            descriptor.getSlotKind(i), descriptor.getSlotName(i), descriptor.getSlotInfo(i));\n      }\n      return builder;\n    }\n\n    public @Nullable TypeParameter getTypeParameter(String name) {\n      return null;\n    }\n\n    public final Scope getLexicalScope() {\n      var scope = this;\n      while (!scope.isLexicalScope()) {\n        scope = scope.parent;\n        assert scope != null;\n      }\n      return scope;\n    }\n\n    /**\n     * Returns the lexical depth from the current scope to the top-most scope that is const. Depth\n     * is 0-indexed, and -1 means that the scope is not a const scope.\n     *\n     * <p>A const scope is a lexical scope on the right-hand side of a const property.\n     *\n     * <pre>{@code\n     * const foo = new {\n     *   bar {\n     *     baz // <-- depth == 1\n     *   }\n     * }\n     * }</pre>\n     */\n    public int getConstDepth() {\n      var depth = -1;\n      var lexicalScope = getLexicalScope();\n      while (lexicalScope.getConstLevel() == ConstLevel.ALL) {\n        depth += 1;\n        var parent = lexicalScope.getParent();\n        if (parent == null) {\n          return depth;\n        }\n        lexicalScope = parent.getLexicalScope();\n      }\n      return depth;\n    }\n\n    private String getNextLambdaName() {\n      return \"<function#\" + (++skipLambdaScopes().lambdaCount) + \">\";\n    }\n\n    protected String getNextEntryName(@Nullable ExpressionNode keyNode) {\n      if (keyNode instanceof ConstantNode constantNode) {\n        var value = constantNode.getValue();\n        if (value instanceof String) {\n          return \"[\\\"\" + value + \"\\\"]\";\n        }\n\n        if (value instanceof Long\n            || value instanceof Double\n            || value instanceof Boolean\n            || value instanceof VmDuration\n            || value instanceof VmDataSize) {\n          return \"[\" + value + \"]\";\n        }\n      }\n\n      return \"[#\" + (++entryCount) + \"]\";\n    }\n\n    public final Scope skipLambdaScopes() {\n      var curr = this;\n      while (curr.isLambdaScope()) {\n        curr = curr.getParent();\n        assert curr != null : \"Lambda scope always has a parent\";\n      }\n      return curr;\n    }\n\n    public final boolean isModuleScope() {\n      return this instanceof ModuleScope;\n    }\n\n    public final boolean isClassScope() {\n      return this instanceof ClassScope;\n    }\n\n    public final boolean isClassMemberScope() {\n      var effectiveScope = skipLambdaScopes();\n      var parent = effectiveScope.parent;\n      if (parent == null) return false;\n\n      return parent.isClassScope()\n          || parent.isModuleScope() && !((ModuleScope) parent).moduleInfo.isAmend();\n    }\n\n    public final boolean isLambdaScope() {\n      return this instanceof LambdaScope;\n    }\n\n    public final boolean isCustomThisScope() {\n      return this instanceof CustomThisScope;\n    }\n\n    public final boolean isLexicalScope() {\n      return this instanceof LexicalScope;\n    }\n\n    public final boolean isForGeneratorScope() {\n      return this instanceof ForGeneratorScope;\n    }\n\n    public ConstLevel getConstLevel() {\n      return constLevel;\n    }\n  }\n\n  private interface LexicalScope {}\n\n  public static class ObjectScope extends Scope implements LexicalScope {\n    private ObjectScope(Scope parent, Builder frameDescriptorBuilder) {\n      super(\n          parent,\n          parent.getNameOrNull(),\n          parent.getQualifiedName(),\n          ConstLevel.NONE,\n          frameDescriptorBuilder);\n    }\n  }\n\n  public abstract static class TypeParameterizableScope extends Scope {\n    private final List<TypeParameter> typeParameters;\n\n    public TypeParameterizableScope(\n        Scope parent,\n        Identifier name,\n        String qualifiedName,\n        ConstLevel constLevel,\n        Builder frameDescriptorBuilder,\n        List<TypeParameter> typeParameters) {\n      super(parent, name, qualifiedName, constLevel, frameDescriptorBuilder);\n      this.typeParameters = typeParameters;\n    }\n\n    @Override\n    public @Nullable TypeParameter getTypeParameter(String name) {\n      for (var param : typeParameters) {\n        if (name.equals(param.getName())) return param;\n      }\n      return null;\n    }\n  }\n\n  public static final class ModuleScope extends Scope implements LexicalScope {\n    private final ModuleInfo moduleInfo;\n\n    public ModuleScope(ModuleInfo moduleInfo) {\n      super(null, null, moduleInfo.getModuleName(), ConstLevel.NONE, FrameDescriptor.newBuilder());\n      this.moduleInfo = moduleInfo;\n    }\n  }\n\n  public static final class MethodScope extends TypeParameterizableScope {\n    public MethodScope(\n        Scope parent,\n        Identifier name,\n        String qualifiedName,\n        ConstLevel constLevel,\n        Builder frameDescriptorBuilder,\n        List<TypeParameter> typeParameters) {\n      super(parent, name, qualifiedName, constLevel, frameDescriptorBuilder, typeParameters);\n    }\n  }\n\n  public static final class LambdaScope extends Scope implements LexicalScope {\n    public LambdaScope(\n        Scope parent, String qualifiedName, FrameDescriptor.Builder frameDescriptorBuilder) {\n      super(parent, null, qualifiedName, ConstLevel.NONE, frameDescriptorBuilder);\n    }\n  }\n\n  public static final class ForGeneratorScope extends Scope implements LexicalScope {\n    private final FrameDescriptor.Builder memberDescriptorBuilder;\n\n    public ForGeneratorScope(\n        Scope parent,\n        String qualifiedName,\n        FrameDescriptor.Builder frameDescriptorBuilder,\n        FrameDescriptor.Builder memberDescriptorBuilder) {\n      super(parent, null, qualifiedName, ConstLevel.NONE, frameDescriptorBuilder);\n      this.memberDescriptorBuilder = memberDescriptorBuilder;\n    }\n\n    public FrameDescriptor buildMemberDescriptor() {\n      return memberDescriptorBuilder.build();\n    }\n\n    @Override\n    protected String getNextEntryName(@Nullable ExpressionNode keyNode) {\n      var parent = getParent();\n      assert parent != null;\n      return parent.getNextEntryName(keyNode);\n    }\n  }\n\n  public static final class PropertyScope extends Scope {\n    public PropertyScope(\n        Scope parent,\n        Identifier name,\n        String qualifiedName,\n        ConstLevel constLevel,\n        FrameDescriptor.Builder frameDescriptorBuilder) {\n      super(parent, name, qualifiedName, constLevel, frameDescriptorBuilder);\n    }\n  }\n\n  public static final class EntryScope extends Scope {\n    public EntryScope(\n        Scope parent, String qualifiedName, FrameDescriptor.Builder frameDescriptorBuilder) {\n      super(parent, null, qualifiedName, ConstLevel.NONE, frameDescriptorBuilder);\n    }\n  }\n\n  public static final class ClassScope extends TypeParameterizableScope implements LexicalScope {\n    public ClassScope(\n        Scope parent,\n        Identifier name,\n        String qualifiedName,\n        Builder frameDescriptorBuilder,\n        List<TypeParameter> typeParameters) {\n      super(parent, name, qualifiedName, ConstLevel.MODULE, frameDescriptorBuilder, typeParameters);\n    }\n  }\n\n  public static final class TypeAliasScope extends TypeParameterizableScope {\n    public TypeAliasScope(\n        Scope parent,\n        Identifier name,\n        String qualifiedName,\n        FrameDescriptor.Builder frameDescriptorBuilder,\n        List<TypeParameter> typeParameters) {\n      super(parent, name, qualifiedName, ConstLevel.MODULE, frameDescriptorBuilder, typeParameters);\n    }\n  }\n\n  /**\n   * A scope where {@code this} has a special meaning (type constraint, object member predicate).\n   *\n   * <p>Technically, a scope where {@code this} isn't {@code frame.getArguments()[0]}, but the value\n   * at an auxiliary slot identified by {@link CustomThisScope#FRAME_SLOT_ID}.\n   */\n  public static final class CustomThisScope extends Scope {\n    public static final Object FRAME_SLOT_ID =\n        new Object() {\n          @Override\n          public String toString() {\n            return \"customThisSlot\";\n          }\n        };\n\n    public CustomThisScope(Scope parent, FrameDescriptor.Builder frameDescriptorBuilder) {\n      super(\n          parent,\n          parent.getNameOrNull(),\n          parent.getQualifiedName(),\n          ConstLevel.NONE,\n          frameDescriptorBuilder);\n    }\n  }\n\n  public static final class AnnotationScope extends Scope implements LexicalScope {\n    public AnnotationScope(Scope parent, FrameDescriptor.Builder frameDescriptorBuilder) {\n      super(\n          parent,\n          parent.getNameOrNull(),\n          parent.getQualifiedName(),\n          ConstLevel.MODULE,\n          frameDescriptorBuilder);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/builder/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.builder;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/AdditionNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\n@NodeInfo(shortName = \"+\")\npublic abstract class AdditionNode extends BinaryExpressionNode {\n  protected AdditionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected String eval(String left, String right) {\n    return left + right;\n  }\n\n  @Specialization\n  protected long eval(long left, long right) {\n    try {\n      return StrictMath.addExact(left, right);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"integerOverflow\").build();\n    }\n  }\n\n  @Specialization\n  protected double eval(long left, double right) {\n    return left + right;\n  }\n\n  @Specialization\n  protected double eval(double left, long right) {\n    return left + right;\n  }\n\n  @Specialization\n  protected double eval(double left, double right) {\n    return left + right;\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, VmDuration right) {\n    return left.add(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, VmDataSize right) {\n    return left.add(right);\n  }\n\n  @Specialization\n  protected VmCollection eval(VmCollection left, VmCollection right) {\n    return left.concatenate(right);\n  }\n\n  @Specialization\n  protected VmMap eval(VmMap left, VmMap right) {\n    return left.concatenate(right);\n  }\n\n  @Specialization\n  protected VmBytes eval(VmBytes left, VmBytes right) {\n    return left.concatenate(right);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/BinaryExpressionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"leftNode\", type = ExpressionNode.class)\n@NodeChild(value = \"rightNode\", type = ExpressionNode.class)\npublic abstract class BinaryExpressionNode extends ExpressionNode {\n  protected BinaryExpressionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  protected abstract ExpressionNode getLeftNode();\n\n  protected abstract ExpressionNode getRightNode();\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(Object left, Object right) {\n    throw exceptionBuilder()\n        .evalError(\n            \"operatorNotDefined2\", getShortName(), VmUtils.getClass(left), VmUtils.getClass(right))\n        .withProgramValue(\"Left operand\", left)\n        .withProgramValue(\"Right operand\", right)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/ComparatorNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\n\npublic abstract class ComparatorNode extends BinaryExpressionNode {\n  protected ComparatorNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  public abstract boolean executeWith(VirtualFrame frame, Object left, Object right);\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/DivisionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\n@NodeInfo(shortName = \"/\")\npublic abstract class DivisionNode extends BinaryExpressionNode {\n  protected DivisionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected double eval(long left, long right) {\n    return (double) left / (double) right;\n  }\n\n  @Specialization\n  protected double eval(long left, double right) {\n    return (double) left / right;\n  }\n\n  @Specialization\n  protected double eval(double left, long right) {\n    return left / right;\n  }\n\n  @Specialization\n  protected double eval(double left, double right) {\n    return left / right;\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, long right) {\n    return left.divide(right);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, double right) {\n    return left.divide(right);\n  }\n\n  @Specialization\n  protected double eval(VmDuration left, VmDuration right) {\n    return left.divide(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, long right) {\n    return left.divide(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, double right) {\n    return left.divide(right);\n  }\n\n  @Specialization\n  protected double eval(VmDataSize left, VmDataSize right) {\n    return left.divide(right);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/EqualNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n@NodeInfo(shortName = \"==\")\n@NodeChild(value = \"leftNode\", type = ExpressionNode.class)\n@NodeChild(value = \"rightNode\", type = ExpressionNode.class)\n// not extending BinaryExpressionNode because we don't want the latter's fallback\npublic abstract class EqualNode extends ExpressionNode {\n  protected EqualNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected boolean eval(String left, String right) {\n    return left.equals(right);\n  }\n\n  @Specialization\n  protected boolean eval(long left, long right) {\n    return left == right;\n  }\n\n  @Specialization\n  protected boolean eval(long left, double right) {\n    return left == right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, long right) {\n    return left == right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, double right) {\n    return left == right;\n  }\n\n  @Specialization\n  protected boolean eval(boolean left, boolean right) {\n    return left == right;\n  }\n\n  /**\n   * This method effectively covers `VmValue left, VmValue right` but is implemented in a <a\n   * href=\"https://www.graalvm.org/22.0/graalvm-as-a-platform/language-implementation-framework/TruffleLibraries/#strategy-2-java-interfaces\">more\n   * efficient way</a>.\n   */\n  @Specialization(\n      guards = {\"left.getClass() == leftJavaClass\", \"right.getClass() == leftJavaClass\"},\n      limit = \"99\")\n  protected boolean eval(\n      Object left,\n      Object right,\n      @SuppressWarnings(\"unused\") @Cached(\"getVmValueJavaClassOrNull(left)\")\n          Class<? extends VmValue> leftJavaClass) {\n    return equals(left, right);\n  }\n\n  // TODO: Putting the equals call behind a boundary make the above optimization moot.\n  // Without the boundary, native-image 22.0 complains that Object.equals is reachable for\n  // runtime compilation, but with the above optimization, this isn't actually a problem.\n  @TruffleBoundary\n  private boolean equals(Object left, Object right) {\n    return left.equals(right);\n  }\n\n  protected static @Nullable Class<? extends VmValue> getVmValueJavaClassOrNull(Object value) {\n    // OK to perform slow cast here (not a guard)\n    return value instanceof VmValue vmValue ? vmValue.getClass() : null;\n  }\n\n  // covers all remaining cases (else it's a bug)\n  @Specialization(guards = \"isIncompatibleTypes(left, right)\")\n  protected boolean eval(\n      @SuppressWarnings(\"unused\") Object left, @SuppressWarnings(\"unused\") Object right) {\n    return false;\n  }\n\n  protected static boolean isIncompatibleTypes(Object left, Object right) {\n    var leftClass = left.getClass();\n    var rightClass = right.getClass();\n\n    return leftClass == Long.class || leftClass == Double.class\n        ? rightClass != Long.class && rightClass != Double.class\n        : leftClass != rightClass;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/ExponentiationNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmSafeMath;\n\n@NodeInfo(shortName = \"**\")\npublic abstract class ExponentiationNode extends BinaryExpressionNode {\n  public ExponentiationNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization(guards = \"y >= 0\")\n  protected long evalPositive(long x, long y) {\n    return VmSafeMath.pow(x, y);\n  }\n\n  @Specialization(guards = \"y < 0\")\n  protected double evalNegative(long x, long y) {\n    return StrictMath.pow(x, y);\n  }\n\n  @Specialization\n  protected double eval(long x, double y) {\n    return StrictMath.pow(x, y);\n  }\n\n  @Specialization\n  protected double eval(double x, long y) {\n    return StrictMath.pow(x, y);\n  }\n\n  @Specialization\n  protected double eval(double x, double y) {\n    return StrictMath.pow(x, y);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration x, long y) {\n    return x.pow(y);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration x, double y) {\n    return x.pow(y);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize x, long y) {\n    return x.pow(y);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize x, double y) {\n    return x.pow(y);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/GreaterThanNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.instrumentation.GenerateWrapper;\nimport com.oracle.truffle.api.instrumentation.ProbeNode;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\n\n@NodeInfo(shortName = \">\")\n@GenerateWrapper\npublic abstract class GreaterThanNode extends ComparatorNode {\n  protected GreaterThanNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected boolean eval(String left, String right) {\n    return left.compareTo(right) > 0;\n  }\n\n  @Specialization\n  protected boolean eval(long left, long right) {\n    return left > right;\n  }\n\n  @Specialization\n  protected boolean eval(long left, double right) {\n    return left > right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, long right) {\n    return left > right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, double right) {\n    return left > right;\n  }\n\n  @Specialization\n  protected boolean eval(VmDuration left, VmDuration right) {\n    return left.compareTo(right) > 0;\n  }\n\n  @Specialization\n  protected boolean eval(VmDataSize left, VmDataSize right) {\n    return left.compareTo(right) > 0;\n  }\n\n  @Override\n  public WrapperNode createWrapper(ProbeNode probe) {\n    return new GreaterThanNodeWrapper(sourceSection, this, probe);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/GreaterThanOrEqualNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\n\n@NodeInfo(shortName = \">=\")\npublic abstract class GreaterThanOrEqualNode extends BinaryExpressionNode {\n  protected GreaterThanOrEqualNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected boolean eval(String left, String right) {\n    return left.compareTo(right) >= 0;\n  }\n\n  @Specialization\n  protected boolean eval(long left, long right) {\n    return left >= right;\n  }\n\n  @Specialization\n  protected boolean eval(long left, double right) {\n    return left >= right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, long right) {\n    return left >= right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, double right) {\n    return left >= right;\n  }\n\n  @Specialization\n  protected boolean eval(VmDuration left, VmDuration right) {\n    return left.compareTo(right) >= 0;\n  }\n\n  @Specialization\n  protected boolean eval(VmDataSize left, VmDataSize right) {\n    return left.compareTo(right) >= 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/LessThanNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.instrumentation.GenerateWrapper;\nimport com.oracle.truffle.api.instrumentation.ProbeNode;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\n\n@NodeInfo(shortName = \"<\")\n@GenerateWrapper\npublic abstract class LessThanNode extends ComparatorNode {\n  protected LessThanNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected boolean eval(String left, String right) {\n    return left.compareTo(right) < 0;\n  }\n\n  @Specialization\n  protected boolean eval(long left, long right) {\n    return left < right;\n  }\n\n  @Specialization\n  protected boolean eval(long left, double right) {\n    return left < right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, long right) {\n    return left < right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, double right) {\n    return left < right;\n  }\n\n  @Specialization\n  protected boolean eval(VmDuration left, VmDuration right) {\n    return left.compareTo(right) < 0;\n  }\n\n  @Specialization\n  protected boolean eval(VmDataSize left, VmDataSize right) {\n    return left.compareTo(right) < 0;\n  }\n\n  @Override\n  public WrapperNode createWrapper(ProbeNode probe) {\n    return new LessThanNodeWrapper(sourceSection, this, probe);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/LessThanOrEqualNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\n\n@NodeInfo(shortName = \"<=\")\npublic abstract class LessThanOrEqualNode extends BinaryExpressionNode {\n  protected LessThanOrEqualNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  public abstract boolean executeWith(Object left, Object right);\n\n  @Specialization\n  @TruffleBoundary\n  protected boolean eval(String left, String right) {\n    return left.compareTo(right) <= 0;\n  }\n\n  @Specialization\n  protected boolean eval(long left, long right) {\n    return left <= right;\n  }\n\n  @Specialization\n  protected boolean eval(long left, double right) {\n    return left <= right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, long right) {\n    return left <= right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, double right) {\n    return left <= right;\n  }\n\n  @Specialization\n  protected boolean eval(VmDuration left, VmDuration right) {\n    return left.compareTo(right) <= 0;\n  }\n\n  @Specialization\n  protected boolean eval(VmDataSize left, VmDataSize right) {\n    return left.compareTo(right) <= 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/LetExprNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.FunctionNode;\nimport org.pkl.core.ast.member.UnresolvedFunctionNode;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.LateInit;\n\npublic final class LetExprNode extends ExpressionNode {\n  private @Child UnresolvedFunctionNode unresolvedFunctionNode;\n  private @Child ExpressionNode valueNode;\n  private final boolean isCustomThisScope;\n\n  @CompilationFinal @LateInit private FunctionNode functionNode;\n  @Child @LateInit private DirectCallNode callNode;\n  @CompilationFinal private int customThisSlot = -1;\n\n  public LetExprNode(\n      SourceSection sourceSection,\n      UnresolvedFunctionNode functionNode,\n      ExpressionNode valueNode,\n      boolean isCustomThisScope) {\n\n    super(sourceSection);\n    this.unresolvedFunctionNode = functionNode;\n    this.valueNode = valueNode;\n    this.isCustomThisScope = isCustomThisScope;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (functionNode == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      functionNode = unresolvedFunctionNode.execute(frame);\n      callNode = insert(DirectCallNode.create(functionNode.getCallTarget()));\n      if (isCustomThisScope) {\n        // deferred until execution time s.t. nodes of inlined type aliases get the right frame slot\n        customThisSlot = VmUtils.findCustomThisSlot(frame);\n      }\n    }\n\n    var function =\n        new VmFunction(\n            frame.materialize(),\n            isCustomThisScope ? frame.getAuxiliarySlot(customThisSlot) : VmUtils.getReceiver(frame),\n            1,\n            functionNode,\n            null);\n\n    var value = valueNode.executeGeneric(frame);\n\n    return callNode.call(function.getThisValue(), function, value);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/LogicalAndNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeInfo(shortName = \"&&\")\npublic abstract class LogicalAndNode extends ShortCircuitingExpressionNode {\n  protected LogicalAndNode(SourceSection sourceSection, ExpressionNode rightNode) {\n    super(sourceSection, rightNode);\n  }\n\n  @Specialization\n  protected boolean eval(VirtualFrame frame, boolean left) {\n    try {\n      return left && rightNode.executeBoolean(frame);\n    } catch (UnexpectedResultException e) {\n      throw operatorNotDefined(true, e.getResult());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/LogicalOrNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeInfo(shortName = \"||\")\npublic abstract class LogicalOrNode extends ShortCircuitingExpressionNode {\n  protected LogicalOrNode(SourceSection sourceSection, ExpressionNode rightNode) {\n    super(sourceSection, rightNode);\n  }\n\n  @Specialization\n  protected boolean eval(VirtualFrame frame, boolean left) {\n    try {\n      return left || rightNode.executeBoolean(frame);\n    } catch (UnexpectedResultException e) {\n      throw operatorNotDefined(false, e.getResult());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/MultiplicationNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\n@NodeInfo(shortName = \"*\")\npublic abstract class MultiplicationNode extends BinaryExpressionNode {\n  protected MultiplicationNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected long eval(long left, long right) {\n    try {\n      return StrictMath.multiplyExact(left, right);\n    } catch (VmException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"integerOverflow\").build();\n    }\n  }\n\n  @Specialization\n  protected double eval(long left, double right) {\n    return left * right;\n  }\n\n  @Specialization\n  protected double eval(double left, long right) {\n    return left * right;\n  }\n\n  @Specialization\n  protected double eval(double left, double right) {\n    return left * right;\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, long right) {\n    return left.multiply(right);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, double right) {\n    return left.multiply(right);\n  }\n\n  @Specialization\n  protected VmDuration eval(long left, VmDuration right) {\n    return right.multiply(left);\n  }\n\n  @Specialization\n  protected VmDuration eval(double left, VmDuration right) {\n    return right.multiply(left);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, long right) {\n    return left.multiply(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, double right) {\n    return left.multiply(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(long left, VmDataSize right) {\n    return right.multiply(left);\n  }\n\n  @Specialization\n  protected VmDataSize eval(double left, VmDataSize right) {\n    return right.multiply(left);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/NotEqualNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmValue;\nimport org.pkl.core.util.Nullable;\n\n@NodeInfo(shortName = \"!=\")\n@NodeChild(value = \"leftNode\", type = ExpressionNode.class)\n@NodeChild(value = \"rightNode\", type = ExpressionNode.class)\n// not extending BinaryExpressionNode because we don't want the latter's fallback\npublic abstract class NotEqualNode extends ExpressionNode {\n  protected NotEqualNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected boolean eval(String left, String right) {\n    return !left.equals(right);\n  }\n\n  @Specialization\n  protected boolean eval(long left, long right) {\n    return left != right;\n  }\n\n  @Specialization\n  protected boolean eval(long left, double right) {\n    return left != right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, long right) {\n    return left != right;\n  }\n\n  @Specialization\n  protected boolean eval(double left, double right) {\n    return left != right;\n  }\n\n  @Specialization\n  protected boolean eval(boolean left, boolean right) {\n    return left != right;\n  }\n\n  /**\n   * This method effectively covers `VmValue left, VmValue right` but is implemented in a <a\n   * href=\"https://www.graalvm.org/22.0/graalvm-as-a-platform/language-implementation-framework/TruffleLibraries/#strategy-2-java-interfaces\">more\n   * efficient way</a>.\n   */\n  @Specialization(\n      guards = {\"left.getClass() == leftJavaClass\", \"right.getClass() == leftJavaClass\"},\n      limit = \"99\")\n  protected boolean eval(\n      Object left,\n      Object right,\n      @SuppressWarnings(\"unused\") @Cached(\"getVmValueJavaClassOrNull(left)\")\n          Class<? extends VmValue> leftJavaClass) {\n    return !equals(left, right);\n  }\n\n  // TODO: Putting the equals call behind a boundary make the above optimization moot.\n  // Without the boundary, native-image 22.0 complains that Object.equals is reachable for\n  // runtime compilation, but with the above optimization, this isn't actually a problem.\n  @TruffleBoundary\n  private boolean equals(Object left, Object right) {\n    return left.equals(right);\n  }\n\n  protected static @Nullable Class<? extends VmValue> getVmValueJavaClassOrNull(Object value) {\n    // OK to perform slow cast here (not a guard)\n    return value instanceof VmValue vmValue ? vmValue.getClass() : null;\n  }\n\n  // covers all remaining cases (else it's a bug)\n  @Specialization(guards = \"isIncompatibleTypes(left, right)\")\n  protected boolean eval(\n      @SuppressWarnings(\"unused\") Object left, @SuppressWarnings(\"unused\") Object right) {\n    return true;\n  }\n\n  @SuppressWarnings(\"JavaExistingMethodCanBeUsed\")\n  protected static boolean isIncompatibleTypes(Object left, Object right) {\n    var leftClass = left.getClass();\n    var rightClass = right.getClass();\n\n    return leftClass == Long.class || leftClass == Double.class\n        ? rightClass != Long.class && rightClass != Double.class\n        : leftClass != rightClass;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/NullCoalescingNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmNull;\n\n@NodeInfo(shortName = \"??\")\npublic abstract class NullCoalescingNode extends ShortCircuitingExpressionNode {\n  protected NullCoalescingNode(SourceSection sourceSection, ExpressionNode rightNode) {\n    super(sourceSection, rightNode);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"UnusedParameters\")\n  protected Object eval(VirtualFrame frame, VmNull left) {\n    return rightNode.executeGeneric(frame);\n  }\n\n  @Fallback\n  @Override\n  protected Object fallback(Object left) {\n    return left;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/PipeNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.runtime.VmFunction;\n\n@NodeInfo(shortName = \"|>\")\npublic abstract class PipeNode extends BinaryExpressionNode {\n  @Child private ApplyVmFunction1Node applyFunctionNode = ApplyVmFunction1Node.create();\n\n  protected PipeNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected Object eval(Object left, VmFunction right) {\n    return applyFunctionNode.execute(right, left);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/RemainderNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmSafeMath;\n\n@NodeInfo(shortName = \"%\")\n@SuppressWarnings(\"SuspiciousNameCombination\")\npublic abstract class RemainderNode extends BinaryExpressionNode {\n  protected RemainderNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected long eval(long left, long right) {\n    return VmSafeMath.remainder(left, right);\n  }\n\n  @Specialization\n  protected double eval(long left, double right) {\n    return VmSafeMath.remainder(left, right);\n  }\n\n  @Specialization\n  protected double eval(double left, long right) {\n    return VmSafeMath.remainder(left, right);\n  }\n\n  @Specialization\n  protected double eval(double left, double right) {\n    return VmSafeMath.remainder(left, right);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, long right) {\n    return left.remainder(right);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, double right) {\n    return left.remainder(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, long right) {\n    return left.remainder(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, double right) {\n    return left.remainder(right);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/ShortCircuitingExpressionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmUtils;\n\n/**\n * A binary expression whose right operand may be short-circuited. Does not inherit from\n * BinaryExpressionNode for technical reasons.\n */\n@NodeChild(value = \"leftNode\", type = ExpressionNode.class)\npublic abstract class ShortCircuitingExpressionNode extends ExpressionNode {\n  @Child protected ExpressionNode rightNode;\n\n  protected abstract ExpressionNode getLeftNode();\n\n  protected ShortCircuitingExpressionNode(SourceSection sourceSection, ExpressionNode rightNode) {\n    super(sourceSection);\n    this.rightNode = rightNode;\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(Object left) {\n    throw operatorNotDefined(left);\n  }\n\n  @TruffleBoundary\n  protected VmException operatorNotDefined(Object left) {\n    return exceptionBuilder()\n        .evalError(\"operatorNotDefinedLeft\", getShortName(), VmUtils.getClass(left))\n        .withProgramValue(\"Left operand\", left)\n        .build();\n  }\n\n  @TruffleBoundary\n  protected VmException operatorNotDefined(Object left, Object right) {\n    return exceptionBuilder()\n        .evalError(\n            \"operatorNotDefined2\", getShortName(), VmUtils.getClass(left), VmUtils.getClass(right))\n        .withProgramValue(\"Left operand\", left)\n        .withProgramValue(\"Right operand\", right)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/SubscriptNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Cached.Exclusive;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\n@NodeInfo(shortName = \"[]\")\npublic abstract class SubscriptNode extends BinaryExpressionNode {\n  protected SubscriptNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected String eval(String receiver, long index) {\n    var charIndex = VmUtils.codePointOffsetToCharOffset(receiver, index);\n    if (charIndex == -1 || charIndex == receiver.length()) {\n      throw exceptionBuilder()\n          .evalError(\n              \"charIndexOutOfRange\", index, 0, receiver.codePointCount(0, receiver.length()) - 1)\n          .withSourceSection(getRightNode().getSourceSection())\n          .withProgramValue(\"String\", receiver)\n          .build();\n    }\n\n    if (Character.isHighSurrogate(receiver.charAt(charIndex))) {\n      return receiver.substring(charIndex, charIndex + 2);\n    }\n    return receiver.substring(charIndex, charIndex + 1);\n  }\n\n  @Specialization\n  protected Object eval(VmList receiver, long index) {\n    if (index < 0 || index >= receiver.getLength()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"elementIndexOutOfRange\", index, 0, receiver.getLength() - 1)\n          .withProgramValue(\"Collection\", receiver)\n          .build();\n    }\n    return receiver.get(index);\n  }\n\n  @Specialization\n  protected Object eval(VmMap receiver, Object key) {\n    var result = receiver.getOrNull(key);\n    if (result != null) return result;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().cannotFindKey(receiver, key).build();\n  }\n\n  @Specialization\n  protected Object eval(\n      VmListing listing, long index, @Exclusive @Cached(\"create()\") IndirectCallNode callNode) {\n\n    var result = VmUtils.readMemberOrNull(listing, index, callNode);\n    if (result != null) return result;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"elementIndexOutOfRange\", index, 0, listing.getLength() - 1)\n        .build();\n  }\n\n  @Specialization\n  protected Object eval(\n      VmMapping mapping, Object key, @Exclusive @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return readMember(mapping, key, callNode);\n  }\n\n  @Specialization\n  protected Object eval(\n      VmDynamic dynamic, Object key, @Exclusive @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return readMember(dynamic, key, callNode);\n  }\n\n  @Specialization\n  protected long eval(VmBytes receiver, long index) {\n    if (index < 0 || index >= receiver.getLength()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"elementIndexOutOfRange\", index, 0, receiver.getLength() - 1)\n          .withProgramValue(\"Value\", receiver)\n          .build();\n    }\n    return receiver.get(index);\n  }\n\n  private Object readMember(VmObject object, Object key, IndirectCallNode callNode) {\n    var result = VmUtils.readMemberOrNull(object, key, callNode);\n    if (result != null) return result;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().cannotFindMember(object, key).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/SubtractionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\n@NodeInfo(shortName = \"-\")\npublic abstract class SubtractionNode extends BinaryExpressionNode {\n  protected SubtractionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected long eval(long left, long right) {\n    try {\n      return StrictMath.subtractExact(left, right);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"integerOverflow\").build();\n    }\n  }\n\n  @Specialization\n  protected double eval(long left, double right) {\n    return left - right;\n  }\n\n  @Specialization\n  protected double eval(double left, long right) {\n    return left - right;\n  }\n\n  @Specialization\n  protected double eval(double left, double right) {\n    return left - right;\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, VmDuration right) {\n    return left.subtract(right);\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, VmDataSize right) {\n    return left.subtract(right);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/TruncatingDivisionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.binary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.math.RoundingMode;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.util.MathUtils;\n\n@NodeInfo(shortName = \"~/\")\n@SuppressWarnings(\"SuspiciousNameCombination\")\npublic abstract class TruncatingDivisionNode extends BinaryExpressionNode {\n  protected TruncatingDivisionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected long eval(long left, long right) {\n    if (right == 0) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"divisionByZero\").build();\n    }\n\n    var result = left / right;\n\n    // use same check as com.oracle.truffle.sl.nodes.expression.SLDivNode\n    if ((left & right & result) < 0) {\n      CompilerDirectives.transferToInterpreter();\n      assert left == Long.MIN_VALUE && right == -1;\n      throw exceptionBuilder().evalError(\"integerOverflow\").build();\n    }\n    return result;\n  }\n\n  @Specialization\n  protected long eval(long left, double right) {\n    return doTruncatingDivide(left, right);\n  }\n\n  @Specialization\n  protected long eval(double left, long right) {\n    return doTruncatingDivide(left, right);\n  }\n\n  @Specialization\n  protected long eval(double left, double right) {\n    return doTruncatingDivide(left, right);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, long right) {\n    var newValue = doTruncatingDivide(left.getValue(), right);\n    return new VmDuration(newValue, left.getUnit());\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration left, double right) {\n    var newValue = doTruncatingDivide(left.getValue(), right);\n    return new VmDuration(newValue, left.getUnit());\n  }\n\n  @Specialization\n  protected long eval(VmDuration left, VmDuration right) {\n    // use same conversion strategy as add/subtract\n    if (left.getUnit().ordinal() <= right.getUnit().ordinal()) {\n      return doTruncatingDivide(left.getValue(right.getUnit()), right.getValue());\n    }\n    return doTruncatingDivide(left.getValue(), right.getValue(left.getUnit()));\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, long right) {\n    var value = doTruncatingDivide(left.getValue(), right);\n    return new VmDataSize(value, left.getUnit());\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize left, double right) {\n    var newValue = doTruncatingDivide(left.getValue(), right);\n    return new VmDataSize(newValue, left.getUnit());\n  }\n\n  @Specialization\n  protected long eval(VmDataSize left, VmDataSize right) {\n    // use same conversion strategy as add/subtract\n    if (left.getUnit().ordinal() <= right.getUnit().ordinal()) {\n      var leftValue = left.convertTo(right.getUnit()).getValue();\n      return doTruncatingDivide(leftValue, right.getValue());\n    }\n    var rightValue = right.convertTo(left.getUnit()).getValue();\n    return doTruncatingDivide(left.getValue(), rightValue);\n  }\n\n  private long doTruncatingDivide(double x, double y) {\n    try {\n      return MathUtils.roundToLong(x / y, RoundingMode.DOWN);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\n              Double.isFinite(x) ? \"cannotConvertLargeFloat\" : \"cannotConvertNonFiniteFloat\",\n              new ProgramValue(\"Float\", x))\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/binary/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.binary;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorElementNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmListing;\n\n@ImportStatic(BaseModule.class)\npublic abstract class GeneratorElementNode extends GeneratorMemberNode {\n  private final ObjectMember element;\n\n  protected GeneratorElementNode(ObjectMember element, boolean isFrameStored) {\n    super(element.getSourceSection(), isFrameStored);\n    this.element = element;\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalDynamic(VirtualFrame frame, VmDynamic parent, ObjectData data) {\n    data.addElement(frame, element, this);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalListing(VirtualFrame frame, VmListing parent, ObjectData data) {\n    data.addElement(frame, element, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected void evalDynamicClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    data.addElement(frame, element, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"parent == getListingClass()\")\n  protected void evalListingClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    data.addElement(frame, element, this);\n  }\n\n  @Fallback\n  @SuppressWarnings(\"unused\")\n  void fallback(VirtualFrame frame, Object parent, ObjectData data) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"objectCannotHaveElement\", parent).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorEntryNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.runtime.VmException.ProgramValue;\n\n@ImportStatic(BaseModule.class)\npublic abstract class GeneratorEntryNode extends GeneratorMemberNode {\n  @Child private ExpressionNode keyNode;\n  private final ObjectMember member;\n\n  protected GeneratorEntryNode(ExpressionNode keyNode, ObjectMember member, boolean isFrameStored) {\n    super(member.getSourceSection(), isFrameStored);\n    this.keyNode = keyNode;\n    this.member = member;\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalDynamic(VirtualFrame frame, VmDynamic parent, ObjectData data) {\n    addRegularEntry(frame, data);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalMapping(VirtualFrame frame, VmMapping parent, ObjectData data) {\n    addRegularEntry(frame, data);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalListing(VirtualFrame frame, VmListing parent, ObjectData data) {\n    addListingEntry(frame, data, parent.getLength());\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected void evalDynamicClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    addRegularEntry(frame, data);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"parent == getMappingClass()\")\n  protected void evalMappingClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    addRegularEntry(frame, data);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"parent == getListingClass()\")\n  protected void evalListingClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    // always throws\n    addListingEntry(frame, data, 0);\n  }\n\n  @Fallback\n  @SuppressWarnings(\"unused\")\n  void fallback(Object parent, ObjectData data) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"objectCannotHaveEntry\", parent).build();\n  }\n\n  private void addRegularEntry(VirtualFrame frame, ObjectData data) {\n    var key = keyNode.executeGeneric(frame);\n    data.addMember(frame, key, member, this);\n  }\n\n  private void addListingEntry(VirtualFrame frame, ObjectData data, int parentLength) {\n    long index;\n    try {\n      index = keyNode.executeInt(frame);\n    } catch (UnexpectedResultException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"wrongListingKeyType\", new ProgramValue(\"\", VmUtils.getClass(e.getResult())))\n          .withLocation(keyNode)\n          .build();\n    }\n\n    // use same error messages as in checkIsValidListingAmendment and checkMaxListingMemberIndex\n    if (index < 0 || index >= parentLength) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"elementIndexOutOfRange\", index, 0, parentLength - 1)\n          .withLocation(keyNode)\n          .build();\n    }\n\n    data.addMember(frame, index, member, this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorForNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.Truffle;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class GeneratorForNode extends GeneratorMemberNode {\n  private final FrameDescriptor generatorDescriptor;\n  @Child private ExpressionNode iterableNode;\n  @Child private @Nullable UnresolvedTypeNode unresolvedKeyTypeNode;\n  @Child private @Nullable UnresolvedTypeNode unresolvedValueTypeNode;\n  @Children private final GeneratorMemberNode[] childNodes;\n  @Child private @Nullable TypeNode keyTypeNode;\n  @Child private @Nullable TypeNode valueTypeNode;\n\n  public GeneratorForNode(\n      SourceSection sourceSection,\n      FrameDescriptor generatorDescriptor,\n      ExpressionNode iterableNode,\n      // null if for-generator doesn't bind key or `keyTypeNode` is passed instead of this node\n      @Nullable UnresolvedTypeNode unresolvedKeyTypeNode,\n      // null if for-generator doesn't bind value or `valueTypeNode` is passed instead of this node\n      @Nullable UnresolvedTypeNode unresolvedValueTypeNode,\n      // If this node can be constructed at parse time,\n      // it should be passed instead of `unresolvedKeyTypeNode`.\n      GeneratorMemberNode[] childNodes,\n      @Nullable TypeNode keyTypeNode,\n      // If this node can be constructed at parse time,\n      // it should be passed instead of `unresolvedValueTypeNode`.\n      @Nullable TypeNode valueTypeNode) {\n    super(sourceSection, false);\n    this.generatorDescriptor = generatorDescriptor;\n    this.iterableNode = iterableNode;\n    this.unresolvedKeyTypeNode = unresolvedKeyTypeNode;\n    this.unresolvedValueTypeNode = unresolvedValueTypeNode;\n    this.childNodes = childNodes;\n    this.keyTypeNode = keyTypeNode;\n    this.valueTypeNode = valueTypeNode;\n  }\n\n  protected abstract void executeWithIterable(\n      VirtualFrame frame, Object parent, ObjectData data, Object iterable);\n\n  @Override\n  public final void execute(VirtualFrame frame, Object parent, ObjectData data) {\n    initialize(frame);\n    executeWithIterable(frame, parent, data, iterableNode.executeGeneric(frame));\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmListing iterable) {\n    doEvalObject(frame, iterable, parent, data);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmMapping iterable) {\n    doEvalObject(frame, iterable, parent, data);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmDynamic iterable) {\n    doEvalObject(frame, iterable, parent, data);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmList iterable) {\n    long idx = 0;\n    for (var element : iterable) {\n      executeIteration(frame, parent, data, idx++, element);\n    }\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmMap iterable) {\n    for (var entry : iterable) {\n      executeIteration(frame, parent, data, VmUtils.getKey(entry), VmUtils.getValue(entry));\n    }\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmSet iterable) {\n    long idx = 0;\n    for (var element : iterable) {\n      executeIteration(frame, parent, data, idx++, element);\n    }\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmIntSeq iterable) {\n    var length = iterable.getLength();\n    for (long key = 0, value = iterable.start; key < length; key++, value += iterable.step) {\n      executeIteration(frame, parent, data, key, value);\n    }\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, Object parent, ObjectData data, VmBytes iterable) {\n    long idx = 0;\n    for (var byt : iterable.getBytes()) {\n      executeIteration(frame, parent, data, idx++, (long) byt);\n    }\n  }\n\n  @Fallback\n  @SuppressWarnings(\"unused\")\n  protected void fallback(VirtualFrame frame, Object parent, ObjectData data, Object iterable) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"cannotIterateOverThisValue\", VmUtils.getClass(iterable))\n        .withLocation(iterableNode)\n        .withProgramValue(\"Value\", iterable)\n        .build();\n  }\n\n  private void doEvalObject(VirtualFrame frame, VmObject iterable, Object parent, ObjectData data) {\n    iterable.forceAndIterateMemberValues(\n        (key, member, value) -> {\n          var convertedKey = member.isProp() ? key.toString() : key;\n          // TODO: Executing iteration behind a Truffle boundary is bad for performance.\n          // This and similar cases will be fixed in an upcoming PR that replaces method\n          // `(forceAnd)iterateMemberValues` with cursor-based external iterators.\n          executeIteration(frame, parent, data, convertedKey, value);\n          return true;\n        });\n  }\n\n  @ExplodeLoop\n  private void executeIteration(\n      VirtualFrame frame, Object parent, ObjectData data, Object key, Object value) {\n\n    // GraalJS uses the same implementation technique here:\n    // https://github.com/oracle/graaljs/blob/44a11ce6e87/graal-js/src/com.oracle.truffle.js/\n    // src/com/oracle/truffle/js/nodes/function/IterationScopeNode.java#L86-L88\n    var newFrame =\n        Truffle.getRuntime().createVirtualFrame(frame.getArguments(), generatorDescriptor);\n    // the locals in `frame` (if any) are function arguments and/or outer for-generator bindings\n    VmUtils.copyLocals(frame, 0, newFrame, 0, frame.getFrameDescriptor().getNumberOfSlots());\n    if (keyTypeNode != null) {\n      keyTypeNode.executeAndSet(newFrame, key);\n    }\n    if (valueTypeNode != null) {\n      valueTypeNode.executeAndSet(newFrame, value);\n    }\n    //noinspection ForLoopReplaceableByForEach\n    for (int i = 0; i < childNodes.length; i++) {\n      childNodes[i].execute(newFrame, parent, data);\n    }\n  }\n\n  private void initialize(VirtualFrame frame) {\n    if (unresolvedKeyTypeNode != null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var keySlot = frame.getFrameDescriptor().getNumberOfSlots();\n      keyTypeNode = insert(unresolvedKeyTypeNode.execute(frame)).initWriteSlotNode(keySlot);\n      generatorDescriptor.setSlotKind(keySlot, keyTypeNode.getFrameSlotKind());\n      unresolvedKeyTypeNode = null;\n    }\n    if (unresolvedValueTypeNode != null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var valueSlot = frame.getFrameDescriptor().getNumberOfSlots() + (keyTypeNode != null ? 1 : 0);\n      valueTypeNode = insert(unresolvedValueTypeNode.execute(frame)).initWriteSlotNode(valueSlot);\n      generatorDescriptor.setSlotKind(valueSlot, valueTypeNode.getFrameSlotKind());\n      unresolvedValueTypeNode = null;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorMemberNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Idempotent;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.runtime.VmUtils;\n\npublic abstract class GeneratorMemberNode extends PklNode {\n  final boolean isFrameStored;\n\n  protected GeneratorMemberNode(SourceSection sourceSection, boolean isFrameStored) {\n    super(sourceSection);\n    this.isFrameStored = isFrameStored;\n  }\n\n  public abstract void execute(VirtualFrame frame, Object parent, ObjectData data);\n\n  protected VmException duplicateDefinition(Object key, ObjectMember member) {\n    return exceptionBuilder()\n        .evalError(\n            \"duplicateDefinition\", key instanceof Identifier ? key : new ProgramValue(\"\", key))\n        .withSourceSection(member.getHeaderSection())\n        .build();\n  }\n\n  @Idempotent\n  protected static boolean isTypedObjectClass(VmClass clazz) {\n    assert clazz.isInstantiable();\n    return !(clazz.isListingClass() || clazz.isMappingClass() || clazz.isDynamicClass());\n  }\n\n  @Idempotent\n  @SuppressWarnings(\"SameReturnValue\")\n  protected final boolean checkIsValidTypedProperty(VmClass clazz, ObjectMember member) {\n    if (member.isLocal()) return true;\n    var memberName = member.getName();\n    var classProperty = clazz.getProperty(memberName);\n    if (classProperty != null && !classProperty.isConstOrFixed()) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    if (classProperty == null) {\n      var exception =\n          exceptionBuilder()\n              .cannotFindProperty(clazz.getPrototype(), memberName, false, false)\n              .build();\n      if (member.getHeaderSection().isAvailable()) {\n        exception\n            .getInsertedStackFrames()\n            .put(\n                getRootNode().getCallTarget(),\n                VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));\n      }\n      throw exception;\n    }\n    assert classProperty.isConstOrFixed();\n    var errMsg =\n        classProperty.isConst() ? \"cannotAssignConstProperty\" : \"cannotAssignFixedProperty\";\n    var exception = exceptionBuilder().evalError(errMsg, memberName).build();\n    if (member.getHeaderSection().isAvailable()) {\n      exception\n          .getInsertedStackFrames()\n          .put(\n              getRootNode().getCallTarget(),\n              VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));\n    }\n    throw exception;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorObjectLiteralNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Idempotent;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.expression.literal.AmendFunctionNode;\nimport org.pkl.core.ast.expression.literal.ObjectLiteralNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n/** An object literal node that contains at least one for- or when-expression. */\n@ImportStatic(BaseModule.class)\npublic abstract class GeneratorObjectLiteralNode extends ObjectLiteralNode {\n  @Children private final GeneratorMemberNode[] memberNodes;\n\n  public GeneratorObjectLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      GeneratorMemberNode[] memberNodes) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes);\n    this.memberNodes = memberNodes;\n  }\n\n  protected GeneratorObjectLiteralNode copy(ExpressionNode newParentNode) {\n    //noinspection ConstantConditions\n    return GeneratorObjectLiteralNodeGen.create(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        null, // copied node no longer has parameters\n        new UnresolvedTypeNode[0], // ditto\n        memberNodes,\n        newParentNode);\n  }\n\n  @Specialization(guards = \"checkObjectCannotHaveParameters()\")\n  protected VmDynamic evalDynamic(VirtualFrame frame, VmDynamic parent) {\n    var data = executeChildren(frame, parent, parent.getLength());\n    if (data.hasNoMembers()) {\n      return parent;\n    }\n    var result = new VmDynamic(frame.materialize(), parent, data.members(), data.length());\n    return data.storeGeneratorFrames(result);\n  }\n\n  @Specialization(guards = \"checkObjectCannotHaveParameters()\")\n  protected VmTyped evalTyped(VirtualFrame frame, VmTyped parent) {\n    VmUtils.checkIsInstantiable(parent.getVmClass(), getParentNode());\n    var data = executeChildren(frame, parent, 0);\n    if (data.hasNoMembers()) {\n      return parent;\n    }\n    assert data.hasNoGeneratorFrames();\n    return new VmTyped(frame.materialize(), parent, parent.getVmClass(), data.members());\n  }\n\n  @Specialization(guards = \"checkListingCannotHaveParameters()\")\n  protected VmListing evalListing(VirtualFrame frame, VmListing parent) {\n    var data = executeChildren(frame, parent, parent.getLength());\n    if (data.hasNoMembers()) {\n      return parent;\n    }\n    var result = new VmListing(frame.materialize(), parent, data.members(), data.length());\n    return data.storeGeneratorFrames(result);\n  }\n\n  @Specialization(guards = \"checkMappingCannotHaveParameters()\")\n  protected VmMapping evalMapping(VirtualFrame frame, VmMapping parent) {\n    var data = executeChildren(frame, parent, 0);\n    if (data.hasNoMembers()) {\n      return parent;\n    }\n    var result = new VmMapping(frame.materialize(), parent, data.members());\n    return data.storeGeneratorFrames(result);\n  }\n\n  @Specialization(guards = \"checkObjectCannotHaveParameters()\")\n  protected Object evalNull(VirtualFrame frame, VmNull parent) {\n    // assumes that Graal PE can handle recursive call to same node\n    return executeWithParent(frame, parent.getDefaultValue());\n  }\n\n  @Specialization(guards = \"checkIsValidFunctionAmendment(parent)\")\n  protected VmFunction evalFunction(\n      VirtualFrame frame,\n      VmFunction parent,\n      @Cached(value = \"createAmendFunctionNode(frame)\", neverDefault = true)\n          AmendFunctionNode amendFunctionNode) {\n\n    return amendFunctionNode.execute(frame, parent);\n  }\n\n  @Specialization(guards = {\"parent == getDynamicClass()\", \"checkObjectCannotHaveParameters()\"})\n  protected VmDynamic evalDynamicClass(VirtualFrame frame, VmClass parent) {\n    var data = executeChildren(frame, parent, 0);\n    if (data.hasNoMembers()) {\n      return VmDynamic.empty();\n    }\n    var result =\n        new VmDynamic(frame.materialize(), parent.getPrototype(), data.members(), data.length());\n    return data.storeGeneratorFrames(result);\n  }\n\n  @Specialization(guards = {\"parent == getMappingClass()\", \"checkMappingCannotHaveParameters()\"})\n  protected VmMapping evalMappingClass(VirtualFrame frame, VmClass parent) {\n    var data = executeChildren(frame, parent, 0);\n    if (data.hasNoMembers()) {\n      return VmMapping.empty();\n    }\n    var result = new VmMapping(frame.materialize(), parent.getPrototype(), data.members());\n    return data.storeGeneratorFrames(result);\n  }\n\n  @Specialization(guards = {\"parent == getListingClass()\", \"checkListingCannotHaveParameters()\"})\n  protected VmListing evalListingClass(VirtualFrame frame, VmClass parent) {\n    var data = executeChildren(frame, parent, 0);\n    if (data.hasNoMembers()) {\n      return VmListing.empty();\n    }\n    var result =\n        new VmListing(frame.materialize(), parent.getPrototype(), data.members(), data.length());\n    return data.storeGeneratorFrames(result);\n  }\n\n  @Specialization(guards = {\"isTypedObjectClass(parent)\", \"checkObjectCannotHaveParameters()\"})\n  protected VmTyped evalTypedObjectClass(VirtualFrame frame, VmClass parent) {\n    VmUtils.checkIsInstantiable(parent, getParentNode());\n    var data = executeChildren(frame, parent, 0);\n    if (data.hasNoMembers()) {\n      return parent.getPrototype();\n    }\n    assert data.hasNoGeneratorFrames();\n    return new VmTyped(frame.materialize(), parent.getPrototype(), parent, data.members());\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected void fallback(Object parent) {\n    VmUtils.checkIsInstantiable(\n        parent instanceof VmClass vmClass ? vmClass : VmUtils.getClass(parent), getParentNode());\n\n    throw exceptionBuilder().unreachableCode().build();\n  }\n\n  @Idempotent\n  protected boolean checkObjectCannotHaveParameters() {\n    if (parametersDescriptor == null) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"objectAmendmentCannotHaveParameters\")\n        .withLocation(parameterTypes[0])\n        .build();\n  }\n\n  @Idempotent\n  protected boolean checkListingCannotHaveParameters() {\n    if (parametersDescriptor == null) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"listingAmendmentCannotHaveParameters\")\n        .withLocation(parameterTypes[0])\n        .build();\n  }\n\n  @Idempotent\n  protected boolean checkMappingCannotHaveParameters() {\n    if (parametersDescriptor == null) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"mappingAmendmentCannotHaveParameters\")\n        .withLocation(parameterTypes[0])\n        .build();\n  }\n\n  @ExplodeLoop\n  private ObjectData executeChildren(VirtualFrame frame, Object parent, int parentLength) {\n    var data = new ObjectData(parentLength);\n    for (var memberNode : memberNodes) {\n      memberNode.execute(frame, parent, data);\n    }\n    return data;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorPredicateMemberNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.builder.SymbolTable.CustomThisScope;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.EconomicSets;\n\npublic abstract class GeneratorPredicateMemberNode extends GeneratorMemberNode {\n  @Child private ExpressionNode predicateNode;\n  private final ObjectMember member;\n\n  @CompilationFinal private int customThisSlot = -1;\n\n  protected GeneratorPredicateMemberNode(\n      ExpressionNode predicateNode, ObjectMember member, boolean isFrameStored) {\n    super(member.getSourceSection(), isFrameStored);\n    this.predicateNode = predicateNode;\n    this.member = member;\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalDynamic(VirtualFrame frame, VmDynamic parent, ObjectData data) {\n    addMembers(frame, parent, data);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalMapping(VirtualFrame frame, VmMapping parent, ObjectData data) {\n    addMembers(frame, parent, data);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalListing(VirtualFrame frame, VmListing parent, ObjectData data) {\n    addMembers(frame, parent, data);\n  }\n\n  @Fallback\n  @SuppressWarnings(\"unused\")\n  void fallback(Object parent, ObjectData data) {\n    if (parent == BaseModule.getDynamicClass()\n        || parent == BaseModule.getMappingClass()\n        || parent == BaseModule.getListingClass()) {\n      // nothing to do (parent is guaranteed to have zero elements/entries)\n      return;\n    }\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\n            \"objectCannotHavePredicateMember\",\n            parent instanceof VmClass ? parent : VmUtils.getClass(parent))\n        .withLocation(predicateNode)\n        .build();\n  }\n\n  private void addMembers(VirtualFrame frame, VmObject parent, ObjectData data) {\n    initThisSlot(frame);\n\n    var previousValue = frame.getAuxiliarySlot(customThisSlot);\n    var visitedKeys = EconomicSets.create();\n\n    // do our own traversal instead of relying on `VmAbstractObject.force/iterateMemberValues`\n    // (more efficient and we don't want to execute `predicateNode` behind Truffle boundary)\n    for (var owner = parent; owner != null; owner = owner.getParent()) {\n      var entries = EconomicMaps.getEntries(owner.getMembers());\n      while (entries.advance()) {\n        var key = entries.getKey();\n        if (!EconomicSets.add(visitedKeys, key)) continue;\n\n        var member = entries.getValue();\n        if (member.isProp() || member.isLocal()) continue;\n\n        var value = owner.getCachedValue(key);\n        if (value == null) {\n          var constantValue = member.getConstantValue();\n          if (constantValue != null) {\n            value = constantValue;\n          } else {\n            var callTarget = member.getCallTarget();\n            value = callTarget.call(parent, owner, key);\n          }\n          owner.setCachedValue(key, value);\n        }\n\n        frame.setAuxiliarySlot(customThisSlot, value);\n\n        try {\n          var isApplicable = predicateNode.executeBoolean(frame);\n          if (isApplicable) data.addMember(frame, key, this.member, this);\n        } catch (UnexpectedResultException e) {\n          CompilerDirectives.transferToInterpreter();\n          throw exceptionBuilder()\n              .typeMismatch(e.getResult(), BaseModule.getBooleanClass())\n              .withLocation(predicateNode)\n              .build();\n        }\n      }\n    }\n\n    // restore previous value\n    // handles the (pathetic) case of a predicate containing an object with another predicate\n    frame.setAuxiliarySlot(customThisSlot, previousValue);\n  }\n\n  private void initThisSlot(VirtualFrame frame) {\n    if (customThisSlot == -1) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      // deferred until execution time s.t. nodes of inlined type aliases get the right frame slot\n      customThisSlot =\n          frame.getFrameDescriptor().findOrAddAuxiliarySlot(CustomThisScope.FRAME_SLOT_ID);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Idempotent;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.*;\n\n@ImportStatic({BaseModule.class, GeneratorObjectLiteralNode.class})\npublic abstract class GeneratorPropertyNode extends GeneratorMemberNode {\n  protected final ObjectMember member;\n\n  protected GeneratorPropertyNode(ObjectMember member) {\n    super(member.getSourceSection(), false);\n    this.member = member;\n    assert member.isProp();\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void evalDynamic(VirtualFrame frame, VmDynamic parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"checkIsValidTypedProperty(parent.getVmClass(), member)\")\n  protected void evalTyped(VirtualFrame frame, VmTyped parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"checkIsValidMappingProperty()\")\n  protected void evalMapping(VirtualFrame frame, VmMapping parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"checkIsValidListingProperty()\")\n  protected void evalListing(VirtualFrame frame, VmListing parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected void evalDynamicClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = {\"parent == getMappingClass()\", \"checkIsValidMappingProperty()\"})\n  protected void evalMappingClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = {\"parent == getListingClass()\", \"checkIsValidListingProperty()\"})\n  protected void evalListingClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(\n      guards = {\"isTypedObjectClass(parent)\", \"checkIsValidTypedProperty(parent, member)\"})\n  protected void evalTypedObjectClass(VirtualFrame frame, VmClass parent, ObjectData data) {\n    data.addProperty(frame, member, this);\n  }\n\n  @Fallback\n  @SuppressWarnings(\"unused\")\n  void fallback(Object parent, ObjectData data) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\n            \"objectCannotHaveProperty\",\n            parent instanceof VmClass ? parent : VmUtils.getClass(parent))\n        .withSourceSection(member.getHeaderSection())\n        .build();\n  }\n\n  @Idempotent\n  protected boolean checkIsValidListingProperty() {\n    if (member.isLocal() || member.getName() == Identifier.DEFAULT) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"objectCannotHaveProperty\", BaseModule.getListingClass())\n        .withSourceSection(member.getHeaderSection())\n        .build();\n  }\n\n  @Idempotent\n  protected boolean checkIsValidMappingProperty() {\n    if (member.isLocal() || member.getName() == Identifier.DEFAULT) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"objectCannotHaveProperty\", BaseModule.getMappingClass())\n        .withSourceSection(member.getHeaderSection())\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorSpreadNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport static org.pkl.core.runtime.BaseModule.getListingClass;\nimport static org.pkl.core.runtime.BaseModule.getMappingClass;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.Iterators.TruffleIterator;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmCollection;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmObject;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\n\n@ImportStatic(BaseModule.class)\npublic abstract class GeneratorSpreadNode extends GeneratorMemberNode {\n  @Child private ExpressionNode iterableNode;\n  private final boolean nullable;\n\n  public GeneratorSpreadNode(\n      SourceSection sourceSection, ExpressionNode iterableNode, boolean nullable) {\n    super(sourceSection, false);\n    this.iterableNode = iterableNode;\n    this.nullable = nullable;\n  }\n\n  protected abstract void executeWithIterable(\n      VirtualFrame frame, Object parent, ObjectData data, Object iterable);\n\n  @Override\n  public final void execute(VirtualFrame frame, Object parent, ObjectData data) {\n    executeWithIterable(frame, parent, data, iterableNode.executeGeneric(frame));\n  }\n\n  @Specialization\n  @SuppressWarnings(\"unused\")\n  protected void eval(VmObject parent, ObjectData data, VmNull iterable) {\n    if (nullable) {\n      return;\n    }\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"cannotIterateOverThisValue\", BaseModule.getNullClass())\n        .withLocation(iterableNode)\n        .withHint(\n            \"To guard against a nullable value, use `...?` instead of `...`.\\n\"\n                + \"Try: `...?\"\n                + iterableNode.getSourceSection().getCharacters()\n                + \"`\")\n        .build();\n  }\n\n  @Specialization(guards = \"!iterable.isTyped()\")\n  @SuppressWarnings(\"unused\")\n  protected void eval(VirtualFrame frame, VmDynamic parent, ObjectData data, VmObject iterable) {\n    doEvalDynamic(frame, data, iterable);\n  }\n\n  @Specialization(guards = \"!iterable.isTyped()\")\n  @SuppressWarnings(\"unused\")\n  protected void eval(VirtualFrame frame, VmListing parent, ObjectData data, VmObject iterable) {\n    doEvalListing(frame, data, iterable);\n  }\n\n  @Specialization(guards = \"!iterable.isTyped()\")\n  @SuppressWarnings(\"unused\")\n  protected void eval(VirtualFrame frame, VmMapping parent, ObjectData data, VmObject iterable) {\n    doEvalMapping(frame, data, iterable);\n  }\n\n  @Specialization(guards = {\"parent == getDynamicClass()\", \"!iterable.isTyped()\"})\n  @SuppressWarnings(\"unused\")\n  protected void evalDynamicClass(\n      VirtualFrame frame, VmClass parent, ObjectData data, VmObject iterable) {\n    doEvalDynamic(frame, data, iterable);\n  }\n\n  @Specialization(guards = {\"parent == getListingClass()\", \"!iterable.isTyped()\"})\n  @SuppressWarnings(\"unused\")\n  protected void evalListingClass(\n      VirtualFrame frame, VmClass parent, ObjectData data, VmObject iterable) {\n    doEvalListing(frame, data, iterable);\n  }\n\n  @Specialization(guards = {\"parent == getMappingClass()\", \"!iterable.isTyped()\"})\n  @SuppressWarnings(\"unused\")\n  protected void evalMappingClass(\n      VirtualFrame frame, VmClass parent, ObjectData data, VmObject iterable) {\n    doEvalMapping(frame, data, iterable);\n  }\n\n  @Specialization(guards = {\"isTypedObjectClass(parent)\", \"!iterable.isTyped()\"})\n  protected void evalTypedClass(\n      VirtualFrame frame, VmClass parent, ObjectData data, VmObject iterable) {\n    doEvalTyped(frame, parent, data, iterable);\n  }\n\n  @Specialization(guards = {\"!iterable.isTyped()\"})\n  protected void eval(VirtualFrame frame, VmTyped parent, ObjectData data, VmObject iterable) {\n    doEvalTyped(frame, parent.getVmClass(), data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmObject parent, ObjectData data, VmMap iterable) {\n    doEvalMap(frame, parent.getVmClass(), data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmClass parent, ObjectData data, VmMap iterable) {\n    doEvalMap(frame, parent, data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmObject parent, ObjectData data, VmCollection iterable) {\n    doEvalCollection(frame, parent.getVmClass(), data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmClass parent, ObjectData data, VmCollection iterable) {\n    doEvalCollection(frame, parent, data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmObject parent, ObjectData data, VmIntSeq iterable) {\n    doEvalIntSeq(frame, parent.getVmClass(), data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmClass parent, ObjectData data, VmIntSeq iterable) {\n    doEvalIntSeq(frame, parent, data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmObject parent, ObjectData data, VmBytes iterable) {\n    doEvalBytes(frame, parent.getVmClass(), data, iterable);\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, VmClass parent, ObjectData data, VmBytes iterable) {\n    doEvalBytes(frame, parent, data, iterable);\n  }\n\n  @Fallback\n  @SuppressWarnings(\"unused\")\n  protected void fallback(VirtualFrame frame, Object parent, ObjectData data, Object iterable) {\n    CompilerDirectives.transferToInterpreter();\n    var builder =\n        exceptionBuilder()\n            .evalError(\"cannotIterateOverThisValue\", VmUtils.getClass(iterable))\n            .withLocation(iterableNode)\n            .withProgramValue(\"Value\", iterable);\n    if (iterable instanceof VmObject vmObject && vmObject.isTyped()) {\n      builder.withHint(\n          \"`Typed` values are not iterable. If you mean to spread its members, convert it to `Dynamic` using `toDynamic()`.\");\n    }\n    throw builder.build();\n  }\n\n  protected void doEvalDynamic(VirtualFrame frame, ObjectData data, VmObject iterable) {\n    iterable.forceAndIterateMemberValues(\n        (key, member, value) -> {\n          if (member.isElement()) {\n            data.addElement(frame, createMember(member, value), this);\n          } else {\n            data.addMember(frame, key, createMember(member, value), this);\n          }\n          return true;\n        });\n  }\n\n  private void doEvalMapping(VirtualFrame frame, ObjectData data, VmObject iterable) {\n    iterable.forceAndIterateMemberValues(\n        (key, member, value) -> {\n          if (member.isElement() || member.isProp()) {\n            cannotHaveMember(BaseModule.getMappingClass(), member);\n          }\n          data.addMember(frame, key, createMember(member, value), this);\n          return true;\n        });\n  }\n\n  private void doEvalListing(VirtualFrame frame, ObjectData data, VmObject iterable) {\n    iterable.forceAndIterateMemberValues(\n        (key, member, value) -> {\n          if (member.isEntry() || member.isProp()) {\n            cannotHaveMember(getListingClass(), member);\n          }\n          data.addElement(frame, createMember(member, value), this);\n          return true;\n        });\n  }\n\n  private void doEvalTyped(VirtualFrame frame, VmClass clazz, ObjectData data, VmObject iterable) {\n    iterable.forceAndIterateMemberValues(\n        (key, member, value) -> {\n          if (member.isElement() || member.isEntry()) {\n            cannotHaveMember(clazz, member);\n          }\n          checkIsValidTypedProperty(clazz, member);\n          data.addProperty(frame, createMember(member, value), this);\n          return true;\n        });\n  }\n\n  // handles both `List` and `Set`\n  private void doEvalCollection(\n      VirtualFrame frame, VmClass parent, ObjectData data, VmCollection iterable) {\n    if (isTypedObjectClass(parent) || parent == getMappingClass()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotSpreadObject\", iterable.getVmClass(), parent)\n          .withHint(\n              \"`List` and `Set` can only be spread into objects of type `Dynamic` and `Listing`.\")\n          .withProgramValue(\"Value\", iterable)\n          .build();\n    }\n    spreadIterable(frame, data, iterable);\n  }\n\n  private void doEvalMap(VirtualFrame frame, VmClass parent, ObjectData data, VmMap iterable) {\n    if (isTypedObjectClass(parent) || parent == getListingClass()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotSpreadObject\", iterable.getVmClass(), parent)\n          .withHint(\"`Map` can only be spread into objects of type `Dynamic` and `Mapping`.\")\n          .withProgramValue(\"Value\", iterable)\n          .build();\n    }\n    for (var entry : iterable) {\n      var member = VmUtils.createSyntheticObjectEntry(\"\", VmUtils.getValue(entry));\n      data.addMember(frame, VmUtils.getKey(entry), member, this);\n    }\n  }\n\n  private void doEvalIntSeq(\n      VirtualFrame frame, VmClass parent, ObjectData data, VmIntSeq iterable) {\n    if (isTypedObjectClass(parent) || parent == getMappingClass()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotSpreadObject\", iterable.getVmClass(), parent)\n          .withHint(\"`IntSeq` can only be spread into objects of type `Dynamic` and `Listing`.\")\n          .withProgramValue(\"Value\", iterable)\n          .build();\n    }\n    spreadIterable(frame, data, iterable);\n  }\n\n  private void doEvalBytes(VirtualFrame frame, VmClass parent, ObjectData data, VmBytes iterable) {\n    if (isTypedObjectClass(parent) || parent == getMappingClass()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotSpreadObject\", iterable.getVmClass(), parent)\n          .withHint(\"`Bytes` can only be spread into objects of type `Dynamic` and `Listing`.\")\n          .withProgramValue(\"Value\", iterable)\n          .build();\n    }\n    spreadIterable(frame, data, iterable);\n  }\n\n  private void cannotHaveMember(VmClass clazz, ObjectMember member) {\n    CompilerDirectives.transferToInterpreter();\n    var builder = exceptionBuilder();\n    if (member.isEntry()) {\n      builder.evalError(\"objectCannotHaveSpreadEntry\", clazz);\n    } else if (member.isElement()) {\n      builder.evalError(\"objectCannotHaveSpreadElement\", clazz);\n    } else {\n      builder.evalError(\"objectCannotHaveSpreadProperty\", clazz);\n    }\n    var exception = builder.build();\n    // add the member's source section to the stack trace if it exists.\n    if (member.getHeaderSection().isAvailable()) {\n      exception\n          .getInsertedStackFrames()\n          .put(\n              getRootNode().getCallTarget(),\n              VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));\n    }\n    throw exception;\n  }\n\n  @Override\n  protected VmException duplicateDefinition(Object key, ObjectMember member) {\n    CompilerDirectives.transferToInterpreter();\n    var exception =\n        exceptionBuilder()\n            .evalError(\n                member.isProp() ? \"objectSpreadDuplicateProperty\" : \"objectSpreadDuplicateEntry\",\n                key instanceof Identifier ? key : new ProgramValue(\"\", key))\n            .build();\n    if (member.getHeaderSection().isAvailable()) {\n      exception\n          .getInsertedStackFrames()\n          .put(\n              getRootNode().getCallTarget(),\n              VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));\n    }\n    throw exception;\n  }\n\n  private ObjectMember createMember(ObjectMember prototype, Object value) {\n    // If there is a constant value that is equal to the target value, we can use as-is.\n    // Otherwise, initialize a new member and initialize a constant value for it\n    // (effectively cached).\n    if (prototype.getConstantValue() == value) {\n      return prototype;\n    }\n    var result =\n        new ObjectMember(\n            prototype.getSourceSection(),\n            prototype.getHeaderSection(),\n            prototype.getModifiers(),\n            prototype.getNameOrNull(),\n            prototype.getQualifiedName());\n    result.initConstantValue(value);\n    return result;\n  }\n\n  private void spreadIterable(VirtualFrame frame, ObjectData data, Iterable<?> iterable) {\n    var iterator = new TruffleIterator<>(iterable);\n    while (iterator.hasNext()) {\n      var elem = iterator.next();\n      var member = VmUtils.createSyntheticObjectElement(String.valueOf(data.length()), elem);\n      data.addElement(frame, member, this);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/GeneratorWhenNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.BaseModule;\n\npublic final class GeneratorWhenNode extends GeneratorMemberNode {\n  @Child private ExpressionNode conditionNode;\n  @Children private final GeneratorMemberNode[] thenNodes;\n  @Children private final GeneratorMemberNode[] elseNodes;\n\n  public GeneratorWhenNode(\n      SourceSection sourceSection,\n      ExpressionNode conditionNode,\n      GeneratorMemberNode[] thenNodes,\n      GeneratorMemberNode[] elseNodes) {\n\n    super(sourceSection, false);\n    this.conditionNode = conditionNode;\n    this.thenNodes = thenNodes;\n    this.elseNodes = elseNodes;\n  }\n\n  @Override\n  @ExplodeLoop\n  public void execute(VirtualFrame frame, Object parent, ObjectData data) {\n    boolean condition;\n    try {\n      condition = conditionNode.executeBoolean(frame);\n    } catch (UnexpectedResultException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .typeMismatch(e.getResult(), BaseModule.getBooleanClass())\n          .withSourceSection(conditionNode.getSourceSection())\n          .build();\n    }\n    for (var node : condition ? thenNodes : elseNodes) {\n      node.execute(frame, parent, data);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/ObjectData.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.VmObject;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.EconomicMaps;\n\n/** Data collected by {@link GeneratorObjectLiteralNode} to generate a `VmObject`. */\npublic final class ObjectData {\n  /** The object's members. */\n  private final EconomicMap<Object, ObjectMember> members;\n\n  /**\n   * The frames that were active when `members` were generated. Only a subset of members have their\n   * frames stored ({@link GeneratorMemberNode#isFrameStored}). Frames are stored in\n   * `owner.extraStorage` and retrieved by `RestoreForBindingsNode` when members are executed\n   */\n  private final EconomicMap<Object, MaterializedFrame> generatorFrames;\n\n  /** The object's number of elements. */\n  private int length;\n\n  ObjectData(int parentLength) {\n    // optimize for memory usage by not estimating minimum size\n    members = EconomicMaps.create();\n    generatorFrames = EconomicMaps.create();\n    length = parentLength;\n  }\n\n  UnmodifiableEconomicMap<Object, ObjectMember> members() {\n    return members;\n  }\n\n  int length() {\n    return length;\n  }\n\n  boolean hasNoMembers() {\n    return members.isEmpty();\n  }\n\n  boolean hasNoGeneratorFrames() {\n    return generatorFrames.isEmpty();\n  }\n\n  void addElement(VirtualFrame frame, ObjectMember member, GeneratorMemberNode node) {\n    addMember(frame, (long) length, member, node);\n    length += 1;\n  }\n\n  void addProperty(VirtualFrame frame, ObjectMember member, GeneratorMemberNode node) {\n    addMember(frame, member.getName(), member, node);\n  }\n\n  void addMember(VirtualFrame frame, Object key, ObjectMember member, GeneratorMemberNode node) {\n    if (EconomicMaps.put(members, key, member) != null) {\n      CompilerDirectives.transferToInterpreter();\n      throw node.duplicateDefinition(key, member);\n    }\n    if (node.isFrameStored) {\n      EconomicMaps.put(generatorFrames, key, frame.materialize());\n    }\n  }\n\n  <T extends VmObject> T storeGeneratorFrames(T object) {\n    object.setExtraStorage(generatorFrames);\n    return object;\n  }\n\n  static MaterializedFrame getGeneratorFrame(VirtualFrame frame) {\n    @SuppressWarnings(\"unchecked\")\n    var map = (EconomicMap<Object, MaterializedFrame>) VmUtils.getOwner(frame).getExtraStorage();\n    var result = EconomicMaps.get(map, VmUtils.getMemberKey(frame));\n    assert result != null;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/RestoreForBindingsNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.generator;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n/**\n * Restores for-generator variable bindings when a member generated by a for-generator is executed.\n */\npublic final class RestoreForBindingsNode extends ExpressionNode {\n  private @Child ExpressionNode child;\n\n  public RestoreForBindingsNode(ExpressionNode child) {\n    super(child.getSourceSection());\n    this.child = child;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var generatorFrame = ObjectData.getGeneratorFrame(frame);\n    var numSlots = frame.getFrameDescriptor().getNumberOfSlots();\n    // This value is constant and could be a constructor argument.\n    var startSlot = generatorFrame.getFrameDescriptor().getNumberOfSlots() - numSlots;\n    assert startSlot >= 0;\n    // Copy locals that are for-generator variables into this frame.\n    // Slots before `startSlot` (if any) are function arguments\n    // and must not be copied to preserve scoping rules.\n    VmUtils.copyLocals(generatorFrame, startSlot, frame, 0, numSlots);\n    return child.executeGeneric(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/generator/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.generator;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/AmendFunctionNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport com.oracle.truffle.api.frame.*;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.SimpleRootNode;\nimport org.pkl.core.ast.frame.ReadFrameSlotNodeGen;\nimport org.pkl.core.ast.member.FunctionNode;\nimport org.pkl.core.ast.member.Lambda;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class AmendFunctionNode extends PklNode {\n  private final boolean isCustomThisScope;\n  private final PklRootNode initialFunctionRootNode;\n  @CompilationFinal private int customThisSlot = -1;\n\n  public AmendFunctionNode(ObjectLiteralNode hostNode, TypeNode[] parameterTypeNodes) {\n    super(hostNode.getSourceSection());\n\n    isCustomThisScope = hostNode.isCustomThisScope;\n\n    var builder = FrameDescriptor.newBuilder();\n    var hostDescriptor = hostNode.parametersDescriptor;\n    int[] parameterSlots;\n    if (hostDescriptor != null) {\n      parameterSlots = new int[hostDescriptor.getNumberOfSlots()];\n      for (int i = 0; i < hostDescriptor.getNumberOfSlots(); i++) {\n        var slotKind = hostDescriptor.getSlotKind(i);\n        var slot = builder.addSlot(slotKind, hostDescriptor.getSlotName(i), null);\n        parameterSlots[i] = slot;\n      }\n    } else {\n      parameterSlots = new int[0];\n    }\n    var objectToAmendSlot = builder.addSlot(FrameSlotKind.Object, null, null);\n    var frameDescriptor = builder.build();\n\n    var subsequentFunctionRootNode =\n        new SimpleRootNode(\n            hostNode.language,\n            frameDescriptor,\n            sourceSection,\n            hostNode.qualifiedScopeName + \".<function>\",\n            new AmendFunctionBodyNode(\n                sourceSection,\n                hostNode.copy(\n                    ReadFrameSlotNodeGen.create(\n                        hostNode.getParentNode().getSourceSection(), objectToAmendSlot)),\n                parameterSlots,\n                objectToAmendSlot,\n                null));\n\n    if (parameterSlots.length > 0) {\n      var parameterCount = hostNode.parameterTypes.length;\n      initialFunctionRootNode =\n          new FunctionNode(\n              hostNode.language,\n              frameDescriptor,\n              new Lambda(sourceSection, hostNode.qualifiedScopeName + \".<function>\"),\n              parameterCount,\n              parameterTypeNodes,\n              null,\n              true,\n              new AmendFunctionBodyNode(\n                  sourceSection,\n                  hostNode.copy(\n                      ReadFrameSlotNodeGen.create(\n                          hostNode.getParentNode().getSourceSection(), objectToAmendSlot)),\n                  parameterSlots,\n                  objectToAmendSlot,\n                  subsequentFunctionRootNode));\n    } else {\n      initialFunctionRootNode = subsequentFunctionRootNode;\n    }\n  }\n\n  public VmFunction execute(VirtualFrame frame, VmFunction functionToAmend) {\n    if (isCustomThisScope && customThisSlot == -1) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      customThisSlot = VmUtils.findCustomThisSlot(frame);\n    }\n    return new VmFunction(\n        frame.materialize(),\n        isCustomThisScope ? frame.getAuxiliarySlot(customThisSlot) : VmUtils.getReceiver(frame),\n        functionToAmend.getParameterCount(),\n        initialFunctionRootNode,\n        new Context(functionToAmend, null));\n  }\n\n  private static class AmendFunctionBodyNode extends ExpressionNode {\n    @Child private ExpressionNode amendObjectNode;\n    private final int[] parameterSlots;\n    private final int valueToAmendSlot;\n    private final @Nullable PklRootNode nextFunctionRootNode;\n\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    public AmendFunctionBodyNode(\n        SourceSection sourceSection,\n        ExpressionNode amendObjectNode,\n        int[] parameterSlots,\n        int valueToAmendSlot,\n        @Nullable PklRootNode nextFunctionRootNode) {\n\n      super(sourceSection);\n      this.amendObjectNode = amendObjectNode;\n      this.parameterSlots = parameterSlots;\n      this.valueToAmendSlot = valueToAmendSlot;\n      this.nextFunctionRootNode = nextFunctionRootNode;\n    }\n\n    @Override\n    @ExplodeLoop\n    public Object executeGeneric(VirtualFrame frame) {\n      var frameArguments = frame.getArguments();\n      var currentFunction = (VmFunction) VmUtils.getOwner(frame);\n      var context = (Context) currentFunction.getExtraStorage();\n      if (nextFunctionRootNode != null) {\n        context = context.setFrame(frame.materialize());\n      }\n      var functionToAmend = context.function;\n\n      var arguments = new Object[frameArguments.length];\n      arguments[0] = functionToAmend.getThisValue();\n      arguments[1] = functionToAmend;\n      System.arraycopy(frameArguments, 2, arguments, 2, frameArguments.length - 2);\n\n      var valueToAmend = callNode.call(functionToAmend.getCallTarget(), arguments);\n      if (!(valueToAmend instanceof VmFunction newFunctionToAmend)) {\n        var materializedFrame = context.frame;\n        if (materializedFrame != null) {\n          for (var slot : parameterSlots) {\n            // could use WriteFrameSlotNode and Read(Other)FrameSlotNode to specialize\n            frame.setObject(slot, materializedFrame.getValue(slot));\n          }\n        }\n        frame.setObject(valueToAmendSlot, valueToAmend);\n        return amendObjectNode.executeGeneric(frame);\n      }\n\n      return currentFunction.copy(\n          newFunctionToAmend.getParameterCount(),\n          nextFunctionRootNode,\n          context.setFunction(newFunctionToAmend));\n    }\n  }\n\n  @ValueType\n  private static class Context {\n    public final VmFunction function;\n    public final @Nullable MaterializedFrame frame;\n\n    public Context(VmFunction function, @Nullable MaterializedFrame frame) {\n      this.function = function;\n      this.frame = frame;\n    }\n\n    public Context setFunction(VmFunction newFunction) {\n      return new Context(newFunction, frame);\n    }\n\n    public Context setFrame(MaterializedFrame newFrame) {\n      return new Context(function, newFrame);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/AmendModuleNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.ModuleInfo;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\n\npublic abstract class AmendModuleNode extends SpecializedObjectLiteralNode {\n  @Children private final ExpressionNode[] annotationNodes;\n  private final ModuleInfo moduleInfo;\n\n  public AmendModuleNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      ExpressionNode[] annotationNodes,\n      EconomicMap<Object, ObjectMember> properties,\n      ModuleInfo moduleInfo) {\n\n    super(sourceSection, language, \"\", false, null, new UnresolvedTypeNode[0], properties);\n    this.annotationNodes = annotationNodes;\n    this.moduleInfo = moduleInfo;\n  }\n\n  public ModuleInfo getModuleInfo() {\n    return moduleInfo;\n  }\n\n  @Override\n  @TruffleBoundary\n  protected AmendModuleNode copy(ExpressionNode newParentNode) {\n    throw exceptionBuilder().unreachableCode().build();\n  }\n\n  @Specialization\n  protected VmTyped eval(VirtualFrame frame, VmTyped supermodule) {\n    // receiver is empty module object\n    var module = VmUtils.getTypedObjectReceiver(frame);\n\n    if (module == supermodule) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"moduleCannotAmendSelf\", moduleInfo.getModuleName())\n          .build();\n    }\n\n    checkIsValidTypedAmendment(supermodule);\n\n    module.lateInitVmClass(supermodule.getVmClass());\n    module.lateInitParent(supermodule);\n    module.addProperties(members);\n\n    module.setExtraStorage(moduleInfo);\n    moduleInfo.initAnnotations(VmUtils.evaluateAnnotations(frame, annotationNodes));\n\n    return module;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/BytesLiteralNode.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeNode.UInt8TypeAliasTypeNode;\nimport org.pkl.core.ast.type.VmTypeMismatchException;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.LateInit;\n\n@NodeInfo(shortName = \"Bytes()\")\npublic final class BytesLiteralNode extends ExpressionNode {\n  @Children private final ExpressionNode[] elements;\n\n  @Child @LateInit private TypeNode typeNode;\n\n  public BytesLiteralNode(SourceSection sourceSection, ExpressionNode[] elements) {\n    super(sourceSection);\n    this.elements = elements;\n  }\n\n  private TypeNode getTypeNode() {\n    if (typeNode == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      typeNode = new UInt8TypeAliasTypeNode();\n    }\n    return typeNode;\n  }\n\n  @Override\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    var bytes = new byte[elements.length];\n    var typeNode = getTypeNode();\n    for (var i = 0; i < elements.length; i++) {\n      var elem = elements[i];\n      try {\n        var result = (Long) typeNode.execute(frame, elem.executeGeneric(frame));\n        bytes[i] = result.byteValue();\n      } catch (VmTypeMismatchException err) {\n        CompilerDirectives.transferToInterpreter();\n        // optimization: don't create a new stack frame to check the type, but pretend that one\n        // exists.\n        err.putInsertedStackFrame(\n            getRootNode().getCallTarget(),\n            VmUtils.createStackFrame(elem.getSourceSection(), getRootNode().getName()));\n        throw err.toVmException();\n      }\n    }\n    return new VmBytes(bytes);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/CheckIsAnnotationClassNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class CheckIsAnnotationClassNode extends ExpressionNode {\n  @Child private UnresolvedTypeNode unresolvedTypeNode;\n  @Child private @Nullable TypeNode typeNode;\n\n  public CheckIsAnnotationClassNode(UnresolvedTypeNode unresolvedTypeNode) {\n    super(unresolvedTypeNode.getSourceSection());\n    this.unresolvedTypeNode = unresolvedTypeNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (typeNode == null) {\n      // invalidation is done by insert()\n      CompilerDirectives.transferToInterpreter();\n      typeNode = insert(unresolvedTypeNode.execute(frame));\n      unresolvedTypeNode = null;\n    }\n    var clazz = typeNode.getVmClass();\n    if (clazz != null && clazz.isSubclassOf(BaseModule.getAnnotationClass())) {\n      return typeNode.getVmClass();\n    }\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"expectedAnnotationClass\").build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/ConstantEntriesLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.*;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Object literal that contains entries (and possibly properties) but not elements. Additionally,\n * all entry keys are constants. Example: `new foo { [\"one\"] = 1 }`\n */\n// IDEA: don't materialize frames if all members have constant values\n@ImportStatic(BaseModule.class)\npublic abstract class ConstantEntriesLiteralNode extends SpecializedObjectLiteralNode {\n  public ConstantEntriesLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes,\n        members);\n  }\n\n  @Override\n  public ConstantEntriesLiteralNode copy(ExpressionNode newParentNode) {\n    //noinspection ConstantConditions\n    return ConstantEntriesLiteralNodeGen.create(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        null, // copied node no longer has parameters\n        new UnresolvedTypeNode[0], // ditto\n        members,\n        newParentNode);\n  }\n\n  @Specialization(guards = \"checkIsValidMappingAmendment()\")\n  protected VmMapping evalMapping(VirtualFrame frame, VmMapping parent) {\n    return new VmMapping(frame.materialize(), parent, members);\n  }\n\n  @Specialization\n  protected VmDynamic evalDynamic(VirtualFrame frame, VmDynamic parent) {\n    return new VmDynamic(frame.materialize(), parent, members, parent.getLength());\n  }\n\n  @Specialization(guards = \"checkIsValidListingAmendment()\")\n  protected VmListing evalListing(VirtualFrame frame, VmListing parent) {\n    checkMaxListingMemberIndex(parent.getLength());\n    return new VmListing(frame.materialize(), parent, members, parent.getLength());\n  }\n\n  @Specialization\n  protected Object evalNull(VirtualFrame frame, VmNull parent) {\n    // assumes that Graal PE can handle recursive call to same node\n    return executeWithParent(frame, parent.getDefaultValue());\n  }\n\n  @Specialization(guards = \"checkIsValidFunctionAmendment(parent)\")\n  protected VmFunction evalFunction(\n      VirtualFrame frame,\n      VmFunction parent,\n      @Cached(value = \"createAmendFunctionNode(frame)\", neverDefault = true)\n          AmendFunctionNode amendFunctionNode) {\n\n    return amendFunctionNode.execute(frame, parent);\n  }\n\n  @Specialization(guards = {\"parent == getMappingClass()\", \"checkIsValidMappingAmendment()\"})\n  protected VmMapping evalMappingClass(\n      VirtualFrame frame, @SuppressWarnings(\"unused\") VmClass parent) {\n    return new VmMapping(frame.materialize(), BaseModule.getMappingClass().getPrototype(), members);\n  }\n\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected VmDynamic evalDynamicClass(\n      VirtualFrame frame, @SuppressWarnings(\"unused\") VmClass parent) {\n    return new VmDynamic(\n        frame.materialize(), BaseModule.getDynamicClass().getPrototype(), members, 0);\n  }\n\n  @Specialization(\n      guards = {\n        \"parent == getListingClass()\",\n        \"checkIsValidListingAmendment()\",\n        \"checkMaxListingMemberIndex(0)\"\n      })\n  protected void evalListingClass(@SuppressWarnings(\"unused\") VmClass parent) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().unreachableCode().build();\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected void fallback(Object parent) {\n    elementsEntriesFallback(parent, findFirstNonProperty(members), false);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/ElementsEntriesLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Object literal that contains both elements and entries (and possibly properties). Example: `new\n * foo { \"pigeon\", [3] = \"barn owl\" }`\n */\n@ImportStatic(BaseModule.class)\npublic abstract class ElementsEntriesLiteralNode extends SpecializedObjectLiteralNode {\n  private final ObjectMember[] elements;\n  @Children private final ExpressionNode[] keyNodes;\n  private final ObjectMember[] values;\n\n  public ElementsEntriesLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      UnmodifiableEconomicMap<Object, ObjectMember> properties,\n      ObjectMember[] elements,\n      ExpressionNode[] keyNodes,\n      ObjectMember[] values) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes,\n        properties);\n    this.elements = elements;\n    this.keyNodes = keyNodes;\n    this.values = values;\n\n    assert elements.length > 0;\n  }\n\n  @Override\n  protected ElementsEntriesLiteralNode copy(ExpressionNode newParentNode) {\n    //noinspection ConstantConditions\n    return ElementsEntriesLiteralNodeGen.create(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        null, // copied node no longer has parameters\n        new UnresolvedTypeNode[0], // ditto\n        members,\n        elements,\n        keyNodes,\n        values,\n        newParentNode);\n  }\n\n  @Specialization(guards = \"checkIsValidListingAmendment()\")\n  protected VmListing evalListing(VirtualFrame frame, VmListing parent) {\n    return new VmListing(\n        frame.materialize(),\n        parent,\n        createMembers(frame, parent.getLength()),\n        parent.getLength() + elements.length);\n  }\n\n  @Specialization\n  protected VmDynamic evalDynamic(VirtualFrame frame, VmDynamic parent) {\n    return new VmDynamic(\n        frame.materialize(),\n        parent,\n        createMembers(frame, parent.getLength()),\n        parent.getLength() + elements.length);\n  }\n\n  @Specialization\n  protected Object evalNull(VirtualFrame frame, VmNull parent) {\n    // assumes that Graal PE can handle recursive call to same node\n    return executeWithParent(frame, parent.getDefaultValue());\n  }\n\n  @Specialization(guards = \"checkIsValidFunctionAmendment(parent)\")\n  protected VmFunction evalFunction(\n      VirtualFrame frame,\n      VmFunction parent,\n      @Cached(value = \"createAmendFunctionNode(frame)\", neverDefault = true)\n          AmendFunctionNode amendFunctionNode) {\n\n    return amendFunctionNode.execute(frame, parent);\n  }\n\n  @Specialization(guards = {\"parent == getListingClass()\", \"checkIsValidListingAmendment()\"})\n  protected VmListing evalListingClass(\n      VirtualFrame frame, @SuppressWarnings(\"unused\") VmClass parent) {\n\n    return new VmListing(\n        frame.materialize(),\n        BaseModule.getListingClass().getPrototype(),\n        createMembers(frame, 0),\n        elements.length);\n  }\n\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected VmDynamic evalDynamicClass(\n      VirtualFrame frame, @SuppressWarnings(\"unused\") VmClass parent) {\n\n    return new VmDynamic(\n        frame.materialize(),\n        BaseModule.getDynamicClass().getPrototype(),\n        createMembers(frame, 0),\n        elements.length);\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected void fallback(Object parent) {\n    elementsEntriesFallback(parent, elements[0], true);\n  }\n\n  @ExplodeLoop\n  protected UnmodifiableEconomicMap<Object, ObjectMember> createMembers(\n      VirtualFrame frame, int parentLength) {\n    var result =\n        EconomicMaps.<Object, ObjectMember>create(\n            EconomicMaps.size(members) + keyNodes.length + elements.length);\n\n    EconomicMaps.putAll(result, members);\n\n    addListEntries(frame, parentLength, result, keyNodes, values);\n\n    for (var i = 0; i < elements.length; i++) {\n      EconomicMaps.put(result, (long) (parentLength + i), elements[i]);\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/ElementsLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.*;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Object literal that contains elements (and possibly properties) but not entries. Example: `new\n * foo { \"pigeon\" }`\n */\n@ImportStatic(BaseModule.class)\npublic abstract class ElementsLiteralNode extends SpecializedObjectLiteralNode {\n  private final ObjectMember[] elements;\n\n  public ElementsLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      UnmodifiableEconomicMap<Object, ObjectMember> properties,\n      ObjectMember[] elements) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes,\n        properties);\n    this.elements = elements;\n\n    assert elements.length > 0;\n  }\n\n  @Override\n  protected ElementsLiteralNode copy(ExpressionNode newParentNode) {\n    //noinspection ConstantConditions\n    return ElementsLiteralNodeGen.create(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        null, // copied node no longer has parameters\n        new UnresolvedTypeNode[0], // ditto\n        members,\n        elements,\n        newParentNode);\n  }\n\n  @Specialization(guards = \"parent.getLength() == parentLength\")\n  protected VmDynamic evalDynamicCached(\n      VirtualFrame frame,\n      VmDynamic parent,\n      @Cached(\"parent.getLength()\") int parentLength,\n      @Cached(\"createMembers(parentLength)\")\n          UnmodifiableEconomicMap<Object, ObjectMember> members) {\n\n    return new VmDynamic(frame.materialize(), parent, members, parentLength + elements.length);\n  }\n\n  @Specialization\n  protected VmDynamic evalDynamicUncached(VirtualFrame frame, VmDynamic parent) {\n    return new VmDynamic(\n        frame.materialize(),\n        parent,\n        createMembers(parent.getLength()),\n        parent.getLength() + elements.length);\n  }\n\n  @Specialization\n  protected Object evalNull(VirtualFrame frame, VmNull parent) {\n    // assumes that Graal PE can handle recursive call to same node\n    return executeWithParent(frame, parent.getDefaultValue());\n  }\n\n  @Specialization(guards = \"checkIsValidFunctionAmendment(parent)\")\n  protected VmFunction evalFunction(\n      VirtualFrame frame,\n      VmFunction parent,\n      @Cached(value = \"createAmendFunctionNode(frame)\", neverDefault = true)\n          AmendFunctionNode amendFunctionNode) {\n\n    return amendFunctionNode.execute(frame, parent);\n  }\n\n  @Specialization(\n      guards = {\n        \"parent == getListingClass()\",\n        \"checkIsValidListingAmendment()\",\n        \"checkMaxListingMemberIndex(0)\"\n      })\n  protected VmListing evalListingClass(\n      VirtualFrame frame,\n      @SuppressWarnings(\"unused\") VmClass parent,\n      @Cached(value = \"createMembers(0)\", neverDefault = true)\n          UnmodifiableEconomicMap<Object, ObjectMember> members) {\n\n    return new VmListing(\n        frame.materialize(), BaseModule.getListingClass().getPrototype(), members, elements.length);\n  }\n\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected VmDynamic evalDynamicClass(\n      VirtualFrame frame,\n      @SuppressWarnings(\"unused\") VmClass parent,\n      @Cached(value = \"createMembers(0)\", neverDefault = true)\n          UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    return new VmDynamic(\n        frame.materialize(), BaseModule.getDynamicClass().getPrototype(), members, elements.length);\n  }\n\n  @Specialization(\n      guards = {\n        \"checkIsValidListingAmendment()\",\n        \"parent.getLength() == parentLength\",\n        \"checkMaxListingMemberIndex(parentLength)\"\n      })\n  protected VmListing evalListingCached(\n      VirtualFrame frame,\n      VmListing parent,\n      @Cached(\"parent.getLength()\") int parentLength,\n      @Cached(\"createMembers(parentLength)\")\n          UnmodifiableEconomicMap<Object, ObjectMember> properties) {\n\n    return new VmListing(frame.materialize(), parent, properties, parentLength + elements.length);\n  }\n\n  @Specialization(guards = \"checkIsValidListingAmendment()\")\n  protected VmListing evalListingUncached(VirtualFrame frame, VmListing parent) {\n    checkMaxListingMemberIndex(parent.getLength());\n    return new VmListing(\n        frame.materialize(),\n        parent,\n        createMembers(parent.getLength()),\n        parent.getLength() + elements.length);\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected void fallback(Object parent) {\n    elementsEntriesFallback(parent, elements[0], true);\n  }\n\n  // offset element keys according to parentLength\n  protected UnmodifiableEconomicMap<Object, ObjectMember> createMembers(int parentLength) {\n    var result =\n        EconomicMaps.<Object, ObjectMember>create(EconomicMaps.size(members) + elements.length);\n    EconomicMaps.putAll(result, members);\n    for (var i = 0; i < elements.length; i++) {\n      EconomicMaps.put(result, (long) (parentLength + i), elements[i]);\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/EmptyObjectLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\n\n/** Object literal node with empty body. Example: RHS of `x = foo {}` */\n@ImportStatic(BaseModule.class)\n@NodeChild(value = \"parentNode\", type = ExpressionNode.class)\npublic abstract class EmptyObjectLiteralNode extends ExpressionNode {\n  protected EmptyObjectLiteralNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  protected abstract ExpressionNode getParentNode();\n\n  @Specialization\n  protected Object eval(VmClass parent) {\n    if (parent.isListingClass()) {\n      return VmListing.empty();\n    }\n\n    if (parent.isMappingClass()) {\n      return VmMapping.empty();\n    }\n\n    if (parent.isDynamicClass()) {\n      return VmDynamic.empty();\n    }\n\n    VmUtils.checkIsInstantiable(parent, getParentNode());\n    return parent.getPrototype();\n  }\n\n  @Specialization\n  protected Object eval(VmObjectLike parent) {\n    return parent;\n  }\n\n  @Specialization\n  protected Object eval(VmNull parent) {\n    return parent.getDefaultValue();\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected void fallback(Object parent) {\n    assert !(parent instanceof VmClass);\n    VmUtils.checkIsInstantiable(VmUtils.getClass(parent), getParentNode());\n    throw exceptionBuilder().unreachableCode().build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/EntriesLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.*;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Object literal that contains entries (and possibly properties) but not elements. Additionally, at\n * least one entry key is not a constant. (If all keys are constants, ConstantEntriesLiteralNode is\n * used.) Example: `foo { [\"on\" + \"e\"] = 1 }`\n */\n// IDEA: don't materialize frames if all members have constant values\n@ImportStatic(BaseModule.class)\npublic abstract class EntriesLiteralNode extends SpecializedObjectLiteralNode {\n  @Children private final ExpressionNode[] keyNodes;\n  private final ObjectMember[] values;\n\n  protected EntriesLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      // contains local properties and default property (if present)\n      // does *not* contain entries with constant keys to maintain definition order of entries\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      ExpressionNode[] keyNodes,\n      ObjectMember[] values) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes,\n        members);\n    this.keyNodes = keyNodes;\n    this.values = values;\n\n    assert keyNodes.length > 0;\n    assert keyNodes.length == values.length;\n  }\n\n  @Override\n  public EntriesLiteralNode copy(ExpressionNode newParentNode) {\n    //noinspection ConstantConditions\n    return EntriesLiteralNodeGen.create(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        null, // copied node no longer has parameters\n        new UnresolvedTypeNode[0], // ditto\n        members,\n        keyNodes,\n        values,\n        newParentNode);\n  }\n\n  @Specialization(guards = \"checkIsValidMappingAmendment()\")\n  protected VmMapping evalMapping(VirtualFrame frame, VmMapping parent) {\n    return new VmMapping(frame.materialize(), parent, createMapMembers(frame));\n  }\n\n  @Specialization\n  protected VmDynamic evalDynamic(VirtualFrame frame, VmDynamic parent) {\n    return new VmDynamic(frame.materialize(), parent, createMapMembers(frame), parent.getLength());\n  }\n\n  @Specialization(guards = \"checkIsValidListingAmendment()\")\n  protected VmListing evalListing(VirtualFrame frame, VmListing parent) {\n    return new VmListing(\n        frame.materialize(),\n        parent,\n        createListMembers(frame, parent.getLength()),\n        // `[x] = y` overrides existing element and doesn't increase length\n        parent.getLength());\n  }\n\n  @Specialization\n  protected Object evalNull(VirtualFrame frame, VmNull parent) {\n    // assumes that Graal PE can handle recursive call to same node\n    return executeWithParent(frame, parent.getDefaultValue());\n  }\n\n  @Specialization(guards = \"checkIsValidFunctionAmendment(parent)\")\n  protected VmFunction evalFunction(\n      VirtualFrame frame,\n      VmFunction parent,\n      @Cached(value = \"createAmendFunctionNode(frame)\", neverDefault = true)\n          AmendFunctionNode amendFunctionNode) {\n\n    return amendFunctionNode.execute(frame, parent);\n  }\n\n  @Specialization(guards = {\"parent == getMappingClass()\", \"checkIsValidMappingAmendment()\"})\n  protected VmMapping evalMappingClass(\n      VirtualFrame frame, @SuppressWarnings(\"unused\") VmClass parent) {\n    return new VmMapping(\n        frame.materialize(), BaseModule.getMappingClass().getPrototype(), createMapMembers(frame));\n  }\n\n  @Specialization(guards = \"parent == getDynamicClass()\")\n  protected VmDynamic evalDynamicClass(\n      VirtualFrame frame, @SuppressWarnings(\"unused\") VmClass parent) {\n    return new VmDynamic(\n        frame.materialize(),\n        BaseModule.getDynamicClass().getPrototype(),\n        createMapMembers(frame),\n        0);\n  }\n\n  @Specialization(guards = {\"parent == getListingClass()\", \"checkIsValidListingAmendment()\"})\n  protected void evalListingClass(@SuppressWarnings(\"unused\") VmClass parent) {\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"cannotAddElementWithEntrySyntax\")\n        .withSourceSection(keyNodes[0].getSourceSection())\n        .build();\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(Object parent) {\n    return elementsEntriesFallback(parent, values[0], false);\n  }\n\n  @ExplodeLoop\n  protected EconomicMap<Object, ObjectMember> createMapMembers(VirtualFrame frame) {\n    var result =\n        EconomicMaps.<Object, ObjectMember>create(EconomicMaps.size(members) + keyNodes.length);\n    EconomicMaps.putAll(result, members);\n\n    for (var i = 0; i < keyNodes.length; i++) {\n      var key = keyNodes[i].executeGeneric(frame);\n      var value = values[i];\n      var previousValue = EconomicMaps.put(result, key, value);\n      if (previousValue != null) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"duplicateDefinition\", new ProgramValue(\"\", key))\n            .withSourceSection(value.getHeaderSection())\n            .build();\n      }\n    }\n\n    return result;\n  }\n\n  protected UnmodifiableEconomicMap<Object, ObjectMember> createListMembers(\n      VirtualFrame frame, int parentLength) {\n    var result =\n        EconomicMaps.<Object, ObjectMember>create(EconomicMaps.size(members) + keyNodes.length);\n    EconomicMaps.putAll(result, members);\n    addListEntries(frame, parentLength, result, keyNodes, values);\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/FalseLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeInfo(shortName = \"false\")\npublic final class FalseLiteralNode extends ExpressionNode implements ConstantNode {\n  public FalseLiteralNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Boolean executeGeneric(VirtualFrame frame) {\n    return Boolean.FALSE;\n  }\n\n  @Override\n  public boolean executeBoolean(VirtualFrame frame) {\n    return false;\n  }\n\n  @Override\n  public Boolean getValue() {\n    return Boolean.FALSE;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/FloatLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeInfo(shortName = \"float\")\npublic final class FloatLiteralNode extends ExpressionNode implements ConstantNode {\n  private final double value;\n\n  public FloatLiteralNode(SourceSection sourceSection, double value) {\n    super(sourceSection);\n    this.value = value;\n  }\n\n  @Override\n  public Double executeGeneric(VirtualFrame frame) {\n    return value;\n  }\n\n  @Override\n  public double executeFloat(VirtualFrame frame) {\n    return value;\n  }\n\n  @Override\n  public Double getValue() {\n    return value;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/FunctionLiteralNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.FunctionNode;\nimport org.pkl.core.ast.member.UnresolvedFunctionNode;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class FunctionLiteralNode extends ExpressionNode {\n  private @Child UnresolvedFunctionNode unresolvedFunctionNode;\n  private final boolean isCustomThisScope;\n\n  @CompilationFinal private @Nullable FunctionNode functionNode;\n  @CompilationFinal private int customThisSlot = -1;\n\n  public FunctionLiteralNode(\n      SourceSection sourceSection, UnresolvedFunctionNode functionNode, boolean isCustomThisScope) {\n\n    super(sourceSection);\n    this.unresolvedFunctionNode = functionNode;\n    this.isCustomThisScope = isCustomThisScope;\n  }\n\n  @Override\n  public VmFunction executeGeneric(VirtualFrame frame) {\n    if (functionNode == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      functionNode = unresolvedFunctionNode.execute(frame);\n      if (isCustomThisScope) {\n        customThisSlot = VmUtils.findCustomThisSlot(frame);\n      }\n    }\n\n    return new VmFunction(\n        frame.materialize(),\n        isCustomThisScope ? frame.getAuxiliarySlot(customThisSlot) : VmUtils.getReceiver(frame),\n        functionNode.getParameterCount(),\n        functionNode,\n        null);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/IntLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeInfo(shortName = \"int\")\npublic final class IntLiteralNode extends ExpressionNode implements ConstantNode {\n  private final long value;\n\n  public IntLiteralNode(SourceSection sourceSection, long value) {\n    super(sourceSection);\n    this.value = value;\n  }\n\n  @Override\n  public Long executeGeneric(VirtualFrame frame) {\n    return value;\n  }\n\n  @Override\n  public long executeInt(VirtualFrame frame) {\n    return value;\n  }\n\n  @Override\n  public Long getValue() {\n    return value;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/InterpolatedStringLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeInfo(shortName = \"istr\")\npublic final class InterpolatedStringLiteralNode extends ExpressionNode {\n  @Children private final ExpressionNode[] parts;\n\n  public InterpolatedStringLiteralNode(SourceSection sourceSection, ExpressionNode[] parts) {\n    super(sourceSection);\n    this.parts = parts;\n  }\n\n  @Override\n  @ExplodeLoop\n  public String executeGeneric(VirtualFrame frame) {\n    var builder = VmUtils.createBuilder();\n    for (var part : parts) {\n      VmUtils.appendToBuilder(builder, (String) part.executeGeneric(frame));\n    }\n    return VmUtils.builderToString(builder);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/ListLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmList;\n\n@NodeInfo(shortName = \"List()\")\npublic final class ListLiteralNode extends ExpressionNode {\n  @Children private final ExpressionNode[] elements;\n\n  public ListLiteralNode(SourceSection sourceSection, ExpressionNode[] elements) {\n    super(sourceSection);\n    this.elements = elements;\n  }\n\n  @Override\n  @ExplodeLoop\n  public VmList executeGeneric(VirtualFrame frame) {\n    var builder = VmList.EMPTY.builder();\n    for (var element : elements) {\n      builder.add(element.executeGeneric(frame));\n    }\n\n    return builder.build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/MapLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmMap;\n\n@NodeInfo(shortName = \"Map()\")\npublic final class MapLiteralNode extends ExpressionNode {\n  @Children private final ExpressionNode[] keysAndValues;\n\n  public MapLiteralNode(SourceSection sourceSection, ExpressionNode[] keysAndValues) {\n    super(sourceSection);\n    this.keysAndValues = keysAndValues;\n  }\n\n  @Override\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    assert keysAndValues.length % 2 == 0;\n\n    var builder = VmMap.builder();\n    for (var i = 0; i < keysAndValues.length; i += 2) {\n      var key = keysAndValues[i].executeGeneric(frame);\n      var value = keysAndValues[i + 1].executeGeneric(frame);\n      builder.add(key, value);\n    }\n\n    return builder.build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/ObjectLiteralNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Idempotent;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\n// IDEA: don't materialize frames when all members are constants\n@NodeChild(value = \"parentNode\", type = ExpressionNode.class)\npublic abstract class ObjectLiteralNode extends ExpressionNode {\n  protected final VmLanguage language;\n  protected final String qualifiedScopeName;\n  protected final boolean isCustomThisScope;\n  protected final @Nullable FrameDescriptor parametersDescriptor;\n  @Children protected final UnresolvedTypeNode[] parameterTypes;\n\n  public ObjectLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes) {\n\n    super(sourceSection);\n    this.language = language;\n    this.qualifiedScopeName = qualifiedScopeName;\n    this.isCustomThisScope = isCustomThisScope;\n    this.parametersDescriptor = parametersDescriptor;\n    this.parameterTypes = parameterTypes;\n  }\n\n  protected abstract ExpressionNode getParentNode();\n\n  protected abstract Object executeWithParent(VirtualFrame frame, Object parent);\n\n  protected abstract ObjectLiteralNode copy(ExpressionNode newParentNode);\n\n  protected final AmendFunctionNode createAmendFunctionNode(VirtualFrame frame) {\n    var resolvedParameterTypes =\n        parametersDescriptor == null\n            ? new TypeNode[0]\n            : VmUtils.resolveParameterTypes(frame, parametersDescriptor, parameterTypes);\n    return new AmendFunctionNode(this, resolvedParameterTypes);\n  }\n\n  @Idempotent\n  protected static boolean isTypedObjectClass(VmClass clazz) {\n    return !(clazz.isListingClass() || clazz.isMappingClass() || clazz.isDynamicClass());\n  }\n\n  protected final boolean checkIsValidFunctionAmendment(VmFunction parent) {\n    var length = parameterTypes.length;\n    if (length > 0 && length != parent.getParameterCount()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"wrongFunctionAmendmentParameterCount\", length, parent.getParameterCount())\n          .withSourceSection(getParentNode().getSourceSection())\n          .build();\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/PropertiesLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n/** Object literal that contains properties but not elements or entries. */\n// IDEA: don't materialize frame when all members are constants\npublic abstract class PropertiesLiteralNode extends SpecializedObjectLiteralNode {\n  public PropertiesLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      UnmodifiableEconomicMap<Object, ObjectMember> properties) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes,\n        properties);\n  }\n\n  @Override\n  public PropertiesLiteralNode copy(ExpressionNode newParentNode) {\n    //noinspection ConstantConditions\n    return PropertiesLiteralNodeGen.create(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        null, // copied node no longer has parameters\n        new UnresolvedTypeNode[0], // ditto\n        members,\n        newParentNode);\n  }\n\n  @Specialization(\n      guards = {\"parentClass == parent.getVmClass()\", \"checkIsValidTypedAmendment(parentClass)\"})\n  protected Object evalTypedObjectCached(\n      VirtualFrame frame, VmTyped parent, @Cached(\"parent.getVmClass()\") VmClass parentClass) {\n\n    assert isTypedObjectClass(parentClass);\n\n    return new VmTyped(frame.materialize(), parent, parentClass, members);\n  }\n\n  @Specialization(guards = {\"checkIsValidTypedAmendment(parent)\"})\n  protected Object evalTypedObjectUncached(VirtualFrame frame, VmTyped parent) {\n    assert isTypedObjectClass(parent.getVmClass());\n\n    return new VmTyped(frame.materialize(), parent, parent.getVmClass(), members);\n  }\n\n  @Specialization\n  protected Object evalDynamic(VirtualFrame frame, VmDynamic parent) {\n    return new VmDynamic(frame.materialize(), parent, members, parent.getLength());\n  }\n\n  @Specialization(guards = \"checkIsValidListingAmendment()\")\n  protected Object evalListing(VirtualFrame frame, VmListing parent) {\n    return new VmListing(frame.materialize(), parent, members, parent.getLength());\n  }\n\n  @ExplodeLoop\n  @Specialization(guards = \"checkIsValidMappingAmendment()\")\n  protected Object evalMapping(VirtualFrame frame, VmMapping parent) {\n    return new VmMapping(frame.materialize(), parent, members);\n  }\n\n  @Specialization\n  protected Object evalNull(VirtualFrame frame, VmNull parent) {\n    // assumes that Graal PE can handle recursive call to same node\n    return executeWithParent(frame, parent.getDefaultValue());\n  }\n\n  // Ultimately, this lambda or a lambda returned from it will call one of the other\n  // specializations,\n  // which will perform the \"isValidXYZ\" guard check.\n  // That said, to flag nonsensical amendments early, this specialization could have a guard to\n  // check\n  // that this amendment is at least one of a valid listing, mapping, or object amendment (modulo\n  // parameters).\n  @Specialization(guards = \"checkIsValidFunctionAmendment(parent)\")\n  protected VmFunction evalFunction(\n      VirtualFrame frame,\n      VmFunction parent,\n      @Cached(value = \"createAmendFunctionNode(frame)\", neverDefault = true)\n          AmendFunctionNode amendFunctionNode) {\n\n    return amendFunctionNode.execute(frame, parent);\n  }\n\n  @Specialization(\n      guards = {\n        \"parent == cachedParent\",\n        \"isTypedObjectClass(cachedParent)\",\n        \"checkIsValidTypedAmendment(cachedParent)\"\n      })\n  protected VmTyped evalTypedObjectClassCached(\n      VirtualFrame frame,\n      VmClass parent,\n      @Cached(\"parent\") @SuppressWarnings(\"unused\") VmClass cachedParent) {\n    return new VmTyped(frame.materialize(), parent.getPrototype(), parent, members);\n  }\n\n  @Specialization(\n      guards = {\n        \"parent == cachedParent\",\n        \"cachedParent.isListingClass()\",\n        \"checkIsValidListingAmendment()\"\n      })\n  protected VmListing evalListingClass(\n      VirtualFrame frame,\n      @SuppressWarnings(\"unused\") VmClass parent,\n      @Cached(\"parent\") @SuppressWarnings(\"unused\") VmClass cachedParent) {\n\n    return new VmListing(\n        frame.materialize(), BaseModule.getListingClass().getPrototype(), members, 0);\n  }\n\n  @Specialization(\n      guards = {\n        \"parent == cachedParent\",\n        \"cachedParent.isMappingClass()\",\n        \"checkIsValidMappingAmendment()\"\n      })\n  protected VmMapping evalMappingClass(\n      VirtualFrame frame,\n      @SuppressWarnings(\"unused\") VmClass parent,\n      @Cached(\"parent\") @SuppressWarnings(\"unused\") VmClass cachedParent) {\n\n    return new VmMapping(frame.materialize(), BaseModule.getMappingClass().getPrototype(), members);\n  }\n\n  @Specialization(guards = {\"parent == cachedParent\", \"cachedParent.isDynamicClass()\"})\n  protected VmDynamic evalDynamicClass(\n      VirtualFrame frame,\n      @SuppressWarnings(\"unused\") VmClass parent,\n      @Cached(\"parent\") @SuppressWarnings(\"unused\") VmClass cachedParent) {\n\n    return new VmDynamic(\n        frame.materialize(), BaseModule.getDynamicClass().getPrototype(), members, 0);\n  }\n\n  // slow but very unlikely to occur in practice\n  @Specialization\n  protected Object evalClassUncached(VirtualFrame frame, VmClass parent) {\n    if (parent.isListingClass()) {\n      checkIsValidListingAmendment();\n      checkMaxListingMemberIndex(0);\n      return evalListingClass(frame, parent, parent);\n    }\n\n    if (parent.isMappingClass()) {\n      checkIsValidMappingAmendment();\n      return evalMappingClass(frame, parent, parent);\n    }\n\n    if (parent.isDynamicClass()) {\n      return new VmDynamic(\n          frame.materialize(), BaseModule.getDynamicClass().getPrototype(), members, 0);\n    }\n\n    checkIsValidTypedAmendment(parent);\n    return new VmTyped(frame.materialize(), parent.getPrototype(), parent, members);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected void fallback(Object parent) {\n    // should always throw\n    checkIsValidTypedAmendment(parent);\n\n    throw exceptionBuilder().unreachableCode().build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/SetLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmSet;\n\n@NodeInfo(shortName = \"Set()\")\npublic final class SetLiteralNode extends ExpressionNode {\n  @Children private final ExpressionNode[] elements;\n\n  public SetLiteralNode(SourceSection sourceSection, ExpressionNode[] elements) {\n    super(sourceSection);\n    this.elements = elements;\n  }\n\n  @Override\n  @ExplodeLoop\n  public VmSet executeGeneric(VirtualFrame frame) {\n    var builder = VmSet.EMPTY.builder();\n    for (var element : elements) {\n      builder.add(element.executeGeneric(frame));\n    }\n\n    return builder.build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/SpecializedObjectLiteralNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Idempotent;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Base class for object literal nodes specialized for a certain mix of property/entry/element\n * definitions. The motivation for this specialization is to do as much object construction and\n * validation work as possible only once or a few times (via `@Cached`) per object literal, instead\n * of repeating it for every object instantiation.\n */\npublic abstract class SpecializedObjectLiteralNode extends ObjectLiteralNode {\n  public SpecializedObjectLiteralNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      String qualifiedScopeName,\n      boolean isCustomThisScope,\n      @Nullable FrameDescriptor parametersDescriptor,\n      UnresolvedTypeNode[] parameterTypes,\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n\n    super(\n        sourceSection,\n        language,\n        qualifiedScopeName,\n        isCustomThisScope,\n        parametersDescriptor,\n        parameterTypes);\n    this.members = members;\n  }\n\n  protected final UnmodifiableEconomicMap<Object, ObjectMember> members;\n\n  @CompilationFinal protected long maxListingMemberIndex = Long.MIN_VALUE;\n  @CompilationFinal private boolean checkedIsValidMappingAmendment;\n\n  // only runs once per VmClass (which often means once per PropertiesLiteralNode)\n  // unless an XYZUncached specialization is active\n  @TruffleBoundary\n  @Idempotent\n  protected boolean checkIsValidTypedAmendment(Object parent) {\n    var parentClass = parent instanceof VmClass vmClass ? vmClass : VmUtils.getClass(parent);\n    VmUtils.checkIsInstantiable(parentClass, getParentNode());\n\n    for (var member : EconomicMaps.getValues(members)) {\n      if (member.isLocal()) continue;\n\n      var memberName = member.getName();\n      if (!parentClass.hasProperty(memberName)) {\n        throw exceptionBuilder()\n            .cannotFindProperty(parentClass.getPrototype(), memberName, false, false)\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n      var classProperty = parentClass.getProperty(memberName);\n      if (classProperty != null && classProperty.isConstOrFixed()) {\n        // tailor error message based on whether an amends declaration is used or not\n        // (i.e. `friends {}` vs. `friends = new {}`)\n        // an amends declaration's body section includes the header section, whereas normal property\n        // assignment's body section is the section after the equal sign.\n        var isAmendsDeclaration =\n            member.getHeaderSection().getCharIndex() == member.getBodySection().getCharIndex();\n        var errMsg = isAmendsDeclaration ? \"cannotAmendFixedProperty\" : \"cannotAssignFixedProperty\";\n        if (classProperty.isConst()) {\n          errMsg = isAmendsDeclaration ? \"cannotAmendConstProperty\" : \"cannotAssignConstProperty\";\n        }\n        throw exceptionBuilder()\n            .evalError(errMsg, memberName)\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n    }\n\n    if (parametersDescriptor != null) {\n      throw exceptionBuilder()\n          .evalError(\"objectAmendmentCannotHaveParameters\")\n          .withLocation(getParentNode())\n          .build();\n    }\n\n    return true;\n  }\n\n  @SuppressWarnings(\"SameReturnValue\")\n  @TruffleBoundary\n  @Idempotent\n  protected final boolean checkIsValidListingAmendment() {\n    if (maxListingMemberIndex != Long.MIN_VALUE) return true;\n\n    var cursor = EconomicMaps.getEntries(members);\n    long maxIndex = -1;\n\n    while (cursor.advance()) {\n      var member = cursor.getValue();\n      if (member.isLocal()) continue;\n\n      var memberName = member.getNameOrNull();\n      if (memberName == null) {\n        var key = cursor.getKey();\n\n        if (!(key instanceof Long)) {\n          CompilerDirectives.transferToInterpreter();\n          throw exceptionBuilder()\n              .evalError(\"wrongListingKeyType\", new ProgramValue(\"\", VmUtils.getClass(key)))\n              .withSourceSection(member.getHeaderSection())\n              .build();\n        }\n\n        long index = (long) key;\n        if (index < 0) {\n          // defer handling of negative index to checkMaxListingMemberIndex() (gives more uniform\n          // error messages)\n          maxIndex = Long.MAX_VALUE;\n          break;\n        } else if (index > maxIndex) {\n          maxIndex = index;\n        }\n      } else if (memberName != Identifier.DEFAULT) {\n        throw exceptionBuilder()\n            .evalError(\"objectCannotHaveProperty\", BaseModule.getListingClass())\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n    }\n\n    if (parametersDescriptor != null) {\n      throw exceptionBuilder()\n          .evalError(\"listingAmendmentCannotHaveParameters\")\n          .withSourceSection(getParentNode().getSourceSection())\n          .build();\n    }\n\n    maxListingMemberIndex = maxIndex;\n    return true;\n  }\n\n  @SuppressWarnings(\"SameReturnValue\")\n  @TruffleBoundary\n  @Idempotent\n  protected final boolean checkIsValidMappingAmendment() {\n    if (checkedIsValidMappingAmendment) return true;\n\n    for (var member : EconomicMaps.getValues(members)) {\n      if (member.isLocal()) continue;\n\n      var memberName = member.getNameOrNull();\n      if (memberName == null) continue;\n\n      if (memberName != Identifier.DEFAULT) {\n        throw exceptionBuilder()\n            .evalError(\"objectCannotHaveProperty\", BaseModule.getMappingClass())\n            .withSourceSection(member.getHeaderSection())\n            .build();\n      }\n    }\n\n    if (parametersDescriptor != null) {\n      throw exceptionBuilder()\n          .evalError(\"mappingAmendmentCannotHaveParameters\")\n          .withSourceSection(getParentNode().getSourceSection())\n          .build();\n    }\n\n    checkedIsValidMappingAmendment = true;\n    return true;\n  }\n\n  @Idempotent\n  protected final boolean checkMaxListingMemberIndex(int parentLength) {\n    assert maxListingMemberIndex != Long.MIN_VALUE;\n    if (maxListingMemberIndex < parentLength) return true;\n\n    CompilerDirectives.transferToInterpreter();\n    var cursor = EconomicMaps.getEntries(members);\n    while (cursor.advance()) {\n      var key = cursor.getKey();\n      if (!(key instanceof Long)) continue;\n\n      var index = (long) key;\n      if (index < 0 || index >= parentLength) {\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", index, 0, parentLength - 1)\n            .withSourceSection(cursor.getValue().getHeaderSection())\n            .build();\n      }\n    }\n\n    throw exceptionBuilder().unreachableCode().build();\n  }\n\n  @ExplodeLoop\n  protected void addListEntries(\n      VirtualFrame frame,\n      int parentLength,\n      EconomicMap<Object, ObjectMember> result,\n      ExpressionNode[] keyNodes,\n      ObjectMember[] values) {\n\n    for (var i = 0; i < keyNodes.length; i++) {\n      long index;\n      try {\n        index = keyNodes[i].executeInt(frame);\n      } catch (UnexpectedResultException e) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"wrongListingKeyType\", new ProgramValue(\"\", VmUtils.getClass(e.getResult())))\n            .withSourceSection(keyNodes[i].getSourceSection())\n            .build();\n      }\n\n      var value = values[i];\n\n      // use same error messages as in checkIsValidListingAmendment and checkMaxListingMemberIndex\n      if (index < 0 || index >= parentLength) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", index, 0, parentLength - 1)\n            .withSourceSection(value.getHeaderSection())\n            .build();\n      }\n\n      if (EconomicMaps.put(result, index, value) != null) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"duplicateDefinition\", new ProgramValue(\"\", index))\n            .withSourceSection(value.getHeaderSection())\n            .build();\n      }\n    }\n  }\n\n  @TruffleBoundary\n  protected @Nullable ObjectMember findFirstNonProperty(\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    var cursor = EconomicMaps.getEntries(members);\n    while (cursor.advance()) {\n      var member = cursor.getValue();\n      if (member.getNameOrNull() == null) return member;\n    }\n    return null;\n  }\n\n  @TruffleBoundary\n  protected @Nullable ObjectMember findFirstNonDefaultProperty(\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    var cursor = EconomicMaps.getEntries(members);\n    while (cursor.advance()) {\n      var member = cursor.getValue();\n      if (member.getNameOrNull() != null && member.getNameOrNull() != Identifier.DEFAULT)\n        return member;\n    }\n    return null;\n  }\n\n  @TruffleBoundary\n  protected Object elementsEntriesFallback(\n      Object parent, @Nullable ObjectMember firstElemOrEntry, boolean isElementsOnly) {\n    var parentIsClass = parent instanceof VmClass;\n    var parentClass = parentIsClass ? (VmClass) parent : VmUtils.getClass(parent);\n    VmUtils.checkIsInstantiable(parentClass, getParentNode());\n\n    var property = findFirstNonDefaultProperty(members);\n    if (property != null\n        && (parentClass == BaseModule.getListingClass()\n            || parentClass == BaseModule.getMappingClass())) {\n      throw exceptionBuilder()\n          .evalError(\"objectCannotHaveProperty\", parentClass)\n          .withSourceSection(property.getHeaderSection())\n          .build();\n    }\n\n    assert firstElemOrEntry != null;\n\n    if (isTypedObjectClass(parentClass)\n        || (isElementsOnly && parentClass == BaseModule.getMappingClass())) {\n      throw exceptionBuilder()\n          .evalError(\n              isElementsOnly ? \"objectCannotHaveElement\" : \"objectCannotHaveEntry\", parentClass)\n          .withSourceSection(firstElemOrEntry.getHeaderSection())\n          .build();\n    }\n\n    throw exceptionBuilder().unreachableCode().build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/TrueLiteralNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.literal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeInfo(shortName = \"true\")\npublic final class TrueLiteralNode extends ExpressionNode implements ConstantNode {\n  public TrueLiteralNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Boolean executeGeneric(VirtualFrame frame) {\n    return Boolean.TRUE;\n  }\n\n  @Override\n  public boolean executeBoolean(VirtualFrame frame) {\n    return true;\n  }\n\n  @Override\n  public Boolean getValue() {\n    return Boolean.TRUE;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/literal/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.literal;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InferParentWithinMethodNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode.UnknownTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.LateInit;\n\n/** Infers the parent to amend in `function createPerson(): Person = new { ... }`. */\npublic final class InferParentWithinMethodNode extends ExpressionNode {\n  private final VmLanguage language;\n  private final Identifier methodName;\n  @Child private ExpressionNode ownerNode;\n  @CompilationFinal @LateInit private Object inferredParent;\n\n  public InferParentWithinMethodNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      Identifier methodName,\n      ExpressionNode ownerNode) {\n\n    super(sourceSection);\n    this.language = language;\n    this.methodName = methodName;\n    this.ownerNode = ownerNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (inferredParent != null) return inferredParent;\n\n    // remaining code only runs first time this node is executed\n    // (assuming evaluation isn't continued despite errors)\n\n    CompilerDirectives.transferToInterpreter();\n\n    var owner = (VmObjectLike) ownerNode.executeGeneric(frame);\n    assert owner.isPrototype();\n\n    var method = owner.getVmClass().getDeclaredMethod(methodName);\n    assert method != null;\n\n    var returnTypeNode = method.getReturnTypeNode();\n    if (returnTypeNode == null || returnTypeNode instanceof UnknownTypeNode) {\n      inferredParent = VmDynamic.empty();\n      ownerNode = null;\n      return inferredParent;\n    }\n\n    var returnTypeDefaultValue =\n        returnTypeNode.createDefaultValue(\n            frame, language, method.getHeaderSection(), method.getQualifiedName());\n    if (returnTypeDefaultValue != null) {\n      inferredParent = returnTypeDefaultValue;\n      ownerNode = null;\n      return inferredParent;\n    }\n\n    throw exceptionBuilder().evalError(\"cannotInferParent\").build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InferParentWithinObjectMethodNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMethodNode;\nimport org.pkl.core.ast.type.TypeNode.UnknownTypeNode;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.util.LateInit;\n\n/** Infers the parent to amend in `obj { local function createPerson(): Person = new { ... } }`. */\npublic final class InferParentWithinObjectMethodNode extends ExpressionNode {\n  private final VmLanguage language;\n  private final Identifier localMethodName;\n  @Child private ExpressionNode ownerNode;\n  @CompilationFinal @LateInit private Object inferredParent;\n\n  public InferParentWithinObjectMethodNode(\n      SourceSection sourceSection,\n      VmLanguage language,\n      Identifier localMethodName,\n      ExpressionNode ownerNode) {\n\n    super(sourceSection);\n    this.language = language;\n    this.localMethodName = localMethodName;\n    this.ownerNode = ownerNode;\n\n    assert localMethodName.isLocalMethod();\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (inferredParent != null) return inferredParent;\n\n    // remaining code only runs first time this node is executed\n    // (assuming evaluation isn't continued despite errors)\n\n    CompilerDirectives.transferToInterpreter();\n\n    var owner = (VmObjectLike) ownerNode.executeGeneric(frame);\n\n    var member = owner.getMember(localMethodName);\n    assert member != null;\n\n    var methodNode = (ObjectMethodNode) member.getMemberNode();\n    assert methodNode != null;\n\n    var returnTypeNode = methodNode.getReturnTypeNode();\n    if (returnTypeNode == null || returnTypeNode instanceof UnknownTypeNode) {\n      inferredParent = VmDynamic.empty();\n      ownerNode = null;\n      return inferredParent;\n    }\n\n    Object defaultReturnTypeValue =\n        returnTypeNode.createDefaultValue(\n            frame, language, member.getHeaderSection(), member.getQualifiedName());\n    if (defaultReturnTypeValue != null) {\n      inferredParent = defaultReturnTypeValue;\n      ownerNode = null;\n      return inferredParent;\n    }\n\n    throw exceptionBuilder().evalError(\"cannotInferParent\").build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InferParentWithinPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\n\n/** Infers the parent to amend in `x = new { ... }`. */\n@NodeChild(value = \"ownerNode\", type = ExpressionNode.class)\npublic abstract class InferParentWithinPropertyNode extends ExpressionNode {\n  private final Identifier ownPropertyName;\n  private final boolean isLocalProperty;\n\n  protected InferParentWithinPropertyNode(SourceSection sourceSection, Identifier ownPropertyName) {\n    super(sourceSection);\n    this.ownPropertyName = ownPropertyName;\n    isLocalProperty = ownPropertyName.isLocalProp();\n  }\n\n  @Specialization(guards = \"!owner.isPrototype()\")\n  protected Object evalTypedObject(VirtualFrame frame, VmTyped owner) {\n    if (isLocalProperty) {\n      return getLocalPropertyDefaultValue(frame, owner);\n    }\n\n    try {\n      var result = VmUtils.readMemberOrNull(owner.getPrototype(), ownPropertyName, false);\n      assert result != null : \"every property has a default\";\n      return result;\n    } catch (VmUndefinedValueException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"cannotInferParent\").build();\n    }\n  }\n\n  @Specialization(guards = \"owner.isPrototype()\")\n  protected Object evalPrototype(VirtualFrame frame, VmTyped owner) {\n    var property =\n        isLocalProperty\n            ?\n            // only getDeclaredProperty() returns local properties\n            owner.getVmClass().getDeclaredProperty(ownPropertyName)\n            :\n            // only getProperty() returns aggregated type information if property type is specified\n            // in a superclass\n            owner.getVmClass().getProperty(ownPropertyName);\n    assert property != null;\n\n    var typeNode = property.getTypeNode();\n    if (typeNode == null || typeNode.isUnknownType()) return VmDynamic.empty();\n\n    var result = typeNode.getDefaultValue(frame);\n    if (result != null) return result;\n\n    // no default exists for this property type\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"cannotInferParent\").build();\n  }\n\n  @Specialization\n  protected Object eval(VirtualFrame frame, @SuppressWarnings(\"unused\") VmDynamic owner) {\n    if (isLocalProperty) {\n      return getLocalPropertyDefaultValue(frame, owner);\n    }\n\n    return VmDynamic.empty();\n  }\n\n  @Specialization\n  protected Object eval(VirtualFrame frame, @SuppressWarnings(\"unused\") VmListing owner) {\n    if (isLocalProperty) {\n      return getLocalPropertyDefaultValue(frame, owner);\n    }\n\n    assert ownPropertyName == Identifier.DEFAULT;\n    // return `VmListing.default`\n    return VmUtils.readMember(BaseModule.getListingClass().getPrototype(), ownPropertyName);\n  }\n\n  @Specialization\n  protected Object eval(VirtualFrame frame, @SuppressWarnings(\"unused\") VmMapping owner) {\n    if (isLocalProperty) {\n      return getLocalPropertyDefaultValue(frame, owner);\n    }\n\n    assert ownPropertyName == Identifier.DEFAULT;\n    // return `VmMapping.default`\n    return VmUtils.readMember(BaseModule.getMappingClass().getPrototype(), ownPropertyName);\n  }\n\n  private Object getLocalPropertyDefaultValue(VirtualFrame frame, VmObjectLike owner) {\n    assert isLocalProperty;\n\n    var member = owner.getMember(ownPropertyName);\n    assert member != null;\n\n    var defaultValue = member.getLocalPropertyDefaultValue(frame);\n    if (defaultValue != null) return defaultValue;\n\n    // no default exists for this property type\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"cannotInferParent\").build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodDirectNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ClassMethod;\nimport org.pkl.core.runtime.VmObjectLike;\n\n/** A non-virtual (\"direct\") method call. */\npublic final class InvokeMethodDirectNode extends ExpressionNode {\n  private final VmObjectLike owner;\n  @Child private ExpressionNode receiverNode;\n  @Children private final ExpressionNode[] argumentNodes;\n\n  @Child private DirectCallNode callNode;\n\n  public InvokeMethodDirectNode(\n      SourceSection sourceSection,\n      ClassMethod method,\n      ExpressionNode receiverNode,\n      ExpressionNode[] argumentNodes) {\n\n    super(sourceSection);\n    this.owner = method.getOwner();\n    this.receiverNode = receiverNode;\n    this.argumentNodes = argumentNodes;\n\n    callNode = DirectCallNode.create(method.getCallTarget(sourceSection));\n  }\n\n  @Override\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    var args = new Object[2 + argumentNodes.length];\n    args[0] = receiverNode.executeGeneric(frame);\n    args[1] = owner;\n    for (var i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    return callNode.call(args);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodLexicalNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.frame.Frame;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n/**\n * A non-virtual method call whose call target is in the lexical scope of the call site. Mainly used\n * for calling `local` methods.\n */\npublic final class InvokeMethodLexicalNode extends ExpressionNode {\n  @Children private final ExpressionNode[] argumentNodes;\n  private final int levelsUp;\n\n  @Child private DirectCallNode callNode;\n\n  InvokeMethodLexicalNode(\n      SourceSection sourceSection,\n      CallTarget callTarget,\n      int levelsUp,\n      ExpressionNode[] argumentNodes) {\n\n    super(sourceSection);\n    this.levelsUp = levelsUp;\n    this.argumentNodes = argumentNodes;\n\n    callNode = DirectCallNode.create(callTarget);\n  }\n\n  @Override\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    var args = new Object[2 + argumentNodes.length];\n    var enclosingFrame = getEnclosingFrame(frame);\n    args[0] = VmUtils.getReceiver(enclosingFrame);\n    args[1] = VmUtils.getOwner(enclosingFrame);\n    for (var i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    return callNode.call(args);\n  }\n\n  @ExplodeLoop\n  private Frame getEnclosingFrame(VirtualFrame frame) {\n    if (levelsUp == 0) return frame;\n\n    var owner = VmUtils.getOwner(frame);\n    for (var i = 1; i < levelsUp; i++) {\n      owner = owner.getEnclosingOwner();\n      assert owner != null;\n    }\n    return owner.getEnclosingFrame();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodVirtualNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Cached.Exclusive;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.instrumentation.GenerateWrapper;\nimport com.oracle.truffle.api.instrumentation.ProbeNode;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberLookupMode;\nimport org.pkl.core.ast.internal.GetClassNode;\nimport org.pkl.core.ast.member.ClassMethod;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmFunction;\n\n/** A virtual method call. */\n@SuppressWarnings(\"DuplicatedCode\")\n@ImportStatic(Identifier.class)\n@NodeChild(value = \"receiverNode\", type = ExpressionNode.class)\n@NodeChild(value = \"receiverClassNode\", type = GetClassNode.class, executeWith = \"receiverNode\")\n@GenerateWrapper\npublic abstract class InvokeMethodVirtualNode extends ExpressionNode {\n  protected final Identifier methodName;\n  @Children private final ExpressionNode[] argumentNodes;\n  private final MemberLookupMode lookupMode;\n  private final boolean needsConst;\n\n  protected InvokeMethodVirtualNode(\n      SourceSection sourceSection,\n      Identifier methodName,\n      ExpressionNode[] argumentNodes,\n      MemberLookupMode lookupMode,\n      boolean needsConst) {\n\n    super(sourceSection);\n    this.methodName = methodName;\n    this.argumentNodes = argumentNodes;\n    this.lookupMode = lookupMode;\n    this.needsConst = needsConst;\n  }\n\n  protected InvokeMethodVirtualNode(\n      SourceSection sourceSection,\n      Identifier methodName,\n      ExpressionNode[] argumentNodes,\n      MemberLookupMode lookupMode) {\n    this(sourceSection, methodName, argumentNodes, lookupMode, false);\n  }\n\n  /**\n   * When only using this execute method, pass `null` for `receiverNode` and `receiverClassNode` to\n   * {@link InvokeMethodVirtualNodeGen#create}.\n   */\n  public abstract Object executeWith(VirtualFrame frame, Object value, VmClass clazz);\n\n  /** Intrinsifies `FunctionN.apply()` calls. */\n  @ExplodeLoop\n  @Specialization(guards = {\"methodName == APPLY\", \"receiver.getCallTarget() == cachedCallTarget\"})\n  protected Object evalFunctionCached(\n      VirtualFrame frame,\n      VmFunction receiver,\n      @SuppressWarnings(\"unused\") VmClass receiverClass,\n      @Cached(\"receiver.getCallTarget()\") @SuppressWarnings(\"unused\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    var args = new Object[2 + argumentNodes.length];\n    args[0] = receiver.getThisValue();\n    args[1] = receiver;\n    for (var i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    return callNode.call(args);\n  }\n\n  /** Intrinsifies `FunctionN.apply()` calls. */\n  @ExplodeLoop\n  @Specialization(guards = \"methodName == APPLY\", replaces = \"evalFunctionCached\")\n  protected Object evalFunction(\n      VirtualFrame frame,\n      VmFunction receiver,\n      @SuppressWarnings(\"unused\") VmClass receiverClass,\n      @Exclusive @Cached(\"create()\") IndirectCallNode callNode) {\n\n    var args = new Object[2 + argumentNodes.length];\n    args[0] = receiver.getThisValue();\n    args[1] = receiver;\n    for (var i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    return callNode.call(receiver.getCallTarget(), args);\n  }\n\n  @ExplodeLoop\n  @Specialization(guards = \"receiverClass == cachedReceiverClass\")\n  protected Object evalCached(\n      VirtualFrame frame,\n      Object receiver,\n      @SuppressWarnings(\"unused\") VmClass receiverClass,\n      @Cached(\"receiverClass\") @SuppressWarnings(\"unused\") VmClass cachedReceiverClass,\n      @Cached(\"resolveMethod(receiverClass)\") ClassMethod method,\n      @Cached(\"create(method.getCallTarget(sourceSection))\") DirectCallNode callNode) {\n\n    var args = new Object[2 + argumentNodes.length];\n    args[0] = receiver;\n    args[1] = method.getOwner();\n    for (var i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    return callNode.call(args);\n  }\n\n  @ExplodeLoop\n  @Specialization(replaces = \"evalCached\")\n  protected Object eval(\n      VirtualFrame frame,\n      Object receiver,\n      VmClass receiverClass,\n      @Exclusive @Cached(\"create()\") IndirectCallNode callNode) {\n\n    var method = resolveMethod(receiverClass);\n    var args = new Object[2 + argumentNodes.length];\n    args[0] = receiver;\n    args[1] = method.getOwner();\n    for (var i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    // Deprecation should not report here (getCallTarget(sourceSection)), as this happens for each\n    // and every call.\n    return callNode.call(method.getCallTarget(), args);\n  }\n\n  protected ClassMethod resolveMethod(VmClass receiverClass) {\n    var method = receiverClass.getMethod(methodName);\n    if (method != null) {\n      checkConst(method);\n      return method;\n    }\n\n    CompilerDirectives.transferToInterpreter();\n\n    throw exceptionBuilder()\n        .cannotFindMethod(\n            receiverClass.getPrototype(),\n            methodName,\n            argumentNodes.length,\n            lookupMode != MemberLookupMode.EXPLICIT_RECEIVER)\n        .build();\n  }\n\n  @Override\n  public WrapperNode createWrapper(ProbeNode probe) {\n    return new InvokeMethodVirtualNodeWrapper(\n        sourceSection, methodName, argumentNodes, lookupMode, needsConst, this, probe);\n  }\n\n  private void checkConst(ClassMethod method) {\n    if (needsConst && !method.isConst()) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"methodMustBeConst\", methodName.toString()).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeSuperMethodNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ClassMethod;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmUtils;\n\npublic abstract class InvokeSuperMethodNode extends ExpressionNode {\n  private final Identifier methodName;\n  @Children private final ExpressionNode[] argumentNodes;\n  private final boolean needsConst;\n\n  protected InvokeSuperMethodNode(\n      SourceSection sourceSection,\n      Identifier methodName,\n      ExpressionNode[] argumentNodes,\n      boolean needsConst) {\n\n    super(sourceSection);\n    this.needsConst = needsConst;\n\n    assert !methodName.isLocalMethod();\n\n    this.methodName = methodName;\n    this.argumentNodes = argumentNodes;\n  }\n\n  @ExplodeLoop\n  @Specialization\n  protected Object eval(\n      VirtualFrame frame,\n      @Cached(value = \"findSupermethod(frame)\", neverDefault = true) ClassMethod supermethod,\n      @Cached(\"create(supermethod.getCallTarget(sourceSection))\") DirectCallNode callNode) {\n\n    var args = new Object[2 + argumentNodes.length];\n    args[0] = VmUtils.getReceiverOrNull(frame);\n    args[1] = supermethod.getOwner();\n    for (int i = 0; i < argumentNodes.length; i++) {\n      args[2 + i] = argumentNodes[i].executeGeneric(frame);\n    }\n\n    return callNode.call(args);\n  }\n\n  protected ClassMethod findSupermethod(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    while (owner instanceof VmFunction) {\n      owner = owner.getEnclosingOwner();\n    }\n    assert owner != null : \"VmFunction always has a parent\";\n    assert owner.isPrototype();\n\n    var superclass = owner.getVmClass().getSuperclass();\n    assert superclass != null;\n\n    // note the use of getMethod() rather than getDeclaredMethod()\n    var supermethod = superclass.getMethod(methodName);\n    if (supermethod != null) {\n      if (needsConst && !supermethod.isConst()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder().evalError(\"methodMustBeConst\", methodName.toString()).build();\n      }\n      return supermethod;\n    }\n\n    CompilerDirectives.transferToInterpreter();\n    var parent = owner.getParent();\n    assert parent != null;\n    throw exceptionBuilder()\n        .cannotFindMethod(parent, methodName, argumentNodes.length, false)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/ReadLocalPropertyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerAsserts;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmUtils;\n\n/** Reads a local non-constant property that is known to exist in the lexical scope of this node. */\npublic final class ReadLocalPropertyNode extends ExpressionNode {\n  private final ObjectMember property;\n  private final int levelsUp;\n  @Child private DirectCallNode callNode;\n\n  public ReadLocalPropertyNode(SourceSection sourceSection, ObjectMember property, int levelsUp) {\n\n    super(sourceSection);\n    CompilerAsserts.neverPartOfCompilation();\n\n    this.property = property;\n    this.levelsUp = levelsUp;\n\n    assert property.getNameOrNull() != null;\n    assert property.getConstantValue() == null : \"Use a ConstantNode instead.\";\n\n    callNode = DirectCallNode.create(property.getCallTarget());\n  }\n\n  @Override\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    Object receiver;\n\n    if (levelsUp == 0) {\n      receiver = VmUtils.getReceiver(frame);\n    } else {\n      for (int i = 1; i < levelsUp; i++) {\n        owner = owner.getEnclosingOwner();\n        assert owner != null;\n      }\n\n      receiver = owner.getEnclosingReceiver();\n      owner = owner.getEnclosingOwner();\n    }\n\n    assert receiver instanceof VmObjectLike\n        : \"Assumption: This node isn't used in Truffle ASTs of `external` pkl.base classes whose values aren't VmObject's.\";\n\n    var objReceiver = (VmObjectLike) receiver;\n    var result = objReceiver.getCachedValue(property);\n\n    if (result == null) {\n      result = callNode.call(objReceiver, owner, property.getName());\n      objReceiver.setCachedValue(property, result);\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/ReadPropertyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.*;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberLookupMode;\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n@NodeInfo(shortName = \".\")\n@ImportStatic(BaseModule.class)\n@NodeChild(value = \"receiverNode\", type = ExpressionNode.class)\npublic abstract class ReadPropertyNode extends ExpressionNode {\n  protected final Identifier propertyName;\n  private final MemberLookupMode lookupMode;\n  private final boolean needsConst;\n  @CompilationFinal private boolean isConstChecked;\n\n  protected ReadPropertyNode(\n      SourceSection sourceSection,\n      Identifier propertyName,\n      MemberLookupMode lookupMode,\n      boolean needsConst) {\n\n    super(sourceSection);\n    this.propertyName = propertyName;\n    this.lookupMode = lookupMode;\n    this.needsConst = needsConst;\n\n    assert !propertyName.isLocalProp() : \"Must use ReadLocalPropertyNode for local properties.\";\n  }\n\n  protected ReadPropertyNode(\n      SourceSection sourceSection, Identifier propertyName, boolean needsConst) {\n    this(sourceSection, propertyName, MemberLookupMode.EXPLICIT_RECEIVER, needsConst);\n  }\n\n  protected ReadPropertyNode(SourceSection sourceSection, Identifier propertyName) {\n    this(sourceSection, propertyName, MemberLookupMode.EXPLICIT_RECEIVER, false);\n  }\n\n  // This method effectively covers `VmObject receiver` but is implemented in a more\n  // efficient way. See:\n  // https://www.graalvm.org/22.0/graalvm-as-a-platform/language-implementation-framework/TruffleLibraries/#strategy-2-java-interfaces\n  @Specialization(guards = \"receiver.getClass() == cachedClass\", limit = \"99\")\n  protected Object evalObject(\n      Object receiver,\n      @Cached(\"getVmObjectSubclassOrNull(receiver)\") Class<? extends VmObjectLike> cachedClass,\n      @Cached(\"create()\") IndirectCallNode callNode) {\n\n    var object = cachedClass.cast(receiver);\n    checkConst(object);\n    var result = VmUtils.readMemberOrNull(object, propertyName, true, callNode);\n    if (result != null) return result;\n\n    CompilerDirectives.transferToInterpreter();\n    throw cannotFindProperty(object);\n  }\n\n  // specializations for all other types\n  @Specialization(guards = \"receiver.getClass() == cachedClass\", limit = \"99\")\n  protected Object evalOther(\n      Object receiver,\n      @Cached(\"receiver.getClass()\") @SuppressWarnings(\"unused\") Class<?> cachedClass,\n      @Cached(\"resolveProperty(receiver)\") ClassProperty resolvedProperty,\n      @Cached(\"createCallNode(resolvedProperty)\") DirectCallNode callNode) {\n\n    return callNode.call(receiver, resolvedProperty.getOwner(), resolvedProperty.getName());\n  }\n\n  protected static @Nullable Class<? extends VmObjectLike> getVmObjectSubclassOrNull(Object value) {\n    // OK to perform slow cast here (not a guard)\n    return value instanceof VmObjectLike objectLike ? objectLike.getClass() : null;\n  }\n\n  protected ClassProperty resolveProperty(Object value) {\n    var clazz = VmUtils.getClass(value);\n    var propertyDef = clazz.getProperty(propertyName);\n    if (propertyDef != null) return propertyDef;\n\n    CompilerDirectives.transferToInterpreter();\n    throw cannotFindProperty(clazz.getPrototype());\n  }\n\n  // This method should only be used for standard library properties implemented as nodes.\n  protected static DirectCallNode createCallNode(ClassProperty resolvedProperty) {\n    var callTarget = resolvedProperty.getInitializer().getCallTarget();\n    return DirectCallNode.create(callTarget);\n  }\n\n  @TruffleBoundary\n  private VmException cannotFindProperty(VmObjectLike receiver) {\n    return exceptionBuilder()\n        .cannotFindProperty(\n            receiver, propertyName, true, lookupMode != MemberLookupMode.EXPLICIT_RECEIVER)\n        .build();\n  }\n\n  // only ever need to check once per node because `needsConst` is only true in the case of implicit\n  // receivers inside class (and module) bodies, and the const-ness of a resolved property cannot be\n  // changed by subclasses.\n  private void checkConst(VmObjectLike receiver) {\n    if (needsConst && !isConstChecked) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var property = receiver.getVmClass().getProperty(propertyName);\n      if (property == null) {\n        // fall through; `cannotFindProperty` gets thrown when we attempt to read the property.\n        return;\n      }\n      if (!property.isConst()) {\n        throw exceptionBuilder().evalError(\"propertyMustBeConst\", propertyName.toString()).build();\n      }\n      isConstChecked = true;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/ReadSuperEntryNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1NodeGen;\nimport org.pkl.core.runtime.*;\n\n/**\n * An expression of the form `super[key]`.\n *\n * <p>Note: Reading an entry (`object[key]`) is the subscript operator (SubscriptNode).\n */\npublic class ReadSuperEntryNode extends ExpressionNode {\n  @Child private ExpressionNode keyNode;\n  @Child private IndirectCallNode callNode = IndirectCallNode.create();\n  @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n  public ReadSuperEntryNode(SourceSection sourceSection, ExpressionNode keyNode) {\n    super(sourceSection);\n    this.keyNode = keyNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var key = keyNode.executeGeneric(frame);\n\n    var receiver = VmUtils.getObjectReceiver(frame);\n\n    var initialOwner = VmUtils.getOwner(frame);\n    while (initialOwner instanceof VmFunction) {\n      initialOwner = initialOwner.getEnclosingOwner();\n    }\n    assert initialOwner != null : \"VmFunction always has a parent\";\n    initialOwner = initialOwner.getParent();\n\n    for (var owner = initialOwner; owner != null; owner = owner.getParent()) {\n      var member = owner.getMember(key);\n      if (member == null) continue;\n\n      var constantValue = member.getConstantValue();\n      if (constantValue != null) return constantValue; // TODO: type check\n\n      // caching the result of a super call is tricky (function of both receiver and owner)\n      return callNode.call(\n          member.getCallTarget(),\n          // TODO: should the marker only turn off constraint checking, not overall type checking?\n          receiver,\n          owner,\n          key,\n          VmUtils.SKIP_TYPECHECK_MARKER);\n    }\n\n    // not found -> apply lambda contained in `default` property\n    var defaultFunction =\n        (VmFunction) VmUtils.readMemberOrNull(receiver, Identifier.DEFAULT, callNode);\n    assert defaultFunction != null;\n    return applyLambdaNode.execute(defaultFunction, key);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/ReadSuperPropertyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\n\npublic final class ReadSuperPropertyNode extends ExpressionNode {\n\n  private final Identifier propertyName;\n  private final boolean needsConst;\n\n  @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n  public ReadSuperPropertyNode(\n      SourceSection sourceSection, Identifier propertyName, boolean needsConst) {\n    super(sourceSection);\n    this.propertyName = propertyName;\n    this.needsConst = needsConst;\n  }\n\n  // TODO: how can this be optimized?\n  // (result not cached and expensive lookups on every execution)\n  public Object executeGeneric(VirtualFrame frame) {\n    var receiver = VmUtils.getObjectReceiver(frame);\n\n    // start from the parent of the owner of the `super.<propertyName>` expression\n    // skip any function object owners (same as when resolving `this`)\n    // `receiver` must be passed on unchanged to make sure that overridden properties still take\n    // effect\n    var initialOwner = VmUtils.getOwner(frame);\n    while (initialOwner instanceof VmFunction) {\n      initialOwner = initialOwner.getEnclosingOwner();\n    }\n    assert initialOwner != null : \"VmFunction always has a parent\";\n    initialOwner = initialOwner.getParent();\n\n    for (var owner = initialOwner; owner != null; owner = owner.getParent()) {\n      var property = owner.getMember(propertyName);\n      if (property == null) continue;\n      if (needsConst && !property.isConst()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder().evalError(\"propertyMustBeConst\", propertyName.toString()).build();\n      }\n\n      var constantValue = property.getConstantValue();\n      if (constantValue != null) return constantValue; // TODO: type check\n\n      // caching the result of a super call is tricky (function of both receiver and owner)\n      return callNode.call(\n          property.getCallTarget(),\n          // TODO: should the marker only turn off constraint checking, not overall type checking?\n          receiver,\n          owner,\n          propertyName,\n          VmUtils.SKIP_TYPECHECK_MARKER);\n    }\n\n    // TODO: refine when to return VmDynamic.empty() and when to fail\n    return VmDynamic.empty();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/ResolveMethodNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.member;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantValueNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberLookupMode;\nimport org.pkl.core.ast.builder.ConstLevel;\nimport org.pkl.core.ast.expression.primary.*;\nimport org.pkl.core.ast.internal.GetClassNodeGen;\nimport org.pkl.core.ast.member.Member;\nimport org.pkl.core.runtime.*;\n\n/**\n * Resolves a method name in a method call with implicit receiver, for example `bar` in `x = bar()`\n * (but not `foo.bar()`).\n *\n * <p>A method name can refer to any of the following: - a (potentially `local`) method in the\n * lexical scope - a base module method - a method accessible through `this`\n *\n * <p>This node's task is to make a one-time decision between these alternatives for the call site\n * it represents.\n */\n// TODO: Consider doing this at parse time (cf. ResolveVariableNode).\n@NodeInfo(shortName = \"resolveMethod\")\npublic final class ResolveMethodNode extends ExpressionNode {\n  private final Identifier methodName;\n  private final ExpressionNode[] argumentNodes;\n  // Tells if the call site is inside the base module.\n  private final boolean isBaseModule;\n  // Tells if the call site is inside a [CustomThisScope].\n  private final boolean isCustomThisScope;\n  private final ConstLevel constLevel;\n  private final int constDepth;\n\n  public ResolveMethodNode(\n      SourceSection sourceSection,\n      Identifier methodName,\n      ExpressionNode[] argumentNodes,\n      boolean isBaseModule,\n      boolean isCustomThisScope,\n      ConstLevel constLevel,\n      int constDepth) {\n\n    super(sourceSection);\n\n    this.methodName = methodName;\n    this.argumentNodes = argumentNodes;\n    this.isBaseModule = isBaseModule;\n    this.isCustomThisScope = isCustomThisScope;\n    this.constLevel = constLevel;\n    this.constDepth = constDepth;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return replace(doResolve(VmUtils.getOwner(frame))).executeGeneric(frame);\n  }\n\n  @TruffleBoundary\n  private ExpressionNode doResolve(VmObjectLike initialOwner) {\n    var levelsUp = 0;\n    Identifier localMethodName = methodName.toLocalMethod();\n\n    // Search lexical scope.\n    for (var currOwner = initialOwner;\n        currOwner != null;\n        currOwner = currOwner.getEnclosingOwner()) {\n\n      if (currOwner.isPrototype()) {\n        var localMethod = currOwner.getVmClass().getDeclaredMethod(localMethodName);\n        if (localMethod != null) {\n          assert localMethod.isLocal();\n          checkConst(currOwner, localMethod, levelsUp);\n          return new InvokeMethodLexicalNode(\n              sourceSection, localMethod.getCallTarget(sourceSection), levelsUp, argumentNodes);\n        }\n        var method = currOwner.getVmClass().getDeclaredMethod(methodName);\n        if (method != null) {\n          assert !method.isLocal();\n          checkConst(currOwner, method, levelsUp);\n          if (method.getDeclaringClass().isClosed()) {\n            return new InvokeMethodLexicalNode(\n                sourceSection, method.getCallTarget(sourceSection), levelsUp, argumentNodes);\n          }\n\n          //noinspection ConstantConditions\n          return InvokeMethodVirtualNodeGen.create(\n              sourceSection,\n              methodName,\n              argumentNodes,\n              MemberLookupMode.IMPLICIT_LEXICAL,\n              levelsUp == 0 ? new GetReceiverNode() : new GetEnclosingReceiverNode(levelsUp),\n              GetClassNodeGen.create(null));\n        }\n      } else {\n        var localMethod = currOwner.getMember(localMethodName);\n        if (localMethod != null) {\n          assert localMethod.isLocal();\n          checkConst(currOwner, localMethod, levelsUp);\n          var methodCallTarget =\n              // TODO: is it OK to pass owner as receiver here?\n              // (calls LocalMethodNode, which only resolves types)\n              (CallTarget) localMethod.getCallTarget().call(currOwner, currOwner);\n\n          return new InvokeMethodLexicalNode(\n              sourceSection, methodCallTarget, levelsUp, argumentNodes);\n        }\n      }\n\n      levelsUp += 1;\n    }\n\n    // Search base module (unless call site is itself inside base module).\n    if (!isBaseModule) {\n      var baseModule = BaseModule.getModule();\n      // use `getDeclaredMethod()` so as not to resolve to anything declared in class\n      // pkl.base#Module\n      var method = baseModule.getVmClass().getDeclaredMethod(methodName);\n      if (method != null) {\n        assert !method.isLocal();\n        return new InvokeMethodDirectNode(\n            sourceSection, method, new ConstantValueNode(baseModule), argumentNodes);\n      }\n    }\n\n    // Assuming this method exists at all, it must be a method accessible through `this`.\n    //\n    // Calling a method off implicit `this` needs a const check if the node is not in a const scope\n    // (see ResolveVariableNode for an explanation)\n    //\n    // Edge case: always allow method calls for custom `this` scopes (member predicates, type\n    // constraints)\n    // because they do not refer to a lexical `this`.\n    boolean needsConst = constLevel == ConstLevel.ALL && constDepth == -1 && !isCustomThisScope;\n    //noinspection ConstantConditions\n    return InvokeMethodVirtualNodeGen.create(\n        sourceSection,\n        methodName,\n        argumentNodes,\n        MemberLookupMode.IMPLICIT_THIS,\n        needsConst,\n        VmUtils.createThisNode(VmUtils.unavailableSourceSection(), isCustomThisScope),\n        GetClassNodeGen.create(null));\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private void checkConst(VmObjectLike currOwner, Member method, int levelsUp) {\n    if (!constLevel.isConst()) {\n      return;\n    }\n    var memberIsOutsideConstScope = levelsUp > constDepth;\n    var invalid =\n        switch (constLevel) {\n          case ALL -> memberIsOutsideConstScope && !method.isConst();\n          case MODULE -> currOwner.isModuleObject() && !method.isConst();\n          default -> false;\n        };\n    if (invalid) {\n      throw exceptionBuilder().evalError(\"methodMustBeConst\", methodName.toString()).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/member/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.member;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/CustomThisNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n/** `this` inside `CustomThisScope` (type constraint, object member predicate). */\n@NodeInfo(shortName = \"this\")\npublic final class CustomThisNode extends ExpressionNode {\n  @CompilationFinal private int customThisSlot = -1;\n\n  public CustomThisNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (customThisSlot == -1) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      // deferred until execution time s.t. nodes of inlined type aliases get the right frame slot\n      customThisSlot = VmUtils.findCustomThisSlot(frame);\n    }\n    return frame.getAuxiliarySlot(customThisSlot);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/GetEnclosingOwnerNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\npublic final class GetEnclosingOwnerNode extends ExpressionNode {\n  private final int levelsUp;\n\n  public GetEnclosingOwnerNode(int levelsUp) {\n    this.levelsUp = levelsUp;\n\n    assert levelsUp > 0 : \"shouldn't be using GetEnclosingOwnerNode for levelsUp == 0\";\n  }\n\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    for (var i = 1; i < levelsUp; i++) {\n      owner = owner.getEnclosingOwner();\n      assert owner != null;\n    }\n    var result = owner.getEnclosingOwner();\n    assert result != null;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/GetEnclosingReceiverNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\npublic final class GetEnclosingReceiverNode extends ExpressionNode {\n  private final int levelsUp;\n\n  public GetEnclosingReceiverNode(int levelsUp) {\n    this.levelsUp = levelsUp;\n\n    assert levelsUp > 0 : \"shouldn't be using GetEnclosingReceiverNode for levelsUp == 0\";\n  }\n\n  @ExplodeLoop\n  public Object executeGeneric(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    for (var i = 1; i < levelsUp; i++) {\n      owner = owner.getEnclosingOwner();\n      assert owner != null;\n    }\n    var result = owner.getEnclosingReceiver();\n    assert result != null;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/GetMemberKeyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n/** Returns a `ObjectMember`'s key while executing the corresponding `MemberNode`. */\npublic final class GetMemberKeyNode extends ExpressionNode {\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return VmUtils.getMemberKey(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/GetModuleNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeInfo(shortName = \"module\")\npublic final class GetModuleNode extends ExpressionNode {\n  public GetModuleNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  public Object executeGeneric(VirtualFrame frame) {\n    CompilerDirectives.transferToInterpreter();\n\n    var levelsUp = 0;\n    for (var current = VmUtils.getOwner(frame).getEnclosingOwner();\n        current != null;\n        current = current.getEnclosingOwner()) {\n      levelsUp += 1;\n    }\n\n    return replace(levelsUp == 0 ? new GetReceiverNode() : new GetEnclosingReceiverNode(levelsUp))\n        .executeGeneric(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/GetOwnerNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeInfo(shortName = \"owner\")\npublic final class GetOwnerNode extends ExpressionNode {\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return VmUtils.getOwner(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/GetReceiverNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeInfo(shortName = \"receiver\")\npublic final class GetReceiverNode extends ExpressionNode {\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return VmUtils.getReceiver(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/OuterNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n// TODO: should `outer.x` work like `super.x`? (start search in enclosing scope)\n// TODO: if enclosing scope is lambda scope, can't use `lambda.x` to access lambda param `x`\n@NodeInfo(shortName = \"outer\")\npublic final class OuterNode extends ExpressionNode {\n\n  public OuterNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var outer = VmUtils.getOwner(frame).getEnclosingReceiver();\n    if (outer == null) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"noOuterScope\").build();\n    }\n    return outer;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/ResolveVariableNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantValueNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberLookupMode;\nimport org.pkl.core.ast.builder.ConstLevel;\nimport org.pkl.core.ast.expression.member.ReadLocalPropertyNode;\nimport org.pkl.core.ast.expression.member.ReadPropertyNodeGen;\nimport org.pkl.core.ast.frame.ReadEnclosingFrameSlotNodeGen;\nimport org.pkl.core.ast.frame.ReadFrameSlotNodeGen;\nimport org.pkl.core.ast.member.Member;\nimport org.pkl.core.runtime.*;\n\n/**\n * Resolves a variable name, for example `foo` in `x = foo`.\n *\n * <p>A variable name can refer to any of the following:\n *\n * <ul>\n *   <li>a method/lambda parameter or for-generator/let-expression variable in the lexical scope\n *   <li>a (potentially `local`) property in the lexical scope\n *   <li>a `pkl.base` module property\n *   <li>a property accessible through `this`\n * </ul>\n *\n * <p>This node's task is to make a one-time decision between these alternatives for the call site\n * it represents.\n */\n// TODO: Move this to parse time\n// * more capable because more information is available\n//   and AST customization beyond replacing this node is possible\n// * useful for runtime AST transformations, for example to implement property-based testing\n// * more efficient\n//\n// TODO: In REPL, undo replace if environment changes to make the following work.\n// Perhaps instrumenting this node in REPL would be a good solution.\n// x = { y = z }\n// :force x // Property not found: z\n// z = 1\n// :force x // should work but doesn't\npublic final class ResolveVariableNode extends ExpressionNode {\n  private final Identifier variableName;\n  private final boolean isBaseModule;\n  private final boolean isCustomThisScope;\n  private final ConstLevel constLevel;\n  private final int constDepth;\n\n  public ResolveVariableNode(\n      SourceSection sourceSection,\n      Identifier variableName,\n      boolean isBaseModule,\n      boolean isCustomThisScope,\n      ConstLevel constLevel,\n      int constDepth) {\n    super(sourceSection);\n    this.variableName = variableName;\n    this.isBaseModule = isBaseModule;\n    this.isCustomThisScope = isCustomThisScope;\n    this.constLevel = constLevel;\n    this.constDepth = constDepth;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return replace(doResolve(frame)).executeGeneric(frame);\n  }\n\n  private ExpressionNode doResolve(VirtualFrame frame) {\n    // don't compile this (only runs once)\n    // invalidation will be done by Node.replace() in the caller\n    CompilerDirectives.transferToInterpreter();\n\n    var localPropertyName = variableName.toLocalProperty();\n    var currFrame = frame;\n    var currOwner = VmUtils.getOwner(currFrame);\n    var levelsUp = 0;\n\n    // Search lexical scope for a matching function parameter, for-generator variable, or object\n    // property.\n    do {\n      var slot = findFrameSlot(currFrame, variableName, localPropertyName);\n      if (slot != -1) {\n        return levelsUp == 0\n            ? ReadFrameSlotNodeGen.create(getSourceSection(), slot)\n            : ReadEnclosingFrameSlotNodeGen.create(getSourceSection(), slot, levelsUp);\n      }\n\n      var localMember = currOwner.getMember(localPropertyName);\n      if (localMember != null) {\n        assert localMember.isLocal();\n\n        checkConst(currOwner, localMember, levelsUp);\n\n        var value = localMember.getConstantValue();\n        if (value != null) {\n          // This is the only code path that resolves local constant properties.\n          // Since this code path doesn't call VmObject.getCachedValue(),\n          // there is no point in calling VmObject.setCachedValue() either.\n          return new ConstantValueNode(sourceSection, value);\n        }\n\n        return new ReadLocalPropertyNode(sourceSection, localMember, levelsUp);\n      }\n\n      var member = currOwner.getMember(variableName);\n      if (member != null) {\n        assert !member.isLocal();\n\n        checkConst(currOwner, member, levelsUp);\n\n        // Non-local properties are late-bound, which is why we can't ever return ConstantNode here.\n        //\n        // Assuming this node isn't used in Truffle ASTs of `external` pkl.base classes whose values\n        // aren't VmObject's,\n        // we only ever need VmObject-compatible specializations here.\n        // We don't exploit this fact here but ReadLocalPropertyNode (used above) does.\n        return ReadPropertyNodeGen.create(\n            sourceSection,\n            variableName,\n            MemberLookupMode.IMPLICIT_LEXICAL,\n            // we already checked for const-safety, no need to recheck\n            false,\n            levelsUp == 0 ? new GetReceiverNode() : new GetEnclosingReceiverNode(levelsUp));\n      }\n\n      currFrame = currOwner.getEnclosingFrame();\n      currOwner = VmUtils.getOwnerOrNull(currFrame);\n      levelsUp += 1;\n    } while (currOwner != null);\n\n    // Search base module, unless call site is inside base module.\n    if (!isBaseModule) {\n      var baseModule = BaseModule.getModule();\n\n      var cachedValue = baseModule.getCachedValue(variableName);\n      if (cachedValue != null) {\n        return new ConstantValueNode(sourceSection, cachedValue);\n      }\n\n      var member = baseModule.getMember(variableName);\n\n      if (member != null) {\n        var constantValue = member.getConstantValue();\n        if (constantValue != null) {\n          baseModule.setCachedValue(variableName, constantValue);\n          return new ConstantValueNode(sourceSection, constantValue);\n        }\n\n        var computedValue = member.getCallTarget().call(baseModule, baseModule);\n        baseModule.setCachedValue(variableName, computedValue);\n        return new ConstantValueNode(sourceSection, computedValue);\n      }\n    }\n\n    // Assuming this property exists at all, it must be a property accessible through `this`.\n    ///\n    // Reading a property off of implicit `this` needs a const check if this node is not in a const\n    // scope.\n    // open class A {\n    //   a = 1\n    // }\n    //\n    // class B extends A {\n    //   const b = a // <-- implicit this lookup of `a`, which is not in a const scope.\n    // }\n    //\n    // A const scope exists if there is an object body, for example.\n    //\n    // class B extends A {\n    //   const b = new { a } // <-- `new {}` creates a const scope.\n    // }\n    boolean needsConst = constLevel == ConstLevel.ALL && constDepth == -1 && !isCustomThisScope;\n    return ReadPropertyNodeGen.create(\n        sourceSection,\n        variableName,\n        MemberLookupMode.IMPLICIT_THIS,\n        needsConst,\n        VmUtils.createThisNode(VmUtils.unavailableSourceSection(), isCustomThisScope));\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private void checkConst(VmObjectLike currOwner, Member member, int levelsUp) {\n    if (!constLevel.isConst()) {\n      return;\n    }\n    var memberIsOutsideConstScope = levelsUp > constDepth;\n    var invalid =\n        switch (constLevel) {\n          case ALL -> memberIsOutsideConstScope && !member.isConst();\n          case MODULE -> currOwner.isModuleObject() && !member.isConst();\n          default -> false;\n        };\n    if (invalid) {\n      throw exceptionBuilder().evalError(\"propertyMustBeConst\", variableName.toString()).build();\n    }\n  }\n\n  private static int findFrameSlot(VirtualFrame frame, Object identifier1, Object identifier2) {\n    var descriptor = frame.getFrameDescriptor();\n    // Search backwards. The for-generator implementation exploits this\n    // to shadow a slot by appending a slot with the same name.\n    for (var i = descriptor.getNumberOfSlots() - 1; i >= 0; i--) {\n      var slotName = descriptor.getSlotName(i);\n      if (slotName == identifier1 || slotName == identifier2) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/ThisNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.primary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeInfo(shortName = \"this\")\npublic final class ThisNode extends ExpressionNode {\n  public ThisNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return VmUtils.getReceiver(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/primary/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.primary;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/ternary/IfElseNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.ternary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.nodes.UnexpectedResultException;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.BaseModule;\n\n@NodeInfo(shortName = \"if\")\npublic final class IfElseNode extends ExpressionNode {\n  @Child private ExpressionNode conditionNode;\n\n  @Child private ExpressionNode thenNode;\n\n  @Child private ExpressionNode elseNode;\n\n  public IfElseNode(\n      SourceSection sourceSection,\n      ExpressionNode conditionNode,\n      ExpressionNode thenNode,\n      ExpressionNode elseNode) {\n    super(sourceSection);\n    this.conditionNode = conditionNode;\n    this.thenNode = thenNode;\n    this.elseNode = elseNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return evaluateCondition(frame)\n        ? thenNode.executeGeneric(frame)\n        : elseNode.executeGeneric(frame);\n  }\n\n  private boolean evaluateCondition(VirtualFrame frame) {\n    try {\n      return conditionNode.executeBoolean(frame);\n    } catch (UnexpectedResultException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .typeMismatch(e.getResult(), BaseModule.getBooleanClass())\n          .withSourceSection(conditionNode.getSourceSection())\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/ternary/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.ternary;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/AbstractImportNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.net.URI;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.module.ResolvedModuleKey;\n\npublic abstract class AbstractImportNode extends ExpressionNode {\n  protected final ResolvedModuleKey currentModule;\n  protected final URI importUri;\n\n  AbstractImportNode(SourceSection sourceSection, ResolvedModuleKey currentModule, URI importUri) {\n    super(sourceSection);\n    this.currentModule = currentModule;\n    this.importUri = importUri;\n  }\n\n  public final URI getImportUri() {\n    return importUri;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/AbstractReadNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class AbstractReadNode extends UnaryExpressionNode {\n  protected final ModuleKey currentModule;\n\n  protected AbstractReadNode(SourceSection sourceSection, ModuleKey currentModule) {\n    super(sourceSection);\n    this.currentModule = currentModule;\n  }\n\n  @TruffleBoundary\n  protected final URI parseUri(String resourceUri) {\n    try {\n      return IoUtils.toUri(resourceUri);\n    } catch (URISyntaxException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidResourceUri\", resourceUri)\n          .withHint(e.getReason())\n          .build();\n    }\n  }\n\n  @TruffleBoundary\n  protected final @Nullable Object doRead(String resourceUri, VmContext context, Node readNode) {\n    var resolvedUri = resolveResource(currentModule, resourceUri);\n    return context.getResourceManager().read(resolvedUri, readNode).orElse(null);\n  }\n\n  private URI resolveResource(ModuleKey moduleKey, String resourceUri) {\n    var parsedUri = parseUri(resourceUri);\n    var context = VmContext.get(this);\n    URI resolvedUri;\n    try {\n      resolvedUri = IoUtils.resolve(context.getSecurityManager(), moduleKey, parsedUri);\n    } catch (FileNotFoundException e) {\n      throw exceptionBuilder().evalError(\"cannotFindResource\", resourceUri).build();\n    } catch (URISyntaxException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidResourceUri\", resourceUri)\n          .withHint(e.getReason())\n          .build();\n    } catch (IOException e) {\n      throw exceptionBuilder()\n          .evalError(\"ioErrorReadingResource\", resourceUri)\n          .withHint(e.getMessage())\n          .build();\n    } catch (PackageLoadError | SecurityManagerException e) {\n      throw exceptionBuilder().withCause(e).build();\n    } catch (ExternalReaderProcessException e) {\n      throw exceptionBuilder().evalError(\"externalReaderFailure\").withCause(e).build();\n    }\n\n    if (!resolvedUri.isAbsolute()) {\n      throw exceptionBuilder().evalError(\"cannotHaveRelativeResource\", moduleKey.getUri()).build();\n    }\n    return resolvedUri;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ImportGlobMemberBodyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.Map;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.GlobResolver.ResolvedGlobElement;\n\n/** Used by {@link ReadGlobNode}. */\npublic final class ImportGlobMemberBodyNode extends ExpressionNode {\n  private final VmLanguage language;\n  private final ResolvedModuleKey currentModule;\n\n  public ImportGlobMemberBodyNode(\n      SourceSection sourceSection, VmLanguage language, ResolvedModuleKey currentModule) {\n    super(sourceSection);\n    this.language = language;\n    this.currentModule = currentModule;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var mapping = VmUtils.getOwner(frame);\n    var path = (String) VmUtils.getMemberKey(frame);\n    return importModule(mapping, path);\n  }\n\n  @TruffleBoundary\n  private VmTyped importModule(VmObjectLike mapping, String path) {\n    @SuppressWarnings(\"unchecked\")\n    var globElements = (Map<String, ResolvedGlobElement>) mapping.getExtraStorage();\n    var importUri = globElements.get(path).uri();\n    var context = VmContext.get(this);\n    try {\n      context.getSecurityManager().checkImportModule(currentModule.getUri(), importUri);\n      var moduleToImport = context.getModuleResolver().resolve(importUri, this);\n      return language.loadModule(moduleToImport, this);\n    } catch (SecurityManagerException | PackageLoadError | HttpClientInitException e) {\n      throw exceptionBuilder().withCause(e).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ImportGlobNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.IOException;\nimport java.net.URI;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.ast.member.SharedMemberNode;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmObjectBuilder;\nimport org.pkl.core.util.GlobResolver;\nimport org.pkl.core.util.GlobResolver.InvalidGlobPatternException;\nimport org.pkl.core.util.LateInit;\n\n@NodeInfo(shortName = \"import*\")\npublic class ImportGlobNode extends AbstractImportNode {\n  private final String globPattern;\n  @Child @LateInit private SharedMemberNode memberNode;\n  @CompilationFinal @LateInit private VmMapping cachedResult;\n\n  public ImportGlobNode(\n      SourceSection sourceSection,\n      ResolvedModuleKey currentModule,\n      URI importUri,\n      String globPattern) {\n    super(sourceSection, currentModule, importUri);\n    this.globPattern = globPattern;\n  }\n\n  private SharedMemberNode getMemberNode() {\n    if (memberNode == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var language = VmLanguage.get(this);\n      memberNode =\n          new SharedMemberNode(\n              sourceSection,\n              sourceSection,\n              \"\",\n              language,\n              new FrameDescriptor(),\n              new ImportGlobMemberBodyNode(sourceSection, language, currentModule));\n    }\n    return memberNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (cachedResult != null) return cachedResult;\n\n    CompilerDirectives.transferToInterpreterAndInvalidate();\n    var context = VmContext.get(this);\n    try {\n      var moduleKey = context.getModuleResolver().resolve(importUri, this);\n      if (!moduleKey.isGlobbable()) {\n        throw exceptionBuilder()\n            .evalError(\"cannotGlobUri\", importUri, importUri.getScheme())\n            .build();\n      }\n      var resolvedElements =\n          GlobResolver.resolveGlob(\n              context.getSecurityManager(),\n              moduleKey,\n              currentModule.getOriginal(),\n              currentModule.getUri(),\n              globPattern);\n      var builder = new VmObjectBuilder(resolvedElements.size());\n      for (var entry : resolvedElements.entrySet()) {\n        builder.addEntry(entry.getKey(), getMemberNode());\n      }\n      cachedResult = builder.toMapping(resolvedElements);\n      return cachedResult;\n    } catch (IOException e) {\n      throw exceptionBuilder().evalError(\"ioErrorResolvingGlob\", importUri).withCause(e).build();\n    } catch (SecurityManagerException | HttpClientInitException e) {\n      throw exceptionBuilder().withCause(e).build();\n    } catch (PackageLoadError e) {\n      throw exceptionBuilder().adhocEvalError(e.getMessage()).build();\n    } catch (InvalidGlobPatternException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidGlobPattern\", globPattern)\n          .withHint(e.getMessage())\n          .build();\n    } catch (ExternalReaderProcessException e) {\n      throw exceptionBuilder().evalError(\"externalReaderFailure\").withCause(e).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ImportNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.net.URI;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.util.LateInit;\n\n@NodeInfo(shortName = \"import\")\npublic final class ImportNode extends AbstractImportNode {\n  private final VmLanguage language;\n\n  @CompilationFinal @LateInit private VmTyped importedModule;\n\n  public ImportNode(\n      VmLanguage language,\n      SourceSection sourceSection,\n      ResolvedModuleKey currentModule,\n      URI importUri) {\n    super(sourceSection, currentModule, importUri);\n    this.language = language;\n\n    assert importUri.isAbsolute();\n  }\n\n  public Object executeGeneric(VirtualFrame frame) {\n    if (importedModule == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var context = VmContext.get(this);\n      try {\n        context.getSecurityManager().checkImportModule(currentModule.getUri(), importUri);\n        var moduleToImport = context.getModuleResolver().resolve(importUri, this);\n        importedModule = language.loadModule(moduleToImport, this);\n      } catch (SecurityManagerException | PackageLoadError | HttpClientInitException e) {\n        throw exceptionBuilder().withCause(e).build();\n      }\n    }\n\n    return importedModule;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/LogicalNotNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\n\n@NodeInfo(shortName = \"!\")\npublic abstract class LogicalNotNode extends UnaryExpressionNode {\n  protected LogicalNotNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected boolean eval(boolean operand) {\n    return !operand;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/NonNullNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmNull;\n\n@NodeInfo(shortName = \"!!\")\n// Truffle DSL/codegen is overkill for this node, hence don't extend UnaryExpressionNode\npublic final class NonNullNode extends ExpressionNode {\n  private @Child ExpressionNode operandNode;\n\n  public NonNullNode(SourceSection sourceSection, ExpressionNode operandNode) {\n    super(sourceSection);\n    this.operandNode = operandNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var operand = operandNode.executeGeneric(frame);\n    if (!(operand instanceof VmNull)) return operand;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .evalError(\"expectedNonNullValue\")\n        .withSourceSection(operandNode.getSourceSection())\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/NullPropagatingOperationNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.NullReceiverException;\nimport org.pkl.core.runtime.VmNull;\n\n@NodeInfo(shortName = \"?.\")\npublic final class NullPropagatingOperationNode extends ExpressionNode {\n  @Child private ExpressionNode expressionNode;\n\n  public NullPropagatingOperationNode(SourceSection sourceSection, ExpressionNode expressionNode) {\n    super(sourceSection);\n    this.expressionNode = expressionNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    try {\n      return expressionNode.executeGeneric(frame);\n    } catch (NullReceiverException e) {\n      return VmNull.withoutDefault();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/PropagateNullReceiverNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.NullReceiverException;\nimport org.pkl.core.runtime.VmNull;\n\n@NodeInfo(shortName = \"?.\")\npublic abstract class PropagateNullReceiverNode extends UnaryExpressionNode {\n  protected PropagateNullReceiverNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @SuppressWarnings(\"UnusedParameters\")\n  protected Object eval(VmNull value) {\n    throw NullReceiverException.INSTANCE;\n  }\n\n  @Fallback\n  @Override\n  protected Object fallback(Object notNull) {\n    return notNull;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ReadGlobMemberBodyNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.Map;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.GlobResolver.ResolvedGlobElement;\n\n/** Used by {@link ReadGlobNode}. */\npublic class ReadGlobMemberBodyNode extends ExpressionNode {\n  public ReadGlobMemberBodyNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var mapping = VmUtils.getOwner(frame);\n    var path = (String) VmUtils.getMemberKey(frame);\n    return readResource(mapping, path);\n  }\n\n  private Object readResource(VmObjectLike mapping, String path) {\n    @SuppressWarnings(\"unchecked\")\n    var globElements = (Map<String, ResolvedGlobElement>) mapping.getExtraStorage();\n    var resourceUri = VmUtils.getMapValue(globElements, path).uri();\n    var resource = VmContext.get(this).getResourceManager().read(resourceUri, this).orElse(null);\n    if (resource == null) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"cannotFindResource\", resourceUri).build();\n    }\n    return resource;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ReadGlobNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.IOException;\nimport java.net.URISyntaxException;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.ast.member.SharedMemberNode;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmObjectBuilder;\nimport org.pkl.core.util.GlobResolver;\nimport org.pkl.core.util.GlobResolver.InvalidGlobPatternException;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.LateInit;\n\n@NodeInfo(shortName = \"read*\")\npublic abstract class ReadGlobNode extends AbstractReadNode {\n  private final EconomicMap<String, VmMapping> cachedResults = EconomicMap.create();\n  @Child @LateInit private SharedMemberNode memberNode;\n\n  protected ReadGlobNode(SourceSection sourceSection, ModuleKey currentModule) {\n    super(sourceSection, currentModule);\n  }\n\n  private SharedMemberNode getMemberNode() {\n    if (memberNode == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var language = VmLanguage.get(this);\n      memberNode =\n          new SharedMemberNode(\n              sourceSection,\n              sourceSection,\n              \"\",\n              language,\n              new FrameDescriptor(),\n              new ReadGlobMemberBodyNode(sourceSection));\n    }\n    return memberNode;\n  }\n\n  @Specialization\n  @TruffleBoundary\n  public Object read(String globPattern) {\n    var cachedResult = cachedResults.get(globPattern);\n    if (cachedResult != null) return cachedResult;\n\n    // use same check as for globbed imports (see AstBuilder)\n    if (globPattern.startsWith(\"...\")) {\n      throw exceptionBuilder().evalError(\"cannotGlobTripleDots\").build();\n    }\n    var globUri = parseUri(globPattern);\n    var context = VmContext.get(this);\n    try {\n      var resolvedUri = IoUtils.resolve(context.getSecurityManager(), currentModule, globUri);\n      var reader = context.getResourceManager().getReader(resolvedUri, this);\n      if (!reader.isGlobbable()) {\n        throw exceptionBuilder().evalError(\"cannotGlobUri\", globUri, globUri.getScheme()).build();\n      }\n      var resolvedElements =\n          GlobResolver.resolveGlob(\n              context.getSecurityManager(),\n              reader,\n              currentModule,\n              currentModule.getUri(),\n              globPattern);\n      var builder = new VmObjectBuilder(resolvedElements.size());\n      for (var entry : resolvedElements.entrySet()) {\n        builder.addEntry(entry.getKey(), getMemberNode());\n      }\n      cachedResult = builder.toMapping(resolvedElements);\n      cachedResults.put(globPattern, cachedResult);\n      return cachedResult;\n    } catch (IOException e) {\n      throw exceptionBuilder().evalError(\"ioErrorResolvingGlob\", globPattern).withCause(e).build();\n    } catch (SecurityManagerException | HttpClientInitException | URISyntaxException e) {\n      throw exceptionBuilder().withCause(e).build();\n    } catch (InvalidGlobPatternException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidGlobPattern\", globPattern)\n          .withHint(e.getMessage())\n          .build();\n    } catch (ExternalReaderProcessException e) {\n      throw exceptionBuilder().evalError(\"externalReaderFailure\").withCause(e).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ReadNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.runtime.VmContext;\n\n@NodeInfo(shortName = \"read\")\npublic abstract class ReadNode extends AbstractReadNode {\n  protected ReadNode(SourceSection sourceSection, ModuleKey moduleKey) {\n    super(sourceSection, moduleKey);\n  }\n\n  @Specialization\n  public Object read(String resourceUri) {\n    var result = doRead(resourceUri, VmContext.get(this), this);\n    if (result != null) return result;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().evalError(\"cannotFindResource\", resourceUri).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ReadOrNullNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmNull;\n\n@NodeInfo(shortName = \"read?\")\npublic abstract class ReadOrNullNode extends AbstractReadNode {\n  protected ReadOrNullNode(SourceSection sourceSection, ModuleKey moduleKey) {\n    super(sourceSection, moduleKey);\n  }\n\n  @Specialization\n  public Object read(String resourceUri) {\n    var result = doRead(resourceUri, VmContext.get(this), this);\n    return result != null ? result : VmNull.withoutDefault();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ReadOrNullStdLibNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmNull;\n\n/**\n * Stdlib nodes are shared between engines. As such they can't use a cached [VmContextReference],\n * which is bound to a single engine.\n */\n@NodeInfo(shortName = \"read?\")\npublic abstract class ReadOrNullStdLibNode extends AbstractReadNode {\n  protected ReadOrNullStdLibNode(SourceSection sourceSection, ModuleKey moduleKey) {\n    super(sourceSection, moduleKey);\n  }\n\n  @Specialization\n  public Object read(String resourceUri) {\n    var result = doRead(resourceUri, VmContext.get(this), this);\n    return result != null ? result : VmNull.withoutDefault();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/ThrowNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\n\n@NodeInfo(shortName = \"throw\")\npublic abstract class ThrowNode extends UnaryExpressionNode {\n  protected ThrowNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected Void eval(String message) {\n    throw exceptionBuilder().adhocEvalError(message).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/TraceNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.Arrays;\nimport java.util.stream.Collectors;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\n\npublic final class TraceNode extends ExpressionNode {\n  @Child private ExpressionNode valueNode;\n\n  private static final int MAX_RENDERER_LENGTH = 1000000;\n\n  private final VmValueRenderer compactRenderer = VmValueRenderer.singleLine(MAX_RENDERER_LENGTH);\n  private final VmValueRenderer prettyRenderer = VmValueRenderer.multiLine(Integer.MAX_VALUE);\n\n  public TraceNode(SourceSection sourceSection, ExpressionNode valueNode) {\n    super(sourceSection);\n    this.valueNode = valueNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var value = valueNode.executeGeneric(frame);\n    doTrace(value, VmContext.get(this));\n    return value;\n  }\n\n  @TruffleBoundary\n  private void doTrace(Object value, VmContext context) {\n    VmValue.force(value, true);\n    var sourceSection = valueNode.getSourceSection();\n    var lhs = sourceSection.isAvailable() ? sourceSection.getCharacters().toString() : \"<value>\";\n    var message =\n        switch (context.getTraceMode()) {\n          case COMPACT -> lhs + \" = \" + compactRenderer.render(value);\n          case PRETTY -> {\n            var rhs = prettyRenderer.render(value);\n            yield (lhs.contains(\"\\n\") ? \"\\n\" + addIndent(lhs, \"  \") + \"\\n=\" : lhs + \" =\")\n                + (rhs.contains(\"\\n\") ? \"\\n\" + addIndent(rhs, \"  \") : \" \" + rhs)\n                + \"\\n\";\n          }\n        };\n    context.getLogger().trace(message, VmUtils.createStackFrame(sourceSection, null));\n  }\n\n  private static String addIndent(String s, String indent) {\n    return Arrays.stream(s.split(\"\\n\")).map((it) -> indent + it).collect(Collectors.joining(\"\\n\"));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/UnaryExpressionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"operandNode\", type = ExpressionNode.class)\npublic abstract class UnaryExpressionNode extends ExpressionNode {\n  protected UnaryExpressionNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(Object operand) {\n    throw exceptionBuilder()\n        .evalError(\"operatorNotDefined1\", getShortName(), VmUtils.getClass(operand))\n        .withProgramValue(\"Operand\", operand)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/UnaryMinusNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.expression.unary;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmSafeMath;\n\n@NodeInfo(shortName = \"-\")\npublic abstract class UnaryMinusNode extends UnaryExpressionNode {\n  protected UnaryMinusNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected long eval(long operand) {\n    return VmSafeMath.negate(operand);\n  }\n\n  @Specialization\n  protected double eval(double operand) {\n    return VmSafeMath.negate(operand);\n  }\n\n  @Specialization\n  protected VmDuration eval(VmDuration operand) {\n    return new VmDuration(VmSafeMath.negate(operand.getValue()), operand.getUnit());\n  }\n\n  @Specialization\n  protected VmDataSize eval(VmDataSize operand) {\n    return new VmDataSize(VmSafeMath.negate(operand.getValue()), operand.getUnit());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/expression/unary/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.expression.unary;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/frame/ReadEnclosingFrameSlotNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.frame;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameSlotTypeException;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\npublic abstract class ReadEnclosingFrameSlotNode extends ExpressionNode {\n  private final int slot;\n  private final int levelsUp;\n\n  protected ReadEnclosingFrameSlotNode(SourceSection sourceSection, int slot, int levelsUp) {\n    super(sourceSection);\n    this.slot = slot;\n    this.levelsUp = levelsUp;\n\n    assert levelsUp > 0 : \"should be using ReadFrameSlotNode for levelsUp == 0\";\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected long evalInt(VirtualFrame frame) throws FrameSlotTypeException {\n    return getCapturedFrame(frame).getLong(slot);\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected double evalFloat(VirtualFrame frame) throws FrameSlotTypeException {\n    return getCapturedFrame(frame).getDouble(slot);\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected boolean evalBoolean(VirtualFrame frame) throws FrameSlotTypeException {\n    return getCapturedFrame(frame).getBoolean(slot);\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected Object evalObject(VirtualFrame frame) throws FrameSlotTypeException {\n    return getCapturedFrame(frame).getObject(slot);\n  }\n\n  @Specialization(replaces = {\"evalInt\", \"evalFloat\", \"evalBoolean\", \"evalObject\"})\n  protected Object evalGeneric(VirtualFrame frame) {\n    return getCapturedFrame(frame).getValue(slot);\n  }\n\n  // could be factored out into a separate node s.t. it\n  // won't be repeated in case of FrameSlotTypeException\n  @ExplodeLoop\n  protected final MaterializedFrame getCapturedFrame(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    for (var i = 0; i < levelsUp - 1; i++) {\n      owner = owner.getEnclosingOwner();\n      assert owner != null; // guaranteed by AstBuilder\n    }\n    return owner.getEnclosingFrame();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/frame/ReadFrameSlotNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.frame;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameSlotTypeException;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\n\npublic abstract class ReadFrameSlotNode extends ExpressionNode {\n  private final int slot;\n\n  protected ReadFrameSlotNode(SourceSection sourceSection, int slot) {\n    super(sourceSection);\n    this.slot = slot;\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected long evalInt(VirtualFrame frame) throws FrameSlotTypeException {\n    return frame.getLong(slot);\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected double evalFloat(VirtualFrame frame) throws FrameSlotTypeException {\n    return frame.getDouble(slot);\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected boolean evalBoolean(VirtualFrame frame) throws FrameSlotTypeException {\n    return frame.getBoolean(slot);\n  }\n\n  @Specialization(rewriteOn = FrameSlotTypeException.class)\n  protected Object evalObject(VirtualFrame frame) throws FrameSlotTypeException {\n    return frame.getObject(slot);\n  }\n\n  @Specialization(replaces = {\"evalInt\", \"evalFloat\", \"evalBoolean\", \"evalObject\"})\n  protected Object evalGeneric(VirtualFrame frame) {\n    return frame.getValue(slot);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/frame/WriteFrameSlotNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.frame;\n\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameSlotKind;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\n\n// modeled after:\n// https://github.com/oracle/graal/blob/93c461734f70a37458312b1d5e6d6e5bb26dd757/truffle/src/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/local/SLWriteLocalVariableNode.java\n@NodeChild(value = \"valueNode\", type = ExpressionNode.class)\npublic abstract class WriteFrameSlotNode extends ExpressionNode {\n\n  private final int slot;\n\n  public WriteFrameSlotNode(SourceSection sourceSection, int slot) {\n    super(sourceSection);\n    this.slot = slot;\n  }\n\n  public abstract void executeWithValue(VirtualFrame frame, Object value);\n\n  @Specialization(guards = \"isIntOrIllegal(frame)\")\n  protected long evalInt(VirtualFrame frame, long value) {\n    frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Long);\n    frame.setLong(slot, value);\n    return value;\n  }\n\n  @Specialization(guards = \"isFloatOrIllegal(frame)\")\n  protected double evalFloat(VirtualFrame frame, double value) {\n    frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Double);\n    frame.setDouble(slot, value);\n    return value;\n  }\n\n  @Specialization(guards = \"isBooleanOrIllegal(frame)\")\n  protected boolean evalBoolean(VirtualFrame frame, boolean value) {\n    frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Boolean);\n    frame.setBoolean(slot, value);\n    return value;\n  }\n\n  @Specialization(replaces = {\"evalInt\", \"evalFloat\", \"evalBoolean\"})\n  protected Object evalGeneric(VirtualFrame frame, Object value) {\n    frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Object);\n    frame.setObject(slot, value);\n    return value;\n  }\n\n  protected final boolean isIntOrIllegal(VirtualFrame frame) {\n    var kind = frame.getFrameDescriptor().getSlotKind(slot);\n    return kind == FrameSlotKind.Long || kind == FrameSlotKind.Illegal;\n  }\n\n  protected final boolean isFloatOrIllegal(VirtualFrame frame) {\n    var kind = frame.getFrameDescriptor().getSlotKind(slot);\n    return kind == FrameSlotKind.Double || kind == FrameSlotKind.Illegal;\n  }\n\n  protected final boolean isBooleanOrIllegal(VirtualFrame frame) {\n    var kind = frame.getFrameDescriptor().getSlotKind(slot);\n    return kind == FrameSlotKind.Boolean || kind == FrameSlotKind.Illegal;\n  }\n\n  @Override\n  public boolean isInstrumentable() {\n    return false;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/frame/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.frame;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/BlackholeNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.internal;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.util.Nullable;\n\n/** Ensures that `childNode` isn't optimized away. */\n@NodeChild(value = \"childNode\", type = ExpressionNode.class)\npublic abstract class BlackholeNode extends ExpressionNode {\n  @Specialization\n  protected @Nullable Object evalBoolean(boolean value) {\n    CompilerDirectives.blackhole(value);\n    return null;\n  }\n\n  @Specialization\n  protected @Nullable Object evalInt(long value) {\n    CompilerDirectives.blackhole(value);\n    return null;\n  }\n\n  @Specialization\n  protected @Nullable Object evalFloat(double value) {\n    CompilerDirectives.blackhole(value);\n    return null;\n  }\n\n  @Specialization\n  protected @Nullable Object evalObject(Object value) {\n    CompilerDirectives.blackhole(value);\n    return null;\n  }\n\n  @Override\n  public boolean isInstrumentable() {\n    return false;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/GetBaseModuleClassNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.internal;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.runtime.*;\n\npublic final class GetBaseModuleClassNode extends ExpressionNode {\n  private final Identifier className;\n\n  public GetBaseModuleClassNode(Identifier className) {\n    this.className = className;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var current = VmUtils.getOwner(frame);\n    var parent = current.getEnclosingOwner();\n    while (parent != null) {\n      current = parent;\n      parent = parent.getEnclosingOwner();\n    }\n\n    assert ModuleKeys.isBaseModule(VmUtils.getModuleInfo(current).getModuleKey());\n\n    var result = VmUtils.readMember(current, className);\n    assert result instanceof VmClass;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/GetClassNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.internal;\n\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.instrumentation.GenerateWrapper;\nimport com.oracle.truffle.api.instrumentation.ProbeNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\n\n@GenerateWrapper\n// NOTE: needs to be kept in sync with VmUtils.getClass()\n@NodeChild(value = \"valueNode\", type = ExpressionNode.class)\npublic abstract class GetClassNode extends ExpressionNode {\n  protected GetClassNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  protected GetClassNode() {\n    super();\n  }\n\n  /**\n   * When only using this execute method, pass `null` for `valueNode` to {@link\n   * GetClassNodeGen#create}.\n   */\n  public abstract VmClass executeWith(VirtualFrame frame, Object value);\n\n  @Specialization\n  protected VmClass evalString(@SuppressWarnings(\"unused\") String value) {\n    return BaseModule.getStringClass();\n  }\n\n  @Specialization\n  protected VmClass evalInt(@SuppressWarnings(\"unused\") long value) {\n    return BaseModule.getIntClass();\n  }\n\n  @Specialization\n  protected VmClass evalFloat(@SuppressWarnings(\"unused\") double value) {\n    return BaseModule.getFloatClass();\n  }\n\n  @Specialization\n  protected VmClass evalBoolean(@SuppressWarnings(\"unused\") boolean value) {\n    return BaseModule.getBooleanClass();\n  }\n\n  // This method effectively covers `VmValue value` but is implemented in a more efficient way.\n  // See:\n  // https://www.graalvm.org/22.0/graalvm-as-a-platform/language-implementation-framework/TruffleLibraries/#strategy-2-java-interfaces\n  @Specialization(guards = \"value.getClass() == cachedClass\", limit = \"99\")\n  protected VmClass evalVmValue(\n      Object value, @Cached(\"getValueClass(value)\") Class<? extends VmValue> cachedClass) {\n    return cachedClass.cast(value).getVmClass();\n  }\n\n  protected static Class<? extends VmValue> getValueClass(Object value) {\n    // OK to perform slow cast here (not a guard).\n    // `value instanceof VmValue` is guaranteed because `evalVmValue()`\n    // - comes after String/long/double/boolean specializations\n    // - has a guard that triggers per-class respecialization\n    return ((VmValue) value).getClass();\n  }\n\n  @Override\n  public WrapperNode createWrapper(ProbeNode probe) {\n    return new GetClassNodeWrapper(this, probe);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/IsInstanceOfNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.internal;\n\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmValue;\n\npublic abstract class IsInstanceOfNode extends PklNode {\n  public abstract boolean executeBoolean(Object value, VmClass clazz);\n\n  @Specialization\n  protected boolean eval(@SuppressWarnings(\"unused\") String left, VmClass right) {\n    return right == BaseModule.getStringClass() || right == BaseModule.getAnyClass();\n  }\n\n  @Specialization\n  protected boolean eval(@SuppressWarnings(\"unused\") long left, VmClass right) {\n    return right == BaseModule.getIntClass()\n        || right == BaseModule.getNumberClass()\n        || right == BaseModule.getAnyClass();\n  }\n\n  @Specialization\n  protected boolean eval(@SuppressWarnings(\"unused\") double left, VmClass right) {\n    return right == BaseModule.getFloatClass()\n        || right == BaseModule.getNumberClass()\n        || right == BaseModule.getAnyClass();\n  }\n\n  @Specialization\n  protected boolean eval(@SuppressWarnings(\"unused\") boolean left, VmClass right) {\n    return right == BaseModule.getBooleanClass() || right == BaseModule.getAnyClass();\n  }\n\n  /**\n   * This method effectively covers `VmValue value` but is implemented in a <a\n   * href=\"https://www.graalvm.org/22.0/graalvm-as-a-platform/language-implementation-framework/TruffleLibraries/#strategy-2-java-interfaces\">more\n   * efficient way</a>.\n   */\n  @Specialization(guards = \"value.getClass() == valueJavaClass\", limit = \"99\")\n  protected boolean evalVmValue(\n      Object value,\n      VmClass vmClass,\n      @Cached(\"getJavaClass(value)\") Class<? extends VmValue> valueJavaClass) {\n\n    VmClass valueVmClass = valueJavaClass.cast(value).getVmClass();\n    return vmClass.isSuperclassOf(valueVmClass);\n  }\n\n  protected Class<? extends VmValue> getJavaClass(Object value) {\n    // OK to perform slow cast here (not a guard).\n    // `value instanceof VmValue` is guaranteed because `evalVmValue()`\n    // - comes after String/long/double/boolean specializations\n    // - has a guard that triggers per-class respecialization\n    return ((VmValue) value).getClass();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/SyntheticNode.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.internal;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.PklNode;\n\n/**\n * A node that stands in for source sections that are intrinsified (e.g. `isBetween` in `typealias\n * Int8 = Int(isBetween(..))`.\n */\npublic class SyntheticNode extends PklNode {\n  public SyntheticNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/ToStringNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.internal;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberLookupMode;\nimport org.pkl.core.ast.expression.member.InvokeMethodVirtualNode;\nimport org.pkl.core.ast.expression.member.InvokeMethodVirtualNodeGen;\nimport org.pkl.core.ast.expression.unary.UnaryExpressionNode;\nimport org.pkl.core.runtime.*;\n\n@SuppressWarnings(\"unused\")\npublic abstract class ToStringNode extends UnaryExpressionNode {\n  protected ToStringNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  @Specialization\n  protected String evalString(String value) {\n    return value;\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected String evalInt(long value) {\n    return String.valueOf(value);\n  }\n\n  @Specialization\n  @TruffleBoundary\n  protected String evalFloat(double value) {\n    return String.valueOf(value);\n  }\n\n  @Specialization\n  protected String evalBoolean(boolean value) {\n    return String.valueOf(value);\n  }\n\n  @Specialization\n  protected String evalTyped(\n      VirtualFrame frame,\n      VmTyped value,\n      @Cached(value = \"createInvokeNode()\", neverDefault = true)\n          InvokeMethodVirtualNode invokeNode) {\n\n    return (String) invokeNode.executeWith(frame, value, value.getVmClass());\n  }\n\n  @Fallback\n  @Override\n  @TruffleBoundary\n  protected Object fallback(Object value) {\n    return value.toString();\n  }\n\n  protected InvokeMethodVirtualNode createInvokeNode() {\n    //noinspection ConstantConditions\n    return InvokeMethodVirtualNodeGen.create(\n        sourceSection,\n        Identifier.TO_STRING,\n        new ExpressionNode[] {},\n        MemberLookupMode.EXPLICIT_RECEIVER,\n        null,\n        null);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/internal/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.internal;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/ApplyVmFunction0Node.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.lambda;\n\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.VmFunction;\n\npublic abstract class ApplyVmFunction0Node extends PklNode {\n  public abstract Object execute(VmFunction function);\n\n  @Specialization(guards = \"function.getCallTarget() == cachedCallTarget\")\n  protected Object evalDirect(\n      VmFunction function,\n      @SuppressWarnings(\"unused\") @Cached(\"function.getCallTarget()\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    return callNode.call(function.getThisValue(), function);\n  }\n\n  @Specialization(replaces = \"evalDirect\")\n  protected Object eval(VmFunction function, @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return callNode.call(function.getCallTarget(), function.getThisValue(), function);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/ApplyVmFunction1Node.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.lambda;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.VmCollection;\nimport org.pkl.core.runtime.VmFunction;\n\n@NodeChild(\"functionNode\")\n@NodeChild(\"argumentNode\")\npublic abstract class ApplyVmFunction1Node extends ExpressionNode {\n  public abstract Object execute(VmFunction function, Object arg1);\n\n  public static ApplyVmFunction1Node create() {\n    //noinspection ConstantConditions\n    return ApplyVmFunction1NodeGen.create(null, null);\n  }\n\n  public final boolean executeBoolean(VmFunction function, Object arg1) {\n    var result = execute(function, arg1);\n    if (result instanceof Boolean b) return b;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getBooleanClass()).build();\n  }\n\n  public final String executeString(VmFunction function, Object arg1) {\n    var result = execute(function, arg1);\n    if (result instanceof String string) return string;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getStringClass()).build();\n  }\n\n  public final Long executeInt(VmFunction function, Object arg1) {\n    var result = execute(function, arg1);\n    if (result instanceof Long l) return l;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getIntClass()).build();\n  }\n\n  public final VmCollection executeCollection(VmFunction function, Object arg1) {\n    var result = execute(function, arg1);\n    if (result instanceof VmCollection collection) return collection;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getCollectionClass()).build();\n  }\n\n  @Specialization(guards = \"function.getCallTarget() == cachedCallTarget\")\n  protected Object evalDirect(\n      VmFunction function,\n      Object arg1,\n      @SuppressWarnings(\"unused\") @Cached(\"function.getCallTarget()\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    return callNode.call(function.getThisValue(), function, arg1);\n  }\n\n  @Specialization(replaces = \"evalDirect\")\n  protected Object eval(\n      VmFunction function, Object arg1, @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return callNode.call(function.getCallTarget(), function.getThisValue(), function, arg1);\n  }\n\n  @Override\n  public boolean isInstrumentable() {\n    return false;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/ApplyVmFunction2Node.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.lambda;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.*;\n\npublic abstract class ApplyVmFunction2Node extends PklNode {\n  public abstract Object execute(VmFunction function, Object arg1, Object arg2);\n\n  public final boolean executeBoolean(VmFunction function, Object arg1, Object arg2) {\n    var result = execute(function, arg1, arg2);\n    if (result instanceof Boolean b) return b;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getBooleanClass()).build();\n  }\n\n  public final VmCollection executeCollection(VmFunction function, Object arg1, Object arg2) {\n    var result = execute(function, arg1, arg2);\n    if (result instanceof VmCollection collection) return collection;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getCollectionClass()).build();\n  }\n\n  public final VmMap executeMap(VmFunction function, Object arg1, Object arg2) {\n    var result = execute(function, arg1, arg2);\n    if (result instanceof VmMap map) return map;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getMapClass()).build();\n  }\n\n  public final Long executeInt(VmFunction function, Object arg1, Object arg2) {\n    var result = execute(function, arg1, arg2);\n    if (result instanceof Long l) return l;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getIntClass()).build();\n  }\n\n  public final VmPair executePair(VmFunction function, Object arg1, Object arg2) {\n    var result = execute(function, arg1, arg2);\n    if (result instanceof VmPair pair) return pair;\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder().typeMismatch(result, BaseModule.getPairClass()).build();\n  }\n\n  @Specialization(guards = \"function.getCallTarget() == cachedCallTarget\")\n  protected Object evalDirect(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      @SuppressWarnings(\"unused\") @Cached(\"function.getCallTarget()\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    return callNode.call(function.getThisValue(), function, arg1, arg2);\n  }\n\n  @Specialization(replaces = \"evalDirect\")\n  protected Object eval(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return callNode.call(function.getCallTarget(), function.getThisValue(), function, arg1, arg2);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/ApplyVmFunction3Node.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.lambda;\n\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.VmFunction;\n\npublic abstract class ApplyVmFunction3Node extends PklNode {\n  public abstract Object execute(VmFunction function, Object arg1, Object arg2, Object arg3);\n\n  @Specialization(guards = \"function.getCallTarget() == cachedCallTarget\")\n  protected Object evalDirect(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      @SuppressWarnings(\"unused\") @Cached(\"function.getCallTarget()\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    return callNode.call(function.getThisValue(), function, arg1, arg2, arg3);\n  }\n\n  @Specialization(replaces = \"evalDirect\")\n  protected Object eval(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return callNode.call(\n        function.getCallTarget(), function.getThisValue(), function, arg1, arg2, arg3);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/ApplyVmFunction4Node.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.lambda;\n\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.VmFunction;\n\npublic abstract class ApplyVmFunction4Node extends PklNode {\n  public abstract Object execute(\n      VmFunction function, Object arg1, Object arg2, Object arg3, Object arg4);\n\n  @Specialization(guards = \"function.getCallTarget() == cachedCallTarget\")\n  protected Object evalDirect(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      Object arg4,\n      @SuppressWarnings(\"unused\") @Cached(\"function.getCallTarget()\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    return callNode.call(function.getThisValue(), function, arg1, arg2, arg3, arg4);\n  }\n\n  @Specialization(replaces = \"evalDirect\")\n  protected Object eval(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      Object arg4,\n      @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return callNode.call(\n        function.getCallTarget(), function.getThisValue(), function, arg1, arg2, arg3, arg4);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/ApplyVmFunction5Node.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.lambda;\n\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.VmFunction;\n\npublic abstract class ApplyVmFunction5Node extends PklNode {\n  public abstract Object execute(\n      VmFunction function, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5);\n\n  @Specialization(guards = \"function.getCallTarget() == cachedCallTarget\")\n  protected Object evalDirect(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      Object arg4,\n      Object arg5,\n      @SuppressWarnings(\"unused\") @Cached(\"function.getCallTarget()\")\n          RootCallTarget cachedCallTarget,\n      @Cached(\"create(cachedCallTarget)\") DirectCallNode callNode) {\n\n    return callNode.call(function.getThisValue(), function, arg1, arg2, arg3, arg4, arg5);\n  }\n\n  @Specialization(replaces = \"evalDirect\")\n  protected Object eval(\n      VmFunction function,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      Object arg4,\n      Object arg5,\n      @Cached(\"create()\") IndirectCallNode callNode) {\n\n    return callNode.call(\n        function.getCallTarget(), function.getThisValue(), function, arg1, arg2, arg3, arg4, arg5);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/lambda/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.lambda;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ClassMember.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class ClassMember extends Member {\n  protected final SourceSection @Nullable [] docComment;\n  protected final List<VmTyped> annotations;\n  // store prototype instead of class because the former is needed much more often\n  private final VmTyped owner;\n\n  public ClassMember(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      int modifiers,\n      Identifier name,\n      String qualifiedName,\n      SourceSection @Nullable [] docComment,\n      List<VmTyped> annotations,\n      VmTyped owner) {\n\n    super(sourceSection, headerSection, modifiers, name, qualifiedName);\n\n    this.docComment = docComment;\n    this.annotations = annotations;\n    this.owner = owner;\n  }\n\n  public final SourceSection @Nullable [] getDocComment() {\n    return docComment;\n  }\n\n  public final List<VmTyped> getAnnotations() {\n    return annotations;\n  }\n\n  public List<VmTyped> getAllAnnotations(boolean ascending) {\n    var annotations = new ArrayList<VmTyped>();\n\n    if (ascending) {\n      for (var clazz = getDeclaringClass(); clazz != null; clazz = clazz.getSuperclass()) {\n        var p = clazz.getDeclaredProperty(getName());\n        if (p != null) {\n          annotations.addAll(p.getAnnotations());\n        }\n      }\n    } else {\n      doGetAllAnnotationsDescending(getDeclaringClass(), annotations);\n    }\n\n    return annotations;\n  }\n\n  private void doGetAllAnnotationsDescending(VmClass clazz, List<VmTyped> annotations) {\n    if (clazz.getSuperclass() != null) {\n      doGetAllAnnotationsDescending(clazz.getSuperclass(), annotations);\n    }\n    var p = clazz.getDeclaredProperty(getName());\n    if (p != null) {\n      annotations.addAll(p.getAnnotations());\n    }\n  }\n\n  /** Returns the prototype of the class that declares this member. */\n  public final VmTyped getOwner() {\n    return owner;\n  }\n\n  public final VmClass getDeclaringClass() {\n    return owner.getVmClass();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ClassMethod.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport org.pkl.core.PClass;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class ClassMethod extends ClassMember {\n  private final List<TypeParameter> typeParameters;\n\n  // null = not deprecated, \"\" = no/empty message in the @Deprecated body\n  private final @Nullable String deprecation;\n\n  @CompilationFinal private FunctionNode functionNode;\n\n  public ClassMethod(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      int modifiers,\n      Identifier name,\n      String qualifiedName,\n      SourceSection @Nullable [] docComment,\n      List<VmTyped> annotations,\n      VmTyped owner,\n      List<TypeParameter> typeParameters,\n      @Nullable String deprecation) {\n\n    super(\n        sourceSection,\n        headerSection,\n        modifiers,\n        name,\n        qualifiedName,\n        docComment,\n        annotations,\n        owner);\n    this.typeParameters = typeParameters;\n    this.deprecation = deprecation;\n  }\n\n  public void initFunctionNode(FunctionNode functionNode) {\n    assert this.functionNode == null;\n    this.functionNode = functionNode;\n  }\n\n  public CallTarget getCallTarget() {\n    return functionNode.getCallTarget();\n  }\n\n  @TruffleBoundary\n  private void reportDeprecation(SourceSection callSite) {\n    assert deprecation != null;\n\n    var logger = VmContext.get(null).getLogger();\n    logger.warn(\n        \"Method `\"\n            + qualifiedName\n            + \"` is deprecated\"\n            + (deprecation.isEmpty() ? \"\" : \": \" + deprecation),\n        VmUtils.createStackFrame(callSite, null));\n  }\n\n  public CallTarget getCallTarget(SourceSection callSite) {\n    if (deprecation != null) {\n      reportDeprecation(callSite);\n    }\n    return functionNode.getCallTarget();\n  }\n\n  public int getParameterCount() {\n    return functionNode.getParameterCount();\n  }\n\n  public @Nullable TypeNode getReturnTypeNode() {\n    return functionNode.getReturnTypeNode();\n  }\n\n  @Override\n  public String getCallSignature() {\n    return functionNode.getCallSignature();\n  }\n\n  public VmTyped getMirror() {\n    return MirrorFactories.methodFactory.create(this);\n  }\n\n  public VmSet getModifierMirrors() {\n    return VmModifier.getMirrors(modifiers, false);\n  }\n\n  public VmList getTypeParameterMirrors() {\n    var builder = VmList.EMPTY.builder();\n    for (var typeParameter : typeParameters) {\n      builder.add(MirrorFactories.typeParameterFactory.create(typeParameter));\n    }\n    return builder.build();\n  }\n\n  public VmMap getParameterMirrors() {\n    return functionNode.getParameterMirrors();\n  }\n\n  public VmTyped getReturnTypeMirror() {\n    return functionNode.getReturnTypeMirror();\n  }\n\n  public PClass.Method export(PClass owner) {\n    return functionNode.export(owner, docComment, annotations, modifiers, typeParameters);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ClassNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\n@NodeInfo(shortName = \"class\")\npublic final class ClassNode extends ExpressionNode {\n  private final SourceSection headerSection;\n  private final SourceSection @Nullable [] docComment;\n  @Children private final ExpressionNode[] annotationNodes;\n  private final int modifiers;\n  private final PClassInfo<?> classInfo;\n  private final List<TypeParameter> typeParameters;\n  private final @Nullable ModuleInfo moduleInfo;\n  // null iff this class is pkl.base#Any\n  @Child private @Nullable UnresolvedTypeNode unresolvedSupertypeNode;\n  private final EconomicMap<Object, ObjectMember> prototypeMembers;\n  @Children private final UnresolvedPropertyNode[] unresolvedPropertyNodes;\n  @Children private final UnresolvedMethodNode[] unresolvedMethodNodes;\n\n  @CompilationFinal @LateInit private VmClass cachedClass;\n\n  public ClassNode(\n      SourceSection section,\n      SourceSection headerSection,\n      SourceSection @Nullable [] docComment,\n      ExpressionNode[] annotationNodes,\n      int modifiers,\n      PClassInfo<?> classInfo,\n      List<TypeParameter> typeParameters,\n      @Nullable ModuleInfo moduleInfo,\n      @Nullable UnresolvedTypeNode unresolvedSupertypeNode,\n      EconomicMap<Object, ObjectMember> prototypeMembers,\n      UnresolvedPropertyNode[] unresolvedPropertyNodes,\n      UnresolvedMethodNode[] unresolvedMethodNodes) {\n\n    super(section);\n    this.headerSection = headerSection;\n    this.docComment = docComment;\n    this.annotationNodes = annotationNodes;\n    this.modifiers = modifiers;\n    this.classInfo = classInfo;\n    this.typeParameters = typeParameters;\n    this.moduleInfo = moduleInfo;\n    this.unresolvedSupertypeNode = unresolvedSupertypeNode;\n    this.prototypeMembers = prototypeMembers;\n    this.unresolvedPropertyNodes = unresolvedPropertyNodes;\n    this.unresolvedMethodNodes = unresolvedMethodNodes;\n  }\n\n  @Override\n  public VmClass executeGeneric(VirtualFrame frame) {\n    // Break class resolution cycles by immediately returning the\n    // (possibly not yet fully initialized) cached class instance on subsequent calls.\n    // Caching of classes also guarantees that classes are singletons and can be compared by\n    // identity,\n    // which improves efficiency and performance (for example in shape checks).\n    if (cachedClass != null) return cachedClass;\n\n    CompilerDirectives.transferToInterpreter();\n\n    var module = VmUtils.getTypedObjectReceiver(frame);\n\n    VmTyped prototype;\n    var isModuleClass = moduleInfo != null;\n    if (isModuleClass) {\n      // For module classes, the corresponding (uninitialized) module object is provided by the\n      // caller of this frame.\n      // This allows to conveniently make stdlib module objects and their members accessible to\n      // nodes\n      // via static final fields without having to fear recursive field initialization.\n      prototype = module;\n      prototype.setExtraStorage(moduleInfo);\n      prototype.addProperties(prototypeMembers);\n    } else {\n      prototype =\n          new VmTyped(\n              frame.materialize(),\n              null, // initialized later by VmClass\n              null, // initialized later by VmClass\n              prototypeMembers);\n    }\n\n    var annotations = new ArrayList<VmTyped>(annotationNodes.length);\n    if (moduleInfo != null) moduleInfo.initAnnotations(annotations);\n\n    // Cache the (not yet fully initialized) class before making any `resolveXYZ()`\n    // or `node.execute()` calls as those may result in recursive calls to this method.\n    cachedClass =\n        new VmClass(\n            sourceSection,\n            headerSection,\n            docComment,\n            annotations,\n            modifiers,\n            classInfo,\n            typeParameters,\n            prototype);\n\n    if (unresolvedSupertypeNode != null) {\n      var supertypeNode = unresolvedSupertypeNode.execute(frame);\n      var superclass = supertypeNode.getVmClass();\n\n      checkSupertype(supertypeNode, superclass);\n      cachedClass.initSupertype(supertypeNode, superclass);\n    }\n\n    // The superclass resolved above may not itself have completed the below initializations yet.\n    // That's because these initializations may have indirectly or directly triggered\n    // resolution of this class, in which case the `resolveSuperclass()` call above\n    // will have returned the partially initialized `cachedClass` of the superclass.\n    // As a consequence, initializations that require a fully initialized class hierarchy\n    // are done lazily in VmClass rather than here.\n    // A fully initialized class hierarchy is only required for initialization of internal caches,\n    // which is guaranteed to succeed (no impact on eager vs. lazy error reporting) and easy to\n    // defer.\n\n    VmUtils.evaluateAnnotations(frame, annotationNodes, annotations);\n\n    for (var node : unresolvedPropertyNodes) {\n      cachedClass.addProperty(node.execute(frame, cachedClass));\n    }\n\n    for (var node : unresolvedMethodNodes) {\n      cachedClass.addMethod(node.execute(frame, cachedClass));\n    }\n\n    cachedClass.notifyInitialized();\n\n    return cachedClass;\n  }\n\n  private void checkSupertype(TypeNode supertypeNode, @Nullable VmClass superclass) {\n    if (superclass == null) {\n      throw exceptionBuilder()\n          .evalError(\"invalidSupertype\", supertypeNode.getSourceSection().getCharacters())\n          .withSourceSection(supertypeNode.getSourceSection())\n          .build();\n    }\n    if (moduleInfo != null) {\n      if (cachedClass == superclass) {\n        throw exceptionBuilder()\n            .evalError(\"moduleCannotExtendSelf\", moduleInfo.getModuleName())\n            .withSourceSection(supertypeNode.getSourceSection())\n            .build();\n      }\n      if (superclass.isClosed()) {\n        throw exceptionBuilder()\n            .evalError(\"cannotExtendFinalModule\", superclass.getModuleName())\n            .withSourceSection(supertypeNode.getSourceSection())\n            .build();\n      }\n    } else {\n      if (cachedClass == superclass) {\n        throw exceptionBuilder()\n            .evalError(\"classCannotExtendSelf\", superclass.getDisplayName())\n            .withSourceSection(supertypeNode.getSourceSection())\n            .build();\n      }\n      if (superclass.isClosed()) {\n        throw exceptionBuilder()\n            .evalError(\"cannotExtendFinalClass\", superclass.getDisplayName())\n            .withSourceSection(supertypeNode.getSourceSection())\n            .build();\n      }\n      if (superclass.isExternal() && !classInfo.isStandardLibraryClass()) {\n        throw new VmExceptionBuilder()\n            .evalError(\"cannotExtendExternalClass\", superclass.getDisplayName())\n            .withSourceSection(supertypeNode.getSourceSection())\n            .build();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ClassProperty.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport org.pkl.core.Member.SourceLocation;\nimport org.pkl.core.PClass;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class ClassProperty extends ClassMember {\n  private final @Nullable PropertyTypeNode typeNode;\n  private final ObjectMember initializer;\n\n  public ClassProperty(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      int modifiers,\n      Identifier name,\n      String qualifiedName,\n      SourceSection @Nullable [] docComment,\n      List<VmTyped> annotations,\n      VmTyped owner,\n      @Nullable PropertyTypeNode typeNode,\n      ObjectMember initializer) {\n\n    super(\n        sourceSection,\n        headerSection,\n        modifiers,\n        name,\n        qualifiedName,\n        docComment,\n        annotations,\n        owner);\n\n    this.typeNode = typeNode;\n    this.initializer = initializer;\n  }\n\n  public VmSet getAllModifierMirrors() {\n    var mods = 0;\n    for (var clazz = getDeclaringClass(); clazz != null; clazz = clazz.getSuperclass()) {\n      var parent = clazz.getDeclaredProperty(getName());\n      if (parent != null) {\n        mods |= parent.getModifiers();\n      }\n    }\n    return VmModifier.getMirrors(mods, false);\n  }\n\n  public @Nullable PropertyTypeNode getTypeNode() {\n    return typeNode;\n  }\n\n  public ObjectMember getInitializer() {\n    return initializer;\n  }\n\n  @Override\n  public String getCallSignature() {\n    assert name != null;\n    return name.toString();\n  }\n\n  public VmTyped getMirror() {\n    return MirrorFactories.propertyFactory.create(this);\n  }\n\n  public VmSet getModifierMirrors() {\n    return VmModifier.getMirrors(modifiers, false);\n  }\n\n  public VmTyped getTypeMirror() {\n    return PropertyTypeNode.getMirror(typeNode);\n  }\n\n  public PClass.Property export(PClass owner) {\n    assert name != null;\n    return new PClass.Property(\n        owner,\n        VmUtils.exportDocComment(docComment),\n        new SourceLocation(getHeaderSection().getStartLine(), sourceSection.getEndLine()),\n        VmModifier.export(modifiers, false),\n        VmUtils.exportAnnotations(annotations),\n        name.toString(),\n        PropertyTypeNode.export(typeNode));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/DefaultPropertyBodyNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Property body for properties that don't have an explicit body. Returns the default value for the\n * property's type, or throws if the type doesn't have a default value.\n */\npublic final class DefaultPropertyBodyNode extends ExpressionNode {\n  private final Identifier propertyName;\n  private final @Nullable PropertyTypeNode typeNode;\n\n  public DefaultPropertyBodyNode(\n      SourceSection sourceSection, Identifier propertyName, @Nullable PropertyTypeNode typeNode) {\n    super(sourceSection);\n    this.propertyName = propertyName;\n    this.typeNode = typeNode;\n  }\n\n  public boolean isUndefined(VirtualFrame frame) {\n    return typeNode == null || typeNode.getDefaultValue(frame) == null;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (typeNode != null) {\n      var defaultValue = typeNode.getDefaultValue(frame);\n      if (defaultValue != null) return defaultValue;\n    }\n\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .undefinedPropertyValue(propertyName, VmUtils.getReceiver(frame))\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/DelegateToExtraStorageMapOrParentNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmUtils;\n\n/** Delegates to the equally named key of the map stored in extra storage. */\npublic final class DelegateToExtraStorageMapOrParentNode extends ExpressionNode {\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    var delegate = (VmMap) owner.getExtraStorage();\n    var memberKey = VmUtils.getMemberKey(frame);\n    var mapKey = memberKey instanceof Identifier ? memberKey.toString() : memberKey;\n    var result = delegate.getOrNull(mapKey);\n    if (result != null) return result;\n    var parent = owner.getParent();\n    assert parent != null;\n    return VmUtils.readMember(parent, memberKey);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/DelegateToExtraStorageObjNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmUtils;\n\n/** Delegates to the equally named member of the object stored in extra storage. */\npublic final class DelegateToExtraStorageObjNode extends ExpressionNode {\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    var delegate = (VmObjectLike) owner.getExtraStorage();\n    var memberKey = VmUtils.getMemberKey(frame);\n    return VmUtils.readMember(delegate, memberKey);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/DelegateToExtraStorageObjOrParentNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmUtils;\n\n/**\n * Delegates to the equally named member of the object stored in extra storage. If no such member\n * exists, delegates to its own parent member.\n */\npublic final class DelegateToExtraStorageObjOrParentNode extends ExpressionNode {\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    var owner = VmUtils.getOwner(frame);\n    var delegate = (VmObjectLike) owner.getExtraStorage();\n    var memberKey = VmUtils.getMemberKey(frame);\n    var result = VmUtils.readMemberOrNull(delegate, memberKey);\n    if (result != null) return result;\n    var parent = owner.getParent();\n    assert parent != null;\n    return VmUtils.readMember(parent, memberKey);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ElementOrEntryNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Cached.Shared;\nimport com.oracle.truffle.api.dsl.Executed;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.expression.primary.GetReceiverNode;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Equivalent of {@link TypedPropertyNode} for elements/entries. */\npublic abstract class ElementOrEntryNode extends RegularMemberNode {\n  @Child @Executed protected ExpressionNode receiverNode = new GetReceiverNode();\n\n  protected ElementOrEntryNode(\n      @Nullable VmLanguage language,\n      FrameDescriptor descriptor,\n      ObjectMember member,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor, member, bodyNode);\n  }\n\n  @Specialization\n  protected Object evalListing(\n      VirtualFrame frame,\n      VmListing receiver,\n      @Cached(\"create()\") @Shared(\"callNode\") IndirectCallNode callNode) {\n    var result = bodyNode.executeGeneric(frame);\n    return VmUtils.shouldRunTypeCheck(frame)\n        ? receiver.executeTypeCasts(result, VmUtils.getOwner(frame), callNode, null, null)\n        : result;\n  }\n\n  @Specialization\n  protected Object evalMapping(\n      VirtualFrame frame,\n      VmMapping receiver,\n      @Cached(\"create()\") @Shared(\"callNode\") IndirectCallNode callNode) {\n    var result = bodyNode.executeGeneric(frame);\n    return VmUtils.shouldRunTypeCheck(frame)\n        ? receiver.executeTypeCasts(result, VmUtils.getOwner(frame), callNode, null, null)\n        : result;\n  }\n\n  @Specialization\n  protected Object evalDynamic(VirtualFrame frame, VmDynamic ignored) {\n    return bodyNode.executeGeneric(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/FunctionNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport org.pkl.core.Member.SourceLocation;\nimport org.pkl.core.PClass;\nimport org.pkl.core.PType;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.Pair;\n\npublic final class FunctionNode extends RegularMemberNode {\n  // Every function (and property) call passes two implicit arguments at positions\n  // frame.getArguments()[0] and [1]:\n  // - the receiver (target) of the call, of type Object (see VmUtils.getReceiver())\n  // - the owner (lexically enclosing object) of the function/property definition, of type VmTyped\n  // (see VmUtils.getOwner())\n  // For VmObject receivers, the owner is the same as or an ancestor of the receiver.\n  // For other receivers, the owner is the prototype of the receiver's class.\n  // The chain of enclosing owners forms a function/property's lexical scope.\n  private static final int IMPLICIT_PARAM_COUNT = 2;\n\n  private final int paramCount;\n  private final int totalParamCount;\n\n  @Children private final TypeNode[] parameterTypeNodes;\n  @Child private @Nullable TypeNode checkedReturnTypeNode;\n  private @Nullable TypeNode returnTypeNode;\n\n  @TruffleBoundary\n  public FunctionNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      Member member,\n      int paramCount,\n      TypeNode[] parameterTypeNodes,\n      @Nullable TypeNode returnTypeNode,\n      boolean isReturnTypeChecked,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor, member, bodyNode);\n\n    assert member instanceof ClassMethod\n        || member instanceof ObjectMember // local object method\n        || member instanceof Lambda;\n\n    this.paramCount = paramCount;\n    this.parameterTypeNodes = parameterTypeNodes;\n    this.checkedReturnTypeNode = isReturnTypeChecked ? returnTypeNode : null;\n    this.returnTypeNode = returnTypeNode;\n\n    totalParamCount = Math.addExact(IMPLICIT_PARAM_COUNT, paramCount);\n  }\n\n  public int getParameterCount() {\n    return paramCount;\n  }\n\n  public @Nullable TypeNode getReturnTypeNode() {\n    return returnTypeNode;\n  }\n\n  @TruffleBoundary\n  public String getCallSignature() {\n    var sb = new StringBuilder(member.getName().toString());\n    sb.append('(');\n    for (var i = 0; i < Math.min(getFrameDescriptor().getNumberOfSlots(), paramCount); i++) {\n      if (i > 0) {\n        sb.append(\", \");\n      }\n      sb.append(getFrameDescriptor().getSlotName(i));\n    }\n    sb.append(')');\n    return sb.toString();\n  }\n\n  @Override\n  @ExplodeLoop\n  protected Object executeImpl(VirtualFrame frame) {\n    var totalArgCount = frame.getArguments().length;\n    if (totalArgCount != totalParamCount) {\n      CompilerDirectives.transferToInterpreter();\n      throw wrongArgumentCount(totalArgCount - IMPLICIT_PARAM_COUNT);\n    }\n\n    for (var i = 0; i < parameterTypeNodes.length; i++) {\n      var argument = frame.getArguments()[IMPLICIT_PARAM_COUNT + i];\n      parameterTypeNodes[i].executeAndSet(frame, argument);\n    }\n\n    var result = bodyNode.executeGeneric(frame);\n\n    if (checkedReturnTypeNode != null) {\n      return checkedReturnTypeNode.execute(frame, result);\n    }\n\n    return result;\n  }\n\n  public VmMap getParameterMirrors() {\n    var builder = VmMap.builder();\n    for (var i = 0; i < paramCount; i++) {\n      var parameterName = getFrameDescriptor().getSlotName(i).toString();\n      builder.add(\n          parameterName,\n          MirrorFactories.methodParameterFactory.create(\n              Pair.of(parameterName, parameterTypeNodes[i].getMirror())));\n    }\n    return builder.build();\n  }\n\n  public VmTyped getReturnTypeMirror() {\n    return TypeNode.getMirror(returnTypeNode);\n  }\n\n  public PClass.Method export(\n      PClass owner,\n      SourceSection @Nullable [] docComment,\n      List<VmTyped> annotations,\n      int modifiers,\n      List<TypeParameter> typeParameters) {\n\n    var parameters = CollectionUtils.<String, PType>newLinkedHashMap(paramCount);\n    for (var i = 0; i < paramCount; i++) {\n      var slotName = getFrameDescriptor().getSlotName(i);\n      // Ignored parameters (`_`) have no name\n      var paramName = slotName == null ? \"_#\" + i : slotName.toString();\n      parameters.put(paramName, TypeNode.export(parameterTypeNodes[i]));\n    }\n\n    var result =\n        new PClass.Method(\n            owner,\n            VmUtils.exportDocComment(docComment),\n            new SourceLocation(getHeaderSection().getStartLine(), getSourceSection().getEndLine()),\n            VmModifier.export(modifiers, false),\n            VmUtils.exportAnnotations(annotations),\n            member.getName().toString(),\n            typeParameters,\n            parameters,\n            TypeNode.export(returnTypeNode));\n\n    for (var parameter : typeParameters) {\n      // works because export() is called just once per FunctionNode (because PClass is cached)\n      parameter.initOwner(result);\n    }\n\n    return result;\n  }\n\n  private VmException wrongArgumentCount(int argCount) {\n    assert argCount != paramCount;\n\n    return exceptionBuilder()\n        .evalError(\"wrongFunctionArgumentCount\", paramCount, argCount)\n        .withSourceSection(member.getHeaderSection())\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/Lambda.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.util.Nullable;\n\npublic class Lambda extends Member {\n  public Lambda(SourceSection sourceSection, String qualifiedName) {\n    super(sourceSection, sourceSection, VmModifier.NONE, null, qualifiedName);\n  }\n\n  @Override\n  public @Nullable String getCallSignature() {\n    return null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ListingOrMappingTypeCastNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\n/** Performs a typecast on a Mapping entry value, or a Listing element. */\npublic final class ListingOrMappingTypeCastNode extends PklRootNode {\n\n  @Child private TypeNode typeNode;\n  private final String qualifiedName;\n\n  public ListingOrMappingTypeCastNode(\n      VmLanguage language, FrameDescriptor descriptor, TypeNode typeNode, String qualifiedName) {\n    super(language, descriptor);\n    this.typeNode = typeNode;\n    this.qualifiedName = qualifiedName;\n  }\n\n  public TypeNode getTypeNode() {\n    return typeNode;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return typeNode.getSourceSection();\n  }\n\n  @Override\n  public @Nullable String getName() {\n    return qualifiedName;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    return typeNode.execute(frame, frame.getArguments()[2]);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/LocalTypedPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\npublic final class LocalTypedPropertyNode extends RegularMemberNode {\n  private final VmLanguage language;\n  @Child private UnresolvedTypeNode unresolvedTypeNode;\n  @Child @LateInit private TypeNode typeNode;\n  private @Nullable Object defaultValue;\n  private boolean defaultValueInitialized;\n\n  public LocalTypedPropertyNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      ObjectMember member,\n      ExpressionNode bodyNode,\n      UnresolvedTypeNode unresolvedTypeNode) {\n\n    super(language, descriptor, member, bodyNode);\n\n    this.language = language;\n    this.unresolvedTypeNode = unresolvedTypeNode;\n  }\n\n  public @Nullable Object getDefaultValue(VirtualFrame frame) {\n    if (!defaultValueInitialized) {\n      defaultValue =\n          typeNode.createDefaultValue(\n              frame, language, member.getHeaderSection(), member.getQualifiedName());\n      defaultValueInitialized = true;\n    }\n    return defaultValue;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    if (typeNode == null) {\n      CompilerDirectives.transferToInterpreter();\n      typeNode = insert(unresolvedTypeNode.execute(frame));\n      unresolvedTypeNode = null;\n    }\n    var result = bodyNode.executeGeneric(frame);\n    return typeNode.execute(frame, result);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/Member.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class Member {\n  protected final SourceSection sourceSection;\n\n  protected final SourceSection headerSection;\n\n  protected final int modifiers;\n\n  protected final @Nullable Identifier name;\n\n  protected final String qualifiedName;\n\n  public Member(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      int modifiers,\n      @Nullable Identifier name,\n      String qualifiedName) {\n\n    this.sourceSection = sourceSection;\n    this.headerSection = headerSection;\n    this.modifiers = modifiers;\n    this.name = name;\n    this.qualifiedName = qualifiedName;\n  }\n\n  public final SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  public final SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  public final int getModifiers() {\n    return modifiers;\n  }\n\n  /** Null for members that don't have a name, such as listing/mapping members and lambdas. */\n  public @Nullable Identifier getNameOrNull() {\n    return name;\n  }\n\n  public Identifier getName() {\n    assert name != null;\n    return name;\n  }\n\n  /** For use in user-facing messages. May contain placeholders for computed name parts. */\n  public final String getQualifiedName() {\n    return qualifiedName;\n  }\n\n  /** For use in user-facing messages. Non-null iff getName() is non-null. */\n  public abstract @Nullable String getCallSignature();\n\n  public final boolean isLocal() {\n    return VmModifier.isLocal(modifiers);\n  }\n\n  public final boolean isConst() {\n    return VmModifier.isConst(modifiers);\n  }\n\n  public final boolean isFixed() {\n    return VmModifier.isFixed(modifiers);\n  }\n\n  public final boolean isHidden() {\n    return VmModifier.isHidden(modifiers);\n  }\n\n  public final boolean isExternal() {\n    return VmModifier.isExternal(modifiers);\n  }\n\n  public final boolean isClass() {\n    return VmModifier.isClass(modifiers);\n  }\n\n  public final boolean isTypeAlias() {\n    return VmModifier.isTypeAlias(modifiers);\n  }\n\n  public final boolean isImport() {\n    return VmModifier.isImport(modifiers);\n  }\n\n  public final boolean isGlob() {\n    return VmModifier.isGlob(modifiers);\n  }\n\n  public final boolean isAbstract() {\n    return VmModifier.isAbstract(modifiers);\n  }\n\n  public final boolean isType() {\n    return VmModifier.isType(modifiers);\n  }\n\n  public final boolean isLocalOrExternalOrHidden() {\n    return VmModifier.isLocalOrExternalOrHidden(modifiers);\n  }\n\n  public final boolean isConstOrFixed() {\n    return VmModifier.isConstOrFixed(modifiers);\n  }\n\n  public final boolean isLocalOrExternalOrAbstract() {\n    return VmModifier.isLocalOrExternalOrAbstract(modifiers);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ModuleNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmTyped;\n\npublic final class ModuleNode extends PklRootNode {\n  private final SourceSection sourceSection;\n  private final String moduleName;\n  private @Child ExpressionNode moduleNode;\n\n  public ModuleNode(\n      VmLanguage language,\n      SourceSection sourceSection,\n      String moduleName,\n      ExpressionNode moduleNode) {\n\n    super(language, new FrameDescriptor());\n    this.sourceSection = sourceSection;\n    this.moduleName = moduleName;\n    this.moduleNode = moduleNode;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  @Override\n  public String getName() {\n    return moduleName;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    var module = moduleNode.executeGeneric(frame);\n    if (module instanceof VmClass vmClass) {\n      return vmClass.getPrototype();\n    }\n\n    assert module instanceof VmTyped;\n    return module;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ObjectMember.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.MemberNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class ObjectMember extends Member {\n\n  @CompilationFinal private @Nullable Object constantValue;\n  @CompilationFinal private @Nullable MemberNode memberNode;\n\n  public ObjectMember(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      int modifiers,\n      @Nullable Identifier name,\n      String qualifiedName) {\n\n    super(sourceSection, headerSection, modifiers, name, qualifiedName);\n  }\n\n  public void initConstantValue(ConstantNode node) {\n    initConstantValue(node.getValue());\n  }\n\n  public void initConstantValue(Object value) {\n    assert constantValue == null;\n    assert memberNode == null;\n\n    constantValue = value;\n  }\n\n  public void initMemberNode(MemberNode node) {\n    assert constantValue == null;\n    assert memberNode == null;\n\n    memberNode = node;\n  }\n\n  /**\n   * Tells if this member is a property.\n   *\n   * <p>Not named `isProperty()` to work around <a\n   * href=\"https://bugs.openjdk.java.net/browse/JDK-8185424\">JDK-8185424</a> (which is apparently\n   * triggered by `-Xdoclint:none`).\n   */\n  public boolean isProp() {\n    return name != null;\n  }\n\n  /** Tells if this member is an element. */\n  public boolean isElement() {\n    return VmModifier.isElement(modifiers);\n  }\n\n  /**\n   * Tells if this member is an entry. Note that this returns true if an existing element is\n   * overridden with entry syntax (e.g., `[3] = ...`).\n   */\n  public boolean isEntry() {\n    return VmModifier.isEntry(modifiers);\n  }\n\n  public @Nullable Object getConstantValue() {\n    return constantValue;\n  }\n\n  public @Nullable MemberNode getMemberNode() {\n    return memberNode;\n  }\n\n  public RootCallTarget getCallTarget() {\n    assert constantValue == null : \"Must not call getCallTarget() if constantValue is non-null.\";\n\n    assert getMemberNode() != null\n        : \"Either constantValue or memberNode must be set, but both are null.\";\n\n    var callTarget = getMemberNode().getCallTarget();\n    assert callTarget != null;\n    return callTarget;\n  }\n\n  public boolean isUndefined(VirtualFrame frame) {\n    return getMemberNode() != null && getMemberNode().isUndefined(frame);\n  }\n\n  public @Nullable Object getLocalPropertyDefaultValue(VirtualFrame frame) {\n    assert isProp() && isLocal();\n    return getMemberNode() instanceof LocalTypedPropertyNode propertyNode\n        ? propertyNode.getDefaultValue(frame)\n        : VmDynamic.empty();\n  }\n\n  @Override\n  public @Nullable String getCallSignature() {\n    return name != null ? name.toString() : null;\n  }\n\n  public SourceSection getBodySection() {\n    if (getMemberNode() != null) {\n      return getMemberNode().getBodySection();\n    }\n\n    var source = sourceSection.getSource();\n    var start = headerSection.getCharEndIndex();\n    var offset = start - sourceSection.getCharIndex();\n    var candidate = source.createSection(start, sourceSection.getCharLength() - offset);\n    if (candidate.getCharLength() == 0) {\n      // TODO: return null or candidate?\n      return VmUtils.unavailableSourceSection();\n    }\n\n    var skip = 0;\n    var text = candidate.getCharacters();\n    var ch = text.charAt(skip);\n    // body section of entries needs to chomp the ending delimiter too.\n    while ((ch == ']' && isEntry()) || ch == '=' || Character.isWhitespace(ch)) {\n      ch = text.charAt(++skip);\n    }\n    return source.createSection(candidate.getCharIndex() + skip, candidate.getCharLength() - skip);\n  }\n\n  // sometimes used as key in VmObject.setCachedValue()\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    return this == obj;\n  }\n\n  // sometimes used as key in VmObject.setCachedValue()\n  @Override\n  public int hashCode() {\n    return System.identityHashCode(this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/ObjectMethodNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\npublic final class ObjectMethodNode extends RegularMemberNode {\n  private final VmLanguage language;\n  private final int parameterCount;\n  @Children private final @Nullable UnresolvedTypeNode[] unresolvedParameterTypeNodes;\n  @Child private @Nullable UnresolvedTypeNode unresolvedReturnTypeNode;\n\n  @CompilationFinal @LateInit private FunctionNode functionNode;\n\n  public ObjectMethodNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      ObjectMember member,\n      ExpressionNode bodyNode,\n      int parameterCount,\n      @Nullable UnresolvedTypeNode[] unresolvedParameterTypeNodes,\n      @Nullable UnresolvedTypeNode unresolvedReturnTypeNode) {\n\n    super(language, descriptor, member, bodyNode);\n\n    this.language = language;\n    this.parameterCount = parameterCount;\n    this.unresolvedParameterTypeNodes = unresolvedParameterTypeNodes;\n    this.unresolvedReturnTypeNode = unresolvedReturnTypeNode;\n  }\n\n  public @Nullable TypeNode getReturnTypeNode() {\n    // this method is only called from child nodes\n    assert functionNode != null;\n    return functionNode.getReturnTypeNode();\n  }\n\n  @Override\n  protected CallTarget executeImpl(VirtualFrame frame) {\n    if (functionNode == null) {\n      CompilerDirectives.transferToInterpreter();\n\n      var parameterTypeNodes =\n          VmUtils.resolveParameterTypes(frame, getFrameDescriptor(), unresolvedParameterTypeNodes);\n\n      var returnTypeNode =\n          unresolvedReturnTypeNode != null ? unresolvedReturnTypeNode.execute(frame) : null;\n\n      functionNode =\n          new FunctionNode(\n              language,\n              getFrameDescriptor(),\n              member,\n              parameterCount,\n              parameterTypeNodes,\n              returnTypeNode,\n              true,\n              bodyNode);\n    }\n\n    return functionNode.getCallTarget();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/PropertyTypeNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.PType;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeNode.UnknownTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class PropertyTypeNode extends PklRootNode {\n  private final String qualifiedPropertyName;\n  @Child private TypeNode typeNode;\n\n  private @Nullable Object defaultValue;\n  private boolean defaultValueInitialized;\n\n  @TruffleBoundary\n  public PropertyTypeNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      String qualifiedPropertyName,\n      TypeNode childNode) {\n\n    super(language, descriptor);\n    this.qualifiedPropertyName = qualifiedPropertyName;\n    this.typeNode = childNode;\n  }\n\n  public TypeNode getTypeNode() {\n    return typeNode;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return typeNode.getSourceSection();\n  }\n\n  @Override\n  public String getName() {\n    return qualifiedPropertyName;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    return typeNode.execute(frame, frame.getArguments()[2]);\n  }\n\n  public @Nullable Object getDefaultValue(VirtualFrame frame) {\n    if (!defaultValueInitialized) {\n      defaultValue =\n          typeNode.createDefaultValue(\n              frame, VmLanguage.get(this), getSourceSection(), qualifiedPropertyName);\n      // can't cache default value for `module` type in a non-final module because it's a self-type\n      // (the default value changes when inherited).\n      if (typeNode.isFinalType()) {\n        defaultValueInitialized = true;\n      }\n    }\n    return defaultValue;\n  }\n\n  public boolean isUnknownType() {\n    return typeNode instanceof UnknownTypeNode;\n  }\n\n  public PType export() {\n    return TypeNode.export(typeNode);\n  }\n\n  public VmTyped getMirror() {\n    return TypeNode.getMirror(typeNode);\n  }\n\n  public static PType export(@Nullable PropertyTypeNode node) {\n    return node != null ? node.export() : PType.UNKNOWN;\n  }\n\n  public static VmTyped getMirror(@Nullable PropertyTypeNode node) {\n    return node != null ? node.getMirror() : MirrorFactories.unknownTypeFactory.create(null);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/RegularMemberNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\n/** A {@code MemberNode} that belongs to a single {@link Member}. */\npublic abstract class RegularMemberNode extends MemberNode {\n  protected final Member member;\n\n  protected RegularMemberNode(\n      @Nullable VmLanguage language,\n      FrameDescriptor descriptor,\n      Member member,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor, bodyNode);\n    this.member = member;\n  }\n\n  @Override\n  public final SourceSection getSourceSection() {\n    return member.getSourceSection();\n  }\n\n  public final SourceSection getHeaderSection() {\n    return member.getHeaderSection();\n  }\n\n  @Override\n  public final String getName() {\n    return member.getQualifiedName();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/SharedMemberNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.MemberNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\n/** A {@code MemberNode} that is shared between multiple {@linkplain Member members}. */\npublic class SharedMemberNode extends MemberNode {\n  private final SourceSection sourceSection;\n  private final SourceSection headerSection;\n  private final @Nullable String qualifiedName;\n\n  public SharedMemberNode(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      @Nullable String qualifiedName,\n      @Nullable VmLanguage language,\n      FrameDescriptor descriptor,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor, bodyNode);\n    this.sourceSection = sourceSection;\n    this.headerSection = headerSection;\n    this.qualifiedName = qualifiedName;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  public SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  @Override\n  public @Nullable String getName() {\n    return qualifiedName;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    return bodyNode.executeGeneric(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/TypeAliasNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.VmTypeAlias;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class TypeAliasNode extends ExpressionNode {\n  private final SourceSection headerSection;\n  private final SourceSection @Nullable [] docComment;\n  @Children private final ExpressionNode[] annotationNodes;\n  private final int modifiers;\n  private final String simpleName;\n  private final String qualifiedName;\n  private final List<TypeParameter> typeParameters;\n  private @Child UnresolvedTypeNode typeAnnotationNode;\n\n  // use same caching scheme as ClassNode\n  @CompilationFinal private @Nullable VmTypeAlias cachedTypeAlias;\n\n  public TypeAliasNode(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      SourceSection @Nullable [] docComment,\n      ExpressionNode[] annotationNodes,\n      int modifiers,\n      String simpleName,\n      String qualifiedName,\n      List<TypeParameter> typeParameters,\n      UnresolvedTypeNode typeAnnotationNode) {\n    super(sourceSection);\n    this.headerSection = headerSection;\n    this.docComment = docComment;\n    this.annotationNodes = annotationNodes;\n    this.modifiers = modifiers;\n    this.simpleName = simpleName;\n    this.qualifiedName = qualifiedName;\n    this.typeParameters = typeParameters;\n    this.typeAnnotationNode = typeAnnotationNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (cachedTypeAlias != null) return cachedTypeAlias;\n\n    CompilerDirectives.transferToInterpreter();\n\n    var annotations = new ArrayList<VmTyped>();\n    var module = VmUtils.getTypedObjectReceiver(frame);\n\n    cachedTypeAlias =\n        new VmTypeAlias(\n            getSourceSection(),\n            headerSection,\n            docComment,\n            modifiers,\n            annotations,\n            simpleName,\n            module,\n            qualifiedName,\n            typeParameters,\n            frame.materialize());\n\n    VmUtils.evaluateAnnotations(frame, annotationNodes, annotations);\n    cachedTypeAlias.initTypeCheckNode(typeAnnotationNode.execute(frame));\n\n    return cachedTypeAlias;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/TypeCheckedPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Executed;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.expression.primary.GetOwnerNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\n/** A property definition that does not have a type annotation but should be type-checked. */\npublic abstract class TypeCheckedPropertyNode extends RegularMemberNode {\n  @Child @Executed protected ExpressionNode ownerNode = new GetOwnerNode();\n\n  protected TypeCheckedPropertyNode(\n      @Nullable VmLanguage language,\n      FrameDescriptor descriptor,\n      ObjectMember member,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor, member, bodyNode);\n\n    assert member.isProp();\n  }\n\n  @SuppressWarnings(\"unused\")\n  @Specialization(guards = \"owner.getVmClass() == cachedOwnerClass\")\n  protected Object evalTypedObjectCached(\n      VirtualFrame frame,\n      VmTyped owner,\n      @Cached(\"owner.getVmClass()\") VmClass cachedOwnerClass,\n      @Cached(\"getProperty(cachedOwnerClass)\") ClassProperty property,\n      @Cached(\"createTypeCheckCallNode(property)\") @Nullable DirectCallNode callNode) {\n\n    var result = bodyNode.executeGeneric(frame);\n\n    // TODO: propagate SUPER_CALL_MARKER to disable constraint (but not type) check\n    if (callNode != null && VmUtils.shouldRunTypeCheck(frame)) {\n      return callNode.call(VmUtils.getReceiverOrNull(frame), property.getOwner(), result);\n    }\n\n    return result;\n  }\n\n  @Specialization(guards = \"!owner.isDynamic()\")\n  protected Object eval(\n      VirtualFrame frame, VmObjectLike owner, @Cached(\"create()\") IndirectCallNode callNode) {\n\n    var result = bodyNode.executeGeneric(frame);\n\n    if (VmUtils.shouldRunTypeCheck(frame)) {\n      var property = getProperty(owner.getVmClass());\n      var typeAnnNode = property.getTypeNode();\n      if (typeAnnNode != null) {\n        return callNode.call(\n            typeAnnNode.getCallTarget(),\n            VmUtils.getReceiverOrNull(frame),\n            property.getOwner(),\n            result);\n      }\n    }\n\n    return result;\n  }\n\n  @Specialization\n  protected Object eval(VirtualFrame frame, @SuppressWarnings(\"unused\") VmDynamic owner) {\n    return bodyNode.executeGeneric(frame);\n  }\n\n  protected ClassProperty getProperty(VmClass ownerClass) {\n    ClassProperty result = ownerClass.getProperty(member.getName());\n    assert result != null;\n    return result;\n  }\n\n  protected @Nullable DirectCallNode createTypeCheckCallNode(ClassProperty property) {\n    var typeCheckNode = property.getTypeNode();\n    return typeCheckNode == null ? null : DirectCallNode.create(typeCheckNode.getCallTarget());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/TypedPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.DirectCallNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmUtils;\n\n/** A property definition that has a type annotation. */\npublic final class TypedPropertyNode extends RegularMemberNode {\n  @Child private DirectCallNode typeCheckCallNode;\n\n  @TruffleBoundary\n  public TypedPropertyNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      ObjectMember member,\n      ExpressionNode bodyNode,\n      PropertyTypeNode typeNode) {\n\n    super(language, descriptor, member, bodyNode);\n\n    assert member.isProp();\n\n    typeCheckCallNode = DirectCallNode.create(typeNode.getCallTarget());\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    var propertyValue = bodyNode.executeGeneric(frame);\n    if (VmUtils.shouldRunTypeCheck(frame)) {\n      return typeCheckCallNode.call(\n          VmUtils.getReceiver(frame), VmUtils.getOwner(frame), propertyValue);\n    }\n    return propertyValue;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/UnresolvedClassMemberNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class UnresolvedClassMemberNode extends PklNode {\n  protected final SourceSection headerSection;\n  protected final VmLanguage language;\n  protected final FrameDescriptor descriptor;\n  protected final SourceSection @Nullable [] docComment;\n  protected final @Children ExpressionNode[] annotationNodes;\n  protected final int modifiers;\n  protected final Identifier name;\n  protected final String qualifiedName;\n\n  public UnresolvedClassMemberNode(\n      VmLanguage language,\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      FrameDescriptor descriptor,\n      SourceSection @Nullable [] docComment,\n      ExpressionNode[] annotationNodes,\n      int modifiers,\n      Identifier name,\n      String qualifiedName) {\n\n    super(sourceSection);\n    this.headerSection = headerSection;\n    this.language = language;\n    this.descriptor = descriptor;\n    this.docComment = docComment;\n    this.annotationNodes = annotationNodes;\n    this.modifiers = modifiers;\n    this.name = name;\n    this.qualifiedName = qualifiedName;\n  }\n\n  public abstract ClassMember execute(VirtualFrame frame, VmClass clazz);\n\n  public String getQualifiedName() {\n    return qualifiedName;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/UnresolvedFunctionNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerAsserts;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class UnresolvedFunctionNode extends PklNode {\n  private final VmLanguage language;\n  private final FrameDescriptor descriptor;\n  private final Member member;\n  private final int parameterCount;\n  @Children private final @Nullable UnresolvedTypeNode[] unresolvedParameterTypeNodes;\n  @Child private @Nullable UnresolvedTypeNode unresolvedReturnTypeNode;\n  private final ExpressionNode bodyNode;\n\n  public UnresolvedFunctionNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      Member member,\n      int parameterCount,\n      @Nullable UnresolvedTypeNode[] unresolvedParameterTypeNodes,\n      @Nullable UnresolvedTypeNode unresolvedReturnTypeNode,\n      ExpressionNode bodyNode) {\n\n    super(member.getSourceSection());\n\n    this.language = language;\n    this.descriptor = descriptor;\n    this.member = member;\n    this.parameterCount = parameterCount;\n    this.unresolvedParameterTypeNodes = unresolvedParameterTypeNodes;\n    this.unresolvedReturnTypeNode = unresolvedReturnTypeNode;\n    this.bodyNode = bodyNode;\n  }\n\n  public FunctionNode execute(VirtualFrame frame) {\n    CompilerAsserts.neverPartOfCompilation();\n\n    var parameterTypeNodes =\n        VmUtils.resolveParameterTypes(frame, descriptor, unresolvedParameterTypeNodes);\n    var returnTypeNode =\n        unresolvedReturnTypeNode != null ? unresolvedReturnTypeNode.execute(frame) : null;\n\n    return new FunctionNode(\n        language,\n        descriptor,\n        member,\n        parameterCount,\n        parameterTypeNodes,\n        returnTypeNode,\n        true,\n        bodyNode);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/UnresolvedMethodNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class UnresolvedMethodNode extends UnresolvedClassMemberNode {\n  private final int parameterCount;\n  private final List<TypeParameter> typeParameters;\n  @Children private final @Nullable UnresolvedTypeNode[] unresolvedParameterTypeNodes;\n  @Child private @Nullable UnresolvedTypeNode unresolvedReturnTypeNode;\n  private final boolean isReturnTypeChecked;\n  private final ExpressionNode bodyNode;\n\n  public UnresolvedMethodNode(\n      VmLanguage language,\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      FrameDescriptor descriptor,\n      SourceSection @Nullable [] docComment,\n      ExpressionNode[] annotationNodes,\n      int modifiers,\n      Identifier name,\n      String qualifiedName,\n      int parameterCount,\n      List<TypeParameter> typeParameters,\n      @Nullable UnresolvedTypeNode[] unresolvedParameterTypeNodes,\n      @Nullable UnresolvedTypeNode unresolvedReturnTypeNode,\n      boolean isReturnTypeChecked,\n      ExpressionNode bodyNode) {\n\n    super(\n        language,\n        sourceSection,\n        headerSection,\n        descriptor,\n        docComment,\n        annotationNodes,\n        modifiers,\n        name,\n        qualifiedName);\n\n    this.parameterCount = parameterCount;\n    this.typeParameters = typeParameters;\n    this.unresolvedParameterTypeNodes = unresolvedParameterTypeNodes;\n    this.unresolvedReturnTypeNode = unresolvedReturnTypeNode;\n    this.isReturnTypeChecked = isReturnTypeChecked;\n    this.bodyNode = bodyNode;\n  }\n\n  public Identifier getName() {\n    return name;\n  }\n\n  public SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  public boolean isLocal() {\n    return VmModifier.isLocal(modifiers);\n  }\n\n  @Override\n  public ClassMethod execute(VirtualFrame frame, VmClass clazz) {\n    CompilerDirectives.transferToInterpreter();\n\n    var annotations = VmUtils.evaluateAnnotations(frame, annotationNodes);\n    var parameterTypeNodes =\n        VmUtils.resolveParameterTypes(frame, descriptor, unresolvedParameterTypeNodes);\n    var returnTypeNode =\n        unresolvedReturnTypeNode != null ? unresolvedReturnTypeNode.execute(frame) : null;\n\n    String deprecation = null;\n    for (var annotation : annotations) {\n      if (annotation.getVmClass() == BaseModule.getDeprecatedClass()) {\n        var messageObj = VmUtils.readMemberOrNull(annotation, Identifier.MESSAGE);\n        deprecation = messageObj instanceof String string ? string : \"\";\n        break;\n      }\n    }\n\n    ClassMethod method =\n        new ClassMethod(\n            sourceSection,\n            headerSection,\n            modifiers,\n            name,\n            qualifiedName,\n            docComment,\n            annotations,\n            clazz.getPrototype(),\n            typeParameters,\n            deprecation);\n\n    FunctionNode functionNode =\n        new FunctionNode(\n            language,\n            descriptor,\n            method,\n            parameterCount,\n            parameterTypeNodes,\n            returnTypeNode,\n            isReturnTypeChecked,\n            bodyNode);\n\n    method.initFunctionNode(functionNode);\n    return method;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/UnresolvedPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\n\npublic final class UnresolvedPropertyNode extends UnresolvedClassMemberNode {\n  private final SourceSection propertyNameSection;\n  private @Child @Nullable UnresolvedTypeNode unresolvedTypeNode;\n  private final @Nullable ExpressionNode bodyNode;\n\n  public UnresolvedPropertyNode(\n      VmLanguage language,\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      SourceSection propertyNameSection,\n      FrameDescriptor descriptor,\n      SourceSection @Nullable [] docComment,\n      ExpressionNode[] annotationNodes,\n      int modifiers,\n      Identifier name,\n      String qualifiedName,\n      @Nullable UnresolvedTypeNode unresolvedTypeNode,\n      @Nullable ExpressionNode bodyNode) {\n\n    super(\n        language,\n        sourceSection,\n        headerSection,\n        descriptor,\n        docComment,\n        annotationNodes,\n        modifiers,\n        name,\n        qualifiedName);\n    this.propertyNameSection = propertyNameSection;\n    this.unresolvedTypeNode = unresolvedTypeNode;\n    this.bodyNode = bodyNode;\n  }\n\n  public Identifier getName() {\n    return name;\n  }\n\n  public SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  public boolean isLocal() {\n    return VmModifier.isLocal(modifiers);\n  }\n\n  public boolean isClass() {\n    return VmModifier.isClass(modifiers);\n  }\n\n  public boolean isTypeAlias() {\n    return VmModifier.isTypeAlias(modifiers);\n  }\n\n  public boolean isImport() {\n    return VmModifier.isImport(modifiers);\n  }\n\n  private void checkOverride(VmClass clazz) {\n    var superClass = clazz.getSuperclass();\n    if (superClass == null) {\n      return;\n    }\n    var superProperty = superClass.getProperty(name);\n    if (superProperty == null) {\n      return;\n    }\n    var isFixed = VmModifier.isFixed(modifiers);\n    if (superProperty.isFixed() == isFixed) {\n      return;\n    }\n    CompilerDirectives.transferToInterpreter();\n    if (superProperty.isFixed()) {\n      throw exceptionBuilder()\n          .withSourceSection(headerSection)\n          .evalError(\n              \"missingFixedModifier\",\n              name,\n              superClass.getQualifiedName(),\n              sourceSection.getCharacters())\n          .build();\n    }\n    var source = headerSection.getCharacters().toString();\n    var fixedModifierIdx = source.indexOf(\"fixed\");\n    throw exceptionBuilder()\n        .withSourceSection(\n            headerSection\n                .getSource()\n                .createSection(headerSection.getCharIndex() + fixedModifierIdx, 5))\n        .evalError(\"cannotApplyFixedModifier\", name, superClass.getQualifiedName())\n        .build();\n  }\n\n  private void checkConst(VmClass clazz) {\n    var superClass = clazz.getSuperclass();\n    if (superClass == null) {\n      return;\n    }\n    var superProperty = superClass.getProperty(name);\n    if (superProperty == null) {\n      return;\n    }\n    var isConst = VmModifier.isConst(modifiers);\n    if (superProperty.isConst() == isConst) {\n      return;\n    }\n    CompilerDirectives.transferToInterpreter();\n\n    if (superProperty.isConst()) {\n      throw exceptionBuilder()\n          .withSourceSection(headerSection)\n          .evalError(\n              \"missingConstModifier\",\n              name,\n              superClass.getQualifiedName(),\n              sourceSection.getCharacters())\n          .build();\n    }\n    var source = headerSection.getCharacters().toString();\n    var constModifierIdx = source.indexOf(\"const\");\n    throw exceptionBuilder()\n        .withSourceSection(\n            headerSection\n                .getSource()\n                .createSection(headerSection.getCharIndex() + constModifierIdx, 5))\n        .evalError(\"cannotApplyConstModifier\", name, superClass.getQualifiedName())\n        .build();\n  }\n\n  @Override\n  public ClassProperty execute(VirtualFrame frame, VmClass clazz) {\n    CompilerDirectives.transferToInterpreter();\n\n    var annotations = VmUtils.evaluateAnnotations(frame, annotationNodes);\n\n    var typeNode =\n        unresolvedTypeNode == null\n            ? null\n            : new PropertyTypeNode(\n                language, descriptor, qualifiedName, unresolvedTypeNode.execute(frame));\n\n    checkOverride(clazz);\n    checkConst(clazz);\n\n    var effectiveBodyNode =\n        bodyNode != null\n            ? bodyNode\n            :\n            // use propertyNameSection as source section of implicit property default\n            // to improve stack traces signaling failed type check of such a default\n            new DefaultPropertyBodyNode(propertyNameSection, name, typeNode);\n\n    var initializer =\n        VmUtils.createObjectProperty(\n            language,\n            sourceSection,\n            headerSection,\n            name,\n            qualifiedName,\n            descriptor,\n            modifiers,\n            effectiveBodyNode,\n            typeNode);\n\n    return new ClassProperty(\n        sourceSection,\n        headerSection,\n        modifiers,\n        name,\n        qualifiedName,\n        docComment,\n        annotations,\n        clazz.getPrototype(),\n        typeNode,\n        initializer);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/UntypedObjectMemberNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.member;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\npublic final class UntypedObjectMemberNode extends RegularMemberNode {\n  public UntypedObjectMemberNode(\n      @Nullable VmLanguage language,\n      FrameDescriptor descriptor,\n      ObjectMember member,\n      ExpressionNode bodyNode) {\n\n    super(language, descriptor, member, bodyNode);\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    return bodyNode.executeGeneric(frame);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/member/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.member;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/repl/ResolveClassMemberNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.repl;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.member.UnresolvedClassMemberNode;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmLanguage;\n\npublic final class ResolveClassMemberNode extends PklRootNode {\n  @Child private UnresolvedClassMemberNode unresolvedNode;\n  private final VmClass clazz;\n\n  public ResolveClassMemberNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      UnresolvedClassMemberNode unresolvedNode,\n      VmClass clazz) {\n\n    super(language, descriptor);\n    this.clazz = clazz;\n    this.unresolvedNode = unresolvedNode;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return unresolvedNode.getSourceSection();\n  }\n\n  @Override\n  public String getName() {\n    return unresolvedNode.getQualifiedName();\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    return unresolvedNode.execute(frame, clazz);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/repl/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.repl;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/GetParentForTypeNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.LateInit;\n\n/** Resolves `<type>` to the type's default value in `new <type> { ... }`. */\npublic final class GetParentForTypeNode extends ExpressionNode {\n  @Child private UnresolvedTypeNode unresolvedTypeNode;\n  @Child private TypeNode typeNode;\n  private final String qualifiedName;\n\n  @CompilationFinal @LateInit Object defaultValue;\n\n  public GetParentForTypeNode(\n      SourceSection sourceSection, UnresolvedTypeNode unresolvedTypeNode, String qualifiedName) {\n    super(sourceSection);\n    this.unresolvedTypeNode = unresolvedTypeNode;\n    this.qualifiedName = qualifiedName;\n  }\n\n  private TypeNode getTypeNode(VirtualFrame frame) {\n    if (typeNode == null) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      typeNode = unresolvedTypeNode.execute(frame);\n      adoptChildren();\n    }\n    return typeNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (defaultValue != null) return defaultValue;\n    CompilerDirectives.transferToInterpreterAndInvalidate();\n\n    var typeNode = getTypeNode(frame);\n    var defaultValue =\n        typeNode.createDefaultValue(frame, VmLanguage.get(this), sourceSection, qualifiedName);\n\n    // can't cache default value for `module` type in a non-final module because it's a self-type\n    // (the default value changes when inherited).\n    if (typeNode.isFinalType() && defaultValue != null) {\n      unresolvedTypeNode = null;\n      this.defaultValue = defaultValue;\n    }\n\n    if (defaultValue != null) {\n      return defaultValue;\n    }\n\n    // try to produce a more specific error message than \"cannotInstantiateType\"\n    var clazz = typeNode.getVmClass();\n    if (clazz != null) VmUtils.checkIsInstantiable(clazz, typeNode);\n\n    throw exceptionBuilder()\n        .evalError(\"cannotInstantiateType\", typeNode.getSourceSection().getCharacters())\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/IdentityMixinNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\n/** Root node for a mixin used as default value for type `Mixin<Foo>`. */\npublic final class IdentityMixinNode extends PklRootNode {\n  private final SourceSection sourceSection;\n  private final String qualifiedName;\n  @Child private @Nullable TypeNode argumentTypeNode;\n\n  public IdentityMixinNode(\n      VmLanguage language,\n      FrameDescriptor descriptor,\n      SourceSection sourceSection,\n      String qualifiedName,\n      @Nullable TypeNode argumentTypeNode) {\n    super(language, descriptor);\n    this.qualifiedName = qualifiedName;\n    this.sourceSection = sourceSection;\n    this.argumentTypeNode = argumentTypeNode;\n  }\n\n  @Override\n  public SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  @Override\n  public String getName() {\n    return qualifiedName;\n  }\n\n  @Override\n  protected Object executeImpl(VirtualFrame frame) {\n    var arguments = frame.getArguments();\n    if (arguments.length != 3) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"wrongFunctionArgumentCount\", 1, arguments.length - 2)\n          .withSourceSection(sourceSection)\n          .build();\n    }\n    var argument = arguments[2];\n    if (argumentTypeNode != null) {\n      return argumentTypeNode.execute(frame, argument);\n    }\n    return argument;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/ResolveDeclaredTypeNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class ResolveDeclaredTypeNode extends ExpressionNode {\n  @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n  protected ResolveDeclaredTypeNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  protected VmTyped getEnclosingModule(VmObjectLike initialOwner) {\n    var curr = initialOwner;\n    var next = curr.getEnclosingOwner();\n\n    while (next != null) {\n      curr = next;\n      next = next.getEnclosingOwner();\n    }\n\n    assert curr.isModuleObject();\n    return (VmTyped) curr;\n  }\n\n  protected VmTyped getImport(\n      VmTyped module, Identifier importName, SourceSection importNameSection) {\n    assert importName.isLocalProp();\n\n    var member = module.getMember(importName);\n    if (member == null) {\n      throw exceptionBuilder()\n          .evalError(\"cannotFindModuleImport\", importName)\n          .withSourceSection(importNameSection)\n          .build();\n    }\n\n    if (!member.isImport()) {\n      throw exceptionBuilder()\n          .evalError(\"notAModuleImport\", importName)\n          .withSourceSection(importNameSection)\n          .build();\n    }\n\n    if (member.isGlob()) {\n      throw exceptionBuilder()\n          .evalError(\"notAType\", importName)\n          .withSourceSection(importNameSection)\n          .build();\n    }\n\n    assert member.getConstantValue() == null;\n    var result = module.getCachedValue(importName);\n    if (result == null) {\n      result = callNode.call(member.getCallTarget(), module, module, importName);\n      module.setCachedValue(importName, result);\n    }\n    return (VmTyped) result;\n  }\n\n  protected @Nullable Object getType(\n      VmTyped module, Identifier typeName, SourceSection typeNameSection) {\n    var member = module.getMember(typeName);\n    if (member == null) return null;\n\n    if (!member.isType()) {\n      throw exceptionBuilder()\n          .evalError(\"notAType\", typeName)\n          .withSourceSection(typeNameSection)\n          .build();\n    }\n\n    assert member.getConstantValue() == null;\n    var result = module.getCachedValue(typeName);\n    if (result == null) {\n      result = callNode.call(member.getCallTarget(), module, module, typeName);\n      module.setCachedValue(typeName, result);\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/ResolveQualifiedDeclaredTypeNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\npublic final class ResolveQualifiedDeclaredTypeNode extends ResolveDeclaredTypeNode {\n  private final SourceSection moduleNameSection;\n  private final SourceSection typeNameSection;\n  private final Identifier moduleName;\n  private final Identifier typeName;\n\n  public ResolveQualifiedDeclaredTypeNode(\n      SourceSection sourceSection,\n      SourceSection moduleNameSection,\n      SourceSection typeNameSection,\n      Identifier moduleName,\n      Identifier typeName) {\n\n    super(sourceSection);\n    this.moduleNameSection = moduleNameSection;\n    this.typeNameSection = typeNameSection;\n    this.moduleName = moduleName;\n    this.typeName = typeName;\n\n    assert moduleName.isLocalProp();\n    assert typeName.isRegular();\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    CompilerDirectives.transferToInterpreter();\n\n    var enclosingModule = getEnclosingModule(VmUtils.getOwner(frame));\n    var importedModule = getImport(enclosingModule, moduleName, moduleNameSection);\n\n    // search module hierarchy\n    // (type declared in base module is accessible through extending and amending modules)\n    for (var currModule = importedModule; currModule != null; currModule = currModule.getParent()) {\n      var result = getType(currModule, typeName, sourceSection);\n      if (result != null) return result;\n    }\n\n    throw exceptionBuilder()\n        .evalError(\n            \"cannotFindQualifiedType\", typeName, importedModule.getModuleInfo().getModuleName())\n        .withSourceSection(typeNameSection)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/ResolveSimpleDeclaredTypeNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.runtime.*;\n\npublic final class ResolveSimpleDeclaredTypeNode extends ResolveDeclaredTypeNode {\n  private final Identifier typeName;\n  private final boolean isBaseModule;\n\n  public ResolveSimpleDeclaredTypeNode(\n      SourceSection sourceSection, Identifier typeName, boolean isBaseModule) {\n\n    super(sourceSection);\n    this.typeName = typeName;\n    this.isBaseModule = isBaseModule;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    CompilerDirectives.transferToInterpreter();\n\n    var localTypeName = typeName.toLocalProperty();\n    var enclosingModule = getEnclosingModule(VmUtils.getOwner(frame));\n\n    // search enclosing module for local class/type alias or module import\n    var result = getType(enclosingModule, localTypeName, sourceSection);\n    if (result != null) return result;\n\n    // search module hierarchy\n    var currModule = enclosingModule;\n    do {\n      result = getType(currModule, typeName, sourceSection);\n      if (result != null) return result;\n\n      // search base module (after enclosing module, before parent modules)\n      if (!isBaseModule && currModule == enclosingModule) {\n        result = getType(BaseModule.getModule(), typeName, sourceSection);\n        if (result != null) return result;\n      }\n\n      currModule = currModule.getParent();\n    } while (currModule != null);\n\n    throw exceptionBuilder()\n        .evalError(\n            \"cannotFindSimpleType\", typeName, enclosingModule.getModuleInfo().getModuleName())\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/TypeCastNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.util.LateInit;\n\n@NodeInfo(shortName = \"as\")\npublic final class TypeCastNode extends ExpressionNode {\n  @Child private ExpressionNode valueNode;\n  @Child private UnresolvedTypeNode unresolvedTypeNode;\n  @Child @LateInit private TypeNode typeNode;\n\n  public TypeCastNode(\n      SourceSection sourceSection,\n      ExpressionNode valueNode,\n      UnresolvedTypeNode unresolvedTypeNode) {\n    super(sourceSection);\n    this.valueNode = valueNode;\n    this.unresolvedTypeNode = unresolvedTypeNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    if (typeNode == null) {\n      // don't compile unresolvedTypeNode.execute()\n      // invalidation is done by insert()\n      CompilerDirectives.transferToInterpreter();\n      typeNode = insert(unresolvedTypeNode.execute(frame));\n      unresolvedTypeNode = null;\n    }\n\n    var value = valueNode.executeGeneric(frame);\n    try {\n      return typeNode.execute(frame, value);\n    } catch (VmTypeMismatchException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw e.toVmException();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/TypeConstraintNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"bodyNode\", type = ExpressionNode.class)\npublic abstract class TypeConstraintNode extends PklNode {\n\n  @CompilationFinal private int customThisSlot = -1;\n\n  protected TypeConstraintNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  public abstract void execute(VirtualFrame frame);\n\n  protected abstract ExpressionNode getBodyNode();\n\n  public String export() {\n    return getSourceSection().getCharacters().toString();\n  }\n\n  @Specialization\n  protected void eval(VirtualFrame frame, boolean result) {\n    initConstraintSlot(frame);\n\n    if (!result) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var vmContext = VmContext.get(this);\n      var localContext = VmLanguage.get(this).localContext.get();\n      // Use power assertions if enabled and not in type test or already instrumenting.\n      // This prevents `is` checks from triggering instrumentation, but allows them to\n      // participate if instrumentation is already active.\n      var usePowerAssertions =\n          vmContext.getPowerAssertionsEnabled()\n              && (!localContext.isInTypeTest() || localContext.hasActiveTracker());\n      if (usePowerAssertions) {\n        try (var valueTracker = vmContext.getValueTrackerFactory().create()) {\n          getBodyNode().executeGeneric(frame);\n          throw new VmTypeMismatchException.Constraint(\n              sourceSection,\n              frame.getAuxiliarySlot(customThisSlot),\n              sourceSection,\n              valueTracker.values());\n        }\n      } else {\n        throw new VmTypeMismatchException.Constraint(\n            sourceSection, frame.getAuxiliarySlot(customThisSlot), sourceSection, null);\n      }\n    }\n  }\n\n  @Specialization\n  protected void eval(\n      VirtualFrame frame,\n      VmFunction function,\n      @Cached(value = \"createApplyNode()\", neverDefault = true) ApplyVmFunction1Node applyNode) {\n    initConstraintSlot(frame);\n\n    var value = frame.getAuxiliarySlot(customThisSlot);\n    var result = applyNode.executeBoolean(function, value);\n    if (!result) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      var vmContext = VmContext.get(this);\n      var localContext = VmLanguage.get(this).localContext.get();\n      // Use power assertions if enabled and not in type test or already instrumenting.\n      // This prevents `is` checks from triggering instrumentation, but allows them to\n      // participate if instrumentation is already active.\n      var usePowerAssertions =\n          vmContext.getPowerAssertionsEnabled()\n              && (!localContext.isInTypeTest() || localContext.hasActiveTracker());\n      if (usePowerAssertions) {\n        try (var valueTracker = vmContext.getValueTrackerFactory().create()) {\n          applyNode.executeBoolean(function, value);\n          throw new VmTypeMismatchException.Constraint(\n              sourceSection,\n              value,\n              function.getRootNode().getSourceSection(),\n              valueTracker.values());\n        }\n      } else {\n        throw new VmTypeMismatchException.Constraint(\n            sourceSection, value, function.getRootNode().getSourceSection(), null);\n      }\n    }\n  }\n\n  @Fallback\n  protected void fallback(Object object) {\n    // supplying a type constraint that's neither a boolean nor a function\n    // is always fatal (even within a union type), hence throw VmEvalException\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .typeMismatch(object, BaseModule.getBooleanClass(), BaseModule.getFunctionClass())\n        .build();\n  }\n\n  protected static ApplyVmFunction1Node createApplyNode() {\n    return ApplyVmFunction1Node.create();\n  }\n\n  private void initConstraintSlot(VirtualFrame frame) {\n    if (customThisSlot == -1) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      // deferred until execution time s.t. nodes of inlined type aliases get the right frame slot\n      customThisSlot = VmUtils.findCustomThisSlot(frame);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/TypeNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.Frame;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.FrameSlotKind;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport org.pkl.core.PType;\nimport org.pkl.core.PType.StringLiteral;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.*;\nimport org.pkl.core.ast.builder.SymbolTable.CustomThisScope;\nimport org.pkl.core.ast.expression.primary.GetModuleNode;\nimport org.pkl.core.ast.frame.WriteFrameSlotNode;\nimport org.pkl.core.ast.frame.WriteFrameSlotNodeGen;\nimport org.pkl.core.ast.internal.SyntheticNode;\nimport org.pkl.core.ast.member.DefaultPropertyBodyNode;\nimport org.pkl.core.ast.member.ListingOrMappingTypeCastNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.member.UntypedObjectMemberNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.EconomicSets;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.core.util.Nonnull;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class TypeNode extends PklNode {\n\n  public interface ClassTypeNode {\n    VmClass getVmClass();\n  }\n\n  protected TypeNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  public boolean isNoopTypeCheck() {\n    return false;\n  }\n\n  public abstract FrameSlotKind getFrameSlotKind();\n\n  /**\n   * Initializes this node's frame slot. Called if this node is a function/method parameter type.\n   * Kept separate from constructor so that {@link TypeAliasTypeNode} can initialize frame slot of\n   * its cloned child node.\n   */\n  public abstract TypeNode initWriteSlotNode(int slot);\n\n  /**\n   * Checks if {@code value} conforms to this type.\n   *\n   * <p>Possibly returns a new object with type-casted members, in the case of {@link\n   * MappingTypeNode} or {@link ListingTypeNode}.\n   *\n   * <p>If {@link VmLocalContext#shouldEagerTypecheck()} is true, this method will always do an\n   * eager check.\n   *\n   * <p>If not, throws a {@link VmTypeMismatchException}.\n   */\n  public final Object execute(VirtualFrame frame, Object value) {\n    var localContext = VmLanguage.get(this).localContext.get();\n    if (localContext.shouldEagerTypecheck()) {\n      return executeEagerly(frame, value);\n    }\n    return executeLazily(frame, value);\n  }\n\n  /**\n   * Checks if {@code value} conforms to this type, and possibly casts it in the case of {@link\n   * MappingTypeNode} or {@link ListingTypeNode}.\n   */\n  protected abstract Object executeLazily(VirtualFrame frame, Object value);\n\n  /**\n   * Checks if {@code value} conforms to this type, and possibly casts its value.\n   *\n   * <p>If {@code value} is conforming, sets {@code slot} to {@code value}. Otherwise, throws a\n   * {@link VmTypeMismatchException}.\n   */\n  public abstract Object executeAndSet(VirtualFrame frame, Object value);\n\n  /**\n   * Checks if {@code value} conforms to this type.\n   *\n   * <p>In the case of a parameterized {@link VmObject} (e.g. {@link VmListing}), shallow-force and\n   * check its members.\n   */\n  public Object executeEagerly(VirtualFrame frame, Object value) {\n    return executeLazily(frame, value);\n  }\n\n  // method arguments are used when default value contains a root node\n  public @Nullable Object createDefaultValue(\n      VirtualFrame frame,\n      VmLanguage language,\n      // header section of the property or method that carries the type annotation\n      SourceSection headerSection,\n      // qualified name of the property or method that carries the type annotation\n      String qualifiedName) {\n    return null;\n  }\n\n  public final boolean isFinalType() {\n    var ret = new MutableBoolean(true);\n    acceptTypeNode(\n        true,\n        typeNode -> {\n          // assumption: don't need to worry about `NonFinalClassTypeNode`\n          if (typeNode instanceof NonFinalModuleTypeNode) {\n            ret.set(false);\n            return false;\n          }\n          return true;\n        });\n    return ret.get();\n  }\n\n  /** Visit child type nodes of this type. */\n  protected abstract boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer);\n\n  protected VmTypeMismatchException constraintException(Object value, SourceSection sourceSection) {\n    throw new VmTypeMismatchException.Constraint(\n        sourceSection,\n        value,\n        sourceSection,\n        Map.of(new SyntheticNode(sourceSection), List.of(false)));\n  }\n\n  public static TypeNode forClass(SourceSection sourceSection, VmClass clazz) {\n    return clazz.isClosed()\n        ? new FinalClassTypeNode(sourceSection, clazz)\n        : TypeNodeFactory.NonFinalClassTypeNodeGen.create(sourceSection, clazz);\n  }\n\n  public static PType export(@Nullable TypeNode node) {\n    return node != null ? node.doExport() : PType.UNKNOWN;\n  }\n\n  public static VmTyped getMirror(@Nullable TypeNode node) {\n    return node != null ? node.getMirror() : MirrorFactories.unknownTypeFactory.create(null);\n  }\n\n  public static VmList getMirrors(TypeNode[] nodes) {\n    var builder = VmList.EMPTY.builder();\n    for (var node : nodes) {\n      builder.add(node.getMirror());\n    }\n    return builder.build();\n  }\n\n  protected PType doExport() {\n    var alias = getVmTypeAlias();\n    // needs to come before `clazz != null` check\n    if (alias != null) {\n      return new PType.Alias(alias.export());\n    }\n    var clazz = getVmClass();\n    if (clazz != null) {\n      return new PType.Class(clazz.export());\n    }\n    CompilerDirectives.transferToInterpreter();\n    throw exceptionBuilder()\n        .bug(\"`%s` must override method `doExport()`.\", getClass().getTypeName())\n        .build();\n  }\n\n  protected boolean isParametric() {\n    return false;\n  }\n\n  /** Tells if this typenode is the same typecheck as the other typenode. */\n  public boolean isEquivalentTo(TypeNode other) {\n    return this == other || doIsEquivalentTo(other);\n  }\n\n  protected abstract boolean doIsEquivalentTo(TypeNode other);\n\n  public @Nullable VmClass getVmClass() {\n    return null;\n  }\n\n  public @Nullable VmTypeAlias getVmTypeAlias() {\n    return null;\n  }\n\n  public VmTyped getMirror() {\n    return MirrorFactories.classTypeFactory.create(this);\n  }\n\n  public VmList getTypeArgumentMirrors() {\n    return VmList.EMPTY;\n  }\n\n  protected final VmTypeMismatchException typeMismatch(Object actualValue, Object expectedType) {\n    return new VmTypeMismatchException.Simple(sourceSection, actualValue, expectedType);\n  }\n\n  /**\n   * Base class for types whose `executeAndSet` method assigns values to slots with\n   * `frame.setXYZ(slot, value)`.\n   */\n  public abstract static class FrameSlotTypeNode extends TypeNode {\n    @CompilationFinal protected int slot = -1;\n\n    @CompilationFinal @Child protected WriteFrameSlotNode writeFrameSlotNode;\n\n    protected FrameSlotTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public TypeNode initWriteSlotNode(int slot) {\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      this.slot = slot;\n      writeFrameSlotNode = WriteFrameSlotNodeGen.create(sourceSection, slot, null);\n      return this;\n    }\n  }\n\n  public abstract static class IntSlotTypeNode extends FrameSlotTypeNode {\n    protected IntSlotTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    public final FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Long;\n    }\n\n    @Override\n    public final Object executeAndSet(VirtualFrame frame, Object value) {\n      execute(frame, value);\n      frame.setLong(slot, (long) value);\n      return value;\n    }\n  }\n\n  public abstract static class ObjectSlotTypeNode extends FrameSlotTypeNode {\n    protected ObjectSlotTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    public final FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Object;\n    }\n\n    @Override\n    public final Object executeAndSet(VirtualFrame frame, Object value) {\n      var result = execute(frame, value);\n      frame.setObject(slot, result);\n      return result;\n    }\n  }\n\n  /**\n   * Base class for types whose `executeAndSet` method assigns values to slots with a\n   * `WriteFrameSlotNode`.\n   */\n  public abstract static class WriteFrameSlotTypeNode extends TypeNode {\n    @CompilationFinal protected int slot;\n    @Child @LateInit private WriteFrameSlotNode writeSlotNode;\n\n    protected WriteFrameSlotTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public final FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Illegal;\n    }\n\n    @Override\n    public TypeNode initWriteSlotNode(int slot) {\n      //noinspection ConstantConditions\n      writeSlotNode = WriteFrameSlotNodeGen.create(VmUtils.unavailableSourceSection(), slot, null);\n      this.slot = slot;\n      return this;\n    }\n\n    @Override\n    public final Object executeAndSet(VirtualFrame frame, Object value) {\n      var result = executeLazily(frame, value);\n      writeSlotNode.executeWithValue(frame, result);\n      return result;\n    }\n  }\n\n  /** The `unknown` type. */\n  public static final class UnknownTypeNode extends WriteFrameSlotTypeNode {\n    public UnknownTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public boolean isNoopTypeCheck() {\n      return true;\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof UnknownTypeNode;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      // do nothing\n      return value;\n    }\n\n    public VmTyped getMirror() {\n      return MirrorFactories.unknownTypeFactory.create(null);\n    }\n\n    @Override\n    protected PType doExport() {\n      return PType.UNKNOWN;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  /** The `nothing` type. */\n  public static final class NothingTypeNode extends TypeNode {\n    public NothingTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public TypeNode initWriteSlotNode(int slot) {\n      // do nothing\n      return this;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmTypeMismatchException.Nothing(sourceSection, value);\n    }\n\n    @Override\n    public Object executeAndSet(VirtualFrame frame, Object value) {\n      executeLazily(frame, value);\n      // guaranteed to never run (execute will always throw).\n      CompilerDirectives.transferToInterpreter();\n      throw PklBugException.unreachableCode();\n    }\n\n    @Override\n    public FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Illegal;\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.nothingTypeFactory.create(null);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof NothingTypeNode;\n    }\n\n    @Override\n    protected PType doExport() {\n      return PType.NOTHING;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  /** The `module` type for a final module. */\n  public static final class FinalModuleTypeNode extends ObjectSlotTypeNode\n      implements ClassTypeNode {\n    private final VmClass moduleClass;\n\n    public FinalModuleTypeNode(SourceSection sourceSection, VmClass moduleClass) {\n      super(sourceSection);\n      this.moduleClass = moduleClass;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmTyped typed && typed.getVmClass() == moduleClass) return value;\n\n      throw typeMismatch(value, moduleClass);\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.moduleTypeFactory.create(null);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof FinalModuleTypeNode finalModuleTypeNode)) {\n        return false;\n      }\n      return moduleClass.equals(finalModuleTypeNode.moduleClass);\n    }\n\n    @Override\n    protected PType doExport() {\n      return PType.MODULE;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return moduleClass;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n      return TypeNode.createDefaultValue(moduleClass);\n    }\n  }\n\n  /** The `module` type for an open module. */\n  public static final class NonFinalModuleTypeNode extends ObjectSlotTypeNode\n      implements ClassTypeNode {\n    private final VmClass moduleClass; // only used by getVmClass()\n    @Child private ExpressionNode getModuleNode;\n\n    public NonFinalModuleTypeNode(SourceSection sourceSection, VmClass moduleClass) {\n      super(sourceSection);\n      this.moduleClass = moduleClass;\n      getModuleNode = new GetModuleNode(sourceSection);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      var moduleClass = ((VmTyped) getModuleNode.executeGeneric(frame)).getVmClass();\n\n      if (value instanceof VmTyped typed) {\n        var valueClass = typed.getVmClass();\n        if (moduleClass.isSuperclassOf(valueClass)) return value;\n      }\n\n      throw typeMismatch(value, moduleClass);\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.moduleTypeFactory.create(null);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof NonFinalModuleTypeNode nonFinalModuleTypeNode)) {\n        return false;\n      }\n      return moduleClass.equals(nonFinalModuleTypeNode.moduleClass);\n    }\n\n    @Override\n    protected PType doExport() {\n      return PType.MODULE;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return moduleClass;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n      var moduleClass = ((VmTyped) getModuleNode.executeGeneric(frame)).getVmClass();\n      return TypeNode.createDefaultValue(moduleClass);\n    }\n  }\n\n  public static final class StringLiteralTypeNode extends ObjectSlotTypeNode {\n    private final String literal;\n\n    public StringLiteralTypeNode(SourceSection sourceSection, String literal) {\n      super(sourceSection);\n      this.literal = literal;\n    }\n\n    public String getLiteral() {\n      return literal;\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof StringLiteralTypeNode stringLiteralTypeNode)) {\n        return false;\n      }\n      return literal.equals(stringLiteralTypeNode.literal);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (literal.equals(value)) return value;\n\n      throw typeMismatch(value, literal);\n    }\n\n    @Override\n    public Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return literal;\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.stringLiteralTypeFactory.create(this);\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.StringLiteral(literal);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class TypedTypeNode extends ObjectSlotTypeNode {\n    public TypedTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmTyped) return value;\n\n      throw typeMismatch(value, BaseModule.getTypedClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getTypedClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof TypedTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class DynamicTypeNode extends ObjectSlotTypeNode {\n    public DynamicTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmDynamic) return value;\n\n      throw typeMismatch(value, BaseModule.getDynamicClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getDynamicClass();\n    }\n\n    @Override\n    public Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return VmDynamic.empty();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof DynamicTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  /**\n   * A non-open and non-abstract class type. Since this node is not used for\n   * String/Boolean/Int/Float and their supertypes, only `VmValue`s can possibly pass its type\n   * check.\n   */\n  public static final class FinalClassTypeNode extends ObjectSlotTypeNode implements ClassTypeNode {\n    private final VmClass clazz;\n\n    public FinalClassTypeNode(SourceSection sourceSection, VmClass clazz) {\n      super(sourceSection);\n      this.clazz = clazz;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmValue vmValue && clazz == vmValue.getVmClass()) return value;\n\n      throw typeMismatch(value, clazz);\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return clazz;\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      // `List<X>` is represented by `ListTypeNode`,\n      // but `List` is represented by `FinalClassTypeNode`\n      return createUnknownTypeArgumentMirrors(clazz);\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return TypeNode.createDefaultValue(clazz);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof FinalClassTypeNode finalClassTypeNode)) {\n        return false;\n      }\n      return clazz.equals(finalClassTypeNode.clazz);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  /**\n   * An {@code open} or {@code abstract} class type. Since this node is not used for\n   * String/Boolean/Int/Float and their supertypes, only {@link VmValue}s can possibly pass its type\n   * check.\n   */\n  public abstract static class NonFinalClassTypeNode extends ObjectSlotTypeNode\n      implements ClassTypeNode {\n    protected final VmClass clazz;\n\n    public NonFinalClassTypeNode(SourceSection sourceSection, VmClass clazz) {\n      super(sourceSection);\n      this.clazz = clazz;\n    }\n\n    public final VmClass getVmClass() {\n      return clazz;\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      // `Collection<X>` is represented by `CollectionTypeNode`,\n      // but `Collection` is represented by `NonFinalClassTypeNode`\n      return createUnknownTypeArgumentMirrors(clazz);\n    }\n\n    @ExplodeLoop\n    @SuppressWarnings(\"unused\")\n    @Specialization(guards = \"value.getVmClass() == cachedClass\")\n    protected Object eval(\n        VmValue value,\n        @Cached(\"value.getVmClass()\") VmClass cachedClass,\n        @Cached(\"clazz.isSuperclassOf(cachedClass)\") boolean isSuperclass) {\n\n      if (isSuperclass) return value;\n\n      throw typeMismatch(value, clazz);\n    }\n\n    @Specialization\n    protected Object eval(VmValue value) {\n      if (clazz.isSuperclassOf(value.getVmClass())) return value;\n\n      throw typeMismatch(value, clazz);\n    }\n\n    @Fallback\n    protected Object eval(Object value) {\n      throw typeMismatch(value, clazz);\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return TypeNode.createDefaultValue(clazz);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof NonFinalClassTypeNode nonFinalClassTypeNode)) {\n        return false;\n      }\n      return clazz.equals(nonFinalClassTypeNode.clazz);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static class NullableTypeNode extends WriteFrameSlotTypeNode {\n    @Child private TypeNode elementTypeNode;\n\n    public NullableTypeNode(SourceSection sourceSection, TypeNode elementTypeNode) {\n\n      super(sourceSection);\n      this.elementTypeNode = elementTypeNode;\n    }\n\n    public TypeNode getElementTypeNode() {\n      return elementTypeNode;\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.nullableTypeFactory.create(this);\n    }\n\n    public VmTyped getElementTypeMirror() {\n      return elementTypeNode.getMirror();\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return VmNull.withDefault(\n          elementTypeNode.createDefaultValue(frame, language, headerSection, qualifiedName));\n    }\n\n    @Override\n    protected final PType doExport() {\n      return new PType.Nullable(elementTypeNode.doExport());\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmNull) {\n        // do nothing\n        return value;\n      }\n      return elementTypeNode.executeLazily(frame, value);\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (value instanceof VmNull) {\n        // do nothing\n        return value;\n      }\n      return elementTypeNode.executeEagerly(frame, value);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof NullableTypeNode nullableTypeNode)) {\n        return false;\n      }\n      return elementTypeNode.isEquivalentTo(nullableTypeNode.elementTypeNode);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this) && elementTypeNode.acceptTypeNode(visitTypeArguments, consumer);\n    }\n  }\n\n  public static class UnionTypeNode extends WriteFrameSlotTypeNode {\n    @Children final TypeNode[] elementTypeNodes;\n    private final boolean skipElementTypeChecks;\n    private final int defaultIndex;\n\n    public UnionTypeNode(\n        SourceSection sourceSection,\n        int defaultIndex,\n        TypeNode[] elementTypeNodes,\n        boolean skipElementTypeChecks) {\n      super(sourceSection);\n      assert elementTypeNodes.length > 0;\n      this.elementTypeNodes = elementTypeNodes;\n      this.defaultIndex = defaultIndex;\n      this.skipElementTypeChecks = skipElementTypeChecks;\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.unionTypeFactory.create(this);\n    }\n\n    public VmList getElementTypeMirrors() {\n      return getMirrors(elementTypeNodes);\n    }\n\n    public TypeNode[] getElementTypeNodes() {\n      return elementTypeNodes;\n    }\n\n    @Override\n    public boolean isNoopTypeCheck() {\n      return skipElementTypeChecks;\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return defaultIndex == -1\n          ? null\n          : elementTypeNodes[defaultIndex].createDefaultValue(\n              frame, language, headerSection, qualifiedName);\n    }\n\n    @Override\n    protected PType doExport() {\n      var elementTypes =\n          Arrays.stream(elementTypeNodes).map(TypeNode::export).collect(Collectors.toList());\n      return new PType.Union(elementTypes);\n    }\n\n    @Override\n    @ExplodeLoop\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof UnionTypeNode unionTypeNode)) {\n        return false;\n      }\n      if (elementTypeNodes.length != unionTypeNode.elementTypeNodes.length) {\n        return false;\n      }\n      var ret = true;\n      // Note: a further optimization is to say that A|B is equivalent to B|A,\n      // but this requires knowing how to match A to A first, e.g. by sorting them, which we don't\n      // know how to do.\n      for (var i = 0; i < elementTypeNodes.length; i++) {\n        if (!ret) {\n          // don't return early so that we can ensure a constant number of loop iterations; helps\n          // the partial evaluator unroll this loop to be flat.\n          continue;\n        }\n        if (!elementTypeNodes[i].isEquivalentTo(unionTypeNode.elementTypeNodes[i])) {\n          ret = false;\n        }\n      }\n      LoopNode.reportLoopCount(this, elementTypeNodes.length);\n      return ret;\n    }\n\n    @Override\n    @ExplodeLoop\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (!consumer.accept(this)) {\n        return false;\n      }\n      var ret = true;\n      // don't break early to ensure constant number of iterations\n      //noinspection ForLoopReplaceableByForEach\n      for (var i = 0; i < elementTypeNodes.length; i++) {\n        if (!ret) {\n          continue;\n        }\n        if (!elementTypeNodes[i].acceptTypeNode(visitTypeArguments, consumer)) {\n          ret = false;\n        }\n      }\n      LoopNode.reportLoopCount(this, elementTypeNodes.length);\n      return ret;\n    }\n\n    /**\n     * Tells if the union type should be eagerly checked or not (shallow-force members of\n     * Listing/Mapping).\n     *\n     * <p>Union types should be eagerly checked if two of the alternatives are the same generic\n     * type; e.g. {@code Listing<Person>|Listing<Animal>}\n     */\n    @TruffleBoundary\n    private boolean shouldEagerCheck() {\n      var seenParameterizedClasses = EconomicSets.<VmClass>create();\n      var ret = new MutableBoolean(false);\n      this.acceptTypeNode(\n          false,\n          (typeNode) -> {\n            if (!typeNode.isParametric()) {\n              return true;\n            }\n            var typeNodeClass = typeNode.getVmClass();\n            if (typeNodeClass == null) {\n              return true;\n            }\n            if (seenParameterizedClasses.contains(typeNodeClass)) {\n              ret.set(true);\n              return false;\n            } else {\n              EconomicSets.add(seenParameterizedClasses, typeNodeClass);\n              return true;\n            }\n          });\n      return ret.get();\n    }\n\n    @Fallback\n    @ExplodeLoop\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (skipElementTypeChecks) return value;\n\n      // escape analysis should remove this allocation in compiled code\n      var typeMismatches = new VmTypeMismatchException[elementTypeNodes.length];\n\n      // Do eager checks (shallow-force) if there are two listings or two mappings represented.\n      // (we can't know that `new Listing { 0; \"hi\" }[0]` fails for `Listing<Int>|Listing<String>`\n      // without checking both index 0 and index 1).\n      var shouldEagerCheck = shouldEagerCheck();\n      for (var i = 0; i < elementTypeNodes.length; i++) {\n        var elementTypeNode = elementTypeNodes[i];\n        try {\n          if (shouldEagerCheck) {\n            return elementTypeNode.executeEagerly(frame, value);\n          } else {\n            return elementTypeNode.executeLazily(frame, value);\n          }\n        } catch (VmTypeMismatchException e) {\n          typeMismatches[i] = e;\n        }\n      }\n      throw new VmTypeMismatchException.Union(sourceSection, value, this, typeMismatches);\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (skipElementTypeChecks) return value;\n\n      // escape analysis should remove this allocation in compiled code\n      var typeMismatches = new VmTypeMismatchException[elementTypeNodes.length];\n\n      for (var i = 0; i < elementTypeNodes.length; i++) {\n        // eager checks\n        try {\n          return elementTypeNodes[i].executeEagerly(frame, value);\n        } catch (VmTypeMismatchException e) {\n          typeMismatches[i] = e;\n        }\n      }\n      throw new VmTypeMismatchException.Union(sourceSection, value, this, typeMismatches);\n    }\n  }\n\n  public static final class UnionOfStringLiteralsTypeNode extends ObjectSlotTypeNode {\n    private final Set<String> stringLiterals;\n    private final @Nullable String unionDefault;\n\n    UnionOfStringLiteralsTypeNode(\n        SourceSection sourceSection, int defaultIndex, Set<String> stringLiterals) {\n      super(sourceSection);\n\n      assert !stringLiterals.isEmpty();\n      this.stringLiterals = stringLiterals;\n      if (defaultIndex == -1) {\n        unionDefault = null;\n      } else {\n        unionDefault = stringLiterals.toArray(new String[0])[defaultIndex];\n      }\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.unionOfStringLiteralsTypeFactory.create(this);\n    }\n\n    public VmList getElementTypeMirrors() {\n      var builder = VmList.EMPTY.builder();\n      for (var literal : stringLiterals) {\n        builder.add(MirrorFactories.stringLiteralTypeFactory2.create(literal));\n      }\n      return builder.build();\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (contains(value)) return value;\n\n      throw typeMismatch(value, stringLiterals);\n    }\n\n    @TruffleBoundary\n    private boolean contains(Object value) {\n      //noinspection SuspiciousMethodCalls\n      return stringLiterals.contains(value);\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Union(\n          stringLiterals.stream().map(StringLiteral::new).collect(Collectors.toList()));\n    }\n\n    @Override\n    @TruffleBoundary\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof UnionOfStringLiteralsTypeNode unionOfStringLiteralsTypeNode)) {\n        return false;\n      }\n      return stringLiterals.equals(unionOfStringLiteralsTypeNode.stringLiterals);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return unionDefault;\n    }\n\n    public Set<String> getStringLiterals() {\n      return stringLiterals;\n    }\n\n    public @Nullable String getUnionDefault() {\n      return unionDefault;\n    }\n  }\n\n  public static final class CollectionTypeNode extends ObjectSlotTypeNode {\n    @Child private TypeNode elementTypeNode;\n\n    public CollectionTypeNode(SourceSection sourceSection, TypeNode elementTypeNode) {\n\n      super(sourceSection);\n      this.elementTypeNode = elementTypeNode;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmList vmList) {\n        return evalList(frame, vmList);\n      }\n      if (value instanceof VmSet vmSet) {\n        return evalSet(frame, vmSet);\n      }\n      throw typeMismatch(value, BaseModule.getCollectionClass());\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (value instanceof VmList vmList) {\n        return evalListEagerly(frame, vmList);\n      }\n      if (value instanceof VmSet vmSet) {\n        // sets are always checked eagerly\n        return evalSet(frame, vmSet);\n      }\n      throw typeMismatch(value, BaseModule.getCollectionClass());\n    }\n\n    @Override\n    public Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return VmList.EMPTY;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getCollectionClass();\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Class(BaseModule.getCollectionClass().export(), elementTypeNode.doExport());\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      return VmList.of(elementTypeNode.getMirror());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return false;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @SuppressWarnings(\"DuplicatedCode\")\n    @ExplodeLoop\n    private Object evalList(VirtualFrame frame, VmList value) {\n      var ret = value;\n      var idx = 0;\n\n      for (var elem : value) {\n        var result = elementTypeNode.executeLazily(frame, elem);\n        if (result != elem) {\n          ret = ret.replace(idx, result);\n        }\n        idx++;\n      }\n\n      LoopNode.reportLoopCount(this, idx);\n      return ret;\n    }\n\n    private Object evalListEagerly(VirtualFrame frame, VmList value) {\n      for (var elem : value) {\n        elementTypeNode.executeEagerly(frame, elem);\n      }\n\n      LoopNode.reportLoopCount(this, value.getLength());\n      return value;\n    }\n\n    private Object evalSet(VirtualFrame frame, VmSet value) {\n      for (var elem : value) {\n        elementTypeNode.executeEagerly(frame, elem);\n      }\n\n      LoopNode.reportLoopCount(this, value.getLength());\n      return value;\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  public static final class ListTypeNode extends ObjectSlotTypeNode {\n    @Child private TypeNode elementTypeNode;\n    private final boolean skipElementTypeChecks;\n\n    public ListTypeNode(SourceSection sourceSection, TypeNode elementTypeNode) {\n      super(sourceSection);\n      this.elementTypeNode = elementTypeNode;\n      skipElementTypeChecks = elementTypeNode.isNoopTypeCheck();\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (visitTypeArguments) {\n        return consumer.accept(this) && elementTypeNode.acceptTypeNode(true, consumer);\n      }\n      return consumer.accept(this);\n    }\n\n    @Override\n    public Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return VmList.EMPTY;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getListClass();\n    }\n\n    public TypeNode getElementTypeNode() {\n      return elementTypeNode;\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      return VmList.of(elementTypeNode.getMirror());\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Class(BaseModule.getListClass().export(), elementTypeNode.doExport());\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (!(value instanceof VmList vmList)) {\n        throw typeMismatch(value, BaseModule.getListClass());\n      }\n      if (skipElementTypeChecks) return vmList;\n\n      for (var elem : vmList) {\n        elementTypeNode.executeEagerly(frame, elem);\n      }\n\n      LoopNode.reportLoopCount(this, vmList.getLength());\n      return value;\n    }\n\n    @SuppressWarnings(\"DuplicatedCode\")\n    @Override\n    @ExplodeLoop\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (!(value instanceof VmList vmList)) {\n        throw typeMismatch(value, BaseModule.getListClass());\n      }\n      if (skipElementTypeChecks) return vmList;\n      var ret = vmList;\n      var idx = 0;\n\n      for (var elem : vmList) {\n        var result = elementTypeNode.executeLazily(frame, elem);\n        if (result != elem) {\n          ret = ret.replace(idx, result);\n        }\n        idx++;\n      }\n\n      LoopNode.reportLoopCount(this, vmList.getLength());\n      return ret;\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof ListTypeNode listTypeNode)) {\n        return false;\n      }\n      return elementTypeNode.isEquivalentTo(listTypeNode.elementTypeNode);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  public abstract static class SetTypeNode extends ObjectSlotTypeNode {\n    @Child private TypeNode elementTypeNode;\n    private final boolean skipElementTypeChecks;\n\n    protected SetTypeNode(SourceSection sourceSection, TypeNode elementTypeNode) {\n      super(sourceSection);\n      this.elementTypeNode = elementTypeNode;\n      skipElementTypeChecks = elementTypeNode.isNoopTypeCheck();\n    }\n\n    @Override\n    public final Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return VmSet.EMPTY;\n    }\n\n    @Override\n    public final VmClass getVmClass() {\n      return BaseModule.getSetClass();\n    }\n\n    public TypeNode getElementTypeNode() {\n      return elementTypeNode;\n    }\n\n    @Override\n    public final VmList getTypeArgumentMirrors() {\n      return VmList.of(elementTypeNode.getMirror());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof SetTypeNode setTypeNode)) {\n        return false;\n      }\n      return elementTypeNode.isEquivalentTo(setTypeNode.elementTypeNode);\n    }\n\n    @Override\n    protected final PType doExport() {\n      return new PType.Class(BaseModule.getSetClass().export(), elementTypeNode.doExport());\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (visitTypeArguments) {\n        return consumer.accept(this) && elementTypeNode.acceptTypeNode(true, consumer);\n      }\n      return consumer.accept(this);\n    }\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet value) {\n      if (skipElementTypeChecks) return value;\n      for (var elem : value) {\n        // no point doing a lazy check because set members have their hash code computed, which\n        // necessarily deep-forces them.\n        elementTypeNode.executeEagerly(frame, elem);\n      }\n\n      LoopNode.reportLoopCount(this, value.getLength());\n      return value;\n    }\n\n    @Fallback\n    protected Object fallback(Object value) {\n      throw typeMismatch(value, BaseModule.getSetClass());\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  public static final class MapTypeNode extends ObjectSlotTypeNode {\n    @Child private TypeNode keyTypeNode;\n    @Child private TypeNode valueTypeNode;\n    private final boolean skipEntryTypeChecks;\n\n    public MapTypeNode(SourceSection sourceSection, TypeNode keyTypeNode, TypeNode valueTypeNode) {\n\n      super(sourceSection);\n      this.keyTypeNode = keyTypeNode;\n      this.valueTypeNode = valueTypeNode;\n      skipEntryTypeChecks = keyTypeNode.isNoopTypeCheck() && valueTypeNode.isNoopTypeCheck();\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmMap vmMap) {\n        return eval(frame, vmMap);\n      }\n      throw typeMismatch(value, BaseModule.getMapClass());\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (value instanceof VmMap vmMap) {\n        return evalEager(frame, vmMap);\n      }\n      throw typeMismatch(value, BaseModule.getMapClass());\n    }\n\n    @Override\n    public Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return VmMap.EMPTY;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getMapClass();\n    }\n\n    public TypeNode getKeyTypeNode() {\n      return keyTypeNode;\n    }\n\n    public TypeNode getValueTypeNode() {\n      return valueTypeNode;\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      return VmList.of(keyTypeNode.getMirror(), valueTypeNode.getMirror());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof MapTypeNode mapTypeNode)) {\n        return false;\n      }\n      return keyTypeNode.isEquivalentTo(mapTypeNode.keyTypeNode)\n          && valueTypeNode.isEquivalentTo(mapTypeNode.valueTypeNode);\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Class(\n          BaseModule.getMapClass().export(), keyTypeNode.doExport(), valueTypeNode.doExport());\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (visitTypeArguments) {\n        return consumer.accept(this)\n            && keyTypeNode.acceptTypeNode(true, consumer)\n            && valueTypeNode.acceptTypeNode(true, consumer);\n      }\n      return consumer.accept(this);\n    }\n\n    private Object eval(VirtualFrame frame, VmMap value) {\n      if (skipEntryTypeChecks) return value;\n      var ret = value;\n\n      for (var entry : value) {\n        var key = VmUtils.getKey(entry);\n        keyTypeNode.executeEagerly(frame, key);\n        var result = valueTypeNode.executeLazily(frame, VmUtils.getValue(entry));\n        if (result != VmUtils.getValue(entry)) {\n          ret = ret.put(key, result);\n        }\n      }\n\n      LoopNode.reportLoopCount(this, value.getLength());\n      return ret;\n    }\n\n    private Object evalEager(VirtualFrame frame, VmMap value) {\n      if (skipEntryTypeChecks) return value;\n      for (var entry : value) {\n        keyTypeNode.executeEagerly(frame, VmUtils.getKey(entry));\n        valueTypeNode.executeLazily(frame, VmUtils.getValue(entry));\n      }\n\n      LoopNode.reportLoopCount(this, value.getLength());\n      return value;\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  public static final class ListingTypeNode extends ListingOrMappingTypeNode {\n    public ListingTypeNode(\n        SourceSection sourceSection, VmLanguage language, TypeNode valueTypeNode) {\n      super(sourceSection, language, null, valueTypeNode);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (!(value instanceof VmListing vmListing)) {\n        throw typeMismatch(value, BaseModule.getListingClass());\n      }\n      if (vmListing.isValueTypeKnownSubtypeOf(valueTypeNode)) {\n        return vmListing;\n      }\n      return new VmListing(\n          vmListing.getEnclosingFrame(),\n          vmListing,\n          EconomicMaps.emptyMap(),\n          vmListing.getLength(),\n          getValueTypeCastNode(),\n          VmUtils.getReceiver(frame),\n          VmUtils.getOwner(frame));\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (!(value instanceof VmListing vmListing)) {\n        throw typeMismatch(value, BaseModule.getListingClass());\n      }\n      doEagerCheck(frame, vmListing);\n      return value;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getListingClass();\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      return VmList.of(valueTypeNode.getMirror());\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Class(BaseModule.getListingClass().export(), valueTypeNode.doExport());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof ListingTypeNode listingTypeNode)) {\n        return false;\n      }\n      return valueTypeNode.isEquivalentTo(listingTypeNode.valueTypeNode);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (visitTypeArguments) {\n        return consumer.accept(this) && valueTypeNode.acceptTypeNode(true, consumer);\n      }\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class MappingTypeNode extends ListingOrMappingTypeNode {\n    public MappingTypeNode(\n        SourceSection sourceSection,\n        VmLanguage language,\n        TypeNode keyTypeNode,\n        TypeNode valueTypeNode) {\n\n      super(sourceSection, language, keyTypeNode, valueTypeNode);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (!(value instanceof VmMapping vmMapping)) {\n        throw typeMismatch(value, BaseModule.getMappingClass());\n      }\n      // execute type checks on mapping keys\n      doEagerCheck(frame, vmMapping, false, true);\n      if (vmMapping.isValueTypeKnownSubtypeOf(valueTypeNode)) {\n        return vmMapping;\n      }\n      return new VmMapping(\n          vmMapping.getEnclosingFrame(),\n          vmMapping,\n          EconomicMaps.emptyMap(),\n          getValueTypeCastNode(),\n          VmUtils.getReceiver(frame),\n          VmUtils.getOwner(frame));\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (!(value instanceof VmMapping vmMapping)) {\n        throw typeMismatch(value, BaseModule.getMappingClass());\n      }\n      doEagerCheck(frame, vmMapping, false, false);\n      return value;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getMappingClass();\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      assert keyTypeNode != null;\n      return VmList.of(keyTypeNode.getMirror(), valueTypeNode.getMirror());\n    }\n\n    @Override\n    protected PType doExport() {\n      assert keyTypeNode != null;\n      return new PType.Class(\n          BaseModule.getMappingClass().export(), keyTypeNode.doExport(), valueTypeNode.doExport());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof MappingTypeNode mappingTypeNode)) {\n        return false;\n      }\n      assert keyTypeNode != null;\n      assert mappingTypeNode.keyTypeNode != null;\n      return keyTypeNode.isEquivalentTo(mappingTypeNode.keyTypeNode)\n          && valueTypeNode.isEquivalentTo(mappingTypeNode.valueTypeNode);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (visitTypeArguments) {\n        assert keyTypeNode != null;\n        return consumer.accept(this) && valueTypeNode.acceptTypeNode(true, consumer);\n      }\n      return consumer.accept(this);\n    }\n  }\n\n  public abstract static class ListingOrMappingTypeNode extends ObjectSlotTypeNode {\n    private final VmLanguage language;\n    @Child protected @Nullable TypeNode keyTypeNode;\n    @Child protected TypeNode valueTypeNode;\n    @Child @Nullable protected ListingOrMappingTypeCastNode valueTypeCastNode;\n\n    private final boolean skipKeyTypeChecks;\n    private final boolean skipValueTypeChecks;\n\n    protected ListingOrMappingTypeNode(\n        SourceSection sourceSection,\n        VmLanguage language,\n        @Nullable TypeNode keyTypeNode,\n        TypeNode valueTypeNode) {\n\n      super(sourceSection);\n      this.language = language;\n      this.keyTypeNode = keyTypeNode;\n      this.valueTypeNode = valueTypeNode;\n\n      skipKeyTypeChecks = keyTypeNode == null || keyTypeNode.isNoopTypeCheck();\n      skipValueTypeChecks = valueTypeNode.isNoopTypeCheck();\n    }\n\n    private boolean isListing() {\n      return keyTypeNode == null;\n    }\n\n    public @Nullable TypeNode getKeyTypeNode() {\n      return keyTypeNode;\n    }\n\n    public TypeNode getValueTypeNode() {\n      return valueTypeNode;\n    }\n\n    protected ListingOrMappingTypeCastNode getValueTypeCastNode() {\n      if (valueTypeCastNode == null) {\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        valueTypeCastNode =\n            new ListingOrMappingTypeCastNode(\n                language, new FrameDescriptor(), valueTypeNode, getRootNode().getName());\n      }\n      return valueTypeCastNode;\n    }\n\n    @TruffleBoundary\n    private Object newEmptyListingOrMapping() {\n      if (isListing()) {\n        return new VmListing(\n            VmUtils.createEmptyMaterializedFrame(),\n            BaseModule.getListingClass().getPrototype(),\n            EconomicMaps.create(),\n            0);\n      }\n\n      return new VmMapping(\n          VmUtils.createEmptyMaterializedFrame(),\n          BaseModule.getMappingClass().getPrototype(),\n          EconomicMaps.create());\n    }\n\n    @TruffleBoundary\n    private Object newEmptyListingOrMapping(ObjectMember defaultMember) {\n      if (isListing()) {\n        return new VmListing(\n            VmUtils.createEmptyMaterializedFrame(),\n            BaseModule.getListingClass().getPrototype(),\n            EconomicMaps.of(Identifier.DEFAULT, defaultMember),\n            0);\n      }\n\n      return new VmMapping(\n          VmUtils.createEmptyMaterializedFrame(),\n          BaseModule.getMappingClass().getPrototype(),\n          EconomicMaps.of(Identifier.DEFAULT, defaultMember));\n    }\n\n    @TruffleBoundary\n    private ObjectMember createDefaultMember(\n        SourceSection headerSection, String qualifiedName, @Nullable Object defaultMemberValue) {\n      var defaultMember =\n          new ObjectMember(\n              headerSection,\n              headerSection,\n              VmModifier.HIDDEN,\n              Identifier.DEFAULT,\n              VmUtils.concat(qualifiedName, \".default\"));\n      if (defaultMemberValue == null) {\n        defaultMember.initMemberNode(\n            new UntypedObjectMemberNode(\n                language,\n                new FrameDescriptor(),\n                defaultMember,\n                new DefaultPropertyBodyNode(headerSection, Identifier.DEFAULT, null)));\n      } else {\n        //noinspection ConstantConditions\n        defaultMember.initConstantValue(\n            new VmFunction(\n                // Assumption: don't need to set the correct `thisValue`\n                // because it is guaranteed to be never accessed.\n                VmUtils.createEmptyMaterializedFrame(),\n                null,\n                1,\n                new SimpleRootNode(\n                    language,\n                    new FrameDescriptor(),\n                    headerSection,\n                    VmUtils.concat(defaultMember.getQualifiedName(), \".<function>\"),\n                    new ConstantValueNode(defaultMemberValue)),\n                null));\n      }\n      return defaultMember;\n    }\n\n    // either (if defaultMemberValue != null):\n    // x: Listing<Foo> // = new Listing {\n    //   default = name -> new Foo {}\n    // }\n    // or (if defaultMemberValue == null):\n    // x: Listing<Int> // = new Listing {\n    //   default = Undefined()\n    // }\n    @Override\n    public final Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      if (valueTypeNode instanceof UnknownTypeNode) {\n        return newEmptyListingOrMapping();\n      }\n\n      var defaultMemberValue =\n          valueTypeNode.createDefaultValue(frame, language, headerSection, qualifiedName);\n\n      var defaultMember = createDefaultMember(headerSection, qualifiedName, defaultMemberValue);\n\n      return newEmptyListingOrMapping(defaultMember);\n    }\n\n    protected void doEagerCheck(VirtualFrame frame, VmObject object) {\n      doEagerCheck(frame, object, skipKeyTypeChecks, skipValueTypeChecks);\n    }\n\n    protected void doEagerCheck(\n        VirtualFrame frame,\n        VmObject object,\n        boolean skipKeyTypeChecks,\n        boolean skipValueTypeChecks) {\n      if (skipKeyTypeChecks && skipValueTypeChecks) return;\n\n      var loopCount = 0;\n\n      // similar to shallow forcing\n      for (var owner = object; owner != null; owner = owner.getParent()) {\n        var cursor = EconomicMaps.getEntries(owner.getMembers());\n        while (cursor.advance()) {\n          loopCount += 1;\n          var member = cursor.getValue();\n          if (member.isProp()) continue;\n\n          var memberKey = cursor.getKey();\n\n          if (!skipKeyTypeChecks) {\n            assert keyTypeNode != null;\n            try {\n              keyTypeNode.executeEagerly(frame, memberKey);\n            } catch (VmTypeMismatchException e) {\n              CompilerDirectives.transferToInterpreter();\n              e.putInsertedStackFrame(\n                  getRootNode().getCallTarget(),\n                  VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));\n              throw e;\n            }\n          }\n\n          if (!skipValueTypeChecks) {\n            var memberValue = object.getCachedValue(memberKey);\n            if (memberValue == null) {\n              memberValue = member.getConstantValue();\n              if (memberValue == null) {\n                var callTarget = member.getCallTarget();\n                memberValue = callTarget.call(object, owner, memberKey);\n              }\n              object.setCachedValue(memberKey, memberValue);\n            }\n            valueTypeNode.executeEagerly(frame, memberValue);\n          }\n        }\n      }\n\n      LoopNode.reportLoopCount(this, loopCount);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  // A type such as `(Int, String) -> Duration`.\n  public abstract static class FunctionTypeNode extends ObjectSlotTypeNode {\n    private final TypeNode[] parameterTypeNodes;\n    private final TypeNode returnTypeNode;\n\n    protected FunctionTypeNode(\n        SourceSection sourceSection, TypeNode[] parameterTypeNodes, TypeNode returnTypeNode) {\n      super(sourceSection);\n      this.parameterTypeNodes = parameterTypeNodes;\n      this.returnTypeNode = returnTypeNode;\n    }\n\n    @Override\n    public final VmClass getVmClass() {\n      return getFunctionNClass();\n    }\n\n    @Override\n    public final VmTyped getMirror() {\n      return MirrorFactories.functionTypeFactory.create(this);\n    }\n\n    public final VmList getParameterTypeMirrors() {\n      return getMirrors(parameterTypeNodes);\n    }\n\n    public final VmTyped getReturnTypeMirror() {\n      return returnTypeNode.getMirror();\n    }\n\n    @Override\n    @ExplodeLoop\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof FunctionTypeNode functionTypeNode)) {\n        return false;\n      }\n      if (!returnTypeNode.isEquivalentTo(functionTypeNode.returnTypeNode)) {\n        return false;\n      }\n      if (parameterTypeNodes.length != functionTypeNode.parameterTypeNodes.length) {\n        return false;\n      }\n      var ret = true;\n      // optimization: don't return early so that we can ensure a constant number of loop iterations\n      for (var i = 0; i < parameterTypeNodes.length; i++) {\n        var typeNode = parameterTypeNodes[i];\n        var otherTypeNode = functionTypeNode.parameterTypeNodes[i];\n        if (!ret) {\n          continue;\n        }\n        if (!typeNode.isEquivalentTo(otherTypeNode)) {\n          ret = false;\n        }\n      }\n      LoopNode.reportLoopCount(this, parameterTypeNodes.length);\n      return ret;\n    }\n\n    @Override\n    protected final PType doExport() {\n      var parameterTypes =\n          Arrays.stream(parameterTypeNodes).map(TypeNode::export).collect(Collectors.toList());\n      return new PType.Function(parameterTypes, TypeNode.export(returnTypeNode));\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @SuppressWarnings(\"unused\")\n    @Specialization(guards = \"value.getVmClass() == getFunctionNClass()\")\n    protected Object eval(VmFunction value) {\n      /* do nothing */\n      return value;\n    }\n\n    @Fallback\n    protected Object fallback(Object value) {\n      throw typeMismatch(value, getFunctionNClass());\n    }\n\n    // not a field to avoid a circular evaluation error\n    protected VmClass getFunctionNClass() {\n      return BaseModule.getFunctionNClass(parameterTypeNodes.length);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  // A type such as `Function<Duration>` (but not `FunctionN<...>`).\n  public abstract static class FunctionClassTypeNode extends ObjectSlotTypeNode {\n    private final TypeNode typeArgumentNode;\n\n    protected FunctionClassTypeNode(SourceSection sourceSection, TypeNode typeArgumentNode) {\n      super(sourceSection);\n      this.typeArgumentNode = typeArgumentNode;\n    }\n\n    @Override\n    public final VmClass getVmClass() {\n      return BaseModule.getFunctionClass();\n    }\n\n    public final VmList getTypeArgumentMirrors() {\n      return VmList.of(typeArgumentNode.getMirror());\n    }\n\n    @Override\n    protected final PType doExport() {\n      return new PType.Class(\n          BaseModule.getFunctionClass().export(), TypeNode.export(typeArgumentNode));\n    }\n\n    @Specialization\n    protected Object eval(VmFunction value) {\n      /* do nothing */\n      return value;\n    }\n\n    @Fallback\n    protected void fallback(Object value) {\n      throw typeMismatch(value, BaseModule.getFunctionClass());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof FunctionClassTypeNode functionClassTypeNode)) {\n        return false;\n      }\n      return typeArgumentNode.isEquivalentTo(functionClassTypeNode.typeArgumentNode);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  // A type such as `Function2<Int, String, Duration>`.\n  public abstract static class FunctionNClassTypeNode extends ObjectSlotTypeNode {\n    private final TypeNode[] typeArgumentNodes;\n\n    protected FunctionNClassTypeNode(SourceSection sourceSection, TypeNode[] typeArgumentNodes) {\n      super(sourceSection);\n      this.typeArgumentNodes = typeArgumentNodes;\n    }\n\n    @Override\n    public final VmClass getVmClass() {\n      return getFunctionNClass();\n    }\n\n    public final VmList getTypeArgumentMirrors() {\n      return getMirrors(typeArgumentNodes);\n    }\n\n    @Override\n    @ExplodeLoop\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof FunctionNClassTypeNode functionNClassTypeNode)) {\n        return false;\n      }\n      if (typeArgumentNodes.length != functionNClassTypeNode.typeArgumentNodes.length) {\n        return false;\n      }\n      var ret = true;\n      for (var i = 0; i < typeArgumentNodes.length; i++) {\n        if (!ret) {\n          // don't return early so that we can ensure a constant number of loop iterations.\n          continue;\n        }\n        var typeNode = typeArgumentNodes[i];\n        var otherTypeNode = functionNClassTypeNode.typeArgumentNodes[i];\n        if (!typeNode.isEquivalentTo(otherTypeNode)) {\n          ret = false;\n        }\n      }\n      LoopNode.reportLoopCount(this, typeArgumentNodes.length);\n      return ret;\n    }\n\n    @Override\n    protected final PType doExport() {\n      var typeArguments =\n          Arrays.stream(typeArgumentNodes).map(TypeNode::export).collect(Collectors.toList());\n      return new PType.Class(getFunctionNClass().export(), typeArguments);\n    }\n\n    @SuppressWarnings(\"unused\")\n    @Specialization(guards = \"value.getVmClass() == getFunctionNClass()\")\n    protected Object eval(VmFunction value) {\n      return value;\n    }\n\n    @Fallback\n    protected Object fallback(Object value) {\n      throw typeMismatch(value, getFunctionNClass());\n    }\n\n    // not a field to avoid a circular evaluation error\n    protected VmClass getFunctionNClass() {\n      return BaseModule.getFunctionNClass(typeArgumentNodes.length - 1);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  public static final class PairTypeNode extends ObjectSlotTypeNode {\n    @Child private TypeNode firstTypeNode;\n    @Child private TypeNode secondTypeNode;\n\n    public PairTypeNode(\n        SourceSection sourceSection, TypeNode firstTypeNode, TypeNode secondTypeNode) {\n\n      super(sourceSection);\n      this.firstTypeNode = firstTypeNode;\n      this.secondTypeNode = secondTypeNode;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmPair vmPair) {\n        var first = firstTypeNode.executeLazily(frame, vmPair.getFirst());\n        var second = secondTypeNode.executeLazily(frame, vmPair.getSecond());\n        if (first == vmPair.getFirst() && second == vmPair.getSecond()) {\n          return vmPair;\n        }\n        return new VmPair(first, second);\n      }\n      throw typeMismatch(value, BaseModule.getPairClass());\n    }\n\n    @Override\n    public Object executeEagerly(VirtualFrame frame, Object value) {\n      if (value instanceof VmPair vmPair) {\n        firstTypeNode.executeEagerly(frame, vmPair.getFirst());\n        secondTypeNode.executeEagerly(frame, vmPair.getSecond());\n        return value;\n      }\n      throw typeMismatch(value, BaseModule.getPairClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getPairClass();\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      return VmList.of(firstTypeNode.getMirror(), secondTypeNode.getMirror());\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof PairTypeNode pairTypeNode)) {\n        return false;\n      }\n      return firstTypeNode.isEquivalentTo(pairTypeNode.firstTypeNode)\n          && secondTypeNode.isEquivalentTo(pairTypeNode.secondTypeNode);\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Class(\n          BaseModule.getPairClass().export(), firstTypeNode.doExport(), secondTypeNode.doExport());\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (visitTypeArguments) {\n        return consumer.accept(this)\n            && firstTypeNode.acceptTypeNode(true, consumer)\n            && secondTypeNode.acceptTypeNode(true, consumer);\n      }\n      return consumer.accept(this);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n\n    public TypeNode getFirstTypeNode() {\n      return firstTypeNode;\n    }\n\n    public TypeNode getSecondTypeNode() {\n      return secondTypeNode;\n    }\n  }\n\n  public static class VarArgsTypeNode extends ObjectSlotTypeNode {\n    @Child private TypeNode elementTypeNode;\n\n    public VarArgsTypeNode(SourceSection sourceSection, TypeNode elementTypeNode) {\n\n      super(sourceSection);\n      this.elementTypeNode = elementTypeNode;\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"internalStdLibClass\", \"VarArgs\")\n          .withSourceSection(headerSection)\n          .build();\n    }\n\n    @Override\n    protected final PType doExport() {\n      return new PType.Class(BaseModule.getVarArgsClass().export(), elementTypeNode.doExport());\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"internalStdLibClass\", \"VarArgs\").build();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if (!(other instanceof VarArgsTypeNode varArgsTypeNode)) {\n        return false;\n      }\n      return elementTypeNode.isEquivalentTo(varArgsTypeNode.elementTypeNode);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return true;\n    }\n  }\n\n  public static final class TypeVariableNode extends WriteFrameSlotTypeNode {\n    private final TypeParameter typeParameter;\n\n    public TypeVariableNode(SourceSection sourceSection, TypeParameter typeParameter) {\n\n      super(sourceSection);\n      this.typeParameter = typeParameter;\n    }\n\n    public int getTypeParameterIndex() {\n      return typeParameter.getIndex();\n    }\n\n    @Override\n    public boolean isNoopTypeCheck() {\n      return true;\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.typeVariableFactory.create(this);\n    }\n\n    public VmTyped getTypeParameterMirror() {\n      return MirrorFactories.typeParameterFactory.create(typeParameter);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      // do nothing\n      return value;\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof TypeVariableNode;\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.TypeVariable(typeParameter);\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class NonNullTypeAliasTypeNode extends WriteFrameSlotTypeNode {\n    public NonNullTypeAliasTypeNode() {\n      super(VmUtils.unavailableSourceSection());\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof VmNull) {\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        throw constraintException(value, BaseModule.getNonNullTypeAlias().getConstraintSection());\n      }\n      return value;\n    }\n\n    @Override\n    public VmTypeAlias getVmTypeAlias() {\n      return BaseModule.getNonNullTypeAlias();\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.typeAliasTypeFactory.create(this);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof NonNullTypeAliasTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  protected abstract static class IntMaskSlotTypeNode extends IntSlotTypeNode {\n    protected final long mask;\n\n    IntMaskSlotTypeNode(long mask) {\n      super(VmUtils.unavailableSourceSection());\n      this.mask = mask;\n    }\n\n    @Override\n    protected final Object executeLazily(VirtualFrame frame, Object value) {\n      var typealias = getVmTypeAlias();\n      assert typealias != null;\n      if (value instanceof Long l) {\n        if ((l & mask) == l) return value;\n\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        var sourceSection = typealias.getConstraintSection();\n        throw constraintException(value, sourceSection);\n      }\n\n      throw new VmTypeMismatchException.Simple(\n          typealias.getBaseTypeSection(), value, BaseModule.getIntClass());\n    }\n\n    @Override\n    public final VmClass getVmClass() {\n      return BaseModule.getIntClass();\n    }\n\n    @Override\n    public final VmTyped getMirror() {\n      return MirrorFactories.typeAliasTypeFactory.create(this);\n    }\n\n    @Override\n    public final boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof UIntTypeAliasTypeNode aliasTypeNode && mask == aliasTypeNode.mask;\n    }\n\n    @Override\n    protected final boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n\n    public long getMask() {\n      return mask;\n    }\n  }\n\n  public static final class UIntTypeAliasTypeNode extends IntMaskSlotTypeNode {\n    private final VmTypeAlias typeAlias;\n\n    public UIntTypeAliasTypeNode(VmTypeAlias typeAlias, long mask) {\n      super(mask);\n      this.typeAlias = typeAlias;\n    }\n\n    @Override\n    public VmTypeAlias getVmTypeAlias() {\n      return typeAlias;\n    }\n  }\n\n  public static final class UInt8TypeAliasTypeNode extends IntMaskSlotTypeNode {\n    public UInt8TypeAliasTypeNode() {\n      super(0x00000000000000FFL);\n    }\n\n    @Override\n    public VmTypeAlias getVmTypeAlias() {\n      return BaseModule.getUInt8TypeAlias();\n    }\n  }\n\n  public static final class Int8TypeAliasTypeNode extends IntSlotTypeNode {\n    public Int8TypeAliasTypeNode() {\n      super(VmUtils.unavailableSourceSection());\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Long l) {\n        if (l == l.byteValue()) return value;\n\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        var sourceSection = BaseModule.getInt8TypeAlias().getConstraintSection();\n        throw constraintException(value, sourceSection);\n      }\n\n      throw new VmTypeMismatchException.Simple(\n          BaseModule.getInt8TypeAlias().getBaseTypeSection(), value, BaseModule.getIntClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getIntClass();\n    }\n\n    @Override\n    public VmTypeAlias getVmTypeAlias() {\n      return BaseModule.getInt8TypeAlias();\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.typeAliasTypeFactory.create(this);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof Int8TypeAliasTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class Int16TypeAliasTypeNode extends IntSlotTypeNode {\n    public Int16TypeAliasTypeNode() {\n      super(VmUtils.unavailableSourceSection());\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Long l) {\n        if (l == l.shortValue()) return value;\n\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        var sourceSection = BaseModule.getInt16TypeAlias().getConstraintSection();\n        throw constraintException(value, sourceSection);\n      }\n\n      throw new VmTypeMismatchException.Simple(\n          BaseModule.getInt16TypeAlias().getBaseTypeSection(), value, BaseModule.getIntClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getIntClass();\n    }\n\n    @Override\n    public VmTypeAlias getVmTypeAlias() {\n      return BaseModule.getInt16TypeAlias();\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.typeAliasTypeFactory.create(this);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof Int16TypeAliasTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class Int32TypeAliasTypeNode extends IntSlotTypeNode {\n    public Int32TypeAliasTypeNode() {\n      super(VmUtils.unavailableSourceSection());\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Long l) {\n        if (l == l.intValue()) return value;\n\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        throw constraintException(value, BaseModule.getInt32TypeAlias().getConstraintSection());\n      }\n\n      CompilerDirectives.transferToInterpreterAndInvalidate();\n      throw new VmTypeMismatchException.Simple(\n          BaseModule.getInt32TypeAlias().getBaseTypeSection(), value, BaseModule.getIntClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getIntClass();\n    }\n\n    @Override\n    public VmTypeAlias getVmTypeAlias() {\n      return BaseModule.getInt32TypeAlias();\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.typeAliasTypeFactory.create(this);\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof Int32TypeAliasTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class TypeAliasTypeNode extends TypeNode {\n    private final VmTypeAlias typeAlias;\n    private final TypeNode[] typeArgumentNodes;\n    @Child private TypeNode aliasedTypeNode;\n\n    public TypeAliasTypeNode(\n        SourceSection sourceSection, VmTypeAlias typeAlias, TypeNode[] typeArgumentNodes) {\n      super(sourceSection);\n\n      if (!typeAlias.isInitialized()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder().evalError(\"cyclicTypeAlias\").build();\n      }\n\n      if (typeArgumentNodes.length > 0\n          && typeArgumentNodes.length != typeAlias.getTypeParameterCount()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\n                \"wrongTypeArgumentCount\",\n                typeAlias.getTypeParameterCount(),\n                typeArgumentNodes.length)\n            .build();\n      }\n\n      this.typeAlias = typeAlias;\n      this.typeArgumentNodes = typeArgumentNodes;\n      aliasedTypeNode = typeAlias.instantiate(typeArgumentNodes);\n    }\n\n    public TypeNode getAliasedTypeNode() {\n      return aliasedTypeNode;\n    }\n\n    @Override\n    public FrameSlotKind getFrameSlotKind() {\n      return aliasedTypeNode.getFrameSlotKind();\n    }\n\n    @Override\n    public TypeNode initWriteSlotNode(int slot) {\n      aliasedTypeNode.initWriteSlotNode(slot);\n      return this;\n    }\n\n    @Override\n    public VmTyped getMirror() {\n      return MirrorFactories.typeAliasTypeFactory.create(this);\n    }\n\n    @Override\n    public VmList getTypeArgumentMirrors() {\n      return getMirrors(typeArgumentNodes);\n    }\n\n    /**\n     * A typealias body is effectively inlined into the type node, and not executed in its own\n     * frame.\n     *\n     * <p>Before executing the typealias body, use the owner and receiver of the original frame\n     * where the typealias was declared, so that we preserve its original scope.\n     */\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      var prevOwner = VmUtils.getOwner(frame);\n      var prevReceiver = VmUtils.getReceiver(frame);\n      setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame()));\n      setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame()));\n\n      try {\n        return aliasedTypeNode.executeLazily(frame, value);\n      } finally {\n        setOwner(frame, prevOwner);\n        setReceiver(frame, prevReceiver);\n      }\n    }\n\n    /** See docstring on {@link TypeAliasTypeNode#executeLazily}. */\n    @Override\n    public Object executeAndSet(VirtualFrame frame, Object value) {\n      var prevOwner = VmUtils.getOwner(frame);\n      var prevReceiver = VmUtils.getReceiver(frame);\n      setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame()));\n      setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame()));\n\n      try {\n        return aliasedTypeNode.executeAndSet(frame, value);\n      } finally {\n        setOwner(frame, prevOwner);\n        setReceiver(frame, prevReceiver);\n      }\n    }\n\n    @TruffleBoundary\n    private VmFunction newMixin(VmLanguage language, String qualifiedName) {\n      //noinspection ConstantConditions\n      return new VmFunction(\n          VmUtils.createEmptyMaterializedFrame(),\n          // Assumption: don't need to set the correct `thisValue`\n          // because it is guaranteed to be never accessed.\n          null,\n          1,\n          new IdentityMixinNode(\n              language,\n              new FrameDescriptor(),\n              getSourceSection(),\n              qualifiedName,\n              typeArgumentNodes.length == 1\n                  ?\n                  // shouldn't need to deepCopy() this node because it isn't used as @Child\n                  // anywhere else\n                  typeArgumentNodes[0]\n                  : null),\n          null);\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      if (typeAlias == BaseModule.getMixinTypeAlias()) {\n        return newMixin(language, qualifiedName);\n      }\n\n      return aliasedTypeNode.createDefaultValue(frame, language, headerSection, qualifiedName);\n    }\n\n    @Override\n    public @Nullable VmClass getVmClass() {\n      return aliasedTypeNode.getVmClass();\n    }\n\n    @Override\n    public @Nonnull VmTypeAlias getVmTypeAlias() {\n      return typeAlias;\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      if ((other instanceof TypeAliasTypeNode typeAliasTypeNode)) {\n        return aliasedTypeNode.isEquivalentTo(typeAliasTypeNode.aliasedTypeNode);\n      }\n      return aliasedTypeNode.isEquivalentTo(other);\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Alias(\n          typeAlias.export(),\n          Arrays.stream(typeArgumentNodes).map(TypeNode::export).collect(Collectors.toList()),\n          aliasedTypeNode.doExport());\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this) && aliasedTypeNode.acceptTypeNode(visitTypeArguments, consumer);\n    }\n\n    @Override\n    protected boolean isParametric() {\n      return typeArgumentNodes.length > 0;\n    }\n\n    // Note that mutating a frame's receiver and owner argument is very risky\n    // because any VmObject instantiated within the same root node execution\n    // holds a reference to (not immutable snapshot of) the frame\n    // via VmObjectLike.enclosingFrame.\n    // *Maybe* this works out for TypeAliasTypeNode because an object instantiated\n    // within a type constraint doesn't escape the constraint expression.\n    // If mutating receiver and owner can't be avoided, it would be safer\n    // to have VmObjectLike store them directly instead of storing enclosingFrame.\n    private static void setReceiver(Frame frame, Object receiver) {\n      frame.getArguments()[0] = receiver;\n    }\n\n    private static void setOwner(Frame frame, VmObjectLike owner) {\n      frame.getArguments()[1] = owner;\n    }\n  }\n\n  public static final class ConstrainedTypeNode extends TypeNode {\n\n    private final VmLanguage language;\n    @Child private TypeNode childNode;\n    @Children private final TypeConstraintNode[] constraintNodes;\n\n    public ConstrainedTypeNode(\n        SourceSection sourceSection,\n        VmLanguage language,\n        TypeNode childNode,\n        TypeConstraintNode[] constraintNodes) {\n      super(sourceSection);\n      this.language = language;\n      this.childNode = childNode;\n      this.constraintNodes = constraintNodes;\n    }\n\n    public TypeNode getChildTypeNode() {\n      return childNode;\n    }\n\n    @Override\n    public FrameSlotKind getFrameSlotKind() {\n      return childNode.getFrameSlotKind();\n    }\n\n    @Override\n    public TypeNode initWriteSlotNode(int slot) {\n      childNode.initWriteSlotNode(slot);\n      return this;\n    }\n\n    @ExplodeLoop\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      int customThisSlot;\n      var numberOfAuxiliarySlots = frame.getFrameDescriptor().getNumberOfAuxiliarySlots();\n      if (numberOfAuxiliarySlots == 0) {\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        customThisSlot =\n            frame.getFrameDescriptor().findOrAddAuxiliarySlot(CustomThisScope.FRAME_SLOT_ID);\n      } else {\n        // assertion: we only use auxiliary slots for custom `this`.\n        assert numberOfAuxiliarySlots == 1;\n        customThisSlot = 0;\n      }\n      var ret = childNode.executeLazily(frame, value);\n\n      var localContext = language.localContext.get();\n      var prevShouldTypeCheck = localContext.shouldEagerTypecheck();\n      localContext.shouldEagerTypecheck(true);\n      frame.setAuxiliarySlot(customThisSlot, value);\n      try {\n        for (var node : constraintNodes) {\n          node.execute(frame);\n        }\n        return ret;\n      } finally {\n        localContext.shouldEagerTypecheck(prevShouldTypeCheck);\n      }\n    }\n\n    @Override\n    public Object executeAndSet(VirtualFrame frame, Object value) {\n      var ret = execute(frame, value);\n      childNode.executeAndSet(frame, ret);\n      return ret;\n    }\n\n    @Override\n    public @Nullable Object createDefaultValue(\n        VirtualFrame frame,\n        VmLanguage language,\n        SourceSection headerSection,\n        String qualifiedName) {\n\n      return childNode.createDefaultValue(frame, language, headerSection, qualifiedName);\n    }\n\n    public SourceSection getBaseTypeSection() {\n      return childNode.getSourceSection();\n    }\n\n    public SourceSection getFirstConstraintSection() {\n      return constraintNodes[0].getSourceSection();\n    }\n\n    @Override\n    protected PType doExport() {\n      return new PType.Constrained(\n          childNode.doExport(),\n          Arrays.stream(constraintNodes)\n              .map(TypeConstraintNode::export)\n              .collect(Collectors.toList()));\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      // consider constrained types as always different\n      return false;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      if (!consumer.accept(this)) {\n        return false;\n      }\n      return childNode.acceptTypeNode(visitTypeArguments, consumer);\n    }\n\n    public VmTyped getMirror() {\n      // pkl:reflect doesn't currently expose constraints\n      return childNode.getMirror();\n    }\n  }\n\n  public static final class AnyTypeNode extends WriteFrameSlotTypeNode {\n    public AnyTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public boolean isNoopTypeCheck() {\n      return true;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      // do nothing\n      return value;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getAnyClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof AnyTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class StringTypeNode extends ObjectSlotTypeNode {\n    public StringTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof String) return value;\n\n      throw typeMismatch(value, BaseModule.getStringClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getStringClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof StringTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class NumberTypeNode extends FrameSlotTypeNode {\n    public NumberTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Illegal;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Long || value instanceof Double) return value;\n\n      throw typeMismatch(value, BaseModule.getNumberClass());\n    }\n\n    @Override\n    public Object executeAndSet(VirtualFrame frame, Object value) {\n      var kind = frame.getFrameDescriptor().getSlotKind(slot);\n      if (value instanceof Long l) {\n        if (kind == FrameSlotKind.Double || kind == FrameSlotKind.Object) {\n          frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Object);\n          frame.setObject(slot, l);\n        } else {\n          frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Long);\n          frame.setLong(slot, l);\n        }\n        return value;\n      } else if (value instanceof Double d) {\n        if (kind == FrameSlotKind.Long || kind == FrameSlotKind.Object) {\n          frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Object);\n          frame.setObject(slot, d);\n        } else {\n          frame.getFrameDescriptor().setSlotKind(slot, FrameSlotKind.Double);\n          frame.setDouble(slot, d);\n        }\n        return value;\n      } else {\n        throw typeMismatch(value, BaseModule.getNumberClass());\n      }\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getNumberClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof NumberTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class IntTypeNode extends IntSlotTypeNode {\n    public IntTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Long) return value;\n\n      throw typeMismatch(value, BaseModule.getIntClass());\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getIntClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof IntTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class FloatTypeNode extends FrameSlotTypeNode {\n    public FloatTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Double;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Double) return value;\n\n      throw typeMismatch(value, BaseModule.getFloatClass());\n    }\n\n    @Override\n    public Object executeAndSet(VirtualFrame frame, Object value) {\n      executeLazily(frame, value);\n      frame.setDouble(slot, (double) value);\n      return value;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getFloatClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof FloatTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  public static final class BooleanTypeNode extends FrameSlotTypeNode {\n    public BooleanTypeNode(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public FrameSlotKind getFrameSlotKind() {\n      return FrameSlotKind.Boolean;\n    }\n\n    @Override\n    protected Object executeLazily(VirtualFrame frame, Object value) {\n      if (value instanceof Boolean) return value;\n\n      throw typeMismatch(value, BaseModule.getBooleanClass());\n    }\n\n    @Override\n    public Object executeAndSet(VirtualFrame frame, Object value) {\n      execute(frame, value);\n      frame.setBoolean(slot, (boolean) value);\n      return value;\n    }\n\n    @Override\n    public VmClass getVmClass() {\n      return BaseModule.getBooleanClass();\n    }\n\n    @Override\n    public boolean doIsEquivalentTo(TypeNode other) {\n      return other instanceof BooleanTypeNode;\n    }\n\n    @Override\n    protected boolean acceptTypeNode(boolean visitTypeArguments, TypeNodeConsumer consumer) {\n      return consumer.accept(this);\n    }\n  }\n\n  private static @Nullable Object createDefaultValue(VmClass clazz) {\n    if (clazz.isInstantiable()) {\n      if (clazz.isListingClass()) return VmListing.empty();\n      if (clazz.isMappingClass()) return VmMapping.empty();\n      return clazz.getPrototype();\n    }\n\n    if (clazz.isListClass()) return VmList.EMPTY;\n    if (clazz.isSetClass()) return VmSet.EMPTY;\n    if (clazz.isMapClass()) return VmMap.EMPTY;\n    if (clazz.isCollectionClass()) return VmList.EMPTY;\n    if (clazz.isNullClass()) return VmNull.withoutDefault();\n\n    return null;\n  }\n\n  private static VmList createUnknownTypeArgumentMirrors(VmClass clazz) {\n    var typeParameterCount = clazz.getTypeParameterCount();\n    if (typeParameterCount == 0) return VmList.EMPTY;\n\n    var builder = VmList.EMPTY.builder();\n    for (var i = 0; i < typeParameterCount; i++) {\n      builder.add(MirrorFactories.unknownTypeFactory.create(null));\n    }\n    return builder.build();\n  }\n\n  @FunctionalInterface\n  protected interface TypeNodeConsumer {\n    /** Returns true if the visitor should continue visiting type nodes. */\n    boolean accept(TypeNode typeNode);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/TypeTestNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.NodeInfo;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.util.Nullable;\n\n@NodeInfo(shortName = \"is\")\npublic final class TypeTestNode extends ExpressionNode {\n  @Child private ExpressionNode valueNode;\n  @Child private UnresolvedTypeNode unresolvedTypeNode;\n  @Child private @Nullable TypeNode typeNode;\n\n  public TypeTestNode(\n      SourceSection sourceSection,\n      ExpressionNode valueNode,\n      UnresolvedTypeNode unresolvedTypeNode) {\n    super(sourceSection);\n    this.valueNode = valueNode;\n    this.unresolvedTypeNode = unresolvedTypeNode;\n  }\n\n  @Override\n  public Object executeGeneric(VirtualFrame frame) {\n    return executeBoolean(frame);\n  }\n\n  @Override\n  public boolean executeBoolean(VirtualFrame frame) {\n    if (typeNode == null) {\n      // don't compile unresolvedTypeNode.execute()\n      // invalidation is done by insert()\n      CompilerDirectives.transferToInterpreter();\n      typeNode = insert(unresolvedTypeNode.execute(frame));\n      unresolvedTypeNode = null;\n    }\n\n    // TODO: throw if typeNode is FunctionTypeNode (it's impossible to check)\n    // https://github.com/apple/pkl/issues/639\n    Object value = valueNode.executeGeneric(frame);\n    var localContext = VmLanguage.get(this).localContext.get();\n    boolean wasInTypeTest = localContext.isInTypeTest();\n    localContext.setInTypeTest(true);\n    try {\n      typeNode.executeEagerly(frame, value);\n      return true;\n    } catch (VmTypeMismatchException e) {\n      return false;\n    } finally {\n      localContext.setInTypeTest(wasInTypeTest);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/UnresolvedTypeNode.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.Set;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.expression.primary.GetModuleNode;\nimport org.pkl.core.ast.type.TypeNode.*;\nimport org.pkl.core.ast.type.TypeNodeFactory.*;\nimport org.pkl.core.runtime.*;\n\npublic abstract class UnresolvedTypeNode extends PklNode {\n  protected UnresolvedTypeNode(SourceSection sourceSection) {\n    super(sourceSection);\n  }\n\n  public abstract TypeNode execute(VirtualFrame frame);\n\n  public static final class Constrained extends UnresolvedTypeNode {\n\n    private final VmLanguage language;\n    @Child UnresolvedTypeNode childNode;\n    TypeConstraintNode[] constraintCheckNodes;\n\n    public Constrained(\n        SourceSection sourceSection,\n        VmLanguage language,\n        UnresolvedTypeNode childNode,\n        TypeConstraintNode[] constraintCheckNodes) {\n      super(sourceSection);\n      this.language = language;\n      this.childNode = childNode;\n      this.constraintCheckNodes = constraintCheckNodes;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new ConstrainedTypeNode(\n          sourceSection, language, childNode.execute(frame), constraintCheckNodes);\n    }\n  }\n\n  public static final class Unknown extends UnresolvedTypeNode {\n    public Unknown(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new UnknownTypeNode(sourceSection);\n    }\n  }\n\n  public static final class Nothing extends UnresolvedTypeNode {\n    public Nothing(SourceSection sourceSection) {\n      super(sourceSection);\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new NothingTypeNode(sourceSection);\n    }\n  }\n\n  /** The `module` type. */\n  public static final class Module extends UnresolvedTypeNode {\n    @Child private ExpressionNode getModuleNode;\n\n    public Module(SourceSection sourceSection) {\n      super(sourceSection);\n      getModuleNode = new GetModuleNode(sourceSection);\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      var module = (VmTyped) getModuleNode.executeGeneric(frame);\n      var moduleClass = module.getVmClass();\n      return moduleClass.isClosed()\n          ? new FinalModuleTypeNode(sourceSection, moduleClass)\n          : new NonFinalModuleTypeNode(sourceSection, moduleClass);\n    }\n  }\n\n  public static final class StringLiteral extends UnresolvedTypeNode {\n    private final String literal;\n\n    public StringLiteral(SourceSection sourceSection, String literal) {\n      super(sourceSection);\n      this.literal = literal;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new StringLiteralTypeNode(sourceSection, literal);\n    }\n  }\n\n  public static final class Declared extends UnresolvedTypeNode {\n    @Child private ExpressionNode resolveTypeNode;\n\n    public Declared(SourceSection sourceSection, ExpressionNode resolveTypeNode) {\n      super(sourceSection);\n      this.resolveTypeNode = resolveTypeNode;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      var type = resolveTypeNode.executeGeneric(frame);\n\n      if (type instanceof VmClass clazz) {\n        // Note: FinalClassTypeNode and NonFinalClassTypeNode assume that\n        // String/Boolean/Int/Float and their supertypes are handled separately.\n\n        if (clazz.getModuleName().equals(\"pkl.base\")) {\n          switch (clazz.getSimpleName()) {\n            case \"String\":\n              return new StringTypeNode(sourceSection);\n            case \"Boolean\":\n              return new BooleanTypeNode(sourceSection);\n            case \"Int\":\n              return new IntTypeNode(sourceSection);\n            case \"Float\":\n              return new FloatTypeNode(sourceSection);\n            case \"Number\":\n              return new NumberTypeNode(sourceSection);\n            case \"Any\":\n              return new AnyTypeNode(sourceSection);\n            case \"Typed\":\n              return new TypedTypeNode(sourceSection);\n            case \"Dynamic\":\n              return new DynamicTypeNode(sourceSection);\n          }\n        }\n\n        return TypeNode.forClass(sourceSection, clazz);\n      }\n\n      if (type instanceof VmTypeAlias alias) {\n        if (alias.getModuleName().equals(\"pkl.base\")) {\n          switch (alias.getSimpleName()) {\n            case \"NonNull\":\n              return new NonNullTypeAliasTypeNode();\n            case \"Int8\":\n              return new Int8TypeAliasTypeNode();\n            case \"UInt8\":\n              return new UInt8TypeAliasTypeNode();\n            case \"Int16\":\n              return new Int16TypeAliasTypeNode();\n            case \"UInt16\":\n              return new UIntTypeAliasTypeNode(alias, 0x000000000000FFFFL);\n            case \"Int32\":\n              return new Int32TypeAliasTypeNode();\n            case \"UInt32\":\n              return new UIntTypeAliasTypeNode(alias, 0x00000000FFFFFFFFL);\n            case \"UInt\":\n              return new UIntTypeAliasTypeNode(alias, 0x7FFFFFFFFFFFFFFFL);\n          }\n        }\n\n        return new TypeAliasTypeNode(sourceSection, alias, new TypeNode[0]);\n      }\n\n      var module = (VmTyped) type;\n      assert module.isModuleObject();\n      var clazz = module.getVmClass();\n      if (!module.isPrototype()) {\n        throw exceptionBuilder().evalError(\"notAModuleType\", clazz.getModuleName()).build();\n      }\n      return TypeNode.forClass(sourceSection, module.getVmClass());\n    }\n  }\n\n  public static final class Parameterized extends UnresolvedTypeNode {\n    private final VmLanguage language;\n    @Child private ExpressionNode resolveTypeNode;\n    @Children private final UnresolvedTypeNode[] typeArgumentNodes;\n\n    public Parameterized(\n        SourceSection sourceSection,\n        VmLanguage language,\n        ExpressionNode resolveTypeNode,\n        UnresolvedTypeNode[] typeArgumentNodes) {\n      super(sourceSection);\n      this.language = language;\n      this.resolveTypeNode = resolveTypeNode;\n      this.typeArgumentNodes = typeArgumentNodes;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      var baseType = resolveTypeNode.executeGeneric(frame);\n\n      if (baseType instanceof VmClass clazz) {\n        checkNumberOfTypeArguments(clazz);\n\n        if (clazz.isCollectionClass()) {\n          return new CollectionTypeNode(sourceSection, typeArgumentNodes[0].execute(frame));\n        }\n\n        if (clazz.isListClass()) {\n          return new ListTypeNode(sourceSection, typeArgumentNodes[0].execute(frame));\n        }\n\n        if (clazz.isSetClass()) {\n          return SetTypeNodeGen.create(sourceSection, typeArgumentNodes[0].execute(frame));\n        }\n\n        if (clazz.isMapClass()) {\n          return new MapTypeNode(\n              sourceSection,\n              typeArgumentNodes[0].execute(frame),\n              typeArgumentNodes[1].execute(frame));\n        }\n\n        if (clazz.isListingClass()) {\n          return new ListingTypeNode(sourceSection, language, typeArgumentNodes[0].execute(frame));\n        }\n\n        if (clazz.isMappingClass()) {\n          return new MappingTypeNode(\n              sourceSection,\n              language,\n              typeArgumentNodes[0].execute(frame),\n              typeArgumentNodes[1].execute(frame));\n        }\n\n        if (clazz.isPairClass()) {\n          return new PairTypeNode(\n              sourceSection,\n              typeArgumentNodes[0].execute(frame),\n              typeArgumentNodes[1].execute(frame));\n        }\n\n        if (clazz.isFunctionClass()) {\n          return FunctionClassTypeNodeGen.create(\n              sourceSection, typeArgumentNodes[0].execute(frame));\n        }\n\n        if (clazz.isFunctionNClass()) {\n          var argLength = typeArgumentNodes.length;\n          var resolvedTypeArgumentNodes = new TypeNode[argLength];\n          for (var i = 0; i < argLength; i++) {\n            resolvedTypeArgumentNodes[i] = typeArgumentNodes[i].execute(frame);\n          }\n          return FunctionNClassTypeNodeGen.create(sourceSection, resolvedTypeArgumentNodes);\n        }\n\n        // erase `x: Class<Foo>` to `x: Class` for now (cf. function types)\n        if (clazz.isClassClass()) {\n          return new FinalClassTypeNode(sourceSection, clazz);\n        }\n\n        if (clazz.isVarArgsClass()) {\n          return new VarArgsTypeNode(sourceSection, typeArgumentNodes[0].execute(frame));\n        }\n\n        throw exceptionBuilder()\n            .evalError(\"notAParameterizableClass\", clazz.getDisplayName())\n            .withSourceSection(typeArgumentNodes[0].sourceSection)\n            .build();\n      }\n\n      if (baseType instanceof VmTypeAlias typeAlias) {\n        var argLength = typeArgumentNodes.length;\n        var resolvedTypeArgumentNodes = new TypeNode[argLength];\n        for (var i = 0; i < argLength; i++) {\n          resolvedTypeArgumentNodes[i] = typeArgumentNodes[i].execute(frame);\n        }\n        return new TypeAliasTypeNode(sourceSection, typeAlias, resolvedTypeArgumentNodes);\n      }\n\n      var module = (VmTyped) baseType;\n      throw exceptionBuilder()\n          .evalError(\"notAParameterizableClass\", module.getModuleInfo().getModuleName())\n          .withSourceSection(typeArgumentNodes[0].sourceSection)\n          .build();\n    }\n\n    private void checkNumberOfTypeArguments(VmClass clazz) {\n      var expectedCount = clazz.getTypeParameterCount();\n      var actualCount = typeArgumentNodes.length;\n      if (expectedCount != actualCount) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"wrongTypeArgumentCount\", expectedCount, actualCount)\n            .build();\n      }\n    }\n  }\n\n  public static final class Nullable extends UnresolvedTypeNode {\n    @Child private UnresolvedTypeNode elementTypeNode;\n\n    public Nullable(SourceSection sourceSection, UnresolvedTypeNode elementTypeNode) {\n      super(sourceSection);\n      this.elementTypeNode = elementTypeNode;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new NullableTypeNode(sourceSection, elementTypeNode.execute(frame));\n    }\n  }\n\n  public static final class Union extends UnresolvedTypeNode {\n    @Children private final UnresolvedTypeNode[] unresolvedElementTypeNodes;\n    private final int defaultIndex;\n\n    public Union(\n        SourceSection sourceSection, int defaultIndex, UnresolvedTypeNode[] elementTypeNodes) {\n      super(sourceSection);\n      this.unresolvedElementTypeNodes = elementTypeNodes;\n      this.defaultIndex = defaultIndex;\n    }\n\n    @Override\n    @ExplodeLoop\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      var elementTypeNodes = new TypeNode[unresolvedElementTypeNodes.length];\n      var skipElementTypeChecks = true;\n\n      for (var i = 0; i < elementTypeNodes.length; i++) {\n        var elementTypeNode = unresolvedElementTypeNodes[i].execute(frame);\n        elementTypeNodes[i] = elementTypeNode;\n        skipElementTypeChecks &= elementTypeNode.isNoopTypeCheck();\n      }\n\n      return new UnionTypeNode(\n          sourceSection, defaultIndex, elementTypeNodes, skipElementTypeChecks);\n    }\n  }\n\n  public static final class UnionOfStringLiterals extends UnresolvedTypeNode {\n    private final Set<String> stringLiterals;\n    private final int defaultIndex;\n\n    public UnionOfStringLiterals(\n        SourceSection sourceSection, int defaultIndex, Set<String> stringLiterals) {\n      super(sourceSection);\n      this.stringLiterals = stringLiterals;\n      this.defaultIndex = defaultIndex;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new UnionOfStringLiteralsTypeNode(sourceSection, defaultIndex, stringLiterals);\n    }\n  }\n\n  public static final class Function extends UnresolvedTypeNode {\n    @Children private final UnresolvedTypeNode[] parameterTypeNodes;\n    @Child private UnresolvedTypeNode returnTypeNode;\n\n    public Function(\n        SourceSection sourceSection,\n        UnresolvedTypeNode[] parameterTypeNodes,\n        UnresolvedTypeNode returnTypeNode) {\n      super(sourceSection);\n      this.parameterTypeNodes = parameterTypeNodes;\n      this.returnTypeNode = returnTypeNode;\n    }\n\n    @Override\n    @ExplodeLoop\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      var parameterTypeNodes = new TypeNode[this.parameterTypeNodes.length];\n      for (var i = 0; i < parameterTypeNodes.length; i++) {\n        parameterTypeNodes[i] = this.parameterTypeNodes[i].execute(frame);\n      }\n\n      return FunctionTypeNodeGen.create(\n          sourceSection, parameterTypeNodes, returnTypeNode.execute(frame));\n    }\n  }\n\n  public static final class TypeVariable extends UnresolvedTypeNode {\n    private final TypeParameter typeParameter;\n\n    public TypeVariable(SourceSection sourceSection, TypeParameter typeParameter) {\n      super(sourceSection);\n      this.typeParameter = typeParameter;\n    }\n\n    @Override\n    public TypeNode execute(VirtualFrame frame) {\n      CompilerDirectives.transferToInterpreter();\n\n      return new TypeVariableNode(sourceSection, typeParameter);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/VmTypeMismatchException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.type;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.nodes.ControlFlowException;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.*;\nimport java.util.stream.Collectors;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.ValueFormatter;\nimport org.pkl.core.ast.type.TypeNode.UnionTypeNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Indicates that a type check failed. [TypeNode]s use this exception instead of [VmException] to\n * make type checking of union types efficient. Note that any [TruffleBoundary] between throw and\n * catch location of this exception must set `transferToInterpreterOnException = false`. (Currently\n * there aren't any.)\n */\npublic abstract class VmTypeMismatchException extends ControlFlowException {\n\n  protected final SourceSection sourceSection;\n  protected final Object actualValue;\n  protected @Nullable Map<CallTarget, StackFrame> insertedStackFrames = null;\n\n  protected VmTypeMismatchException(SourceSection sourceSection, Object actualValue) {\n    this.sourceSection = sourceSection;\n    this.actualValue = actualValue;\n  }\n\n  @TruffleBoundary\n  public void putInsertedStackFrame(CallTarget callTarget, StackFrame stackFrame) {\n    if (this.insertedStackFrames == null) {\n      this.insertedStackFrames = new HashMap<>();\n    }\n    this.insertedStackFrames.put(callTarget, stackFrame);\n  }\n\n  @TruffleBoundary\n  public abstract void buildMessage(\n      AnsiStringBuilder builder, String indent, boolean withPowerAssertions);\n\n  @TruffleBoundary\n  public void buildHint(AnsiStringBuilder builder, String indent, boolean withPowerAssertions) {}\n\n  @TruffleBoundary\n  public final VmException toVmException() {\n    return exceptionBuilder().build();\n  }\n\n  protected final VmExceptionBuilder exceptionBuilder() {\n    var builder =\n        new VmExceptionBuilder()\n            .withSourceSection(sourceSection)\n            .withMessageBuilder(\n                (b, withPowerAssertions) -> buildMessage(b, \"\", withPowerAssertions));\n    if (hasHint()) {\n      builder.withHintBuilder((b, withPowerAssertions) -> buildHint(b, \"\", withPowerAssertions));\n    }\n    if (insertedStackFrames != null) {\n      builder.withInsertedStackFrames(insertedStackFrames);\n    }\n    return builder;\n  }\n\n  protected abstract Boolean hasHint();\n\n  public static final class Simple extends VmTypeMismatchException {\n\n    private final Object expectedType;\n\n    public Simple(SourceSection sourceSection, Object actualValue, Object expectedType) {\n      super(sourceSection, actualValue);\n\n      assert expectedType instanceof VmClass\n          || expectedType instanceof VmTypeAlias\n          || expectedType instanceof String // string literal type\n          || expectedType instanceof Set; // union of string literal types\n\n      this.expectedType = expectedType;\n    }\n\n    @Override\n    @TruffleBoundary\n    public void buildMessage(\n        AnsiStringBuilder builder, String indent, boolean withPowerAssertions) {\n      String renderedType;\n      var valueFormatter = ValueFormatter.basic();\n      if (expectedType instanceof String string) {\n        // string literal type\n        renderedType = valueFormatter.formatStringValue(string, \"\");\n      } else if (expectedType instanceof Set) {\n        // union of string literal types\n        @SuppressWarnings(\"unchecked\")\n        var stringLiterals = (Set<String>) expectedType;\n        renderedType =\n            stringLiterals.stream()\n                .map((l) -> valueFormatter.formatStringValue(l, \"\"))\n                .collect(Collectors.joining(\"|\"));\n      } else {\n        renderedType = expectedType.toString();\n      }\n\n      if (actualValue instanceof VmNull\n          || actualValue instanceof String && expectedType instanceof Set) {\n        builder.append(\n            ErrorMessages.createIndented(\n                \"typeMismatchValue\", indent, renderedType, new ProgramValue(\"\", actualValue)));\n        return;\n      }\n\n      // give better error than \"expected foo.Bar, but got foo.Bar\" in case of naming conflict\n      if (actualValue instanceof VmTyped actualObj\n          && expectedType instanceof VmClass expectedClass) {\n        var actualClass = actualObj.getVmClass();\n        if (actualClass.getQualifiedName().equals(expectedClass.getQualifiedName())) {\n          var actualModuleUri = actualClass.getModule().getModuleInfo().getModuleKey().getUri();\n          var expectedModuleUri = expectedClass.getModule().getModuleInfo().getModuleKey().getUri();\n\n          builder\n              .append(\n                  ErrorMessages.createIndented(\n                      actualClass.getPClassInfo().isModuleClass()\n                          ? \"typeMismatchVersionConflict1\"\n                          : \"typeMismatchVersionConflict2\",\n                      indent,\n                      renderedType,\n                      expectedModuleUri,\n                      actualModuleUri))\n              .append(\"\\n\");\n          return;\n        }\n      }\n\n      builder\n          .append(\n              ErrorMessages.createIndented(\n                  \"typeMismatch\", indent, renderedType, VmUtils.getClass(actualValue)))\n          .append(\"\\n\")\n          .append(indent)\n          .append(\"Value: \")\n          .append(VmValueRenderer.singleLine(80 - indent.length()).render(actualValue));\n    }\n\n    @Override\n    protected Boolean hasHint() {\n      return false;\n    }\n  }\n\n  public static final class Constraint extends VmTypeMismatchException {\n\n    private final SourceSection constraintBodySourceSection;\n    private final @Nullable Map<Node, List<Object>> trackedValues;\n\n    public Constraint(\n        SourceSection sourceSection,\n        Object actualValue,\n        SourceSection constraintBodySourceSection,\n        @Nullable Map<Node, List<Object>> trackedValues) {\n      super(sourceSection, actualValue);\n      this.constraintBodySourceSection = constraintBodySourceSection;\n      this.trackedValues = trackedValues;\n    }\n\n    @Override\n    @TruffleBoundary\n    public void buildMessage(\n        AnsiStringBuilder builder, String indent, boolean withPowerAssertions) {\n      var expression = sourceSection.getCharacters().toString();\n      builder\n          .append(ErrorMessages.createIndented(\"typeConstraintViolated\", indent, expression))\n          .append(\"\\n\")\n          .append(indent)\n          .append(\"Value: \")\n          .append(VmValueRenderer.singleLine(80 - indent.length()).render(actualValue));\n      if (!withPowerAssertions || trackedValues == null) {\n        return;\n      }\n      builder.append(\"\\n\\n\");\n      PowerAssertions.render(\n          builder, indent + \"    \", constraintBodySourceSection, trackedValues, null);\n    }\n\n    @Override\n    protected Boolean hasHint() {\n      return false;\n    }\n  }\n\n  public static final class Union extends VmTypeMismatchException {\n    private final UnionTypeNode typeCheckNode;\n    private final VmTypeMismatchException[] children;\n\n    public Union(\n        SourceSection sourceSection,\n        Object actualValue,\n        UnionTypeNode typeCheckNode,\n        VmTypeMismatchException[] children) {\n      super(sourceSection, actualValue);\n      this.typeCheckNode = typeCheckNode;\n      this.children = children;\n    }\n\n    @Override\n    protected Boolean hasHint() {\n      var nonTrivialMatches = findNonTrivialMismatches();\n      return !nonTrivialMatches.isEmpty();\n    }\n\n    @Override\n    @TruffleBoundary\n    public void buildMessage(\n        AnsiStringBuilder builder, String indent, boolean withPowerAssertions) {\n      var nonTrivialMismatches = findNonTrivialMismatches();\n\n      if (nonTrivialMismatches.isEmpty()) {\n        if (actualValue instanceof VmNull) {\n          builder.append(\n              ErrorMessages.createIndented(\n                  \"typeMismatchValue\", indent, sourceSection.getCharacters().toString(), \"null\"));\n        } else {\n          builder.append(\n              ErrorMessages.createIndented(\n                  \"typeMismatch\",\n                  indent,\n                  sourceSection.getCharacters().toString(),\n                  VmUtils.getClass(actualValue)));\n        }\n      } else {\n        builder.append(\n            ErrorMessages.createIndented(\n                \"typeMismatchDifferent\",\n                indent,\n                sourceSection.getCharacters().toString(),\n                VmUtils.getClass(actualValue)));\n      }\n\n      builder\n          .append(\"\\n\")\n          .append(indent)\n          .append(\"Value: \")\n          .append(VmValueRenderer.singleLine(80 - indent.length()).render(actualValue));\n    }\n\n    @Override\n    @TruffleBoundary\n    public void buildHint(AnsiStringBuilder builder, String indent, boolean withPowerAssertions) {\n      var nonTrivialMismatches = findNonTrivialMismatches();\n\n      var isPeerError = false;\n      for (var idx : nonTrivialMismatches) {\n        if (isPeerError) {\n          builder.append(\"\\n\\n\");\n        }\n        isPeerError = true;\n        builder\n            .append(\n                ErrorMessages.createIndented(\n                    \"typeMismatchBecause\",\n                    indent,\n                    typeCheckNode\n                        .elementTypeNodes[idx]\n                        .getSourceSection()\n                        .getCharacters()\n                        .toString()))\n            .append(\"\\n\");\n        var child = children[idx];\n        child.buildMessage(builder, indent + \"  \", withPowerAssertions);\n        if (child.hasHint()) {\n          builder.append(\"\\n\\n\");\n          child.buildHint(builder, indent + \"  \", withPowerAssertions);\n        }\n      }\n    }\n\n    private List<Integer> findNonTrivialMismatches() {\n      var result = new ArrayList<Integer>();\n      for (int idx = 0; idx < children.length; idx++) {\n        VmTypeMismatchException child = children[idx];\n        if (!(child instanceof VmTypeMismatchException.Simple)\n            // identity comparison is intentional\n            || child.sourceSection != typeCheckNode.elementTypeNodes[idx].getSourceSection()) {\n          result.add(idx);\n        }\n      }\n      return result;\n    }\n  }\n\n  public static final class Nothing extends VmTypeMismatchException {\n\n    public Nothing(SourceSection sourceSection, Object actualValue) {\n      super(sourceSection, actualValue);\n    }\n\n    @Override\n    @TruffleBoundary\n    public void buildMessage(\n        AnsiStringBuilder builder, String indent, boolean withPowerAssertions) {\n      builder\n          .append(\n              ErrorMessages.createIndented(\n                  \"cannotAssignToNothing\", indent, VmUtils.getClass(actualValue)))\n          .append(\"\\n\")\n          .append(indent)\n          .append(\"Value: \")\n          .append(VmValueRenderer.singleLine(80 - indent.length()).render(actualValue));\n    }\n\n    @Override\n    protected Boolean hasHint() {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/ast/type/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.ast.type;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/evaluatorSettings/Color.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.evaluatorSettings;\n\npublic enum Color {\n  NEVER,\n  AUTO,\n  ALWAYS;\n\n  public boolean hasColor() {\n    return switch (this) {\n      case AUTO -> System.console() != null;\n      case NEVER -> false;\n      case ALWAYS -> true;\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/evaluatorSettings/PklEvaluatorSettings.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.evaluatorSettings;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.Path;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Objects;\nimport java.util.function.BiFunction;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.pkl.core.Duration;\nimport org.pkl.core.PNull;\nimport org.pkl.core.PObject;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.PklException;\nimport org.pkl.core.Value;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\n/** Java version of {@code pkl.EvaluatorSettings}. */\npublic record PklEvaluatorSettings(\n    @Nullable Map<String, String> externalProperties,\n    @Nullable Map<String, String> env,\n    @Nullable List<Pattern> allowedModules,\n    @Nullable List<Pattern> allowedResources,\n    @Nullable Color color,\n    @Nullable Boolean noCache,\n    @Nullable Path moduleCacheDir,\n    @Nullable List<Path> modulePath,\n    @Nullable Duration timeout,\n    @Nullable Path rootDir,\n    @Nullable Http http,\n    @Nullable Map<String, ExternalReader> externalModuleReaders,\n    @Nullable Map<String, ExternalReader> externalResourceReaders,\n    @Nullable TraceMode traceMode) {\n\n  /** Initializes a {@link PklEvaluatorSettings} from a raw object representation. */\n  @SuppressWarnings(\"unchecked\")\n  public static PklEvaluatorSettings parse(\n      Value input, BiFunction<? super String, ? super String, Path> pathNormalizer) {\n    if (!(input instanceof PObject pSettings)) {\n      throw PklBugException.unreachableCode();\n    }\n\n    var moduleCacheDirStr = (String) pSettings.get(\"moduleCacheDir\");\n    var moduleCacheDir =\n        moduleCacheDirStr == null\n            ? null\n            : pathNormalizer.apply(moduleCacheDirStr, \"moduleCacheDir\");\n\n    var allowedModulesStrs = (List<String>) pSettings.get(\"allowedModules\");\n    var allowedModules =\n        allowedModulesStrs == null\n            ? null\n            : allowedModulesStrs.stream().map(Pattern::compile).toList();\n\n    var allowedResourcesStrs = (List<String>) pSettings.get(\"allowedResources\");\n    var allowedResources =\n        allowedResourcesStrs == null\n            ? null\n            : allowedResourcesStrs.stream().map(Pattern::compile).toList();\n\n    var modulePathStrs = (List<String>) pSettings.get(\"modulePath\");\n    var modulePath =\n        modulePathStrs == null\n            ? null\n            : modulePathStrs.stream().map(it -> pathNormalizer.apply(it, \"modulePath\")).toList();\n\n    var rootDirStr = (String) pSettings.get(\"rootDir\");\n    var rootDir = rootDirStr == null ? null : pathNormalizer.apply(rootDirStr, \"rootDir\");\n\n    var externalModuleReadersRaw = (Map<String, Value>) pSettings.get(\"externalModuleReaders\");\n    var externalModuleReaders =\n        externalModuleReadersRaw == null\n            ? null\n            : externalModuleReadersRaw.entrySet().stream()\n                .collect(\n                    Collectors.toMap(\n                        Entry::getKey, entry -> ExternalReader.parse(entry.getValue())));\n\n    var externalResourceReadersRaw = (Map<String, Value>) pSettings.get(\"externalResourceReaders\");\n    var externalResourceReaders =\n        externalResourceReadersRaw == null\n            ? null\n            : externalResourceReadersRaw.entrySet().stream()\n                .collect(\n                    Collectors.toMap(\n                        Entry::getKey, entry -> ExternalReader.parse(entry.getValue())));\n\n    var color = (String) pSettings.get(\"color\");\n    var traceMode = (String) pSettings.get(\"traceMode\");\n\n    return new PklEvaluatorSettings(\n        (Map<String, String>) pSettings.get(\"externalProperties\"),\n        (Map<String, String>) pSettings.get(\"env\"),\n        allowedModules,\n        allowedResources,\n        color == null ? null : Color.valueOf(color.toUpperCase()),\n        (Boolean) pSettings.get(\"noCache\"),\n        moduleCacheDir,\n        modulePath,\n        (Duration) pSettings.get(\"timeout\"),\n        rootDir,\n        Http.parse((Value) pSettings.get(\"http\")),\n        externalModuleReaders,\n        externalResourceReaders,\n        traceMode == null ? null : TraceMode.valueOf(traceMode.toUpperCase()));\n  }\n\n  public record Http(@Nullable Proxy proxy, @Nullable Map<URI, URI> rewrites) {\n    public static final Http DEFAULT = new Http(null, Collections.emptyMap());\n\n    @SuppressWarnings(\"unchecked\")\n    public static @Nullable Http parse(@Nullable Value input) {\n      if (input == null || input instanceof PNull) {\n        return null;\n      } else if (input instanceof PObject http) {\n        var proxy = Proxy.parse((Value) http.getProperty(\"proxy\"));\n        var rewrites = http.getProperty(\"rewrites\");\n        if (rewrites instanceof PNull) {\n          return new Http(proxy, null);\n        } else {\n          var parsedRewrites = new HashMap<URI, URI>();\n          for (var entry : ((Map<String, String>) rewrites).entrySet()) {\n            var key = entry.getKey();\n            var value = entry.getValue();\n            try {\n              parsedRewrites.put(new URI(key), new URI(value));\n            } catch (URISyntaxException e) {\n              throw new PklException(ErrorMessages.create(\"invalidUri\", e.getInput()));\n            }\n          }\n          return new Http(proxy, parsedRewrites);\n        }\n      } else {\n        throw PklBugException.unreachableCode();\n      }\n    }\n  }\n\n  public record Proxy(@Nullable URI address, @Nullable List<String> noProxy) {\n    @Deprecated(forRemoval = true)\n    public static Proxy create(@Nullable String address, @Nullable List<String> noProxy) {\n      URI addressUri;\n      try {\n        addressUri = address == null ? null : new URI(address);\n      } catch (URISyntaxException e) {\n        throw new PklException(ErrorMessages.create(\"invalidUri\", address));\n      }\n      return new Proxy(addressUri, noProxy);\n    }\n\n    public static @Nullable Proxy parse(Value input) {\n      if (input instanceof PNull) {\n        return null;\n      } else if (input instanceof PObject proxy) {\n        var address = (String) proxy.get(\"address\");\n        @SuppressWarnings(\"unchecked\")\n        var noProxy = (List<String>) proxy.get(\"noProxy\");\n        try {\n          var addressUri = address == null ? null : new URI(address);\n          return new Proxy(addressUri, noProxy);\n        } catch (URISyntaxException e) {\n          throw new PklException(ErrorMessages.create(\"invalidUri\", address));\n        }\n      } else {\n        throw PklBugException.unreachableCode();\n      }\n    }\n  }\n\n  public record ExternalReader(String executable, @Nullable List<String> arguments) {\n    @SuppressWarnings(\"unchecked\")\n    public static ExternalReader parse(Value input) {\n      if (input instanceof PObject externalReader) {\n        var executable = (String) externalReader.getProperty(\"executable\");\n        var arguments = (List<String>) externalReader.get(\"arguments\");\n        return new ExternalReader(executable, arguments);\n      }\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  private boolean arePatternsEqual(\n      @Nullable List<Pattern> thesePatterns, @Nullable List<Pattern> thosePatterns) {\n    if (thesePatterns == null) {\n      return thosePatterns == null;\n    }\n    if (thosePatterns == null || thesePatterns.size() != thosePatterns.size()) {\n      return false;\n    }\n    for (var i = 0; i < thesePatterns.size(); i++) {\n      if (!thesePatterns.get(i).pattern().equals(thosePatterns.get(i).pattern())) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (!(obj instanceof PklEvaluatorSettings that)) {\n      return false;\n    }\n\n    return Objects.equals(externalProperties, that.externalProperties)\n        && Objects.equals(env, that.env)\n        && arePatternsEqual(allowedModules, that.allowedModules)\n        && arePatternsEqual(allowedResources, that.allowedResources)\n        && Objects.equals(color, that.color)\n        && Objects.equals(noCache, that.noCache)\n        && Objects.equals(moduleCacheDir, that.moduleCacheDir)\n        && Objects.equals(timeout, that.timeout)\n        && Objects.equals(rootDir, that.rootDir)\n        && Objects.equals(http, that.http)\n        && Objects.equals(traceMode, that.traceMode);\n  }\n\n  private int hashPatterns(@Nullable List<Pattern> patterns) {\n    if (patterns == null) {\n      return 0;\n    }\n    var ret = 1;\n    for (var pattern : patterns) {\n      ret = 31 * ret + pattern.pattern().hashCode();\n    }\n    return ret;\n  }\n\n  @Override\n  public int hashCode() {\n    var result =\n        Objects.hash(\n            externalProperties,\n            env,\n            color,\n            noCache,\n            moduleCacheDir,\n            timeout,\n            rootDir,\n            http,\n            traceMode);\n    result = 31 * result + hashPatterns(allowedModules);\n    result = 31 * result + hashPatterns(allowedResources);\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/evaluatorSettings/TraceMode.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.evaluatorSettings;\n\n/** Dictates the rendering of calls to the trace() method within Pkl. */\npublic enum TraceMode {\n  /** All structures passed to trace() will be emitted on a single line. */\n  COMPACT,\n  /** All structures passed to trace() will be indented and emitted across multiple lines. */\n  PRETTY\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/evaluatorSettings/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.evaluatorSettings;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalModuleResolver.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.List;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.messaging.MessageTransport;\nimport org.pkl.core.module.PathElement;\n\npublic interface ExternalModuleResolver {\n  static ExternalModuleResolver of(MessageTransport transport, long evaluatorId) {\n    return new ExternalModuleResolverImpl(transport, evaluatorId);\n  }\n\n  String resolveModule(SecurityManager securityManager, URI uri)\n      throws IOException, SecurityManagerException;\n\n  boolean hasElement(org.pkl.core.SecurityManager securityManager, URI elementUri)\n      throws SecurityManagerException;\n\n  List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n      throws IOException, SecurityManagerException;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalModuleResolverImpl.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Random;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.Future;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.messaging.MessageTransport;\nimport org.pkl.core.messaging.MessageTransports;\nimport org.pkl.core.messaging.Messages.ListModulesRequest;\nimport org.pkl.core.messaging.Messages.ListModulesResponse;\nimport org.pkl.core.messaging.Messages.ReadModuleRequest;\nimport org.pkl.core.messaging.Messages.ReadModuleResponse;\nimport org.pkl.core.messaging.ProtocolException;\nimport org.pkl.core.module.PathElement;\n\nfinal class ExternalModuleResolverImpl implements ExternalModuleResolver {\n  private final MessageTransport transport;\n  private final long evaluatorId;\n  private final Map<URI, Future<String>> readResponses = new ConcurrentHashMap<>();\n  private final Map<URI, Future<List<PathElement>>> listResponses = new ConcurrentHashMap<>();\n  private final Random requestIdGenerator = new Random();\n\n  ExternalModuleResolverImpl(MessageTransport transport, long evaluatorId) {\n    this.transport = transport;\n    this.evaluatorId = evaluatorId;\n  }\n\n  public List<PathElement> listElements(SecurityManager securityManager, URI uri)\n      throws IOException, SecurityManagerException {\n    securityManager.checkResolveModule(uri);\n    return doListElements(uri);\n  }\n\n  public boolean hasElement(SecurityManager securityManager, URI uri)\n      throws SecurityManagerException {\n    securityManager.checkResolveModule(uri);\n    try {\n      doReadModule(uri);\n      return true;\n    } catch (IOException e) {\n      return false;\n    }\n  }\n\n  public String resolveModule(SecurityManager securityManager, URI uri)\n      throws IOException, SecurityManagerException {\n    securityManager.checkResolveModule(uri);\n    return doReadModule(uri);\n  }\n\n  private String doReadModule(URI moduleUri) throws IOException {\n    return MessageTransports.resolveFuture(\n        readResponses.computeIfAbsent(\n            moduleUri,\n            (uri) -> {\n              var future = new CompletableFuture<String>();\n              var request = new ReadModuleRequest(requestIdGenerator.nextLong(), evaluatorId, uri);\n              try {\n                transport.send(\n                    request,\n                    (response) -> {\n                      if (response instanceof ReadModuleResponse resp) {\n                        if (resp.error() != null) {\n                          future.completeExceptionally(new IOException(resp.error()));\n                        } else if (resp.contents() != null) {\n                          future.complete(resp.contents());\n                        } else {\n                          future.complete(\"\");\n                        }\n                      } else {\n                        future.completeExceptionally(new ProtocolException(\"unexpected response\"));\n                      }\n                    });\n              } catch (ProtocolException | IOException e) {\n                future.completeExceptionally(e);\n              }\n              return future;\n            }));\n  }\n\n  private List<PathElement> doListElements(URI baseUri) throws IOException {\n    return MessageTransports.resolveFuture(\n        listResponses.computeIfAbsent(\n            baseUri,\n            (uri) -> {\n              var future = new CompletableFuture<List<PathElement>>();\n              var request = new ListModulesRequest(requestIdGenerator.nextLong(), evaluatorId, uri);\n              try {\n                transport.send(\n                    request,\n                    (response) -> {\n                      if (response instanceof ListModulesResponse resp) {\n                        if (resp.error() != null) {\n                          future.completeExceptionally(new IOException(resp.error()));\n                        } else {\n                          future.complete(\n                              Objects.requireNonNullElseGet(resp.pathElements(), List::of));\n                        }\n                      } else {\n                        future.completeExceptionally(new ProtocolException(\"unexpected response\"));\n                      }\n                    });\n              } catch (ProtocolException | IOException e) {\n                future.completeExceptionally(e);\n              }\n              return future;\n            }));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderMessagePackDecoder.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.InputStream;\nimport java.net.URISyntaxException;\nimport java.util.Map;\nimport org.msgpack.core.MessagePack;\nimport org.msgpack.core.MessageUnpacker;\nimport org.msgpack.value.Value;\nimport org.pkl.core.externalreader.ExternalReaderMessages.*;\nimport org.pkl.core.messaging.BaseMessagePackDecoder;\nimport org.pkl.core.messaging.DecodeException;\nimport org.pkl.core.messaging.Message;\nimport org.pkl.core.messaging.Message.Type;\nimport org.pkl.core.util.Nullable;\n\nfinal class ExternalReaderMessagePackDecoder extends BaseMessagePackDecoder {\n\n  public ExternalReaderMessagePackDecoder(MessageUnpacker unpacker) {\n    super(unpacker);\n  }\n\n  public ExternalReaderMessagePackDecoder(InputStream inputStream) {\n    this(MessagePack.newDefaultUnpacker(inputStream));\n  }\n\n  @Override\n  protected @Nullable Message decodeMessage(Type msgType, Map<Value, Value> map)\n      throws DecodeException, URISyntaxException {\n    return switch (msgType) {\n      case INITIALIZE_MODULE_READER_REQUEST ->\n          new InitializeModuleReaderRequest(\n              unpackLong(map, \"requestId\"), unpackString(map, \"scheme\"));\n      case INITIALIZE_RESOURCE_READER_REQUEST ->\n          new InitializeResourceReaderRequest(\n              unpackLong(map, \"requestId\"), unpackString(map, \"scheme\"));\n      case INITIALIZE_MODULE_READER_RESPONSE ->\n          new InitializeModuleReaderResponse(\n              unpackLong(map, \"requestId\"), unpackModuleReaderSpec(getNullable(map, \"spec\")));\n      case INITIALIZE_RESOURCE_READER_RESPONSE ->\n          new InitializeResourceReaderResponse(\n              unpackLong(map, \"requestId\"), unpackResourceReaderSpec(getNullable(map, \"spec\")));\n      case CLOSE_EXTERNAL_PROCESS -> new CloseExternalProcess();\n      default -> super.decodeMessage(msgType, map);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderMessagePackEncoder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport org.msgpack.core.MessagePack;\nimport org.msgpack.core.MessagePacker;\nimport org.pkl.core.externalreader.ExternalReaderMessages.*;\nimport org.pkl.core.messaging.BaseMessagePackEncoder;\nimport org.pkl.core.messaging.Message;\nimport org.pkl.core.messaging.ProtocolException;\nimport org.pkl.core.util.Nullable;\n\nfinal class ExternalReaderMessagePackEncoder extends BaseMessagePackEncoder {\n\n  public ExternalReaderMessagePackEncoder(MessagePacker packer) {\n    super(packer);\n  }\n\n  public ExternalReaderMessagePackEncoder(OutputStream outputStream) {\n    this(MessagePack.newDefaultPacker(outputStream));\n  }\n\n  @Override\n  protected @Nullable void encodeMessage(Message msg) throws ProtocolException, IOException {\n    switch (msg.type()) {\n      case INITIALIZE_MODULE_READER_REQUEST -> {\n        var m = (InitializeModuleReaderRequest) msg;\n        packer.packMapHeader(2);\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"scheme\", m.scheme());\n      }\n      case INITIALIZE_RESOURCE_READER_REQUEST -> {\n        var m = (InitializeResourceReaderRequest) msg;\n        packer.packMapHeader(2);\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"scheme\", m.scheme());\n      }\n      case INITIALIZE_MODULE_READER_RESPONSE -> {\n        var m = (InitializeModuleReaderResponse) msg;\n        packMapHeader(1, m.spec());\n        packKeyValue(\"requestId\", m.requestId());\n        if (m.spec() != null) {\n          packer.packString(\"spec\");\n          packModuleReaderSpec(m.spec());\n        }\n      }\n      case INITIALIZE_RESOURCE_READER_RESPONSE -> {\n        var m = (InitializeResourceReaderResponse) msg;\n        packMapHeader(1, m.spec());\n        packKeyValue(\"requestId\", m.requestId());\n        if (m.spec() != null) {\n          packer.packString(\"spec\");\n          packResourceReaderSpec(m.spec());\n        }\n      }\n      case CLOSE_EXTERNAL_PROCESS -> packer.packMapHeader(0);\n      default -> super.encodeMessage(msg);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderMessages.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport org.pkl.core.messaging.Message.*;\nimport org.pkl.core.messaging.Messages.ModuleReaderSpec;\nimport org.pkl.core.messaging.Messages.ResourceReaderSpec;\nimport org.pkl.core.util.Nullable;\n\nfinal class ExternalReaderMessages {\n  private ExternalReaderMessages() {}\n\n  record InitializeModuleReaderRequest(long requestId, String scheme) implements Server.Request {\n    public Type type() {\n      return Type.INITIALIZE_MODULE_READER_REQUEST;\n    }\n  }\n\n  record InitializeResourceReaderRequest(long requestId, String scheme) implements Server.Request {\n    public Type type() {\n      return Type.INITIALIZE_RESOURCE_READER_REQUEST;\n    }\n  }\n\n  record InitializeModuleReaderResponse(long requestId, @Nullable ModuleReaderSpec spec)\n      implements Client.Response {\n    public Type type() {\n      return Type.INITIALIZE_MODULE_READER_RESPONSE;\n    }\n  }\n\n  record InitializeResourceReaderResponse(long requestId, @Nullable ResourceReaderSpec spec)\n      implements Client.Response {\n    public Type type() {\n      return Type.INITIALIZE_RESOURCE_READER_RESPONSE;\n    }\n  }\n\n  record CloseExternalProcess() implements Server.OneWay {\n    public Type type() {\n      return Type.CLOSE_EXTERNAL_PROCESS;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderProcess.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;\nimport org.pkl.core.util.Nullable;\n\n/** An external process that reads Pkl modules and resources. */\npublic interface ExternalReaderProcess extends AutoCloseable {\n  /**\n   * Creates a new {@link ExternalReaderProcess} from the given spec. No resources are allocated at\n   * this time.\n   */\n  static ExternalReaderProcess of(ExternalReader spec) {\n    return new ExternalReaderProcessImpl(spec);\n  }\n\n  /**\n   * Returns a resolver for modules provided via this reader.\n   *\n   * <p>Upon first call, this method may allocate resources, including spawning a child process.\n   *\n   * @throws IllegalStateException if this process has already been closed\n   */\n  ExternalModuleResolver getModuleResolver(long evaluatorId) throws ExternalReaderProcessException;\n\n  /**\n   * Returns a resolver for resources provided via this reader.\n   *\n   * <p>Upon first call, this method may allocate resources, including spawning a child process.\n   *\n   * @throws IllegalStateException if this process has already been closed\n   */\n  ExternalResourceResolver getResourceResolver(long evaluatorId)\n      throws ExternalReaderProcessException;\n\n  /**\n   * Returns the spec, if available, of this process's module reader with the given scheme.\n   *\n   * @throws IllegalStateException if this process has already been {@linkplain #close closed}\n   * @throws IOException if an I/O error occurs\n   */\n  @Nullable\n  ModuleReaderSpec getModuleReaderSpec(String scheme) throws IOException;\n\n  /**\n   * Returns the spec, if available, of this process's resource reader with the given scheme.\n   *\n   * @throws IllegalStateException if this process has already been {@linkplain #close closed}\n   * @throws IOException if an I/O error occurs\n   */\n  @Nullable\n  ResourceReaderSpec getResourceReaderSpec(String scheme) throws IOException;\n\n  /**\n   * Closes this process, releasing any associated resources.\n   *\n   * <p>This method can be safely called multiple times. Subsequent calls have no effect.\n   *\n   * @implNote Implementers should request a graceful termination by sending a {@link\n   *     ExternalReaderMessages.CloseExternalProcess CloseExternalProcess} message to the process\n   *     before terminating it forcibly.\n   */\n  @Override\n  void close();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderProcessException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\npublic final class ExternalReaderProcessException extends Exception {\n  public ExternalReaderProcessException(String msg) {\n    super(msg);\n  }\n\n  public ExternalReaderProcessException(Throwable cause) {\n    super(cause);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalReaderProcessImpl.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport java.lang.ProcessBuilder.Redirect;\nimport java.time.Duration;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Random;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.TimeUnit;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings.ExternalReader;\nimport org.pkl.core.externalreader.ExternalReaderMessages.*;\nimport org.pkl.core.messaging.MessageTransport;\nimport org.pkl.core.messaging.MessageTransports;\nimport org.pkl.core.messaging.ProtocolException;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\nfinal class ExternalReaderProcessImpl implements ExternalReaderProcess {\n\n  private static final Duration CLOSE_TIMEOUT = Duration.ofSeconds(3);\n\n  private final ExternalReader spec;\n  private final @Nullable String logPrefix;\n  private final Map<String, Future<@Nullable ModuleReaderSpec>> initializeModuleReaderResponses =\n      new ConcurrentHashMap<>();\n  private final Map<String, Future<@Nullable ResourceReaderSpec>>\n      initializeResourceReaderResponses = new ConcurrentHashMap<>();\n  private final Random requestIdGenerator = new Random();\n\n  private final Object lock = new Object();\n  private @GuardedBy(\"lock\") boolean closed = false;\n\n  @LateInit\n  @GuardedBy(\"lock\")\n  private Process process;\n\n  @LateInit\n  @GuardedBy(\"lock\")\n  private MessageTransport transport;\n\n  private void log(String msg) {\n    if (logPrefix != null) {\n      System.err.println(logPrefix + msg);\n    }\n  }\n\n  ExternalReaderProcessImpl(ExternalReader spec) {\n    this.spec = spec;\n    logPrefix =\n        Objects.equals(System.getenv(\"PKL_DEBUG\"), \"1\")\n            ? \"[pkl-core][external-process][\" + spec.executable() + \"] \"\n            : null;\n  }\n\n  @Override\n  public ExternalModuleResolver getModuleResolver(long evaluatorId)\n      throws ExternalReaderProcessException {\n    return ExternalModuleResolver.of(getTransport(), evaluatorId);\n  }\n\n  @Override\n  public ExternalResourceResolver getResourceResolver(long evaluatorId)\n      throws ExternalReaderProcessException {\n    return ExternalResourceResolver.of(getTransport(), evaluatorId);\n  }\n\n  private MessageTransport getTransport() throws ExternalReaderProcessException {\n    synchronized (lock) {\n      if (closed) {\n        throw new IllegalStateException(\"External reader process has already been closed.\");\n      }\n      if (process != null) {\n        if (!process.isAlive()) {\n          throw new ExternalReaderProcessException(\n              ErrorMessages.create(\"externalReaderAlreadyTerminated\"));\n        }\n\n        return transport;\n      }\n    }\n\n    // This relies on Java/OS behavior around PATH resolution, absolute/relative paths, etc.\n    var command = new ArrayList<String>();\n    command.add(spec.executable());\n    if (spec.arguments() != null) {\n      command.addAll(spec.arguments());\n    }\n\n    var builder = new ProcessBuilder(command);\n    builder.redirectError(Redirect.INHERIT); // inherit stderr from this pkl process\n    try {\n      process = builder.start();\n    } catch (IOException e) {\n      throw new ExternalReaderProcessException(e);\n    }\n    transport =\n        MessageTransports.stream(\n            new ExternalReaderMessagePackDecoder(process.getInputStream()),\n            new ExternalReaderMessagePackEncoder(process.getOutputStream()),\n            this::log);\n\n    var rxThread = new Thread(this::runTransport, \"ExternalReaderProcessImpl rxThread for \" + spec);\n    rxThread.setDaemon(true);\n    rxThread.start();\n\n    return transport;\n  }\n\n  /**\n   * Runs the underlying message transport so it can receive responses from the child process.\n   *\n   * <p>Blocks until the underlying transport is closed.\n   */\n  private void runTransport() {\n    try {\n      transport.start(\n          (msg) -> {\n            throw new ProtocolException(\"Unexpected incoming one-way message: \" + msg);\n          },\n          (msg) -> {\n            throw new ProtocolException(\"Unexpected incoming request message: \" + msg);\n          });\n    } catch (ProtocolException | IOException e) {\n      throw new RuntimeException(e);\n    }\n  }\n\n  @Override\n  public void close() {\n    synchronized (lock) {\n      if (closed) return;\n      closed = true;\n\n      try {\n        if (transport != null && process != null && process.isAlive()) {\n          transport.send(new CloseExternalProcess());\n          process.waitFor(CLOSE_TIMEOUT.toMillis(), TimeUnit.MILLISECONDS);\n        }\n      } catch (Exception ignored) {\n      } finally {\n        if (process != null) {\n          // no-op unless process is alive\n          process.destroyForcibly();\n        }\n        if (transport != null) {\n          transport.close();\n        }\n      }\n    }\n  }\n\n  @Override\n  public ModuleReaderSpec getModuleReaderSpec(String uriScheme) throws IOException {\n    return MessageTransports.resolveFuture(\n        initializeModuleReaderResponses.computeIfAbsent(\n            uriScheme,\n            (scheme) -> {\n              var future = new CompletableFuture<@Nullable ModuleReaderSpec>();\n              var request =\n                  new InitializeModuleReaderRequest(requestIdGenerator.nextLong(), scheme);\n              try {\n                getTransport()\n                    .send(\n                        request,\n                        (response) -> {\n                          if (response instanceof InitializeModuleReaderResponse resp) {\n                            var spec =\n                                resp.spec() == null\n                                    ? null\n                                    : new ModuleReaderSpec(\n                                        resp.spec().scheme(),\n                                        resp.spec().hasHierarchicalUris(),\n                                        resp.spec().isLocal(),\n                                        resp.spec().isGlobbable());\n                            future.complete(spec);\n                          } else {\n                            future.completeExceptionally(\n                                new ProtocolException(\"unexpected response\"));\n                          }\n                        });\n              } catch (ProtocolException | IOException | ExternalReaderProcessException e) {\n                future.completeExceptionally(e);\n              }\n              return future;\n            }));\n  }\n\n  @Override\n  public ResourceReaderSpec getResourceReaderSpec(String uriScheme) throws IOException {\n    return MessageTransports.resolveFuture(\n        initializeResourceReaderResponses.computeIfAbsent(\n            uriScheme,\n            (scheme) -> {\n              var future = new CompletableFuture<@Nullable ResourceReaderSpec>();\n              var request =\n                  new InitializeResourceReaderRequest(requestIdGenerator.nextLong(), scheme);\n              try {\n                getTransport()\n                    .send(\n                        request,\n                        (response) -> {\n                          log(response.toString());\n                          if (response instanceof InitializeResourceReaderResponse resp) {\n                            var spec =\n                                resp.spec() == null\n                                    ? null\n                                    : new ResourceReaderSpec(\n                                        resp.spec().scheme(),\n                                        resp.spec().hasHierarchicalUris(),\n                                        resp.spec().isGlobbable());\n                            future.complete(spec);\n                          } else {\n                            future.completeExceptionally(\n                                new ProtocolException(\"unexpected response\"));\n                          }\n                        });\n              } catch (ProtocolException | IOException | ExternalReaderProcessException e) {\n                future.completeExceptionally(e);\n              }\n              return future;\n            }));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalResourceResolver.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.List;\nimport java.util.Optional;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.messaging.MessageTransport;\nimport org.pkl.core.module.PathElement;\n\npublic interface ExternalResourceResolver {\n  static ExternalResourceResolver of(MessageTransport transport, long evaluatorId) {\n    return new ExternalResourceResolverImpl(transport, evaluatorId);\n  }\n\n  Optional<Object> read(URI uri) throws IOException;\n\n  boolean hasElement(SecurityManager securityManager, URI elementUri)\n      throws SecurityManagerException;\n\n  List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n      throws IOException, SecurityManagerException;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ExternalResourceResolverImpl.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.Random;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.Future;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.messaging.MessageTransport;\nimport org.pkl.core.messaging.MessageTransports;\nimport org.pkl.core.messaging.Messages.*;\nimport org.pkl.core.messaging.ProtocolException;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.resource.Resource;\n\nfinal class ExternalResourceResolverImpl implements ExternalResourceResolver {\n  private final MessageTransport transport;\n  private final long evaluatorId;\n  private final Map<URI, Future<byte[]>> readResponses = new ConcurrentHashMap<>();\n  private final Map<URI, Future<List<PathElement>>> listResponses = new ConcurrentHashMap<>();\n  private final Random requestIdGenerator = new Random();\n\n  ExternalResourceResolverImpl(MessageTransport transport, long evaluatorId) {\n    this.transport = transport;\n    this.evaluatorId = evaluatorId;\n  }\n\n  public Optional<Object> read(URI uri) throws IOException {\n    var result = doRead(uri);\n    return Optional.of(new Resource(uri, result));\n  }\n\n  public boolean hasElement(SecurityManager securityManager, URI elementUri)\n      throws SecurityManagerException {\n    securityManager.checkResolveResource(elementUri);\n    try {\n      doRead(elementUri);\n      return true;\n    } catch (IOException e) {\n      return false;\n    }\n  }\n\n  public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n      throws IOException, SecurityManagerException {\n    securityManager.checkResolveResource(baseUri);\n    return doListElements(baseUri);\n  }\n\n  public List<PathElement> doListElements(URI baseUri) throws IOException {\n    return MessageTransports.resolveFuture(\n        listResponses.computeIfAbsent(\n            baseUri,\n            (uri) -> {\n              var future = new CompletableFuture<List<PathElement>>();\n              var request =\n                  new ListResourcesRequest(requestIdGenerator.nextLong(), evaluatorId, uri);\n              try {\n                transport.send(\n                    request,\n                    (response) -> {\n                      if (response instanceof ListResourcesResponse resp) {\n                        if (resp.error() != null) {\n                          future.completeExceptionally(new IOException(resp.error()));\n                        } else {\n                          future.complete(\n                              Objects.requireNonNullElseGet(resp.pathElements(), List::of));\n                        }\n                      } else {\n                        future.completeExceptionally(new ProtocolException(\"unexpected response\"));\n                      }\n                    });\n              } catch (ProtocolException | IOException e) {\n                future.completeExceptionally(e);\n              }\n              return future;\n            }));\n  }\n\n  public byte[] doRead(URI baseUri) throws IOException {\n    return MessageTransports.resolveFuture(\n        readResponses.computeIfAbsent(\n            baseUri,\n            (uri) -> {\n              var future = new CompletableFuture<byte[]>();\n              var request =\n                  new ReadResourceRequest(requestIdGenerator.nextLong(), evaluatorId, uri);\n              try {\n                transport.send(\n                    request,\n                    (response) -> {\n                      if (response instanceof ReadResourceResponse resp) {\n                        if (resp.error() != null) {\n                          future.completeExceptionally(new IOException(resp.error()));\n                        } else if (resp.contents() != null) {\n                          future.complete(resp.contents());\n                        } else {\n                          future.complete(new byte[0]);\n                        }\n                      } else {\n                        future.completeExceptionally(new ProtocolException(\"unexpected response\"));\n                      }\n                    });\n              } catch (ProtocolException | IOException e) {\n                future.completeExceptionally(e);\n              }\n              return future;\n            }));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ModuleReaderSpec.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\npublic record ModuleReaderSpec(\n    String scheme, boolean hasHierarchicalUris, boolean isLocal, boolean isGlobbable) {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/ResourceReaderSpec.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader;\n\npublic record ResourceReaderSpec(String scheme, boolean hasHierarchicalUris, boolean isGlobbable) {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/externalreader/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.externalreader;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/DummyHttpClient.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.net.http.HttpResponse.BodyHandler;\nimport javax.annotation.concurrent.ThreadSafe;\n\n/** An {@code HttpClient} implementation that throws {@code AssertionError} on every send. */\n@ThreadSafe\nfinal class DummyHttpClient implements HttpClient {\n  @Override\n  public <T> HttpResponse<T> send(HttpRequest request, BodyHandler<T> responseBodyHandler) {\n    throw new AssertionError(\"Dummy HTTP client cannot send request: \" + request);\n  }\n\n  @Override\n  public void close() {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/HttpClient.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.net.http.HttpTimeoutException;\nimport java.nio.file.Path;\nimport java.util.List;\nimport java.util.Map;\nimport javax.net.ssl.SSLContext;\nimport org.pkl.core.util.Nullable;\n\n/**\n * An HTTP client.\n *\n * <p>To create a new HTTP client, use a {@linkplain #builder() builder}. To send {@linkplain\n * HttpRequest requests} and retrieve their {@linkplain HttpResponse responses}, use {@link #send}.\n * To release resources held by the client, use {@link #close}.\n *\n * <p>HTTP clients are thread-safe. Each client maintains its own connection pool and {@link\n * SSLContext}. For efficiency reasons, clients should be reused whenever possible.\n */\npublic interface HttpClient extends AutoCloseable {\n\n  /** A builder of {@linkplain HttpClient HTTP clients}. */\n  @SuppressWarnings(\"unused\")\n  interface Builder {\n    /**\n     * Sets the {@code User-Agent} header.\n     *\n     * <p>Defaults to {@code \"Pkl/$version ($os; $flavor)\"}.\n     */\n    Builder setUserAgent(String userAgent);\n\n    /**\n     * Sets the timeout for connecting to a server.\n     *\n     * <p>Defaults to 60 seconds.\n     */\n    Builder setConnectTimeout(java.time.Duration timeout);\n\n    /**\n     * Sets the timeout for the interval between sending a request and receiving response headers.\n     *\n     * <p>Defaults to 60 seconds. To set a timeout for a specific request, use {@link\n     * HttpRequest.Builder#timeout}.\n     */\n    Builder setRequestTimeout(java.time.Duration timeout);\n\n    /**\n     * Adds a CA certificate file to the client's trust store.\n     *\n     * <p>The given file must contain <a href=\"https://en.wikipedia.org/wiki/X.509\">X.509</a>\n     * certificates in PEM format.\n     *\n     * <p>If no CA certificates are added via this method nor {@link #addCertificates(byte[])}, the\n     * built-in CA certificates of the Pkl native executable or JVM are used.\n     */\n    Builder addCertificates(Path path);\n\n    /**\n     * Adds CA certificate bytes to the client's trust store.\n     *\n     * <p>The given cert must be an <a href=\"https://en.wikipedia.org/wiki/X.509\">X.509</a>\n     * certificate in PEM format.\n     *\n     * <p>If no CA certificates are added via this method nor {@link #addCertificates(Path)}, the\n     * built-in CA certificates of the Pkl native executable or JVM are used.\n     */\n    Builder addCertificates(byte[] certificateBytes);\n\n    /**\n     * Sets a test server's listening port.\n     *\n     * <p>If set, requests that specify port 0 will be modified to use the given port. This is an\n     * internal test option.\n     */\n    Builder setTestPort(int port);\n\n    /**\n     * Sets the proxy selector to use when establishing connections.\n     *\n     * <p>Defaults to: {@link java.net.ProxySelector#getDefault()}.\n     */\n    Builder setProxySelector(java.net.ProxySelector proxySelector);\n\n    /**\n     * Configures HTTP connections to connect to the provided proxy address.\n     *\n     * <p>The provided {@code proxyAddress} must have scheme http, not contain userInfo, and not\n     * have a path segment.\n     *\n     * <p>If {@code proxyAddress} is {@code null}, uses the proxy address provided by {@link\n     * java.net.ProxySelector#getDefault()}.\n     *\n     * <p>NOTE: Due to a <a href=\"https://bugs.openjdk.org/browse/JDK-8256409\">limitation in the\n     * JDK</a>, this does not configure the proxy server used for certificate revocation checking.\n     * To configure the certificate revocation checker, the result of {@link\n     * java.net.ProxySelector#getDefault} needs to be changed either by setting system properties,\n     * or via {@link java.net.ProxySelector#setDefault}.\n     *\n     * @throws IllegalArgumentException if `proxyAddress` is invalid.\n     */\n    Builder setProxy(@Nullable URI proxyAddress, List<String> noProxy);\n\n    /**\n     * Removes any existing rewrites, then adds the given rewrites.\n     *\n     * <p>A rewrite changes outbound HTTP URLs by replacing a source prefix with a targert prefix.\n     *\n     * <p>Each rewrite URI must start with {@code http://} or {@code https://}, and end with {@code\n     * /}.\n     *\n     * <p>Each key describes the prefix of a request, and each value describes the replacement\n     * prefix.\n     *\n     * <p>This can be useful for setting up mirroring of packages, which are fetched over HTTPS.\n     *\n     * <p>In the case of multiple matches, the longest prefix is used.\n     *\n     * <p>The URL hostname is case-insensitive.\n     *\n     * @throws IllegalArgumentException if {@code rewrites} is invalid.\n     * @since 0.29.0\n     */\n    Builder setRewrites(Map<URI, URI> rewrites);\n\n    /**\n     * Adds a rewrite rule.\n     *\n     * @see Builder#setRewrites(Map)\n     * @throws IllegalArgumentException if {@code sourcePrefix} or {@code targetPrefix} is invalid.\n     * @since 0.29.0\n     */\n    Builder addRewrite(URI sourcePrefix, URI targetPrefix);\n\n    /**\n     * Creates a new {@code HttpClient} from the current state of this builder.\n     *\n     * @throws HttpClientInitException if an error occurs while initializing the client\n     */\n    HttpClient build();\n\n    /**\n     * Returns an {@code HTTPClient} wrapper that defers building the actual HTTP client until the\n     * wrapper's {@link HttpClient#send} method is called.\n     *\n     * <p>Note: When using this method, any exception thrown when building the actual HTTP client is\n     * equally deferred.\n     */\n    HttpClient buildLazily();\n  }\n\n  /**\n   * Creates a new {@code HTTPClient} builder with default settings.\n   *\n   * <p>The default settings are:\n   *\n   * <ul>\n   *   <li>Connect timeout: 60 seconds\n   *   <li>Request timeout: 60 seconds\n   *   <li>CA certificates: none (falls back to the JVM's {@linkplain SSLContext#getDefault()\n   *       default SSL context})\n   * </ul>\n   */\n  static Builder builder() {\n    return new HttpClientBuilder();\n  }\n\n  /** Returns a client that throws {@link AssertionError} on every attempt to send a request. */\n  static HttpClient dummyClient() {\n    return new DummyHttpClient();\n  }\n\n  /**\n   * Sends an HTTP request. The response body is processed by the given body handler.\n   *\n   * <p>If the request does not specify a {@linkplain HttpRequest#timeout timeout}, the client's\n   * {@linkplain Builder#setRequestTimeout request timeout} is used. If the request does not specify\n   * a preferred {@linkplain HttpRequest#version() HTTP version}, HTTP/2 is used. The request's\n   * {@code User-Agent} header is set to the client's {@link Builder#setUserAgent User-Agent}\n   * header.\n   *\n   * <p>Depending on the given body handler, this method blocks until response headers or the entire\n   * response body has been received. If response headers are not received within the request\n   * timeout, {@link HttpTimeoutException} is thrown.\n   *\n   * <p>For additional information on how to use this method, see {@link\n   * java.net.http.HttpClient#send}.\n   *\n   * @throws IOException if an I/O error occurs when sending or receiving\n   * @throws HttpClientInitException if an error occurs while initializing a {@linkplain\n   *     Builder#buildLazily lazy} client\n   */\n  <T> HttpResponse<T> send(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)\n      throws IOException;\n\n  /**\n   * Closes this client.\n   *\n   * <p>This method makes a best effort to release the resources held by this client in a timely\n   * manner. This may involve waiting for pending requests to complete.\n   *\n   * <p>Subsequent calls to this method have no effect. Subsequent calls to any other method throw\n   * {@link IllegalStateException}.\n   */\n  void close();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/HttpClientBuilder.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport static org.pkl.core.util.IoUtils.validateRewriteRule;\n\nimport java.net.ProxySelector;\nimport java.net.URI;\nimport java.nio.ByteBuffer;\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Supplier;\nimport org.pkl.core.Release;\nimport org.pkl.core.http.HttpClient.Builder;\n\nfinal class HttpClientBuilder implements HttpClient.Builder {\n  private String userAgent;\n  private Duration connectTimeout = Duration.ofSeconds(60);\n  private Duration requestTimeout = Duration.ofSeconds(60);\n  private final List<Path> certificateFiles = new ArrayList<>();\n  private final List<ByteBuffer> certificateBytes = new ArrayList<>();\n  private int testPort = -1;\n  private ProxySelector proxySelector;\n  private Map<URI, URI> rewrites = new HashMap<>();\n\n  HttpClientBuilder() {\n    var release = Release.current();\n    this.userAgent =\n        \"Pkl/\" + release.version() + \" (\" + release.os() + \"; \" + release.flavor() + \")\";\n  }\n\n  public HttpClient.Builder setUserAgent(String userAgent) {\n    this.userAgent = userAgent;\n    return this;\n  }\n\n  @Override\n  public HttpClient.Builder setConnectTimeout(Duration timeout) {\n    this.connectTimeout = timeout;\n    return this;\n  }\n\n  @Override\n  public HttpClient.Builder setRequestTimeout(Duration timeout) {\n    this.requestTimeout = timeout;\n    return this;\n  }\n\n  @Override\n  public HttpClient.Builder addCertificates(Path path) {\n    certificateFiles.add(path);\n    return this;\n  }\n\n  @Override\n  public Builder addCertificates(byte[] certificateBytes) {\n    this.certificateBytes.add(ByteBuffer.wrap(certificateBytes));\n    return this;\n  }\n\n  @Override\n  public HttpClient.Builder setTestPort(int port) {\n    testPort = port;\n    return this;\n  }\n\n  public HttpClient.Builder setProxySelector(ProxySelector proxySelector) {\n    this.proxySelector = proxySelector;\n    return this;\n  }\n\n  @Override\n  public Builder setProxy(URI proxyAddress, List<String> noProxy) {\n    this.proxySelector = new org.pkl.core.http.ProxySelector(proxyAddress, noProxy);\n    return this;\n  }\n\n  @Override\n  public Builder setRewrites(Map<URI, URI> rewrites) {\n    for (var entry : rewrites.entrySet()) {\n      validateRewriteRule(entry.getKey());\n      validateRewriteRule(entry.getValue());\n    }\n    this.rewrites = new HashMap<>(rewrites);\n    return this;\n  }\n\n  @Override\n  public Builder addRewrite(URI sourcePrefix, URI targetPrefix) {\n    validateRewriteRule(sourcePrefix);\n    validateRewriteRule(targetPrefix);\n    this.rewrites.put(sourcePrefix, targetPrefix);\n    return this;\n  }\n\n  @Override\n  public HttpClient build() {\n    return doBuild().get();\n  }\n\n  @Override\n  public HttpClient buildLazily() {\n    return new LazyHttpClient(doBuild());\n  }\n\n  private Supplier<HttpClient> doBuild() {\n    // make defensive copy because Supplier may get called after builder was mutated\n    var certificateFiles = List.copyOf(this.certificateFiles);\n    var proxySelector =\n        this.proxySelector != null ? this.proxySelector : java.net.ProxySelector.getDefault();\n    return () -> {\n      var jdkClient =\n          new JdkHttpClient(certificateFiles, certificateBytes, connectTimeout, proxySelector);\n      return new RequestRewritingClient(userAgent, requestTimeout, testPort, jdkClient, rewrites);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/HttpClientInitException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\n/**\n * Indicates that an error occurred while initializing an HTTP client. A common example is an error\n * reading or parsing a certificate.\n */\npublic final class HttpClientInitException extends RuntimeException {\n  public HttpClientInitException(String message) {\n    super(message);\n  }\n\n  public HttpClientInitException(Throwable cause) {\n    super(cause);\n  }\n\n  public HttpClientInitException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/JdkHttpClient.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.lang.invoke.MethodHandle;\nimport java.lang.invoke.MethodHandles;\nimport java.lang.invoke.MethodType;\nimport java.net.ConnectException;\nimport java.net.http.HttpClient.Redirect;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.net.http.HttpResponse.BodyHandler;\nimport java.nio.ByteBuffer;\nimport java.nio.file.Files;\nimport java.nio.file.NoSuchFileException;\nimport java.nio.file.Path;\nimport java.security.GeneralSecurityException;\nimport java.security.KeyStore;\nimport java.security.SecureRandom;\nimport java.security.cert.Certificate;\nimport java.security.cert.CertificateException;\nimport java.security.cert.CertificateFactory;\nimport java.security.cert.X509Certificate;\nimport java.time.Duration;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport javax.annotation.concurrent.ThreadSafe;\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.SSLException;\nimport javax.net.ssl.SSLHandshakeException;\nimport javax.net.ssl.TrustManagerFactory;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Exceptions;\n\n/** An {@code HttpClient} implementation backed by {@link java.net.http.HttpClient}. */\n@ThreadSafe\nfinal class JdkHttpClient implements HttpClient {\n  // non-private for testing\n  final java.net.http.HttpClient underlying;\n\n  // call java.net.http.HttpClient.close() if available (JDK 21+)\n  private static final MethodHandle closeMethod;\n\n  static {\n    var methodType = MethodType.methodType(void.class, java.net.http.HttpClient.class);\n    MethodHandle result;\n    try {\n      //noinspection JavaLangInvokeHandleSignature\n      result =\n          MethodHandles.publicLookup()\n              .findVirtual(java.net.http.HttpClient.class, \"close\", methodType);\n    } catch (NoSuchMethodException | IllegalAccessException e) {\n      // use no-op close method\n      result = MethodHandles.empty(methodType);\n    }\n    closeMethod = result;\n  }\n\n  JdkHttpClient(\n      List<Path> certificateFiles,\n      List<ByteBuffer> certificateBytes,\n      Duration connectTimeout,\n      java.net.ProxySelector proxySelector) {\n    underlying =\n        java.net.http.HttpClient.newBuilder()\n            .sslContext(createSslContext(certificateFiles, certificateBytes))\n            .connectTimeout(connectTimeout)\n            .proxy(proxySelector)\n            .followRedirects(Redirect.NORMAL)\n            .build();\n  }\n\n  @Override\n  public <T> HttpResponse<T> send(HttpRequest request, BodyHandler<T> responseBodyHandler)\n      throws IOException {\n    try {\n      return underlying.send(request, responseBodyHandler);\n    } catch (ConnectException e) {\n      // original exception has no message\n      throw new ConnectException(\n          ErrorMessages.create(\"errorConnectingToHost\", request.uri().getHost()));\n    } catch (SSLHandshakeException e) {\n      throw new SSLHandshakeException(\n          ErrorMessages.create(\n              \"errorSslHandshake\", request.uri().getHost(), Exceptions.getRootReason(e)));\n    } catch (SSLException e) {\n      throw new SSLException(Exceptions.getRootReason(e));\n    } catch (InterruptedException e) {\n      // next best thing after letting (checked) InterruptedException bubble up\n      Thread.currentThread().interrupt();\n      throw new IOException(e);\n    }\n  }\n\n  @Override\n  public void close() {\n    try {\n      closeMethod.invoke(underlying);\n    } catch (RuntimeException | Error e) {\n      throw e;\n    } catch (Throwable t) {\n      throw new AssertionError(t);\n    }\n  }\n\n  // https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#security-algorithm-implementation-requirements\n  private static SSLContext createSslContext(\n      List<Path> certificateFiles, List<ByteBuffer> certificateBytes) {\n    try {\n      if (certificateFiles.isEmpty() && certificateBytes.isEmpty()) {\n        // use JVM's built-in CA certificates\n        return SSLContext.getDefault();\n      }\n\n      var certFactory = CertificateFactory.getInstance(\"X.509\");\n      List<Certificate> certs = gatherCertificates(certFactory, certificateFiles, certificateBytes);\n      var keystore = KeyStore.getInstance(KeyStore.getDefaultType());\n      keystore.load(null);\n      for (var i = 0; i < certs.size(); i++) {\n        keystore.setCertificateEntry(\"Certificate\" + i, certs.get(i));\n      }\n      var trustManagerFactory = TrustManagerFactory.getInstance(\"PKIX\");\n      trustManagerFactory.init(keystore);\n\n      var sslContext = SSLContext.getInstance(\"TLS\");\n      sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());\n\n      return sslContext;\n    } catch (GeneralSecurityException | IOException e) {\n      throw new HttpClientInitException(\n          ErrorMessages.create(\"cannotInitHttpClient\", Exceptions.getRootReason(e)), e);\n    }\n  }\n\n  private static List<Certificate> gatherCertificates(\n      CertificateFactory factory, List<Path> certificateFiles, List<ByteBuffer> certificateBytes) {\n    var certificates = new ArrayList<Certificate>();\n    for (var file : certificateFiles) {\n      try (var stream = Files.newInputStream(file)) {\n        collectCertificates(certificates, factory, stream, file);\n      } catch (NoSuchFileException e) {\n        throw new HttpClientInitException(ErrorMessages.create(\"cannotFindCertFile\", file));\n      } catch (IOException e) {\n        throw new HttpClientInitException(\n            ErrorMessages.create(\"cannotReadCertFile\", Exceptions.getRootReason(e)));\n      }\n    }\n    for (var byteBuffer : certificateBytes) {\n      var stream = new ByteArrayInputStream(byteBuffer.array());\n      collectCertificates(certificates, factory, stream, \"<unavailable>\");\n    }\n    return certificates;\n  }\n\n  private static void collectCertificates(\n      ArrayList<Certificate> anchors,\n      CertificateFactory factory,\n      InputStream stream,\n      Object source) {\n    Collection<X509Certificate> certificates;\n    try {\n      //noinspection unchecked\n      certificates = (Collection<X509Certificate>) factory.generateCertificates(stream);\n    } catch (CertificateException e) {\n      throw new HttpClientInitException(\n          ErrorMessages.create(\"cannotParseCertFile\", source, Exceptions.getRootReason(e)));\n    }\n    if (certificates.isEmpty()) {\n      throw new HttpClientInitException(ErrorMessages.create(\"emptyCertFile\", source));\n    }\n    anchors.addAll(certificates);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/LazyHttpClient.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport java.io.IOException;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.net.http.HttpResponse.BodyHandler;\nimport java.util.Optional;\nimport java.util.function.Supplier;\nimport javax.annotation.concurrent.GuardedBy;\nimport javax.annotation.concurrent.ThreadSafe;\n\n/**\n * An {@code HttpClient} decorator that defers creating the underlying HTTP client until the first\n * send.\n */\n@ThreadSafe\nfinal class LazyHttpClient implements HttpClient {\n  private final Supplier<HttpClient> supplier;\n  private final Object lock = new Object();\n\n  @GuardedBy(\"lock\")\n  private HttpClient client;\n\n  @GuardedBy(\"lock\")\n  private RuntimeException exception;\n\n  LazyHttpClient(Supplier<HttpClient> supplier) {\n    this.supplier = supplier;\n  }\n\n  @Override\n  public <T> HttpResponse<T> send(HttpRequest request, BodyHandler<T> responseBodyHandler)\n      throws IOException {\n    return getOrCreateClient().send(request, responseBodyHandler);\n  }\n\n  @Override\n  public void close() {\n    getClient().ifPresent(HttpClient::close);\n  }\n\n  private HttpClient getOrCreateClient() {\n    synchronized (lock) {\n      // only try to create client once\n      if (exception != null) {\n        throw exception;\n      }\n\n      if (client == null) {\n        try {\n          client = supplier.get();\n        } catch (RuntimeException t) {\n          exception = t;\n          throw t;\n        }\n      }\n      return client;\n    }\n  }\n\n  private Optional<HttpClient> getClient() {\n    synchronized (lock) {\n      return Optional.ofNullable(client);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/NoProxyRule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport java.math.BigInteger;\nimport java.net.Inet4Address;\nimport java.net.Inet6Address;\nimport java.net.URI;\nimport java.net.UnknownHostException;\nimport java.nio.ByteBuffer;\nimport java.util.regex.Pattern;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Represents a noproxy entry.\n *\n * <p>Follows the rules described in <a\n * href=\"https://about.gitlab.com/blog/2021/01/27/we-need-to-talk-no-proxy/#standardizing-no_proxy\">Standardizing\n * {@code no_proxy}</a>\n */\nfinal class NoProxyRule {\n  private static final String portString = \"(?::(?<port>\\\\d{1,5}))?\";\n  private static final String cidrString = \"(?:/(?<cidr>\\\\d{1,3}))?\";\n  private static final String ipv4AddressString =\n      \"(?<host>[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3})\";\n  private static final Pattern ipv4Address = Pattern.compile(\"^\" + ipv4AddressString + \"$\");\n  private static final Pattern ipv4AddressOrCidr =\n      Pattern.compile(\"^\" + ipv4AddressString + cidrString + portString + \"$\");\n  private static final String ipv6AddressString =\n      \"(?<host>(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(?::[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(?:ffff(:0{1,4})?:)?(?:(?:25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\\\.){3}(?:25[0-5]|(?:2[0-4]|1?[0-9])?[0-9])|(?:[0-9a-fA-F]{1,4}:){1,4}:(?:(?:25[0-5]|(?:2[0-4]|1?[0-9])?[0-9])\\\\.){3}(?:25[0-5]|(?:2[0-4]|1?[0-9])?[0-9]))\";\n  private static final Pattern ipv6AddressOrCidr =\n      Pattern.compile(\n          \"^(?<open>\\\\[)?\" + ipv6AddressString + cidrString + \"(?<close>])?\" + portString + \"$\");\n  private static final Pattern hostnamePattern =\n      Pattern.compile(\"^\\\\.?(?<host>[^:]+)\" + portString + \"$\");\n\n  private @Nullable Integer ipv4 = null;\n  private @Nullable Integer ipv4Mask = null;\n  private @Nullable BigInteger ipv6 = null;\n  private @Nullable BigInteger ipv6Mask = null;\n  private @Nullable String hostname = null;\n  private int port = 0;\n  private boolean allNoProxy = false;\n\n  public NoProxyRule(String repr) {\n    if (repr.equals(\"*\")) {\n      allNoProxy = true;\n      return;\n    }\n    var ipv4Matcher = ipv4AddressOrCidr.matcher(repr);\n    if (ipv4Matcher.matches()) {\n      var ipAddress = ipv4Matcher.group(\"host\");\n      ipv4 = parseIpv4(ipAddress);\n      if (ipv4Matcher.group(\"cidr\") != null) {\n        var prefixLength = Integer.parseInt(ipv4Matcher.group(\"cidr\"));\n        if (prefixLength > 32) {\n          // best-effort (don't fail on invalid cidrs).\n          hostname = repr;\n        }\n        ipv4Mask = 0xffffffff << (32 - prefixLength);\n      }\n      if (ipv4Matcher.group(\"port\") != null) {\n        port = Integer.parseInt(ipv4Matcher.group(\"port\"));\n      }\n      return;\n    }\n    var ipv6Matcher = ipv6AddressOrCidr.matcher(repr);\n    if (ipv6Matcher.matches()) {\n      var ipAddress = ipv6Matcher.group(\"host\");\n      ipv6 = parseIpv6(ipAddress);\n      if (ipv6Matcher.group(\"cidr\") != null) {\n        var maskBuffer = ByteBuffer.allocate(16).putLong(-1L).putLong(-1L);\n        var prefixLength = Integer.parseInt(ipv6Matcher.group(\"cidr\"));\n        if (prefixLength > 128) {\n          // best-effort (don't fail on invalid cidrs).\n          hostname = repr;\n          return;\n        }\n        ipv6Mask = new BigInteger(1, maskBuffer.array()).not().shiftRight(prefixLength);\n      }\n      if (ipv6Matcher.group(\"port\") != null) {\n        port = Integer.parseInt(ipv6Matcher.group(\"port\"));\n      }\n      return;\n    }\n    var hostnameMatcher = hostnamePattern.matcher(repr);\n    if (hostnameMatcher.matches()) {\n      hostname = hostnameMatcher.group(\"host\");\n      if (hostnameMatcher.group(\"port\") != null) {\n        port = Integer.parseInt(hostnameMatcher.group(\"port\"));\n      }\n      return;\n    }\n    throw new RuntimeException(\"Failed to parse hostname in no-proxy rule: \" + repr);\n  }\n\n  public boolean matches(URI uri) {\n    if (allNoProxy) {\n      return true;\n    }\n    if (!hostMatches(uri)) {\n      return false;\n    }\n    if (port == 0) {\n      return true;\n    }\n    var thatPort = uri.getPort();\n    if (thatPort == -1) {\n      thatPort =\n          switch (uri.getScheme()) {\n            case \"http\" -> 80;\n            case \"https\" -> 443;\n            default -> -1;\n          };\n    }\n    return port == thatPort;\n  }\n\n  /** Tells if the provided URI should not be proxied according to the rules described. */\n  public boolean hostMatches(URI uri) {\n    if (allNoProxy) {\n      return true;\n    }\n    var host = uri.getHost();\n    if (host == null) {\n      return false;\n    }\n    if (host.equalsIgnoreCase(hostname)) {\n      return true;\n    }\n    if (hostname != null && endsWithIgnoreCase(host, \".\" + hostname)) {\n      return true;\n    }\n    return ipV6Matches(uri.getHost()) || ipV4Matches(uri.getHost());\n  }\n\n  private boolean endsWithIgnoreCase(String str, String suffix) {\n    var len = suffix.length();\n    return str.regionMatches(true, str.length() - len, suffix, 0, len);\n  }\n\n  private boolean ipV4Matches(String hostname) {\n    if (ipv4 == null) {\n      return false;\n    }\n    if (!ipv4Address.matcher(hostname).matches()) {\n      return false;\n    }\n    var address = parseIpv4(hostname);\n    if (ipv4.equals(address)) {\n      return true;\n    }\n    if (ipv4Mask != null) {\n      return (ipv4 & ipv4Mask) == (address & ipv4Mask);\n    }\n    return false;\n  }\n\n  private boolean ipV6Matches(String hostname) {\n    if (ipv6 == null) {\n      return false;\n    }\n    if (!hostname.startsWith(\"[\") && !hostname.endsWith(\"]\")) {\n      return false;\n    }\n    var ipv6Repr = hostname.substring(1, hostname.length() - 1);\n    // According to RFC3986, square brackets can _only_ surround IPV6 addresses, so it should be\n    // safe to straight up parse it.\n    // <https://www.ietf.org/rfc/rfc3986.txt>\n    var address = parseIpv6(ipv6Repr);\n    if (ipv6.equals(address)) {\n      return true;\n    }\n    if (ipv6Mask != null) {\n      return ipv6.and(ipv6Mask).equals(address.and(ipv6Mask));\n    }\n    return false;\n  }\n\n  private BigInteger parseIpv6(String repr) {\n    try {\n      var inet = Inet6Address.getByName(repr);\n      var byteArr = inet.getAddress();\n      return new BigInteger(1, byteArr);\n    } catch (UnknownHostException e) {\n      // should never happen; `repr` is an IPV6 literal.\n      throw new RuntimeException(\n          \"Received unexpected UnknownHostException during parsing IPV6 literal\", e);\n    }\n  }\n\n  private int parseIpv4(String repr) {\n    try {\n      var inet = Inet4Address.getByName(repr);\n      return ByteBuffer.wrap(inet.getAddress()).getInt();\n    } catch (UnknownHostException e) {\n      // should never happen; `repr` is an IPV4 literal.\n      throw new RuntimeException(\n          \"Received unexpected UnknownHostException during parsing IPV4 literal\", e);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/ProxySelector.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport com.oracle.truffle.api.nodes.ExplodeLoop;\nimport java.io.IOException;\nimport java.net.InetSocketAddress;\nimport java.net.Proxy;\nimport java.net.SocketAddress;\nimport java.net.URI;\nimport java.util.List;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\nfinal class ProxySelector extends java.net.ProxySelector {\n\n  public static final List<Proxy> NO_PROXY = List.of(Proxy.NO_PROXY);\n\n  private final @Nullable List<Proxy> myProxy;\n  private final List<NoProxyRule> noProxyRules;\n  private final @Nullable java.net.ProxySelector delegate;\n\n  ProxySelector(@Nullable URI proxyAddress, List<String> noProxyRules) {\n    this.noProxyRules = noProxyRules.stream().map(NoProxyRule::new).toList();\n    if (proxyAddress == null) {\n      this.delegate = java.net.ProxySelector.getDefault();\n      this.myProxy = null;\n    } else {\n      if (!proxyAddress.getScheme().equalsIgnoreCase(\"http\")\n          || proxyAddress.getHost() == null\n          || !proxyAddress.getPath().isEmpty()\n          || proxyAddress.getUserInfo() != null) {\n        throw new IllegalArgumentException(\n            ErrorMessages.create(\"malformedProxyAddress\", proxyAddress));\n      }\n      this.delegate = null;\n      var port = proxyAddress.getPort();\n      if (port == -1) {\n        port = 80;\n      }\n      this.myProxy =\n          List.of(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress.getHost(), port)));\n    }\n  }\n\n  @Override\n  @ExplodeLoop\n  public List<Proxy> select(URI uri) {\n    for (var proxyRule : noProxyRules) {\n      if (proxyRule.matches(uri)) {\n        return NO_PROXY;\n      }\n    }\n    if (delegate != null) {\n      return delegate.select(uri);\n    }\n    assert myProxy != null;\n    return myProxy;\n  }\n\n  @Override\n  public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {\n    /* ignore */\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/RequestRewritingClient.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.net.http.HttpResponse.BodyHandler;\nimport java.time.Duration;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Objects;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport javax.annotation.concurrent.ThreadSafe;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.util.HttpUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * An {@code HttpClient} decorator that\n *\n * <ul>\n *   <li>overrides the {@code User-Agent} header of {@code HttpRequest}s\n *   <li>sets a request timeout if none is present\n *   <li>ensures that {@link #close()} is idempotent.\n *   <li>rewrites outbound URI prefixes with another prefix.\n * </ul>\n *\n * <p>Both {@code User-Agent} header and default request timeout are configurable through {@link\n * HttpClient.Builder}.\n */\n@ThreadSafe\nfinal class RequestRewritingClient implements HttpClient {\n  // non-private for testing\n  final String userAgent;\n  final Duration requestTimeout;\n  final int testPort;\n  final HttpClient delegate;\n  private final List<Entry<URI, URI>> rewrites;\n\n  private final AtomicBoolean closed = new AtomicBoolean();\n\n  RequestRewritingClient(\n      String userAgent,\n      Duration requestTimeout,\n      int testPort,\n      HttpClient delegate,\n      Map<URI, URI> rewrites) {\n    this.userAgent = userAgent;\n    this.requestTimeout = requestTimeout;\n    this.testPort = testPort;\n    this.delegate = delegate;\n    this.rewrites =\n        rewrites.entrySet().stream()\n            .map((it) -> Map.entry(normalizeRewrite(it.getKey()), normalizeRewrite(it.getValue())))\n            .sorted(Comparator.comparingInt((it) -> -it.getKey().toString().length()))\n            .toList();\n  }\n\n  @Override\n  public <T> HttpResponse<T> send(HttpRequest request, BodyHandler<T> responseBodyHandler)\n      throws IOException {\n    checkNotClosed(request);\n    try {\n      return delegate.send(rewriteRequest(request), responseBodyHandler);\n    } catch (IOException e) {\n      var rewrittenUri = rewriteUri(request.uri());\n      if (rewrittenUri != request.uri()) {\n        throw new IOException(\n            e.getMessage()\n                + \" (request was rewritten: %s -> %s)\".formatted(request.uri(), rewrittenUri),\n            e);\n      }\n      throw e;\n    }\n  }\n\n  @Override\n  public void close() {\n    if (!closed.getAndSet(true)) delegate.close();\n  }\n\n  // Based on JDK 17's implementation of HttpRequest.newBuilder(HttpRequest, filter).\n  private HttpRequest rewriteRequest(HttpRequest original) {\n    HttpRequest.Builder builder = HttpRequest.newBuilder();\n\n    builder\n        .uri(rewriteUri(original.uri()))\n        .expectContinue(original.expectContinue())\n        .timeout(original.timeout().orElse(requestTimeout))\n        .version(original.version().orElse(java.net.http.HttpClient.Version.HTTP_2));\n\n    original\n        .headers()\n        .map()\n        .forEach((name, values) -> values.forEach(value -> builder.header(name, value)));\n    builder.setHeader(\"User-Agent\", userAgent);\n\n    var method = original.method();\n    original\n        .bodyPublisher()\n        .ifPresentOrElse(\n            publisher -> builder.method(method, publisher),\n            () -> {\n              switch (method) {\n                case \"GET\" -> builder.GET();\n                case \"DELETE\" -> builder.DELETE();\n                default -> builder.method(method, HttpRequest.BodyPublishers.noBody());\n              }\n            });\n\n    return builder.build();\n  }\n\n  private static boolean notEqualCaseInsensitive(@Nullable String a, @Nullable String b) {\n    if (a == null || b == null) {\n      return !Objects.equals(a, b);\n    }\n    return !a.equalsIgnoreCase(b);\n  }\n\n  // Our docs say to not include query string or fragment in a rewrite rule, but technically they\n  // are supported.\n  public static boolean matchesRewriteRule(URI uri, URI rule) {\n    if (notEqualCaseInsensitive(uri.getScheme(), rule.getScheme())) {\n      return false;\n    }\n\n    if (!Objects.equals(uri.getUserInfo(), rule.getUserInfo())) {\n      return false;\n    }\n\n    if (notEqualCaseInsensitive(uri.getHost(), rule.getHost())) {\n      return false;\n    }\n\n    if (!Objects.equals(uri.getPath(), rule.getPath())) {\n      if (uri.getPath() != null\n          && rule.getPath() != null\n          && rule.getQuery() == null\n          && rule.getFragment() == null) {\n        return uri.getPath().startsWith(rule.getPath());\n      }\n      return false;\n    }\n\n    if (!Objects.equals(uri.getQuery(), rule.getQuery())) {\n      if (uri.getQuery() != null && rule.getQuery() != null && rule.getFragment() == null) {\n        return uri.getQuery().startsWith(rule.getQuery());\n      }\n      return false;\n    }\n\n    if (uri.getFragment() != null && rule.getFragment() != null) {\n      return uri.getFragment().startsWith(rule.getFragment());\n    }\n\n    return Objects.equals(uri.getFragment(), rule.getFragment());\n  }\n\n  private @Nullable Entry<URI, URI> findRewrite(URI uri) {\n    for (var entry : rewrites) {\n      if (matchesRewriteRule(uri, entry.getKey())) {\n        return entry;\n      }\n    }\n    return null;\n  }\n\n  private URI normalizeRewrite(URI uri) {\n    try {\n      return new URI(\n          uri.getScheme().toLowerCase(),\n          uri.getUserInfo(),\n          uri.getHost().toLowerCase(),\n          uri.getPort(),\n          uri.getPath(),\n          uri.getQuery(),\n          uri.getFragment());\n    } catch (URISyntaxException e) {\n      // impossible condition, we started from a valid URI to begin with\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  private URI rewriteUri(URI uri) {\n    var rewrite = findRewrite(uri);\n    var ret = uri;\n    if (rewrite != null) {\n      var normalized = normalizeRewrite(uri);\n      var fromUri = rewrite.getKey();\n      var toUri = rewrite.getValue();\n      var relativePath = fromUri.relativize(normalized);\n      ret = toUri.resolve(relativePath);\n    }\n    if (testPort != -1 && ret.getPort() == 0) {\n      ret = HttpUtils.setPort(ret, testPort);\n    }\n    return ret;\n  }\n\n  private void checkNotClosed(HttpRequest request) {\n    if (closed.get()) {\n      throw new IllegalStateException(\n          \"Cannot send request \" + request + \" because this client has already been closed.\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/http/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.http;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/AbstractMessagePackDecoder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URISyntaxException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport org.msgpack.core.MessagePack;\nimport org.msgpack.core.MessageTypeException;\nimport org.msgpack.core.MessageUnpacker;\nimport org.msgpack.value.Value;\nimport org.msgpack.value.impl.ImmutableStringValueImpl;\nimport org.pkl.core.messaging.Message.Type;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class AbstractMessagePackDecoder implements MessageDecoder {\n\n  protected final MessageUnpacker unpacker;\n\n  public AbstractMessagePackDecoder(MessageUnpacker unpacker) {\n    this.unpacker = unpacker;\n  }\n\n  public AbstractMessagePackDecoder(InputStream stream) {\n    this(MessagePack.newDefaultUnpacker(stream));\n  }\n\n  protected abstract @Nullable Message decodeMessage(Type msgType, Map<Value, Value> map)\n      throws DecodeException, URISyntaxException;\n\n  @Override\n  public @Nullable Message decode() throws IOException, DecodeException {\n    if (!unpacker.hasNext()) {\n      return null;\n    }\n\n    int code;\n    try {\n      var arraySize = unpacker.unpackArrayHeader();\n      if (arraySize != 2) {\n        throw new DecodeException(ErrorMessages.create(\"malformedMessageHeaderLength\", arraySize));\n      }\n      code = unpacker.unpackInt();\n    } catch (MessageTypeException e) {\n      throw new DecodeException(ErrorMessages.create(\"malformedMessageHeaderException\"), e);\n    }\n\n    Type msgType;\n    try {\n      msgType = Type.fromInt(code);\n    } catch (IllegalArgumentException e) {\n      throw new DecodeException(\n          ErrorMessages.create(\"malformedMessageHeaderUnrecognizedCode\", Integer.toHexString(code)),\n          e);\n    }\n\n    try {\n      var map = unpacker.unpackValue().asMapValue().map();\n      var decoded = decodeMessage(msgType, map);\n      if (decoded != null) {\n        return decoded;\n      }\n      throw new DecodeException(\n          ErrorMessages.create(\"unhandledMessageCode\", Integer.toHexString(code)));\n    } catch (MessageTypeException | URISyntaxException e) {\n      throw new DecodeException(ErrorMessages.create(\"malformedMessageBody\", code), e);\n    }\n  }\n\n  protected static @Nullable Value getNullable(Map<Value, Value> map, String key) {\n    return map.get(new ImmutableStringValueImpl(key));\n  }\n\n  protected static Value get(Map<Value, Value> map, String key) throws DecodeException {\n    var value = map.get(new ImmutableStringValueImpl(key));\n    if (value == null) {\n      throw new DecodeException(ErrorMessages.create(\"missingMessageParameter\", key));\n    }\n    return value;\n  }\n\n  protected static String unpackString(Map<Value, Value> map, String key) throws DecodeException {\n    return get(map, key).asStringValue().asString();\n  }\n\n  protected static @Nullable String unpackStringOrNull(Map<Value, Value> map, String key) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n    return value.asStringValue().asString();\n  }\n\n  protected static <T> @Nullable T unpackStringOrNull(\n      Map<Value, Value> map, String key, Function<String, T> mapper) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n    return mapper.apply(value.asStringValue().asString());\n  }\n\n  protected static byte @Nullable [] unpackByteArray(Map<Value, Value> map, String key) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n    return value.asBinaryValue().asByteArray();\n  }\n\n  protected static boolean unpackBoolean(Map<Value, Value> map, String key) throws DecodeException {\n    return get(map, key).asBooleanValue().getBoolean();\n  }\n\n  protected static int unpackInt(Map<Value, Value> map, String key) throws DecodeException {\n    return get(map, key).asIntegerValue().asInt();\n  }\n\n  protected static long unpackLong(Map<Value, Value> map, String key) throws DecodeException {\n    return get(map, key).asIntegerValue().asLong();\n  }\n\n  protected static @Nullable Long unpackLongOrNull(Map<Value, Value> map, String key) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n    return value.asIntegerValue().asLong();\n  }\n\n  protected static <T> @Nullable T unpackLongOrNull(\n      Map<Value, Value> map, String key, Function<Long, T> mapper) {\n    var value = unpackLongOrNull(map, key);\n    if (value == null) {\n      return null;\n    }\n    return mapper.apply(value);\n  }\n\n  protected static @Nullable List<String> unpackStringListOrNull(\n      Map<Value, Value> map, String key) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n\n    return value.asArrayValue().list().stream().map((it) -> it.asStringValue().asString()).toList();\n  }\n\n  protected static @Nullable Map<String, String> unpackStringMapOrNull(\n      Map<Value, Value> map, String key) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n\n    return value.asMapValue().entrySet().stream()\n        .collect(\n            Collectors.toMap(\n                (e) -> e.getKey().asStringValue().asString(),\n                (e) -> e.getValue().asStringValue().asString()));\n  }\n\n  protected static <T> @Nullable List<T> unpackStringListOrNull(\n      Map<Value, Value> map, String key, Function<String, T> mapper) {\n    var value = unpackStringListOrNull(map, key);\n    if (value == null) {\n      return null;\n    }\n\n    return value.stream().map(mapper).toList();\n  }\n\n  protected static <T> @Nullable List<T> unpackListOrNull(\n      Map<Value, Value> map, String key, Function<Value, T> mapper) {\n    var keys = getNullable(map, key);\n    if (keys == null) {\n      return null;\n    }\n\n    var result = new ArrayList<T>(keys.asArrayValue().size());\n    for (Value value : keys.asArrayValue()) {\n      result.add(mapper.apply(value));\n    }\n    return result;\n  }\n\n  protected static <T> @Nullable Map<String, T> unpackStringMapOrNull(\n      Map<Value, Value> map, String key, Function<Map<Value, Value>, T> mapper) {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n\n    return value.asMapValue().entrySet().stream()\n        .collect(\n            Collectors.toMap(\n                (e) -> e.getKey().asStringValue().asString(),\n                (e) -> mapper.apply(e.getValue().asMapValue().map())));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/AbstractMessagePackEncoder.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.util.Collection;\nimport java.util.Map;\nimport java.util.function.Function;\nimport org.msgpack.core.MessagePack;\nimport org.msgpack.core.MessagePacker;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class AbstractMessagePackEncoder implements MessageEncoder {\n\n  protected final MessagePacker packer;\n\n  public AbstractMessagePackEncoder(MessagePacker packer) {\n    this.packer = packer;\n  }\n\n  public AbstractMessagePackEncoder(OutputStream stream) {\n    this(MessagePack.newDefaultPacker(stream));\n  }\n\n  protected abstract @Nullable void encodeMessage(Message msg)\n      throws ProtocolException, IOException;\n\n  @Override\n  public final void encode(Message msg) throws IOException, ProtocolException {\n    packer.packArrayHeader(2);\n    packer.packInt(msg.type().getCode());\n    encodeMessage(msg);\n    packer.flush();\n  }\n\n  protected void packMapHeader(int size, @Nullable Object value1) throws IOException {\n    packer.packMapHeader(size + (value1 != null ? 1 : 0));\n  }\n\n  protected void packMapHeader(int size, @Nullable Object value1, @Nullable Object value2)\n      throws IOException {\n    packer.packMapHeader(size + (value1 != null ? 1 : 0) + (value2 != null ? 1 : 0));\n  }\n\n  protected void packMapHeader(\n      int size, @Nullable Object value1, @Nullable Object value2, @Nullable Object value3)\n      throws IOException {\n    packer.packMapHeader(\n        size + (value1 != null ? 1 : 0) + (value2 != null ? 1 : 0) + (value3 != null ? 1 : 0));\n  }\n\n  protected void packMapHeader(\n      int size,\n      @Nullable Object value1,\n      @Nullable Object value2,\n      @Nullable Object value3,\n      @Nullable Object value4,\n      @Nullable Object value5,\n      @Nullable Object value6,\n      @Nullable Object value7,\n      @Nullable Object value8,\n      @Nullable Object value9,\n      @Nullable Object valueA,\n      @Nullable Object valueB,\n      @Nullable Object valueC,\n      @Nullable Object valueD,\n      @Nullable Object valueE,\n      @Nullable Object valueF,\n      @Nullable Object valueG)\n      throws IOException {\n    packer.packMapHeader(\n        size\n            + (value1 != null ? 1 : 0)\n            + (value2 != null ? 1 : 0)\n            + (value3 != null ? 1 : 0)\n            + (value4 != null ? 1 : 0)\n            + (value5 != null ? 1 : 0)\n            + (value6 != null ? 1 : 0)\n            + (value7 != null ? 1 : 0)\n            + (value8 != null ? 1 : 0)\n            + (value9 != null ? 1 : 0)\n            + (valueA != null ? 1 : 0)\n            + (valueB != null ? 1 : 0)\n            + (valueC != null ? 1 : 0)\n            + (valueD != null ? 1 : 0)\n            + (valueE != null ? 1 : 0)\n            + (valueF != null ? 1 : 0)\n            + (valueG != null ? 1 : 0));\n  }\n\n  protected void packKeyValue(String name, @Nullable Integer value) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packInt(value);\n  }\n\n  protected void packKeyValue(String name, @Nullable Long value) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packLong(value);\n  }\n\n  protected <T> void packKeyValueLong(String name, @Nullable T value, Function<T, Long> mapper)\n      throws IOException {\n    if (value == null) {\n      return;\n    }\n    packKeyValue(name, mapper.apply(value));\n  }\n\n  protected void packKeyValue(String name, @Nullable String value) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packString(value);\n  }\n\n  protected <T> void packKeyValueString(String name, @Nullable T value, Function<T, String> mapper)\n      throws IOException {\n    if (value == null) {\n      return;\n    }\n    packKeyValue(name, mapper.apply(value));\n  }\n\n  protected void packKeyValue(String name, @Nullable Collection<String> value) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packArrayHeader(value.size());\n    for (String elem : value) {\n      packer.packString(elem);\n    }\n  }\n\n  protected <T> void packKeyValue(\n      String name, @Nullable Collection<T> value, Function<T, String> mapper) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packArrayHeader(value.size());\n    for (T elem : value) {\n      packer.packString(mapper.apply(elem));\n    }\n  }\n\n  protected void packKeyValue(String name, @Nullable Map<String, String> value) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packMapHeader(value.size());\n    for (Map.Entry<String, String> e : value.entrySet()) {\n      packer.packString(e.getKey());\n      packer.packString(e.getValue());\n    }\n  }\n\n  protected void packKeyValue(String name, byte @Nullable [] value) throws IOException {\n    if (value == null) {\n      return;\n    }\n    packer.packString(name);\n    packer.packBinaryHeader(value.length);\n    packer.writePayload(value);\n  }\n\n  protected void packKeyValue(String name, boolean value) throws IOException {\n    packer.packString(name);\n    packer.packBoolean(value);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/BaseMessagePackDecoder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.InputStream;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.*;\nimport org.msgpack.core.MessageUnpacker;\nimport org.msgpack.value.Value;\nimport org.pkl.core.messaging.Message.Type;\nimport org.pkl.core.messaging.Messages.*;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.util.Nullable;\n\npublic class BaseMessagePackDecoder extends AbstractMessagePackDecoder {\n\n  public BaseMessagePackDecoder(MessageUnpacker unpacker) {\n    super(unpacker);\n  }\n\n  public BaseMessagePackDecoder(InputStream stream) {\n    super(stream);\n  }\n\n  protected @Nullable Message decodeMessage(Type msgType, Map<Value, Value> map)\n      throws DecodeException, URISyntaxException {\n    return switch (msgType) {\n      case READ_RESOURCE_REQUEST ->\n          new ReadResourceRequest(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              new URI(unpackString(map, \"uri\")));\n      case READ_RESOURCE_RESPONSE ->\n          new ReadResourceResponse(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              unpackByteArray(map, \"contents\"),\n              unpackStringOrNull(map, \"error\"));\n      case READ_MODULE_REQUEST ->\n          new ReadModuleRequest(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              new URI(unpackString(map, \"uri\")));\n      case READ_MODULE_RESPONSE ->\n          new ReadModuleResponse(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              unpackStringOrNull(map, \"contents\"),\n              unpackStringOrNull(map, \"error\"));\n      case LIST_RESOURCES_REQUEST ->\n          new ListResourcesRequest(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              new URI(unpackString(map, \"uri\")));\n      case LIST_RESOURCES_RESPONSE ->\n          new ListResourcesResponse(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              unpackPathElements(map, \"pathElements\"),\n              unpackStringOrNull(map, \"error\"));\n      case LIST_MODULES_REQUEST ->\n          new ListModulesRequest(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              new URI(unpackString(map, \"uri\")));\n      case LIST_MODULES_RESPONSE ->\n          new ListModulesResponse(\n              unpackLong(map, \"requestId\"),\n              unpackLong(map, \"evaluatorId\"),\n              unpackPathElements(map, \"pathElements\"),\n              unpackStringOrNull(map, \"error\"));\n      default -> null;\n    };\n  }\n\n  protected static @Nullable ModuleReaderSpec unpackModuleReaderSpec(@Nullable Value value)\n      throws DecodeException {\n    if (value == null) {\n      return null;\n    }\n    var map = value.asMapValue().map();\n    return new ModuleReaderSpec(\n        unpackString(map, \"scheme\"),\n        unpackBoolean(map, \"hasHierarchicalUris\"),\n        unpackBoolean(map, \"isLocal\"),\n        unpackBoolean(map, \"isGlobbable\"));\n  }\n\n  protected static @Nullable ResourceReaderSpec unpackResourceReaderSpec(@Nullable Value value)\n      throws DecodeException {\n    if (value == null) {\n      return null;\n    }\n    var map = value.asMapValue().map();\n    return new ResourceReaderSpec(\n        unpackString(map, \"scheme\"),\n        unpackBoolean(map, \"hasHierarchicalUris\"),\n        unpackBoolean(map, \"isGlobbable\"));\n  }\n\n  protected static @Nullable List<PathElement> unpackPathElements(Map<Value, Value> map, String key)\n      throws DecodeException {\n    var value = getNullable(map, key);\n    if (value == null) {\n      return null;\n    }\n\n    var result = new ArrayList<PathElement>(value.asArrayValue().size());\n    for (Value pathElement : value.asArrayValue()) {\n      var pathElementMap = pathElement.asMapValue().map();\n      result.add(\n          new PathElement(\n              unpackString(pathElementMap, \"name\"), unpackBoolean(pathElementMap, \"isDirectory\")));\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/BaseMessagePackEncoder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport org.msgpack.core.MessagePacker;\nimport org.pkl.core.messaging.Messages.*;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\npublic class BaseMessagePackEncoder extends AbstractMessagePackEncoder {\n\n  public BaseMessagePackEncoder(MessagePacker packer) {\n    super(packer);\n  }\n\n  public BaseMessagePackEncoder(OutputStream stream) {\n    super(stream);\n  }\n\n  protected void packModuleReaderSpec(ModuleReaderSpec reader) throws IOException {\n    packer.packMapHeader(4);\n    packKeyValue(\"scheme\", reader.scheme());\n    packKeyValue(\"hasHierarchicalUris\", reader.hasHierarchicalUris());\n    packKeyValue(\"isLocal\", reader.isLocal());\n    packKeyValue(\"isGlobbable\", reader.isGlobbable());\n  }\n\n  protected void packResourceReaderSpec(ResourceReaderSpec reader) throws IOException {\n    packer.packMapHeader(3);\n    packKeyValue(\"scheme\", reader.scheme());\n    packKeyValue(\"hasHierarchicalUris\", reader.hasHierarchicalUris());\n    packKeyValue(\"isGlobbable\", reader.isGlobbable());\n  }\n\n  protected void packPathElement(PathElement pathElement) throws IOException {\n    packer.packMapHeader(2);\n    packKeyValue(\"name\", pathElement.getName());\n    packKeyValue(\"isDirectory\", pathElement.isDirectory());\n  }\n\n  protected @Nullable void encodeMessage(Message msg) throws ProtocolException, IOException {\n    switch (msg.type()) {\n      case READ_RESOURCE_REQUEST -> {\n        var m = (ReadResourceRequest) msg;\n        packer.packMapHeader(3);\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        packKeyValue(\"uri\", m.uri().toString());\n      }\n      case READ_RESOURCE_RESPONSE -> {\n        var m = (ReadResourceResponse) msg;\n        packMapHeader(2, m.contents(), m.error());\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        packKeyValue(\"contents\", m.contents());\n        packKeyValue(\"error\", m.error());\n      }\n      case READ_MODULE_REQUEST -> {\n        var m = (ReadModuleRequest) msg;\n        packer.packMapHeader(3);\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        packKeyValue(\"uri\", m.uri().toString());\n      }\n      case READ_MODULE_RESPONSE -> {\n        var m = (ReadModuleResponse) msg;\n        packMapHeader(2, m.contents(), m.error());\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        packKeyValue(\"contents\", m.contents());\n        packKeyValue(\"error\", m.error());\n      }\n      case LIST_RESOURCES_REQUEST -> {\n        var m = (ListResourcesRequest) msg;\n        packer.packMapHeader(3);\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        packKeyValue(\"uri\", m.uri().toString());\n      }\n      case LIST_RESOURCES_RESPONSE -> {\n        var m = (ListResourcesResponse) msg;\n        packMapHeader(2, m.pathElements(), m.error());\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        if (m.pathElements() != null) {\n          packer.packString(\"pathElements\");\n          packer.packArrayHeader(m.pathElements().size());\n          for (var pathElement : m.pathElements()) {\n            packPathElement(pathElement);\n          }\n        }\n        packKeyValue(\"error\", m.error());\n      }\n      case LIST_MODULES_REQUEST -> {\n        var m = (ListModulesRequest) msg;\n        packer.packMapHeader(3);\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        packKeyValue(\"uri\", m.uri().toString());\n      }\n      case LIST_MODULES_RESPONSE -> {\n        var m = (ListModulesResponse) msg;\n        packMapHeader(2, m.pathElements(), m.error());\n        packKeyValue(\"requestId\", m.requestId());\n        packKeyValue(\"evaluatorId\", m.evaluatorId());\n        if (m.pathElements() != null) {\n          packer.packString(\"pathElements\");\n          packer.packArrayHeader(m.pathElements().size());\n          for (var pathElement : m.pathElements()) {\n            packPathElement(pathElement);\n          }\n        }\n        packKeyValue(\"error\", m.error());\n      }\n      default ->\n          throw new ProtocolException(\n              ErrorMessages.create(\"unhandledMessageType\", msg.type().toString()));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/DecodeException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\npublic final class DecodeException extends ProtocolException {\n\n  public DecodeException(String msg, Throwable cause) {\n    super(msg, cause);\n  }\n\n  public DecodeException(String msg) {\n    super(msg);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/Message.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\npublic interface Message {\n\n  Type type();\n\n  enum Type {\n    CREATE_EVALUATOR_REQUEST(0x20),\n    CREATE_EVALUATOR_RESPONSE(0x21),\n    CLOSE_EVALUATOR(0x22),\n    EVALUATE_REQUEST(0x23),\n    EVALUATE_RESPONSE(0x24),\n    LOG_MESSAGE(0x25),\n    READ_RESOURCE_REQUEST(0x26),\n    READ_RESOURCE_RESPONSE(0x27),\n    READ_MODULE_REQUEST(0x28),\n    READ_MODULE_RESPONSE(0x29),\n    LIST_RESOURCES_REQUEST(0x2a),\n    LIST_RESOURCES_RESPONSE(0x2b),\n    LIST_MODULES_REQUEST(0x2c),\n    LIST_MODULES_RESPONSE(0x2d),\n    INITIALIZE_MODULE_READER_REQUEST(0x2e),\n    INITIALIZE_MODULE_READER_RESPONSE(0x2f),\n    INITIALIZE_RESOURCE_READER_REQUEST(0x30),\n    INITIALIZE_RESOURCE_READER_RESPONSE(0x31),\n    CLOSE_EXTERNAL_PROCESS(0x32);\n\n    private final int code;\n\n    Type(int code) {\n      this.code = code;\n    }\n\n    public static Type fromInt(int val) throws IllegalArgumentException {\n      for (Type t : Type.values()) {\n        if (t.code == val) {\n          return t;\n        }\n      }\n\n      throw new IllegalArgumentException(\"Unknown Message.Type code\");\n    }\n\n    public int getCode() {\n      return code;\n    }\n  }\n\n  interface OneWay extends Message {}\n\n  interface Request extends Message {\n    long requestId();\n  }\n\n  interface Response extends Message {\n    long requestId();\n  }\n\n  interface Client extends Message {\n    interface Request extends Client, Message.Request {}\n\n    interface Response extends Client, Message.Response {}\n\n    interface OneWay extends Client, Message.OneWay {}\n  }\n\n  interface Server extends Message {\n    interface Request extends Server, Message.Request {}\n\n    interface Response extends Server, Message.Response {}\n\n    interface OneWay extends Server, Message.OneWay {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/MessageDecoder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\nimport org.pkl.core.util.Nullable;\n\n/** Decodes a stream of messages. */\npublic interface MessageDecoder {\n  @Nullable\n  Message decode() throws IOException, DecodeException;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/MessageEncoder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\n\n/** Encodes a stream of messages. */\npublic interface MessageEncoder {\n  void encode(Message msg) throws IOException, ProtocolException;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/MessageTransport.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\n\n/** A bidirectional transport for sending and receiving messages. */\npublic interface MessageTransport extends AutoCloseable {\n  interface OneWayHandler {\n    void handleOneWay(Message.OneWay msg) throws ProtocolException;\n  }\n\n  interface RequestHandler {\n    void handleRequest(Message.Request msg) throws ProtocolException, IOException;\n  }\n\n  interface ResponseHandler {\n    void handleResponse(Message.Response msg) throws ProtocolException;\n  }\n\n  void start(OneWayHandler oneWayHandler, RequestHandler requestHandler)\n      throws ProtocolException, IOException;\n\n  void send(Message.OneWay message) throws ProtocolException, IOException;\n\n  void send(Message.Request message, ResponseHandler responseHandler)\n      throws ProtocolException, IOException;\n\n  void send(Message.Response message) throws ProtocolException, IOException;\n\n  @Override\n  void close();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/MessageTransports.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.io.IOException;\nimport java.text.MessageFormat;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Future;\nimport org.pkl.core.messaging.Message.OneWay;\nimport org.pkl.core.messaging.Message.Response;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Pair;\n\n/** Factory methods for creating [MessageTransport]s. */\npublic final class MessageTransports {\n  private MessageTransports() {}\n\n  public interface Logger {\n    void log(String msg);\n  }\n\n  /** Creates a message transport that reads from [inputStream] and writes to [outputStream]. */\n  public static MessageTransport stream(\n      MessageDecoder decoder, MessageEncoder encoder, Logger logger) {\n    return new EncodingMessageTransport(decoder, encoder, logger);\n  }\n\n  /** Creates \"client\" and \"server\" transports that are directly connected to each other. */\n  public static Pair<MessageTransport, MessageTransport> direct(Logger logger) {\n    var transport1 = new DirectMessageTransport(logger);\n    var transport2 = new DirectMessageTransport(logger);\n    transport1.setOther(transport2);\n    transport2.setOther(transport1);\n    return Pair.of(transport1, transport2);\n  }\n\n  public static <T> T resolveFuture(Future<T> future) throws IOException {\n    try {\n      return future.get();\n    } catch (ExecutionException | InterruptedException e) {\n      if (e.getCause() instanceof IOException ioExc) {\n        throw ioExc;\n      } else {\n        throw new IOException(\"external read failure: \" + e.getMessage(), e.getCause());\n      }\n    }\n  }\n\n  protected static class EncodingMessageTransport extends AbstractMessageTransport {\n\n    private final MessageDecoder decoder;\n    private final MessageEncoder encoder;\n    private volatile boolean isClosed = false;\n\n    protected EncodingMessageTransport(\n        MessageDecoder decoder, MessageEncoder encoder, Logger logger) {\n      super(logger);\n      this.decoder = decoder;\n      this.encoder = encoder;\n    }\n\n    @Override\n    protected void doStart() throws ProtocolException, IOException {\n      while (!isClosed) {\n        var message = decoder.decode();\n        if (message == null) {\n          return;\n        }\n        accept(message);\n      }\n    }\n\n    @Override\n    protected void doClose() {\n      isClosed = true;\n    }\n\n    @Override\n    protected void doSend(Message message) throws ProtocolException, IOException {\n      encoder.encode(message);\n    }\n  }\n\n  protected static class DirectMessageTransport extends AbstractMessageTransport {\n\n    private DirectMessageTransport other;\n\n    protected DirectMessageTransport(Logger logger) {\n      super(logger);\n    }\n\n    @Override\n    protected void doStart() {}\n\n    @Override\n    protected void doClose() {}\n\n    @Override\n    protected void doSend(Message message) throws ProtocolException, IOException {\n      other.accept(message);\n    }\n\n    public void setOther(DirectMessageTransport other) {\n      this.other = other;\n    }\n  }\n\n  protected abstract static class AbstractMessageTransport implements MessageTransport {\n\n    private final Logger logger;\n    private MessageTransport.OneWayHandler oneWayHandler;\n    private MessageTransport.RequestHandler requestHandler;\n    private final Map<Long, ResponseHandler> responseHandlers = new ConcurrentHashMap<>();\n\n    protected AbstractMessageTransport(Logger logger) {\n      this.logger = logger;\n    }\n\n    protected void log(String message, Object... args) {\n      var formatter = new MessageFormat(message);\n      logger.log(formatter.format(args));\n    }\n\n    protected abstract void doStart() throws ProtocolException, IOException;\n\n    protected abstract void doClose();\n\n    protected abstract void doSend(Message message) throws ProtocolException, IOException;\n\n    protected void accept(Message message) throws ProtocolException, IOException {\n      log(\"Received message: {0}\", message);\n      if (message instanceof Message.OneWay msg) {\n        oneWayHandler.handleOneWay(msg);\n      } else if (message instanceof Message.Request msg) {\n        requestHandler.handleRequest(msg);\n      } else if (message instanceof Message.Response msg) {\n        var handler = responseHandlers.remove(msg.requestId());\n        if (handler == null) {\n          throw new ProtocolException(\n              ErrorMessages.create(\n                  \"unknownRequestId\", message.getClass().getSimpleName(), msg.requestId()));\n        }\n        handler.handleResponse(msg);\n      }\n    }\n\n    @Override\n    public final void start(OneWayHandler oneWayHandler, RequestHandler requestHandler)\n        throws ProtocolException, IOException {\n      log(\"Starting transport: {0}\", this);\n      this.oneWayHandler = oneWayHandler;\n      this.requestHandler = requestHandler;\n      doStart();\n    }\n\n    @Override\n    public final void close() {\n      log(\"Closing transport: {0}\", this);\n      doClose();\n      responseHandlers.clear();\n    }\n\n    @Override\n    public void send(OneWay message) throws ProtocolException, IOException {\n      log(\"Sending message: {0}\", message);\n      doSend(message);\n    }\n\n    @Override\n    public void send(Message.Request message, ResponseHandler responseHandler)\n        throws ProtocolException, IOException {\n      log(\"Sending message: {0}\", message);\n      responseHandlers.put(message.requestId(), responseHandler);\n      doSend(message);\n    }\n\n    @Override\n    public void send(Response message) throws ProtocolException, IOException {\n      log(\"Sending message: {0}\", message);\n      doSend(message);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/Messages.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\nimport java.net.URI;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.core.messaging.Message.*;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.util.Nullable;\n\npublic final class Messages {\n  private Messages() {}\n\n  public record ModuleReaderSpec(\n      String scheme, boolean hasHierarchicalUris, boolean isLocal, boolean isGlobbable) {}\n\n  public record ResourceReaderSpec(\n      String scheme, boolean hasHierarchicalUris, boolean isGlobbable) {}\n\n  public record ListResourcesRequest(long requestId, long evaluatorId, URI uri)\n      implements Server.Request {\n    public Type type() {\n      return Type.LIST_RESOURCES_REQUEST;\n    }\n  }\n\n  public record ListResourcesResponse(\n      long requestId,\n      long evaluatorId,\n      @Nullable List<PathElement> pathElements,\n      @Nullable String error)\n      implements Client.Response {\n    public Type type() {\n      return Type.LIST_RESOURCES_RESPONSE;\n    }\n  }\n\n  public record ListModulesRequest(long requestId, long evaluatorId, URI uri)\n      implements Server.Request {\n    public Type type() {\n      return Type.LIST_MODULES_REQUEST;\n    }\n  }\n\n  public record ListModulesResponse(\n      long requestId,\n      long evaluatorId,\n      @Nullable List<PathElement> pathElements,\n      @Nullable String error)\n      implements Client.Response {\n    public Type type() {\n      return Type.LIST_MODULES_RESPONSE;\n    }\n  }\n\n  public record ReadResourceRequest(long requestId, long evaluatorId, URI uri)\n      implements Message.Request {\n    public Type type() {\n      return Type.READ_RESOURCE_REQUEST;\n    }\n  }\n\n  public record ReadResourceResponse(\n      long requestId, long evaluatorId, byte @Nullable [] contents, @Nullable String error)\n      implements Client.Response {\n\n    public Type type() {\n      return Type.READ_RESOURCE_RESPONSE;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (this == o) {\n        return true;\n      }\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      ReadResourceResponse that = (ReadResourceResponse) o;\n      return requestId == that.requestId\n          && evaluatorId == that.evaluatorId\n          && Objects.equals(error, that.error)\n          && Arrays.equals(contents, that.contents);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(requestId, evaluatorId, Arrays.hashCode(contents), error);\n    }\n  }\n\n  public record ReadModuleRequest(long requestId, long evaluatorId, URI uri)\n      implements Message.Request {\n    public Type type() {\n      return Type.READ_MODULE_REQUEST;\n    }\n  }\n\n  public record ReadModuleResponse(\n      long requestId, long evaluatorId, @Nullable String contents, @Nullable String error)\n      implements Client.Response {\n    public Type type() {\n      return Type.READ_MODULE_RESPONSE;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/ProtocolException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging;\n\npublic class ProtocolException extends Exception {\n  public ProtocolException(String msg, Throwable cause) {\n    super(msg, cause);\n  }\n\n  public ProtocolException(String msg) {\n    super(msg);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/messaging/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.messaging;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/FileResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Files;\nimport java.nio.file.NoSuchFileException;\nimport java.nio.file.NotDirectoryException;\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport org.pkl.core.util.IoUtils;\n\npublic final class FileResolver {\n  private FileResolver() {}\n\n  public static List<PathElement> listElements(URI baseUri) throws IOException {\n    return listElements(IoUtils.pathOf(baseUri));\n  }\n\n  public static List<PathElement> listElements(Path path) throws IOException {\n    try (var stream = Files.newDirectoryStream(path)) {\n      var ret = new ArrayList<PathElement>();\n      for (var entry : stream) {\n        // skip symlinks to prevent cyclical globs\n        if (Files.isSymbolicLink(entry)) {\n          continue;\n        }\n        ret.add(new PathElement(entry.getFileName().toString(), Files.isDirectory(entry)));\n      }\n      return ret;\n    } catch (NotDirectoryException | NoSuchFileException ignored) {\n      return Collections.emptyList();\n    }\n  }\n\n  public static boolean hasElement(URI elementUri) {\n    return Files.exists(IoUtils.pathOf(elementUri));\n  }\n\n  public static boolean hasElement(Path path) {\n    return Files.exists(path);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ModuleKey.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.runtime.ReaderBase;\nimport org.pkl.core.util.Nullable;\n\n/**\n * SPI for identifying, resolving, caching, and resolving a Pkl module. Standard implementations can\n * be created using {@link ModuleKeys}.\n */\npublic interface ModuleKey extends ReaderBase {\n  /**\n   * Returns the absolute URI of this module. This URI is used for identifying the module in user\n   * facing messages, for example stack traces. Typically, this URI contains all information\n   * necessary for resolving and loading the module.\n   */\n  URI getUri();\n\n  /**\n   * Resolves this module to a canonical form suitable for loading and caching the module. This may\n   * involve I/O. Throws {@link FileNotFoundException} if this module cannot be found.\n   */\n  ResolvedModuleKey resolve(SecurityManager securityManager)\n      throws IOException, SecurityManagerException;\n\n  default URI resolveUri(URI uri) throws IOException, SecurityManagerException {\n    return resolveUri(getUri(), uri);\n  }\n\n  /**\n   * Tells if this module should be cached in memory.\n   *\n   * <p>Caching a module means caching its entire evaluation state, not just its resolved URI or\n   * source code.\n   *\n   * <p>Turning off module caching is mostly useful for synthetic modules that cannot be referenced\n   * (imported) from other modules. An example for this is a module representing code typed in a\n   * REPL.\n   */\n  default boolean isCached() {\n    return true;\n  }\n\n  /**\n   * Tells if the modules represented by this module key is local to the environment.\n   *\n   * <p>A module that is local, and also {@link #hasHierarchicalUris()}, supports triple-dot\n   * imports.\n   *\n   * <p>As a best practice, a module key should be considered local if its source can be loaded in a\n   * low latency environment (for example, from disk or from memory). On the flip-side, a module\n   * loaded from a remove server should not be considered local.\n   */\n  default boolean isLocal() {\n    return false;\n  }\n\n  /**\n   * The relative file cache path for this module, or {@code null} if this module should not be\n   * cached on the file system.\n   */\n  default @Nullable Path getFileCacheLocation() {\n    return null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ModuleKeyFactories.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.FileSystemNotFoundException;\nimport java.nio.file.Paths;\nimport java.nio.file.spi.FileSystemProvider;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.ServiceLoader;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.pkl.core.Closeables;\nimport org.pkl.core.externalreader.ExternalModuleResolver;\nimport org.pkl.core.externalreader.ExternalReaderProcess;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.IoUtils;\n\n/** Utilities for obtaining and using module key factories. */\npublic final class ModuleKeyFactories {\n  private ModuleKeyFactories() {}\n\n  /** A factory for standard library module keys. */\n  public static final ModuleKeyFactory standardLibrary = new StandardLibrary();\n\n  /** A factory for file based module keys. */\n  public static final ModuleKeyFactory file = new File();\n\n  /** A factory for {@code http:} and {@code https:} module keys. */\n  public static final ModuleKeyFactory http = new Http();\n\n  /** A factory for URL based module keys. */\n  public static final ModuleKeyFactory genericUrl = new GenericUrl();\n\n  /**\n   * Returns factories registered as {@link ServiceLoader service providers} of type {@code\n   * org.pkl.core.module.ModuleKeyFactory}.\n   */\n  public static List<ModuleKeyFactory> fromServiceProviders() {\n    return FromServiceProviders.INSTANCE;\n  }\n\n  /** A factory for {@code package:} modules. */\n  public static final ModuleKeyFactory pkg = new Package();\n\n  /** A factory for {@code projectpackage:} modules. */\n  public static final ModuleKeyFactory projectpackage = new ProjectPackage();\n\n  /**\n   * Returns a factory for {@code modulepath:} modules resolved on the given module path.\n   *\n   * <p>NOTE: {@code resolver} needs to be {@link ModulePathResolver#close closed} to avoid resource\n   * leaks.\n   */\n  public static ModuleKeyFactory modulePath(ModulePathResolver resolver) {\n    return new ModulePath(resolver);\n  }\n\n  /** Returns a factory for {@code modulepath:} modules resolved with the given class loader. */\n  public static ModuleKeyFactory classPath(ClassLoader classLoader) {\n    return new ClassPath(classLoader);\n  }\n\n  /**\n   * Returns a factory for external reader module keys.\n   *\n   * <p>NOTE: {@code process} needs to be {@link ExternalReaderProcess#close closed} to avoid\n   * resource leaks.\n   */\n  public static ModuleKeyFactory externalProcess(String scheme, ExternalReaderProcess process) {\n    return new ExternalProcess(scheme, process, 0);\n  }\n\n  /**\n   * Returns a factory for external reader module keys.\n   *\n   * <p>NOTE: {@code process} needs to be {@link ExternalReaderProcess#close closed} to avoid\n   * resource leaks.\n   */\n  public static ModuleKeyFactory externalProcess(\n      String scheme, ExternalReaderProcess process, long evaluatorId) {\n    return new ExternalProcess(scheme, process, evaluatorId);\n  }\n\n  /**\n   * Closes the given factories, ignoring any exceptions.\n   *\n   * @deprecated Replaced by {@link Closeables#closeQuietly}.\n   */\n  @Deprecated(since = \"0.27.0\", forRemoval = true)\n  public static void closeQuietly(Iterable<ModuleKeyFactory> factories) {\n    for (ModuleKeyFactory factory : factories) {\n      try {\n        factory.close();\n      } catch (Exception ignored) {\n      }\n    }\n  }\n\n  private static class StandardLibrary implements ModuleKeyFactory {\n    private StandardLibrary() {}\n\n    @Override\n    public Optional<ModuleKey> create(URI uri) {\n      if (!uri.getScheme().equalsIgnoreCase(\"pkl\")) return Optional.empty();\n      return Optional.of(ModuleKeys.standardLibrary(uri));\n    }\n  }\n\n  private static class ModulePath implements ModuleKeyFactory {\n    final ModulePathResolver resolver;\n\n    public ModulePath(ModulePathResolver resolver) {\n      this.resolver = resolver;\n    }\n\n    @Override\n    public Optional<ModuleKey> create(URI uri) {\n      if (uri.getScheme().equalsIgnoreCase(\"modulepath\")) {\n        return Optional.of(ModuleKeys.modulePath(uri, resolver));\n      }\n      if (uri.getScheme().equalsIgnoreCase(\"jar\")) {\n        try {\n          // modulepaths that resolve to jar-file URIs will register a FileSystemProvider that\n          // such that `Paths.get(\"jar:file\")` returns a path.\n          // Otherwise, `FileSystemNotFoundException` gets thrown.\n          var path = Paths.get(uri);\n          return Optional.of(ModuleKeys.modulePath(URI.create(\"modulepath:\" + path), resolver));\n        } catch (FileSystemNotFoundException e) {\n          return Optional.empty();\n        }\n      }\n      return Optional.empty();\n    }\n\n    @Override\n    public void close() {\n      resolver.close();\n    }\n  }\n\n  private static class ClassPath implements ModuleKeyFactory {\n    private final ClassLoader classLoader;\n\n    public ClassPath(ClassLoader classLoader) {\n      this.classLoader = classLoader;\n    }\n\n    @Override\n    public Optional<ModuleKey> create(URI uri) {\n      if (!uri.getScheme().equalsIgnoreCase(\"modulepath\")) return Optional.empty();\n      return Optional.of(ModuleKeys.classPath(uri, classLoader));\n    }\n  }\n\n  private static class File implements ModuleKeyFactory {\n    @Override\n    public Optional<ModuleKey> create(URI uri) throws URISyntaxException {\n      // skip loading providers if the scheme is `file`.\n      if (uri.getScheme().equalsIgnoreCase(\"file\")) {\n        return Optional.of(ModuleKeys.file(uri));\n      }\n      // don't handle jar-file URIs (these are handled by GenericUrl).\n      if (uri.getScheme().equalsIgnoreCase(\"jar\")) {\n        return Optional.empty();\n      }\n      for (FileSystemProvider provider : FileSystemProvider.installedProviders()) {\n        if (provider.getScheme().equalsIgnoreCase(uri.getScheme())) {\n          return Optional.of(ModuleKeys.file(uri));\n        }\n      }\n      return Optional.empty();\n    }\n  }\n\n  private static class Http implements ModuleKeyFactory {\n    private Http() {}\n\n    @Override\n    public Optional<ModuleKey> create(URI uri) {\n      var scheme = uri.getScheme();\n      if (\"http\".equalsIgnoreCase(scheme) || \"https\".equalsIgnoreCase(scheme)) {\n        return Optional.of(ModuleKeys.http(uri));\n      }\n      return Optional.empty();\n    }\n  }\n\n  private static class GenericUrl implements ModuleKeyFactory {\n    private GenericUrl() {}\n\n    @Override\n    public Optional<ModuleKey> create(URI uri) {\n      if (!uri.isAbsolute()) return Optional.empty();\n      if (uri.isOpaque() && !\"jar\".equalsIgnoreCase(uri.getScheme())) return Optional.empty();\n\n      // Blindly accept this URI, assuming ModuleKeys.genericUrl() can handle it.\n      // This means that ModuleKeyFactories.GenericUrl must come last in the handler chain.\n      return Optional.of(ModuleKeys.genericUrl(uri));\n    }\n  }\n\n  /**\n   * Represents a module from a package.\n   *\n   * <p>Packages are shareable libraries published to the internet in the form of a zip ball, or\n   * optionally, a local project declared as a dependency of the current project.\n   */\n  private static final class Package implements ModuleKeyFactory {\n    public Optional<ModuleKey> create(URI uri) throws URISyntaxException {\n      if (uri.getScheme().equalsIgnoreCase(\"package\")) {\n        return Optional.of(ModuleKeys.pkg(uri));\n      }\n      return Optional.empty();\n    }\n  }\n\n  /**\n   * Represents a module from a project-relative package.\n   *\n   * <p>A project-relative package has the scheme {@code projectpackage}. It can either be a remote\n   * dependency, or a local dependency\n   */\n  private static final class ProjectPackage implements ModuleKeyFactory {\n    public Optional<ModuleKey> create(URI uri) throws URISyntaxException {\n      if (uri.getScheme().equalsIgnoreCase(\"projectpackage\")) {\n        return Optional.of(ModuleKeys.projectpackage(uri));\n      }\n      return Optional.empty();\n    }\n  }\n\n  private static class FromServiceProviders {\n    private static final List<ModuleKeyFactory> INSTANCE;\n\n    static {\n      var loader = IoUtils.createServiceLoader(ModuleKeyFactory.class);\n      var factories = new ArrayList<ModuleKeyFactory>();\n      loader.forEach(factories::add);\n      INSTANCE = Collections.unmodifiableList(factories);\n    }\n  }\n\n  /** Represents a module from an external reader process. */\n  private static final class ExternalProcess implements ModuleKeyFactory {\n    private final String scheme;\n    private final ExternalReaderProcess process;\n    private final long evaluatorId;\n\n    @GuardedBy(\"this\")\n    private ExternalModuleResolver resolver;\n\n    ExternalProcess(String scheme, ExternalReaderProcess process, long evaluatorId) {\n      this.scheme = scheme;\n      this.process = process;\n      this.evaluatorId = evaluatorId;\n    }\n\n    private synchronized ExternalModuleResolver getResolver()\n        throws ExternalReaderProcessException {\n      if (resolver != null) {\n        return resolver;\n      }\n\n      resolver = process.getModuleResolver(evaluatorId);\n      return resolver;\n    }\n\n    public Optional<ModuleKey> create(URI uri) throws ExternalReaderProcessException, IOException {\n      if (!scheme.equalsIgnoreCase(uri.getScheme())) return Optional.empty();\n\n      var spec = process.getModuleReaderSpec(scheme);\n      if (spec == null) {\n        throw new ExternalReaderProcessException(\n            ErrorMessages.create(\"externalReaderDoesNotSupportScheme\", \"module\", scheme));\n      }\n\n      return Optional.of(ModuleKeys.externalResolver(uri, spec, getResolver()));\n    }\n\n    @Override\n    public void close() {\n      process.close();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ModuleKeyFactory.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Optional;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\n\n/** A factory for {@link ModuleKey}s. */\npublic interface ModuleKeyFactory extends AutoCloseable {\n  /**\n   * Returns a {@link ModuleKey} for the given absolute normalized URI, or {@code Optional.empty()}\n   * if this factory cannot handle the given URI.\n   *\n   * <p>Implementations must not perform any I/O related to the given URI. For example, they must\n   * not check if the module represented by the given URI exists. {@link\n   * org.pkl.core.SecurityManager} checks for the returned module will be performed by clients of\n   * this method.\n   *\n   * <p>Throws {@link URISyntaxException} if the given URI has invalid syntax.\n   *\n   * @param uri an absolute normalized URI\n   * @return a module key for the given URI\n   */\n  Optional<ModuleKey> create(URI uri)\n      throws URISyntaxException, ExternalReaderProcessException, IOException;\n\n  /**\n   * Closes this factory, releasing any resources held. See the documentation of factory methods in\n   * {@link ModuleKeyFactories} for which factories need to be closed.\n   */\n  @Override\n  default void close() {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ModuleKeys.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.JarURLConnection;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse.BodyHandlers;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Path;\nimport java.util.List;\nimport java.util.Map;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalModuleResolver;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.externalreader.ModuleReaderSpec;\nimport org.pkl.core.packages.Dependency;\nimport org.pkl.core.packages.Dependency.LocalDependency;\nimport org.pkl.core.packages.PackageAssetUri;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.HttpUtils;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Utilities for creating and using {@link ModuleKey}s. */\npublic final class ModuleKeys {\n  private ModuleKeys() {}\n\n  /**\n   * Tells if the given module is a standard library module. Standard library modules ship with the\n   * language and have a URI of the form {@code pkl:<simple module name>}.\n   */\n  public static boolean isStdLibModule(ModuleKey module) {\n    return module instanceof StandardLibrary;\n  }\n\n  /** Tells if the given module is the standard library module with URI {@code pkl:base}. */\n  @TruffleBoundary\n  public static boolean isBaseModule(ModuleKey module) {\n    return isStdLibModule(module) && module.getUri().getSchemeSpecificPart().equals(\"base\");\n  }\n\n  /**\n   * Creates a module key identified by the given URI and backed by the given source code. Shorthand\n   * for {@code synthetic(uri, uri, uri, sourceText, false}.\n   */\n  public static ModuleKey synthetic(URI uri, String sourceText) {\n    return new Synthetic(uri, uri, uri, sourceText, false);\n  }\n\n  /**\n   * Creates a module key identified by the given URI and backed by the given source code. Module\n   * imports will be resolved against the given {@code importBaseUri}. If {@code isCached} is {@code\n   * true}, the resulting module will be cached with {@code uri} and {@code resolvedUri} used as\n   * cache keys.\n   */\n  public static ModuleKey synthetic(\n      URI uri, URI importBaseUri, URI resolvedUri, String sourceText, boolean isCached) {\n    return new Synthetic(uri, importBaseUri, resolvedUri, sourceText, isCached);\n  }\n\n  /**\n   * Creates a module key for the standard library module with the given URI. The URI for a standard\n   * library module is {@code pkl:<simple module name>}. For example, the URI for the base library\n   * module is {@code pkl:base}.\n   */\n  public static ModuleKey standardLibrary(URI uri) {\n    return new StandardLibrary(uri);\n  }\n\n  /** Creates a module key for a {@code file:} module. */\n  public static ModuleKey file(URI uri) throws URISyntaxException {\n    return new File(uri);\n  }\n\n  /** Creates a module key for a {@code file:} module. */\n  public static ModuleKey file(Path path) {\n    try {\n      return new File(path.toAbsolutePath().toUri());\n    } catch (URISyntaxException e) {\n      // impossible, we started with a path to begin with.\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  /**\n   * Creates a module key for a {@code modulepath:} module to be resolved with the given resolver.\n   */\n  public static ModuleKey modulePath(URI uri, ModulePathResolver resolver) {\n    return new ModulePath(uri, resolver);\n  }\n\n  /**\n   * Creates a module key for a {@code modulepath:} module to be resolved with the given class\n   * loader.\n   */\n  public static ModuleKey classPath(URI uri, ClassLoader classLoader) {\n    return new ClassPath(uri, classLoader);\n  }\n\n  /** Creates a module key for the module with the given URL. */\n  public static ModuleKey genericUrl(URI url) {\n    return new GenericUrl(url);\n  }\n\n  /** Creates a module key for {@code http:} and {@code https:} uris. */\n  public static ModuleKey http(URI url) {\n    return new Http(url);\n  }\n\n  /** Creates a module key for the given package. */\n  public static ModuleKey pkg(URI uri) throws URISyntaxException {\n    var assetUri = new PackageAssetUri(uri);\n    return new Package(assetUri);\n  }\n\n  public static ModuleKey projectpackage(URI uri) throws URISyntaxException {\n    var assetUri = new PackageAssetUri(uri);\n    return new ProjectPackage(assetUri);\n  }\n\n  /** Creates a module key for an externally read module. */\n  public static ModuleKey externalResolver(\n      URI uri, ModuleReaderSpec spec, ExternalModuleResolver resolver) {\n    return new ExternalResolver(uri, spec, resolver);\n  }\n\n  /**\n   * Creates a module key that behaves like {@code delegate}, except that it returns {@code text} as\n   * its loaded source.\n   */\n  public static ModuleKey cached(ModuleKey delegate, String text) {\n    return new CachedModuleKey(delegate, text);\n  }\n\n  private static class CachedModuleKey implements ModuleKey, ResolvedModuleKey {\n    private final ModuleKey delegate;\n    private final String text;\n\n    public CachedModuleKey(ModuleKey delegate, String text) {\n      this.delegate = delegate;\n      this.text = text;\n    }\n\n    @Override\n    public ModuleKey getOriginal() {\n      return this;\n    }\n\n    @Override\n    public URI getUri() {\n      return delegate.getUri();\n    }\n\n    @Override\n    public String loadSource() {\n      return text;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager) {\n      return this;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() throws IOException, ExternalReaderProcessException {\n      return delegate.hasHierarchicalUris();\n    }\n\n    @Override\n    public boolean isLocal() {\n      return delegate.isLocal();\n    }\n\n    @Override\n    public boolean isGlobbable() throws IOException, ExternalReaderProcessException {\n      return delegate.isGlobbable();\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI uri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      return delegate.hasElement(securityManager, uri);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      return delegate.listElements(securityManager, baseUri);\n    }\n  }\n\n  private static class Synthetic implements ModuleKey {\n    final URI uri;\n    final URI importBaseUri;\n    final boolean isCached;\n    final ResolvedModuleKey resolvedKey;\n\n    Synthetic(URI uri, URI importBaseUri, URI resolvedUri, String sourceText, boolean isCached) {\n      this.uri = uri;\n      this.importBaseUri = importBaseUri;\n      this.isCached = isCached;\n      resolvedKey = ResolvedModuleKeys.virtual(this, resolvedUri, sourceText, isCached);\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return false;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      return resolvedKey;\n    }\n\n    @Override\n    public boolean isCached() {\n      return isCached;\n    }\n  }\n\n  private static class StandardLibrary implements ModuleKey, ResolvedModuleKey {\n    final URI uri;\n\n    StandardLibrary(URI uri) {\n      if (!uri.getScheme().equals(\"pkl\")) {\n        throw new IllegalArgumentException(\"Expected URI with scheme `pkl`, but got: \" + uri);\n      }\n      this.uri = uri;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return false;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      return this;\n    }\n\n    @Override\n    public ModuleKey getOriginal() {\n      return this;\n    }\n\n    @Override\n    public String loadSource() throws IOException {\n      return IoUtils.readClassPathResourceAsString(\n          getClass(), \"/org/pkl/core/stdlib/\" + uri.getSchemeSpecificPart() + \".pkl\");\n    }\n  }\n\n  private static class File implements ModuleKey {\n    final URI uri;\n\n    File(URI uri) throws URISyntaxException {\n      IoUtils.validateFileUri(uri);\n      this.uri = uri;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI uri)\n        throws SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      return FileResolver.hasElement(uri);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(baseUri);\n      return FileResolver.listElements(baseUri);\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      // Disallow paths that contain `\\\\` characters if on Windows\n      // (require `/` as the path separator on all OSes)\n      var uriPath = uri.getPath();\n      if (java.io.File.separatorChar == '\\\\' && uriPath != null && uriPath.contains(\"\\\\\")) {\n        throw new FileNotFoundException();\n      }\n      // Use resolveSecurePath to atomically resolve symlinks and verify under rootDir.\n      // The returned path is symlink-free, so it can be opened with NOFOLLOW_LINKS.\n      var securePath = securityManager.resolveSecurePath(uri);\n      Path realPath;\n      if (securePath != null) {\n        realPath = securePath;\n      } else {\n        realPath = IoUtils.pathOf(uri).toRealPath();\n      }\n      var resolvedUri = realPath.toUri();\n      securityManager.checkResolveModule(resolvedUri);\n      return ResolvedModuleKeys.file(this, resolvedUri, realPath, securePath != null);\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return true;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n  }\n\n  private static final class ModulePath implements ModuleKey {\n    final URI uri;\n    final ModulePathResolver resolver;\n\n    ModulePath(URI uri, ModulePathResolver resolver) {\n      if (uri.getPath() == null) {\n        throw new IllegalArgumentException(\n            ErrorMessages.create(\"invalidModuleUriMissingSlash\", uri, \"modulepath\"));\n      }\n\n      this.uri = uri;\n      this.resolver = resolver;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI uri)\n        throws SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      return resolver.hasElement(uri);\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n\n      var securePath = securityManager.resolveSecurePath(uri);\n      Path path;\n      if (securePath != null) {\n        path = securePath;\n      } else {\n        path = resolver.resolve(uri).toRealPath();\n      }\n      return ResolvedModuleKeys.file(this, path.toUri(), path, securePath != null);\n    }\n  }\n\n  private static final class ClassPath implements ModuleKey {\n    final URI uri;\n\n    final ClassLoader classLoader;\n\n    ClassPath(URI uri, ClassLoader classLoader) {\n      if (uri.getPath() == null) {\n        throw new IllegalArgumentException(\n            ErrorMessages.create(\"invalidModuleUriMissingSlash\", uri, \"modulepath\"));\n      }\n      this.uri = uri;\n      this.classLoader = classLoader;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager manager, URI uri) throws SecurityManagerException {\n      manager.checkResolveModule(uri);\n      var uriPath = uri.getPath();\n      assert uriPath.charAt(0) == '/';\n      return classLoader.getResource(uriPath.substring(1)) != null;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      var url = classLoader.getResource(getResourcePath());\n      if (url == null) throw new FileNotFoundException();\n      try {\n        return ResolvedModuleKeys.url(this, url.toURI(), url);\n      } catch (URISyntaxException e) {\n        throw new AssertionError(e);\n      }\n    }\n\n    private String getResourcePath() {\n      String path = uri.getPath();\n      assert path.charAt(0) == '/';\n      return path.substring(1);\n    }\n  }\n\n  private static class Http implements ModuleKey {\n    private final URI uri;\n\n    Http(URI uri) {\n      this.uri = uri;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      var httpClient = VmContext.get(null).getHttpClient();\n      var request = HttpRequest.newBuilder(uri).build();\n      var response = httpClient.send(request, BodyHandlers.ofInputStream());\n      try (var body = response.body()) {\n        HttpUtils.checkHasStatusCode200(response);\n        securityManager.checkResolveModule(response.uri());\n        String text = IoUtils.readString(body);\n        // intentionally use uri instead of response.uri()\n        return ResolvedModuleKeys.virtual(this, uri, text, true);\n      }\n    }\n  }\n\n  private static class GenericUrl implements ModuleKey {\n    final URI uri;\n\n    GenericUrl(URI uri) {\n      this.uri = uri;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(uri);\n      var url = IoUtils.toUrl(uri);\n      var conn = url.openConnection();\n      conn.connect();\n      if (conn instanceof JarURLConnection && IoUtils.isWindows()) {\n        // On Windows, opening a JarURLConnection prevents the jar file from being deleted, unless\n        // caching is disabled.\n        // See https://bugs.openjdk.org/browse/JDK-8239054\n        conn.setUseCaches(false);\n      }\n      try (InputStream stream = conn.getInputStream()) {\n        URI redirected;\n        try {\n          redirected = conn.getURL().toURI();\n        } catch (URISyntaxException e1) {\n          // should never happen because we started from a URI\n          throw new AssertionError(e1);\n        }\n        securityManager.checkResolveModule(redirected);\n        var text = IoUtils.readString(stream);\n        // intentionally use uri instead of redirected\n        return ResolvedModuleKeys.virtual(this, uri, text, true);\n      }\n    }\n  }\n\n  private abstract static class AbstractPackage implements ModuleKey {\n    protected final PackageAssetUri packageAssetUri;\n\n    AbstractPackage(PackageAssetUri packageAssetUri) {\n      this.packageAssetUri = packageAssetUri;\n    }\n\n    protected abstract Map<String, ? extends Dependency> getDependencies()\n        throws IOException, SecurityManagerException;\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean hasFragmentPaths() {\n      return true;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public URI getUri() {\n      return packageAssetUri.getUri();\n    }\n\n    @Override\n    public URI resolveUri(URI baseUri, URI importUri) throws IOException, SecurityManagerException {\n      var ssp = importUri.getSchemeSpecificPart();\n      if (importUri.isAbsolute() || !ssp.startsWith(\"@\")) {\n        return ModuleKey.super.resolveUri(baseUri, importUri);\n      }\n      var parsed = IoUtils.parseDependencyNotation(ssp);\n      var name = parsed.getFirst();\n      var path = parsed.getSecond();\n      var dependency = getDependencies().get(name);\n      if (dependency == null) {\n        throw new PackageLoadError(\n            \"cannotFindDependencyInPackage\",\n            name,\n            packageAssetUri.getPackageUri().getDisplayName());\n      }\n      return dependency.getPackageUri().toPackageAssetUri(path).getUri();\n    }\n  }\n\n  /** Represents a module imported via the {@code package} scheme. */\n  private static class Package extends AbstractPackage {\n\n    Package(PackageAssetUri packageAssetUri) {\n      super(packageAssetUri);\n    }\n\n    private PackageResolver getPackageResolver() {\n      var packageResolver = VmContext.get(null).getPackageResolver();\n      assert packageResolver != null;\n      return packageResolver;\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      var uri = packageAssetUri.getUri();\n      securityManager.checkResolveModule(uri);\n      var bytes =\n          getPackageResolver()\n              .getBytes(packageAssetUri, false, packageAssetUri.getPackageUri().getChecksums());\n      return ResolvedModuleKeys.virtual(this, uri, new String(bytes, StandardCharsets.UTF_8), true);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(baseUri);\n      var assetUri = PackageAssetUri.create(baseUri);\n      return getPackageResolver().listElements(assetUri, assetUri.getPackageUri().getChecksums());\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveModule(elementUri);\n      var assetUri = PackageAssetUri.create(elementUri);\n      return getPackageResolver().hasElement(assetUri, assetUri.getPackageUri().getChecksums());\n    }\n\n    @Override\n    protected Map<String, ? extends Dependency> getDependencies()\n        throws IOException, SecurityManagerException {\n      return getPackageResolver()\n          .getDependencyMetadata(\n              packageAssetUri.getPackageUri(), packageAssetUri.getPackageUri().getChecksums())\n          .getDependencies();\n    }\n  }\n\n  /**\n   * Represents a module imported via the {@code projectpackage} scheme.\n   *\n   * <p>The {@code projectpackage} scheme is what project-local dependencies resolve to when\n   * imported using dependency notation (for example, {@code import \"@foo/bar.pkl\"}). This scheme is\n   * an internal implementation detail, and we do not expect a module to declare this.\n   */\n  public static class ProjectPackage extends AbstractPackage {\n\n    ProjectPackage(PackageAssetUri packageAssetUri) {\n      super(packageAssetUri);\n    }\n\n    private PackageResolver getPackageResolver() {\n      var packageResolver = VmContext.get(null).getPackageResolver();\n      assert packageResolver != null;\n      return packageResolver;\n    }\n\n    private ProjectDependenciesManager getProjectDependenciesManager() {\n      var projectDepsManager = VmContext.get(null).getProjectDependenciesManager();\n      assert projectDepsManager != null;\n      return projectDepsManager;\n    }\n\n    private @Nullable URI getLocalUri(Dependency dependency) {\n      return getLocalUri(dependency, packageAssetUri);\n    }\n\n    private @Nullable URI getLocalUri(Dependency dependency, PackageAssetUri assetUri) {\n      if (!(dependency instanceof LocalDependency localDependency)) {\n        return null;\n      }\n      return localDependency.resolveAssetUri(\n          getProjectDependenciesManager().getProjectBaseUri(), assetUri);\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      var uri = packageAssetUri.getUri();\n      securityManager.checkResolveModule(uri);\n      var dependency =\n          getProjectDependenciesManager().getResolvedDependency(packageAssetUri.getPackageUri());\n      var local = getLocalUri(dependency);\n      if (local != null) {\n        var resolved =\n            VmContext.get(null).getModuleResolver().resolve(local).resolve(securityManager);\n        return ResolvedModuleKeys.delegated(resolved, this);\n      }\n      var dep = (Dependency.RemoteDependency) dependency;\n      assert dep.getChecksums() != null;\n      var bytes = getPackageResolver().getBytes(packageAssetUri, false, dep.getChecksums());\n      return ResolvedModuleKeys.virtual(this, uri, new String(bytes, StandardCharsets.UTF_8), true);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      securityManager.checkResolveModule(baseUri);\n      var packageAssetUri = PackageAssetUri.create(baseUri);\n      var dependency =\n          getProjectDependenciesManager().getResolvedDependency(packageAssetUri.getPackageUri());\n      var local = getLocalUri(dependency, packageAssetUri);\n      if (local != null) {\n        var moduleKey = VmContext.get(null).getModuleResolver().resolve(local);\n        if (!moduleKey.isGlobbable()) {\n          throw new PackageLoadError(\n              \"cannotResolveInLocalDependencyNotGlobbable\", local.getScheme());\n        }\n        return moduleKey.listElements(securityManager, local);\n      }\n      var dep = (Dependency.RemoteDependency) dependency;\n      assert dep.getChecksums() != null;\n      return getPackageResolver().listElements(packageAssetUri, dep.getChecksums());\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      securityManager.checkResolveModule(elementUri);\n      var packageAssetUri = PackageAssetUri.create(elementUri);\n      var dependency =\n          getProjectDependenciesManager().getResolvedDependency(packageAssetUri.getPackageUri());\n      var local = getLocalUri(dependency, packageAssetUri);\n      if (local != null) {\n        var moduleKey = VmContext.get(null).getModuleResolver().resolve(local);\n        if (!moduleKey.isGlobbable() && !moduleKey.isLocal()) {\n          throw new PackageLoadError(\n              \"cannotResolveInLocalDependencyNotGlobbableNorLocal\", local.getScheme());\n        }\n        return moduleKey.hasElement(securityManager, local);\n      }\n      var dep = (Dependency.RemoteDependency) dependency;\n      assert dep.getChecksums() != null;\n      return getPackageResolver().hasElement(packageAssetUri, dep.getChecksums());\n    }\n\n    @Override\n    protected Map<String, ? extends Dependency> getDependencies()\n        throws IOException, SecurityManagerException {\n      var packageUri = packageAssetUri.getPackageUri();\n      var projectResolver = getProjectDependenciesManager();\n      if (projectResolver.isLocalPackage(packageUri)) {\n        return projectResolver.getLocalPackageDependencies(packageUri);\n      }\n      var dep =\n          (Dependency.RemoteDependency)\n              getProjectDependenciesManager().getResolvedDependency(packageUri);\n      assert dep.getChecksums() != null;\n      var dependencyMetadata =\n          getPackageResolver().getDependencyMetadata(packageUri, dep.getChecksums());\n      return projectResolver.getResolvedDependenciesForPackage(packageUri, dependencyMetadata);\n    }\n  }\n\n  public static class ExternalResolver implements ModuleKey {\n\n    private final URI uri;\n    private final ModuleReaderSpec spec;\n    private final ExternalModuleResolver resolver;\n\n    ExternalResolver(URI uri, ModuleReaderSpec spec, ExternalModuleResolver resolver) {\n      this.uri = uri;\n      this.spec = spec;\n      this.resolver = resolver;\n    }\n\n    @Override\n    public boolean isLocal() {\n      return spec.isLocal();\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return spec.hasHierarchicalUris();\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return spec.isGlobbable();\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException {\n      return resolver.listElements(securityManager, baseUri);\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      var contents = resolver.resolveModule(securityManager, uri);\n      return ResolvedModuleKeys.virtual(this, uri, contents, true);\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws IOException, SecurityManagerException {\n      return resolver.hasElement(securityManager, elementUri);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ModulePathResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.*;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.pkl.core.module.PathElement.TreePathElement;\nimport org.pkl.core.runtime.FileSystemManager;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.LateInit;\n\n/**\n * Resolves {@code modulepath} URIs from ZIP or JAR files, or from directory paths.\n *\n * <p>NOTE: Do not initialize two resolvers for the same jar or zip file. Instead, share the same\n * resolver for that jar or zip file.\n */\npublic final class ModulePathResolver implements AutoCloseable {\n  private final Iterable<Path> modulePath;\n\n  private final Object lock = new Object();\n\n  @LateInit\n  @GuardedBy(\"lock\")\n  private Map<String, Path> fileCache;\n\n  @LateInit\n  @GuardedBy(\"lock\")\n  private List<FileSystem> zipFileSystems;\n\n  @LateInit\n  @GuardedBy(\"lock\")\n  private TreePathElement cachedPathElementRoot;\n\n  private @GuardedBy(\"lock\") boolean isClosed = false;\n\n  private static final ModulePathResolver EMPTY = new ModulePathResolver(Collections.emptyList());\n\n  public static ModulePathResolver empty() {\n    return EMPTY;\n  }\n\n  public ModulePathResolver(Iterable<Path> modulePath) {\n    this.modulePath = modulePath;\n  }\n\n  private void populateCaches() throws IOException {\n    fileCache = new HashMap<>();\n    zipFileSystems = new ArrayList<>();\n    cachedPathElementRoot = new TreePathElement(\"\", false);\n    for (var entry : modulePath) {\n      if (Files.isDirectory(entry)) {\n        populateFileCache(entry);\n      } else if (isJarOrZipFile(entry)) {\n        // Use the constructor that accepts a jar-file URI because\n        // this enables `Paths.get(\"jar:file...\")` API calls.\n        var zipFileSystem = FileSystemManager.getFileSystem(URI.create(\"jar:\" + entry.toUri()));\n        zipFileSystems.add(zipFileSystem);\n        for (var root : zipFileSystem.getRootDirectories()) {\n          populateFileCache(root);\n        }\n      }\n      // ignore\n    }\n  }\n\n  private Map<String, Path> getFileCache() throws IOException {\n    synchronized (lock) {\n      if (isClosed) {\n        throw new IllegalStateException(\"Module path loader has already been closed.\");\n      }\n\n      // create cache lazily so that we only pay the cost if/when a modulepath: URI is first\n      // resolved\n      if (fileCache == null) {\n        populateCaches();\n      }\n\n      return fileCache;\n    }\n  }\n\n  public Path resolve(URI uri) throws IOException {\n    var modulePath = getModulePath(uri);\n    var result = getFileCache().get(modulePath);\n    if (result != null) return result;\n\n    throw new FileNotFoundException();\n  }\n\n  public boolean hasElement(URI elementUri) {\n    var path = elementUri.getPath();\n    try {\n      assert path.charAt(0) == '/';\n      return getFileCache().containsKey(path.substring(1));\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n  }\n\n  @Override\n  public void close() {\n    synchronized (lock) {\n      if (isClosed || fileCache == null) return;\n\n      for (var fileSystem : zipFileSystems) {\n        try {\n          fileSystem.close();\n        } catch (IOException ignored) {\n        }\n      }\n      fileCache = null;\n      cachedPathElementRoot = null;\n      zipFileSystems = null;\n      isClosed = true;\n    }\n  }\n\n  private void populateFileCache(Path basePath) throws IOException {\n    try (var stream =\n        Files.find(\n            basePath,\n            Integer.MAX_VALUE,\n            // reduce file cache size by filtering out .class files\n            // (currently `read()` only supports text resources, no known use case for accessing\n            // .class files from Pkl code)\n            (path, attributes) ->\n                attributes.isRegularFile() && !path.toString().endsWith(\".class\"))) {\n      // in case of duplicate path, first entry wins (cf. class loader)\n      stream.forEach(\n          (path) -> {\n            var relativized = IoUtils.relativize(path, basePath);\n            fileCache.putIfAbsent(IoUtils.toNormalizedPathString(relativized), path);\n            var element = cachedPathElementRoot;\n            for (var i = 0; i < relativized.getNameCount(); i++) {\n              var name = relativized.getName(i).toString();\n              var isDirectory = i < (relativized.getNameCount() - 1);\n              element = element.putIfAbsent(name, new TreePathElement(name, isDirectory));\n            }\n          });\n    }\n  }\n\n  private static boolean isJarOrZipFile(Path path) {\n    if (!Files.isRegularFile(path)) return false;\n\n    if (path.endsWith(\".jar\") || path.endsWith(\".zip\")) return true;\n\n    byte[] buffer;\n    try (var fis = Files.newInputStream(path)) {\n      buffer = fis.readNBytes(39);\n    } catch (IOException e) {\n      return false;\n    }\n    // file starts with zip header\n    if (buffer[0] == 0x50 && buffer[1] == 0x4b && buffer[2] == 0x03 && buffer[3] == 0x04) {\n      return true;\n    }\n    // executable jar, e.g. jpkl\n    return Arrays.equals(\n        buffer, \"#!/bin/sh\\n      exec java  -jar $0 \\\"$@\\\"\".getBytes(StandardCharsets.UTF_8));\n  }\n\n  private static String getModulePath(URI moduleUri) {\n    var path = moduleUri.getPath();\n    assert path.charAt(0) == '/';\n    return path.substring(1);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/PathElement.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Objects;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\npublic class PathElement {\n  public static final Comparator<PathElement> comparator =\n      (o1, o2) -> {\n        if (o1.isDirectory && !o2.isDirectory) {\n          return 1;\n        } else if (!o1.isDirectory && o2.isDirectory) {\n          return -1;\n        }\n        return o1.name.compareTo(o2.name);\n      };\n\n  private final String name;\n\n  private final boolean isDirectory;\n\n  public static PathElement opaque(String name) {\n    return new PathElement(name, false);\n  }\n\n  public PathElement(String name, boolean isDirectory) {\n    this.name = name;\n    this.isDirectory = isDirectory;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public PathElement withName(String name) {\n    if (name.equals(this.name)) {\n      return this;\n    }\n    return new PathElement(name, isDirectory);\n  }\n\n  public boolean isDirectory() {\n    return isDirectory;\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof PathElement other)) return false;\n    return isDirectory == other.isDirectory && name.equals(other.name);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(getName(), isDirectory());\n  }\n\n  @Override\n  public String toString() {\n    return \"PathElement{\" + \"name='\" + name + '\\'' + \", isDirectory=\" + isDirectory + '}';\n  }\n\n  public static final class TreePathElement extends PathElement {\n    private final EconomicMap<String, TreePathElement> children = EconomicMaps.create();\n\n    public TreePathElement(String name, boolean isDirectory) {\n      super(name, isDirectory);\n    }\n\n    public TreePathElement putIfAbsent(String name, TreePathElement child) {\n      children.putIfAbsent(name, child);\n      return children.get(name);\n    }\n\n    /** Returns the element at path {@code basePath}, given a {@link Path}. */\n    public @Nullable TreePathElement getElement(Path basePath) {\n      var path = basePath.normalize();\n      var element = this;\n      for (var i = 0; i < path.getNameCount(); i++) {\n        var part = path.getName(i).toString();\n        element = element.getChildren().get(part);\n        if (element == null) {\n          return null;\n        }\n      }\n      return element;\n    }\n\n    /** Returns the element at path {@code basePath}, given a path string. */\n    public @Nullable TreePathElement getElement(String basePath) {\n      return getElement(Path.of(basePath));\n    }\n\n    public EconomicMap<String, TreePathElement> getChildren() {\n      return children;\n    }\n\n    public List<PathElement> getChildrenValues() {\n      var ret = new ArrayList<PathElement>(children.size());\n      for (var elem : EconomicMaps.getValues(children)) {\n        ret.add(elem);\n      }\n      return ret;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ProjectDependenciesManager.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Objects;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.packages.Dependency;\nimport org.pkl.core.packages.DependencyMetadata;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.project.CanonicalPackageUri;\nimport org.pkl.core.project.DeclaredDependencies;\nimport org.pkl.core.project.ProjectDeps;\nimport org.pkl.core.runtime.ModuleResolver;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.json.Json.JsonParseException;\n\npublic final class ProjectDependenciesManager {\n  public static final String PKL_PROJECT_FILENAME = \"PklProject\";\n\n  public static final String PKL_PROJECT_DEPS_FILENAME = \"PklProject.deps.json\";\n\n  private final DeclaredDependencies declaredDependencies;\n  private final URI projectBaseUri;\n  private final ModuleResolver moduleResolver;\n  private final SecurityManager securityManager;\n\n  @GuardedBy(\"lock\")\n  private ProjectDeps projectDeps;\n\n  @GuardedBy(\"lock\")\n  private Map<String, Dependency> myDependencies = null;\n\n  @GuardedBy(\"lock\")\n  private final EconomicMap<PackageUri, Map<String, Dependency>> localPackageDependencies =\n      EconomicMaps.create();\n\n  @GuardedBy(\"lock\")\n  private final EconomicMap<PackageUri, Map<String, Dependency>> packageDependencies =\n      EconomicMaps.create();\n\n  private final Object lock = new Object();\n\n  public ProjectDependenciesManager(\n      DeclaredDependencies declaredDependencies,\n      ModuleResolver moduleResolver,\n      SecurityManager securityManager) {\n    this.declaredDependencies = declaredDependencies;\n    // new URI(\"scheme://host/a/b/c.txt\").resolve(\".\") == new URI(\"scheme://host/a/b/\")\n    this.projectBaseUri = IoUtils.resolve(declaredDependencies.projectFileUri(), \".\");\n    this.moduleResolver = moduleResolver;\n    this.securityManager = securityManager;\n  }\n\n  public boolean hasUri(URI uri) {\n    return projectBaseUri.getScheme().equals(uri.getScheme())\n        && Objects.equals(projectBaseUri.getAuthority(), uri.getAuthority())\n        && uri.getPath().startsWith(projectBaseUri.getPath());\n  }\n\n  private void ensureDependenciesInitialized() {\n    synchronized (lock) {\n      if (myDependencies != null) {\n        return;\n      }\n      var projectDeps = getProjectDeps();\n      myDependencies = doBuildResolvedDependenciesForProject(declaredDependencies, projectDeps);\n      for (var localPkg : declaredDependencies.localDependencies().values()) {\n        ensureLocalProjectDependencyInitialized(localPkg, projectDeps);\n      }\n    }\n  }\n\n  private void ensureLocalProjectDependencyInitialized(\n      DeclaredDependencies localProjectDependencies, ProjectDeps projectDeps) {\n    // turn `package:` scheme into `projectpackage`: scheme\n    var uri = PackageUri.create(\"project\" + localProjectDependencies.myPackageUri());\n    if (localPackageDependencies.containsKey(uri)) {\n      return;\n    }\n    var resolvedDeps = doBuildResolvedDependenciesForProject(localProjectDependencies, projectDeps);\n    localPackageDependencies.put(uri, resolvedDeps);\n    // TODO: check circular imports (should not be possible)\n    for (var declaredDeps : localProjectDependencies.localDependencies().values()) {\n      ensureLocalProjectDependencyInitialized(declaredDeps, projectDeps);\n    }\n  }\n\n  private void checkProjectDependencyOutOfDate(\n      URI projectFileUri, PackageUri declaredPackage, Dependency resolvedDependency) {\n    if (resolvedDependency.getVersion().compareTo(declaredPackage.getVersion()) < 0) {\n      throw new PackageLoadError(\n          \"projectDependenciesOutOfDateInProject\",\n          projectFileUri,\n          declaredPackage.getDisplayName(),\n          resolvedDependency.getPackageUri().getDisplayName());\n    }\n  }\n\n  private Map<String, Dependency> doBuildResolvedDependenciesForProject(\n      DeclaredDependencies declaredDeps, ProjectDeps resolvedProjectDeps) {\n    var ret =\n        new HashMap<String, Dependency>(\n            declaredDeps.remoteDependencies().size() + declaredDeps.localDependencies().size());\n    for (var entry : declaredDeps.localDependencies().entrySet()) {\n      var localDeclaredDependencies = entry.getValue();\n      var packageUri = localDeclaredDependencies.myPackageUri();\n      assert packageUri != null;\n      var canonicalPackageUri =\n          CanonicalPackageUri.fromPackageUri(localDeclaredDependencies.myPackageUri());\n      var resolvedDep = resolvedProjectDeps.get(canonicalPackageUri);\n      if (resolvedDep == null) {\n        throw new PackageLoadError(\"unresolvedProjectDependency\", packageUri);\n      }\n      checkProjectDependencyOutOfDate(declaredDeps.projectFileUri(), packageUri, resolvedDep);\n      ret.put(entry.getKey(), resolvedDep);\n    }\n    for (var entry : declaredDeps.remoteDependencies().entrySet()) {\n      var remoteDep = entry.getValue();\n      var packageUri = CanonicalPackageUri.fromPackageUri(remoteDep.getPackageUri());\n      var resolvedDep = resolvedProjectDeps.get(packageUri);\n      if (resolvedDep == null) {\n        throw new PackageLoadError(\"unresolvedProjectDependency\", entry.getValue().getPackageUri());\n      }\n      checkProjectDependencyOutOfDate(\n          declaredDeps.projectFileUri(), remoteDep.getPackageUri(), resolvedDep);\n      ret.put(entry.getKey(), resolvedDep);\n    }\n    return ret;\n  }\n\n  public Map<String, Dependency> getDependencies() {\n    ensureDependenciesInitialized();\n    return myDependencies;\n  }\n\n  public boolean isLocalPackage(PackageUri packageUri) {\n    ensureDependenciesInitialized();\n    return localPackageDependencies.containsKey(packageUri);\n  }\n\n  public Map<String, Dependency> getLocalPackageDependencies(PackageUri packageUri) {\n    ensureDependenciesInitialized();\n    var dep = localPackageDependencies.get(packageUri);\n    assert dep != null;\n    return dep;\n  }\n\n  public Map<String, Dependency> getResolvedDependenciesForPackage(\n      PackageUri packageUri, DependencyMetadata dependencyMetadata) {\n    synchronized (lock) {\n      if (!packageDependencies.containsKey(packageUri)) {\n        var declaredDependencies = dependencyMetadata.getDependencies();\n        var resolvedDeps = new HashMap<String, Dependency>(declaredDependencies.size());\n        for (var entry : declaredDependencies.entrySet()) {\n          var packageDependency = entry.getValue();\n          var canonicalPackage =\n              CanonicalPackageUri.fromPackageUri(packageDependency.getPackageUri());\n          var resolvedDep = projectDeps.get(canonicalPackage);\n          if (resolvedDep == null) {\n            throw new PackageLoadError(\"unresolvedProjectDependency\", packageDependency);\n          }\n          if (resolvedDep.getVersion().compareTo(packageDependency.getVersion()) < 0) {\n            throw new PackageLoadError(\n                \"projectDependenciesOutOfDateInPackage\",\n                packageUri.getDisplayName(),\n                packageDependency.getPackageUri().getDisplayName(),\n                resolvedDep.getPackageUri().getDisplayName());\n          }\n          resolvedDeps.put(entry.getKey(), resolvedDep);\n        }\n        packageDependencies.put(packageUri, resolvedDeps);\n      }\n      return packageDependencies.get(packageUri);\n    }\n  }\n\n  public DeclaredDependencies getDeclaredDependencies() {\n    return declaredDependencies;\n  }\n\n  public Dependency getResolvedDependency(PackageUri packageUri) {\n    var dep = getProjectDeps().get(CanonicalPackageUri.fromPackageUri(packageUri));\n    if (dep == null) {\n      throw new PackageLoadError(\"unresolvedProjectDependency\", packageUri);\n    }\n    return dep;\n  }\n\n  public URI getProjectBaseUri() {\n    return projectBaseUri;\n  }\n\n  public URI getProjectDepsFileUri() {\n    return IoUtils.resolve(projectBaseUri, PKL_PROJECT_DEPS_FILENAME);\n  }\n\n  public URI getProjectFileUri() {\n    return declaredDependencies.projectFileUri();\n  }\n\n  private ProjectDeps getProjectDeps() {\n    synchronized (lock) {\n      if (projectDeps == null) {\n        var depsUri = getProjectDepsFileUri();\n        var moduleKey = moduleResolver.resolve(depsUri);\n        try {\n          // treat PklProject.deps.json as a module read, rather than introduce a new API.\n          var depsJson = moduleKey.resolve(securityManager).loadSource();\n          projectDeps = ProjectDeps.parse(depsJson);\n        } catch (IOException e) {\n          throw new VmExceptionBuilder()\n              .evalError(\"cannotLoadProjectDepsJson\", depsUri)\n              .withCause(e)\n              .withHint(e.getMessage() != null ? e.getMessage() : (\"Encountered error: \" + e))\n              .build();\n        } catch (JsonParseException e) {\n          throw new VmExceptionBuilder()\n              .evalError(\"invalidProjectDepsJson\", depsUri, e.getMessage())\n              .build();\n        } catch (SecurityManagerException e) {\n          throw PklBugException.unreachableCode();\n        }\n      }\n      return projectDeps;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ResolvedModuleKey.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport org.pkl.core.SecurityManager;\n\n/** SPI for identifying a resolved module and loading its source code. */\npublic interface ResolvedModuleKey {\n  ModuleKey getOriginal();\n\n  /**\n   * Returns the URI of the resolved module. This URI identifies the location that the module's\n   * source code will be loaded from. If {@link ModuleKey#isCached()} is {@code true}, this URI will\n   * also be used as a cache key for the module.\n   */\n  URI getUri();\n\n  /**\n   * Loads module(s) from {@link #getUri()}. All necessary {@link SecurityManager} checks have\n   * already been performed before invoking this method.\n   *\n   * <p>In some cases, a module's source code is already loaded as part of resolving the module,\n   * typically for performance reasons. In such a case, this method will not need to perform any\n   * additional I/O.\n   *\n   * @throws IOException if an I/O error occurs while loading the source code\n   */\n  String loadSource() throws IOException;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/ResolvedModuleKeys.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URL;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.AccessDeniedException;\nimport java.nio.file.Files;\nimport java.nio.file.LinkOption;\nimport java.nio.file.Path;\nimport org.pkl.core.util.IoUtils;\n\n/** Utilities for obtaining and using resolved module keys. */\npublic final class ResolvedModuleKeys {\n  private ResolvedModuleKeys() {}\n\n  /**\n   * Creates a resolved module key backed by the given file path. The resulting module will be\n   * loaded from that file path and cached using the given URI as cache key.\n   *\n   * @param nofollow if true, the file will be opened with {@link LinkOption#NOFOLLOW_LINKS}.\n   */\n  public static ResolvedModuleKey file(ModuleKey original, URI uri, Path path, boolean nofollow) {\n    return new FileKey(original, uri, path, nofollow);\n  }\n\n  /**\n   * Creates a resolved module key backed by the given file path. The resulting module will be\n   * loaded from that file path and cached using the given URI as cache key.\n   */\n  public static ResolvedModuleKey file(ModuleKey original, URI uri, Path path) {\n    return new FileKey(original, uri, path, false);\n  }\n\n  /**\n   * Creates a resolved module key backed by the given URL. The resulting module will be loaded from\n   * that URL and cached using the given URI as cache key.\n   */\n  public static ResolvedModuleKey url(ModuleKey original, URI uri, URL url) {\n    return new Url(original, uri, url);\n  }\n\n  /**\n   * Creates a resolved module key backed by the given source code. If {@code cached} is {@code\n   * true}, the resulting module will be cached using the given URI as cache key.\n   */\n  public static ResolvedModuleKey virtual(\n      ModuleKey original, URI uri, String sourceText, boolean cached) {\n    return new Virtual(original, uri, sourceText, cached);\n  }\n\n  /**\n   * Creates a resolved module key that behaves like {@code delegate}, except with {@code original}\n   * as its original module key.\n   */\n  public static ResolvedModuleKey delegated(ResolvedModuleKey delegate, ModuleKey original) {\n    return new Delegated(delegate, original);\n  }\n\n  private static class FileKey implements ResolvedModuleKey {\n    final ModuleKey original;\n    final URI uri;\n    final Path path;\n    final boolean nofollow;\n\n    FileKey(ModuleKey original, URI uri, Path path, boolean nofollow) {\n      this.original = original;\n      this.uri = uri;\n      this.path = path;\n      this.nofollow = nofollow;\n    }\n\n    @Override\n    public ModuleKey getOriginal() {\n      return original;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public String loadSource() throws IOException {\n      try {\n        if (nofollow) {\n          try (var in = Files.newInputStream(path, LinkOption.NOFOLLOW_LINKS)) {\n            return new String(in.readAllBytes(), StandardCharsets.UTF_8);\n          }\n        }\n        return Files.readString(path, StandardCharsets.UTF_8);\n      } catch (AccessDeniedException e) {\n        // Windows throws `AccessDeniedException` when reading directories.\n        // Sync error between different OSes.\n        if (Files.isDirectory(path)) {\n          throw new IOException(\"Is a directory\");\n        }\n        throw e;\n      }\n    }\n  }\n\n  private static class Url implements ResolvedModuleKey {\n    final ModuleKey original;\n    final URI uri;\n    final URL url;\n\n    Url(ModuleKey original, URI uri, URL url) {\n      this.original = original;\n      this.uri = uri;\n      this.url = url;\n    }\n\n    @Override\n    public ModuleKey getOriginal() {\n      return original;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public String loadSource() throws IOException {\n      return IoUtils.readString(url);\n    }\n  }\n\n  private static class Virtual implements ResolvedModuleKey {\n    final ModuleKey original;\n    final URI uri;\n    final String sourceText;\n    final boolean cached;\n\n    Virtual(ModuleKey original, URI uri, String sourceText, boolean cached) {\n      this.original = original;\n      this.uri = uri;\n      this.sourceText = sourceText;\n      this.cached = cached;\n    }\n\n    @Override\n    public ModuleKey getOriginal() {\n      return original;\n    }\n\n    @Override\n    public URI getUri() {\n      return uri;\n    }\n\n    @Override\n    public String loadSource() {\n      return sourceText;\n    }\n  }\n\n  private static class Delegated implements ResolvedModuleKey {\n\n    private final ResolvedModuleKey delegate;\n    private final ModuleKey original;\n\n    Delegated(ResolvedModuleKey delegate, ModuleKey original) {\n      this.delegate = delegate;\n      this.original = original;\n    }\n\n    @Override\n    public ModuleKey getOriginal() {\n      return original;\n    }\n\n    @Override\n    public URI getUri() {\n      return delegate.getUri();\n    }\n\n    @Override\n    public String loadSource() throws IOException {\n      return delegate.loadSource();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/module/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.module;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/Checksums.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.util.Objects;\nimport org.pkl.core.util.Nullable;\n\npublic final class Checksums {\n  private final String sha256;\n\n  @Override\n  public String toString() {\n    return \"pkl.Project#Checksums {sha256='\" + sha256 + \"'}\";\n  }\n\n  public Checksums(String sha256) {\n    this.sha256 = sha256;\n  }\n\n  public String getSha256() {\n    return sha256;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Checksums that = (Checksums) o;\n    return sha256.equals(that.sha256);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(getSha256());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/Dependency.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.util.Objects;\nimport org.pkl.core.Version;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class Dependency {\n\n  protected final PackageUri packageUri;\n\n  Dependency(PackageUri packageUri) {\n    this.packageUri = packageUri;\n  }\n\n  public PackageUri getPackageUri() {\n    return packageUri;\n  }\n\n  public Version getVersion() {\n    return packageUri.getVersion();\n  }\n\n  public static final class LocalDependency extends Dependency {\n    private final Path path;\n\n    public LocalDependency(PackageUri packageUri, Path path) {\n      super(packageUri);\n      this.path = path;\n    }\n\n    public Path getPath() {\n      return path;\n    }\n\n    public URI resolveAssetUri(URI projectBaseUri, PackageAssetUri packageAssetUri) {\n      // drop 1 to remove leading `/`\n      var assetPath = packageAssetUri.getAssetPath().substring(1);\n      return projectBaseUri.resolve(IoUtils.toNormalizedPathString(path.resolve(assetPath)));\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (this == o) {\n        return true;\n      }\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      LocalDependency that = (LocalDependency) o;\n      return packageUri.equals(that.packageUri) && path.equals(that.path);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(packageUri, path);\n    }\n\n    @Override\n    public String toString() {\n      return \"LocalDependency{\" + \"path=\" + path + \", packageUri=\" + packageUri + '}';\n    }\n  }\n\n  /** Java representation of {@code pkl.Project#RemoteDependency}. */\n  public static final class RemoteDependency extends Dependency {\n    private @Nullable Checksums checksums;\n\n    public RemoteDependency(PackageUri packageUri, @Nullable Checksums checksums) {\n      super(packageUri);\n      this.checksums = checksums;\n    }\n\n    public @Nullable Checksums getChecksums() {\n      return checksums;\n    }\n\n    public void setChecksums(Checksums checksums) {\n      this.checksums = checksums;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (this == o) {\n        return true;\n      }\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      RemoteDependency that = (RemoteDependency) o;\n      return packageUri.equals(that.packageUri) && Objects.equals(checksums, that.checksums);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(packageUri, checksums);\n    }\n\n    @Override\n    public String toString() {\n      return \"RemoteDependency{\" + \"checksums=\" + checksums + \", packageUri=\" + packageUri + '}';\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/DependencyMetadata.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.pkl.core.DataSize;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.Duration;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PNull;\nimport org.pkl.core.PObject;\nimport org.pkl.core.Pair;\nimport org.pkl.core.PklException;\nimport org.pkl.core.Version;\nimport org.pkl.core.packages.Dependency.RemoteDependency;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.json.Json;\nimport org.pkl.core.util.json.Json.FormatException;\nimport org.pkl.core.util.json.Json.JsArray;\nimport org.pkl.core.util.json.Json.JsObject;\nimport org.pkl.core.util.json.Json.JsonParseException;\nimport org.pkl.core.util.json.Json.MissingFieldException;\nimport org.pkl.core.util.json.JsonWriter;\n\n/**\n * Java representation of a package's dependency metadata.\n *\n * <p>Sample metadata:\n *\n * <pre>\n *   <code>\n *     {\n *       \"name\": \"my-proj-name\",\n *       \"packageUri\": \"package://example.com/my-proj-name@0.5.3\",\n *       \"version\": \"0.5.3\",\n *       \"packageZipChecksums\": {\n *         \"sha256\": \"abc123\",\n *       }\n *       \"packageZipUrl\": \"https://example.com/foo/bar@0.5.3.zip\",\n *       \"sourceCodeUrlScheme\": \"https://github.com/foo/bar/blob/v0.5.3/%{path}#L%{line}-L%{endLine}\",\n *       \"documentation\": \"https://my/docs\",\n *       \"description\": \"The description for my package\",\n *       \"issueTracker\": \"https://example.com/my/issues\",\n *       \"sourceCode\": \"https://github.com/foo/bar\",\n *       \"license\": \"Apache-2\",\n *       \"dependencies\": {\n *         \"foo\": {\n *           \"uri\": \"package://example.com/foo@0.5.3\",\n *           \"checksums\": {\n *             \"sha256\": \"abc123\"\n *           }\n *         }\n *       },\n *       \"annotations\": [\n *         {\n *           \"moduleName\": \"pkl.base\",\n *           \"class\": \"Unlisted\",\n *           \"moduleUri\": \"pkl:base\",\n *           \"properties\": {}\n *         },\n *         {\n *           \"moduleName\": \"pkl.base\",\n *           \"class\": \"Deprecated\",\n *           \"moduleUri\": \"pkl:base\",\n *           \"properties\": {\n *             \"since\": \"0.26.1\",\n *             \"message\": \"don't use\",\n *             \"replaceWith\": null\n *           }\n *         }\n *       ]\n *     }\n *   </code>\n * </pre>\n */\n@SuppressWarnings({\"JavadocLinkAsPlainText\", \"unused\"})\n// incorrectly thinks link within sample metadata is a JavaDoc link\npublic final class DependencyMetadata {\n\n  public static DependencyMetadata parse(String input) throws JsonParseException {\n    var parsed = Json.parseObject(input);\n    var name = parsed.getString(\"name\");\n    var packageUri = parsed.get(\"packageUri\", (it) -> new PackageUri((String) it));\n    var version = parsed.getVersion(\"version\");\n    var packageZipUrl = parsed.getURI(\"packageZipUrl\");\n    var packageZipChecksums = parsed.get(\"packageZipChecksums\", DependencyMetadata::parseChecksums);\n    var dependencies = parsed.get(\"dependencies\", DependencyMetadata::parseDependencies);\n    var sourceCodeUrlScheme = parsed.getStringOrNull(\"sourceCodeUrlScheme\");\n    var sourceCode = parsed.getURIOrNull(\"sourceCode\");\n    var documentation = parsed.getURIOrNull(\"documentation\");\n    var license = parsed.getStringOrNull(\"license\");\n    var licenseText = parsed.getStringOrNull(\"licenseText\");\n    var authors = parsed.getNullable(\"authors\", DependencyMetadata::parseAuthors);\n    var issueTracker = parsed.getURIOrNull(\"issueTracker\");\n    var description = parsed.getStringOrNull(\"description\");\n    var annotations = parsed.getNullable(\"annotations\", DependencyMetadata::parseAnnotations);\n    if (annotations == null) annotations = List.of();\n    return new DependencyMetadata(\n        name,\n        packageUri,\n        version,\n        packageZipUrl,\n        packageZipChecksums,\n        dependencies,\n        sourceCodeUrlScheme,\n        sourceCode,\n        documentation,\n        license,\n        licenseText,\n        authors,\n        issueTracker,\n        description,\n        annotations);\n  }\n\n  private static Map<String, RemoteDependency> parseDependencies(Object deps)\n      throws JsonParseException {\n    if (!(deps instanceof JsObject dependencies)) {\n      throw new FormatException(\"object\", deps.getClass());\n    }\n    var ret = new HashMap<String, RemoteDependency>(dependencies.size());\n    for (var key : dependencies.keySet()) {\n      var remoteDependency =\n          dependencies.get(\n              key,\n              (dep) -> {\n                if (!(dep instanceof JsObject obj)) {\n                  throw new FormatException(\"object\", dep.getClass());\n                }\n                var checksums = obj.get(\"checksums\", DependencyMetadata::parseChecksums);\n                var packageUri = obj.get(\"uri\", PackageUtils::parsePackageUriWithoutChecksums);\n                return new RemoteDependency(packageUri, checksums);\n              });\n      ret.put(key, remoteDependency);\n    }\n    return ret;\n  }\n\n  private static List<PObject> parseAnnotations(Object ann)\n      throws JsonParseException, URISyntaxException {\n    if (!(ann instanceof JsArray arr)) {\n      throw new FormatException(\"array\", ann.getClass());\n    }\n    var annotations = new ArrayList<PObject>(arr.size());\n    for (var annotation : arr) {\n      var obj = parsePObject(annotation);\n      if (!(obj instanceof PObject pObject)) {\n        throw new PklException(\"Could not read annotation. Invalid object: \" + obj);\n      }\n      annotations.add(pObject);\n    }\n    return annotations;\n  }\n\n  private static Object parsePObject(@Nullable Object obj)\n      throws JsonParseException, URISyntaxException {\n    if (obj == null) {\n      return PNull.getInstance();\n    } else if (obj instanceof String string) {\n      return string;\n    } else if (obj instanceof Boolean bool) {\n      return bool;\n    } else if (obj instanceof Integer integer) {\n      return integer.longValue();\n    } else if (obj instanceof Long aLong) {\n      return aLong;\n    } else if (obj instanceof Float aFloat) {\n      return aFloat.doubleValue();\n    } else if (obj instanceof Double aDouble) {\n      return aDouble;\n    } else if (obj instanceof JsArray array) {\n      var list = new ArrayList<>(array.size());\n      for (var element : array) {\n        list.add(parsePObject(element));\n      }\n      return list;\n    } else if (obj instanceof JsObject jsObj) {\n      var type = jsObj.getString(\"type\");\n      switch (type) {\n        case \"Set\" -> {\n          var value = jsObj.getArray(\"value\");\n          var set = new HashSet<>(value.size());\n          for (var element : value) {\n            set.add(parsePObject(element));\n          }\n          return set;\n        }\n        case \"Map\" -> {\n          var value = jsObj.getArray(\"value\");\n          var map = new HashMap<>();\n          for (var kv : value) {\n            var kvObj = (JsObject) kv;\n            map.put(parsePObject(kvObj.get(\"key\")), parsePObject(kvObj.get(\"value\")));\n          }\n          return map;\n        }\n        case \"PObject\" -> {\n          var classInfoObj = jsObj.getObject(\"classInfo\");\n          var moduleName = classInfoObj.getString(\"moduleName\");\n          var className = classInfoObj.getString(\"class\");\n          var moduleUri = classInfoObj.getString(\"moduleUri\");\n          var props = jsObj.getObject(\"properties\");\n          var classInfo = PClassInfo.get(moduleName, className, new URI(moduleUri));\n          var properties = new HashMap<String, Object>();\n          for (var kv : props.entrySet()) {\n            properties.put(kv.getKey(), parsePObject(kv.getValue()));\n          }\n          return new PObject(classInfo, properties);\n        }\n        case \"Pattern\" -> {\n          var value = jsObj.getString(\"value\");\n          return Pattern.compile(value);\n        }\n        case \"DataSize\" -> {\n          var symbol = jsObj.getString(\"unit\");\n          var value = jsObj.get(\"value\");\n          if (value == null) {\n            throw new MissingFieldException(jsObj, \"value\");\n          }\n          var unit = DataSizeUnit.parse(symbol);\n          if (unit == null) {\n            throw new PklException(\"Invalid DataSize unit symbol: \" + symbol);\n          }\n          if (!(value instanceof Double num)) {\n            throw new FormatException(\"double\", value.getClass());\n          }\n          return new DataSize(num, unit);\n        }\n        case \"Duration\" -> {\n          var symbol = jsObj.getString(\"unit\");\n          var value = jsObj.get(\"value\");\n          if (value == null) {\n            throw new MissingFieldException(jsObj, \"value\");\n          }\n          var unit = DurationUnit.parse(symbol);\n          if (unit == null) {\n            throw new PklException(\"Invalid Duration unit symbol: \" + symbol);\n          }\n          if (!(value instanceof Double num)) {\n            throw new FormatException(\"double\", value.getClass());\n          }\n          return new Duration(num, unit);\n        }\n        case \"Pair\" -> {\n          var first = parsePObject(jsObj.get(\"first\"));\n          var second = parsePObject(jsObj.get(\"second\"));\n          return new Pair<>(first, second);\n        }\n      }\n    }\n    // should never be reached\n    throw new PklException(\"Could not read annotation. Invalid object type: \" + obj.getClass());\n  }\n\n  public static Checksums parseChecksums(Object obj) throws JsonParseException {\n    if (!(obj instanceof JsObject jsObj)) {\n      throw new FormatException(\"object\", obj.getClass());\n    }\n    var sha256 = jsObj.getString(\"sha256\");\n    return new Checksums(sha256);\n  }\n\n  public static List<String> parseAuthors(Object obj) throws JsonParseException {\n    if (!(obj instanceof JsArray arr)) {\n      throw new FormatException(\"array\", obj.getClass());\n    }\n    var ret = new ArrayList<String>(arr.size());\n    for (var elem : arr) {\n      if (!(elem instanceof String string)) {\n        throw new FormatException(\"string\", elem.getClass());\n      }\n      ret.add(string);\n    }\n    return ret;\n  }\n\n  private final String name;\n  private final PackageUri packageUri;\n  private final Version version;\n  private final URI packageZipUrl;\n  private final Checksums packageZipChecksums;\n  private final Map<String, RemoteDependency> dependencies;\n  private final @Nullable String sourceCodeUrlScheme;\n  private final @Nullable URI sourceCode;\n  private final @Nullable URI documentation;\n  private final @Nullable String license;\n  private final @Nullable String licenseText;\n  private final @Nullable List<String> authors;\n  private final @Nullable URI issueTracker;\n  private final @Nullable String description;\n  private final List<PObject> annotations;\n\n  public DependencyMetadata(\n      String name,\n      PackageUri packageUri,\n      Version version,\n      URI packageZipUrl,\n      Checksums packageZipChecksums,\n      Map<String, RemoteDependency> dependencies,\n      @Nullable String sourceCodeUrlScheme,\n      @Nullable URI sourceCode,\n      @Nullable URI documentation,\n      @Nullable String license,\n      @Nullable String licenseText,\n      @Nullable List<String> authors,\n      @Nullable URI issueTracker,\n      @Nullable String description,\n      List<PObject> annotations) {\n    this.name = name;\n    this.packageUri = packageUri;\n    this.version = version;\n    this.packageZipUrl = packageZipUrl;\n    this.packageZipChecksums = packageZipChecksums;\n    this.dependencies = dependencies;\n    this.sourceCodeUrlScheme = sourceCodeUrlScheme;\n    this.sourceCode = sourceCode;\n    this.documentation = documentation;\n    this.license = license;\n    this.licenseText = licenseText;\n    this.authors = authors;\n    this.issueTracker = issueTracker;\n    this.description = description;\n    this.annotations = annotations;\n  }\n\n  public String getName() {\n    return name;\n  }\n\n  public Version getVersion() {\n    return version;\n  }\n\n  public URI getPackageZipUrl() {\n    return packageZipUrl;\n  }\n\n  public Checksums getPackageZipChecksums() {\n    return packageZipChecksums;\n  }\n\n  public Map<String, RemoteDependency> getDependencies() {\n    return dependencies;\n  }\n\n  public @Nullable String getSourceCodeUrlScheme() {\n    return sourceCodeUrlScheme;\n  }\n\n  public @Nullable URI getSourceCode() {\n    return sourceCode;\n  }\n\n  public @Nullable URI getDocumentation() {\n    return documentation;\n  }\n\n  public @Nullable String getLicense() {\n    return license;\n  }\n\n  public @Nullable String getLicenseText() {\n    return licenseText;\n  }\n\n  public @Nullable List<String> getAuthors() {\n    return authors;\n  }\n\n  @Nullable\n  public URI getIssueTracker() {\n    return issueTracker;\n  }\n\n  @Nullable\n  public String getDescription() {\n    return description;\n  }\n\n  public List<PObject> getAnnotations() {\n    return annotations;\n  }\n\n  /** Serializes project dependencies to JSON, and writes it to the provided output stream. */\n  public void writeTo(OutputStream out) throws IOException {\n    new DependencyMetadataWriter(out, this).write();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    DependencyMetadata that = (DependencyMetadata) o;\n    return name.equals(that.name)\n        && packageUri.equals(that.packageUri)\n        && version.equals(that.version)\n        && packageZipUrl.equals(that.packageZipUrl)\n        && packageZipChecksums.equals(that.packageZipChecksums)\n        && dependencies.equals(that.dependencies)\n        && Objects.equals(sourceCodeUrlScheme, that.sourceCodeUrlScheme)\n        && Objects.equals(sourceCode, that.sourceCode)\n        && Objects.equals(documentation, that.documentation)\n        && Objects.equals(license, that.license)\n        && Objects.equals(licenseText, that.licenseText)\n        && Objects.equals(authors, that.authors)\n        && Objects.equals(issueTracker, that.issueTracker)\n        && Objects.equals(description, that.description)\n        && Objects.equals(annotations, that.annotations);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        name,\n        packageUri,\n        version,\n        packageZipUrl,\n        packageZipChecksums,\n        dependencies,\n        sourceCodeUrlScheme,\n        sourceCode,\n        documentation,\n        license,\n        licenseText,\n        authors,\n        issueTracker,\n        description,\n        annotations);\n  }\n\n  @Override\n  public String toString() {\n    return \"DependencyMetadata{\"\n        + \"name='\"\n        + name\n        + '\\''\n        + \"packageUri='\"\n        + packageUri\n        + '\\''\n        + \", version=\"\n        + version\n        + \", packageZipUrl=\"\n        + packageZipUrl\n        + \", packageZipChecksums=\"\n        + packageZipChecksums\n        + \", dependencies=\"\n        + dependencies\n        + \", sourceCodeUrlScheme='\"\n        + sourceCodeUrlScheme\n        + '\\''\n        + \", sourceCode='\"\n        + sourceCode\n        + '\\''\n        + \", documentation='\"\n        + documentation\n        + '\\''\n        + \", license='\"\n        + license\n        + '\\''\n        + \", licenseText='\"\n        + licenseText\n        + '\\''\n        + \", authors=\"\n        + authors\n        + '\\''\n        + \", issueTracker=\"\n        + issueTracker\n        + '\\''\n        + \", description=\"\n        + description\n        + \", annotations=\"\n        + annotations\n        + '}';\n  }\n\n  private static final class DependencyMetadataWriter {\n\n    private final JsonWriter jsonWriter;\n    private final DependencyMetadata dependencyMetadata;\n\n    private DependencyMetadataWriter(\n        OutputStream outputStream, DependencyMetadata dependencyMetadata) {\n      jsonWriter = new JsonWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));\n      jsonWriter.setIndent(\"  \");\n      this.dependencyMetadata = dependencyMetadata;\n    }\n\n    private void writeChecksums() throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"sha256\").value(dependencyMetadata.packageZipChecksums.getSha256());\n      jsonWriter.endObject();\n    }\n\n    private void writeDependencies() throws IOException {\n      jsonWriter.beginObject();\n      for (var entry : dependencyMetadata.getDependencies().entrySet()) {\n        jsonWriter.name(entry.getKey());\n        jsonWriter.beginObject();\n        jsonWriter.name(\"uri\").value(entry.getValue().getPackageUri().toString());\n        var checksums = entry.getValue().getChecksums();\n        if (checksums != null) {\n          jsonWriter.name(\"checksums\");\n          jsonWriter.beginObject();\n          jsonWriter.name(\"sha256\").value(entry.getValue().getChecksums().getSha256());\n          jsonWriter.endObject();\n        }\n        jsonWriter.endObject();\n      }\n      jsonWriter.endObject();\n    }\n\n    private void writeAuthors() throws IOException {\n      var authors = dependencyMetadata.authors;\n      assert authors != null;\n      jsonWriter.beginArray();\n      for (var author : authors) {\n        jsonWriter.value(author);\n      }\n      jsonWriter.endArray();\n    }\n\n    private void write() throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"name\").value(dependencyMetadata.name);\n      jsonWriter.name(\"packageUri\").value(dependencyMetadata.packageUri.toString());\n      jsonWriter.name(\"version\").value(dependencyMetadata.version.toString());\n      jsonWriter.name(\"packageZipUrl\").value(dependencyMetadata.packageZipUrl.toString());\n      jsonWriter.name(\"packageZipChecksums\");\n      writeChecksums();\n      jsonWriter.name(\"dependencies\");\n      writeDependencies();\n      if (dependencyMetadata.sourceCodeUrlScheme != null) {\n        jsonWriter.name(\"sourceCodeUrlScheme\").value(dependencyMetadata.sourceCodeUrlScheme);\n      }\n      if (dependencyMetadata.sourceCode != null) {\n        jsonWriter.name(\"sourceCode\").value(dependencyMetadata.sourceCode.toString());\n      }\n      if (dependencyMetadata.documentation != null) {\n        jsonWriter.name(\"documentation\").value(dependencyMetadata.documentation.toString());\n      }\n      if (dependencyMetadata.license != null) {\n        jsonWriter.name(\"license\").value(dependencyMetadata.license);\n      }\n      if (dependencyMetadata.licenseText != null) {\n        jsonWriter.name(\"licenseText\").value(dependencyMetadata.licenseText);\n      }\n      if (dependencyMetadata.authors != null) {\n        jsonWriter.name(\"authors\");\n        writeAuthors();\n      }\n      if (dependencyMetadata.issueTracker != null) {\n        jsonWriter.name(\"issueTracker\").value(dependencyMetadata.issueTracker.toString());\n      }\n      if (dependencyMetadata.description != null) {\n        jsonWriter.name(\"description\").value(dependencyMetadata.description);\n      }\n      if (!dependencyMetadata.annotations.isEmpty()) {\n        jsonWriter.name(\"annotations\");\n        writeAnnotations();\n      }\n      jsonWriter.endObject();\n      jsonWriter.close();\n    }\n\n    private void writeAnnotations() throws IOException {\n      jsonWriter.beginArray();\n      for (var annotation : dependencyMetadata.annotations) {\n        writePObject(annotation);\n      }\n      jsonWriter.endArray();\n    }\n\n    private void writePClassInfo(PClassInfo<?> pClassInfo) throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"moduleName\").value(pClassInfo.getModuleName());\n      jsonWriter.name(\"class\").value(pClassInfo.getSimpleName());\n      jsonWriter.name(\"moduleUri\").value(pClassInfo.getModuleUri().toString());\n      jsonWriter.endObject();\n    }\n\n    private void writePObject(PObject object) throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"type\").value(\"PObject\");\n      jsonWriter.name(\"classInfo\");\n      writePClassInfo(object.getClassInfo());\n      jsonWriter.name(\"properties\");\n      jsonWriter.beginObject();\n      for (var kv : object.getProperties().entrySet()) {\n        jsonWriter.name(kv.getKey());\n        writeGenericObject(kv.getValue());\n      }\n      jsonWriter.endObject();\n      jsonWriter.endObject();\n    }\n\n    private void writeGenericObject(Object value) throws IOException {\n      if (value instanceof PNull) {\n        jsonWriter.nullValue();\n      } else if (value instanceof PObject pObject) {\n        writePObject(pObject);\n      } else if (value instanceof String string) {\n        jsonWriter.value(string);\n      } else if (value instanceof Boolean bool) {\n        jsonWriter.value(bool);\n      } else if (value instanceof Integer num) {\n        jsonWriter.value(num);\n      } else if (value instanceof Long num) {\n        jsonWriter.value(num);\n      } else if (value instanceof Float num) {\n        jsonWriter.value(num);\n      } else if (value instanceof Double num) {\n        jsonWriter.value(num);\n      } else if (value instanceof List<?> list) {\n        jsonWriter.beginArray();\n        for (var v : list) {\n          writeGenericObject(v);\n        }\n        jsonWriter.endArray();\n      } else if (value instanceof Set<?> set) {\n        jsonWriter.beginObject();\n        jsonWriter.name(\"type\").value(\"Set\");\n        jsonWriter.name(\"value\");\n        jsonWriter.beginArray();\n        for (var v : set) {\n          writeGenericObject(v);\n        }\n        jsonWriter.endArray();\n        jsonWriter.endObject();\n      } else if (value instanceof Map<?, ?> map) {\n        jsonWriter.beginObject();\n        jsonWriter.name(\"type\").value(\"Map\");\n        jsonWriter.name(\"value\");\n        jsonWriter.beginArray();\n        for (var kv : map.entrySet()) {\n          jsonWriter.beginObject();\n          jsonWriter.name(\"key\");\n          writeGenericObject(kv.getKey());\n          jsonWriter.name(\"value\");\n          writeGenericObject(kv.getValue());\n          jsonWriter.endObject();\n        }\n        jsonWriter.endArray();\n        jsonWriter.endObject();\n      } else if (value instanceof Pattern pattern) {\n        jsonWriter.beginObject();\n        jsonWriter.name(\"type\").value(\"Pattern\");\n        jsonWriter.name(\"value\").value(pattern.pattern());\n        jsonWriter.endObject();\n      } else if (value instanceof DataSize dataSize) {\n        jsonWriter.beginObject();\n        jsonWriter.name(\"type\").value(\"DataSize\");\n        jsonWriter.name(\"unit\").value(dataSize.getUnit().getSymbol());\n        jsonWriter.name(\"value\").value(dataSize.getValue());\n        jsonWriter.endObject();\n      } else if (value instanceof Duration duration) {\n        jsonWriter.beginObject();\n        jsonWriter.name(\"type\").value(\"Duration\");\n        jsonWriter.name(\"unit\").value(duration.getUnit().getSymbol());\n        jsonWriter.name(\"value\").value(duration.getValue());\n        jsonWriter.endObject();\n      } else if (value instanceof Pair<?, ?> pair) {\n        jsonWriter.beginObject();\n        jsonWriter.name(\"type\").value(\"Pair\");\n        jsonWriter.name(\"first\");\n        writeGenericObject(pair.getFirst());\n        jsonWriter.name(\"second\");\n        writeGenericObject(pair.getSecond());\n        jsonWriter.endObject();\n      } else {\n        // PClass and TypeAlias are not supported\n        throw new PklException(\n            \"Error serializing annotation for PklProject:\\n:\"\n                + \"  cannot render value with unexpected type: \"\n                + value.getClass());\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/PackageAssetUri.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.Path;\nimport org.pkl.core.Version;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.IoUtils;\n\n/**\n * The canonical URI of an asset within a package, i.e., a package URI with a fragment path. For\n * example, {@code package://example.com/my/package@1.0.0#/my/module.pkl}\n */\npublic final class PackageAssetUri {\n  private final URI uri;\n  private final PackageUri packageUri;\n  private final String assetPath;\n\n  public static PackageAssetUri create(URI uri) {\n    try {\n      return new PackageAssetUri(uri);\n    } catch (URISyntaxException e) {\n      throw new IllegalArgumentException(e.getMessage(), e);\n    }\n  }\n\n  public PackageAssetUri(PackageUri packageUri, String assetPath) {\n    this.uri = packageUri.getUri().resolve(\"#\" + assetPath);\n    this.packageUri = packageUri;\n    this.assetPath = assetPath;\n  }\n\n  public PackageAssetUri(String uri) throws URISyntaxException {\n    this(new URI(uri));\n  }\n\n  public PackageAssetUri(URI uri) throws URISyntaxException {\n    this.uri = uri;\n    this.packageUri = new PackageUri(uri);\n    var fragment = uri.getFragment();\n    if (fragment == null) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"invalidUriMissingFragment\", uri));\n    }\n    if (!fragment.startsWith(\"/\")) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"cannotHaveRelativeFragment\", fragment, uri));\n    }\n    this.assetPath = fragment;\n  }\n\n  public URI getUri() {\n    return uri;\n  }\n\n  public PackageUri getPackageUri() {\n    return packageUri;\n  }\n\n  public String getAssetPath() {\n    return assetPath;\n  }\n\n  public Version getVersion() {\n    return packageUri.getVersion();\n  }\n\n  @Override\n  public String toString() {\n    return uri.toString();\n  }\n\n  @Override\n  public int hashCode() {\n    return uri.hashCode();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    PackageAssetUri that = (PackageAssetUri) o;\n    return getUri().equals(that.getUri());\n  }\n\n  public PackageAssetUri resolve(String path) {\n    var resolvedPath = IoUtils.toNormalizedPathString(Path.of(assetPath).resolve(path));\n    return new PackageAssetUri(packageUri, resolvedPath);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/PackageLoadError.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport org.pkl.core.util.ErrorMessages;\n\npublic final class PackageLoadError extends RuntimeException {\n\n  private final String messageName;\n  private final Object[] arguments;\n\n  public PackageLoadError(Throwable cause, String messageName, Object... arguments) {\n    super(ErrorMessages.create(messageName, arguments), cause);\n    this.messageName = messageName;\n    this.arguments = arguments;\n  }\n\n  public PackageLoadError(String messageName, Object... arguments) {\n    super(ErrorMessages.create(messageName, arguments));\n    this.messageName = messageName;\n    this.arguments = arguments;\n  }\n\n  public String getMessageName() {\n    return messageName;\n  }\n\n  public Object[] getArguments() {\n    return arguments;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/PackageResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.nio.file.Path;\nimport java.util.List;\nimport javax.naming.OperationNotSupportedException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.packages.PackageResolvers.DiskCachedPackageResolver;\nimport org.pkl.core.packages.PackageResolvers.InMemoryPackageResolver;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.Pair;\n\npublic interface PackageResolver extends Closeable {\n\n  static PackageResolver getInstance(\n      SecurityManager securityManager, HttpClient httpClient, @Nullable Path cachedDir) {\n    return cachedDir == null\n        ? new InMemoryPackageResolver(securityManager, httpClient)\n        : new DiskCachedPackageResolver(securityManager, httpClient, cachedDir);\n  }\n\n  DependencyMetadata getDependencyMetadata(PackageUri uri, @Nullable Checksums checksums)\n      throws IOException, SecurityManagerException;\n\n  Pair<DependencyMetadata, Checksums> getDependencyMetadataAndComputeChecksum(PackageUri packageUri)\n      throws IOException, SecurityManagerException;\n\n  void downloadPackage(PackageUri uri, @Nullable Checksums checksums, boolean noTransitive)\n      throws OperationNotSupportedException, IOException, SecurityManagerException;\n\n  /** Reads the byte contents of the resource within a package. */\n  byte[] getBytes(PackageAssetUri uri, boolean allowDirectories, @Nullable Checksums checksums)\n      throws IOException, SecurityManagerException;\n\n  List<PathElement> listElements(PackageAssetUri uri, @Nullable Checksums checksums)\n      throws IOException, SecurityManagerException;\n\n  boolean hasElement(PackageAssetUri uri, @Nullable Checksums checksums)\n      throws IOException, SecurityManagerException;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/PackageResolvers.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URI;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.net.http.HttpResponse.BodyHandlers;\nimport java.nio.ByteBuffer;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.FileSystem;\nimport java.nio.file.Files;\nimport java.nio.file.NoSuchFileException;\nimport java.nio.file.Path;\nimport java.nio.file.StandardCopyOption;\nimport java.nio.file.attribute.PosixFilePermission;\nimport java.security.DigestInputStream;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.Collections;\nimport java.util.EnumSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.stream.Collectors;\nimport java.util.stream.StreamSupport;\nimport java.util.zip.ZipInputStream;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.FileResolver;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.module.PathElement.TreePathElement;\nimport org.pkl.core.runtime.FileSystemManager;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.ByteArrayUtils;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.HttpUtils;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.Pair;\nimport org.pkl.core.util.json.Json.JsonParseException;\n\nfinal class PackageResolvers {\n  private PackageResolvers() {}\n\n  abstract static class AbstractPackageResolver implements PackageResolver {\n    @GuardedBy(\"lock\")\n    private final EconomicMap<PackageUri, DependencyMetadata> cachedDependencyMetadata;\n\n    private final SecurityManager securityManager;\n\n    protected final HttpClient httpClient;\n\n    private final AtomicBoolean isClosed = new AtomicBoolean();\n\n    protected final Object lock = new Object();\n\n    protected AbstractPackageResolver(SecurityManager securityManager, HttpClient httpClient) {\n      this.securityManager = securityManager;\n      this.httpClient = httpClient;\n      cachedDependencyMetadata = EconomicMaps.create();\n    }\n\n    /** Retrieves a dependency's metadata file. */\n    public DependencyMetadata getDependencyMetadata(PackageUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      checkNotClosed();\n      synchronized (lock) {\n        var metadata = cachedDependencyMetadata.get(uri);\n        if (metadata == null) {\n          metadata = doGetDependencyMetadata(uri, checksums);\n          cachedDependencyMetadata.put(uri, metadata);\n        }\n        return metadata;\n      }\n    }\n\n    @Override\n    public Pair<DependencyMetadata, Checksums> getDependencyMetadataAndComputeChecksum(\n        PackageUri packageUri) throws IOException, SecurityManagerException {\n      var requestUri = packageUri.getMetadataRequestUri();\n      var inputStream = openExternalUri(requestUri);\n      return readDependencyMetadataAndComputeChecksum(packageUri, inputStream);\n    }\n\n    protected Pair<DependencyMetadata, Checksums> readDependencyMetadataAndComputeChecksum(\n        PackageUri packageUri, InputStream inputStream) throws IOException {\n      try (var in = newDigestInputStream(inputStream)) {\n        var bytes = in.readAllBytes();\n        var dependencyMetadata =\n            DependencyMetadata.parse(new String(bytes, StandardCharsets.UTF_8));\n        var checksums = new Checksums(ByteArrayUtils.toHex(in.getMessageDigest().digest()));\n        return Pair.of(dependencyMetadata, checksums);\n      } catch (JsonParseException e) {\n        throw new PackageLoadError(\n            e,\n            \"invalidDependencyMetadata\",\n            packageUri.getDisplayName(),\n            packageUri.getMetadataRequestUri(),\n            e.getMessage());\n      }\n    }\n\n    @Override\n    public List<PathElement> listElements(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      checkNotClosed();\n      return doListElements(uri, checksums);\n    }\n\n    @Override\n    public boolean hasElement(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      checkNotClosed();\n      return doHasElement(uri, checksums);\n    }\n\n    @Override\n    public void close() throws IOException {\n      if (!isClosed.getAndSet(true)) {\n        synchronized (lock) {\n          cachedDependencyMetadata.clear();\n        }\n      }\n    }\n\n    protected DigestInputStream newDigestInputStream(InputStream in) {\n      try {\n        var md = MessageDigest.getInstance(\"SHA-256\");\n        return new DigestInputStream(in, md);\n      } catch (NoSuchAlgorithmException e) {\n        // All JDK's ship with SHA-256\n        throw new VmExceptionBuilder().unreachableCode().build();\n      }\n    }\n\n    protected void verifyPackageZipBytes(\n        PackageUri packageUri, DependencyMetadata dependencyMetadata, byte[] computedChecksum) {\n      var checksum = ByteArrayUtils.toHex(computedChecksum);\n      var expectedChecksum = dependencyMetadata.getPackageZipChecksums().getSha256();\n      if (!checksum.equals(expectedChecksum)) {\n        throw new PackageLoadError(\n            \"invalidPackageZipChecksum\",\n            packageUri.getDisplayName(),\n            checksum,\n            expectedChecksum,\n            dependencyMetadata.getPackageZipUrl());\n      }\n    }\n\n    protected void verifyPackageMetadataBytes(\n        PackageUri packageUri, URI requestUri, Checksums checksums, byte[] computedChecksum) {\n      var expectedChecksum = checksums.getSha256();\n      var checksum = ByteArrayUtils.toHex(computedChecksum);\n      // Qualify of life improvement: we have a lot of projects in our language snippet tests.\n      // To avoid having to update checksum values in their PklProject.deps.json files, every time\n      // a package changes, we set their checksum value to \"$skipChecksumVerification\".\n      // We keep two tests that do test checksum verification.\n      if (IoUtils.isTestMode() && expectedChecksum.equals(\"$skipChecksumVerification\")) {\n        return;\n      }\n      if (!checksum.equals(expectedChecksum)) {\n        throw new PackageLoadError(\n            \"invalidPackageMetadataChecksum\",\n            packageUri.getDisplayName(),\n            checksum,\n            expectedChecksum,\n            requestUri);\n      }\n    }\n\n    protected InputStream openExternalUri(URI uri) throws SecurityManagerException {\n      if (!HttpUtils.isHttpUrl(uri)) {\n        throw new IllegalArgumentException(\"Expected HTTP(S) URL, but got: \" + uri);\n      }\n\n      // treat package assets as resources instead of modules\n      securityManager.checkReadResource(uri);\n      var request = HttpRequest.newBuilder(uri).build();\n      HttpResponse<InputStream> response;\n      try {\n        response = httpClient.send(request, BodyHandlers.ofInputStream());\n      } catch (IOException e) {\n        throw new PackageLoadError(e, \"ioErrorMakingHttpGet\", uri, e.getMessage());\n      }\n      try {\n        HttpUtils.checkHasStatusCode200(response);\n      } catch (IOException e) {\n        throw new PackageLoadError(\"badHttpStatusCode\", response.statusCode(), response.uri());\n      }\n      return response.body();\n    }\n\n    protected IOException fileIsADirectory() {\n      // Sync with error message from `Files#readString(Path)`\n      return new IOException(\"Is a directory\");\n    }\n\n    protected abstract DependencyMetadata doGetDependencyMetadata(\n        PackageUri packageUri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException;\n\n    protected abstract List<PathElement> doListElements(\n        PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException;\n\n    protected abstract boolean doHasElement(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException;\n\n    protected PackageLoadError invalidPackageZipUrl(\n        PackageUri packageUri, DependencyMetadata dependencyMetadata) {\n      return new PackageLoadError(\n          \"invalidPackageZipUrl\",\n          packageUri.getDisplayName(),\n          dependencyMetadata.getPackageZipUrl());\n    }\n\n    private void checkNotClosed() {\n      if (isClosed.get()) {\n        throw new IllegalStateException(\"Package resolver has already been closed.\");\n      }\n    }\n  }\n\n  /**\n   * A package resolver that holds entire package contents in memory.\n   *\n   * <p>This gets used when the cache dir is not set.\n   */\n  static final class InMemoryPackageResolver extends AbstractPackageResolver {\n    @GuardedBy(\"lock\")\n    private final EconomicMap<PackageUri, EconomicMap<String, ByteBuffer>> cachedEntries =\n        EconomicMaps.create();\n\n    @GuardedBy(\"lock\")\n    private final EconomicMap<PackageUri, TreePathElement> cachedTreePathElementRoots =\n        EconomicMaps.create();\n\n    InMemoryPackageResolver(SecurityManager securityManager, HttpClient httpClient) {\n      super(securityManager, httpClient);\n    }\n\n    private byte[] getPackageBytes(PackageUri packageUri, DependencyMetadata metadata)\n        throws IOException, SecurityManagerException {\n      var httpInputStream = openExternalUri(metadata.getPackageZipUrl());\n      try (var digestInputStream = newDigestInputStream(httpInputStream)) {\n        var packageBytes = digestInputStream.readAllBytes();\n        var checksumBytes = digestInputStream.getMessageDigest().digest();\n        verifyPackageZipBytes(packageUri, metadata, checksumBytes);\n        return packageBytes;\n      }\n    }\n\n    private void ensurePackageDownloaded(PackageUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      synchronized (lock) {\n        if (cachedEntries.containsKey(uri)) {\n          return;\n        }\n        var metadata = getDependencyMetadata(uri, checksums);\n        var cachedEntrySet = EconomicMaps.<String, ByteBuffer>create();\n        var packageBytes = getPackageBytes(uri, metadata);\n        try (var zipInputStream = new ZipInputStream(new ByteArrayInputStream(packageBytes))) {\n          var rootPathElement = new TreePathElement(\"\", true);\n          cachedTreePathElementRoots.put(uri, rootPathElement);\n          for (var entry = zipInputStream.getNextEntry();\n              entry != null;\n              entry = zipInputStream.getNextEntry()) {\n            var pathElement = rootPathElement;\n            var nameParts = entry.getName().split(\"/\");\n            var nameCount = nameParts.length;\n            for (var i = 0; i < nameCount; i++) {\n              var name = nameParts[i];\n              var isDirectory = entry.isDirectory() || i < (nameCount - 1);\n              pathElement = pathElement.putIfAbsent(name, new TreePathElement(name, isDirectory));\n            }\n            if (!entry.isDirectory()) {\n              var entryBytes = zipInputStream.readAllBytes();\n              cachedEntrySet.put(\"/\" + entry.getName(), ByteBuffer.wrap(entryBytes));\n            }\n          }\n        }\n        cachedEntries.put(uri, cachedEntrySet);\n      }\n    }\n\n    // No sense in supporting this in the in-memory package resolver, because it cannot write\n    // anything to disk.\n    @Override\n    public void downloadPackage(\n        PackageUri uri, @Nullable Checksums checksums, boolean noTransitive) {\n      throw new UnsupportedOperationException();\n    }\n\n    @Override\n    public byte[] getBytes(\n        PackageAssetUri uri, boolean allowDirectories, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var packageUri = uri.getPackageUri();\n      ensurePackageDownloaded(packageUri, checksums);\n      var elem = cachedTreePathElementRoots.get(uri.getPackageUri()).getElement(uri.getAssetPath());\n      if (elem == null) {\n        throw new FileNotFoundException();\n      } else if (elem.isDirectory()) {\n        if (allowDirectories) {\n          var text =\n              StreamSupport.stream(elem.getChildren().getKeys().spliterator(), false)\n                      .sorted()\n                      .collect(Collectors.joining(\"\\n\"))\n                  + \"\\n\";\n          return text.getBytes(StandardCharsets.UTF_8);\n        }\n        throw fileIsADirectory();\n      }\n      var entries = cachedEntries.get(packageUri);\n      // need to normalize here but not in `doListElements` nor `doHasElement` because\n      // `TreePathElement.getElement` does normalization already.\n      var path = IoUtils.toNormalizedPathString(Path.of(uri.getAssetPath()).normalize());\n      return entries.get(path).array();\n    }\n\n    @Override\n    public List<PathElement> doListElements(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var packageUri = uri.getPackageUri();\n      ensurePackageDownloaded(packageUri, checksums);\n      var element = cachedTreePathElementRoots.get(packageUri).getElement(uri.getAssetPath());\n      if (element == null) {\n        return Collections.emptyList();\n      }\n      return element.getChildrenValues();\n    }\n\n    @Override\n    public boolean doHasElement(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var packageUri = uri.getPackageUri();\n      ensurePackageDownloaded(packageUri, checksums);\n      var element = cachedTreePathElementRoots.get(packageUri).getElement(uri.getAssetPath());\n      return element != null;\n    }\n\n    @Override\n    protected DependencyMetadata doGetDependencyMetadata(\n        PackageUri packageUri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var requestUri = packageUri.getMetadataRequestUri();\n      var inputStream = openExternalUri(requestUri);\n      if (checksums != null) {\n        inputStream = newDigestInputStream(inputStream);\n      }\n      try (var in = inputStream) {\n        var metadataStr = IoUtils.readString(in);\n        if (checksums != null) {\n          var digestInputStream = (DigestInputStream) in;\n          var checksumBytes = digestInputStream.getMessageDigest().digest();\n          verifyPackageMetadataBytes(packageUri, requestUri, checksums, checksumBytes);\n        }\n        var metadata = DependencyMetadata.parse(metadataStr);\n        if (!metadata.getPackageZipUrl().getScheme().equalsIgnoreCase(\"https\")) {\n          throw invalidPackageZipUrl(packageUri, metadata);\n        }\n        return metadata;\n      } catch (JsonParseException e) {\n        throw new PackageLoadError(\n            e,\n            \"invalidDependencyMetadata\",\n            packageUri.getDisplayName(),\n            requestUri,\n            e.getMessage());\n      }\n    }\n\n    @Override\n    public void close() throws IOException {\n      super.close();\n      synchronized (lock) {\n        cachedEntries.clear();\n        cachedTreePathElementRoots.clear();\n      }\n    }\n  }\n\n  /**\n   * Resolves packages, caching them to disk.\n   *\n   * <p>Uses the built-in zip file system in {@link jdk.nio.zipfs} for reading files from the zip\n   * archive.\n   */\n  static final class DiskCachedPackageResolver extends AbstractPackageResolver {\n    private final Path cacheDir;\n\n    private final Path tmpDir;\n\n    private static final String CACHE_DIR_PREFIX = \"package-2\";\n\n    @GuardedBy(\"lock\")\n    private final EconomicMap<PackageUri, FileSystem> fileSystems = EconomicMaps.create();\n\n    private static final Set<PosixFilePermission> FILE_PERMISSIONS =\n        EnumSet.of(\n            PosixFilePermission.OWNER_READ,\n            PosixFilePermission.GROUP_READ,\n            PosixFilePermission.OTHERS_READ);\n\n    public DiskCachedPackageResolver(\n        SecurityManager securityManager, HttpClient httpClient, Path cacheDir) {\n      super(securityManager, httpClient);\n      this.cacheDir = cacheDir;\n      this.tmpDir = cacheDir.resolve(\"tmp\");\n    }\n\n    private String getEffectivePackageUriPath(PackageUri packageUri) {\n      var path = packageUri.getUri().getPath();\n      assert path != null;\n      if (packageUri.getChecksums() == null) {\n        return path;\n      }\n      var checksumIdx = path.lastIndexOf(\"::\");\n      return IoUtils.encodePath(path.substring(0, checksumIdx));\n    }\n\n    private Path getRelativePath(PackageUri uri) {\n      return Path.of(\n          CACHE_DIR_PREFIX,\n          IoUtils.encodePath(uri.getUri().getAuthority()),\n          getEffectivePackageUriPath(uri));\n    }\n\n    private String getLastSegmentName(PackageUri packageUri) {\n      var path = getEffectivePackageUriPath(packageUri);\n      var lastSep = path.lastIndexOf(\"/\");\n      return path.substring(lastSep + 1);\n    }\n\n    private byte[] downloadUriToPathAndComputeChecksum(URI downloadUri, Path path)\n        throws IOException, SecurityManagerException {\n      var inputStream = openExternalUri(downloadUri);\n      try (var digestInputStream = newDigestInputStream(inputStream)) {\n        Files.copy(digestInputStream, path, StandardCopyOption.REPLACE_EXISTING);\n        return digestInputStream.getMessageDigest().digest();\n      }\n    }\n\n    private void downloadMetadata(\n        PackageUri packageUri, URI downloadUri, Path path, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var inputStream = openExternalUri(downloadUri);\n      if (checksums != null) {\n        inputStream = newDigestInputStream(inputStream);\n      }\n      try (var in = inputStream) {\n        Files.createDirectories(path.getParent());\n        Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);\n        if (checksums != null) {\n          var digestInputStream = (DigestInputStream) inputStream;\n          var checksumBytes = digestInputStream.getMessageDigest().digest();\n          verifyPackageMetadataBytes(packageUri, downloadUri, checksums, checksumBytes);\n        }\n      }\n    }\n\n    private Path getMetadataPath(\n        PackageUri packageUri, URI requestUri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var metadataFileName = getLastSegmentName(packageUri) + \".json\";\n      var metadataRelativePath = getRelativePath(packageUri).resolve(metadataFileName);\n      var cachePath = cacheDir.resolve(metadataRelativePath);\n      if (Files.exists(cachePath)) {\n        return cachePath;\n      }\n      Files.createDirectories(tmpDir);\n      var tmpPath =\n          Files.createTempFile(\n              tmpDir, IoUtils.encodePath(packageUri.toString().replace(\"/\", \"-\")), \".json\");\n      try {\n        downloadMetadata(packageUri, requestUri, tmpPath, checksums);\n        Files.createDirectories(cachePath.getParent());\n        Files.move(tmpPath, cachePath, StandardCopyOption.ATOMIC_MOVE);\n        if (!IoUtils.isWindows()) {\n          Files.setPosixFilePermissions(cachePath, FILE_PERMISSIONS);\n        }\n        return cachePath;\n      } finally {\n        Files.deleteIfExists(tmpPath);\n      }\n    }\n\n    /** Retrieves a dependency's metadata file. */\n    @Override\n    protected DependencyMetadata doGetDependencyMetadata(\n        PackageUri packageUri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var requestUri = packageUri.getMetadataRequestUri();\n      var metadataPath = getMetadataPath(packageUri, requestUri, checksums);\n      var metadataStr = Files.readString(metadataPath, StandardCharsets.UTF_8);\n      DependencyMetadata metadata;\n      try {\n        metadata = DependencyMetadata.parse(metadataStr);\n      } catch (JsonParseException e) {\n        Files.deleteIfExists(metadataPath);\n        throw new PackageLoadError(\n            e,\n            \"invalidDependencyMetadata\",\n            packageUri.getDisplayName(),\n            requestUri,\n            e.getMessage());\n      }\n      if (!metadata.getPackageZipUrl().getScheme().equalsIgnoreCase(\"https\")) {\n        Files.deleteIfExists(metadataPath);\n        throw invalidPackageZipUrl(packageUri, metadata);\n      }\n      return metadata;\n    }\n\n    private Path getZipFilePath(PackageUri packageUri, DependencyMetadata dependencyMetadata)\n        throws IOException, SecurityManagerException {\n      var packageZipName = getLastSegmentName(packageUri) + \".zip\";\n      var relativePath = getRelativePath(packageUri).resolve(packageZipName);\n      var cachePath = cacheDir.resolve(relativePath);\n      if (Files.exists(cachePath)) {\n        return cachePath;\n      }\n      Files.createDirectories(tmpDir);\n      var tmpPath =\n          Files.createTempFile(\n              tmpDir, IoUtils.encodePath(packageUri.toString().replace(\"/\", \"-\")), \".zip\");\n      try {\n        var checksumBytes =\n            downloadUriToPathAndComputeChecksum(dependencyMetadata.getPackageZipUrl(), tmpPath);\n        verifyPackageZipBytes(packageUri, dependencyMetadata, checksumBytes);\n        Files.createDirectories(cachePath.getParent());\n        Files.move(tmpPath, cachePath, StandardCopyOption.ATOMIC_MOVE);\n        if (!IoUtils.isWindows()) {\n          Files.setPosixFilePermissions(cachePath, FILE_PERMISSIONS);\n        }\n        return cachePath;\n      } finally {\n        Files.deleteIfExists(tmpPath);\n      }\n    }\n\n    /**\n     * Returns a file system that backs the zip archive for a package.\n     *\n     * <p>Downloads the package if not available within {@link DiskCachedPackageResolver#cacheDir}.\n     */\n    private FileSystem getZipFileSystem(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var packageUri = uri.getPackageUri();\n      synchronized (lock) {\n        var fs = fileSystems.get(packageUri);\n        if (fs == null) {\n          var metadata = getDependencyMetadata(packageUri, checksums);\n          var zipFilePath = getZipFilePath(packageUri, metadata);\n          var jarFileUri = URI.create(\"jar:\" + zipFilePath.toUri());\n          fs = FileSystemManager.getFileSystem(jarFileUri);\n          fileSystems.put(packageUri, fs);\n        }\n        return fs;\n      }\n    }\n\n    @Override\n    public void downloadPackage(PackageUri uri, @Nullable Checksums checksums, boolean noTransitive)\n        throws IOException, SecurityManagerException {\n      var metadata = getDependencyMetadata(uri, checksums);\n      getZipFilePath(uri, metadata);\n      if (noTransitive) {\n        return;\n      }\n      for (var dependency : metadata.getDependencies().values()) {\n        downloadPackage(dependency.getPackageUri(), dependency.getChecksums(), false);\n      }\n    }\n\n    @Override\n    public Pair<DependencyMetadata, Checksums> getDependencyMetadataAndComputeChecksum(\n        PackageUri packageUri) throws IOException, SecurityManagerException {\n      var packageDir = cacheDir.resolve(getRelativePath(packageUri));\n      var cacheFile = packageDir.resolve(packageDir.getFileName() + \".json\");\n      if (Files.exists(cacheFile)) {\n        return readDependencyMetadataAndComputeChecksum(\n            packageUri, Files.newInputStream(cacheFile));\n      }\n      return super.getDependencyMetadataAndComputeChecksum(packageUri);\n    }\n\n    /** Reads the byte contents of the resource within a package. */\n    @Override\n    public byte[] getBytes(\n        PackageAssetUri uri, boolean allowDirectories, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var path = getZipFileSystem(uri, checksums).getPath(uri.getUri().getFragment());\n      if (Files.isDirectory(path)) {\n        if (allowDirectories) {\n          // mimic the format that we get when reading a `file:` directory\n          try (var paths = Files.list(path)) {\n            var text =\n                paths\n                        .map(it -> it.getFileName().toString())\n                        .sorted()\n                        .collect(Collectors.joining(\"\\n\"))\n                    + \"\\n\";\n            return text.getBytes(StandardCharsets.UTF_8);\n          }\n        }\n        throw fileIsADirectory();\n      }\n      try {\n        return Files.readAllBytes(path);\n      } catch (NoSuchFileException e) {\n        throw new FileNotFoundException();\n      }\n    }\n\n    @Override\n    protected List<PathElement> doListElements(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var path = getZipFileSystem(uri, checksums).getPath(uri.getUri().getFragment());\n      return FileResolver.listElements(path);\n    }\n\n    @Override\n    public boolean doHasElement(PackageAssetUri uri, @Nullable Checksums checksums)\n        throws IOException, SecurityManagerException {\n      var path = getZipFileSystem(uri, checksums).getPath(uri.getUri().getFragment());\n      return FileResolver.hasElement(path);\n    }\n\n    @Override\n    public void close() throws IOException {\n      super.close();\n      synchronized (lock) {\n        var cursor = fileSystems.getEntries();\n        while (cursor.advance()) {\n          cursor.getValue().close();\n        }\n        fileSystems.clear();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/PackageUri.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.Version;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class PackageUri {\n  private final URI uri;\n  private final Version version;\n  private final String pathWithoutVersion;\n  private @Nullable Checksums checksums;\n\n  public static PackageUri create(String baseUri) {\n    try {\n      return new PackageUri(baseUri);\n    } catch (URISyntaxException e) {\n      throw new IllegalArgumentException(e);\n    }\n  }\n\n  public PackageUri(String baseUri) throws URISyntaxException {\n    this(new URI(baseUri));\n  }\n\n  public PackageUri(URI uri) throws URISyntaxException {\n    if (uri.isOpaque()) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"invalidModuleUriMissingSlash\", uri, \"package\"));\n    }\n    var scheme = uri.getScheme();\n    if (scheme == null || !(scheme.equals(\"package\") || scheme.equals(\"projectpackage\"))) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"invalidSchemeInPackageUri\", scheme));\n    }\n    var authority = uri.getAuthority();\n    if (authority == null || authority.isEmpty()) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"missingAuthorityInPackageUri\", uri));\n    }\n    var path = uri.getPath();\n    if (path == null || path.isEmpty()) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"missingPathInPackageUri\", uri));\n    }\n    var versionIdx = path.lastIndexOf('@');\n    if (versionIdx == -1) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"missingVersionInPackageUri\", path));\n    }\n    this.uri = IoUtils.stripFragment(uri);\n    this.pathWithoutVersion = path.substring(0, versionIdx);\n    var checksumIdx = path.indexOf(\"::\");\n    var versionPart = path.substring(versionIdx + 1);\n    if (checksumIdx > versionIdx) {\n      var checksumPart = path.substring(checksumIdx + 2);\n      versionPart = path.substring(versionIdx + 1, checksumIdx);\n      this.checksums = parseChecksumPart(checksumPart);\n    }\n    try {\n      this.version = Version.parse(versionPart);\n    } catch (IllegalArgumentException e) {\n      throw new URISyntaxException(uri.toString(), e.getMessage());\n    }\n  }\n\n  public URI getUri() {\n    return uri;\n  }\n\n  public URI getMetadataRequestUri() {\n    if (this.checksums != null) {\n      var schemeSpecificPart = uri.getSchemeSpecificPart();\n      var checksumIdx = schemeSpecificPart.lastIndexOf(\"::\");\n      var effectiveSchemeSpecificPart = schemeSpecificPart.substring(0, checksumIdx);\n      return URI.create(\"https:\" + effectiveSchemeSpecificPart);\n    }\n    return URI.create(\"https:\" + uri.getSchemeSpecificPart());\n  }\n\n  public Version getVersion() {\n    return version;\n  }\n\n  @Override\n  public String toString() {\n    return uri.toString();\n  }\n\n  @Override\n  public int hashCode() {\n    return uri.hashCode();\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    PackageUri that = (PackageUri) o;\n    return getUri().equals(that.getUri());\n  }\n\n  public PackageAssetUri toPackageAssetUri(String path) {\n    return new PackageAssetUri(this, path);\n  }\n\n  public String getDisplayName() {\n    var str = toExternalPackageUri().toString();\n    if (checksums != null) {\n      var checksumsIdx = str.lastIndexOf(\"::\");\n      return str.substring(0, checksumsIdx);\n    }\n    return str;\n  }\n\n  public PackageUri toExternalPackageUri() {\n    if (uri.getScheme().equals(\"package\")) {\n      return this;\n    }\n    try {\n      return new PackageUri(\n          new URI(\n              \"package\",\n              uri.getUserInfo(),\n              uri.getHost(),\n              uri.getPort(),\n              uri.getPath(),\n              uri.getQuery(),\n              uri.getFragment()));\n    } catch (URISyntaxException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  public PackageUri toProjectPackageUri() {\n    if (uri.getScheme().equals(\"projectpackage\")) {\n      return this;\n    }\n    try {\n      return new PackageUri(\n          new URI(\n              \"projectpackage\",\n              uri.getUserInfo(),\n              uri.getHost(),\n              uri.getPort(),\n              uri.getPath(),\n              uri.getQuery(),\n              uri.getFragment()));\n    } catch (URISyntaxException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  public String getPathWithoutVersion() {\n    return pathWithoutVersion;\n  }\n\n  public @Nullable Checksums getChecksums() {\n    return checksums;\n  }\n\n  private Checksums parseChecksumPart(String checksumPart) throws URISyntaxException {\n    var parts = checksumPart.split(\":\");\n    if (parts.length != 2) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"invalidPackageUriChecksum\", checksumPart));\n    }\n    var algorithm = parts[0];\n    var checksum = parts[1];\n    if (!algorithm.equals(\"sha256\")) {\n      throw new URISyntaxException(\n          uri.toString(), ErrorMessages.create(\"unknownChecksumAlgorithm\", algorithm));\n    }\n    return new Checksums(checksum);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/PackageUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages;\n\nimport java.net.URISyntaxException;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.json.Json.FormatException;\nimport org.pkl.core.util.json.Json.JsonParseException;\n\npublic final class PackageUtils {\n  private PackageUtils() {}\n\n  public static PackageUri parsePackageUriWithoutChecksums(Object obj)\n      throws JsonParseException, URISyntaxException {\n    if (!(obj instanceof String string)) {\n      throw new FormatException(\"string\", obj.getClass());\n    }\n    var packageUri = new PackageUri(string);\n    checkHasNoChecksumComponent(packageUri);\n    return packageUri;\n  }\n\n  public static void checkHasNoChecksumComponent(PackageUri packageUri) throws URISyntaxException {\n    if (packageUri.getChecksums() != null) {\n      throw new URISyntaxException(\n          packageUri.toString(), ErrorMessages.create(\"unexpectedChecksumInPackageUri\"));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/packages/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.packages;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/CanonicalPackageUri.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.util.ErrorMessages;\n\n/**\n * The canonical name of a package dependency within a project.\n *\n * <p>Equivalent to the package's base URI, and the major version number, i.e. {@code\n * package://example.com/foo/bar@0}. Does not include a URI's userinfo, query params or fragment\n * segments.\n */\npublic record CanonicalPackageUri(URI baseUri, int majorVersion) {\n  public static CanonicalPackageUri fromPackageUri(PackageUri packageUri) {\n    var uri = packageUri.getUri();\n    URI baseUri;\n    try {\n      baseUri =\n          new URI(\n              // make sure scheme is always \"package\"\n              \"package\",\n              // userinfo isn't considered part of the package identifier.\n              null,\n              uri.getHost(),\n              uri.getPort(),\n              packageUri.getPathWithoutVersion(),\n              // query params aren't considered part of the package identifier.\n              null,\n              null);\n    } catch (URISyntaxException e) {\n      throw PklBugException.unreachableCode();\n    }\n    return new CanonicalPackageUri(baseUri, packageUri.getVersion().getMajor());\n  }\n\n  public static CanonicalPackageUri of(String uriStr) throws URISyntaxException {\n    var versionIdx = uriStr.lastIndexOf('@');\n    if (versionIdx == -1) {\n      throw new URISyntaxException(\n          uriStr, ErrorMessages.create(\"missingVersionInPackageUri\", uriStr));\n    }\n    int majorVersion;\n    try {\n      majorVersion = Integer.parseInt(uriStr.substring(versionIdx + 1));\n    } catch (NumberFormatException e) {\n      throw new URISyntaxException(uriStr, ErrorMessages.create(\"\"));\n    }\n    var baseUri = new URI(uriStr.substring(0, versionIdx));\n    return new CanonicalPackageUri(baseUri, majorVersion);\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #majorVersion()}.\n   */\n  @Deprecated(forRemoval = true)\n  public int getMajorVersion() {\n    return majorVersion;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #baseUri()}.\n   */\n  @Deprecated(forRemoval = true)\n  public URI getBaseUri() {\n    return baseUri;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    CanonicalPackageUri that = (CanonicalPackageUri) o;\n    return majorVersion == that.majorVersion && baseUri.equals(that.baseUri);\n  }\n\n  @Override\n  public String toString() {\n    return baseUri + \"@\" + majorVersion;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/DeclaredDependencies.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.net.URI;\nimport java.util.Map;\nimport org.pkl.core.packages.Dependency.RemoteDependency;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.util.Nullable;\n\npublic record DeclaredDependencies(\n    Map<String, RemoteDependency> remoteDependencies,\n    Map<String, DeclaredDependencies> localDependencies,\n    URI projectFileUri,\n    @Nullable PackageUri myPackageUri) {\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #localDependencies()}.\n   */\n  @Deprecated(forRemoval = true)\n  public Map<String, DeclaredDependencies> getLocalDependencies() {\n    return localDependencies;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #remoteDependencies()}.\n   */\n  @Deprecated(forRemoval = true)\n  public Map<String, RemoteDependency> getRemoteDependencies() {\n    return remoteDependencies;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #projectFileUri()}.\n   */\n  @Deprecated(forRemoval = true)\n  public URI getProjectFileUri() {\n    return projectFileUri;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #myPackageUri()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable PackageUri getMyPackageUri() {\n    return myPackageUri;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/Package.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.util.List;\nimport org.pkl.core.Version;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of class {@code pkl.Project#Package} */\n@SuppressWarnings(\"unused\")\npublic record Package(\n    String name,\n    PackageUri uri,\n    Version version,\n    URI packageZipUrl,\n    @Nullable String description,\n    List<String> authors,\n    @Nullable URI website,\n    @Nullable URI documentation,\n    @Nullable URI sourceCode,\n    @Nullable String sourceCodeUrlScheme,\n    @Nullable String license,\n    @Nullable String licenseText,\n    @Nullable URI issueTracker,\n    List<Path> apiTests,\n    List<String> exclude) {\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #name()}.\n   */\n  @Deprecated(forRemoval = true)\n  public String getName() {\n    return name;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #uri()}.\n   */\n  @Deprecated(forRemoval = true)\n  public PackageUri getUri() {\n    return uri;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #version()}.\n   */\n  @Deprecated(forRemoval = true)\n  public Version getVersion() {\n    return version;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #packageZipUrl()}.\n   */\n  @Deprecated(forRemoval = true)\n  public URI getPackageZipUrl() {\n    return packageZipUrl;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #description()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable String getDescription() {\n    return description;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #authors()}.\n   */\n  @Deprecated(forRemoval = true)\n  public List<String> getAuthors() {\n    return authors;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #website()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable URI getWebsite() {\n    return website;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #documentation()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable URI getDocumentation() {\n    return documentation;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #sourceCode()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable URI getSourceCode() {\n    return sourceCode;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #sourceCodeUrlScheme()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable String getSourceCodeUrlScheme() {\n    return sourceCodeUrlScheme;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #licenseText()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable String getLicenseText() {\n    return licenseText;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #license()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable String getLicense() {\n    return license;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #issueTracker()}.\n   */\n  @Deprecated(forRemoval = true)\n  public @Nullable URI getIssueTracker() {\n    return issueTracker;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #apiTests()}.\n   */\n  @Deprecated(forRemoval = true)\n  public List<Path> getApiTests() {\n    return apiTests;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #exclude()}.\n   */\n  @Deprecated(forRemoval = true)\n  public List<String> getExclude() {\n    return exclude;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/Project.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.FileSystemNotFoundException;\nimport java.nio.file.Path;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.function.Function;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.pkl.core.Analyzer;\nimport org.pkl.core.Composite;\nimport org.pkl.core.Duration;\nimport org.pkl.core.Evaluator;\nimport org.pkl.core.EvaluatorBuilder;\nimport org.pkl.core.ModuleSource;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PNull;\nimport org.pkl.core.PObject;\nimport org.pkl.core.PklException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagers;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.StackFrameTransformers;\nimport org.pkl.core.Value;\nimport org.pkl.core.Version;\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.packages.Checksums;\nimport org.pkl.core.packages.Dependency.RemoteDependency;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.packages.PackageUtils;\nimport org.pkl.core.resource.ResourceReaders;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.ImportGraphUtils;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Java representation of module {@code pkl.Project}. */\npublic final class Project {\n  private final @Nullable Package pkg;\n  private final DeclaredDependencies dependencies;\n  private final PklEvaluatorSettings evaluatorSettings;\n  private final URI projectFileUri;\n  private final URI projectBaseUri;\n  private final List<URI> tests;\n  private final Map<String, Project> localProjectDependencies;\n  private final List<PObject> annotations;\n\n  /**\n   * Loads Project data from the given {@link Path}.\n   *\n   * <p>Evaluates a module's {@code output.value} to allow for embedding a project within a\n   * template.\n   *\n   * @throws PklException if an error occurred while evaluating the project file.\n   */\n  public static Project loadFromPath(\n      Path path,\n      SecurityManager securityManager,\n      @Nullable java.time.Duration timeout,\n      StackFrameTransformer stackFrameTransformer,\n      Map<String, String> envVars,\n      boolean powerAssertionsEnabled) {\n    try (var evaluator =\n        EvaluatorBuilder.unconfigured()\n            .setSecurityManager(securityManager)\n            .setStackFrameTransformer(stackFrameTransformer)\n            .addModuleKeyFactory(ModuleKeyFactories.standardLibrary)\n            .addModuleKeyFactory(ModuleKeyFactories.file)\n            .addResourceReader(ResourceReaders.environmentVariable())\n            .addResourceReader(ResourceReaders.file())\n            .addEnvironmentVariables(envVars)\n            .setTimeout(timeout)\n            .setPowerAssertionsEnabled(powerAssertionsEnabled)\n            .build()) {\n      return load(evaluator, ModuleSource.path(path));\n    }\n  }\n\n  /**\n   * Loads Project data from the given {@link Path}.\n   *\n   * <p>Evaluates a module's {@code output.value} to allow for embedding a project within a\n   * template.\n   *\n   * @throws PklException if an error occurred while evaluating the project file.\n   */\n  public static Project loadFromPath(\n      Path path,\n      SecurityManager securityManager,\n      @Nullable java.time.Duration timeout,\n      StackFrameTransformer stackFrameTransformer,\n      Map<String, String> envVars) {\n    return loadFromPath(path, securityManager, timeout, stackFrameTransformer, envVars, false);\n  }\n\n  /** Convenience method to load a project with the default stack frame transformer. */\n  public static Project loadFromPath(\n      Path path, SecurityManager securityManager, @Nullable java.time.Duration timeout) {\n    return loadFromPath(\n        path, securityManager, timeout, StackFrameTransformers.defaultTransformer, System.getenv());\n  }\n\n  /**\n   * Convenience method to load a project with the default security manager, no timeout, and the\n   * default stack frame transformer.\n   */\n  public static Project loadFromPath(Path path) {\n    return loadFromPath(path, SecurityManagers.defaultManager, null);\n  }\n\n  /** Loads a project from the given source. */\n  public static Project load(ModuleSource moduleSource) {\n    try (var evaluator = evaluatorBuilder().build()) {\n      return load(evaluator, moduleSource);\n    }\n  }\n\n  public static Project load(Evaluator evaluator, ModuleSource moduleSource) {\n    try {\n      var output = evaluator.evaluateOutputValueAs(moduleSource, PClassInfo.Project);\n      return Project.parseProject(output);\n    } catch (StackOverflowError e) {\n      var cycles = findImportCycle(moduleSource);\n      VmException vmException;\n      if (!cycles.isEmpty()) {\n        if (cycles.size() == 1) {\n          vmException =\n              new VmExceptionBuilder()\n                  .evalError(\n                      \"cannotHaveCircularProjectDependenciesSingle\",\n                      renderCycle(cycles.stream().toList().get(0)))\n                  .withCause(e)\n                  .build();\n        } else {\n          var renderedCycles = renderMultipleCycles(cycles);\n          vmException =\n              new VmExceptionBuilder()\n                  .evalError(\"cannotHaveCircularProjectDependenciesMultiple\", renderedCycles)\n                  .withCause(e)\n                  .build();\n        }\n        // stack frame transformer never used; this exception has no stack frames.\n        throw vmException.toPklException(StackFrameTransformers.defaultTransformer, false);\n      }\n      throw e;\n    } catch (URISyntaxException e) {\n      throw new PklException(e.getMessage(), e);\n    }\n  }\n\n  private static String renderMultipleCycles(List<List<URI>> cycles) {\n    var sb = new StringBuilder();\n    var i = 0;\n    for (var cycle : cycles) {\n      if (i > 0) {\n        sb.append('\\n');\n      }\n      sb.append(\"Cycle \").append(i + 1).append(\":\\n\");\n      renderCycle(sb, cycle);\n      sb.append('\\n');\n      i++;\n    }\n    return sb.toString();\n  }\n\n  private static void renderCycle(StringBuilder sb, List<URI> cycle) {\n    sb.append(\"┌─>\");\n    var isFirst = true;\n    for (URI uri : cycle) {\n      if (isFirst) {\n        isFirst = false;\n      } else {\n        sb.append(\"\\n│\");\n      }\n      sb.append(\"\\n│  \");\n      sb.append(uri.toString());\n    }\n    sb.append(\"\\n└─\");\n  }\n\n  private static String renderCycle(List<URI> cycle) {\n    var sb = new StringBuilder();\n    renderCycle(sb, cycle);\n    return sb.toString();\n  }\n\n  private static List<List<URI>> findImportCycle(ModuleSource moduleSource) {\n    var builder = evaluatorBuilder();\n    var analyzer =\n        new Analyzer(\n            StackFrameTransformers.defaultTransformer,\n            builder.getColor(),\n            SecurityManagers.defaultManager,\n            builder.getModuleKeyFactories(),\n            builder.getModuleCacheDir(),\n            builder.getProjectDependencies(),\n            builder.getHttpClient(),\n            builder.getTraceMode());\n    var importGraph = analyzer.importGraph(moduleSource.getUri());\n    var ret = ImportGraphUtils.findImportCycles(importGraph);\n    // we only care about cycles in the same scheme as `moduleSource`\n    return ret.stream()\n        .filter(\n            (cycle) ->\n                cycle.stream()\n                    .anyMatch(\n                        (uri) ->\n                            uri.getScheme().equalsIgnoreCase(moduleSource.getUri().getScheme())))\n        .collect(Collectors.toList());\n  }\n\n  private static EvaluatorBuilder evaluatorBuilder() {\n    return EvaluatorBuilder.unconfigured()\n        .setSecurityManager(SecurityManagers.defaultManager)\n        .setStackFrameTransformer(StackFrameTransformers.defaultTransformer)\n        .addModuleKeyFactory(ModuleKeyFactories.standardLibrary)\n        .addModuleKeyFactory(ModuleKeyFactories.file)\n        .addModuleKeyFactory(ModuleKeyFactories.classPath(Project.class.getClassLoader()))\n        .addResourceReader(ResourceReaders.environmentVariable())\n        .addResourceReader(ResourceReaders.file());\n  }\n\n  private static DeclaredDependencies parseDependencies(\n      PObject module, URI projectFileUri, @Nullable PackageUri packageUri)\n      throws URISyntaxException {\n    var remoteDependencies = new HashMap<String, RemoteDependency>();\n    var localDependencies = new HashMap<String, DeclaredDependencies>();\n    //noinspection unchecked\n    var dependencies = (Map<String, PObject>) module.getProperty(\"dependencies\");\n    for (var entry : dependencies.entrySet()) {\n      var value = entry.getValue();\n      if (value.getClassInfo().equals(PClassInfo.Project)) {\n        var localProjectFileUri = URI.create((String) value.getProperty(\"projectFileUri\"));\n        var localPkgUri =\n            PackageUri.create((String) ((PObject) value.getProperty(\"package\")).getProperty(\"uri\"));\n        localDependencies.put(\n            entry.getKey(), parseDependencies(value, localProjectFileUri, localPkgUri));\n      } else {\n        remoteDependencies.put(entry.getKey(), parseRemoteDependency(value));\n      }\n    }\n    return new DeclaredDependencies(\n        remoteDependencies, localDependencies, projectFileUri, packageUri);\n  }\n\n  private static RemoteDependency parseRemoteDependency(PObject object) throws URISyntaxException {\n    var packageUri = new PackageUri((String) object.getProperty(\"uri\"));\n    PackageUtils.checkHasNoChecksumComponent(packageUri);\n    var objChecksum = object.getProperty(\"checksums\");\n    Checksums checksums = null;\n    if (objChecksum instanceof PObject pObject) {\n      var sha256 = (String) pObject.get(\"sha256\");\n      assert sha256 != null;\n      checksums = new Checksums(sha256);\n    }\n    return new RemoteDependency(packageUri, checksums);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private static List<PObject> parseAnnotations(PObject module) {\n    return (List<PObject>) getProperty(module, \"annotations\");\n  }\n\n  public static Project parseProject(PObject module) throws URISyntaxException {\n    var pkgObj = getNullableProperty(module, \"package\");\n    var projectFileUri = URI.create((String) module.getProperty(\"projectFileUri\"));\n    var dependencies = parseDependencies(module, projectFileUri, null);\n    var projectBaseUri = IoUtils.resolve(projectFileUri, \".\");\n    Package pkg = null;\n    if (pkgObj != null) {\n      pkg = parsePackage((PObject) pkgObj);\n    }\n    var evaluatorSettings =\n        getProperty(\n            module,\n            \"evaluatorSettings\",\n            (settings) ->\n                PklEvaluatorSettings.parse(\n                    (Value) settings, (it, name) -> resolveNullablePath(it, projectBaseUri, name)));\n    @SuppressWarnings(\"unchecked\")\n    var testPathStrs = (List<String>) getProperty(module, \"tests\");\n    var tests =\n        testPathStrs.stream()\n            .map((it) -> projectBaseUri.resolve(it).normalize())\n            .collect(Collectors.toList());\n    var localProjectDependencies = parseLocalProjectDependencies(module);\n    var annotations = parseAnnotations(module);\n    return new Project(\n        pkg,\n        dependencies,\n        evaluatorSettings,\n        projectFileUri,\n        projectBaseUri,\n        tests,\n        localProjectDependencies,\n        annotations);\n  }\n\n  private static Map<String, Project> parseLocalProjectDependencies(PObject module)\n      throws URISyntaxException {\n    //noinspection unchecked\n    var dependencies = (Map<String, PObject>) module.getProperty(\"dependencies\");\n    var result = new HashMap<String, Project>();\n    for (var entry : dependencies.entrySet()) {\n      var value = entry.getValue();\n      if (value.getClassInfo().equals(PClassInfo.Project)) {\n        result.put(entry.getKey(), parseProject(entry.getValue()));\n      }\n    }\n    return result;\n  }\n\n  private static Object getProperty(PObject settings, String propertyName) {\n    return settings.getProperty(propertyName);\n  }\n\n  private static <T> T getProperty(PObject settings, String propertyName, Function<Object, T> f) {\n    return Objects.requireNonNull(getNullableProperty(settings, propertyName, f));\n  }\n\n  private static @Nullable Object getNullableProperty(Composite object, String propertyName) {\n    var result = object.getPropertyOrNull(propertyName);\n    if (result instanceof PNull || result == null) {\n      return null;\n    }\n    return result;\n  }\n\n  private static @Nullable <T> T getNullableProperty(\n      Composite object, String propertyName, Function<Object, T> f) {\n    var value = object.getPropertyOrNull(propertyName);\n    if (value instanceof PNull || value == null) {\n      return null;\n    }\n    return f.apply(value);\n  }\n\n  private static @Nullable URI getNullableURI(Composite object, String propertyName)\n      throws URISyntaxException {\n    var value = object.getPropertyOrNull(propertyName);\n    if (value instanceof PNull || value == null) {\n      return null;\n    }\n    return new URI((String) value);\n  }\n\n  /**\n   * Resolve a path string against projectBaseUri.\n   *\n   * @throws PackageLoadError if projectBaseUri is not a {@code file:} URI.\n   */\n  private static @Nullable Path resolveNullablePath(\n      @Nullable String path, URI projectBaseUri, String propertyName) {\n    if (path == null) {\n      return null;\n    }\n    try {\n      return Path.of(projectBaseUri).resolve(path).normalize();\n    } catch (FileSystemNotFoundException e) {\n      throw new PackageLoadError(\n          \"relativePathPropertyDefinedByProjectFromNonFileUri\", projectBaseUri, propertyName);\n    }\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private static Package parsePackage(PObject pObj) throws URISyntaxException {\n    var name = (String) pObj.getProperty(\"name\");\n    var uri = new PackageUri((String) pObj.getProperty(\"uri\"));\n    var version = Version.parse((String) getProperty(pObj, \"version\"));\n    var packageZipUrl = new URI((String) getProperty(pObj, \"packageZipUrl\"));\n    var description = (String) getNullableProperty(pObj, \"description\");\n    var authors = (List<String>) getProperty(pObj, \"authors\");\n    var website = getNullableURI(pObj, \"website\");\n    var documentation = getNullableURI(pObj, \"documentation\");\n    var sourceCode = getNullableURI(pObj, \"sourceCode\");\n    var sourceCodeUrlScheme = (String) getNullableProperty(pObj, \"sourceCodeUrlScheme\");\n    var license = (String) getNullableProperty(pObj, \"license\");\n    var licenseText = (String) getNullableProperty(pObj, \"licenseText\");\n    var issueTracker = getNullableURI(pObj, \"issueTracker\");\n    var apiTestStrs = (List<String>) getProperty(pObj, \"apiTests\");\n    var apiTests = apiTestStrs.stream().map(Path::of).collect(Collectors.toList());\n    var exclude = (List<String>) getProperty(pObj, \"exclude\");\n\n    return new Package(\n        name,\n        uri,\n        version,\n        packageZipUrl,\n        description,\n        authors,\n        website,\n        documentation,\n        sourceCode,\n        sourceCodeUrlScheme,\n        license,\n        licenseText,\n        issueTracker,\n        apiTests,\n        exclude);\n  }\n\n  private Project(\n      @Nullable Package pkg,\n      DeclaredDependencies dependencies,\n      PklEvaluatorSettings evaluatorSettings,\n      URI projectFileUri,\n      URI projectBaseUri,\n      List<URI> tests,\n      Map<String, Project> localProjectDependencies,\n      List<PObject> annotations) {\n    this.pkg = pkg;\n    this.dependencies = dependencies;\n    this.evaluatorSettings = evaluatorSettings;\n    this.projectFileUri = projectFileUri;\n    this.projectBaseUri = projectBaseUri;\n    this.tests = tests;\n    this.localProjectDependencies = localProjectDependencies;\n    this.annotations = annotations;\n  }\n\n  public @Nullable Package getPackage() {\n    return pkg;\n  }\n\n  /** Use {@link org.pkl.core.project.Project#getEvaluatorSettings()} instead. */\n  @Deprecated(forRemoval = true)\n  public EvaluatorSettings getSettings() {\n    return new EvaluatorSettings(evaluatorSettings);\n  }\n\n  public PklEvaluatorSettings getEvaluatorSettings() {\n    return evaluatorSettings;\n  }\n\n  public URI getProjectFileUri() {\n    return projectFileUri;\n  }\n\n  public List<Path> getTests() {\n    return tests.stream()\n        .map(\n            (it) -> {\n              try {\n                return Path.of(it);\n              } catch (FileSystemNotFoundException e) {\n                throw new PackageLoadError(\"invalidUsageOfProjectFromNonFileUri\");\n              }\n            })\n        .collect(Collectors.toList());\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Project project = (Project) o;\n    return Objects.equals(pkg, project.pkg)\n        && dependencies.equals(project.dependencies)\n        && evaluatorSettings.equals(project.evaluatorSettings)\n        && projectFileUri.equals(project.projectFileUri)\n        && tests.equals(project.tests)\n        && annotations.equals(project.annotations);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(pkg, dependencies, evaluatorSettings, projectFileUri, tests, annotations);\n  }\n\n  public DeclaredDependencies getDependencies() {\n    return dependencies;\n  }\n\n  public Map<String, Project> getLocalProjectDependencies() {\n    return localProjectDependencies;\n  }\n\n  public URI getProjectBaseUri() {\n    return projectBaseUri;\n  }\n\n  public Path getProjectDir() {\n    assert projectBaseUri.getScheme().equalsIgnoreCase(\"file\");\n    return Path.of(projectBaseUri);\n  }\n\n  public List<PObject> getAnnotations() {\n    return annotations;\n  }\n\n  @Deprecated(forRemoval = true)\n  public static class EvaluatorSettings {\n    private final PklEvaluatorSettings delegate;\n\n    public EvaluatorSettings(PklEvaluatorSettings delegate) {\n      this.delegate = delegate;\n    }\n\n    public EvaluatorSettings(\n        @Nullable Map<String, String> externalProperties,\n        @Nullable Map<String, String> env,\n        @Nullable List<Pattern> allowedModules,\n        @Nullable List<Pattern> allowedResources,\n        @Nullable Boolean noCache,\n        @Nullable Path moduleCacheDir,\n        @Nullable List<Path> modulePath,\n        @Nullable Duration timeout,\n        @Nullable Path rootDir,\n        @Nullable TraceMode traceMode) {\n      this.delegate =\n          new PklEvaluatorSettings(\n              externalProperties,\n              env,\n              allowedModules,\n              allowedResources,\n              null,\n              noCache,\n              moduleCacheDir,\n              modulePath,\n              timeout,\n              rootDir,\n              null,\n              null,\n              null,\n              traceMode);\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable Map<String, String> getExternalProperties() {\n      return delegate.externalProperties();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable Map<String, String> getEnv() {\n      return delegate.env();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable List<Pattern> getAllowedModules() {\n      return delegate.allowedModules();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable List<Pattern> getAllowedResources() {\n      return delegate.allowedResources();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable Boolean isNoCache() {\n      return delegate.noCache();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable List<Path> getModulePath() {\n      return delegate.modulePath();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable Duration getTimeout() {\n      return delegate.timeout();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable Path getModuleCacheDir() {\n      return delegate.moduleCacheDir();\n    }\n\n    @Deprecated(forRemoval = true)\n    public @Nullable Path getRootDir() {\n      return delegate.rootDir();\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (this == o) {\n        return true;\n      }\n      return o != null\n          && getClass() == o.getClass()\n          && Objects.equals(delegate, ((EvaluatorSettings) o).delegate);\n    }\n\n    @Override\n    public int hashCode() {\n      return delegate.hashCode();\n    }\n\n    @Override\n    public String toString() {\n      return \"EvaluatorSettings{\"\n          + \"externalProperties=\"\n          + delegate.externalProperties()\n          + \", env=\"\n          + delegate.env()\n          + \", allowedModules=\"\n          + delegate.allowedModules()\n          + \", allowedResources=\"\n          + delegate.allowedResources()\n          + \", noCache=\"\n          + delegate.noCache()\n          + \", moduleCacheDir=\"\n          + delegate.moduleCacheDir()\n          + \", modulePath=\"\n          + delegate.modulePath()\n          + \", timeout=\"\n          + delegate.timeout()\n          + \", rootDir=\"\n          + delegate.rootDir()\n          + \", traceMode=\"\n          + delegate.traceMode()\n          + '}';\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/ProjectDependenciesResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.io.Writer;\nimport java.nio.file.Path;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.EconomicSet;\nimport org.pkl.core.PklException;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.packages.Checksums;\nimport org.pkl.core.packages.Dependency;\nimport org.pkl.core.packages.Dependency.LocalDependency;\nimport org.pkl.core.packages.Dependency.RemoteDependency;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.EconomicSets;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Given a project's dependencies, build the dependency list.\n *\n * <p>Resolves all dependencies using the <a\n * href=\"https://research.swtch.com/vgo-mvs#algorithm_1\">Construct Build List</a> algorithm.\n *\n * <p>Resolved dependencies have URI `projectpackage` to indicate that they should be project-local.\n */\npublic final class ProjectDependenciesResolver {\n  private final Project project;\n  private final PackageResolver packageResolver;\n  private final Writer logWriter;\n  private final EconomicMap<CanonicalPackageUri, Dependency> resolvedDependencies =\n      EconomicMaps.create();\n\n  private final EconomicSet<PackageUri> alreadyHandledDependencies = EconomicSets.create();\n\n  public ProjectDependenciesResolver(\n      Project project, PackageResolver packageResolver, Writer logWriter) {\n    this.project = project;\n    this.packageResolver = packageResolver;\n    this.logWriter = logWriter;\n  }\n\n  public ProjectDeps resolve() {\n    buildResolvedDependencies(project.getDependencies());\n    for (var localProject : project.getDependencies().localDependencies().values()) {\n      var packageUri = localProject.myPackageUri();\n      assert packageUri != null;\n      var canonicalUri = CanonicalPackageUri.fromPackageUri(packageUri);\n      var resolvedDependency = resolvedDependencies.get(canonicalUri);\n      if (!(resolvedDependencies.get(canonicalUri) instanceof LocalDependency)) {\n        log(\n            String.format(\n                \"WARN: local dependency `%s` was overridden to remote dependency `%s`.\",\n                packageUri.getDisplayName(), resolvedDependency.getPackageUri().getDisplayName()));\n      }\n    }\n    return new ProjectDeps(resolvedDependencies);\n  }\n\n  private void log(String message) {\n    try {\n      logWriter.write(message + IoUtils.getLineSeparator());\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n  }\n\n  private void buildResolvedDependencies(DeclaredDependencies declaredDependencies) {\n    for (var dependency : declaredDependencies.remoteDependencies().values()) {\n      resolveDependenciesOfPackageUri(\n          dependency.getPackageUri().toProjectPackageUri(), dependency.getChecksums());\n    }\n    for (var localDeclaredDependencies : declaredDependencies.localDependencies().values()) {\n      resolveDependencies(localDeclaredDependencies);\n    }\n  }\n\n  private void resolveDependenciesOfPackageUri(\n      PackageUri packageUri, @Nullable Checksums expectedChecksums) {\n    try {\n      if (alreadyHandledDependencies.contains(packageUri)) {\n        return;\n      }\n      var pair = packageResolver.getDependencyMetadataAndComputeChecksum(packageUri);\n      var metadata = pair.first;\n      var computedChecksums = pair.second;\n      if (expectedChecksums != null) {\n        if (!expectedChecksums.getSha256().equals(computedChecksums.getSha256())) {\n          throw new PklException(\n              ErrorMessages.create(\n                  \"invalidDeclaredChecksum\",\n                  packageUri.getDisplayName(),\n                  computedChecksums.getSha256(),\n                  expectedChecksums.getSha256()));\n        }\n      }\n      var dependencyWithChecksum = new RemoteDependency(packageUri, computedChecksums);\n      updateDependency(dependencyWithChecksum);\n      EconomicSets.add(alreadyHandledDependencies, packageUri);\n      for (var transitiveDependency : metadata.getDependencies().values()) {\n        resolveDependenciesOfPackageUri(\n            transitiveDependency.getPackageUri().toProjectPackageUri(),\n            transitiveDependency.getChecksums());\n      }\n    } catch (IOException | SecurityManagerException | PackageLoadError e) {\n      throw new PklException(e.getMessage(), e);\n    }\n  }\n\n  private void resolveDependencies(DeclaredDependencies declaredDependencies) {\n    var packageUri = declaredDependencies.myPackageUri();\n    assert packageUri != null;\n    var projectDir = Path.of(declaredDependencies.projectFileUri()).getParent();\n    var relativePath = IoUtils.relativize(projectDir, this.project.getProjectDir());\n    var localDependency = new LocalDependency(packageUri.toProjectPackageUri(), relativePath);\n    updateDependency(localDependency);\n    buildResolvedDependencies(declaredDependencies);\n  }\n\n  private void updateDependency(Dependency dependency) {\n    var canonicalPackageUri = CanonicalPackageUri.fromPackageUri(dependency.getPackageUri());\n    var currentDependency = resolvedDependencies.get(canonicalPackageUri);\n    if (currentDependency == null\n        || currentDependency.getVersion().compareTo(dependency.getVersion()) < 0) {\n      EconomicMaps.put(resolvedDependencies, canonicalPackageUri, dependency);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/ProjectDeps.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.net.URISyntaxException;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.Map.Entry;\nimport java.util.Objects;\nimport java.util.Set;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.packages.Checksums;\nimport org.pkl.core.packages.Dependency;\nimport org.pkl.core.packages.Dependency.LocalDependency;\nimport org.pkl.core.packages.Dependency.RemoteDependency;\nimport org.pkl.core.packages.DependencyMetadata;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageUtils;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.json.Json;\nimport org.pkl.core.util.json.Json.FormatException;\nimport org.pkl.core.util.json.Json.JsObject;\nimport org.pkl.core.util.json.Json.JsonParseException;\nimport org.pkl.core.util.json.JsonWriter;\n\n/**\n * The Java representation of a project's resolved dependency list. Resolved dependencies are stored\n * as JSON as a sibling file to PklProject. Each key in the JSON file records an entry for each\n * dependency via its base URI, and the major version number.\n *\n * <p>A resolved dependency can either be local or remote. A remote dependency will have its\n * checksums recorded, while a local dependency will point to the relative path of the project\n * holding the dependency.\n *\n * <p>Sample structure:\n *\n * <pre>\n * <code>\n * {\n *   \"schemaVersion\": 1,\n *   \"resolvedDependencies\": {\n *     \"package://example.com/my/package@0\": {\n *       \"type\": \"remote\",\n *       \"uri\": \"projectpackage://example.com/my/package@0.5.0\",\n *       \"checksums\": {\n *         \"sha256\": \"abc123\"\n *       }\n *     },\n *     \"package://example.com/other/package@1\": {\n *       \"type\": \"local\",\n *       \"uri\": \"projectpackage://example.com/other/package@1.5.0\",\n *       \"path\": \"../sibling\"\n *     }\n *   }\n * }\n * </pre>\n * </code>\n */\npublic final class ProjectDeps {\n  private static final Set<Integer> supportedSchemaVersions = Set.of(1);\n\n  private final EconomicMap<CanonicalPackageUri, Dependency> resolvedDependencies;\n\n  public static ProjectDeps parse(Path path)\n      throws IOException, URISyntaxException, JsonParseException {\n    var input = Files.readString(path);\n    return parse(input);\n  }\n\n  public static ProjectDeps parse(String input) throws JsonParseException {\n    var parsed = Json.parseObject(input);\n    var schemaVersion = parsed.getInt(\"schemaVersion\");\n    if (!supportedSchemaVersions.contains(schemaVersion)) {\n      throw new PackageLoadError(\"unsupportedProjectDepsVersion\", schemaVersion);\n    }\n    var resolvedDependencies =\n        parsed.get(\"resolvedDependencies\", ProjectDeps::parseResolvedDependencies);\n    return new ProjectDeps(resolvedDependencies);\n  }\n\n  private static EconomicMap<CanonicalPackageUri, Dependency> parseResolvedDependencies(\n      Object object) throws JsonParseException, URISyntaxException {\n    if (!(object instanceof JsObject jsObj)) {\n      throw new FormatException(\"resolvedDependencies\", \"object\", object.getClass());\n    }\n    var ret = EconomicMaps.<CanonicalPackageUri, Dependency>create(jsObj.size());\n    for (var entry : jsObj.entrySet()) {\n      Dependency resolvedDependency = parseResolvedDependency(entry);\n      var canonicalPackageUri = CanonicalPackageUri.of(entry.getKey());\n      ret.put(canonicalPackageUri, resolvedDependency);\n    }\n    return ret;\n  }\n\n  private static Dependency parseResolvedDependency(Entry<String, Object> entry)\n      throws JsonParseException {\n    var input = entry.getValue();\n    if (!(input instanceof JsObject obj)) {\n      throw new VmExceptionBuilder().evalError(\"invalid object\").build();\n    }\n    var type = obj.getString(\"type\");\n    var uri = obj.get(\"uri\", PackageUtils::parsePackageUriWithoutChecksums);\n    if (type.equals(\"remote\")) {\n      var checksums = DependencyMetadata.parseChecksums(obj.getObject(\"checksums\"));\n      return new RemoteDependency(uri, checksums);\n    } else {\n      assert type.equals(\"local\");\n      var pathStr = obj.getString(\"path\");\n      return new Dependency.LocalDependency(uri, Path.of(pathStr));\n    }\n  }\n\n  public ProjectDeps(EconomicMap<CanonicalPackageUri, Dependency> resolvedDependencies) {\n    this.resolvedDependencies = resolvedDependencies;\n  }\n\n  /** Given a declared dependency, return the resolved dependency. */\n  public @Nullable Dependency get(CanonicalPackageUri canonicalPackageUri) {\n    return resolvedDependencies.get(canonicalPackageUri);\n  }\n\n  /** Serializes project dependencies to JSON, and writes it to the provided output stream. */\n  public void writeTo(OutputStream out) throws IOException {\n    new ProjectDepsWriter(out, resolvedDependencies).write();\n  }\n\n  @Override\n  public String toString() {\n    return \"ProjectDeps {\" + resolvedDependencies + \"}\";\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    ProjectDeps that = (ProjectDeps) o;\n    return EconomicMaps.equals(resolvedDependencies, that.resolvedDependencies);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(resolvedDependencies);\n  }\n\n  private static final class ProjectDepsWriter {\n    private final EconomicMap<CanonicalPackageUri, Dependency> projectDeps;\n    private final JsonWriter jsonWriter;\n\n    private ProjectDepsWriter(\n        OutputStream out, EconomicMap<CanonicalPackageUri, Dependency> projectDeps) {\n      jsonWriter = new JsonWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));\n      jsonWriter.setIndent(\"  \");\n      this.projectDeps = projectDeps;\n    }\n\n    private void writeChecksums(Checksums checksums) throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"sha256\").value(checksums.getSha256());\n      jsonWriter.endObject();\n    }\n\n    private void writeRemoteDependency(RemoteDependency remoteDependency) throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"type\").value(\"remote\");\n      jsonWriter.name(\"uri\").value(remoteDependency.getPackageUri().toString());\n      jsonWriter.name(\"checksums\");\n      assert remoteDependency.getChecksums() != null;\n      writeChecksums(remoteDependency.getChecksums());\n      jsonWriter.endObject();\n    }\n\n    private void writeLocalDependency(LocalDependency localDependency) throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"type\").value(\"local\");\n      jsonWriter.name(\"uri\").value(localDependency.getPackageUri().toString());\n      jsonWriter.name(\"path\").value(IoUtils.toNormalizedPathString(localDependency.getPath()));\n      jsonWriter.endObject();\n    }\n\n    private void write() throws IOException {\n      jsonWriter.beginObject();\n      jsonWriter.name(\"schemaVersion\").value(1);\n      jsonWriter.name(\"resolvedDependencies\");\n      jsonWriter.beginObject();\n      var cursor = projectDeps.getEntries();\n      while (cursor.advance()) {\n        jsonWriter.name(cursor.getKey().toString());\n        var dependency = cursor.getValue();\n        if (dependency instanceof LocalDependency localDependency) {\n          writeLocalDependency(localDependency);\n        } else {\n          writeRemoteDependency((RemoteDependency) dependency);\n        }\n      }\n      jsonWriter.endObject();\n      jsonWriter.endObject();\n      jsonWriter.newline();\n      jsonWriter.close();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/ProjectPackager.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.UncheckedIOException;\nimport java.io.Writer;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.security.DigestOutputStream;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.time.LocalDateTime;\nimport java.time.Month;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipOutputStream;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.PklException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.ast.builder.ImportsAndReadsParser;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.module.ProjectDependenciesManager;\nimport org.pkl.core.module.ResolvedModuleKeys;\nimport org.pkl.core.packages.Checksums;\nimport org.pkl.core.packages.Dependency.LocalDependency;\nimport org.pkl.core.packages.Dependency.RemoteDependency;\nimport org.pkl.core.packages.DependencyMetadata;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.packages.PackageUri;\nimport org.pkl.core.runtime.ModuleResolver;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.ByteArrayUtils;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.GlobResolver;\nimport org.pkl.core.util.GlobResolver.InvalidGlobPatternException;\nimport org.pkl.core.util.IoUtils;\n\n/**\n * Given a list of project directories, prepares artifacts to be published as a package.\n *\n * <p>Validates that relative imports of all included Pkl modules resolve to locations within the\n * package.\n *\n * <p>Given a package URI {@code package://example.com/thepackage@1.0.0}, the following files get\n * created:\n *\n * <ul>\n *   <li><em>thepackage@1.0.0</em> - the metadata JSON file\n *   <li><em>thepackage@1.0.0.sha256</em> - the SHA-256 checksum of the metadata file\n *   <li><em>thepackage@1.0.0.zip</em> - the zip archive containing the contents of the package\n *   <li><em>thepackage@1.0.0.zip.sha256</em> - the SHA-256 checksum of the zip archive\n * </ul>\n */\npublic final class ProjectPackager {\n  /**\n   * Modification time value for all zip entries in a package, to ensure that archives are\n   * reproducible.\n   *\n   * <p>Date is 1980 February 1st (value taken from {@code\n   * org.gradle.api.internal.file.archive.ZipCopyAction}). Note that this date does not contain time\n   * zone information.\n   */\n  private static final LocalDateTime ZIP_ENTRY_MTIME =\n      LocalDateTime.of(1980, Month.FEBRUARY, 1, 0, 0);\n\n  private final EconomicMap<PackageUri, PackageResult> packageResults = EconomicMap.create();\n\n  private final List<Project> projects;\n  private final Path workingDir;\n  private final String outputPathPattern;\n  private final StackFrameTransformer stackFrameTransformer;\n  private final boolean color;\n  private final SecurityManager securityManager;\n  private final PackageResolver packageResolver;\n  private final boolean skipPublishCheck;\n  private final Writer outputWriter;\n\n  public ProjectPackager(\n      List<Project> projects,\n      Path workingDir,\n      String outputPathPattern,\n      StackFrameTransformer stackFrameTransformer,\n      boolean color,\n      SecurityManager securityManager,\n      HttpClient httpClient,\n      boolean skipPublishCheck,\n      Writer outputWriter) {\n    this.projects = projects;\n    this.workingDir = workingDir;\n    this.outputPathPattern = outputPathPattern;\n    this.stackFrameTransformer = stackFrameTransformer;\n    this.color = color;\n    this.securityManager = securityManager;\n    // intentionally use InMemoryPackageResolver\n    this.packageResolver = PackageResolver.getInstance(securityManager, httpClient, null);\n    this.skipPublishCheck = skipPublishCheck;\n    this.outputWriter = outputWriter;\n  }\n\n  private void writeLine(String line) throws IOException {\n    outputWriter.write(line);\n    outputWriter.write(IoUtils.getLineSeparator());\n  }\n\n  public void createPackages() throws IOException {\n    for (var project : projects) {\n      var packageResult = doPackage(project);\n      writeLine(IoUtils.relativize(packageResult.metadataFile(), workingDir).toString());\n      writeLine(IoUtils.relativize(packageResult.metadataChecksumFile(), workingDir).toString());\n      writeLine(IoUtils.relativize(packageResult.zipFile(), workingDir).toString());\n      writeLine(IoUtils.relativize(packageResult.zipChecksumFile(), workingDir).toString());\n      outputWriter.flush();\n    }\n  }\n\n  private Path resolveOutputDirectory(Package pkg) {\n    var substituted =\n        outputPathPattern\n            .replace(\"%{name}\", pkg.name())\n            .replace(\"%{version}\", pkg.version().toString());\n    return workingDir.resolve(substituted);\n  }\n\n  public PackageResult doPackage(Project project) throws IOException {\n    var pkg = project.getPackage();\n    if (pkg == null) {\n      throw new PklException(\n          ErrorMessages.create(\"noPackageDefinedByProject\", project.getProjectFileUri()));\n    }\n    if (packageResults.containsKey(pkg.uri())) {\n      return packageResults.get(pkg.uri());\n    }\n    var files = collectPackageElements(project, pkg);\n    validatePklImportsAndReads(project, files);\n    var outputDir = resolveOutputDirectory(pkg);\n    var metadataFileName = IoUtils.takeLastSegment(pkg.uri().getUri().getPath(), '/');\n    var metadataFile = outputDir.resolve(metadataFileName);\n    var metadataChecksumFile = outputDir.resolve(metadataFileName + \".sha256\");\n    var zipFile = outputDir.resolve(metadataFileName + \".zip\");\n    var zipChecksumFile = outputDir.resolve(metadataFileName + \".zip.sha256\");\n    var zipFileChecksum = createPackageZipAndComputeChecksum(project, files, zipFile);\n    var metadataFileChecksum =\n        createDependencyMetadataAndComputeChecksum(project, pkg, metadataFile, zipFileChecksum);\n    Files.writeString(zipChecksumFile, zipFileChecksum);\n    Files.writeString(metadataChecksumFile, metadataFileChecksum);\n    if (!skipPublishCheck) {\n      checkAlreadyPublishedPackage(pkg, metadataFileChecksum);\n    }\n    var result =\n        new PackageResult(\n            metadataFile, metadataChecksumFile, zipFile, zipChecksumFile, metadataFileChecksum);\n    packageResults.put(pkg.uri(), result);\n    return result;\n  }\n\n  private void checkAlreadyPublishedPackage(Package pkg, String computedChecksum)\n      throws IOException {\n    try {\n      var metadataAndChecksum = packageResolver.getDependencyMetadataAndComputeChecksum(pkg.uri());\n      var receivedChecksum = metadataAndChecksum.second.getSha256();\n      if (!receivedChecksum.equals(computedChecksum)) {\n        throw new PklException(\n            ErrorMessages.create(\n                \"packageAlreadyPublishedWithDifferentContents\",\n                pkg.uri(),\n                computedChecksum,\n                receivedChecksum));\n      }\n    } catch (PackageLoadError e) {\n      if (e.getMessageName().equals(\"badHttpStatusCode\")) {\n        if ((int) e.getArguments()[0] == 404) {\n          return;\n        } else {\n          throw new PklException(\n              ErrorMessages.create(\n                  \"unableToAccessPublishedPackage\",\n                  pkg.name(),\n                  pkg.packageZipUrl(),\n                  e.getArguments()[0]));\n        }\n      }\n      throw e;\n    } catch (SecurityManagerException e) {\n      throw new PklException(e.getMessage());\n    }\n  }\n\n  private String createDependencyMetadataAndComputeChecksum(\n      Project project, Package pkg, Path metadataFile, String zipFileChecksum) throws IOException {\n    var dependencyMetadata = createDependencyMetadata(project, pkg, zipFileChecksum);\n    try (var fos = newDigestOutputStream(Files.newOutputStream((metadataFile)))) {\n      dependencyMetadata.writeTo(fos);\n      return ByteArrayUtils.toHex(fos.getMessageDigest().digest());\n    }\n  }\n\n  /** If the project has a local dependency, package it as well, so we can record its checksum. */\n  private Map<String, RemoteDependency> buildDependencies(Project project) throws IOException {\n    try {\n      var ret =\n          new HashMap<String, RemoteDependency>(\n              project.getDependencies().localDependencies().size()\n                  + project.getDependencies().remoteDependencies().size());\n      // module resolver is only used for reading PklProject.deps.json, so provide one that reads\n      // files.\n      var moduleResolver = new ModuleResolver(List.of(ModuleKeyFactories.file));\n      var projectDependenciesManager =\n          new ProjectDependenciesManager(\n              project.getDependencies(), moduleResolver, this.securityManager);\n      for (var entry : project.getDependencies().remoteDependencies().entrySet()) {\n        var resolved =\n            (RemoteDependency)\n                projectDependenciesManager.getResolvedDependency(entry.getValue().getPackageUri());\n        ret.put(\n            entry.getKey(),\n            new RemoteDependency(\n                resolved.getPackageUri().toExternalPackageUri(), resolved.getChecksums()));\n      }\n      for (var entry : project.getLocalProjectDependencies().entrySet()) {\n        var localProject = entry.getValue();\n        assert localProject.getPackage() != null;\n        var packageUri = localProject.getPackage().uri();\n        var resolved = projectDependenciesManager.getResolvedDependency(packageUri);\n        if (resolved instanceof LocalDependency) {\n          var packageResult = doPackage(localProject);\n          ret.put(\n              entry.getKey(),\n              new RemoteDependency(\n                  packageUri.toExternalPackageUri(),\n                  new Checksums(packageResult.metadataChecksum())));\n        } else {\n          var remoteDep = (RemoteDependency) resolved;\n          ret.put(\n              entry.getKey(),\n              new RemoteDependency(\n                  remoteDep.getPackageUri().toExternalPackageUri(), remoteDep.getChecksums()));\n        }\n      }\n      return ret;\n    } catch (PackageLoadError e) {\n      throw new PklException(\n          ErrorMessages.create(\n              \"unexpectedPackageLoadError\", project.getProjectFileUri(), e.getMessage()),\n          e);\n    }\n  }\n\n  private DependencyMetadata createDependencyMetadata(\n      Project project, Package pkg, String packageZipChecksum) throws IOException {\n    return new DependencyMetadata(\n        pkg.name(),\n        pkg.uri(),\n        pkg.version(),\n        pkg.packageZipUrl(),\n        new Checksums(packageZipChecksum),\n        buildDependencies(project),\n        pkg.sourceCodeUrlScheme(),\n        pkg.sourceCode(),\n        pkg.documentation(),\n        pkg.license(),\n        pkg.licenseText(),\n        pkg.authors(),\n        pkg.issueTracker(),\n        pkg.description(),\n        project.getAnnotations());\n  }\n\n  private DigestOutputStream newDigestOutputStream(OutputStream outputStream) {\n    try {\n      var md = MessageDigest.getInstance(\"SHA-256\");\n      return new DigestOutputStream(outputStream, md);\n    } catch (NoSuchAlgorithmException e) {\n      // SHA-256 is available in all JVM implementations\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  /**\n   * Sets mtime to 0 so package creation is idempotent. Running the packager multiple times produces\n   * the same output.\n   */\n  private String createPackageZipAndComputeChecksum(\n      Project project, List<Path> files, Path outputZipFile) {\n    DigestOutputStream digestOutputStream;\n    try {\n      Files.createDirectories(outputZipFile.getParent());\n      digestOutputStream = newDigestOutputStream(Files.newOutputStream(outputZipFile));\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n    try (var zos = new ZipOutputStream(digestOutputStream)) {\n      for (var file : files) {\n        var relativePath = IoUtils.relativize(file, project.getProjectDir());\n        var zipEntry = new ZipEntry(IoUtils.toNormalizedPathString(relativePath));\n        zipEntry.setTimeLocal(ZIP_ENTRY_MTIME);\n        zos.putNextEntry(zipEntry);\n        Files.copy(file, zos);\n        zos.closeEntry();\n      }\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n    return ByteArrayUtils.toHex(digestOutputStream.getMessageDigest().digest());\n  }\n\n  private void validatePklImportsAndReads(Project project, List<Path> files) {\n    for (var file : files) {\n      if (file.toString().endsWith(\".pkl\")) {\n        validateImportsAndReads(project, file);\n      }\n    }\n  }\n\n  private List<Pattern> getExcludePatterns(Package pkg) {\n    var excludePatterns = new ArrayList<Pattern>();\n    for (String s : pkg.exclude()) {\n      try {\n        excludePatterns.add(GlobResolver.toRegexPattern(s));\n      } catch (InvalidGlobPatternException e) {\n        throw new PklException(e.getMessage(), e);\n      }\n    }\n    return excludePatterns;\n  }\n\n  private List<Path> collectPackageElements(Project project, Package pkg) {\n    var excludePatterns = getExcludePatterns(pkg);\n    try (var stream = Files.walk(project.getProjectDir())) {\n      return stream\n          .filter(Files::isRegularFile)\n          .filter(\n              (it) -> {\n                var relativePath = IoUtils.relativize(it, project.getProjectDir());\n                var fileNameRelativeToProjectRoot = IoUtils.toNormalizedPathString(relativePath);\n                for (var pattern : excludePatterns) {\n                  if (pattern.matcher(it.getFileName().toString()).matches()) {\n                    return false;\n                  }\n                  if (pattern.matcher(fileNameRelativeToProjectRoot).matches()) {\n                    return false;\n                  }\n                }\n                return true;\n              })\n          // Have consistent sort order independent of different file systems\n          .sorted()\n          .collect(Collectors.toList());\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n  }\n\n  private boolean isAbsoluteImport(String importStr) {\n    return importStr.matches(\"\\\\w+:.*\") || importStr.startsWith(\"@\");\n  }\n\n  /**\n   * Parse a Pkl module, and verify that its {@code import}s and {@code read}s resolve to locations\n   * within the package directory.\n   *\n   * <p>Note that these might be glob expressions, so these paths might not actually exist. For\n   * example, an import might look like {@code \"foo/*.pkl\"}, which would resolve as path {@code\n   * `/some/dir/foo/*.pkl`}, which is not a real file. This is just a sanity check to ensure that\n   * the paths can reasonably resolve to a location within the package directory.\n   */\n  public void validateImportsAndReads(Project project, Path pklModulePath) {\n    var imports = getImportsAndReads(pklModulePath);\n    if (imports == null) {\n      return;\n    }\n    for (var importContext : imports) {\n      var importStr = importContext.stringValue();\n      var sourceSection = importContext.sourceSection();\n      if (isAbsoluteImport(importStr)) {\n        continue;\n      }\n      URI importUri;\n      try {\n        importUri = IoUtils.toUri(importStr);\n      } catch (URISyntaxException e) {\n        throw new VmExceptionBuilder()\n            .evalError(\"invalidModuleUri\", importStr)\n            .withSourceSection(sourceSection)\n            .build()\n            .toPklException(stackFrameTransformer, color);\n      }\n      if (importStr.startsWith(\"/\") && !project.getProjectDir().toString().equals(\"/\")) {\n        throw new VmExceptionBuilder()\n            .evalError(\"invalidRelativeProjectImport\", importStr)\n            .withSourceSection(sourceSection)\n            .build()\n            .toPklException(stackFrameTransformer, color);\n      }\n      var currentPath = pklModulePath.getParent();\n      var importPath = Path.of(importUri.getPath());\n      // It's not good enough to just check the normalized path to see whether it exists within the\n      // root dir.\n      // It's possible that the import path resolves to a path outside the project dir,\n      // and then back inside the project dir.\n      for (var i = 0; i < importPath.getNameCount(); i++) {\n        var segment = importPath.getName(i);\n        currentPath = currentPath.resolve(segment);\n        var normalized = currentPath.normalize();\n        if (!normalized.startsWith(project.getProjectDir())) {\n          throw new VmExceptionBuilder()\n              .evalError(\"invalidRelativeProjectImport\", importStr)\n              .withSourceSection(sourceSection)\n              .build()\n              .toPklException(stackFrameTransformer, color);\n        }\n      }\n    }\n  }\n\n  private List<ImportsAndReadsParser.Entry> getImportsAndReads(Path pklModulePath) {\n    try {\n      var moduleKey = ModuleKeys.file(pklModulePath);\n      var resolvedModuleKey = ResolvedModuleKeys.file(moduleKey, moduleKey.getUri(), pklModulePath);\n      return ImportsAndReadsParser.parse(moduleKey, resolvedModuleKey);\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    }\n  }\n\n  public record PackageResult(\n      Path zipFile,\n      Path zipChecksumFile,\n      Path metadataFile,\n      Path metadataChecksumFile,\n      String metadataChecksum) {\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #zipFile()}.\n     */\n    @Deprecated(forRemoval = true)\n    public Path getZipFile() {\n      return zipFile;\n    }\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #zipChecksumFile()}.\n     */\n    @Deprecated(forRemoval = true)\n    public Path getZipChecksumFile() {\n      return zipChecksumFile;\n    }\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #metadataFile()}.\n     */\n    @Deprecated(forRemoval = true)\n    public Path getMetadataFile() {\n      return metadataFile;\n    }\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #metadataChecksumFile()}.\n     */\n    @Deprecated(forRemoval = true)\n    public Path getMetadataChecksumFile() {\n      return metadataChecksumFile;\n    }\n\n    /**\n     * @deprecated As of 0.28.0, replaced by {@link #metadataChecksum()}.\n     */\n    @Deprecated(forRemoval = true)\n    public String getMetadataChecksum() {\n      return metadataChecksum;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/project/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.project;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/repl/ReplRequest.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.repl;\n\nimport java.net.URI;\n\npublic abstract class ReplRequest {\n  public final String id;\n\n  private ReplRequest(String id) {\n    if (id.isEmpty()) {\n      throw new IllegalArgumentException(\"Request ID must be empty.\");\n    }\n    this.id = id;\n  }\n\n  /** Requests evaluation of REPL input. */\n  public static final class Eval extends ReplRequest {\n    public final String text;\n    public final boolean evalDefinitions;\n    public final boolean forceResults;\n\n    public Eval(String id, String text, boolean evalDefinitions, boolean forceResults) {\n      super(id);\n      this.text = text;\n      this.evalDefinitions = evalDefinitions;\n      this.forceResults = forceResults;\n    }\n\n    public String toString() {\n      return String.format(\n          \"%s(text=%s,evalDefinitions=%s,forceResults=%s)\",\n          getClass().getSimpleName(), text, evalDefinitions, forceResults);\n    }\n  }\n\n  /** Requests loading of a module. */\n  public static final class Load extends ReplRequest {\n    public final URI uri;\n\n    public Load(String id, URI uri) {\n      super(id);\n      this.uri = uri;\n    }\n\n    public String toString() {\n      return String.format(\"%s(url=%s)\", getClass().getSimpleName(), uri);\n    }\n  }\n\n  public static final class Completion extends ReplRequest {\n    public final String text;\n\n    public Completion(String id, String text) {\n      super(id);\n      this.text = text;\n    }\n\n    public String toString() {\n      return String.format(\"%s(text=%s)\", getClass().getSimpleName(), text);\n    }\n  }\n\n  public static final class Reset extends ReplRequest {\n    public Reset(String id) {\n      super(id);\n    }\n\n    public String toString() {\n      return String.format(\"%s()\", getClass().getSimpleName());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/repl/ReplResponse.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.repl;\n\nimport java.util.*;\n\npublic abstract class ReplResponse {\n  private final String message;\n\n  private ReplResponse(String message) {\n    this.message = message;\n  }\n\n  public String getMessage() {\n    return message;\n  }\n\n  public static final class Completion extends ReplResponse {\n    public static final Completion EMPTY = new Completion(List.of());\n\n    public final Collection<String> members;\n\n    public Completion(Collection<String> members) {\n      super(\"\");\n      this.members = members;\n    }\n\n    public String toString() {\n      return String.format(\"%s(members=%s)\", getClass().getSimpleName(), members);\n    }\n  }\n\n  public static final class EvalSuccess extends ReplResponse {\n    public EvalSuccess(String message) {\n      super(message);\n    }\n\n    public String getResult() {\n      return getMessage();\n    }\n\n    public String toString() {\n      return String.format(\"%s(result=%s)\", getClass().getSimpleName(), getResult());\n    }\n  }\n\n  public static final class EvalError extends ReplResponse {\n    public EvalError(String message) {\n      super(message);\n    }\n\n    public String toString() {\n      return String.format(\"%s(message=%s)\", getClass().getSimpleName(), getMessage());\n    }\n  }\n\n  public static final class IncompleteInput extends ReplResponse {\n    public IncompleteInput(String message) {\n      super(message);\n    }\n\n    public String toString() {\n      return String.format(\"%s(message=%s)\", getClass().getSimpleName(), getMessage());\n    }\n  }\n\n  public static final class InvalidRequest extends ReplResponse {\n    public InvalidRequest(String message) {\n      super(message);\n    }\n\n    public String toString() {\n      return String.format(\"%s(message=%s)\", getClass().getSimpleName(), getMessage());\n    }\n  }\n\n  public static final class InternalError extends ReplResponse {\n    private final Throwable cause;\n\n    public InternalError(Throwable cause) {\n      super(cause.toString());\n      this.cause = cause;\n    }\n\n    public Throwable getCause() {\n      return cause;\n    }\n\n    public String toString() {\n      return String.format(\"%s(cause=%s)\", getClass().getSimpleName(), cause);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/repl/ReplServer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.repl;\n\nimport com.oracle.truffle.api.Truffle;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.util.*;\nimport java.util.stream.Collectors;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.graalvm.polyglot.Context;\nimport org.pkl.core.*;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.ast.*;\nimport org.pkl.core.ast.builder.AstBuilder;\nimport org.pkl.core.ast.member.*;\nimport org.pkl.core.ast.repl.ResolveClassMemberNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.*;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.project.DeclaredDependencies;\nimport org.pkl.core.repl.ReplRequest.Eval;\nimport org.pkl.core.repl.ReplRequest.Load;\nimport org.pkl.core.repl.ReplRequest.Reset;\nimport org.pkl.core.repl.ReplResponse.EvalError;\nimport org.pkl.core.repl.ReplResponse.EvalSuccess;\nimport org.pkl.core.repl.ReplResponse.InvalidRequest;\nimport org.pkl.core.resource.ResourceReader;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.MutableReference;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.SyntaxHighlighter;\nimport org.pkl.parser.Parser;\nimport org.pkl.parser.ParserError;\nimport org.pkl.parser.syntax.Class;\nimport org.pkl.parser.syntax.ClassProperty;\nimport org.pkl.parser.syntax.Expr;\nimport org.pkl.parser.syntax.ImportClause;\nimport org.pkl.parser.syntax.ModuleDecl;\nimport org.pkl.parser.syntax.ReplInput;\n\npublic class ReplServer implements AutoCloseable {\n  private final IndirectCallNode callNode = Truffle.getRuntime().createIndirectCallNode();\n  private final Context polyglotContext;\n  private final VmLanguage language;\n  private final ReplState replState;\n  private final Path workingDir;\n  private final SecurityManager securityManager;\n  private final ModuleResolver moduleResolver;\n  private final VmExceptionRenderer errorRenderer;\n  private final PackageResolver packageResolver;\n  private final @Nullable ProjectDependenciesManager projectDependenciesManager;\n  private final boolean color;\n\n  public ReplServer(\n      SecurityManager securityManager,\n      HttpClient httpClient,\n      Logger logger,\n      Collection<ModuleKeyFactory> moduleKeyFactories,\n      Collection<ResourceReader> resourceReaders,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      @Nullable Path moduleCacheDir,\n      @Nullable DeclaredDependencies projectDependencies,\n      @Nullable String outputFormat,\n      Path workingDir,\n      StackFrameTransformer frameTransformer,\n      boolean color,\n      TraceMode traceMode) {\n\n    this.workingDir = workingDir;\n    this.securityManager = securityManager;\n    this.moduleResolver = new ModuleResolver(moduleKeyFactories);\n    this.errorRenderer =\n        new VmExceptionRenderer(new StackTraceRenderer(frameTransformer), color, true);\n    this.color = color;\n    replState = new ReplState(createEmptyReplModule(BaseModule.getModuleClass().getPrototype()));\n\n    var languageRef = new MutableReference<VmLanguage>(null);\n    packageResolver = PackageResolver.getInstance(securityManager, httpClient, moduleCacheDir);\n    projectDependenciesManager =\n        projectDependencies == null\n            ? null\n            : new ProjectDependenciesManager(projectDependencies, moduleResolver, securityManager);\n    polyglotContext =\n        VmUtils.createContext(\n            () -> {\n              languageRef.set(VmLanguage.get(null));\n              var vmContext = VmContext.get(null);\n              vmContext.initialize(\n                  new VmContext.Holder(\n                      frameTransformer,\n                      securityManager,\n                      httpClient,\n                      moduleResolver,\n                      new ResourceManager(securityManager, resourceReaders),\n                      logger,\n                      environmentVariables,\n                      externalProperties,\n                      moduleCacheDir,\n                      outputFormat,\n                      packageResolver,\n                      projectDependenciesManager,\n                      traceMode,\n                      true));\n            });\n    language = languageRef.get();\n  }\n\n  public List<ReplResponse> handleRequest(ReplRequest request) {\n    polyglotContext.enter();\n    try {\n      if (request instanceof Eval eval) {\n        return handleEval(eval);\n      }\n\n      if (request instanceof Load load) {\n        return handleLoad(load);\n      }\n\n      if (request instanceof ReplRequest.Completion completion) {\n        return handleCompletion(completion);\n      }\n\n      if (request instanceof Reset) {\n        return handleReset();\n      }\n\n      return List.of(\n          new InvalidRequest(\"Unsupported request type: \" + request.getClass().getSimpleName()));\n    } catch (Exception e) {\n      return List.of(new ReplResponse.InternalError(e));\n    } finally {\n      polyglotContext.leave();\n    }\n  }\n\n  @Override\n  public void close() {\n    polyglotContext.close(true);\n    try {\n      packageResolver.close();\n    } catch (IOException ignored) {\n    }\n  }\n\n  private List<ReplResponse> handleEval(Eval request) {\n    var results =\n        evaluate(\n            replState, request.id, request.text, request.evalDefinitions, request.forceResults);\n    return results.stream()\n        .map(\n            result ->\n                result instanceof ReplResponse response\n                    ? response\n                    : new EvalSuccess(render(result)))\n        .collect(Collectors.toList());\n  }\n\n  @SuppressWarnings({\"StatementWithEmptyBody\"})\n  private List<Object> evaluate(\n      ReplState replState,\n      String requestId,\n      String text,\n      boolean evalDefinitions,\n      boolean forceResults) {\n    var parser = new Parser();\n    ReplInput replInputContext;\n    var uri = URI.create(\"repl:\" + requestId);\n\n    try {\n      replInputContext = parser.parseReplInput(text);\n    } catch (ParserError e) {\n      var exception = VmUtils.toVmException(e, text, uri, uri.toString());\n      var errorMessage = errorRenderer.render(exception);\n      return List.of(new EvalError(errorMessage));\n    }\n\n    var results = new ArrayList<>();\n    var module = ModuleKeys.synthetic(uri, workingDir.toUri(), uri, text, false);\n    ResolvedModuleKey resolved;\n    try {\n      resolved = module.resolve(securityManager);\n    } catch (SecurityManagerException e) {\n      throw new VmExceptionBuilder().withCause(e).build();\n    } catch (IOException e) {\n      // resolving a synthetic module should never cause IOException\n      throw new AssertionError(e);\n    }\n\n    var builder =\n        new AstBuilder(\n            VmUtils.loadSource(resolved),\n            language,\n            replState.module.getModuleInfo(),\n            moduleResolver);\n\n    for (var tree : replInputContext.getNodes()) {\n      try {\n        if (tree instanceof Expr expr) {\n          var exprNode = builder.visitExpr(expr);\n          evaluateExpr(replState, exprNode, forceResults, results);\n        } else if (tree instanceof ImportClause importClause) {\n          addStaticModuleProperty(builder.visitImportClause(importClause));\n        } else if (tree instanceof ClassProperty classProperty) {\n          var propertyNode = builder.visitClassProperty(classProperty);\n          var property = addModuleProperty(propertyNode);\n          if (evalDefinitions) {\n            evaluateMemberDef(replState, property, forceResults, results);\n          }\n        } else if (tree instanceof Class clazz) {\n          addStaticModuleProperty(builder.visitClass(clazz));\n        } else if (tree instanceof org.pkl.parser.syntax.TypeAlias typeAlias) {\n          addStaticModuleProperty(builder.visitTypeAlias(typeAlias));\n        } else if (tree instanceof org.pkl.parser.syntax.ClassMethod classMethod) {\n          addModuleMethodDef(builder.visitClassMethod(classMethod));\n        } else if (tree instanceof ModuleDecl) {\n          // do nothing for now\n        } else {\n          results.add(\n              new ReplResponse.InternalError(new IllegalStateException(\"Unexpected parse result\")));\n        }\n      } catch (VmException e) {\n        // TODO: patch stack trace for constants\n        results.add(new EvalError(errorRenderer.render(e)));\n      }\n    }\n\n    return results;\n  }\n\n  private void addStaticModuleProperty(ObjectMember property) {\n    replState.module.getPrototype().addProperty(property);\n  }\n\n  private ObjectMember addModuleProperty(UnresolvedPropertyNode propertyNode) {\n    var needToCreateNewModuleToEnforceLateBinding =\n        !propertyNode.isLocal() && replState.module.hasMember(propertyNode.getName());\n\n    if (needToCreateNewModuleToEnforceLateBinding) {\n      replState.module = createEmptyReplModule(replState.module);\n    }\n\n    var resolveNode =\n        new ResolveClassMemberNode(\n            language, new FrameDescriptor(), propertyNode, replState.module.getVmClass());\n\n    var property =\n        (org.pkl.core.ast.member.ClassProperty)\n            callNode.call(resolveNode.getCallTarget(), replState.module, replState.module);\n\n    replState.module.getVmClass().addProperty(property);\n    return property.getInitializer();\n  }\n\n  private void addModuleMethodDef(UnresolvedMethodNode methodNode) {\n    var needToCreateNewModuleToEnforceLateBinding =\n        !methodNode.isLocal()\n            && replState.module.getVmClass().hasDeclaredMethod(methodNode.getName());\n\n    if (needToCreateNewModuleToEnforceLateBinding) {\n      replState.module = createEmptyReplModule(replState.module);\n    }\n\n    var resolveNode =\n        new ResolveClassMemberNode(\n            language, new FrameDescriptor(), methodNode, replState.module.getVmClass());\n\n    var method =\n        (ClassMethod)\n            callNode.call(resolveNode.getCallTarget(), replState.module, replState.module);\n\n    replState.module.getVmClass().addMethod(method);\n  }\n\n  private void evaluateExpr(\n      ReplState replState, ExpressionNode exprNode, boolean forceResults, List<Object> results) {\n\n    var rootNode =\n        new SimpleRootNode(\n            language, new FrameDescriptor(), exprNode.getSourceSection(), \"\", exprNode);\n\n    var result = callNode.call(rootNode.getCallTarget(), replState.module, replState.module);\n\n    if (forceResults) VmValue.force(result, false);\n    results.add(result);\n  }\n\n  private void evaluateMemberDef(\n      ReplState replState, ObjectMember memberDef, boolean forceResults, List<Object> results) {\n\n    var result =\n        memberDef.getConstantValue() != null\n            ? memberDef.getConstantValue()\n            : callNode.call(memberDef.getCallTarget(), replState.module, replState.module);\n\n    if (forceResults) VmValue.force(result, false);\n    results.add(result);\n  }\n\n  private List<ReplResponse> handleLoad(Load request) {\n    try {\n      var uri = IoUtils.resolve(workingDir.toUri(), request.uri);\n      var moduleToLoad = moduleResolver.resolve(uri);\n      var loadedModule = language.loadModule(moduleToLoad);\n      replState.module =\n          createReplModule(\n              loadedModule.getVmClass().getDeclaredProperties(),\n              loadedModule.getVmClass().getDeclaredMethods(),\n              loadedModule.getMembers(),\n              loadedModule.getParent());\n      return List.of();\n    } catch (VmException e) {\n      return List.of(new EvalError(errorRenderer.render(e)));\n    }\n  }\n\n  private List<ReplResponse> handleCompletion(ReplRequest.Completion request) {\n    var members = new HashSet<String>();\n\n    if (IoUtils.isWhitespace(request.text)) {\n      collectMembers(members, BaseModule.getModule());\n      collectMembers(members, replState.module);\n      return List.of(new ReplResponse.Completion(members));\n    }\n\n    List<Object> results;\n\n    // make sure completion request never affects repl state\n    var tempModule =\n        new ReplState(\n            createReplModule(\n                replState.module.getVmClass().getDeclaredProperties(),\n                replState.module.getVmClass().getDeclaredMethods(),\n                replState.module.getMembers(),\n                replState.module.getParent()));\n    results = evaluate(tempModule, request.id, request.text, false, false);\n\n    if (results.isEmpty()) {\n      return List.of(ReplResponse.Completion.EMPTY);\n    }\n\n    var lastResult = results.get(results.size() - 1);\n    if (lastResult instanceof EvalError || lastResult instanceof ReplResponse.IncompleteInput) {\n      return List.of(ReplResponse.Completion.EMPTY);\n    }\n\n    assert !(lastResult instanceof ReplResponse);\n\n    VmObjectLike composite;\n    if (lastResult instanceof VmObjectLike objectLike) {\n      composite = objectLike;\n    } else {\n      composite = VmUtils.getClass(lastResult).getPrototype();\n    }\n\n    collectMembers(members, composite);\n    return List.of(new ReplResponse.Completion(members));\n  }\n\n  private void collectMembers(Set<String> members, VmObjectLike composite) {\n    composite.iterateMembers(\n        (key, prop) -> {\n          if (key instanceof Identifier) {\n            members.add(key.toString());\n          }\n          return true;\n        });\n    composite\n        .getVmClass()\n        .visitMethodDefsTopDown(\n            fun -> members.add(fun.getName() + (fun.getParameterCount() == 0 ? \"()\" : \"(\")));\n  }\n\n  private List<ReplResponse> handleReset() {\n    replState.module = createEmptyReplModule(BaseModule.getModuleClass().getPrototype());\n    return List.of();\n  }\n\n  private VmTyped createEmptyReplModule(@Nullable VmTyped parent) {\n    return createReplModule(List.of(), List.of(), EconomicMaps.create(), parent);\n  }\n\n  private VmTyped createReplModule(\n      Iterable<org.pkl.core.ast.member.ClassProperty> propertyDefs,\n      Iterable<ClassMethod> methodDefs,\n      UnmodifiableEconomicMap<Object, ObjectMember> moduleMembers,\n      @Nullable VmTyped parent) {\n    var uri = URI.create(\"repl:repl\");\n    var classInfo = PClassInfo.get(\"repl\", \"module\", uri);\n    var moduleKey = ModuleKeys.synthetic(uri, workingDir.toUri(), uri, \"\", false);\n    ResolvedModuleKey resolvedModuleKey;\n    try {\n      resolvedModuleKey = moduleKey.resolve(securityManager);\n    } catch (IOException | SecurityManagerException e) {\n      // should never happen\n      throw new RuntimeException(e);\n    }\n    var moduleInfo =\n        new ModuleInfo(\n            VmUtils.unavailableSourceSection(),\n            VmUtils.unavailableSourceSection(),\n            null,\n            \"repl\",\n            moduleKey,\n            resolvedModuleKey,\n            false);\n    var module =\n        new VmTyped(\n            VmUtils.createEmptyMaterializedFrame(),\n            null, // set by initSuperclass()\n            null,\n            moduleMembers);\n    module.setExtraStorage(moduleInfo);\n    var clazz =\n        new VmClass(\n            VmUtils.unavailableSourceSection(),\n            VmUtils.unavailableSourceSection(),\n            null,\n            List.of(),\n            VmModifier.NONE,\n            classInfo,\n            List.of(),\n            module);\n    if (parent != null) {\n      var superclass = parent.getVmClass();\n      var supertypeNode = TypeNode.forClass(VmUtils.unavailableSourceSection(), superclass);\n      clazz.initSupertype(supertypeNode, superclass);\n    }\n    clazz.addProperties(propertyDefs);\n    clazz.addMethods(methodDefs);\n    return module;\n  }\n\n  private String render(Object value) {\n    var sb = new AnsiStringBuilder(color);\n    var src = VmValueRenderer.multiLine(Integer.MAX_VALUE).render(value);\n    SyntaxHighlighter.writeTo(sb, src);\n    return sb.toString();\n  }\n\n  private static class ReplState {\n    VmTyped module;\n\n    public ReplState(VmTyped module) {\n      this.module = module;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/repl/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.repl;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/resource/Resource.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.resource;\n\nimport java.net.URI;\nimport java.nio.charset.StandardCharsets;\nimport org.pkl.core.util.ByteArrayUtils;\n\n/** An external (file, HTTP, etc.) resource. */\npublic record Resource(URI uri, byte[] bytes) {\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #uri()}\n   */\n  @Deprecated(forRemoval = true)\n  public URI getUri() {\n    return uri;\n  }\n\n  /**\n   * @deprecated As of 0.28.0, replaced by {@link #bytes()}\n   */\n  @Deprecated(forRemoval = true)\n  public byte[] getBytes() {\n    return bytes;\n  }\n\n  /** Returns the text content of this resource. */\n  public String getText() {\n    return new String(bytes, StandardCharsets.UTF_8);\n  }\n\n  /** Returns the content of this resource in Base64. */\n  public String getBase64() {\n    return ByteArrayUtils.base64(bytes);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/resource/ResourceReader.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.resource;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Optional;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.runtime.ReaderBase;\n\n/**\n * SPI for reading external resources from Pkl. Once a resource reader has been registered, Pkl code\n * can read its resources with {@code read(\"<URI>\")}, provided that resource URIs match an entry in\n * the resource allowlist ({@code --allowed-resources}).\n *\n * <p>See {@link ResourceReaders} for predefined resource readers.\n */\npublic interface ResourceReader extends ReaderBase, AutoCloseable {\n  /** The URI scheme associated with resources read by this resource reader. */\n  String getUriScheme();\n\n  /**\n   * Reads the resource with the given URI. Returns {@code Optional.empty()} if a resource with the\n   * given URI cannot be found.\n   *\n   * <p>Supported resource types are:\n   *\n   * <ul>\n   *   <li>{@link String}\n   *   <li>{@link Resource}\n   * </ul>\n   *\n   * Throws:\n   *\n   * <ul>\n   *   <li>{@link IOException} — if an error occurred while reading the resource, outside of the\n   *       resource not being found.\n   *   <li>{@link URISyntaxException} — if the URI format is invalid for the resource.\n   *   <li>{@link SecurityManagerException} — If the resource read is invalid per the security\n   *       manager.\n   * </ul>\n   */\n  Optional<Object> read(URI uri)\n      throws IOException,\n          URISyntaxException,\n          SecurityManagerException,\n          ExternalReaderProcessException;\n\n  /**\n   * Closes this reader, releasing any resources held. See the documentation of factory methods in\n   * {@link ResourceReaders} for which factories need to be closed.\n   */\n  @Override\n  default void close() {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/resource/ResourceReaders.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.resource;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse.BodyHandlers;\nimport java.nio.file.Files;\nimport java.nio.file.LinkOption;\nimport java.nio.file.NoSuchFileException;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.ServiceLoader;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcess;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.externalreader.ExternalResourceResolver;\nimport org.pkl.core.externalreader.ResourceReaderSpec;\nimport org.pkl.core.module.FileResolver;\nimport org.pkl.core.module.ModulePathResolver;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.module.ProjectDependenciesManager;\nimport org.pkl.core.packages.Dependency;\nimport org.pkl.core.packages.Dependency.LocalDependency;\nimport org.pkl.core.packages.PackageAssetUri;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.HttpUtils;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/** Predefined resource readers for OS environment variables and external properties. */\npublic final class ResourceReaders {\n  private ResourceReaders() {}\n\n  /**\n   * A resource reader for OS environment variables. If this resource reader is present, Pkl code\n   * can read environment variable {@code FOO_BAR} with {@code read(\"env:FOO_BAR\")}, provided that\n   * resource URI {@code env:FOO_BAR} matches an entry in the resource allowlist ({@code\n   * --allowed-resources}).\n   */\n  public static ResourceReader environmentVariable() {\n    return EnvironmentVariable.INSTANCE;\n  }\n\n  /**\n   * A resource reader for external properties. If this resource reader is present, Pkl code can\n   * read external property {@code foo.bar} with {@code read(\"prop:foo.bar\")}, provided that\n   * resource URI {@code prop:foo.bar} matches an entry in the resource allowlist ({@code\n   * --allowed-resources}).\n   */\n  public static ResourceReader externalProperty() {\n    return ExternalProperty.INSTANCE;\n  }\n\n  public static ResourceReader file() {\n    return FileResource.INSTANCE;\n  }\n\n  /**\n   * A resource reader for HTTP resources. If this resource reader is present, Pkl code can read\n   * HTTP resource {@code http://apple.com/foo/bar.txt} with {@code\n   * read(\"http://apple.com/foo/bar.txt\")}, provided that resource URI {@code\n   * \"http://apple.com/foo/bar.txt\"} matches an entry in the resource allowlist ({@code\n   * --allowed-resources}).\n   */\n  public static ResourceReader http() {\n    return HttpResource.INSTANCE;\n  }\n\n  /**\n   * A resource reader for HTTPS resources. If this resource reader is present, Pkl code can read\n   * HTTPS resource {@code https://apple.com/foo/bar.txt} with {@code\n   * read(\"https://apple.com/foo/bar.txt\")}, provided that resource URI {@code\n   * \"https://apple.com/foo/bar.txt\"} matches an entry in the resource allowlist ({@code\n   * --allowed-resources}).\n   */\n  public static ResourceReader https() {\n    return HttpsResource.INSTANCE;\n  }\n\n  /**\n   * A resource reader for JVM class path resources. If this resource reader is present, Pkl code\n   * can read class path resource {@code /foo/bar.txt} with {@code read(\"modulepath:foo/bar.txt\")},\n   * provided that resource URI {@code \"modulepath:foo/bar.txt\"} matches an entry in the resource\n   * allowlist ({@code --allowed-resources}).\n   */\n  public static ResourceReader classPath(ClassLoader classLoader) {\n    return new ClassPathResource(classLoader);\n  }\n\n  /**\n   * A resource reader for Pkl module path ({@code --module-path}) resources. If this resource\n   * reader is present, Pkl code can read module path resource {@code /foo/bar.txt} with {@code\n   * read(\"modulepath:foo/bar.txt\")}, provided that resource URI {@code \"modulepath:foo/bar.txt\"}\n   * matches an entry in the resource allowlist ({@code --allowed-resources}).\n   */\n  public static ResourceReader modulePath(ModulePathResolver resolver) {\n    return new ModulePathResource(resolver);\n  }\n\n  /**\n   * A resource reader for {@code package:} resources. If this resource reader is present, Pkl code\n   * can read resources from within packages with {@code\n   * read(\"package://example.com/foo@1.0.0#/foo.txt\")}, or using dependency notation with {@code\n   * read(\"@foo/foo.txt\")} assuming that the Pkl module is within a project that declares a\n   * dependency named {@code foo}.\n   */\n  public static ResourceReader pkg() {\n    return PackageResource.INSTANCE;\n  }\n\n  public static ResourceReader projectpackage() {\n    return ProjectPackageResource.INSTANCE;\n  }\n\n  /**\n   * Returns resource readers registered as {@link ServiceLoader service providers} of type {@code\n   * org.pkl.core.resource.ResourceReader}.\n   */\n  public static List<ResourceReader> fromServiceProviders() {\n    return FromServiceProviders.INSTANCE;\n  }\n\n  /**\n   * Returns a reader for external reader resources.\n   *\n   * <p>NOTE: {@code process} needs to be {@link ExternalReaderProcess#close closed} to avoid\n   * resource leaks.\n   */\n  public static ResourceReader externalProcess(String scheme, ExternalReaderProcess process) {\n    return new ExternalProcess(scheme, process, 0);\n  }\n\n  /**\n   * Returns a reader for external reader resources.\n   *\n   * <p>NOTE: {@code process} needs to be {@link ExternalReaderProcess#close closed} to avoid\n   * resource leaks.\n   */\n  public static ResourceReader externalProcess(\n      String scheme, ExternalReaderProcess process, long evaluatorId) {\n    return new ExternalProcess(scheme, process, evaluatorId);\n  }\n\n  /** Returns a reader for external and client reader resources. */\n  public static ResourceReader externalResolver(\n      ResourceReaderSpec spec, ExternalResourceResolver resolver) {\n    return new ExternalResolver(spec, resolver);\n  }\n\n  private static final class EnvironmentVariable implements ResourceReader {\n    static final ResourceReader INSTANCE = new EnvironmentVariable();\n\n    @Override\n    public String getUriScheme() {\n      return \"env\";\n    }\n\n    @Override\n    public Optional<Object> read(URI uri) {\n      assert uri.getScheme().equals(\"env\");\n\n      var context = VmContext.get(null);\n      var value = context.getEnvironmentVariables().get(uri.getSchemeSpecificPart());\n      return Optional.ofNullable(value);\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return false;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws SecurityManagerException {\n      securityManager.checkResolveResource(baseUri);\n      var context = VmContext.get(null);\n      var ret = new ArrayList<PathElement>();\n      for (var envVarName : context.getEnvironmentVariables().keySet()) {\n        ret.add(PathElement.opaque(envVarName));\n      }\n      return ret;\n    }\n  }\n\n  // to clearly separate the capability to read properties\n  // from their definition/storage, this class doesn't store\n  // properties but looks them up from the language context\n  private static final class ExternalProperty implements ResourceReader {\n    static final ResourceReader INSTANCE = new ExternalProperty();\n\n    @Override\n    public String getUriScheme() {\n      return \"prop\";\n    }\n\n    @Override\n    public Optional<Object> read(URI uri) {\n      assert uri.getScheme().equals(\"prop\");\n\n      var context = VmContext.get(null);\n      var value = context.getExternalProperties().get(uri.getSchemeSpecificPart());\n      return Optional.ofNullable(value);\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return false;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws SecurityManagerException {\n      securityManager.checkResolveResource(baseUri);\n      var context = VmContext.get(null);\n      var ret = new ArrayList<PathElement>();\n      for (var propName : context.getExternalProperties().keySet()) {\n        ret.add(PathElement.opaque(propName));\n      }\n      return ret;\n    }\n  }\n\n  private static final class FileResource extends UrlResource {\n    static final ResourceReader INSTANCE = new FileResource();\n\n    @Override\n    public Optional<Object> read(URI uri) throws IOException, URISyntaxException {\n      IoUtils.validateFileUri(uri);\n      // Use resolveSecurePath to get a symlink-free path verified under rootDir.\n      var securityManager = VmContext.get(null).getSecurityManager();\n      try {\n        var securePath = securityManager.resolveSecurePath(uri);\n        if (securePath != null) {\n          try (var in = Files.newInputStream(securePath, LinkOption.NOFOLLOW_LINKS)) {\n            var content = in.readAllBytes();\n            return Optional.of(new Resource(uri, content));\n          } catch (NoSuchFileException e) {\n            return Optional.empty();\n          }\n        }\n      } catch (SecurityManagerException e) {\n        throw new IOException(e);\n      }\n      return super.read(uri);\n    }\n\n    @Override\n    public String getUriScheme() {\n      return \"file\";\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws SecurityManagerException {\n      securityManager.checkResolveResource(elementUri);\n      return FileResolver.hasElement(elementUri);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveResource(baseUri);\n      return FileResolver.listElements(baseUri);\n    }\n  }\n\n  private static final class HttpResource extends UrlResource {\n    static final ResourceReader INSTANCE = new HttpResource();\n\n    @Override\n    public String getUriScheme() {\n      return \"http\";\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n  }\n\n  private static final class HttpsResource extends UrlResource {\n    static final ResourceReader INSTANCE = new HttpsResource();\n\n    @Override\n    public String getUriScheme() {\n      return \"https\";\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n  }\n\n  private abstract static class UrlResource implements ResourceReader {\n    @Override\n    public Optional<Object> read(URI uri) throws IOException, URISyntaxException {\n      if (HttpUtils.isHttpUrl(uri)) {\n        var httpClient = VmContext.get(null).getHttpClient();\n        var request = HttpRequest.newBuilder(uri).build();\n        var response = httpClient.send(request, BodyHandlers.ofByteArray());\n        if (response.statusCode() == 404) return Optional.empty();\n        HttpUtils.checkHasStatusCode200(response);\n        return Optional.of(new Resource(uri, response.body()));\n      }\n\n      try {\n        var content = IoUtils.readBytes(uri);\n        return Optional.of(new Resource(uri, content));\n      } catch (FileNotFoundException e) {\n        return Optional.empty();\n      }\n    }\n  }\n\n  private static final class ClassPathResource implements ResourceReader {\n    private final ClassLoader classLoader;\n\n    public ClassPathResource(ClassLoader classLoader) {\n      this.classLoader = classLoader;\n    }\n\n    @Override\n    public String getUriScheme() {\n      return \"modulepath\";\n    }\n\n    @Override\n    public Optional<Object> read(URI uri) throws URISyntaxException {\n      assert uri.getScheme().equals(\"modulepath\");\n      if (uri.getPath() == null) {\n        throw new URISyntaxException(\n            uri.toString(),\n            ErrorMessages.create(\"invalidModuleUriMissingSlash\", uri, \"modulepath\"));\n      }\n      var path = getResourcePath(uri);\n      try (var stream = classLoader.getResourceAsStream(path)) {\n        return stream == null\n            ? Optional.empty()\n            : Optional.of(new Resource(uri, stream.readAllBytes()));\n      } catch (IOException e) {\n        return Optional.empty();\n      }\n    }\n\n    private static String getResourcePath(URI uri) {\n      var path = uri.getPath();\n      assert path.charAt(0) == '/';\n      return path.substring(1);\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager manager, URI uri) throws SecurityManagerException {\n      manager.checkResolveResource(uri);\n      var uriPath = uri.getPath();\n      assert uriPath.charAt(0) == '/';\n      return classLoader.getResource(uriPath.substring(1)) != null;\n    }\n  }\n\n  private static final class ModulePathResource implements ResourceReader {\n    private final ModulePathResolver resolver;\n\n    public ModulePathResource(ModulePathResolver resolver) {\n      this.resolver = resolver;\n    }\n\n    @Override\n    public String getUriScheme() {\n      return \"modulepath\";\n    }\n\n    @Override\n    public Optional<Object> read(URI uri) throws IOException, URISyntaxException {\n      assert uri.getScheme().equals(\"modulepath\");\n\n      if (uri.getPath() == null) {\n        throw new URISyntaxException(\n            uri.toString(),\n            ErrorMessages.create(\"invalidModuleUriMissingSlash\", uri, \"modulepath\"));\n      }\n\n      try {\n        var path = resolver.resolve(uri);\n        var content = Files.readAllBytes(path);\n        return Optional.of(new Resource(uri, content));\n      } catch (FileNotFoundException e) {\n        return Optional.empty();\n      }\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return false;\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws SecurityManagerException {\n      securityManager.checkResolveResource(elementUri);\n      return resolver.hasElement(elementUri);\n    }\n  }\n\n  /** Handler for {@code package} schemes */\n  private static final class PackageResource implements ResourceReader {\n    static final PackageResource INSTANCE = new PackageResource();\n\n    @Override\n    public String getUriScheme() {\n      return \"package\";\n    }\n\n    @Override\n    public Optional<Object> read(URI uri)\n        throws IOException, URISyntaxException, SecurityManagerException {\n      var assetUri = new PackageAssetUri(uri);\n      var bytes = getPackageResolver().getBytes(assetUri, true, null);\n      return Optional.of(new Resource(uri, bytes));\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public boolean hasFragmentPaths() {\n      return true;\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveResource(baseUri);\n      var packageAssetUri = PackageAssetUri.create(baseUri);\n      return getPackageResolver()\n          .listElements(packageAssetUri, packageAssetUri.getPackageUri().getChecksums());\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws IOException, SecurityManagerException {\n      securityManager.checkResolveResource(elementUri);\n      var packageAssetUri = PackageAssetUri.create(elementUri);\n      return getPackageResolver()\n          .hasElement(packageAssetUri, packageAssetUri.getPackageUri().getChecksums());\n    }\n\n    private PackageResolver getPackageResolver() {\n      var packageResolver = VmContext.get(null).getPackageResolver();\n      assert packageResolver != null;\n      return packageResolver;\n    }\n  }\n\n  private static final class ProjectPackageResource implements ResourceReader {\n    static final ProjectPackageResource INSTANCE = new ProjectPackageResource();\n\n    @Override\n    public String getUriScheme() {\n      return \"projectpackage\";\n    }\n\n    @Override\n    public Optional<Object> read(URI uri)\n        throws IOException, URISyntaxException, SecurityManagerException {\n      var assetUri = new PackageAssetUri(uri);\n      var dependency = getProjectDepsResolver().getResolvedDependency(assetUri.getPackageUri());\n      var local = getLocalUri(dependency, assetUri);\n      if (local != null) {\n        var resourceManager = VmContext.get(null).getResourceManager();\n        var securityManager = VmContext.get(null).getSecurityManager();\n        securityManager.checkReadResource(local);\n        var reader = resourceManager.getResourceReader(local);\n        if (reader == null) {\n          throw new VmExceptionBuilder()\n              .evalError(\"noResourceReaderRegistered\", uri.getScheme())\n              .build();\n        }\n        return resourceManager.doRead(reader, local, null);\n      }\n      var remoteDep = (Dependency.RemoteDependency) dependency;\n      var bytes = getPackageResolver().getBytes(assetUri, true, remoteDep.getChecksums());\n      return Optional.of(new Resource(uri, bytes));\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return true;\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return true;\n    }\n\n    @Override\n    public boolean hasFragmentPaths() {\n      return true;\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      securityManager.checkResolveResource(baseUri);\n      var packageAssetUri = PackageAssetUri.create(baseUri);\n      var dependency =\n          getProjectDepsResolver().getResolvedDependency(packageAssetUri.getPackageUri());\n      var local = getLocalUri(dependency, packageAssetUri);\n      if (local != null) {\n        var reader = VmContext.get(null).getResourceManager().getResourceReader(local);\n        if (reader == null) {\n          throw new VmExceptionBuilder()\n              .evalError(\"noResourceReaderRegistered\", local.getScheme())\n              .build();\n        }\n        return reader.listElements(securityManager, local);\n      }\n      var remoteDep = (Dependency.RemoteDependency) dependency;\n      return getPackageResolver()\n          .listElements(PackageAssetUri.create(baseUri), remoteDep.getChecksums());\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      securityManager.checkResolveResource(elementUri);\n      var packageAssetUri = PackageAssetUri.create(elementUri);\n      var dependency =\n          getProjectDepsResolver().getResolvedDependency(packageAssetUri.getPackageUri());\n      var local = getLocalUri(dependency, packageAssetUri);\n      if (local != null) {\n        var reader = VmContext.get(null).getResourceManager().getResourceReader(local);\n        if (reader == null) {\n          throw new VmExceptionBuilder()\n              .evalError(\"noResourceReaderRegistered\", local.getScheme())\n              .build();\n        }\n        return reader.hasElement(securityManager, local);\n      }\n      var remoteDep = (Dependency.RemoteDependency) dependency;\n      return getPackageResolver()\n          .hasElement(PackageAssetUri.create(elementUri), remoteDep.getChecksums());\n    }\n\n    private PackageResolver getPackageResolver() {\n      var packageResolver = VmContext.get(null).getPackageResolver();\n      assert packageResolver != null;\n      return packageResolver;\n    }\n\n    private ProjectDependenciesManager getProjectDepsResolver() {\n      var projectDepsManager = VmContext.get(null).getProjectDependenciesManager();\n      assert projectDepsManager != null;\n      return projectDepsManager;\n    }\n\n    private @Nullable URI getLocalUri(Dependency dependency, PackageAssetUri packageAssetUri) {\n      if (!(dependency instanceof LocalDependency localDependency)) {\n        return null;\n      }\n      return localDependency.resolveAssetUri(\n          getProjectDepsResolver().getProjectBaseUri(), packageAssetUri);\n    }\n  }\n\n  private static class FromServiceProviders {\n\n    private static final List<ResourceReader> INSTANCE;\n\n    static {\n      var loader = IoUtils.createServiceLoader(ResourceReader.class);\n      var readers = new ArrayList<ResourceReader>();\n      loader.forEach(readers::add);\n      INSTANCE = Collections.unmodifiableList(readers);\n    }\n  }\n\n  private static final class ExternalProcess implements ResourceReader {\n    private final String scheme;\n    private final ExternalReaderProcess process;\n    private final long evaluatorId;\n    private ExternalResolver underlying;\n\n    public ExternalProcess(String scheme, ExternalReaderProcess process, long evaluatorId) {\n      this.scheme = scheme;\n      this.process = process;\n      this.evaluatorId = evaluatorId;\n    }\n\n    private ExternalResolver getUnderlyingReader()\n        throws ExternalReaderProcessException, IOException {\n      if (underlying != null) {\n        return underlying;\n      }\n\n      var spec = process.getResourceReaderSpec(scheme);\n      if (spec == null) {\n        throw new ExternalReaderProcessException(\n            ErrorMessages.create(\"externalReaderDoesNotSupportScheme\", \"resource\", scheme));\n      }\n      underlying = new ExternalResolver(spec, process.getResourceResolver(evaluatorId));\n      return underlying;\n    }\n\n    @Override\n    public String getUriScheme() {\n      return scheme;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() throws ExternalReaderProcessException, IOException {\n      return getUnderlyingReader().hasHierarchicalUris();\n    }\n\n    @Override\n    public boolean isGlobbable() throws ExternalReaderProcessException, IOException {\n      return getUnderlyingReader().isGlobbable();\n    }\n\n    @Override\n    public Optional<Object> read(URI uri) throws IOException, ExternalReaderProcessException {\n      return getUnderlyingReader().read(uri);\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      return getUnderlyingReader().hasElement(securityManager, elementUri);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      return getUnderlyingReader().listElements(securityManager, baseUri);\n    }\n\n    @Override\n    public void close() {\n      process.close();\n    }\n  }\n\n  private static final class ExternalResolver implements ResourceReader {\n    private final ResourceReaderSpec readerSpec;\n    private final ExternalResourceResolver resolver;\n\n    public ExternalResolver(ResourceReaderSpec readerSpec, ExternalResourceResolver resolver) {\n      this.readerSpec = readerSpec;\n      this.resolver = resolver;\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() {\n      return readerSpec.hasHierarchicalUris();\n    }\n\n    @Override\n    public boolean isGlobbable() {\n      return readerSpec.isGlobbable();\n    }\n\n    @Override\n    public String getUriScheme() {\n      return readerSpec.scheme();\n    }\n\n    @Override\n    public Optional<Object> read(URI uri) throws IOException {\n      return resolver.read(uri);\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI elementUri)\n        throws SecurityManagerException {\n      return resolver.hasElement(securityManager, elementUri);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException {\n      return resolver.listElements(securityManager, baseUri);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/resource/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.resource;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/AnalyzeModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\n\npublic class AnalyzeModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:analyze\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getImportGraphClass() {\n    return AnalyzeModule.ImportGraphClass.instance;\n  }\n\n  public static VmClass getImportClass() {\n    return AnalyzeModule.ImportClass.instance;\n  }\n\n  private static final class ImportGraphClass {\n    static final VmClass instance = loadClass(\"ImportGraph\");\n  }\n\n  private static final class ImportClass {\n    static final VmClass instance = loadClass(\"Import\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/BaseModule.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport static org.pkl.core.PClassInfo.pklBaseUri;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\n\npublic final class BaseModule extends StdLibModule {\n  static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(pklBaseUri, instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getAnyClass() {\n    return AnyClass.instance;\n  }\n\n  public static VmClass getTypedClass() {\n    return TypedClass.instance;\n  }\n\n  public static VmClass getNullClass() {\n    return NullClass.instance;\n  }\n\n  public static VmClass getNumberClass() {\n    return NumberClass.instance;\n  }\n\n  public static VmClass getIntClass() {\n    return IntClass.instance;\n  }\n\n  public static VmClass getFloatClass() {\n    return FloatClass.instance;\n  }\n\n  public static VmClass getStringClass() {\n    return StringClass.instance;\n  }\n\n  public static VmClass getBooleanClass() {\n    return BooleanClass.instance;\n  }\n\n  public static VmClass getDurationClass() {\n    return DurationClass.instance;\n  }\n\n  public static VmClass getDataSizeClass() {\n    return DataSizeClass.instance;\n  }\n\n  public static VmClass getBytesClass() {\n    return BytesClass.instance;\n  }\n\n  public static VmClass getIntSeqClass() {\n    return IntSeqClass.instance;\n  }\n\n  public static VmClass getCollectionClass() {\n    return CollectionClass.instance;\n  }\n\n  public static VmClass getListClass() {\n    return ListClass.instance;\n  }\n\n  public static VmClass getSetClass() {\n    return SetClass.instance;\n  }\n\n  public static VmClass getListingClass() {\n    return ListingClass.instance;\n  }\n\n  public static VmClass getMapClass() {\n    return MapClass.instance;\n  }\n\n  public static VmClass getMappingClass() {\n    return MappingClass.instance;\n  }\n\n  public static VmClass getDynamicClass() {\n    return DynamicClass.instance;\n  }\n\n  public static VmClass getRenderDirectiveClass() {\n    return RenderDirectiveClass.instance;\n  }\n\n  /**\n   * Returns class pkl.base#Module. For the module class of pkl.base use {@code\n   * getModule().getVmClass()}.\n   */\n  public static VmClass getModuleClass() {\n    return ModuleClass.instance;\n  }\n\n  public static VmClass getClassClass() {\n    return ClassClass.instance;\n  }\n\n  public static VmClass getTypeAliasClass() {\n    return TypeAliasClass.instance;\n  }\n\n  public static VmClass getRegexClass() {\n    return RegexClass.instance;\n  }\n\n  public static VmClass getRegexMatchClass() {\n    return RegexMatchClass.instance;\n  }\n\n  public static VmClass getFunctionClass() {\n    return FunctionClass.instance;\n  }\n\n  public static VmClass getFunctionNClass(int paramCount) {\n    return switch (paramCount) {\n      case 0 -> getFunction0Class();\n      case 1 -> getFunction1Class();\n      case 2 -> getFunction2Class();\n      case 3 -> getFunction3Class();\n      case 4 -> getFunction4Class();\n      case 5 -> getFunction5Class();\n      default -> {\n        CompilerDirectives.transferToInterpreter();\n        throw new IllegalArgumentException(\n            String.format(\"Class `Function%d` does not exist.\", paramCount));\n      }\n    };\n  }\n\n  public static VmClass getFunction0Class() {\n    return Function0Class.instance;\n  }\n\n  public static VmClass getFunction1Class() {\n    return Function1Class.instance;\n  }\n\n  public static VmClass getFunction2Class() {\n    return Function2Class.instance;\n  }\n\n  public static VmClass getFunction3Class() {\n    return Function3Class.instance;\n  }\n\n  public static VmClass getFunction4Class() {\n    return Function4Class.instance;\n  }\n\n  public static VmClass getFunction5Class() {\n    return Function5Class.instance;\n  }\n\n  public static VmClass getPairClass() {\n    return PairClass.instance;\n  }\n\n  public static VmClass getVarArgsClass() {\n    return VarArgsClass.instance;\n  }\n\n  public static VmClass getModuleInfoClass() {\n    return ModuleInfoClass.instance;\n  }\n\n  public static VmClass getAnnotationClass() {\n    return AnnotationClass.instance;\n  }\n\n  public static VmClass getConvertPropertyClass() {\n    return ConvertPropertyClass.instance;\n  }\n\n  public static VmClass getDeprecatedClass() {\n    return DeprecatedClass.instance;\n  }\n\n  public static VmClass getResourceClass() {\n    return ResourceClass.instance;\n  }\n\n  public static VmTypeAlias getNonNullTypeAlias() {\n    return NonNullTypeAlias.instance;\n  }\n\n  public static VmTypeAlias getInt8TypeAlias() {\n    return Int8TypeAlias.instance;\n  }\n\n  public static VmTypeAlias getInt16TypeAlias() {\n    return Int16TypeAlias.instance;\n  }\n\n  public static VmTypeAlias getInt32TypeAlias() {\n    return Int32TypeAlias.instance;\n  }\n\n  public static VmTypeAlias getMixinTypeAlias() {\n    return MixinTypeAlias.instance;\n  }\n\n  public static VmTypeAlias getUIntTypeAlias() {\n    return UIntTypeAlias.instance;\n  }\n\n  public static VmTypeAlias getUInt8TypeAlias() {\n    return UInt8TypeAlias.instance;\n  }\n\n  public static VmTypeAlias getUInt16TypeAlias() {\n    return UInt16TypeAlias.instance;\n  }\n\n  public static VmTypeAlias getUInt32TypeAlias() {\n    return UInt32TypeAlias.instance;\n  }\n\n  public static VmTypeAlias getCharTypeAlias() {\n    return CharTypeAlias.instance;\n  }\n\n  private static final class AnyClass {\n    static final VmClass instance = loadClass(\"Any\");\n  }\n\n  private static final class TypedClass {\n    static final VmClass instance = loadClass(\"Typed\");\n  }\n\n  private static final class NullClass {\n    static final VmClass instance = loadClass(\"Null\");\n  }\n\n  private static final class NumberClass {\n    static final VmClass instance = loadClass(\"Number\");\n  }\n\n  private static final class IntClass {\n    static final VmClass instance = loadClass(\"Int\");\n  }\n\n  private static final class FloatClass {\n    static final VmClass instance = loadClass(\"Float\");\n  }\n\n  private static final class StringClass {\n    static final VmClass instance = loadClass(\"String\");\n  }\n\n  private static final class BooleanClass {\n    static final VmClass instance = loadClass(\"Boolean\");\n  }\n\n  private static final class DurationClass {\n    static final VmClass instance = loadClass(\"Duration\");\n  }\n\n  private static final class DataSizeClass {\n    static final VmClass instance = loadClass(\"DataSize\");\n  }\n\n  private static final class BytesClass {\n    static final VmClass instance = loadClass(\"Bytes\");\n  }\n\n  private static final class IntSeqClass {\n    static final VmClass instance = loadClass(\"IntSeq\");\n  }\n\n  private static final class CollectionClass {\n    static final VmClass instance = loadClass(\"Collection\");\n  }\n\n  private static final class ListClass {\n    static final VmClass instance = loadClass(\"List\");\n  }\n\n  private static final class SetClass {\n    static final VmClass instance = loadClass(\"Set\");\n  }\n\n  private static final class ListingClass {\n    static final VmClass instance = loadClass(\"Listing\");\n  }\n\n  private static final class MapClass {\n    static final VmClass instance = loadClass(\"Map\");\n  }\n\n  private static final class MappingClass {\n    static final VmClass instance = loadClass(\"Mapping\");\n  }\n\n  private static final class DynamicClass {\n    static final VmClass instance = loadClass(\"Dynamic\");\n  }\n\n  private static final class ModuleClass {\n    static final VmClass instance = loadClass(\"Module\");\n  }\n\n  private static final class ClassClass {\n    static final VmClass instance = loadClass(\"Class\");\n  }\n\n  private static final class TypeAliasClass {\n    static final VmClass instance = loadClass(\"TypeAlias\");\n  }\n\n  private static final class RegexClass {\n    static final VmClass instance = loadClass(\"Regex\");\n  }\n\n  private static final class RegexMatchClass {\n    static final VmClass instance = loadClass(\"RegexMatch\");\n  }\n\n  private static final class RenderDirectiveClass {\n    static final VmClass instance = loadClass(\"RenderDirective\");\n  }\n\n  private static final class PairClass {\n    static final VmClass instance = loadClass(\"Pair\");\n  }\n\n  private static final class VarArgsClass {\n    static final VmClass instance = loadClass(\"VarArgs\");\n  }\n\n  private static final class ModuleInfoClass {\n    static final VmClass instance = loadClass(\"ModuleInfo\");\n  }\n\n  private static final class AnnotationClass {\n    static final VmClass instance = loadClass(\"Annotation\");\n  }\n\n  private static final class ConvertPropertyClass {\n    static final VmClass instance = loadClass(\"ConvertProperty\");\n  }\n\n  private static final class DeprecatedClass {\n    static final VmClass instance = loadClass(\"Deprecated\");\n  }\n\n  private static final class ResourceClass {\n    static final VmClass instance = loadClass(\"Resource\");\n  }\n\n  private static final class FunctionClass {\n    static final VmClass instance = loadClass(\"Function\");\n  }\n\n  private static final class Function0Class {\n    static final VmClass instance = loadClass(\"Function0\");\n  }\n\n  private static final class Function1Class {\n    static final VmClass instance = loadClass(\"Function1\");\n  }\n\n  private static final class Function2Class {\n    static final VmClass instance = loadClass(\"Function2\");\n  }\n\n  private static final class Function3Class {\n    static final VmClass instance = loadClass(\"Function3\");\n  }\n\n  private static final class Function4Class {\n    static final VmClass instance = loadClass(\"Function4\");\n  }\n\n  private static final class Function5Class {\n    static final VmClass instance = loadClass(\"Function5\");\n  }\n\n  private static final class NonNullTypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"NonNull\");\n  }\n\n  private static final class Int8TypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"Int8\");\n  }\n\n  private static final class Int16TypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"Int16\");\n  }\n\n  private static final class Int32TypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"Int32\");\n  }\n\n  private static final class UIntTypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"UInt\");\n  }\n\n  private static final class UInt8TypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"UInt8\");\n  }\n\n  private static final class UInt16TypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"UInt16\");\n  }\n\n  private static final class UInt32TypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"UInt32\");\n  }\n\n  private static final class CharTypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"Char\");\n  }\n\n  private static final class MixinTypeAlias {\n    static final VmTypeAlias instance = loadTypeAlias(\"Mixin\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n\n  @TruffleBoundary\n  private static VmTypeAlias loadTypeAlias(String typeAliasName) {\n    var theModule = getModule();\n    return (VmTypeAlias) VmUtils.readMember(theModule, Identifier.get(typeAliasName));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/BenchmarkModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\n\npublic final class BenchmarkModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:Benchmark\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getBenchmarkResultClass() {\n    return BenchmarkResultClass.instance;\n  }\n\n  private static final class BenchmarkResultClass {\n    static final VmClass instance = loadClass(\"BenchmarkResult\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/CommandModule.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\n\npublic final class CommandModule extends StdLibModule {\n  static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:Command\"), instance);\n  }\n\n  private CommandModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getCommandInfoClass() {\n    return CommandInfoClass.instance;\n  }\n\n  public static VmClass getBaseFlagClass() {\n    return BaseFlagClass.instance;\n  }\n\n  public static VmClass getFlagClass() {\n    return FlagClass.instance;\n  }\n\n  public static VmClass getBooleanFlagClass() {\n    return BooleanFlagClass.instance;\n  }\n\n  public static VmClass getCountedFlagClass() {\n    return CountedFlagClass.instance;\n  }\n\n  public static VmClass getArgumentClass() {\n    return ArgumentClass.instance;\n  }\n\n  public static VmClass getImportClass() {\n    return ImportClass.instance;\n  }\n\n  private static final class CommandInfoClass {\n    static final VmClass instance = loadClass(\"CommandInfo\");\n  }\n\n  private static final class BaseFlagClass {\n    static final VmClass instance = loadClass(\"BaseFlag\");\n  }\n\n  private static final class FlagClass {\n    static final VmClass instance = loadClass(\"Flag\");\n  }\n\n  private static final class BooleanFlagClass {\n    static final VmClass instance = loadClass(\"BooleanFlag\");\n  }\n\n  private static final class CountedFlagClass {\n    static final VmClass instance = loadClass(\"CountedFlag\");\n  }\n\n  private static final class ArgumentClass {\n    static final VmClass instance = loadClass(\"Argument\");\n  }\n\n  private static final class ImportClass {\n    static final VmClass instance = loadClass(\"Import\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/CommandSpecParser.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport static org.pkl.core.runtime.VmUtils.REPL_TEXT;\nimport static org.pkl.core.runtime.VmUtils.REPL_TEXT_URI;\n\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.CommandSpec;\nimport org.pkl.core.CommandSpec.Argument;\nimport org.pkl.core.CommandSpec.BooleanFlag;\nimport org.pkl.core.CommandSpec.CompletionCandidates.Fixed;\nimport org.pkl.core.CommandSpec.CountedFlag;\nimport org.pkl.core.CommandSpec.Option.BadValue;\nimport org.pkl.core.CommandSpec.Option.MissingOption;\nimport org.pkl.core.FileOutput;\nimport org.pkl.core.PNull;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.expression.literal.AmendModuleNodeGen;\nimport org.pkl.core.ast.expression.literal.PropertiesLiteralNodeGen;\nimport org.pkl.core.ast.expression.unary.ImportNode;\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.ast.member.DefaultPropertyBodyNode;\nimport org.pkl.core.ast.member.ModuleNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.GlobResolver;\nimport org.pkl.core.util.GlobResolver.InvalidGlobPatternException;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.Pair;\n\n/** Runs commands. */\npublic final class CommandSpecParser {\n\n  private final ModuleResolver moduleResolver;\n  private final SecurityManager securityManager;\n  private final StackFrameTransformer frameTransformer;\n  private final boolean color;\n  private final Set<String> reservedFlagNames;\n  private final Set<String> reservedFlagShortNames;\n  private final Function<VmTyped, FileOutput> makeFileOutput;\n\n  public CommandSpecParser(\n      ModuleResolver moduleResolver,\n      SecurityManager securityManager,\n      StackFrameTransformer frameTransformer,\n      boolean color,\n      Set<String> reservedFlagNames,\n      Set<String> reservedFlagShortNames,\n      Function<VmTyped, FileOutput> makeFileOutput) {\n    this.moduleResolver = moduleResolver;\n    this.securityManager = securityManager;\n    this.frameTransformer = frameTransformer;\n    this.color = color;\n    this.reservedFlagNames = reservedFlagNames;\n    this.reservedFlagShortNames = reservedFlagShortNames;\n    this.makeFileOutput = makeFileOutput;\n  }\n\n  public CommandSpec parse(VmTyped command) {\n    VmUtils.checkAmends(command, CommandModule.getModule().getVmClass());\n    checkPropertyIsUndefined(command, Identifier.OPTIONS);\n    checkPropertyIsUndefined(command, Identifier.PARENT);\n\n    var optionsClass = getOptionsClass(command);\n    var commandInfo =\n        VmUtils.checkAmends(\n            VmUtils.readMember(command, Identifier.COMMAND), CommandModule.getCommandInfoClass());\n    var commandName = (String) VmUtils.readMember(commandInfo, Identifier.NAME);\n    var optionSpecs = collectOptions(optionsClass);\n\n    return new CommandSpec(\n        commandName,\n        exportNullableString(commandInfo, Identifier.DESCRIPTION),\n        (Boolean) VmUtils.readMember(commandInfo, Identifier.HIDE),\n        (Boolean) VmUtils.readMember(commandInfo, Identifier.NOOP),\n        optionSpecs,\n        collectSubcommands(commandInfo),\n        (options, parent) ->\n            new CommandSpec.State(\n                buildExecutionModule(\n                    command,\n                    buildObject(optionsClass, options),\n                    // NB: these next two lines are the only place where we lose type safety.\n                    // SubcommandState is type-erased to Object in the public API to hide internals.\n                    // Consumers of this API must ensure CommandSpec.apply is only ever passed an\n                    // instance of CommandSpec.State previously returned from a prior invocation\n                    // of CommandSpec.apply.\n                    parent == null ? null : (SubcommandState) parent.contents()),\n                (it) -> handleErrors(() -> evaluateResult(command, (SubcommandState) it))));\n  }\n\n  private List<CommandSpec> collectSubcommands(VmTyped commandInfo) {\n    var subcommands = new ArrayList<CommandSpec>();\n    var subcommandNames = new HashSet<String>();\n    var subcommandsProperty = (VmObject) VmUtils.readMember(commandInfo, Identifier.SUBCOMMANDS);\n    subcommandsProperty.force(false, false);\n    subcommandsProperty.iterateAlreadyForcedMemberValues(\n        (key, member, value) -> {\n          var spec = parse((VmTyped) value);\n          if (subcommandNames.contains(spec.name())) {\n            throw exceptionBuilder()\n                .withSourceSection(member.getSourceSection())\n                .evalError(\n                    \"commandSubcommandConflict\",\n                    VmUtils.readMember(commandInfo, Identifier.NAME),\n                    spec.name())\n                .build();\n          }\n          subcommandNames.add(spec.name());\n          subcommands.add(spec);\n          return true;\n        });\n\n    return subcommands;\n  }\n\n  // region options handling\n\n  private VmClass getOptionsClass(VmTyped command) {\n    var optionsProperty = command.getVmClass().getProperty(Identifier.OPTIONS);\n    if (optionsProperty == null) {\n      // at this point we've asserted the command extends pkl:Command\n      throw PklBugException.unreachableCode();\n    }\n    var optionsPropertyTypeNode = optionsProperty.getTypeNode();\n    if (optionsPropertyTypeNode == null) {\n      // at this point we've asserted the options property exists and that it is neither amended nor\n      // assigned\n      // the only possibility here is that it has a type annotation, otherwise this wouldn't parse\n      throw PklBugException.unreachableCode();\n    }\n    var optionsTypeNode = optionsPropertyTypeNode.getTypeNode();\n    if (optionsTypeNode instanceof TypeNode.TypedTypeNode) {\n      return BaseModule.getTypedClass();\n    }\n    if (!(optionsTypeNode instanceof TypeNode.ClassTypeNode node)) {\n      throw exceptionBuilder()\n          .withSourceSection(optionsTypeNode.getSourceSection())\n          .evalError(\n              \"commandOptionsTypeNotClass\", optionsTypeNode.getSourceSection().getCharacters())\n          .build();\n    }\n    var clazz = node.getVmClass();\n    if (clazz.isAbstract()) {\n      throw exceptionBuilder()\n          .withSourceSection(clazz.getHeaderSection())\n          .evalError(\"commandOptionsTypeAbstractClass\", clazz.getQualifiedName())\n          .build();\n    }\n    return clazz;\n  }\n\n  private Iterable<CommandSpec.Option> collectOptions(VmClass optionsClass) {\n    CommandSpec.Argument lastRepeatedArg = null;\n    EconomicMap<String, CommandSpec.Option> opts = EconomicMap.create();\n\n    var clazz = optionsClass;\n    while (clazz != null) {\n      for (var prop : clazz.getDeclaredProperties()) {\n        var name = prop.getName().toString();\n        if (VmModifier.isLocalOrExternalOrAbstractOrFixedOrConst(prop.getModifiers())\n            || opts.containsKey(name)) continue;\n\n        VmTyped flagAnnotation = null;\n        VmTyped argAnnotation = null;\n        for (var annotation : prop.getAllAnnotations(true)) {\n          if (annotation.getVmClass().isSubclassOf(CommandModule.getBaseFlagClass())) {\n            if (flagAnnotation != null) continue;\n            flagAnnotation = annotation;\n          } else if (annotation.getVmClass() == CommandModule.getArgumentClass()) {\n            if (argAnnotation != null) continue;\n            argAnnotation = annotation;\n          }\n        }\n\n        if (flagAnnotation != null && argAnnotation != null) {\n          throw exceptionBuilder()\n              .withSourceSection(prop.getHeaderSection())\n              .evalError(\"commandOptionBothFlagAndArgument\", prop.getName())\n              .build();\n        }\n\n        if (argAnnotation != null) {\n          var arg = collectArgument(prop, argAnnotation);\n          opts.put(arg.name(), arg);\n          if (arg.repeated()) {\n            if (lastRepeatedArg == null) {\n              lastRepeatedArg = arg;\n            } else {\n              throw exceptionBuilder()\n                  .withSourceSection(optionsClass.getHeaderSection())\n                  .evalError(\"commandArgumentsMultipleRepeated\", lastRepeatedArg.name(), arg.name())\n                  .build();\n            }\n          }\n        } else {\n          CommandSpec.Option flag;\n          if (flagAnnotation == null\n              || flagAnnotation.getVmClass() == CommandModule.getFlagClass()) {\n            flag = collectFlag(prop, flagAnnotation);\n          } else if (flagAnnotation.getVmClass() == CommandModule.getBooleanFlagClass()) {\n            flag = collectBooleanFlag(prop, flagAnnotation);\n          } else if (flagAnnotation.getVmClass() == CommandModule.getCountedFlagClass()) {\n            flag = collectCountedFlag(prop, flagAnnotation);\n          } else {\n            throw PklBugException.unreachableCode();\n          }\n          opts.put(flag.name(), flag);\n        }\n      }\n      clazz = clazz.getSuperclass();\n    }\n\n    return opts.getValues();\n  }\n\n  private void checkFlagNames(ClassProperty prop, String name, @Nullable String shortName) {\n    for (var reserved : reservedFlagNames) {\n      if (reserved.equals(name)) {\n        throw exceptionBuilder()\n            .withSourceSection(prop.getHeaderSection())\n            .evalError(\"commandFlagNameCollision\", prop.getName(), \"name\", \"\")\n            .build();\n      }\n    }\n    for (var reserved : reservedFlagShortNames) {\n      if (reserved.equals(shortName)) {\n        throw exceptionBuilder()\n            .withSourceSection(prop.getHeaderSection())\n            .evalError(\n                \"commandFlagNameCollision\", prop.getName(), \"short name\", \"`\" + shortName + \"` \")\n            .build();\n      }\n    }\n  }\n\n  private CommandSpec.Flag collectFlag(ClassProperty prop, @Nullable VmTyped flagAnnotation) {\n    var name = prop.getName().toString();\n    var behavior = new OptionBehavior(flagAnnotation, true).resolve(prop, false);\n    String shortName = null;\n    boolean hide = false;\n    if (flagAnnotation != null) {\n      shortName = exportNullableString(flagAnnotation, Identifier.SHORT_NAME);\n      hide = (Boolean) VmUtils.readMember(flagAnnotation, Identifier.HIDE);\n    }\n    checkFlagNames(prop, name, shortName);\n\n    return new CommandSpec.Flag(\n        name,\n        VmUtils.exportDocComment(prop.getDocComment()),\n        !behavior.isOptional(),\n        behavior.getEach(),\n        behavior.getAll(),\n        behavior.getCompletionCandidates(),\n        shortName,\n        behavior.getMetavar(),\n        hide,\n        (behavior.getDefaultValue() == COMPLEX_DEFAULT_EXPRESSION\n                || behavior.getDefaultValue() == null)\n            ? null\n            : behavior.getDefaultValue().toString());\n  }\n\n  private CommandSpec.BooleanFlag collectBooleanFlag(ClassProperty prop, VmTyped flagAnnotation) {\n    var name = prop.getName().toString();\n    var shortName = exportNullableString(flagAnnotation, Identifier.SHORT_NAME);\n    checkFlagNames(prop, name, shortName);\n\n    // assert type is Boolean\n    var typeInfo = resolveType(prop);\n    if (!(typeInfo.getFirst() instanceof TypeNode.BooleanTypeNode)) {\n      throw exceptionBuilder()\n          .withSourceSection(prop.getHeaderSection())\n          .evalError(\n              \"commandFlagInvalidType\",\n              prop.getName(),\n              \"BooleanFlag\",\n              typeInfo.getFirst().getSourceSection().getCharacters(),\n              \"Boolean\")\n          .build();\n    }\n\n    return new BooleanFlag(\n        name,\n        VmUtils.exportDocComment(prop.getDocComment()),\n        shortName,\n        (Boolean) VmUtils.readMember(flagAnnotation, Identifier.HIDE),\n        (Boolean) getDefaultValue(prop, false));\n  }\n\n  private CommandSpec.CountedFlag collectCountedFlag(ClassProperty prop, VmTyped flagAnnotation) {\n    var name = prop.getName().toString();\n    var shortName = exportNullableString(flagAnnotation, Identifier.SHORT_NAME);\n    checkFlagNames(prop, name, shortName);\n\n    // assert type is integral\n    var typeInfo = resolveType(prop);\n    if (typeInfo.getFirst().getVmClass() != BaseModule.getIntClass() || typeInfo.getSecond()) {\n      throw exceptionBuilder()\n          .withSourceSection(prop.getHeaderSection())\n          .evalError(\n              \"commandFlagInvalidType\",\n              prop.getName(),\n              \"CountedFlag\",\n              typeInfo.getFirst().getSourceSection().getCharacters(),\n              \"Int\")\n          .build();\n    }\n\n    if (getDefaultValue(prop, true) != null) {\n      throw exceptionBuilder()\n          .withSourceSection(prop.getHeaderSection())\n          .evalError(\"commandOptionUnexpectedDefaultValue\", prop.getName(), \"Argument\")\n          .build();\n    }\n\n    return new CountedFlag(\n        name,\n        VmUtils.exportDocComment(prop.getDocComment()),\n        shortName,\n        (Boolean) VmUtils.readMember(flagAnnotation, Identifier.HIDE));\n  }\n\n  private Argument collectArgument(ClassProperty prop, VmTyped argAnnotation) {\n    var behavior = new OptionBehavior(argAnnotation, false).resolve(prop, true);\n    if (behavior.getDefaultValue() != null) {\n      throw exceptionBuilder()\n          .withSourceSection(prop.getHeaderSection())\n          .evalError(\"commandOptionUnexpectedDefaultValue\", prop.getName(), \"Argument\")\n          .build();\n    } else if (behavior.isOptional() && !behavior.getMultiple()) {\n      throw exceptionBuilder()\n          .withSourceSection(prop.getHeaderSection())\n          .evalError(\"commandArgumentUnexpectedNonRepeatedNullableType\", prop.getName())\n          .build();\n    }\n\n    return new CommandSpec.Argument(\n        prop.getName().toString(),\n        VmUtils.exportDocComment(prop.getDocComment()),\n        behavior.getEach(),\n        behavior.getAll(),\n        behavior.getCompletionCandidates(),\n        behavior.getMultiple());\n  }\n\n  /** Unwrap nullables, constraints, and aliases and return Pair(underlying type, is nullable) */\n  private Pair<TypeNode, Boolean> resolveType(ClassProperty prop) {\n    var propertyTypeNode = prop.getTypeNode();\n    if (propertyTypeNode != null) {\n      return resolveType(propertyTypeNode.getTypeNode());\n    }\n    throw exceptionBuilder()\n        .withSourceSection(prop.getHeaderSection())\n        .evalError(\"commandOptionNoTypeAnnotation\", prop.getName())\n        .build();\n  }\n\n  /** Unwrap nullables, constraints, and aliases and return Pair(underlying type, is nullable) */\n  private Pair<TypeNode, Boolean> resolveType(TypeNode typeNode) {\n    var isNullable = false;\n    while (true) {\n      if (typeNode instanceof TypeNode.NullableTypeNode nullableTypeNode) {\n        isNullable = true;\n        typeNode = nullableTypeNode.getElementTypeNode();\n      } else if (typeNode instanceof TypeNode.ConstrainedTypeNode constrainedTypeNode) {\n        typeNode = constrainedTypeNode.getChildTypeNode();\n      } else if (typeNode instanceof TypeNode.TypeAliasTypeNode typeAliasTypeNode) {\n        if (typeAliasTypeNode.getVmTypeAlias() == BaseModule.getCharTypeAlias()) break;\n        typeNode = typeAliasTypeNode.getAliasedTypeNode();\n      } else {\n        break;\n      }\n    }\n\n    return Pair.of(typeNode, isNullable);\n  }\n\n  // This sigil used to indicate that an option has a default value that is a non-constant expr.\n  // These values cause a flag to be marked optional, but are not shown in CLI help.\n  // Thus, they are not evaluated at spec parse time.\n  private static final Object COMPLEX_DEFAULT_EXPRESSION = new Object() {};\n\n  private @Nullable Object getDefaultValue(ClassProperty prop, boolean requireExplicit) {\n    // if the default is a constant, surface it to the CLI layer informationally\n    var constantValue = prop.getInitializer().getConstantValue();\n    if (constantValue != null) {\n      // Map/List/Set literals may be constants if all their arguments are constants\n      // return the complex default sigil in that case!!\n      // only primitives returned here (non-VmValues: Float, Long, String, Boolean)\n      return constantValue instanceof VmValue ? COMPLEX_DEFAULT_EXPRESSION : constantValue;\n    }\n\n    // if the default is defined, we're not required but don't evaluate the expression\n    // return the sigil value to indicate this\n    var bodyNode = prop.getInitializer().getMemberNode();\n    if (bodyNode != null && !(bodyNode.getBodyNode() instanceof DefaultPropertyBodyNode)) {\n      return COMPLEX_DEFAULT_EXPRESSION;\n    }\n\n    // otherwise, if type-based defaults are allowed\n    // (eg. for @Flag, for string literal and string literal unions)\n    // attempt to discover the type's default\n    if (!requireExplicit) {\n      var resolved = resolveType(prop);\n      if (resolved.getSecond()) {\n        // wrapped by a nullable, no default value\n        return null;\n      }\n      if (resolved.getFirst() instanceof TypeNode.UnionOfStringLiteralsTypeNode union\n          && union.getUnionDefault() != null) {\n        return union.getUnionDefault();\n      } else if (resolved.getFirst() instanceof TypeNode.StringLiteralTypeNode literal) {\n        return literal.getLiteral();\n      }\n    }\n\n    // otherwise we have no default!\n    return null;\n  }\n\n  private class OptionBehavior {\n    private @Nullable BiFunction<String, URI, Object> each;\n    private @Nullable BiFunction<List<Object>, URI, Object> all;\n    private @Nullable Boolean multiple;\n    private @Nullable String metavar;\n    private @Nullable CommandSpec.CompletionCandidates completionCandidates;\n    private @Nullable Object defaultValue = null;\n    private boolean isNullable = false;\n\n    private OptionBehavior(\n        @Nullable BiFunction<String, URI, Object> each,\n        @Nullable BiFunction<List<Object>, URI, Object> all,\n        @Nullable Boolean multiple,\n        @Nullable String metavar,\n        @Nullable CommandSpec.CompletionCandidates completionCandidates) {\n      this.each = each;\n      this.all = all;\n      this.multiple = multiple;\n      this.metavar = metavar;\n      this.completionCandidates = completionCandidates;\n    }\n\n    public OptionBehavior(@Nullable VmTyped annotation, boolean hasMetavar) {\n      this(\n          annotation == null\n              ? null\n              : VmUtils.readMember(annotation, Identifier.CONVERT) instanceof VmFunction func\n                  ? (rawValue, workingDirUri) ->\n                      handleBadValue(() -> handleImports(func.apply(rawValue), workingDirUri))\n                  : null,\n          annotation == null\n              ? null\n              : VmUtils.readMember(annotation, Identifier.TRANSFORM_ALL) instanceof VmFunction func\n                  ? (values, workingDirUri) ->\n                      handleBadValue(\n                          () -> handleImports(func.apply(VmList.create(values)), workingDirUri))\n                  : null,\n          annotation == null\n              ? null\n              : VmUtils.readMember(annotation, Identifier.MULTIPLE) instanceof Boolean bool\n                  ? bool\n                  : null,\n          annotation == null\n              ? null\n              : hasMetavar ? exportNullableString(annotation, Identifier.METAVAR) : null,\n          annotation == null ? null : exportCompletionCandidates(annotation));\n    }\n\n    public OptionBehavior resolve(ClassProperty prop, boolean requireExplicitDefault) {\n      var resolved = resolveType(prop);\n      var typeNode = resolved.getFirst();\n      isNullable = resolved.getSecond();\n      defaultValue = CommandSpecParser.this.getDefaultValue(prop, requireExplicitDefault);\n\n      resolve(prop, typeNode);\n      return this;\n    }\n\n    private void resolve(ClassProperty prop, TypeNode typeNode) {\n      if (resolvePrimitive(typeNode)) {\n        return;\n      }\n      if (typeNode instanceof TypeNode.ListingTypeNode listingTypeNode) {\n        handleElement(listingTypeNode.getValueTypeNode(), prop);\n        if (multiple == null) multiple = true;\n        if (all == null)\n          all =\n              !multiple\n                  ? this::allChooseLast\n                  : (values, workingDirUri) -> {\n                    if (values.isEmpty()) return null;\n                    var builder = new VmObjectBuilder();\n                    values.forEach(builder::addElement);\n                    return builder.toListing();\n                  };\n      } else if (typeNode instanceof TypeNode.MappingTypeNode mappingTypeNode) {\n        assert mappingTypeNode.getKeyTypeNode() != null;\n        handleEntry(mappingTypeNode.getKeyTypeNode(), mappingTypeNode.getValueTypeNode(), prop);\n        if (multiple == null) multiple = true;\n        if (all == null)\n          all =\n              !multiple\n                  ? this::allChooseLast\n                  : (values, workingDirUri) -> {\n                    if (values.isEmpty()) return null;\n                    var builder = new VmObjectBuilder();\n                    values.forEach(\n                        (entry) ->\n                            builder.addEntry(\n                                ((VmPair) entry).getFirst(), ((VmPair) entry).getSecond()));\n                    return builder.toMapping();\n                  };\n      } else if (typeNode instanceof TypeNode.ListTypeNode listTypeNode) {\n        handleElement(listTypeNode.getElementTypeNode(), prop);\n        if (multiple == null) multiple = true;\n        if (all == null)\n          all =\n              !multiple\n                  ? this::allChooseLast\n                  : (values, workingDirUri) -> values.isEmpty() ? null : VmList.create(values);\n      } else if (typeNode instanceof TypeNode.SetTypeNode setTypeNode) {\n        handleElement(setTypeNode.getElementTypeNode(), prop);\n        if (multiple == null) multiple = true;\n        if (all == null)\n          all =\n              !multiple\n                  ? this::allChooseLast\n                  : (values, workingDirUri) -> values.isEmpty() ? null : VmSet.create(values);\n      } else if (typeNode instanceof TypeNode.MapTypeNode mapTypeNode) {\n        handleEntry(mapTypeNode.getKeyTypeNode(), mapTypeNode.getValueTypeNode(), prop);\n        if (multiple == null) multiple = true;\n        if (all == null)\n          all =\n              !multiple\n                  ? this::allChooseLast\n                  : (values, workingDirUri) -> {\n                    if (values.isEmpty()) return null;\n                    var builder = VmMap.builder();\n                    values.forEach(\n                        (entry) ->\n                            builder.add(((VmPair) entry).getFirst(), ((VmPair) entry).getSecond()));\n                    return builder.build();\n                  };\n      } else if (typeNode instanceof TypeNode.PairTypeNode pairTypeNode) {\n        handleEntry(pairTypeNode.getFirstTypeNode(), pairTypeNode.getSecondTypeNode(), prop);\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n      } else if (typeNode instanceof TypeNode.FinalClassTypeNode finalClassTypeNode\n          && (finalClassTypeNode.getVmClass() == BaseModule.getListingClass()\n              || finalClassTypeNode.getVmClass() == BaseModule.getMappingClass()\n              || finalClassTypeNode.getVmClass() == BaseModule.getListClass()\n              || finalClassTypeNode.getVmClass() == BaseModule.getSetClass()\n              || finalClassTypeNode.getVmClass() == BaseModule.getMapClass()\n              || finalClassTypeNode.getVmClass() == BaseModule.getPairClass())) {\n        // if a supported type is provided without type arguments\n        throw exceptionBuilder()\n            .withSourceSection(prop.getHeaderSection())\n            .evalError(\n                \"commandOptionUnsupportedType\",\n                prop.getName(),\n                \"\",\n                typeNode.getSourceSection().getCharacters())\n            .withHint(\n                finalClassTypeNode.getVmClass().getSimpleName()\n                    + \" options must provide \"\n                    + switch (finalClassTypeNode.getVmClass().getTypeParameterCount()) {\n                      case 1 -> \"one type argument.\";\n                      case 2 -> \"two type arguments.\";\n                      default -> throw PklBugException.unreachableCode();\n                    })\n            .build();\n      } else if (each == null && all == null) {\n        // if another type and no transform functions are provided, that's an error\n        throw exceptionBuilder()\n            .withSourceSection(prop.getHeaderSection())\n            .evalError(\n                \"commandOptionUnsupportedType\",\n                prop.getName(),\n                \"\",\n                typeNode.getSourceSection().getCharacters())\n            .withHint(\"Use a supported type or define a transformEach and/or transformAll function\")\n            .build();\n      } else {\n        // if we have at least one transform then allow the type and fill in reasonable defaults\n        if (each == null) each = (rawValue, workingDirUri) -> rawValue;\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_VALUE;\n      }\n    }\n\n    private OptionBehavior resolveTypeArgument(\n        ClassProperty prop, TypeNode typeNode, String typeArgumentName) {\n      if (resolvePrimitive(typeNode)) {\n        return this;\n      }\n\n      if (each == null) {\n        // if another type and no convert function is provided, that's an error\n        throw exceptionBuilder()\n            .withSourceSection(prop.getHeaderSection())\n            .evalError(\n                \"commandOptionUnsupportedType\",\n                prop.getName(),\n                typeArgumentName + \" \",\n                typeNode.getSourceSection().getCharacters())\n            .withHint(\"Use a supported type or define a transformEach and/or transformAll function\")\n            .build();\n      } else if (metavar == null) {\n        // if we have a convert function then allow the type and set a reasonable metavar default\n        metavar = METAVAR_VALUE;\n        // all and multiple don't matter since they're ignored for type args\n      }\n\n      return this;\n    }\n\n    private boolean resolvePrimitive(TypeNode typeNode) {\n      if (typeNode instanceof TypeNode.NumberTypeNode) {\n        if (each == null)\n          each =\n              (rawValue, workingDirUri) -> {\n                try {\n                  return Long.parseLong(rawValue);\n                } catch (NumberFormatException e) {\n                  try {\n                    return Double.parseDouble(rawValue);\n                  } catch (NumberFormatException e2) {\n                    throw BadValue.invalid(rawValue, METAVAR_NUMBER);\n                  }\n                }\n              };\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_NUMBER;\n        return true;\n      } else if (typeNode instanceof TypeNode.FloatTypeNode) {\n        if (each == null)\n          each =\n              (rawValue, workingDirUri) -> {\n                try {\n                  return Double.parseDouble(rawValue);\n                } catch (NumberFormatException e) {\n                  throw BadValue.invalid(rawValue, METAVAR_FLOAT);\n                }\n              };\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_FLOAT;\n        return true;\n      } else if (typeNode instanceof TypeNode.IntTypeNode) {\n        if (each == null) each = eachLong(Long.MIN_VALUE, Long.MAX_VALUE, METAVAR_INT);\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_INT;\n        return true;\n      } else if (typeNode instanceof TypeNode.Int8TypeAliasTypeNode) {\n        if (each == null) each = eachLong(Byte.MIN_VALUE, Byte.MAX_VALUE, METAVAR_INT8);\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_INT8;\n        return true;\n      } else if (typeNode instanceof TypeNode.Int16TypeAliasTypeNode) {\n        if (each == null) each = eachLong(Short.MIN_VALUE, Short.MAX_VALUE, METAVAR_INT16);\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_INT16;\n        return true;\n      } else if (typeNode instanceof TypeNode.Int32TypeAliasTypeNode) {\n        if (each == null) each = eachLong(Integer.MIN_VALUE, Integer.MAX_VALUE, METAVAR_INT32);\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_INT32;\n        return true;\n      } else if (typeNode instanceof TypeNode.UIntTypeAliasTypeNode uIntTypeAliasTypeNode) {\n        var mask = uIntTypeAliasTypeNode.getMask();\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (mask == 0x000000000000FFFFL) {\n          if (each == null) each = eachLong(0, 0x000000000000FFFFL, METAVAR_UINT16);\n          if (metavar == null) metavar = METAVAR_UINT16;\n        } else if (mask == 0x00000000FFFFFFFFL) {\n          if (each == null) each = eachLong(0, 0x00000000FFFFFFFFL, METAVAR_UINT32);\n          if (metavar == null) metavar = METAVAR_UINT32;\n        } else {\n          if (each == null) each = eachLong(0, Long.MAX_VALUE, METAVAR_UINT);\n          if (metavar == null) metavar = METAVAR_UINT;\n        }\n        return true;\n      } else if (typeNode instanceof TypeNode.UInt8TypeAliasTypeNode) {\n        if (each == null) each = eachLong(0, 0x00000000000000FFL, METAVAR_UINT8);\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_UINT8;\n        return true;\n      } else if (typeNode instanceof TypeNode.BooleanTypeNode) {\n        if (each == null)\n          each =\n              (rawValue, workingDirUri) -> {\n                var value = rawValue.toLowerCase();\n                if (TRUE_VALUES.contains(value)) {\n                  return true;\n                } else if (FALSE_VALUES.contains(value)) {\n                  return false;\n                }\n                throw BadValue.invalid(rawValue, \"boolean\");\n              };\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_BOOLEAN;\n        return true;\n      } else if (typeNode instanceof TypeNode.StringTypeNode) {\n        if (each == null) each = (rawValue, workingDirUri) -> rawValue;\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_STRING;\n        return true;\n      } else if (typeNode instanceof TypeNode.TypeAliasTypeNode typeAliasTypeNode\n          && typeAliasTypeNode.getVmTypeAlias() == BaseModule.getCharTypeAlias()) {\n        if (each == null)\n          each =\n              (rawValue, workingDirUri) -> {\n                if (rawValue.length() != 1) throw BadValue.invalid(rawValue, METAVAR_CHAR);\n                return rawValue;\n              };\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = METAVAR_CHAR;\n        return true;\n      } else if (typeNode\n          instanceof TypeNode.UnionOfStringLiteralsTypeNode unionOfStringLiteralsTypeNode) {\n        var choices = unionOfStringLiteralsTypeNode.getStringLiterals().stream().sorted().toList();\n        if (each == null)\n          each =\n              (rawValue, workingDirUri) -> {\n                if (!unionOfStringLiteralsTypeNode.getStringLiterals().contains(rawValue)) {\n                  throw BadValue.invalidChoice(rawValue, choices);\n                }\n                return rawValue;\n              };\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = \"[\" + String.join(\", \", choices) + \"]\";\n        if (completionCandidates == null)\n          completionCandidates = new Fixed(unionOfStringLiteralsTypeNode.getStringLiterals());\n        return true;\n      } else if (typeNode instanceof TypeNode.StringLiteralTypeNode stringLiteralTypeNode) {\n        var choice = stringLiteralTypeNode.getLiteral();\n        if (each == null)\n          each =\n              (rawValue, workingDirUri) -> {\n                if (!rawValue.equals(choice)) {\n                  throw BadValue.invalidChoice(rawValue, choice);\n                }\n                return rawValue;\n              };\n        if (all == null) all = this::allChooseLast;\n        if (multiple == null) multiple = false;\n        if (metavar == null) metavar = \"[\" + choice + \"]\";\n        if (completionCandidates == null) completionCandidates = new Fixed(Set.of(choice));\n        return true;\n      }\n      return false;\n    }\n\n    private static final String METAVAR_NUMBER = \"number\";\n    private static final String METAVAR_FLOAT = \"float\";\n    private static final String METAVAR_INT = \"int\";\n    private static final String METAVAR_INT8 = \"int8\";\n    private static final String METAVAR_INT16 = \"int16\";\n    private static final String METAVAR_INT32 = \"int32\";\n    private static final String METAVAR_UINT = \"uint\";\n    private static final String METAVAR_UINT8 = \"uint8\";\n    private static final String METAVAR_UINT16 = \"uint16\";\n    private static final String METAVAR_UINT32 = \"uint32\";\n    private static final String METAVAR_BOOLEAN = \"[true|false]\";\n    private static final String METAVAR_STRING = \"text\";\n    private static final String METAVAR_CHAR = \"char\";\n    private static final String METAVAR_VALUE = \"value\";\n\n    private static final Set<String> TRUE_VALUES = Set.of(\"true\", \"t\", \"1\", \"yes\", \"y\", \"on\");\n    private static final Set<String> FALSE_VALUES = Set.of(\"false\", \"f\", \"0\", \"no\", \"n\", \"off\");\n\n    /** Sets each and metavar if they're not set */\n    private void handleElement(TypeNode valueType, ClassProperty prop) {\n      if (each != null && metavar != null) return;\n      var transformValue =\n          new OptionBehavior(each, all, multiple, metavar, completionCandidates)\n              .resolveTypeArgument(prop, resolveType(valueType).getFirst(), \"element\");\n      each = transformValue.getEach();\n      metavar = transformValue.getMetavar();\n    }\n\n    /** Sets each and metavar if they're not set */\n    private void handleEntry(TypeNode keyType, TypeNode valueType, ClassProperty prop) {\n      if (each != null && metavar != null) return;\n      var transformKey =\n          new OptionBehavior(each, all, multiple, metavar, completionCandidates)\n              .resolveTypeArgument(prop, resolveType(keyType).getFirst(), \"key\");\n      var transformValue =\n          new OptionBehavior(each, all, multiple, metavar, completionCandidates)\n              .resolveTypeArgument(prop, resolveType(valueType).getFirst(), \"value\");\n      if (each == null)\n        each =\n            (rawValue, workingDirUri) -> {\n              var split = rawValue.split(\"=\", 2);\n              if (split.length != 2) {\n                throw BadValue.badKeyValue(rawValue);\n              }\n              return new VmPair(\n                  transformKey.getEach().apply(split[0], workingDirUri),\n                  transformValue.getEach().apply(split[1], workingDirUri));\n            };\n      if (metavar == null) metavar = transformKey.getMetavar() + \"=\" + transformValue.getMetavar();\n    }\n\n    private @Nullable Object allChooseLast(List<Object> values, URI workingDirUri) {\n      if (!values.isEmpty()) return values.get(values.size() - 1);\n      if (isOptional()) return null;\n      throw new MissingOption();\n    }\n\n    private static BiFunction<String, URI, Object> eachLong(long min, long max, String typeName) {\n      return (rawValue, workingDirUri) -> {\n        try {\n          var longValue = Long.parseLong(rawValue);\n          if (longValue >= min && longValue <= max) {\n            return longValue;\n          }\n          throw BadValue.invalid(rawValue, typeName);\n        } catch (NumberFormatException e) {\n          throw BadValue.invalid(rawValue, typeName);\n        }\n      };\n    }\n\n    private static @Nullable CommandSpec.CompletionCandidates exportCompletionCandidates(\n        VmTyped annotation) {\n      var value = VmUtils.readMember(annotation, Identifier.COMPLETION_CANDIDATES);\n      if (value instanceof VmNull) return null;\n      if (value.equals(\"paths\")) return CommandSpec.CompletionCandidates.PATH;\n\n      // otherwise value is Listing<String> so will export to List<String>\n      if (!(value instanceof VmListing vmListing)) throw PklBugException.unreachableCode();\n      var result = new HashSet<String>(vmListing.getLength());\n      vmListing.forceAndIterateMemberValues((key, member, val) -> result.add((String) val));\n      return new Fixed(result);\n    }\n\n    public BiFunction<String, URI, Object> getEach() {\n      assert each != null;\n      return each;\n    }\n\n    public BiFunction<List<Object>, URI, Object> getAll() {\n      assert all != null;\n      return all;\n    }\n\n    public Boolean getMultiple() {\n      assert multiple != null;\n      return multiple;\n    }\n\n    public String getMetavar() {\n      assert metavar != null;\n      return metavar;\n    }\n\n    public @Nullable CommandSpec.CompletionCandidates getCompletionCandidates() {\n      return completionCandidates;\n    }\n\n    public @Nullable Object getDefaultValue() {\n      return defaultValue;\n    }\n\n    public boolean isOptional() {\n      return isNullable || defaultValue != null;\n    }\n  }\n\n  // endregion\n  // region evaluation path\n\n  /**\n   * Given a map, construct a typed value of the given class.\n   *\n   * <p>Transforms List into VmList, Set into VmSet, and Map into VmMap.\n   */\n  private VmTyped buildObject(VmClass clazz, Map<String, Object> properties) {\n    EconomicMap<Object, ObjectMember> members = EconomicMaps.create(properties.size());\n    for (var prop : properties.entrySet()) {\n      var key = prop.getKey();\n      var value = prop.getValue();\n      if (value == null) continue;\n      var identifier = Identifier.get(key);\n      members.put(identifier, VmUtils.createSyntheticObjectProperty(identifier, \"\", value));\n    }\n    return new VmTyped(\n        VmUtils.createEmptyMaterializedFrame(), clazz.getPrototype(), clazz, members);\n  }\n\n  private record SubcommandState(VmTyped module, EconomicMap<Object, ObjectMember> members) {}\n\n  /**\n   * Synthesize a module that amends the command module and sets options and parent.\n   *\n   * <p>The return value is suitable as an argument to buildExecutionModule or evaluateResult.\n   */\n  private SubcommandState buildExecutionModule(\n      VmTyped module, VmTyped options, @Nullable SubcommandState parent) {\n    EconomicMap<Object, ObjectMember> properties = EconomicMaps.create(parent != null ? 2 : 1);\n    properties.put(\n        Identifier.OPTIONS, VmUtils.createSyntheticObjectProperty(Identifier.OPTIONS, \"\", options));\n\n    if (parent != null) {\n      var language = VmLanguage.get(null);\n      var amendParent =\n          PropertiesLiteralNodeGen.create(\n              VmUtils.unavailableSourceSection(),\n              language,\n              \"\",\n              false,\n              null,\n              new UnresolvedTypeNode[] {},\n              parent.members,\n              new ImportNode(\n                  language,\n                  VmUtils.unavailableSourceSection(),\n                  parent.module.getModuleInfo().getResolvedModuleKey(),\n                  parent.module.getModuleInfo().getModuleKey().getUri()));\n\n      var parentProperty = module.getVmClass().getProperty(Identifier.PARENT);\n      assert parentProperty != null;\n      properties.put(\n          Identifier.PARENT,\n          VmUtils.createObjectProperty(\n              language,\n              VmUtils.unavailableSourceSection(),\n              VmUtils.unavailableSourceSection(),\n              Identifier.PARENT,\n              \"\",\n              new FrameDescriptor(),\n              VmModifier.NONE,\n              amendParent,\n              parentProperty.getTypeNode()));\n    }\n\n    return new SubcommandState(module, properties);\n  }\n\n  /** Given a synthesized module, evaluate it and return the output bytes/files */\n  private CommandSpec.Result evaluateResult(VmTyped module, SubcommandState parent) {\n    var language = VmLanguage.get(null);\n    var context = VmContext.get(null);\n\n    var syntheticModule = ModuleKeys.synthetic(REPL_TEXT_URI, \"\");\n    ResolvedModuleKey resolvedModule;\n    try {\n      resolvedModule = syntheticModule.resolve(securityManager);\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    } catch (SecurityManagerException e) {\n      throw new VmExceptionBuilder().withCause(e).build();\n    }\n    var moduleInfo =\n        new ModuleInfo(\n            VmUtils.unavailableSourceSection(),\n            VmUtils.unavailableSourceSection(),\n            null,\n            REPL_TEXT,\n            syntheticModule,\n            resolvedModule,\n            true);\n\n    var amendModuleNode =\n        AmendModuleNodeGen.create(\n            VmUtils.unavailableSourceSection(),\n            language,\n            new ExpressionNode[] {},\n            parent.members,\n            moduleInfo,\n            new ImportNode(\n                language,\n                VmUtils.unavailableSourceSection(),\n                resolvedModule,\n                module.getModuleInfo().getResolvedModuleKey().getUri()));\n\n    var moduleNode =\n        new ModuleNode(\n            language,\n            VmUtils.unavailableSourceSection(),\n            amendModuleNode.getModuleInfo().getModuleName(),\n            amendModuleNode);\n\n    var evaluated =\n        context\n            .getModuleCache()\n            .getOrLoad(\n                amendModuleNode.getModuleInfo().getModuleKey(),\n                context.getSecurityManager(),\n                context.getModuleResolver(),\n                VmUtils::createEmptyModule,\n                ((moduleKey1,\n                    resolvedModuleKey,\n                    moduleResolver,\n                    source,\n                    emptyModule,\n                    importNode) -> {\n                  moduleNode.getCallTarget().call(emptyModule, emptyModule);\n                  MinPklVersionChecker.check(emptyModule, importNode);\n                }),\n                null);\n\n    var output = VmUtils.readModuleOutput(evaluated);\n    return new CommandSpec.Result(\n        VmUtils.readBytesProperty(output).export(),\n        VmUtils.readFilesProperty(output, makeFileOutput));\n  }\n\n  // endregion\n  // region dynamic import handling\n\n  private static boolean isImport(VmTyped value) {\n    return value.getVmClass() == CommandModule.getImportClass();\n  }\n\n  private static boolean isImport(Object value) {\n    return value instanceof VmTyped vmTyped\n        && vmTyped.getVmClass() == CommandModule.getImportClass();\n  }\n\n  // handle errors from convert/transformAll and correctly format them for the CLI\n  private Object handleBadValue(Supplier<Object> f) {\n    try {\n      return handleErrors(f);\n    } catch (Throwable e) {\n      // add a newline so this prints nicely under \"Error: invalid value for <name>:\"\n      throw new BadValue(\"\\n\" + e.getMessage());\n    }\n  }\n\n  private <T> T handleErrors(Supplier<T> f) {\n    try {\n      return f.get();\n    } catch (VmStackOverflowException e) {\n      if (VmUtils.isPklBug(e)) {\n        throw new VmExceptionBuilder()\n            .bug(\"Stack overflow\")\n            .withCause(e.getCause())\n            .build()\n            .toPklException(frameTransformer, color);\n      }\n      throw e.toPklException(frameTransformer, color);\n    } catch (VmException e) {\n      throw e.toPklException(frameTransformer, color);\n    } catch (Exception e) {\n      throw new PklBugException(e);\n    }\n  }\n\n  // for convert, handle imports by replacing Command.Import values\n  // with imported module or Mapping<String, Module> values\n  // Command.Import instances in returned Pair, List, Set, or Map values are replaced as well\n  // other types or nested instances of the above are not affected\n  private Object handleImports(Object result, URI workingDirUri) {\n    if (result instanceof VmTyped vmTyped && isImport(vmTyped)) {\n      return handleImport(vmTyped, workingDirUri);\n    } else if (result instanceof VmPair vmPair) {\n      if (!isImport(vmPair.getFirst()) && !isImport(vmPair.getSecond())) {\n        return vmPair;\n      }\n      return new VmPair(\n          isImport(vmPair.getFirst())\n              ? handleImport((VmTyped) vmPair.getFirst(), workingDirUri)\n              : vmPair.getFirst(),\n          isImport(vmPair.getSecond())\n              ? handleImport((VmTyped) vmPair.getSecond(), workingDirUri)\n              : vmPair.getSecond());\n    } else if (result instanceof VmCollection vmCollection) {\n      for (var elem : vmCollection) {\n        if (isImport(elem)) {\n          var builder = vmCollection.builder();\n          vmCollection.forEach(\n              it -> builder.add(isImport(it) ? handleImport((VmTyped) it, workingDirUri) : it));\n          return builder.build();\n        }\n      }\n      return vmCollection;\n    } else if (result instanceof VmMap vmMap) {\n      for (var entry : vmMap) {\n        if (isImport(entry.getKey()) || isImport(entry.getValue())) {\n          var builder = VmMap.builder();\n          vmMap.forEach(\n              it ->\n                  builder.add(\n                      isImport(it.getKey())\n                          ? handleImport((VmTyped) it.getKey(), workingDirUri)\n                          : it.getKey(),\n                      isImport(it.getValue())\n                          ? handleImport((VmTyped) it.getValue(), workingDirUri)\n                          : it.getValue()));\n          return builder.build();\n        }\n      }\n    }\n    return result;\n  }\n\n  private Object handleImport(VmTyped mport, URI workingDirUri) {\n    var moduleName = (String) VmUtils.readMember(mport, Identifier.URI);\n    String uriString;\n    // Ported from org.pkl.cli.commons.cli.commands.BaseOptions:\n    try {\n      // Can't just use URI constructor, because URI(null, null, \"C:/foo/bar\", null) turns\n      // into `URI(\"C\", null, \"/foo/bar\", null)`.\n      @SuppressWarnings(\"DuplicateExpressions\")\n      var uri =\n          IoUtils.isUriLike(moduleName)\n              ? new URI(moduleName)\n              : IoUtils.isWindowsAbsolutePath(moduleName)\n                  ? Path.of(moduleName).toUri()\n                  : new URI(null, null, IoUtils.toNormalizedPathString(Path.of(moduleName)), null);\n      uriString =\n          uri.isAbsolute() ? uri.toString() : IoUtils.resolve(workingDirUri, uri).toString();\n    } catch (URISyntaxException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidModuleUri\", moduleName)\n          .withHint(e.getReason())\n          .build();\n    }\n\n    var isGlob = (Boolean) VmUtils.readMember(mport, Identifier.GLOB);\n    var importUri = URI.create(uriString);\n    var language = VmLanguage.get(null);\n\n    // non-glob\n    if (!isGlob) {\n      var moduleKey = moduleResolver.resolve(importUri);\n      return language.loadModule(moduleKey);\n    }\n\n    // glob\n    var globModuleKey = moduleResolver.resolve(importUri);\n\n    try {\n      if (!globModuleKey.isGlobbable()) {\n        throw exceptionBuilder()\n            .evalError(\"cannotGlobUri\", importUri, importUri.getScheme())\n            .build();\n      }\n      var resolvedElements =\n          GlobResolver.resolveGlob(securityManager, globModuleKey, null, null, uriString);\n\n      var builder = new VmObjectBuilder(resolvedElements.size());\n      for (var entry : resolvedElements.entrySet()) {\n        var moduleKey = moduleResolver.resolve(entry.getValue().uri());\n        builder.addEntry(entry.getKey(), language.loadModule(moduleKey));\n      }\n      return builder.toMapping(resolvedElements);\n    } catch (IOException e) {\n      throw exceptionBuilder().evalError(\"ioErrorResolvingGlob\", importUri).withCause(e).build();\n    } catch (ExternalReaderProcessException e) {\n      throw exceptionBuilder().evalError(\"externalReaderFailure\").withCause(e).build();\n    } catch (SecurityManagerException e) {\n      throw exceptionBuilder().withCause(e).build();\n    } catch (InvalidGlobPatternException e) {\n      throw exceptionBuilder()\n          .evalError(\"invalidGlobPattern\", uriString)\n          .withHint(e.getMessage())\n          .build();\n    }\n  }\n\n  // endregion\n  // region utilities\n\n  private static @Nullable String exportNullableString(VmObjectLike value, Object key) {\n    var result = VmValue.export(VmUtils.readMember(value, key));\n    return result instanceof PNull ? null : (String) result;\n  }\n\n  /** Check a value and its parents to see if any assign/amend the given property */\n  private void checkPropertyIsUndefined(VmTyped value, Identifier name) {\n    var member = VmUtils.findMember(value, name);\n    if (member == null) return;\n\n    var memberNode = member.getMemberNode();\n    var sourceSection =\n        memberNode == null\n            ? member.getSourceSection()\n            : memberNode.getBodyNode() instanceof DefaultPropertyBodyNode\n                ? null\n                : memberNode.getSourceSection();\n\n    if (sourceSection != null) {\n      throw exceptionBuilder()\n          .evalError(\"commandMustNotAssignOrAmendProperty\", name)\n          .withSourceSection(sourceSection)\n          .build();\n    }\n  }\n\n  private VmExceptionBuilder exceptionBuilder() {\n    return new VmExceptionBuilder();\n  }\n\n  // endregion\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/FileSystemManager.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.FileStore;\nimport java.nio.file.FileSystem;\nimport java.nio.file.FileSystemAlreadyExistsException;\nimport java.nio.file.FileSystems;\nimport java.nio.file.Path;\nimport java.nio.file.PathMatcher;\nimport java.nio.file.WatchService;\nimport java.nio.file.attribute.UserPrincipalLookupService;\nimport java.nio.file.spi.FileSystemProvider;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.util.EconomicMaps;\n\n/**\n * Manages file systems, potentially across multiple evaluator instances.\n *\n * <p>File systems are only closed when the last usage of it closes.\n */\npublic final class FileSystemManager {\n  private FileSystemManager() {}\n\n  private static final EconomicMap<URI, FileSystem> fileSystems = EconomicMaps.create();\n\n  private static final Map<FileSystem, Integer> counts = new IdentityHashMap<>();\n\n  private static final List<FileSystem> externalFileSystems = new ArrayList<>();\n\n  public static synchronized FileSystem getFileSystem(URI uri) throws IOException {\n    var fs = fileSystems.get(uri);\n    if (fs != null) {\n      counts.put(fs, counts.get(fs) + 1);\n      return fs;\n    }\n    try {\n      fs = new Handle(FileSystems.newFileSystem(uri, new HashMap<>()));\n      fileSystems.put(uri, fs);\n      counts.put(fs, 1);\n      return fs;\n    } catch (FileSystemAlreadyExistsException e) {\n      fs = new Handle(FileSystems.getFileSystem(uri));\n      // Something other than Pkl is holding onto this file system.\n      // Mark it as external, so Pkl does not close it.\n      externalFileSystems.add(fs);\n      fileSystems.put(uri, fs);\n      counts.put(fs, 1);\n      return fs;\n    }\n  }\n\n  /**\n   * Possibly close this file system. Will not close if the file system was initialized externally\n   * to Pkl.\n   */\n  private static synchronized void close(Handle fs) throws IOException {\n    var count = counts.get(fs) - 1;\n    if (count > 0) {\n      counts.put(fs, count);\n      return;\n    }\n    counts.remove(fs);\n    var cursor = fileSystems.getEntries();\n    while (cursor.advance()) {\n      var fileSystem = cursor.getValue();\n      if (fileSystem.equals(fs)) {\n        var key = cursor.getKey();\n        //noinspection resource\n        fileSystems.removeKey(key);\n        break;\n      }\n    }\n    var isExternal = externalFileSystems.contains(fs);\n    if (isExternal) {\n      externalFileSystems.remove(fs);\n    } else {\n      fs.delegate.close();\n    }\n  }\n\n  private static final class Handle extends FileSystem {\n\n    final FileSystem delegate;\n\n    public Handle(FileSystem delegate) {\n      this.delegate = delegate;\n    }\n\n    @Override\n    public FileSystemProvider provider() {\n      return delegate.provider();\n    }\n\n    @Override\n    public void close() throws IOException {\n      FileSystemManager.close(this);\n    }\n\n    @Override\n    public boolean isOpen() {\n      return delegate.isOpen();\n    }\n\n    @Override\n    public boolean isReadOnly() {\n      return delegate.isReadOnly();\n    }\n\n    @Override\n    public String getSeparator() {\n      return delegate.getSeparator();\n    }\n\n    @Override\n    public Iterable<Path> getRootDirectories() {\n      return delegate.getRootDirectories();\n    }\n\n    @Override\n    public Iterable<FileStore> getFileStores() {\n      return delegate.getFileStores();\n    }\n\n    @Override\n    public Set<String> supportedFileAttributeViews() {\n      return delegate.supportedFileAttributeViews();\n    }\n\n    @Override\n    public Path getPath(String first, String... more) {\n      return delegate.getPath(first, more);\n    }\n\n    @Override\n    public PathMatcher getPathMatcher(String syntaxAndPattern) {\n      return delegate.getPathMatcher(syntaxAndPattern);\n    }\n\n    @Override\n    public UserPrincipalLookupService getUserPrincipalLookupService() {\n      return delegate.getUserPrincipalLookupService();\n    }\n\n    @Override\n    public WatchService newWatchService() throws IOException {\n      return delegate.newWatchService();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/Identifier.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/** Note: this class has a natural ordering that is inconsistent with equals. */\npublic final class Identifier implements Comparable<Identifier> {\n  /** Pool for non-local members. */\n  private static final Map<String, Identifier> pool = new ConcurrentHashMap<>();\n\n  /** Pool for local properties. Also used for frame slots of `for` expression variables. */\n  private static final Map<String, Identifier> localPropertyPool = new ConcurrentHashMap<>();\n\n  /** Pool for local methods. */\n  private static final Map<String, Identifier> localMethodPool = new ConcurrentHashMap<>();\n\n  // collection literals\n  public static final Identifier LIST = get(\"List\");\n  public static final Identifier SET = get(\"Set\");\n  public static final Identifier MAP = get(\"Map\");\n\n  // members of pkl.base\n  public static final Identifier ANY = get(\"Any\");\n  public static final Identifier TYPED = get(\"Typed\");\n  public static final Identifier MODULE = get(\"Module\");\n  public static final Identifier MODULE_INFO = get(\"ModuleInfo\");\n\n  // members of pkl.base#Any\n  public static final Identifier TO_STRING = get(\"toString\");\n\n  // members of pkl.base#Annotation and its children\n  public static final Identifier MESSAGE = get(\"message\");\n\n  // members of pkl.base#Listing and pkl.base#Mapping\n  public static final Identifier DEFAULT = get(\"default\");\n\n  // members of pkl.base#BaseValueRenderer subclasses\n  public static final Identifier MODE = get(\"mode\");\n  public static final Identifier INDENT = get(\"indent\");\n  public static final Identifier INDENT_WIDTH = get(\"indentWidth\");\n  public static final Identifier OMIT_NULL_PROPERTIES = get(\"omitNullProperties\");\n  public static final Identifier USE_CUSTOM_STRING_DELIMITERS = get(\"useCustomStringDelimiters\");\n  public static final Identifier IS_STREAM = get(\"isStream\");\n  public static final Identifier RESTRICT_CHARSET = get(\"restrictCharset\");\n  public static final Identifier XML_VERSION = get(\"xmlVersion\");\n  public static final Identifier ROOT_ELEMENT_NAME = get(\"rootElementName\");\n  public static final Identifier ROOT_ELEMENT_ATTRIBUTES = get(\"rootElementAttributes\");\n  public static final Identifier CONVERTERS = get(\"converters\");\n  public static final Identifier CONVERT_PROPERTY_TRANSFORMERS = get(\"convertPropertyTransformers\");\n  public static final Identifier USE_MAPPING = get(\"useMapping\");\n\n  // members of pkl.base#ConvertProperty\n  public static final Identifier RENDER = get(\"render\");\n\n  // members of pkl.base#RegexMatch\n  public static final Identifier VALUE = get(\"value\");\n\n  // members of pkl.base#Module\n  public static final Identifier OUTPUT = get(\"output\");\n  public static final Identifier FILES = get(\"files\");\n\n  // members of pkl.base#{ModuleOutput, Resource, RenderDirective, PcfRenderDirective, XmlComment,\n  // XmlCData}\n  public static final Identifier TEXT = get(\"text\");\n\n  public static final Identifier BYTES_CONSTRUCTOR = get(\"Bytes\");\n\n  // members of pkl.base#{FileOutput}\n  public static final Identifier BYTES = get(\"bytes\");\n\n  // members of pkl.base#ModuleOutput, pkl.base#Resource, pkl.base#String\n  public static final Identifier BASE64 = get(\"base64\");\n\n  // members of pkl.base#Resource\n  public static final Identifier URI = get(\"uri\");\n\n  // members of pkl.base#ModuleInfo\n  public static final Identifier MIN_PKL_VERSION = get(\"minPklVersion\");\n\n  // members of pkl.base#Duration\n  public static final Identifier NS = get(\"ns\");\n  public static final Identifier US = get(\"us\");\n  public static final Identifier MS = get(\"ms\");\n  public static final Identifier S = get(\"s\");\n  public static final Identifier MIN = get(\"min\");\n  public static final Identifier H = get(\"h\");\n  public static final Identifier D = get(\"d\");\n\n  // members of pkl.base#DataSize\n  public static final Identifier B = get(\"b\");\n  public static final Identifier KB = get(\"kb\");\n  public static final Identifier KIB = get(\"kib\");\n  public static final Identifier MB = get(\"mb\");\n  public static final Identifier MIB = get(\"mib\");\n  public static final Identifier GB = get(\"gb\");\n  public static final Identifier GIB = get(\"gib\");\n  public static final Identifier TB = get(\"tb\");\n  public static final Identifier TIB = get(\"tib\");\n  public static final Identifier PB = get(\"pb\");\n  public static final Identifier PIB = get(\"pib\");\n\n  // members of pkl.base#Function(1-5)\n  public static final Identifier APPLY = get(\"apply\");\n\n  // members of pkl.base#PcfRenderDirective\n  public static final Identifier BEFORE = get(\"before\");\n  public static final Identifier AFTER = get(\"after\");\n\n  // members of pkl.base#XmlElement, pkl.jsonnet#ExtVar\n  public static final Identifier IS_XML_ELEMENT = get(\"_isXmlElement\");\n  public static final Identifier NAME = get(\"name\");\n  public static final Identifier ATTRIBUTES = get(\"attributes\");\n  public static final Identifier IS_BLOCK_FORMAT = get(\"isBlockFormat\");\n\n  // members of pkl.jsonnet#ImportStr\n  public static final Identifier PATH = get(\"path\");\n\n  // members of pkl.test\n  public static final Identifier FACTS = get(\"facts\");\n  public static final Identifier EXAMPLES = get(\"examples\");\n\n  // members of pkl.benchmark\n  public static final Identifier ITERATIONS = get(\"iterations\");\n  public static final Identifier ITERATION_TIME = get(\"iterationTime\");\n  public static final Identifier IS_VERBOSE = get(\"isVerbose\");\n  public static final Identifier EXPRESSION = get(\"expression\");\n  public static final Identifier SOURCE_MODULE = get(\"sourceModule\");\n  public static final Identifier SOURCE_TEXT = get(\"sourceText\");\n  public static final Identifier SOURCE_URI = get(\"sourceUri\");\n\n  // members of pkl.yaml\n  public static final Identifier MAX_COLLECTION_ALIASES = get(\"maxCollectionAliases\");\n\n  // members of pkl.Command\n  public static final Identifier OPTIONS = get(\"options\");\n  public static final Identifier PARENT = get(\"parent\");\n  public static final Identifier COMMAND = get(\"command\");\n  public static final Identifier DESCRIPTION = get(\"description\");\n  public static final Identifier HIDE = get(\"hide\");\n  public static final Identifier NOOP = get(\"noOp\");\n  public static final Identifier SUBCOMMANDS = get(\"subcommands\");\n  public static final Identifier SHORT_NAME = get(\"shortName\");\n  public static final Identifier METAVAR = get(\"metavar\");\n  public static final Identifier MULTIPLE = get(\"multiple\");\n  public static final Identifier CONVERT = get(\"convert\");\n  public static final Identifier TRANSFORM_ALL = get(\"transformAll\");\n  public static final Identifier GLOB = get(\"glob\");\n  public static final Identifier COMPLETION_CANDIDATES = get(\"completionCandidates\");\n\n  // common in lambdas etc\n  public static final Identifier IT = get(\"it\");\n\n  private final String name;\n\n  private Identifier(String name) {\n    this.name = name;\n  }\n\n  @TruffleBoundary\n  public static Identifier get(String name) {\n    return pool.computeIfAbsent(name, Identifier::new);\n  }\n\n  @TruffleBoundary\n  public static Identifier localProperty(String name) {\n    return localPropertyPool.computeIfAbsent(name, Identifier::new);\n  }\n\n  @TruffleBoundary\n  public static Identifier localMethod(String name) {\n    return localMethodPool.computeIfAbsent(name, Identifier::new);\n  }\n\n  @TruffleBoundary\n  public static Identifier property(String name, boolean isLocal) {\n    return isLocal ? localProperty(name) : get(name);\n  }\n\n  @TruffleBoundary\n  public static Identifier method(String name, boolean isLocal) {\n    return isLocal ? localMethod(name) : get(name);\n  }\n\n  public Identifier toLocalProperty() {\n    return localProperty(name);\n  }\n\n  public Identifier toRegular() {\n    return get(name);\n  }\n\n  public Identifier toLocalMethod() {\n    return localMethod(name);\n  }\n\n  public boolean isRegular() {\n    return get(name) == this;\n  }\n\n  // not named isLocalProperty() to work around https://bugs.openjdk.java.net/browse/JDK-8185424\n  // (which is apparently related to `Xdoclint:none` option)\n  public boolean isLocalProp() {\n    return localProperty(name) == this;\n  }\n\n  public boolean isLocalMethod() {\n    return localMethod(name) == this;\n  }\n\n  @Override\n  @TruffleBoundary\n  public int compareTo(Identifier other) {\n    return name.compareTo(other.name);\n  }\n\n  // equals and hashCode intentionally inherited from Object\n\n  @Override\n  @TruffleBoundary\n  public String toString() {\n    return name;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/Iterators.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.*;\nimport java.util.function.Consumer;\n\npublic final class Iterators {\n  private Iterators() {}\n\n  @SuppressWarnings(\"unchecked\")\n  public static <T> Iterator<T> emptyTruffleIterator() {\n    return EMPTY_TRUFFLE_ITERATOR;\n  }\n\n  /** An empty iterator that performs all work behind Truffle boundaries. */\n  @SuppressWarnings(\"rawtypes\")\n  private static final Iterator EMPTY_TRUFFLE_ITERATOR =\n      new Iterator() {\n        @TruffleBoundary\n        @Override\n        public boolean hasNext() {\n          return false;\n        }\n\n        @TruffleBoundary\n        @Override\n        public Object next() {\n          throw new NoSuchElementException();\n        }\n\n        @TruffleBoundary\n        @Override\n        public void remove() {\n          throw new IllegalStateException();\n        }\n\n        @TruffleBoundary\n        @Override\n        public void forEachRemaining(Consumer action) {\n          throw new UnsupportedOperationException(\"forEachRemaining\");\n        }\n      };\n\n  /** An iterator for iterables that performs all work behind Truffle boundaries. */\n  public static final class TruffleIterator<T> implements Iterator<T> {\n    private final Iterator<? extends T> delegate;\n\n    // accepting Iterable instead of Iterator puts Iterable.iterator() behind a Truffle boundary\n    @TruffleBoundary\n    public TruffleIterator(Iterable<? extends T> iterable) {\n      delegate = iterable.iterator();\n    }\n\n    @Override\n    @TruffleBoundary\n    public boolean hasNext() {\n      return delegate.hasNext();\n    }\n\n    @Override\n    @TruffleBoundary\n    public T next() {\n      return delegate.next();\n    }\n\n    @Override\n    @TruffleBoundary\n    public void remove() {\n      throw new UnsupportedOperationException(\"remove\");\n    }\n\n    @Override\n    @TruffleBoundary\n    public void forEachRemaining(Consumer<? super T> action) {\n      throw new UnsupportedOperationException(\"forEachRemaining\");\n    }\n  }\n\n  /** A reverse iterator for lists that performs all work behind Truffle boundaries. */\n  public static final class ReverseTruffleIterator<T> implements Iterator<T> {\n    private final ListIterator<? extends T> delegate;\n\n    // accepting List instead of ListIterator puts List.listIterator() behind a Truffle boundary\n    @TruffleBoundary\n    public ReverseTruffleIterator(List<? extends T> list) {\n      delegate = list.listIterator(list.size());\n    }\n\n    @Override\n    @TruffleBoundary\n    public boolean hasNext() {\n      return delegate.hasPrevious();\n    }\n\n    @Override\n    @TruffleBoundary\n    public T next() {\n      return delegate.previous();\n    }\n\n    @Override\n    @TruffleBoundary\n    public void remove() {\n      throw new UnsupportedOperationException(\"remove\");\n    }\n\n    @Override\n    @TruffleBoundary\n    public void forEachRemaining(Consumer<? super T> action) {\n      throw new UnsupportedOperationException(\"forEachRemaining\");\n    }\n  }\n\n  /** A reverse iterator for arrays. */\n  public static final class ReverseArrayIterator implements Iterator<Object> {\n    private final Object[] array;\n\n    private int nextIndex;\n\n    public ReverseArrayIterator(Object[] array) {\n      this.array = array;\n      nextIndex = array.length - 1;\n    }\n\n    @Override\n    public boolean hasNext() {\n      return nextIndex >= 0;\n    }\n\n    @Override\n    public Object next() {\n      return array[nextIndex--];\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/JsonnetModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\n\npublic final class JsonnetModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:jsonnet\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getImportStrClass() {\n    return ImportStrClass.instance;\n  }\n\n  public static VmClass getExtVarClass() {\n    return ExtVarClass.instance;\n  }\n\n  private static final class ImportStrClass {\n    static final VmClass instance = loadClass(\"ImportStr\");\n  }\n\n  private static final class ExtVarClass {\n    static final VmClass instance = loadClass(\"ExtVar\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/KeyLookupSuggestions.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.List;\nimport org.pkl.core.ValueFormatter;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.StringSimilarity;\n\npublic final class KeyLookupSuggestions {\n  private KeyLookupSuggestions() {}\n\n  private static final StringSimilarity STRING_SIMILARITY = new StringSimilarity();\n  // 0.77 is just about low enough to consider two three-character\n  // keys that differ in their first character similar\n  private static final double SIMILARITY_THRESHOLD = 0.77;\n\n  public static List<Candidate> forMap(VmMap map, String key) {\n    var candidates = new ArrayList<Candidate>();\n\n    map.forEach(\n        entry -> {\n          if (!(entry.getKey() instanceof String entryKey)) return;\n          var similarity = STRING_SIMILARITY.similarity(entryKey, key);\n          if (similarity >= SIMILARITY_THRESHOLD) {\n            candidates.add(new Candidate(entryKey, similarity));\n          }\n        });\n\n    candidates.sort(Comparator.naturalOrder());\n    return candidates;\n  }\n\n  public static List<Candidate> forObject(VmObjectLike object, String key) {\n    var candidates = new ArrayList<Candidate>();\n\n    object.iterateMemberValues(\n        (memberKey, member, value) -> {\n          if (!(memberKey instanceof String stringKey)) return true;\n          var similarity = STRING_SIMILARITY.similarity(stringKey, key);\n          if (similarity >= SIMILARITY_THRESHOLD) {\n            candidates.add(new Candidate(stringKey, similarity));\n          }\n          return true;\n        });\n\n    candidates.sort(Comparator.naturalOrder());\n    return candidates;\n  }\n\n  public static final class Candidate implements Comparable<Candidate> {\n    private final String key;\n    private final double similarity;\n\n    public Candidate(String key, double similarity) {\n      this.key = key;\n      this.similarity = similarity;\n    }\n\n    // note: not consistent with equals\n    @Override\n    public int compareTo(Candidate other) {\n      return Double.compare(other.similarity, similarity);\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      return (obj instanceof Candidate candidate && candidate.key.equals(key));\n    }\n\n    @Override\n    public int hashCode() {\n      return key.hashCode();\n    }\n\n    @Override\n    public String toString() {\n      return ValueFormatter.basic().formatStringValue(key, \"\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/LoggerImpl.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport org.pkl.core.Logger;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.StackFrameTransformer;\n\npublic final class LoggerImpl implements Logger {\n\n  private final Logger delegate;\n  private final StackFrameTransformer transformer;\n\n  public LoggerImpl(Logger delegate, StackFrameTransformer transformer) {\n    this.delegate = delegate;\n    this.transformer = transformer;\n  }\n\n  @Override\n  public void trace(String message, StackFrame frame) {\n    delegate.trace(message, transformer.apply(frame));\n  }\n\n  @Override\n  public void warn(String message, StackFrame frame) {\n    delegate.warn(message, transformer.apply(frame));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/MathModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.net.URI;\n\npublic final class MathModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:math\"), instance);\n  }\n\n  private MathModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/MemberLookupSuggestions.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\nimport org.pkl.core.ast.member.ClassMethod;\nimport org.pkl.core.ast.member.Member;\nimport org.pkl.core.runtime.MemberLookupSuggestions.Candidate.Kind;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.StringSimilarity;\n\npublic final class MemberLookupSuggestions {\n  private static final StringSimilarity STRING_SIMILARITY = new StringSimilarity();\n  // 0.77 is just about low enough to consider two three-character\n  // names that differ in their first character similar\n  private static final double SIMILARITY_THRESHOLD = 0.77;\n\n  private final VmObjectLike composite;\n  private final Object memberName;\n  // -1 for property, #arguments for function\n  private final int memberArity;\n\n  private final Set<Candidate.Kind> memberKinds;\n  private final Set<Candidate> candidates = new LinkedHashSet<>();\n\n  public MemberLookupSuggestions(\n      VmObjectLike composite, Object memberName, int memberArity, Set<Candidate.Kind> memberKinds) {\n    this.composite = composite;\n    this.memberName = memberName;\n    this.memberArity = memberArity;\n    this.memberKinds = memberKinds;\n  }\n\n  // use same search order as in member lookup,\n  // so that in case of members with same name,\n  // (only) the correct one is suggested\n  public List<Candidate> find(boolean isImplicitReceiver) {\n    candidates.clear();\n\n    if (isImplicitReceiver) {\n      for (var curr = composite; curr != null; curr = curr.getEnclosingOwner()) {\n        addPropertyCandidates(curr, true);\n        if (curr.isPrototype()) {\n          addMethodCandidates(curr.getVmClass().getDeclaredMethods(), true);\n        }\n      }\n      addPropertyCandidates(BaseModule.getModule(), false);\n      addMethodCandidates(BaseModule.getModule().getVmClass().getMethods(), false);\n    }\n\n    for (var curr = composite; curr != null; curr = curr.getParent()) {\n      addPropertyCandidates(curr, false);\n    }\n    addMethodCandidates(composite.getVmClass().getMethods(), false);\n\n    return candidates.stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());\n  }\n\n  private void addPropertyCandidates(VmObjectLike object, boolean includeLocal) {\n    if (!memberKinds.contains(Kind.PROPERTY)) return;\n\n    for (var member : EconomicMaps.getValues(object.getMembers())) {\n      addIfSimilar(member, Candidate.Kind.PROPERTY, -1, includeLocal);\n    }\n  }\n\n  private void addMethodCandidates(Iterable<ClassMethod> methods, boolean includeLocal) {\n    if (!memberKinds.contains(Kind.METHOD)) return;\n\n    for (var method : methods) {\n      addIfSimilar(method, Candidate.Kind.METHOD, method.getParameterCount(), includeLocal);\n    }\n  }\n\n  private void addIfSimilar(Member member, Candidate.Kind kind, int arity, boolean includeLocal) {\n\n    var memberName = member.getNameOrNull();\n    if (memberName == null) return;\n\n    if (includeLocal || !member.isLocal()) {\n      var nameSimilarity =\n          STRING_SIMILARITY.similarity(memberName.toString(), this.memberName.toString());\n      if (nameSimilarity >= SIMILARITY_THRESHOLD) {\n        var arityDifference = Math.abs(arity - memberArity);\n        var signature = member.getCallSignature();\n        assert signature != null;\n        if (nameSimilarity < 1 || memberArity == 0) {\n          candidates.add(\n              new Candidate(\n                  kind, memberName.toString(), signature, nameSimilarity, arityDifference));\n        } else if (nameSimilarity == 1 && memberArity >= 0) {\n          candidates.add(\n              new Candidate(\n                  kind,\n                  memberName.toString(),\n                  signature + \".apply(...)\",\n                  nameSimilarity,\n                  arityDifference));\n        }\n      }\n    }\n  }\n\n  public static final class Candidate implements Comparable<Candidate> {\n    private final Kind kind;\n    private final String name;\n    private final String callSignature;\n    private final double nameSimilarity;\n    private final int arityDifference;\n\n    public Candidate(\n        Kind kind, String name, String callSignature, double nameSimilarity, int arityDifference) {\n      this.kind = kind;\n      this.name = name;\n      this.callSignature = callSignature;\n      this.nameSimilarity = nameSimilarity;\n      this.arityDifference = arityDifference;\n    }\n\n    // note: not consistent with equals (hence cannot use TreeSet)\n    @Override\n    public int compareTo(Candidate other) {\n      if (nameSimilarity == other.nameSimilarity) {\n        return Integer.compare(arityDifference, other.arityDifference);\n      }\n      return Double.compare(other.nameSimilarity, nameSimilarity);\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      if (this == obj) return true;\n      if (!(obj instanceof Candidate other)) return false;\n      // member lookup is name rather than signature based (but distinguishes kind)\n      return kind == other.kind && name.equals(other.name);\n    }\n\n    @Override\n    public int hashCode() {\n      return kind.hashCode() * 31 + name.hashCode();\n    }\n\n    @Override\n    public String toString() {\n      return callSignature;\n    }\n\n    public enum Kind {\n      PROPERTY,\n      METHOD\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/MinPklVersionChecker.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.nodes.Node;\nimport org.pkl.core.Release;\nimport org.pkl.core.Version;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.syntax.Module;\nimport org.pkl.parser.syntax.ObjectMember.ObjectProperty;\nimport org.pkl.parser.syntax.Type;\nimport org.pkl.parser.syntax.Type.DeclaredType;\n\nfinal class MinPklVersionChecker {\n  private static final Version currentVersion = Release.current().version();\n\n  // only use major/minor/patch for version check to ease working with dev versions\n  private static final Version currentMajorMinorPatchVersion = currentVersion.toNormal();\n\n  static void check(VmTyped module, @Nullable Node importNode) {\n    assert module.isModuleObject();\n\n    for (var ann : module.getModuleInfo().getAnnotations()) {\n      if (ann.getVmClass() != BaseModule.getModuleInfoClass()) continue;\n\n      // parsing should never fail due to pkl.base#ModuleInfo.minPklVersion's type constraint\n      var requiredVersion =\n          Version.parse((String) VmUtils.readMember(ann, Identifier.MIN_PKL_VERSION));\n      doCheck(module.getModuleInfo().getModuleName(), requiredVersion, importNode);\n      return;\n    }\n  }\n\n  static void check(\n      String moduleName, @Nullable Module mod, @Nullable Node importNode, String source) {\n    if (mod == null) return;\n\n    var moduleDecl = mod.getDecl();\n    if (moduleDecl == null) return;\n\n    for (var ann : moduleDecl.getAnnotations()) {\n      if (!Identifier.MODULE_INFO.toString().equals(getLastIdText(ann.getType()))) continue;\n\n      var objectBody = ann.getBody();\n      if (objectBody == null) continue;\n\n      for (var member : objectBody.getMembers()) {\n        if (!(member instanceof ObjectProperty prop)) continue;\n\n        if (!Identifier.MIN_PKL_VERSION.toString().equals(prop.getIdentifier().getValue()))\n          continue;\n\n        var versionTextExpr = prop.getExpr();\n        if (versionTextExpr == null) {\n          return;\n        }\n        var versionText = versionTextExpr.text(source.toCharArray());\n\n        Version version;\n        try {\n          version = Version.parse(versionText.substring(1, versionText.length() - 1));\n        } catch (IllegalArgumentException e) {\n          return;\n        }\n\n        doCheck(moduleName, version, importNode);\n        return;\n      }\n    }\n  }\n\n  private static void doCheck(\n      String moduleName, @Nullable Version requiredVersion, @Nullable Node importNode) {\n    if (requiredVersion == null || currentMajorMinorPatchVersion.compareTo(requiredVersion) >= 0)\n      return;\n\n    throw new VmExceptionBuilder()\n        .withOptionalLocation(importNode)\n        .evalError(\"incompatiblePklVersion\", moduleName, requiredVersion, currentVersion)\n        .build();\n  }\n\n  private static @Nullable String getLastIdText(@Nullable Type type) {\n    if (!(type instanceof DeclaredType declType)) return null;\n    var identifiers = declType.getName().getIdentifiers();\n    return identifiers.get(identifiers.size() - 1).getValue();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/MirrorFactories.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.member.ClassMethod;\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeNode.*;\nimport org.pkl.core.stdlib.VmObjectFactory;\nimport org.pkl.core.stdlib.VmObjectFactory.Property;\nimport org.pkl.core.util.Pair;\n\npublic final class MirrorFactories {\n  private MirrorFactories() {}\n\n  public static final VmObjectFactory<VmTyped> moduleFactory =\n      new VmObjectFactory<>(ReflectModule::getModuleClass);\n\n  public static final VmObjectFactory<VmClass> classFactory =\n      new VmObjectFactory<>(ReflectModule::getClassClass);\n\n  public static final VmObjectFactory<VmTypeAlias> typeAliasFactory =\n      new VmObjectFactory<>(ReflectModule::getTypeAliasClass);\n\n  public static final VmObjectFactory<ClassProperty> propertyFactory =\n      new VmObjectFactory<>(ReflectModule::getPropertyClass);\n\n  public static final VmObjectFactory<ClassMethod> methodFactory =\n      new VmObjectFactory<>(ReflectModule::getMethodClass);\n\n  public static final VmObjectFactory<Pair<String, VmTyped>> methodParameterFactory =\n      new VmObjectFactory<>(ReflectModule::getMethodParameterClass);\n\n  public static final VmObjectFactory<TypeParameter> typeParameterFactory =\n      new VmObjectFactory<>(ReflectModule::getTypeParameterClass);\n\n  public static final VmObjectFactory<TypeNode> classTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getDeclaredTypeClass);\n\n  public static final VmObjectFactory<TypeNode> typeAliasTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getDeclaredTypeClass);\n\n  public static final VmObjectFactory<Pair<VmTyped, VmList>> declaredTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getDeclaredTypeClass);\n\n  public static final VmObjectFactory<StringLiteralTypeNode> stringLiteralTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getStringLiteralTypeClass);\n\n  public static final VmObjectFactory<String> stringLiteralTypeFactory2 =\n      new VmObjectFactory<>(ReflectModule::getStringLiteralTypeClass);\n\n  public static final VmObjectFactory<UnionTypeNode> unionTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getUnionTypeClass);\n\n  public static final VmObjectFactory<VmList> unionTypeFactory2 =\n      new VmObjectFactory<>(ReflectModule::getUnionTypeClass);\n\n  public static final VmObjectFactory<UnionOfStringLiteralsTypeNode>\n      unionOfStringLiteralsTypeFactory = new VmObjectFactory<>(ReflectModule::getUnionTypeClass);\n\n  public static final VmObjectFactory<VmList> unionOfStringLiteralsTypeFactory2 =\n      new VmObjectFactory<>(ReflectModule::getUnionTypeClass);\n\n  public static final VmObjectFactory<NullableTypeNode> nullableTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getNullableTypeClass);\n\n  public static final VmObjectFactory<VmTyped> nullableTypeFactory2 =\n      new VmObjectFactory<>(ReflectModule::getNullableTypeClass);\n\n  public static final VmObjectFactory<FunctionTypeNode> functionTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getFunctionTypeClass);\n\n  public static final VmObjectFactory<Pair<VmList, VmTyped>> functionTypeFactory2 =\n      new VmObjectFactory<>(ReflectModule::getFunctionTypeClass);\n\n  public static final VmObjectFactory<TypeVariableNode> typeVariableFactory =\n      new VmObjectFactory<>(ReflectModule::getTypeVariableClass);\n\n  public static final VmObjectFactory<VmTyped> typeVariableFactory2 =\n      new VmObjectFactory<>(ReflectModule::getTypeVariableClass);\n\n  public static final VmObjectFactory<Void> moduleTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getModuleTypeClass);\n\n  public static final VmObjectFactory<Void> unknownTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getUnknownTypeClass);\n\n  public static final VmObjectFactory<Void> nothingTypeFactory =\n      new VmObjectFactory<>(ReflectModule::getNothingTypeClass);\n\n  public static final VmObjectFactory<SourceSection> sourceLocationFactory =\n      new VmObjectFactory<>(ReflectModule::getSourceLocationClass);\n\n  static {\n    moduleFactory\n        .addTypedProperty(\n            \"location\",\n            module -> sourceLocationFactory.create(module.getModuleInfo().getHeaderSection()))\n        .addProperty(\n            \"docComment\",\n            module -> VmNull.lift(VmUtils.exportDocComment(module.getModuleInfo().getDocComment())))\n        .addListProperty(\n            \"annotations\", module -> VmList.create(module.getModuleInfo().getAnnotations()))\n        .addSetProperty(\n            \"modifiers\",\n            module ->\n                module.getModuleInfo().isAmend()\n                    ? VmSet.EMPTY\n                    : module.getVmClass().getModifierMirrors())\n        .addStringProperty(\"name\", module -> module.getModuleInfo().getModuleName())\n        .addStringProperty(\n            \"uri\", module -> module.getModuleInfo().getModuleKey().getUri().toString())\n        .addTypedProperty(\"reflectee\", Property.identity())\n        .addTypedProperty(\"moduleClass\", module -> module.getVmClass().getMirror())\n        .addProperty(\"supermodule\", VmTyped::getSupermoduleMirror)\n        .addBooleanProperty(\"isAmend\", module -> module.getModuleInfo().isAmend())\n        .addMapProperty(\"imports\", VmTyped::getImports)\n        .addMapProperty(\"classes\", VmTyped::getClassMirrors)\n        .addMapProperty(\"typeAliases\", VmTyped::getTypeAliasMirrors);\n\n    classFactory\n        .addTypedProperty(\n            \"location\", clazz -> sourceLocationFactory.create(clazz.getHeaderSection()))\n        .addProperty(\n            \"docComment\", clazz -> VmNull.lift(VmUtils.exportDocComment(clazz.getDocComment())))\n        .addListProperty(\"annotations\", clazz -> VmList.create(clazz.getAnnotations()))\n        .addSetProperty(\"modifiers\", VmClass::getModifierMirrors)\n        .addStringProperty(\"name\", VmClass::getSimpleName)\n        .addClassProperty(\"reflectee\", Property.identity())\n        .addListProperty(\"typeParameters\", VmClass::getTypeParameterMirrors)\n        .addProperty(\"superclass\", VmClass::getSuperclassMirror)\n        .addProperty(\"supertype\", VmClass::getSupertypeMirror)\n        .addMapProperty(\"properties\", VmClass::getPropertyMirrors)\n        .addMapProperty(\"allProperties\", VmClass::getAllPropertyMirrors)\n        .addTypedProperty(\"enclosingDeclaration\", VmClass::getModuleMirror)\n        .addMapProperty(\"methods\", VmClass::getMethodMirrors)\n        .addMapProperty(\"allMethods\", VmClass::getAllMethodMirrors);\n\n    typeAliasFactory\n        .addTypedProperty(\n            \"location\", alias -> sourceLocationFactory.create(alias.getHeaderSection()))\n        .addProperty(\n            \"docComment\", alias -> VmNull.lift(VmUtils.exportDocComment(alias.getDocComment())))\n        .addListProperty(\"annotations\", alias -> VmList.create(alias.getAnnotations()))\n        .addSetProperty(\"modifiers\", VmTypeAlias::getModifierMirrors)\n        .addStringProperty(\"name\", VmTypeAlias::getSimpleName)\n        .addProperty(\"reflectee\", Property.identity())\n        .addListProperty(\"typeParameters\", VmTypeAlias::getTypeParameterMirrors)\n        .addTypedProperty(\"enclosingDeclaration\", VmTypeAlias::getModuleMirror)\n        .addTypedProperty(\"referent\", VmTypeAlias::getTypeMirror);\n\n    propertyFactory\n        .addTypedProperty(\n            \"location\", property -> sourceLocationFactory.create(property.getHeaderSection()))\n        .addProperty(\n            \"docComment\",\n            property -> VmNull.lift(VmUtils.exportDocComment(property.getDocComment())))\n        .addListProperty(\"annotations\", property -> VmList.create(property.getAnnotations()))\n        .addListProperty(\n            \"allAnnotations\", property -> VmList.create(property.getAllAnnotations(true)))\n        .addSetProperty(\"modifiers\", ClassProperty::getModifierMirrors)\n        .addSetProperty(\"allModifiers\", ClassProperty::getAllModifierMirrors)\n        .addStringProperty(\"name\", property -> property.getName().toString())\n        .addTypedProperty(\"type\", ClassProperty::getTypeMirror)\n        .addProperty(\n            \"defaultValue\",\n            property ->\n                property.isAbstract()\n                        || property.isExternal()\n                        || property\n                            .getInitializer()\n                            .isUndefined(VmUtils.createEmptyMaterializedFrame())\n                    ? VmNull.withoutDefault()\n                    :\n                    // get default from prototype because it's cached there\n                    VmUtils.readMember(property.getOwner(), property.getName()));\n\n    methodFactory\n        .addTypedProperty(\n            \"location\", method -> sourceLocationFactory.create(method.getHeaderSection()))\n        .addProperty(\n            \"docComment\", method -> VmNull.lift(VmUtils.exportDocComment(method.getDocComment())))\n        .addListProperty(\"annotations\", method -> VmList.create(method.getAnnotations()))\n        .addSetProperty(\"modifiers\", ClassMethod::getModifierMirrors)\n        .addListProperty(\"typeParameters\", ClassMethod::getTypeParameterMirrors)\n        .addStringProperty(\"name\", method -> method.getName().toString())\n        .addMapProperty(\"parameters\", ClassMethod::getParameterMirrors)\n        .addTypedProperty(\"returnType\", ClassMethod::getReturnTypeMirror);\n\n    methodParameterFactory\n        .addStringProperty(\"name\", Pair::getFirst)\n        .addTypedProperty(\"type\", Pair::getSecond);\n\n    typeParameterFactory\n        .addStringProperty(\"name\", TypeParameter::getName)\n        .addProperty(\n            \"variance\",\n            typeParameter ->\n                switch (typeParameter.getVariance()) {\n                  case COVARIANT -> \"out\";\n                  case CONTRAVARIANT -> \"in\";\n                  default -> VmNull.withoutDefault();\n                });\n\n    classTypeFactory\n        .addTypedProperty(\n            \"referent\",\n            typeNode -> {\n              var clazz = typeNode.getVmClass();\n              assert clazz != null;\n              return clazz.getMirror();\n            })\n        .addListProperty(\"typeArguments\", TypeNode::getTypeArgumentMirrors);\n\n    typeAliasTypeFactory\n        .addTypedProperty(\n            \"referent\",\n            typeNode -> {\n              var alias = typeNode.getVmTypeAlias();\n              assert alias != null;\n              return alias.getMirror();\n            })\n        .addListProperty(\"typeArguments\", TypeNode::getTypeArgumentMirrors);\n\n    declaredTypeFactory\n        .addTypedProperty(\"referent\", Pair::getFirst)\n        .addListProperty(\"typeArguments\", Pair::getSecond);\n\n    functionTypeFactory\n        .addListProperty(\"parameterTypes\", FunctionTypeNode::getParameterTypeMirrors)\n        .addTypedProperty(\"returnType\", FunctionTypeNode::getReturnTypeMirror);\n\n    functionTypeFactory2\n        .addListProperty(\"parameterTypes\", Pair::getFirst)\n        .addTypedProperty(\"returnType\", Pair::getSecond);\n\n    stringLiteralTypeFactory.addStringProperty(\"value\", StringLiteralTypeNode::getLiteral);\n\n    stringLiteralTypeFactory2.addStringProperty(\"value\", Property.identity());\n\n    unionTypeFactory.addListProperty(\"members\", UnionTypeNode::getElementTypeMirrors);\n\n    unionTypeFactory2.addListProperty(\"members\", Property.identity());\n\n    unionOfStringLiteralsTypeFactory.addListProperty(\n        \"members\", UnionOfStringLiteralsTypeNode::getElementTypeMirrors);\n\n    unionOfStringLiteralsTypeFactory2.addListProperty(\"members\", Property.identity());\n\n    nullableTypeFactory.addTypedProperty(\"member\", NullableTypeNode::getElementTypeMirror);\n\n    nullableTypeFactory2.addTypedProperty(\"member\", Property.identity());\n\n    typeVariableFactory.addTypedProperty(\"referent\", TypeVariableNode::getTypeParameterMirror);\n\n    typeVariableFactory2.addTypedProperty(\"referent\", Property.identity());\n\n    sourceLocationFactory\n        .addIntProperty(\"line\", SourceSection::getStartLine)\n        .addIntProperty(\"column\", SourceSection::getStartColumn)\n        .addStringProperty(\n            \"displayUri\",\n            section -> VmUtils.getDisplayUri(section, VmContext.get(null).getFrameTransformer()));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ModuleCache.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.Source;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.NoSuchFileException;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\nimport org.pkl.core.Release;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Caches modules by the URI originally specified in the importing module, and also by the resolved\n * URI from which the module was eventually loaded. Caching by original URI avoids any overhead\n * incurred by resolving a module multiple times. Caching by resolved URI avoids any overhead\n * incurred by evaluating a module multiple times, and also avoids any inconsistencies caused by\n * module contents changing during evaluation.\n */\npublic final class ModuleCache {\n  private static final Set<URI> STDLIB_MODULE_URIS =\n      Release.current().standardLibrary().modules().stream()\n          .map(URI::create)\n          .collect(Collectors.toSet());\n\n  public ModuleCache() {}\n\n  public interface ModuleInitializer {\n    void initialize(\n        ModuleKey moduleKey,\n        ResolvedModuleKey resolvedModuleKey,\n        ModuleResolver moduleResolver,\n        Source source,\n        VmTyped emptyModule,\n        @Nullable Node importNode);\n  }\n\n  // due to eager initialization of (module) classes,\n  // loading of module A may be triggered while A is being loaded\n  // this is why we can't use (Concurrent)Map.computeIfAbsent() for caching,\n  // (duplicate modules wouldn't work correctly because modules and their classes have identity)\n  // value type is VmTyped|RuntimeException\n  private final Map<URI, Object> modulesByOriginalUri = new HashMap<>();\n  private final Map<URI, Object> modulesByResolvedUri = new HashMap<>();\n\n  @TruffleBoundary\n  public synchronized VmTyped getOrLoad(\n      ModuleKey moduleKey,\n      SecurityManager securityManager,\n      ModuleResolver moduleResolver,\n      Supplier<VmTyped> moduleInstantiator,\n      ModuleInitializer moduleInitializer,\n      @Nullable Node importNode) {\n\n    if (ModuleKeys.isStdLibModule(moduleKey)) {\n      var moduleName = moduleKey.getUri().getSchemeSpecificPart();\n\n      // some standard library modules are cached as static singletons\n      // and hence aren't parsed/initialized anew for every evaluator\n      switch (moduleName) {\n        case \"analyze\":\n          return AnalyzeModule.getModule();\n        case \"base\":\n          // always needed\n          return BaseModule.getModule();\n        case \"Benchmark\":\n          return BenchmarkModule.getModule();\n        case \"Command\":\n          return CommandModule.getModule();\n        case \"jsonnet\":\n          return JsonnetModule.getModule();\n        case \"math\":\n          return MathModule.getModule();\n        case \"pklbinary\":\n          return PklBinaryModule.getModule();\n        case \"platform\":\n          return PlatformModule.getModule();\n        case \"project\":\n          return ProjectModule.getModule();\n        case \"reflect\":\n          return ReflectModule.getModule();\n        case \"release\":\n          return ReleaseModule.getModule();\n        case \"semver\":\n          return SemVerModule.getModule();\n        case \"settings\":\n          // always needed if ~/.pkl/settings.pkl is present\n          return SettingsModule.getModule();\n        case \"test\":\n          return TestModule.getModule();\n        case \"xml\":\n          return XmlModule.getModule();\n        default:\n          if (!STDLIB_MODULE_URIS.contains(moduleKey.getUri())) {\n            var stdlibModules = String.join(\"\\n\", Release.current().standardLibrary().modules());\n            throw new VmExceptionBuilder()\n                .withOptionalLocation(importNode)\n                .evalError(\"cannotFindStdLibModule\", moduleName, stdlibModules)\n                .build();\n          }\n      }\n    }\n\n    if (!moduleKey.isCached()) {\n      var resolvedKey = resolve(moduleKey, securityManager, importNode);\n      return doLoad(\n          moduleKey,\n          resolvedKey,\n          moduleResolver,\n          moduleInstantiator,\n          moduleInitializer,\n          importNode);\n    }\n\n    var module1 = modulesByOriginalUri.get(moduleKey.getUri());\n    if (module1 != null) {\n      if (module1 instanceof VmTyped typed) return typed;\n\n      assert module1 instanceof RuntimeException;\n      // would be more accurate/safe to throw a clone with adapted Pkl stack trace\n      throw (RuntimeException) module1;\n    }\n\n    var resolvedKey = resolve(moduleKey, securityManager, importNode);\n    var module2 = modulesByResolvedUri.get(resolvedKey.getUri());\n    if (module2 != null) {\n      if (module2 instanceof VmTyped typed) return typed;\n\n      assert module2 instanceof RuntimeException;\n      // would be more accurate/safe to throw a clone with adapted Pkl stack trace\n      throw (RuntimeException) module2;\n    }\n\n    return doLoad(\n        moduleKey, resolvedKey, moduleResolver, moduleInstantiator, moduleInitializer, importNode);\n  }\n\n  private VmTyped doLoad(\n      ModuleKey moduleKey,\n      ResolvedModuleKey resolvedKey,\n      ModuleResolver moduleResolver,\n      Supplier<VmTyped> moduleInstantiator,\n      ModuleInitializer moduleInitializer,\n      @Nullable Node importNode) {\n\n    VmTyped module = moduleInstantiator.get();\n\n    try {\n      var result = VmUtils.loadSource(resolvedKey);\n\n      // cache module before initializing it to handle recursive module dependencies (cf. ClassNode)\n      modulesByOriginalUri.put(moduleKey.getUri(), module);\n      modulesByResolvedUri.put(resolvedKey.getUri(), module);\n\n      moduleInitializer.initialize(\n          moduleKey, resolvedKey, moduleResolver, result, module, importNode);\n    } catch (Exception e) {\n      // handle error deterministically by caching it and rethrowing it when the module is loaded\n      // again\n      // (shouldn't try to load a module multiple times within the scope of an\n      // Evaluator/ModuleCache)\n      modulesByOriginalUri.put(moduleKey.getUri(), e);\n      modulesByResolvedUri.put(resolvedKey.getUri(), e);\n      throw e;\n    }\n\n    return module;\n  }\n\n  private ResolvedModuleKey resolve(\n      ModuleKey module, SecurityManager securityManager, @Nullable Node importNode) {\n    try {\n      return module.resolve(securityManager);\n    } catch (SecurityManagerException | PackageLoadError | HttpClientInitException e) {\n      throw new VmExceptionBuilder().withOptionalLocation(importNode).withCause(e).build();\n    } catch (FileNotFoundException | NoSuchFileException e) {\n      var exceptionBuilder =\n          new VmExceptionBuilder()\n              .withOptionalLocation(importNode)\n              .evalError(\"cannotFindModule\", module.getUri());\n      var path = module.getUri().getPath();\n      if (path != null && path.contains(\"\\\\\")) {\n        exceptionBuilder.withHint(\n            \"To resolve modules in nested directories, use `/` as the directory separator.\");\n      }\n      throw exceptionBuilder.build();\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .withOptionalLocation(importNode)\n          .evalError(\"ioErrorLoadingModule\", module.getUri())\n          .withCause(e)\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ModuleInfo.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.net.URI;\nimport java.util.*;\nimport org.pkl.core.ModuleSchema;\nimport org.pkl.core.PClass;\nimport org.pkl.core.TypeAlias;\nimport org.pkl.core.ast.MemberNode;\nimport org.pkl.core.ast.expression.unary.AbstractImportNode;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\npublic final class ModuleInfo {\n  private final SourceSection headerSection;\n  private final SourceSection sourceSection;\n  private final SourceSection @Nullable [] docComment;\n  private final String moduleName;\n  private final ModuleKey moduleKey;\n  private final ResolvedModuleKey resolvedModuleKey;\n  private final boolean isAmend;\n\n  @LateInit private List<VmTyped> annotations;\n\n  @LateInit private VmTyped __mirror;\n  private final Object mirrorLock = new Object();\n\n  @LateInit private ModuleSchema __moduleSchema;\n  private final Object moduleSchemaLock = new Object();\n\n  public ModuleInfo(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      SourceSection @Nullable [] docComment,\n      String moduleName,\n      ModuleKey moduleKey,\n      ResolvedModuleKey resolvedModuleKey,\n      boolean isAmend) {\n\n    this.sourceSection = sourceSection;\n    this.headerSection = headerSection;\n    this.docComment = docComment;\n    this.moduleName = moduleName;\n    this.moduleKey = moduleKey;\n    this.resolvedModuleKey = resolvedModuleKey;\n    this.isAmend = isAmend;\n  }\n\n  public void initAnnotations(List<VmTyped> annotations) {\n    assert this.annotations == null;\n    this.annotations = annotations;\n  }\n\n  public List<VmTyped> getAnnotations() {\n    assert annotations != null;\n    return annotations;\n  }\n\n  public SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  public SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  public SourceSection @Nullable [] getDocComment() {\n    return docComment;\n  }\n\n  public String getModuleName() {\n    return moduleName;\n  }\n\n  public ModuleKey getModuleKey() {\n    return moduleKey;\n  }\n\n  public ResolvedModuleKey getResolvedModuleKey() {\n    return resolvedModuleKey;\n  }\n\n  public VmTyped getMirror(VmTyped module) {\n    synchronized (mirrorLock) {\n      assert (module.getModuleInfo() == this);\n\n      if (__mirror == null) {\n        __mirror = MirrorFactories.moduleFactory.create(module);\n      }\n      return __mirror;\n    }\n  }\n\n  public ModuleSchema getModuleSchema(VmTyped module) {\n    synchronized (moduleSchemaLock) {\n      assert (module.getModuleInfo() == this);\n\n      if (__moduleSchema == null) {\n        var parent = module.getParent();\n        // every module has a superclass and hence also a parent\n        assert parent != null;\n\n        ModuleSchema supermodule = null;\n        if (parent != BaseModule.getModuleClass().getPrototype()) {\n          supermodule = parent.getModuleInfo().getModuleSchema(parent);\n        }\n\n        var imports = new LinkedHashMap<String, URI>();\n        var classes = new LinkedHashMap<String, PClass>();\n        var typeAliases = new LinkedHashMap<String, TypeAlias>();\n\n        for (var propertyDef : EconomicMaps.getValues(module.getMembers())) {\n          if (propertyDef.isImport()) {\n            MemberNode memberNode = propertyDef.getMemberNode();\n            assert memberNode != null; // import is never a constant\n            var importNode = (AbstractImportNode) memberNode.getBodyNode();\n            var importUri = importNode.getImportUri();\n            imports.put(propertyDef.getName().toString(), importUri);\n            continue;\n          }\n\n          if (propertyDef.isLocal()) continue;\n\n          if (propertyDef.isClass()) {\n            var clazz = (VmClass) module.getCachedValue(propertyDef.getName());\n            if (clazz == null) {\n              clazz = (VmClass) propertyDef.getCallTarget().call(module, module);\n            }\n            classes.put(clazz.getSimpleName(), clazz.export());\n            continue;\n          }\n\n          if (propertyDef.isTypeAlias()) {\n            var typeAlias = (VmTypeAlias) module.getCachedValue(propertyDef.getName());\n            if (typeAlias == null) {\n              typeAlias = (VmTypeAlias) propertyDef.getCallTarget().call(module, module);\n            }\n            typeAliases.put(typeAlias.getSimpleName(), typeAlias.export());\n          }\n        }\n\n        __moduleSchema =\n            new ModuleSchema(\n                moduleKey.getUri(),\n                moduleName,\n                isAmend,\n                supermodule,\n                module.getVmClass().export(),\n                VmUtils.exportDocComment(module.getModuleInfo().docComment),\n                VmUtils.exportAnnotations(module.getModuleInfo().annotations),\n                classes,\n                typeAliases,\n                imports);\n      }\n\n      return __moduleSchema;\n    }\n  }\n\n  /** Tells whether this module amends another module. */\n  public boolean isAmend() {\n    return isAmend;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ModuleResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.nodes.Node;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Collection;\nimport java.util.Optional;\nimport org.pkl.core.ModuleSource;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ModuleKeyFactory;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.util.Nullable;\n\npublic final class ModuleResolver {\n  private final Collection<ModuleKeyFactory> factories;\n\n  public ModuleResolver(Collection<ModuleKeyFactory> factories) {\n    this.factories = factories;\n  }\n\n  public Collection<ModuleKeyFactory> getFactories() {\n    return factories;\n  }\n\n  public ModuleKey resolve(ModuleSource moduleSource) {\n    if (!moduleSource.getUri().isAbsolute()) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotEvaluateRelativeModuleUri\", moduleSource.getUri())\n          .build();\n    }\n    if (moduleSource.getContents() != null) {\n      // `ModuleSource.text()` creates a synthetic module with URI `repl:text`, so it should be\n      // matched to `ModuleKeys.synthetic`.\n      if (moduleSource.getUri().equals(VmUtils.REPL_TEXT_URI)) {\n        return ModuleKeys.synthetic(moduleSource.getUri(), moduleSource.getContents());\n      }\n      return resolveCached(moduleSource.getUri(), moduleSource.getContents());\n    }\n    return resolve(moduleSource.getUri());\n  }\n\n  public ModuleKey resolve(URI moduleUri) {\n    return resolve(moduleUri, null);\n  }\n\n  public ModuleKey resolveCached(URI moduleUri, String text) {\n    var underlyingModuleKey = resolve(moduleUri);\n    return ModuleKeys.cached(underlyingModuleKey, text);\n  }\n\n  public ModuleKey resolve(URI moduleUri, @Nullable Node importNode) {\n    if (!moduleUri.isAbsolute()) {\n      throw new VmExceptionBuilder()\n          .withOptionalLocation(importNode)\n          .bug(\"Cannot resolve relative URI `%s`.\", moduleUri)\n          .build();\n    }\n\n    var normalized = moduleUri.normalize();\n    for (var factory : factories) {\n      Optional<ModuleKey> key;\n      try {\n        key = factory.create(normalized);\n      } catch (URISyntaxException e) {\n        throw new VmExceptionBuilder()\n            .withOptionalLocation(importNode)\n            .evalError(\"invalidModuleUri\", moduleUri)\n            .withHint(e.getReason())\n            .build();\n      } catch (ExternalReaderProcessException e) {\n        throw new VmExceptionBuilder()\n            .withOptionalLocation(importNode)\n            .evalError(\"externalReaderFailure\")\n            .withCause(e)\n            .build();\n      } catch (IOException e) {\n        throw new VmExceptionBuilder()\n            .withOptionalLocation(importNode)\n            .evalError(\"ioErrorLoadingModule\")\n            .withCause(e)\n            .build();\n      }\n      if (key.isPresent()) return key.get();\n    }\n\n    throw new VmExceptionBuilder()\n        .evalError(\"noModuleLoaderRegistered\", moduleUri)\n        .withOptionalLocation(importNode)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/NullReceiverException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.nodes.ControlFlowException;\n\npublic final class NullReceiverException extends ControlFlowException {\n  public static final NullReceiverException INSTANCE = new NullReceiverException();\n\n  private NullReceiverException() {\n    super();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/PklBinaryModule.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.net.URI;\n\npublic class PklBinaryModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:pklbinary\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/PklTags.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.instrumentation.Tag;\n\npublic final class PklTags {\n  private PklTags() {}\n\n  @Tag.Identifier(\"EXPRESSION\")\n  public static final class Expression extends Tag {\n    private Expression() {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/PlatformModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport java.net.URI;\n\npublic final class PlatformModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:platform\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getPlatformClass() {\n    return PlatformClass.instance;\n  }\n\n  public static VmClass getLanguageClass() {\n    return LanguageClass.instance;\n  }\n\n  public static VmClass getRuntimeClass() {\n    return RuntimeClass.instance;\n  }\n\n  public static VmClass getVirtualMachineClass() {\n    return VirtualMachineClass.instance;\n  }\n\n  public static VmClass getOperatingSystemClass() {\n    return OperatingSystemClass.instance;\n  }\n\n  public static VmClass getProcessorClass() {\n    return ProcessorClass.instance;\n  }\n\n  private static final class PlatformClass {\n    static final VmClass instance = loadClass(\"Platform\");\n  }\n\n  private static final class LanguageClass {\n    static final VmClass instance = loadClass(\"Language\");\n  }\n\n  private static final class RuntimeClass {\n    static final VmClass instance = loadClass(\"Runtime\");\n  }\n\n  private static final class VirtualMachineClass {\n    static final VmClass instance = loadClass(\"VirtualMachine\");\n  }\n\n  private static final class OperatingSystemClass {\n    static final VmClass instance = loadClass(\"OperatingSystem\");\n  }\n\n  private static final class ProcessorClass {\n    static final VmClass instance = loadClass(\"Processor\");\n  }\n\n  @CompilerDirectives.TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/PowerAssertions.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.instrumentation.InstrumentableNode.WrapperNode;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.Deque;\nimport java.util.LinkedHashSet;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Consumer;\nimport java.util.stream.Collectors;\nimport org.pkl.core.ast.ConstantValueNode;\nimport org.pkl.core.ast.expression.member.InferParentWithinMethodNode;\nimport org.pkl.core.ast.expression.member.InferParentWithinObjectMethodNode;\nimport org.pkl.core.ast.expression.member.InferParentWithinPropertyNode;\nimport org.pkl.core.ast.expression.member.InvokeMethodDirectNode;\nimport org.pkl.core.ast.type.GetParentForTypeNode;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.AnsiStringBuilder.AnsiCode;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.SyntaxHighlighter;\nimport org.pkl.parser.Lexer;\nimport org.pkl.parser.Parser;\nimport org.pkl.parser.Token;\nimport org.pkl.parser.syntax.Expr;\nimport org.pkl.parser.syntax.Expr.BinaryOperatorExpr;\nimport org.pkl.parser.syntax.Expr.BoolLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FloatLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FunctionLiteralExpr;\nimport org.pkl.parser.syntax.Expr.IntLiteralExpr;\nimport org.pkl.parser.syntax.Expr.LetExpr;\nimport org.pkl.parser.syntax.Expr.NullLiteralExpr;\nimport org.pkl.parser.syntax.Expr.QualifiedAccessExpr;\nimport org.pkl.parser.syntax.Expr.StringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.SubscriptExpr;\nimport org.pkl.parser.syntax.Expr.SuperAccessExpr;\nimport org.pkl.parser.syntax.Expr.SuperSubscriptExpr;\nimport org.pkl.parser.syntax.Expr.TypeCheckExpr;\nimport org.pkl.parser.syntax.Expr.UnqualifiedAccessExpr;\nimport org.pkl.parser.syntax.ObjectMember.ForGenerator;\nimport org.pkl.parser.syntax.ObjectMember.MemberPredicate;\nimport org.pkl.parser.syntax.StringPart.StringChars;\nimport org.pkl.parser.syntax.StringPart.StringInterpolation;\n\npublic class PowerAssertions {\n  private PowerAssertions() {}\n\n  /**\n   * Power assertions can be enabled/disabled via CLI flags (--power-assertions /\n   * --no-power-assertions) or via EvaluatorBuilder.setPowerAssertions().\n   */\n  public static boolean isEnabled() {\n    return VmContext.get(null).getPowerAssertionsEnabled();\n  }\n\n  private static final VmValueRenderer vmValueRenderer = VmValueRenderer.singleLine(100);\n  private static final Parser parser = new Parser();\n\n  public static void render(\n      AnsiStringBuilder out,\n      String indent,\n      SourceSection sourceSection,\n      Map<Node, List<Object>> trackedValues,\n      @Nullable Consumer<AnsiStringBuilder> firstFrameSuffix) {\n    out.appendSandboxed(\n        () -> {\n          var lines = lines(sourceSection);\n          var layerEntries = getLayerEntries(trackedValues, sourceSection);\n          var indentation =\n              lines.size() == 1\n                  ? 0\n                  : Collections.min(\n                      lines.stream()\n                          .skip(1)\n                          .map((it) -> leadingWhitespace(it.getCharacters()))\n                          .toList());\n          var sourceLines = lines(sourceSection);\n          var renderedMarkers = false;\n          for (var i = 0; i < sourceLines.size(); i++) {\n            if (renderedMarkers) {\n              out.append(\"\\n\\n\");\n            }\n            var line = sourceLines.get(i);\n            var offset = i == 0 ? line.getStartColumn() - 1 : indentation;\n            renderedMarkers =\n                renderLine(\n                    out, indent, line, layerEntries, offset, i == 0 ? firstFrameSuffix : null);\n          }\n        });\n  }\n\n  private static boolean isInForGeneratorOrLambdaOrPredicate(\n      org.pkl.parser.syntax.Node myNode, Expr rootExpr) {\n    var parent = myNode.parent();\n    while (parent != null) {\n      if (parent instanceof FunctionLiteralExpr) {\n        // okay to show power assert if this lambda is the root constraint expr (this was a lambda\n        // passed in as a a constraint)\n        return !parent.equals(rootExpr);\n      }\n      if (parent instanceof MemberPredicate) {\n        return true;\n      }\n      // okay if it's in expr section of for generator\n      if (parent instanceof ForGenerator forGenerator) {\n        return !forGenerator.getExpr().span().contains(myNode.span());\n      }\n      parent = parent.parent();\n    }\n    return false;\n  }\n\n  private static boolean isLiteral(org.pkl.parser.syntax.Node parserNode) {\n    if (parserNode instanceof IntLiteralExpr\n        || parserNode instanceof FloatLiteralExpr\n        || parserNode instanceof BoolLiteralExpr\n        || parserNode instanceof NullLiteralExpr) {\n      return true;\n    }\n    if (parserNode instanceof StringLiteralExpr stringLiteralExpr) {\n      return !stringLiteralExpr.hasInterpolation();\n    }\n    return false;\n  }\n\n  // tells if this method is call to a literal value\n  // treats method calls like `List(1, 2, 3)` as literal values.\n  private static boolean isLiteral(Node truffleNode, org.pkl.parser.syntax.Node parserNode) {\n    if (isLiteral(parserNode)) {\n      return true;\n    }\n    if (truffleNode instanceof ConstantValueNode) {\n      if (parserNode instanceof UnqualifiedAccessExpr unqualifiedAccessExpr) {\n        // Assumption: if we have both ConstantValueNode, and the parser node is\n        // UnqualifiedAccessExpr with arguments, then this must be a `List()`, `Map()`, etc.\n        //\n        // Note: reading a local property whose value is a constant will also turn into a\n        // ConstantValueNode.\n        return unqualifiedAccessExpr.getArgumentList() != null;\n      }\n      return true;\n    }\n    // assumption: only calls to methods within the base module are direct method calls.\n    if (!(truffleNode instanceof InvokeMethodDirectNode)) {\n      return false;\n    }\n    var accessExpr = (UnqualifiedAccessExpr) parserNode;\n    // assumption: \"literal\" values are method calls that are uppercased. e.g. IntSeq(..), Pair(..)\n    if (!Character.isUpperCase(accessExpr.getIdentifier().getValue().charAt(0))) {\n      return false;\n    }\n    var argsList = accessExpr.getArgumentList();\n    assert argsList != null;\n    return argsList.getArguments().stream().allMatch(PowerAssertions::isLiteral);\n  }\n\n  private static boolean shouldHide(\n      Node truffleNode, org.pkl.parser.syntax.Node parserNode, Object value, Expr rootExpr) {\n    // literal values are self-evident in their source code\n    if (isLiteral(truffleNode, parserNode)) {\n      return true;\n    }\n    if (\n    // let expressions will already show the resolved value in the expression body; showing the\n    // let as well simply adds noise.\n    parserNode instanceof LetExpr\n        // we'll already show the expression within string interpolation\n        || parserNode instanceof StringInterpolation\n        || parserNode instanceof StringChars) {\n      return true;\n    }\n    if (isInForGeneratorOrLambdaOrPredicate(parserNode, rootExpr)) {\n      return true;\n    }\n    if (value instanceof VmFunction) {\n      return true;\n    }\n    // implicit behavior around `new`\n    return truffleNode instanceof GetParentForTypeNode\n        || truffleNode instanceof InferParentWithinMethodNode\n        || truffleNode instanceof InferParentWithinObjectMethodNode\n        || truffleNode instanceof InferParentWithinPropertyNode;\n  }\n\n  // tries to find the parser node for this node\n  private static @Nullable org.pkl.parser.syntax.Node findParserNode(\n      Node node, @Nullable org.pkl.parser.syntax.Node parserNode, int offset) {\n    if (!node.getSourceSection().isAvailable()) {\n      return null;\n    }\n    if (parserNode == null) {\n      return null;\n    }\n    var span = parserNode.span();\n    var charIndex = span.charIndex() + offset;\n    var ss = node.getSourceSection();\n    if (charIndex == ss.getCharIndex() && span.length() == ss.getCharLength()) {\n      return parserNode;\n    }\n    var children = parserNode.children();\n    if (children == null) {\n      return null;\n    }\n    for (var child : children) {\n      var found = findParserNode(node, child, offset);\n      if (found != null) {\n        return found;\n      }\n    }\n    return null;\n  }\n\n  private static Collection<LayerEntry> getLayerEntries(\n      Map<Node, List<Object>> trackedValues, SourceSection sourceSection) {\n    var exprNode = parser.parseExpressionInput(sourceSection.getCharacters().toString());\n    // it's possible that two nodes can turn into identical `SourceEntry`s; ensure these entries are\n    // distinct by using a set.\n    var ret = new LinkedHashSet<LayerEntry>();\n    for (var entry : trackedValues.entrySet()) {\n      var truffleNode = entry.getKey();\n      var values = entry.getValue();\n      var parserNode = findParserNode(truffleNode, exprNode, sourceSection.getCharIndex());\n      if (parserNode == null) {\n        continue;\n      }\n      // this node was executed multiple times; not sure how to best show this in a power assert\n      // graph\n      if (values.size() > 1) {\n        continue;\n      }\n      var value = values.get(0);\n      if (shouldHide(truffleNode, parserNode, value, exprNode)) {\n        continue;\n      }\n      ret.add(SourceEntry.create(truffleNode, parserNode, value));\n    }\n    return ret;\n  }\n\n  private static boolean canFit(Deque<LayerEntry> layer, LayerEntry elem) {\n    if (layer.isEmpty()) {\n      return true;\n    }\n    var nextEntry = layer.getFirst();\n    return elem.startColumn() + elem.length() + 1 < nextEntry.startColumn();\n  }\n\n  private static boolean canFitMarker(Deque<LayerEntry> layer, LayerEntry elem) {\n    if (layer.isEmpty()) {\n      return true;\n    }\n    var nextEntry = layer.getFirst();\n    return elem.startColumn() < nextEntry.startColumn();\n  }\n\n  private static List<Collection<LayerEntry>> buildLayers(\n      Collection<LayerEntry> layerEntries, SourceSection line) {\n    var sortedSections =\n        layerEntries.stream()\n            .filter((it) -> it.startLine() == line.getStartLine())\n            .sorted(Comparator.comparingInt((it) -> -it.startColumn()))\n            .collect(Collectors.toCollection(LinkedList::new));\n    if (sortedSections.isEmpty()) {\n      return Collections.emptyList();\n    }\n\n    var layers = new ArrayList<Collection<LayerEntry>>();\n\n    // first layer is all markers\n    layers.add(firstLayerMarkers(sortedSections));\n\n    while (!sortedSections.isEmpty()) {\n      var layer = new ArrayDeque<LayerEntry>();\n      var iter = sortedSections.iterator();\n      while (iter.hasNext()) {\n        var next = iter.next();\n        if (canFit(layer, next)) {\n          layer.addFirst(next);\n          iter.remove();\n        } else if (canFitMarker(layer, next)) {\n          layer.addFirst(next.toMarker());\n        }\n      }\n      layers.add(layer);\n    }\n    return layers;\n  }\n\n  private static Collection<LayerEntry> firstLayerMarkers(List<LayerEntry> entries) {\n    var layer = new ArrayDeque<LayerEntry>();\n    LayerEntry prevEntry = null;\n    for (var entry : entries) {\n      if (prevEntry != null && prevEntry.startColumn() == entry.startColumn()) {\n        continue;\n      }\n      layer.addFirst(entry.toMarker());\n      prevEntry = entry;\n    }\n    return layer;\n  }\n\n  private static List<SourceSection> lines(SourceSection sourceSection) {\n    var startLine = sourceSection.getStartLine();\n    var endLine = sourceSection.getEndLine();\n    if (!sourceSection.isAvailable() || startLine == endLine) {\n      return Collections.singletonList(sourceSection);\n    }\n\n    var result = new ArrayList<SourceSection>();\n    var source = sourceSection.getSource();\n    var charIndex = sourceSection.getCharIndex();\n    var endCharIndex = charIndex + sourceSection.getCharLength();\n\n    for (var lineNumber = startLine; lineNumber <= endLine; lineNumber++) {\n      var lineSection = source.createSection(lineNumber);\n      var lineStartChar = lineSection.getCharIndex();\n      var lineEndChar = lineStartChar + lineSection.getCharLength();\n\n      var sectionStartChar = Math.max(charIndex, lineStartChar);\n      var sectionEndChar = Math.min(endCharIndex, lineEndChar);\n\n      if (sectionStartChar < sectionEndChar) {\n        result.add(source.createSection(sectionStartChar, sectionEndChar - sectionStartChar));\n      }\n    }\n\n    return result;\n  }\n\n  public static String trimLeadingWhitespace(String str, int n) {\n    var i = 0;\n\n    while (i < str.length() && i < n && Character.isWhitespace(str.charAt(i))) {\n      i++;\n    }\n\n    return str.substring(i);\n  }\n\n  private static boolean renderLine(\n      AnsiStringBuilder out,\n      String indent,\n      SourceSection line,\n      Collection<LayerEntry> layerEntries,\n      int trimStart,\n      @Nullable Consumer<AnsiStringBuilder> lineSuffix) {\n    var layers = buildLayers(layerEntries, line);\n    var content = trimLeadingWhitespace(line.getCharacters().toString(), trimStart);\n    out.append(indent).append(content);\n    if (lineSuffix != null) {\n      lineSuffix.accept(out);\n    }\n    out.append('\\n');\n    if (layers.isEmpty()) {\n      return false;\n    }\n    for (var i = 0; i < layers.size(); i++) {\n      var layer = layers.get(i);\n      out.append(indent);\n      var cursor = 0;\n      for (var entry : layer) {\n        var currentOffset = entry.startColumn() - 1 - trimStart - cursor;\n        out.append(\" \".repeat(currentOffset));\n        entry.appendTo(out);\n        cursor += currentOffset + entry.length();\n      }\n      if (i < layers.size() - 1) {\n        out.append('\\n');\n      }\n    }\n    return true;\n  }\n\n  private static int leadingWhitespace(CharSequence src) {\n    var result = 0;\n    for (var i = 0; i < src.length(); i++) {\n      var c = src.charAt(i);\n      if (c != ' ' && c != '\\t') {\n        break;\n      }\n      result++;\n    }\n    return result;\n  }\n\n  private sealed interface LayerEntry permits SourceEntry, MarkerEntry {\n\n    /** 1-based (because {@link SourceSection}'s is too). */\n    int startLine();\n\n    /** 1-based (because {@link SourceSection}'s is too). */\n    int startColumn();\n\n    int length();\n\n    void appendTo(AnsiStringBuilder builder);\n\n    default MarkerEntry toMarker() {\n      return new MarkerEntry(startLine(), startColumn());\n    }\n  }\n\n  private record SourceEntry(int startLine, int startColumn, String src) implements LayerEntry {\n    static SourceEntry create(\n        Node truffleNode, org.pkl.parser.syntax.Node parserNode, Object value) {\n      var effectiveSourceSection =\n          truffleNode\n              .getSourceSection()\n              .getSource()\n              .createSection(getCharIndex(truffleNode, parserNode), 1);\n      return new SourceEntry(\n          effectiveSourceSection.getStartLine(),\n          effectiveSourceSection.getStartColumn(),\n          vmValueRenderer.render(value));\n    }\n\n    // create a subsection that points to the operator\n    //\n    // 1 + 1\n    //   |\n    //\n    // or in the case of qualified access, the very next character after qualified access\n    //\n    // foo.bar\n    //     |\n    private static int getCharIndex(Node truffleNode, org.pkl.parser.syntax.Node parserNode) {\n      if (truffleNode instanceof WrapperNode wrapperNode) {\n        truffleNode = wrapperNode.getDelegateNode();\n      }\n      var originalSource = truffleNode.getSourceSection();\n      if (!originalSource.isAvailable()) {\n        return originalSource.getCharIndex();\n      }\n      var exprText = originalSource.getCharacters().toString();\n      var skip = 0;\n      if (parserNode instanceof BinaryOperatorExpr binaryOperatorExpr) {\n        skip =\n            binaryOperatorExpr.getLeft().span().stopIndexExclusive()\n                - parserNode.span().charIndex();\n      } else if (parserNode instanceof TypeCheckExpr typeCheckExpr) {\n        skip = typeCheckExpr.getExpr().span().stopIndexExclusive() - parserNode.span().charIndex();\n      } else if (parserNode instanceof SubscriptExpr subscriptExpr) {\n        skip = subscriptExpr.getExpr().span().stopIndexExclusive() - parserNode.span().charIndex();\n      } else if (parserNode instanceof SuperAccessExpr\n          || parserNode instanceof SuperSubscriptExpr) {\n        skip = \"super\".length();\n      } else if (parserNode instanceof QualifiedAccessExpr qualifiedAccessExpr) {\n        skip =\n            qualifiedAccessExpr.getExpr().span().stopIndexExclusive()\n                - parserNode.span().charIndex();\n      }\n      if (skip == 0) {\n        return originalSource.getCharIndex();\n      }\n      // need to lex the source again because the parse tree doesn't carry the operator's position\n      var lexer = new Lexer(exprText.substring(skip));\n      var nextToken = lexer.next();\n      while (!nextToken.isOperator()) {\n        nextToken = lexer.next();\n      }\n      var span = lexer.span();\n      if (nextToken == Token.DOT || nextToken == Token.QDOT) {\n        return originalSource.getCharIndex() + skip + span.charIndex() + span.length();\n      }\n      return originalSource.getCharIndex() + skip + span.charIndex();\n    }\n\n    @Override\n    public int length() {\n      return src.length();\n    }\n\n    @Override\n    public void appendTo(AnsiStringBuilder builder) {\n      SyntaxHighlighter.writeTo(builder, src);\n    }\n  }\n\n  private record MarkerEntry(int startLine, int startColumn) implements LayerEntry {\n    @Override\n    public int length() {\n      return 1;\n    }\n\n    @Override\n    public void appendTo(AnsiStringBuilder builder) {\n      builder.append(AnsiCode.FAINT, \"│\");\n    }\n\n    @Override\n    public MarkerEntry toMarker() {\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ProjectModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport static org.pkl.core.PClassInfo.pklProjectUri;\n\npublic final class ProjectModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(pklProjectUri, instance);\n  }\n\n  private ProjectModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ReaderBase.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.List;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.util.IoUtils;\n\npublic interface ReaderBase {\n  /**\n   * Tells if the URIs represented by this module key or resource reader should be interpreted as <a\n   * href=\"https://www.rfc-editor.org/rfc/rfc3986#section-1.2.3\">hierarchical</a>.\n   */\n  boolean hasHierarchicalUris() throws ExternalReaderProcessException, IOException;\n\n  /** Tells if this module key or resource reader supports globbing. */\n  boolean isGlobbable() throws ExternalReaderProcessException, IOException;\n\n  /**\n   * Tells if relative paths of this URI should be resolved from {@link URI#getFragment()}, rather\n   * than {@link URI#getPath()}.\n   */\n  default boolean hasFragmentPaths() {\n    return false;\n  }\n\n  /**\n   * Tells if this module key or resource reader has an element at {@code elementUri}.\n   *\n   * <p>This method only needs to be implemented if {@link #hasHierarchicalUris()} returns true, and\n   * if either {@link #isGlobbable()} or {@link ModuleKey#isLocal()} returns true.\n   */\n  default boolean hasElement(SecurityManager securityManager, URI elementUri)\n      throws IOException, SecurityManagerException, ExternalReaderProcessException {\n    throw new UnsupportedOperationException();\n  }\n\n  /**\n   * List elements within a base URI.\n   *\n   * <p>This method is called by the {@link org.pkl.core.util.GlobResolver} when resolving glob\n   * expressions if {@link #isGlobbable()} returns true.\n   *\n   * <p>This method does not need to be implemented if {@link #isGlobbable()} returns false.\n   *\n   * <p>If {@link #hasHierarchicalUris()} returns false, {@code URI} is effectively an empty URI and\n   * should be ignored. In this case, this method is expected to list all elements represented by\n   * this reader.\n   */\n  default List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n      throws IOException, SecurityManagerException, ExternalReaderProcessException {\n    throw new UnsupportedOperationException();\n  }\n\n  default URI resolveUri(URI baseUri, URI uri) throws IOException, SecurityManagerException {\n    return IoUtils.resolve(this, baseUri, uri);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ReflectModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\n\npublic final class ReflectModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    // Forcing of `instance` inside `loadModule()` results in calls to methods such as\n    // `ReflectModule.getNullableTypeClass()` via `MirrorFactories`.\n    // By calling loadModule() in the outer class's static initializer (rather than having another\n    // nested class for this),\n    // initialization loops (e.g., during execution of native-image) are avoided.\n    loadModule(URI.create(\"pkl:reflect\"), instance);\n  }\n\n  private ReflectModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getModuleClass() {\n    return ModuleClass.instance;\n  }\n\n  public static VmClass getClassClass() {\n    return ClassClass.instance;\n  }\n\n  public static VmClass getTypeAliasClass() {\n    return TypeAliasClass.instance;\n  }\n\n  public static VmClass getPropertyClass() {\n    return PropertyClass.instance;\n  }\n\n  public static VmClass getMethodClass() {\n    return MethodClass.instance;\n  }\n\n  public static VmClass getMethodParameterClass() {\n    return MethodParameterClass.instance;\n  }\n\n  public static VmClass getTypeParameterClass() {\n    return TypeParameterClass.instance;\n  }\n\n  public static VmClass getDeclaredTypeClass() {\n    return DeclaredTypeClass.instance;\n  }\n\n  public static VmClass getStringLiteralTypeClass() {\n    return StringLiteralTypeClass.instance;\n  }\n\n  public static VmClass getUnionTypeClass() {\n    return UnionTypeClass.instance;\n  }\n\n  public static VmClass getNullableTypeClass() {\n    return NullableTypeClass.instance;\n  }\n\n  public static VmClass getModuleTypeClass() {\n    return ModuleTypeClass.instance;\n  }\n\n  public static VmClass getFunctionTypeClass() {\n    return FunctionTypeClass.instance;\n  }\n\n  public static VmClass getUnknownTypeClass() {\n    return UnknownTypeClass.instance;\n  }\n\n  public static VmClass getNothingTypeClass() {\n    return NothingTypeClass.instance;\n  }\n\n  public static VmClass getTypeVariableClass() {\n    return TypeVariableClass.instance;\n  }\n\n  public static VmClass getSourceLocationClass() {\n    return SourceLocationClass.instance;\n  }\n\n  private static final class ModuleClass {\n    static final VmClass instance = loadClass(\"Module\");\n  }\n\n  private static final class ClassClass {\n    static final VmClass instance = loadClass(\"Class\");\n  }\n\n  private static final class TypeAliasClass {\n    static final VmClass instance = loadClass(\"TypeAlias\");\n  }\n\n  private static final class PropertyClass {\n    static final VmClass instance = loadClass(\"Property\");\n  }\n\n  private static final class MethodClass {\n    static final VmClass instance = loadClass(\"Method\");\n  }\n\n  private static final class MethodParameterClass {\n    static final VmClass instance = loadClass(\"MethodParameter\");\n  }\n\n  private static final class TypeParameterClass {\n    static final VmClass instance = loadClass(\"TypeParameter\");\n  }\n\n  private static final class DeclaredTypeClass {\n    static final VmClass instance = loadClass(\"DeclaredType\");\n  }\n\n  private static final class StringLiteralTypeClass {\n    static final VmClass instance = loadClass(\"StringLiteralType\");\n  }\n\n  private static final class UnionTypeClass {\n    static final VmClass instance = loadClass(\"UnionType\");\n  }\n\n  private static final class NullableTypeClass {\n    static final VmClass instance = loadClass(\"NullableType\");\n  }\n\n  private static final class ModuleTypeClass {\n    static final VmClass instance = loadClass(\"ModuleType\");\n  }\n\n  private static final class FunctionTypeClass {\n    static final VmClass instance = loadClass(\"FunctionType\");\n  }\n\n  private static final class UnknownTypeClass {\n    static final VmClass instance = loadClass(\"UnknownType\");\n  }\n\n  private static final class NothingTypeClass {\n    static final VmClass instance = loadClass(\"NothingType\");\n  }\n\n  private static final class TypeVariableClass {\n    static final VmClass instance = loadClass(\"TypeVariable\");\n  }\n\n  private static final class SourceLocationClass {\n    static final VmClass instance = loadClass(\"SourceLocation\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ReleaseModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport java.net.URI;\n\npublic final class ReleaseModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:release\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getReleaseClass() {\n    return ReleaseModule.ReleaseClass.instance;\n  }\n\n  public static VmClass getSourceCodeClass() {\n    return ReleaseModule.SourceCodeClass.instance;\n  }\n\n  public static VmClass getDocumentationClass() {\n    return ReleaseModule.DocumentationClass.instance;\n  }\n\n  public static VmClass getStandardLibraryClass() {\n    return ReleaseModule.StandardLibraryClass.instance;\n  }\n\n  private static final class ReleaseClass {\n    static final VmClass instance = loadClass(\"Release\");\n  }\n\n  private static final class SourceCodeClass {\n    static final VmClass instance = loadClass(\"SourceCode\");\n  }\n\n  private static final class DocumentationClass {\n    static final VmClass instance = loadClass(\"Documentation\");\n  }\n\n  private static final class StandardLibraryClass {\n    static final VmClass instance = loadClass(\"StandardLibrary\");\n  }\n\n  @CompilerDirectives.TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/ResourceManager.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.nodes.Node;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.http.HttpClientInitException;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.resource.Resource;\nimport org.pkl.core.resource.ResourceReader;\nimport org.pkl.core.stdlib.VmObjectFactory;\nimport org.pkl.core.util.Nullable;\n\npublic final class ResourceManager {\n  private final Map<String, ResourceReader> resourceReaders = new HashMap<>();\n  private final SecurityManager securityManager;\n  private final VmObjectFactory<Resource> resourceFactory;\n\n  // cache resources indefinitely to make resource reads deterministic\n  private final Map<URI, Optional<Object>> resources = new HashMap<>();\n\n  public ResourceManager(SecurityManager securityManager, Collection<ResourceReader> readers) {\n    this.securityManager = securityManager;\n\n    for (var reader : readers) {\n      resourceReaders.put(reader.getUriScheme(), reader);\n    }\n\n    resourceFactory =\n        new VmObjectFactory<Resource>(BaseModule::getResourceClass)\n            .addProperty(\"uri\", resource -> resource.uri().toString())\n            .addProperty(\"text\", Resource::getText)\n            .addProperty(\"bytes\", resource -> new VmBytes(resource.bytes()));\n  }\n\n  @TruffleBoundary\n  public ResourceReader getReader(URI resourceUri, Node readNode) {\n    var reader = resourceReaders.get(resourceUri.getScheme());\n    if (reader == null) {\n      throw new VmExceptionBuilder()\n          .withLocation(readNode)\n          .evalError(\"noResourceReaderRegistered\", resourceUri.getScheme())\n          .build();\n    }\n    return reader;\n  }\n\n  public Optional<Object> doRead(ResourceReader reader, URI uri, @Nullable Node readNode) {\n    Optional<Object> resource;\n    try {\n      resource = reader.read(uri);\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"ioErrorReadingResource\", uri)\n          .withCause(e)\n          .withOptionalLocation(readNode)\n          .build();\n    } catch (URISyntaxException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"invalidResourceUri\", uri)\n          .withHint(e.getReason())\n          .withOptionalLocation(readNode)\n          .build();\n    } catch (SecurityManagerException\n        | PackageLoadError\n        | HttpClientInitException\n        | ExternalReaderProcessException e) {\n      throw new VmExceptionBuilder().withCause(e).withOptionalLocation(readNode).build();\n    }\n    return resource;\n  }\n\n  @TruffleBoundary\n  public Optional<Object> read(URI resourceUri, @Nullable Node readNode) {\n    return resources.computeIfAbsent(\n        resourceUri.normalize(),\n        (uri) -> {\n          try {\n            securityManager.checkReadResource(uri);\n          } catch (SecurityManagerException e) {\n            throw new VmExceptionBuilder().withCause(e).withOptionalLocation(readNode).build();\n          }\n          var reader = getResourceReader(uri);\n          if (reader == null) {\n            throw new VmExceptionBuilder()\n                .withOptionalLocation(readNode)\n                .evalError(\"noResourceReaderRegistered\", uri.getScheme())\n                .build();\n          }\n          var resource = doRead(reader, uri, readNode);\n          if (resource.isEmpty()) return resource;\n\n          var res = resource.get();\n          if (res instanceof String) return resource;\n\n          if (res instanceof Resource r) {\n            return Optional.of(resourceFactory.create(r));\n          }\n\n          throw new VmExceptionBuilder()\n              .evalError(\"unsupportedResourceType\", reader.getClass().getName(), res.getClass())\n              .withOptionalLocation(readNode)\n              .build();\n        });\n  }\n\n  /**\n   * Returns a {@link ResourceReader} registered to read the resource at {@code baseUri}, or {@code\n   * null} if there is none.\n   */\n  public @Nullable ResourceReader getResourceReader(URI baseUri) {\n    return resourceReaders.get(baseUri.getScheme());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/SemVerModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport static org.pkl.core.PClassInfo.pklSemverUri;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\n\npublic final class SemVerModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(pklSemverUri, instance);\n  }\n\n  private SemVerModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getVersionClass() {\n    return VersionClass.instance;\n  }\n\n  private static final class VersionClass {\n    static final VmClass instance = loadClass(\"Version\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/SettingsModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport static org.pkl.core.PClassInfo.pklSettingsUri;\n\npublic final class SettingsModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(pklSettingsUri, instance);\n  }\n\n  private SettingsModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/StackTraceGenerator.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.TruffleStackTrace;\nimport com.oracle.truffle.api.TruffleStackTraceElement;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.*;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.ast.MemberNode;\nimport org.pkl.core.util.Nullable;\n\nfinal class StackTraceGenerator {\n  private final VmException exception;\n\n  private final List<StackFrame> frames = new ArrayList<>();\n\n  static List<StackFrame> capture(VmException exception) {\n    return new StackTraceGenerator(exception).capture();\n  }\n\n  private StackTraceGenerator(VmException exception) {\n    this.exception = exception;\n  }\n\n  private List<StackFrame> capture() {\n    var truffleElements = TruffleStackTrace.getStackTrace(exception);\n    if (truffleElements.isEmpty()) {\n      addFrame(exception.getSourceSection(), exception.getMemberName());\n    } else {\n      var isFirst = true; // copy before mutating to be on the safe side\n      var insertedStackFrames = new HashMap<>(exception.getInsertedStackFrames());\n      for (var element : truffleElements) {\n        var callNode = element.getLocation();\n        addFrame(findDisplayableSourceSection(callNode, isFirst), getMemberName(element));\n        isFirst = false;\n\n        var callTarget = element.getTarget();\n        var insertedFrame = insertedStackFrames.remove(callTarget);\n        if (insertedFrame != null) frames.add(insertedFrame);\n      }\n    }\n\n    return frames;\n  }\n\n  // customization of Node.getEncapsulatingSourceSection()\n  private SourceSection findDisplayableSourceSection(@Nullable Node callNode, boolean isFirst) {\n    if (isFirst && exception.getSourceSection() != null) {\n      return exception.getSourceSection();\n    }\n\n    for (Node current = callNode; current != null; current = current.getParent()) {\n      if (current.getSourceSection() != null) {\n        return current instanceof MemberNode memberNode\n            // Always display the member body's source section instead of the member\n            // (root) node's source section (which includes doc comment etc.), even\n            // if `callNode` is a child of root node rather than body node.\n            // This improves stack trace output for failed property type checks.\n            ? memberNode.getBodySection()\n            : current.getSourceSection();\n      }\n    }\n\n    return VmUtils.unavailableSourceSection();\n  }\n\n  private void addFrame(@Nullable SourceSection section, @Nullable String memberName) {\n    if (section == null || !section.isAvailable()) {\n      // no point in displaying this frame.\n      // a legitimate case where we end up here is a default property\n      // value failing its property type check (e.g. List(!isEmpty)).\n      // in that case, unless we want to display pseudo code for the implicit\n      // default value, there is nothing better than skipping the frame.\n      return;\n    }\n\n    frames.add(VmUtils.createStackFrame(section, memberName));\n  }\n\n  private @Nullable String getMemberName(@Nullable TruffleStackTraceElement element) {\n    if (element == null) return null;\n\n    var rootNode = element.getTarget().getRootNode();\n    if (rootNode == null) return null;\n\n    return rootNode.getName();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/StackTraceRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.BiConsumer;\nimport java.util.function.Function;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.AnsiTheme;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.SyntaxHighlighter;\n\npublic final class StackTraceRenderer {\n  private final Function<StackFrame, StackFrame> frameTransformer;\n\n  public StackTraceRenderer(Function<StackFrame, StackFrame> frameTransformer) {\n    this.frameTransformer = frameTransformer;\n  }\n\n  public void render(\n      List<StackFrame> frames,\n      @Nullable String hint,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      AnsiStringBuilder out) {\n    var compressed = compressFrames(frames);\n    doRender(compressed, hint, hintBuilder, out, \"\", true);\n  }\n\n  // non-private for testing\n  void doRender(\n      List<Object /*StackFrame|StackFrameLoop*/> frames,\n      @Nullable String hint,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      AnsiStringBuilder out,\n      String leftMargin,\n      boolean isFirstElement) {\n    for (var frame : frames) {\n      if (frame instanceof StackFrameLoop loop) {\n        // ensure a cycle of length 1 doesn't get rendered as a loop\n        if (loop.count == 1) {\n          doRender(loop.frames, null, null, out, leftMargin, isFirstElement);\n        } else {\n          if (!isFirstElement) {\n            out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin).append('\\n');\n          }\n          out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin)\n              .append(AnsiTheme.STACK_TRACE_MARGIN, \"┌─ \")\n              .append(AnsiTheme.STACK_TRACE_LOOP_COUNT, loop.count)\n              .append(\" repetitions of:\\n\");\n          var newLeftMargin = leftMargin + \"│ \";\n          doRender(loop.frames, null, null, out, newLeftMargin, isFirstElement);\n          if (isFirstElement) {\n            renderHint(hint, hintBuilder, out, newLeftMargin);\n            isFirstElement = false;\n          }\n          out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin + \"└─\").append('\\n');\n        }\n      } else {\n        if (!isFirstElement) {\n          out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin).append('\\n');\n        }\n        renderFrame((StackFrame) frame, out, leftMargin);\n      }\n\n      if (isFirstElement) {\n        renderHint(hint, hintBuilder, out, leftMargin);\n        isFirstElement = false;\n      }\n    }\n  }\n\n  private void renderFrame(StackFrame frame, AnsiStringBuilder out, String leftMargin) {\n    var transformed = frameTransformer.apply(frame);\n    renderSourceLine(transformed, out, leftMargin);\n    renderSourceLocation(transformed, out, leftMargin);\n  }\n\n  private void renderHint(\n      @Nullable String hint,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      AnsiStringBuilder out,\n      String leftMargin) {\n    if (hint == null && hintBuilder == null) return;\n\n    out.append('\\n').append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin);\n    if (hint != null) {\n      out.append(AnsiTheme.ERROR_MESSAGE_HINT, hint);\n    } else {\n      out.append(AnsiTheme.ERROR_MESSAGE_HINT, () -> hintBuilder.accept(out, true));\n    }\n    out.append('\\n');\n  }\n\n  private void renderSourceLine(StackFrame frame, AnsiStringBuilder out, String leftMargin) {\n    var originalSourceLine = frame.getSourceLines().get(0);\n    var leadingWhitespace = VmUtils.countLeadingWhitespace(originalSourceLine);\n    var sourceLine = originalSourceLine.strip();\n    var startColumn = frame.getStartColumn() - leadingWhitespace;\n    var endColumn =\n        frame.getStartLine() == frame.getEndLine()\n            ? frame.getEndColumn() - leadingWhitespace\n            : sourceLine.length();\n\n    var prefix = frame.getStartLine() + \" | \";\n    out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin)\n        .append(AnsiTheme.STACK_TRACE_LINE_NUMBER, prefix);\n\n    SyntaxHighlighter.writeTo(out, sourceLine);\n\n    out.append('\\n')\n        .append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin)\n        .append(\" \".repeat(prefix.length() + startColumn - 1))\n        .append(AnsiTheme.STACK_TRACE_CARET, \"^\".repeat(endColumn - startColumn + 1))\n        .append('\\n');\n  }\n\n  private void renderSourceLocation(StackFrame frame, AnsiStringBuilder out, String leftMargin) {\n    out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin)\n        .append(\n            AnsiTheme.STACK_FRAME,\n            () ->\n                out.append(\"at \")\n                    .append(frame.getMemberName() != null ? frame.getMemberName() : \"<unknown>\")\n                    .append(\" (\")\n                    .appendUntrusted(frame.getModuleUri())\n                    .append(\")\")\n                    .append('\\n'));\n  }\n\n  /**\n   * `StackFrame` and `StackFrameLoop` don't currently have a common base interface because the\n   * former is public API and the latter isn't.\n   */\n  // non-private for testing\n  record StackFrameLoop(List<Object /*StackFrame|StackFrameLoop*/> frames, int count) {}\n\n  // non-private for testing\n  static List<Object /*StackFrame|StackFrameLoop*/> compressFrames(List<StackFrame> frames) {\n    return doCompressFrames(frames, new int[frames.size()], new ArrayList<>(), 0, frames.size());\n  }\n\n  private static List<Object /*StackFrame|StackFrameLoop*/> doCompressFrames(\n      List<StackFrame> frames, int[] lpps, List<Object> result, int beginning, int ending) {\n    // Algorithm was written with reversed `frames` in mind.\n    // Instead of reversing `frames`, we invert indices passed to `frames.get()`.\n    var framesLastIndex = frames.size() - 1;\n\n    var totalSize = ending - beginning;\n\n    var maxLength = -1;\n    var patternStart = -2;\n    var patternWidth = -2;\n    var matchEnd = -2;\n\n    loopSearch:\n    for (int i = beginning; i < ending; i++) {\n      var best = i;\n      var len = 0;\n      lpps[i] = 0;\n\n      var j = i + 1;\n      while (j < ending) {\n        var frame1 = frames.get(framesLastIndex - j);\n        var frame2 = frames.get(framesLastIndex - (len + i));\n        var match = frame1.equals(frame2);\n        if (!match && len != 0) {\n          len = lpps[len - 1];\n        } else {\n          len += match ? 1 : 0;\n          lpps[j] = len;\n          if (len > lpps[best]) {\n            best = j;\n          } else if (len > 0 && len == lpps[j - 1]) {\n            // Degenerative; e.g. ABAAB; we don't care for \"prefixes that are suffixes\" for a\n            // non-empty infix. In other words, we only look for regex `P+P` and not `P+IP`\n            continue loopSearch;\n          }\n          j++;\n        }\n      }\n\n      var length = best - i + 1;\n      if (length > 1 && maxLength < length) {\n        maxLength = length;\n        matchEnd = best;\n        patternStart = i;\n      }\n      if (maxLength > ending - i || maxLength * 2 > totalSize) {\n        // There are no better matches to be found.\n        break;\n      }\n    }\n\n    // Write to result in reverse order.\n    if (maxLength > 1) {\n      patternWidth = matchEnd - lpps[matchEnd] - patternStart + 1;\n      doCompressFrames(frames, lpps, result, matchEnd + 1, ending);\n      result.add(\n          new StackFrameLoop(\n              doCompressFrames(\n                  frames, lpps, new ArrayList<>(), patternStart, patternStart + patternWidth),\n              maxLength / patternWidth));\n      doCompressFrames(frames, lpps, result, beginning, patternStart);\n    } else {\n      // No patterns found in frames[beginning...ending].\n      for (int i = ending - 1; i >= beginning; i--) {\n        result.add(frames.get(framesLastIndex - i));\n      }\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/StdLibModule.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\nimport java.util.List;\nimport java.util.Map;\nimport org.pkl.core.Loggers;\nimport org.pkl.core.SecurityManagers;\nimport org.pkl.core.StackFrameTransformers;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.module.ResolvedModuleKey;\n\npublic abstract class StdLibModule {\n  @TruffleBoundary\n  protected static void loadModule(URI uri, VmTyped instance) {\n    // evaluate eagerly to increase thread safety\n    // (stdlib module objects are statically shared singletons when running on JVM)\n    // and ensure compile-time evaluation in AOT mode\n    VmUtils.createContext(\n            () -> {\n              var vmContext = VmContext.get(null);\n              vmContext.initialize(\n                  new VmContext.Holder(\n                      StackFrameTransformers.defaultTransformer,\n                      SecurityManagers.defaultManager,\n                      HttpClient.dummyClient(),\n                      new ModuleResolver(List.of(ModuleKeyFactories.standardLibrary)),\n                      new ResourceManager(SecurityManagers.defaultManager, List.of()),\n                      Loggers.noop(),\n                      Map.of(),\n                      Map.of(),\n                      null,\n                      null,\n                      null,\n                      null,\n                      TraceMode.COMPACT,\n                      false));\n              var language = VmLanguage.get(null);\n              var moduleKey = ModuleKeys.standardLibrary(uri);\n              var source = VmUtils.loadSource((ResolvedModuleKey) moduleKey);\n              language.initializeModule(\n                  moduleKey,\n                  (ResolvedModuleKey) moduleKey,\n                  vmContext.getModuleResolver(),\n                  source,\n                  instance,\n                  null);\n              // evaluate eagerly to increase thread safety\n              // (stdlib module objects are statically shared singletons when running on JVM)\n              // and ensure compile-time evaluation in AOT mode\n              instance.force(false, true);\n            })\n        .close();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/TestModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.net.URI;\n\npublic final class TestModule extends StdLibModule {\n  static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:test\"), instance);\n  }\n\n  private TestModule() {}\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/TestRunner.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.IOException;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport org.pkl.core.BufferedLogger;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.TestResults;\nimport org.pkl.core.TestResults.Failure;\nimport org.pkl.core.TestResults.TestResult;\nimport org.pkl.core.TestResults.TestSectionName;\nimport org.pkl.core.TestResults.TestSectionResults;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.stdlib.base.PcfRenderer;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.AnsiTheme;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.core.util.MutableReference;\nimport org.pkl.core.util.Nullable;\n\n/** Runs test results examples and facts. */\npublic final class TestRunner {\n  private static final PklConverter converter = PklConverter.NOOP;\n  private final BufferedLogger logger;\n  private final StackFrameTransformer stackFrameTransformer;\n  private final boolean overwrite;\n  private final boolean useColor;\n  private final VmValueTrackerFactory valueTrackerFactory;\n\n  public TestRunner(\n      BufferedLogger logger,\n      StackFrameTransformer stackFrameTransformer,\n      boolean overwrite,\n      boolean useColor) {\n    this.logger = logger;\n    this.stackFrameTransformer = stackFrameTransformer;\n    this.overwrite = overwrite;\n    this.useColor = useColor;\n    this.valueTrackerFactory = VmContext.get(null).getValueTrackerFactory();\n  }\n\n  public TestResults run(VmTyped testModule) {\n    var info = VmUtils.getModuleInfo(testModule);\n    var resultsBuilder = new TestResults.Builder(info.getModuleName(), getDisplayUri(info));\n\n    try {\n      VmUtils.checkAmends(testModule, TestModule.getModule().getVmClass());\n    } catch (VmException v) {\n      var error =\n          new TestResults.Error(v.getMessage(), v.toPklException(stackFrameTransformer, useColor));\n      return resultsBuilder.setError(error).build();\n    }\n\n    resultsBuilder.setFactsSection(runFacts(testModule));\n    resultsBuilder.setExamplesSection(runExamples(testModule, info));\n\n    resultsBuilder.setStdErr(logger.getLogs());\n    return resultsBuilder.build();\n  }\n\n  private TestSectionResults runFacts(VmTyped testModule) {\n    var facts = VmUtils.readMember(testModule, Identifier.FACTS);\n    if (facts instanceof VmNull) return new TestSectionResults(TestSectionName.FACTS, List.of());\n\n    var testResults = new ArrayList<TestResult>();\n    var factsMapping = (VmMapping) facts;\n    factsMapping.forceAndIterateMemberValues(\n        (groupKey, groupMember, groupValue) -> {\n          var listing = (VmListing) groupValue;\n          var name = String.valueOf(groupKey);\n          var resultBuilder = new TestResult.Builder(name);\n          listing.iterateMembers(\n              (idx, member) -> {\n                if (member.isLocalOrExternalOrHidden()) {\n                  return true;\n                }\n                try {\n                  var factValue = VmUtils.readMember(listing, idx);\n                  if (factValue == Boolean.FALSE) {\n                    if (PowerAssertions.isEnabled()) {\n                      try (var valueTracker = valueTrackerFactory.create()) {\n                        listing.cachedValues.clear();\n                        VmUtils.readMember(listing, idx);\n                        var failure =\n                            factFailure(\n                                member.getSourceSection(),\n                                getDisplayUri(member),\n                                valueTracker.values());\n                        resultBuilder.addFailure(failure);\n                      }\n                    } else {\n                      var failure =\n                          factFailure(member.getSourceSection(), getDisplayUri(member), null);\n                      resultBuilder.addFailure(failure);\n                    }\n                  } else {\n                    resultBuilder.addSuccess();\n                  }\n                } catch (VmException err) {\n                  var error =\n                      new TestResults.Error(\n                          err.getMessage(), err.toPklException(stackFrameTransformer, useColor));\n                  resultBuilder.addError(error);\n                }\n                return true;\n              });\n          testResults.add(resultBuilder.build());\n          return true;\n        });\n    return new TestSectionResults(TestSectionName.FACTS, Collections.unmodifiableList(testResults));\n  }\n\n  private TestSectionResults runExamples(VmTyped testModule, ModuleInfo info) {\n    var examples = VmUtils.readMember(testModule, Identifier.EXAMPLES);\n    if (examples instanceof VmNull)\n      return new TestSectionResults(TestSectionName.EXAMPLES, List.of());\n\n    var moduleUri = info.getModuleKey().getUri();\n    if (!moduleUri.getScheme().equalsIgnoreCase(\"file\")) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotEvaluateNonFileBasedTestModule\", moduleUri)\n          .build();\n    }\n\n    var examplesMapping = (VmMapping) examples;\n    var moduleFile = Path.of(moduleUri);\n    var expectedOutputFile = moduleFile.resolveSibling(moduleFile.getFileName() + \"-expected.pcf\");\n    var actualOutputFile = moduleFile.resolveSibling(moduleFile.getFileName() + \"-actual.pcf\");\n\n    try {\n      Files.deleteIfExists(actualOutputFile);\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"ioErrorWritingTestOutputFile\", actualOutputFile)\n          .withCause(e)\n          .build();\n    }\n    try {\n      if (overwrite) {\n        Files.deleteIfExists(expectedOutputFile);\n      }\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"ioErrorWritingTestOutputFile\", expectedOutputFile)\n          .withCause(e)\n          .build();\n    }\n\n    if (Files.exists(expectedOutputFile)) {\n      return doRunAndValidateExamples(examplesMapping, expectedOutputFile, actualOutputFile);\n    } else {\n      return doRunAndWriteExamples(examplesMapping, expectedOutputFile);\n    }\n  }\n\n  private TestSectionResults doRunAndValidateExamples(\n      VmMapping examples, Path expectedOutputFile, Path actualOutputFile) {\n    var expectedExampleOutputs = loadExampleOutputs(expectedOutputFile);\n    var actualExampleOutputs = new MutableReference<VmDynamic>(null);\n    var allGroupsSucceeded = new MutableBoolean(true);\n    var errored = new MutableBoolean(false);\n    var testResults = new ArrayList<TestResult>();\n    examples.forceAndIterateMemberValues(\n        (groupKey, groupMember, groupValue) -> {\n          var testName = String.valueOf(groupKey);\n          var group = (VmListing) groupValue;\n          var expectedGroup =\n              (VmDynamic) VmUtils.readMemberOrNull(expectedExampleOutputs, groupKey);\n          var testResultBuilder = new TestResult.Builder(testName);\n\n          if (expectedGroup == null) {\n            testResultBuilder.addFailure(\n                examplePropertyMismatchFailure(getDisplayUri(groupMember), testName, true));\n            testResults.add(testResultBuilder.build());\n            return true;\n          }\n\n          if (group.getLength() != expectedGroup.getLength()) {\n            testResultBuilder.addFailure(\n                exampleLengthMismatchFailure(\n                    getDisplayUri(groupMember),\n                    testName,\n                    expectedGroup.getLength(),\n                    group.getLength()));\n            testResults.add(testResultBuilder.build());\n            return true;\n          }\n\n          group.iterateMembers(\n              ((exampleIndex, exampleMember) -> {\n                if (exampleMember.isLocalOrExternalOrHidden()) {\n                  return true;\n                }\n\n                Object exampleValue;\n                try {\n                  exampleValue = VmUtils.readMember(group, exampleIndex);\n                } catch (VmException err) {\n                  errored.set(true);\n                  testResultBuilder.addError(\n                      new TestResults.Error(\n                          err.getMessage(), err.toPklException(stackFrameTransformer, useColor)));\n                  return true;\n                }\n                var expectedValue = VmUtils.readMember(expectedGroup, exampleIndex);\n\n                var exampleValuePcf = renderAsPcf(exampleValue);\n                var expectedValuePcf = renderAsPcf(expectedValue);\n\n                if (!(exampleValuePcf.equals(expectedValuePcf))) {\n                  if (actualExampleOutputs.isNull()) {\n                    // immediately write and load `<fileName>-actual.pcf`\n                    // so that we can generate deep link with correct line number for each\n                    // mismatch\n                    writeExampleOutputs(actualOutputFile, examples);\n                    actualExampleOutputs.set(loadExampleOutputs(actualOutputFile));\n                  }\n\n                  var expectedMember = VmUtils.findMember(expectedGroup, exampleIndex);\n                  assert expectedMember != null;\n\n                  var actualGroup =\n                      (VmObjectLike) VmUtils.readMemberOrNull(actualExampleOutputs.get(), groupKey);\n                  var actualMember =\n                      actualGroup == null ? null : VmUtils.findMember(actualGroup, exampleIndex);\n                  if (actualMember == null) {\n                    // file was written earlier in this method;\n                    // must have been tampered with by another process\n                    throw new VmExceptionBuilder()\n                        .evalError(\"invalidOutputFileStructure\", actualOutputFile)\n                        .build();\n                  }\n\n                  testResultBuilder.addFailure(\n                      exampleFailure(\n                          getDisplayUri(exampleMember),\n                          getDisplayUri(expectedMember),\n                          expectedValuePcf,\n                          getDisplayUri(actualMember),\n                          exampleValuePcf,\n                          testResultBuilder.getCount()));\n                } else {\n                  testResultBuilder.addSuccess();\n                }\n\n                return true;\n              }));\n\n          testResults.add(testResultBuilder.build());\n\n          return true;\n        });\n\n    expectedExampleOutputs.iterateMembers(\n        (groupKey, groupMember) -> {\n          if (groupMember.isLocalOrExternalOrHidden()) {\n            return true;\n          }\n          if (examples.getCachedValue(groupKey) == null) {\n            var testName = String.valueOf(groupKey);\n            allGroupsSucceeded.set(false);\n            var result =\n                new TestResult.Builder(testName)\n                    .addFailure(\n                        examplePropertyMismatchFailure(getDisplayUri(groupMember), testName, false))\n                    .build();\n            testResults.add(result);\n          }\n          return true;\n        });\n\n    if (!allGroupsSucceeded.get() && actualExampleOutputs.isNull() && !errored.get()) {\n      writeExampleOutputs(actualOutputFile, examples);\n    }\n    return new TestSectionResults(\n        TestSectionName.EXAMPLES, Collections.unmodifiableList(testResults));\n  }\n\n  private TestSectionResults doRunAndWriteExamples(VmMapping examples, Path outputFile) {\n    var testResults = new ArrayList<TestResult>();\n    var allSucceeded = new MutableBoolean(true);\n    examples.forceAndIterateMemberValues(\n        (groupKey, groupMember, groupValue) -> {\n          var testName = String.valueOf(groupKey);\n          var listing = (VmListing) groupValue;\n          var testResultBuilder = new TestResult.Builder(testName);\n          var success = new MutableBoolean(true);\n          listing.iterateMembers(\n              (idx, member) -> {\n                if (member.isLocalOrExternalOrHidden()) {\n                  return true;\n                }\n                try {\n                  VmUtils.readMember(listing, idx);\n                  return true;\n                } catch (VmException err) {\n                  testResultBuilder.addError(\n                      new TestResults.Error(\n                          err.getMessage(), err.toPklException(stackFrameTransformer, useColor)));\n                  allSucceeded.set(false);\n                  success.set(false);\n                  return true;\n                }\n              });\n          if (success.get()) {\n            // treat writing an example as a message\n            testResultBuilder.setExampleWritten(true);\n            testResultBuilder.addFailure(\n                writtenExampleOutputFailure(testName, getDisplayUri(groupMember)));\n          }\n          testResults.add(testResultBuilder.build());\n          return true;\n        });\n    if (allSucceeded.get()) {\n      writeExampleOutputs(outputFile, examples);\n    }\n    return new TestSectionResults(\n        TestSectionName.EXAMPLES, Collections.unmodifiableList(testResults));\n  }\n\n  private void writeExampleOutputs(Path outputFile, VmMapping examples) {\n    var outputFileContent =\n        new VmDynamic(\n            VmUtils.createEmptyMaterializedFrame(),\n            BaseModule.getDynamicClass().getPrototype(),\n            EconomicMaps.of(\n                Identifier.EXAMPLES,\n                VmUtils.createSyntheticObjectProperty(Identifier.EXAMPLES, \"examples\", examples)),\n            0);\n    var builder = new StringBuilder();\n    new PcfRenderer(builder, \"  \", converter, false, true).renderDocument(outputFileContent);\n    try {\n      Files.writeString(outputFile, builder);\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"ioErrorWritingTestOutputFile\", outputFile)\n          .withCause(e)\n          .build();\n    }\n  }\n\n  private VmDynamic loadExampleOutputs(Path outputFile) {\n    // load file manually to prevent it from being cached (won't need it again)\n    String fileContent;\n    try {\n      fileContent = Files.readString(outputFile, StandardCharsets.UTF_8);\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"ioErrorReadingTestOutputFile\", outputFile)\n          .withCause(e)\n          .build();\n    }\n    var module =\n        VmLanguage.get(null).loadModule(ModuleKeys.synthetic(outputFile.toUri(), fileContent));\n    var examples = (VmDynamic) VmUtils.readMemberOrNull(module, Identifier.EXAMPLES);\n    if (examples == null) {\n      throw new VmExceptionBuilder().evalError(\"invalidOutputFileStructure\", outputFile).build();\n    }\n    return examples;\n  }\n\n  private static String renderAsPcf(Object pklValue) {\n    var builder = new StringBuilder();\n    new PcfRenderer(builder, \"  \", converter, false, false).renderValue(pklValue);\n    if (pklValue instanceof VmObject) {\n      builder.insert(0, \"new \");\n    }\n    return builder.toString();\n  }\n\n  private static String getDisplayUri(ObjectMember member) {\n    return VmUtils.getDisplayUri(\n        member.getSourceSection(), VmContext.get(null).getFrameTransformer());\n  }\n\n  private static String getDisplayUri(ModuleInfo moduleInfo) {\n    return VmUtils.getDisplayUri(\n        moduleInfo.getModuleKey().getUri(), VmContext.get(null).getFrameTransformer());\n  }\n\n  private Failure factFailure(\n      SourceSection sourceSection,\n      String location,\n      @Nullable Map<Node, List<Object>> trackedValues) {\n    var sb = new AnsiStringBuilder(useColor);\n    if (trackedValues != null) {\n      PowerAssertions.render(\n          sb,\n          \"\",\n          sourceSection,\n          trackedValues,\n          (it) -> {\n            it.append(\" \");\n            appendLocation(it, location);\n          });\n    } else {\n      sb.append(sourceSection.getCharacters());\n      sb.append(\" \");\n      appendLocation(sb, location);\n    }\n    return new Failure(\"Fact Failure\", sb.toString());\n  }\n\n  private Failure exampleLengthMismatchFailure(\n      String location, String property, int expectedLength, int actualLength) {\n    var sb = new AnsiStringBuilder(useColor);\n    appendLocation(sb, location);\n\n    sb.append('\\n')\n        .append(\n            AnsiTheme.TEST_FAILURE_MESSAGE,\n            () ->\n                sb.append(\"Output mismatch: Expected \\\"\")\n                    .append(property)\n                    .append(\"\\\" to contain \")\n                    .append(expectedLength)\n                    .append(\" examples, but found \")\n                    .append(actualLength));\n    return new Failure(\"Output Mismatch (Length)\", sb.toString());\n  }\n\n  private Failure examplePropertyMismatchFailure(\n      String location, String property, boolean isMissingInExpected) {\n\n    String existsIn;\n    String missingIn;\n\n    if (isMissingInExpected) {\n      existsIn = \"actual\";\n      missingIn = \"expected\";\n    } else {\n      existsIn = \"expected\";\n      missingIn = \"actual\";\n    }\n\n    var sb = new AnsiStringBuilder(useColor);\n    appendLocation(sb, location);\n\n    sb.append('\\n')\n        .append(\n            AnsiTheme.TEST_FAILURE_MESSAGE,\n            () ->\n                sb.append(\"Output mismatch: \\\"\")\n                    .append(property)\n                    .append(\"\\\" exists in \")\n                    .append(existsIn)\n                    .append(\" but not in \")\n                    .append(missingIn)\n                    .append(\" output\"));\n    return new Failure(\"Output Mismatch\", sb.toString());\n  }\n\n  private Failure exampleFailure(\n      String location,\n      String expectedLocation,\n      String expectedValue,\n      String actualLocation,\n      String actualValue,\n      int exampleNumber) {\n    var sb = new AnsiStringBuilder(useColor);\n    sb.append(AnsiTheme.TEST_NAME, \"#\" + exampleNumber + \": \");\n    sb.append(\n        AnsiTheme.TEST_FAILURE_MESSAGE,\n        () -> {\n          appendLocation(sb, location);\n          sb.append(\"\\n  Expected: \");\n          appendLocation(sb, expectedLocation);\n          sb.append(\"\\n  \");\n          sb.append(AnsiTheme.TEST_EXAMPLE_OUTPUT, expectedValue.replaceAll(\"\\n\", \"\\n  \"));\n          sb.append(\"\\n  Actual: \");\n          appendLocation(sb, actualLocation);\n          sb.append(\"\\n  \");\n          sb.append(AnsiTheme.TEST_EXAMPLE_OUTPUT, actualValue.replaceAll(\"\\n\", \"\\n  \"));\n        });\n    return new Failure(\"Example Failure\", sb.toString());\n  }\n\n  private void appendLocation(AnsiStringBuilder stringBuilder, String location) {\n    stringBuilder.append(\n        AnsiTheme.STACK_FRAME,\n        () -> stringBuilder.append(\"(\").appendUntrusted(location).append(\")\"));\n  }\n\n  private Failure writtenExampleOutputFailure(String testName, String location) {\n    var sb = new AnsiStringBuilder(useColor);\n    appendLocation(sb, location);\n    sb.append(AnsiTheme.TEST_FAILURE_MESSAGE, \"\\nWrote expected output for test \").append(testName);\n    return new Failure(\"Example Output Written\", sb.toString());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmBugException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.BiConsumer;\nimport org.pkl.core.*;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmBugException extends VmException {\n  public VmBugException(\n      @Nullable String message,\n      @Nullable Throwable cause,\n      boolean isExternalMessage,\n      Object[] messageArguments,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> messageBuilder,\n      List<ProgramValue> programValues,\n      @Nullable Node location,\n      @Nullable SourceSection sourceSection,\n      @Nullable String memberName,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      Map<CallTarget, StackFrame> insertedStackFrames) {\n\n    super(\n        message,\n        cause,\n        isExternalMessage,\n        messageArguments,\n        messageBuilder,\n        programValues,\n        location,\n        sourceSection,\n        memberName,\n        hintBuilder,\n        insertedStackFrames);\n  }\n\n  @Override\n  @TruffleBoundary\n  public String getLocalizedMessage() {\n    return String.format(getMessage(), getMessageArguments());\n  }\n\n  @Override\n  @TruffleBoundary\n  public PklException toPklException(StackFrameTransformer transformer, boolean color) {\n    var renderer = new VmExceptionRenderer(new StackTraceRenderer(transformer), color, true);\n    var rendered = renderer.render(this);\n    return new PklBugException(rendered, this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmBytes.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport java.util.NoSuchElementException;\nimport java.util.PrimitiveIterator;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.ast.ByteConstantValueNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.util.ByteArrayUtils;\nimport org.pkl.core.util.Nullable;\n\n@ValueType\npublic final class VmBytes extends VmValue implements Iterable<Long> {\n\n  private @Nullable VmList vmList;\n  private @Nullable String base64;\n  private @Nullable String hex;\n  private final byte[] bytes;\n  private @Nullable VmDataSize size;\n\n  public static final VmBytes EMPTY = new VmBytes(new byte[0]);\n\n  @TruffleBoundary\n  public static VmBytes createFromConstantNodes(ExpressionNode[] elements) {\n    if (elements.length == 0) {\n      return EMPTY;\n    }\n    var bytes = new byte[elements.length];\n    for (var i = 0; i < elements.length; i++) {\n      var exprNode = elements[i];\n      // guaranteed by AstBuilder\n      assert exprNode instanceof ByteConstantValueNode;\n      bytes[i] = ((ByteConstantValueNode) exprNode).getByteValue();\n    }\n    return new VmBytes(bytes);\n  }\n\n  public VmBytes(byte[] bytes) {\n    this.bytes = bytes;\n  }\n\n  public VmBytes(VmList vmList, byte[] bytes) {\n    this.vmList = vmList;\n    this.bytes = bytes;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getBytesClass();\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public byte[] export() {\n    return bytes;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitBytes(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertBytes(this, path);\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    if (!(obj instanceof VmBytes vmBytes)) {\n      return false;\n    }\n    return Arrays.equals(bytes, vmBytes.bytes);\n  }\n\n  @Override\n  public int hashCode() {\n    return Arrays.hashCode(bytes);\n  }\n\n  public byte[] getBytes() {\n    return bytes;\n  }\n\n  public long get(long index) {\n    return getBytes()[(int) index];\n  }\n\n  public VmBytes concatenate(VmBytes right) {\n    if (bytes.length == 0) return right;\n    if (right.bytes.length == 0) return this;\n\n    var newBytes = new byte[bytes.length + right.bytes.length];\n    System.arraycopy(bytes, 0, newBytes, 0, bytes.length);\n    System.arraycopy(right.bytes, 0, newBytes, bytes.length, right.bytes.length);\n    return new VmBytes(newBytes);\n  }\n\n  public VmList toList() {\n    if (vmList == null) {\n      vmList = VmList.create(bytes);\n    }\n    return vmList;\n  }\n\n  public String base64() {\n    if (base64 == null) {\n      base64 = ByteArrayUtils.base64(bytes);\n    }\n    return base64;\n  }\n\n  public String hex() {\n    if (hex == null) {\n      hex = ByteArrayUtils.toHex(bytes);\n    }\n    return hex;\n  }\n\n  public int getLength() {\n    return bytes.length;\n  }\n\n  public VmDataSize getSize() {\n    if (size == null) {\n      if (getLength() == 0) {\n        // avoid log10(0), which gives us -Infinity\n        size = new VmDataSize(0, DataSizeUnit.BYTES);\n      } else {\n        var magnitude = (int) Math.floor(Math.log10(getLength()));\n        var unit =\n            switch (magnitude) {\n              case 0, 1, 2 -> DataSizeUnit.BYTES;\n              case 3, 4, 5 -> DataSizeUnit.KILOBYTES;\n              case 6, 7, 8 -> DataSizeUnit.MEGABYTES;\n              case 9, 10, 11 -> DataSizeUnit.GIGABYTES;\n              // in practice, can never happen (Java can only hold at most math.maxInt bytes).\n              case 12, 13, 14 -> DataSizeUnit.TERABYTES;\n              default -> DataSizeUnit.PETABYTES;\n            };\n        size = new VmDataSize(getLength(), DataSizeUnit.BYTES).convertTo(unit);\n      }\n    }\n    return size;\n  }\n\n  @Override\n  public String toString() {\n    var sb = new StringBuilder(\"Bytes(\");\n    var isFirst = true;\n    for (var byt : bytes) {\n      if (isFirst) {\n        isFirst = false;\n      } else {\n        sb.append(\", \");\n      }\n      sb.append(Byte.toUnsignedInt(byt));\n    }\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  @Override\n  public Iterator<Long> iterator() {\n    return new PrimitiveIterator.OfLong() {\n      int index = 0;\n\n      @Override\n      public boolean hasNext() {\n        return index < bytes.length;\n      }\n\n      @Override\n      public long nextLong() {\n        if (!hasNext()) {\n          CompilerDirectives.transferToInterpreter();\n          throw new NoSuchElementException();\n        }\n        var result = Byte.toUnsignedLong(bytes[index]);\n        index += 1;\n        return result;\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmClass.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Idempotent;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.*;\nimport java.util.function.*;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.graalvm.collections.*;\nimport org.pkl.core.Member.SourceLocation;\nimport org.pkl.core.PClass;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.*;\nimport org.pkl.core.ast.member.*;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\n// Most stdlib modules and their members are initialized in static initializers\n// and reused across Truffle contexts.\n// As a consequence, VmObject/VmClass instances of stdlib modules must be thread-safe.\n// The currently implemented (and likely insufficient) solution is to\n// * deeply force standard library modules at initialization time.\n// * ensure that any further mutation (e.g., lazy initialization in VmClass) is thread-safe.\npublic final class VmClass extends VmValue {\n  private final SourceSection sourceSection;\n  private final SourceSection headerSection;\n  private final SourceSection @Nullable [] docComment;\n  private final List<VmTyped> annotations;\n  private final int modifiers;\n  private final PClassInfo<?> classInfo;\n  private final List<TypeParameter> typeParameters;\n  private final VmTyped prototype;\n\n  private final EconomicMap<Identifier, ClassProperty> declaredProperties = EconomicMaps.create();\n  private final EconomicMap<Identifier, ClassMethod> declaredMethods = EconomicMaps.create();\n\n  // initialized to non-null value by `initSupertype()` for all classes but `pkl.base#Any`\n  @CompilationFinal private @Nullable TypeNode supertypeNode;\n  @CompilationFinal private @Nullable VmClass superclass;\n\n  @LateInit\n  @GuardedBy(\"allPropertiesLock\")\n  private UnmodifiableEconomicMap<Identifier, ClassProperty> __allProperties;\n\n  private final Object allPropertiesLock = new Object();\n\n  @LateInit\n  @GuardedBy(\"allMethodsLock\")\n  private UnmodifiableEconomicMap<Identifier, ClassMethod> __allMethods;\n\n  private final Object allMethodsLock = new Object();\n\n  // Element type is `Object` rather than `Identifier` to enable `contains(Object)` tests\n  // (see signature of `UnmodifiableEconomicSet.contains()`).\n  @LateInit\n  @GuardedBy(\"allRegularPropertyNamesLock\")\n  private UnmodifiableEconomicSet<Object> __allRegularPropertyNames;\n\n  private final Object allRegularPropertyNamesLock = new Object();\n\n  // Element type is `Object` rather than `Identifier` to enable `contains(Object)` tests\n  // (see signature of `UnmodifiableEconomicSet.contains()`).\n  @LateInit\n  @GuardedBy(\"allHiddenPropertyNamesLock\")\n  private UnmodifiableEconomicSet<Object> __allHiddenPropertyNames;\n\n  private final Object allHiddenPropertyNamesLock = new Object();\n\n  // Helps to overcome recursive initialization issues\n  // between classes and annotations in pkl.base.\n  @CompilationFinal private volatile boolean isInitialized;\n\n  // PClass must be cached for correctness (identity is equality)\n  @LateInit\n  @GuardedBy(\"pClassLock\")\n  private PClass __pClass;\n\n  private final Object pClassLock = new Object();\n\n  @LateInit\n  @GuardedBy(\"mirrorLock\")\n  private VmTyped __mirror;\n\n  private final Object mirrorLock = new Object();\n\n  @LateInit\n  @GuardedBy(\"typedToDynamicMembersLock\")\n  private EconomicMap<Object, ObjectMember> __typedToDynamicMembers;\n\n  private final Object typedToDynamicMembersLock = new Object();\n\n  @LateInit\n  @GuardedBy(\"dynamicToTypedMembersLock\")\n  private EconomicMap<Object, ObjectMember> __dynamicToTypedMembers;\n\n  private final Object dynamicToTypedMembersLock = new Object();\n\n  @LateInit\n  @GuardedBy(\"mapToTypedMembersLock\")\n  private EconomicMap<Object, ObjectMember> __mapToTypedMembers;\n\n  private final Object mapToTypedMembersLock = new Object();\n\n  public VmClass(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      SourceSection @Nullable [] docComment,\n      List<VmTyped> annotations,\n      int modifiers,\n      PClassInfo<?> classInfo,\n      List<TypeParameter> typeParameters,\n      VmTyped prototype) {\n\n    this.sourceSection = sourceSection;\n    this.headerSection = headerSection;\n    this.docComment = docComment;\n    this.annotations = annotations;\n    this.modifiers = modifiers;\n    this.classInfo = classInfo;\n    this.typeParameters = typeParameters;\n\n    this.prototype = prototype;\n    prototype.lateInitVmClass(this);\n  }\n\n  public void initSupertype(TypeNode supertypeNode, VmClass superclass) {\n    assert this.supertypeNode == null;\n    assert this.superclass == null;\n\n    this.supertypeNode = supertypeNode;\n    this.superclass = superclass;\n    prototype.lateInitParent(superclass.getPrototype());\n  }\n\n  @TruffleBoundary\n  public void addProperty(ClassProperty property) {\n    prototype.addProperty(property.getInitializer());\n    EconomicMaps.put(declaredProperties, property.getName(), property);\n\n    if (!property.isLocal()) {\n      __allProperties = null;\n      __allHiddenPropertyNames = null;\n    }\n  }\n\n  @TruffleBoundary\n  public void addProperties(Iterable<ClassProperty> properties) {\n    for (var property : properties) {\n      addProperty(property);\n    }\n  }\n\n  @TruffleBoundary\n  public void addMethod(ClassMethod method) {\n    EconomicMaps.put(declaredMethods, method.getName(), method);\n\n    if (!method.isLocal()) {\n      __allMethods = null;\n    }\n  }\n\n  @TruffleBoundary\n  public void addMethods(Iterable<ClassMethod> methods) {\n    for (var method : methods) {\n      addMethod(method);\n    }\n  }\n\n  // Note: Superclasses may not have finished their initialization when this method is called.\n  public void notifyInitialized() {\n    isInitialized = true;\n  }\n\n  public int getTypeParameterCount() {\n    return typeParameters.size();\n  }\n\n  /**\n   * Returns the property with the given name declared in this class, or {@code null} if no such\n   * property was found. Does return local properties.\n   */\n  public @Nullable ClassProperty getDeclaredProperty(Identifier name) {\n    return EconomicMaps.get(declaredProperties, name);\n  }\n\n  /** Returns all properties declared in this class. Does include local properties. */\n  public Iterable<ClassProperty> getDeclaredProperties() {\n    return EconomicMaps.getValues(declaredProperties);\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getClassClass();\n  }\n\n  public SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  public SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  public SourceSection @Nullable [] getDocComment() {\n    return docComment;\n  }\n\n  public List<VmTyped> getAnnotations() {\n    return annotations;\n  }\n\n  public String getModuleName() {\n    return classInfo.getModuleName();\n  }\n\n  /**\n   * Returns the module that this class is declared in. For a module class, returns the\n   * corresponding module.\n   */\n  public VmTyped getModule() {\n    //noinspection ConstantConditions\n    return classInfo.isModuleClass() ? prototype : (VmTyped) prototype.getEnclosingOwner();\n  }\n\n  public VmTyped getModuleMirror() {\n    return getModule().getModuleInfo().getMirror(getModule());\n  }\n\n  public String getSimpleName() {\n    return classInfo.getSimpleName();\n  }\n\n  /**\n   * Returns the qualified name of this class, `<moduleName>#<simpleName>`. Note that a qualified\n   * class name isn't guaranteed to be unique, especially if the module name is not declared but\n   * inferred.\n   */\n  public String getQualifiedName() {\n    return classInfo.getQualifiedName();\n  }\n\n  public String getDisplayName() {\n    return classInfo.getDisplayName();\n  }\n\n  public PClassInfo<?> getPClassInfo() {\n    return classInfo;\n  }\n\n  @TruffleBoundary\n  public boolean isHiddenProperty(Object key) {\n    return getAllHiddenPropertyNames().contains(key);\n  }\n\n  /**\n   * Returns the property with the given name declared in this class or a superclass, or {@code\n   * null} if no such property was found. Does not return local properties.\n   */\n  public @Nullable ClassProperty getProperty(Identifier name) {\n    return EconomicMaps.get(getAllProperties(), name);\n  }\n\n  /** Shorthand for {@code getProperty(name) != null}. */\n  public boolean hasProperty(Identifier name) {\n    return !isInitialized || EconomicMaps.containsKey(getAllProperties(), name);\n  }\n\n  /**\n   * Returns the names of all non-hidden non-local non-external properties defined in this class and\n   * its superclasses.\n   */\n  public UnmodifiableEconomicSet<Object> getAllRegularPropertyNames() {\n    synchronized (allRegularPropertyNamesLock) {\n      if (__allRegularPropertyNames == null) {\n        __allRegularPropertyNames = collectAllRegularPropertyNames();\n      }\n      return __allRegularPropertyNames;\n    }\n  }\n\n  /** Returns the names of all hidden properties defined in this class and its superclasses. */\n  public UnmodifiableEconomicSet<Object> getAllHiddenPropertyNames() {\n    synchronized (allHiddenPropertyNamesLock) {\n      if (__allHiddenPropertyNames == null) {\n        __allHiddenPropertyNames = collectAllHiddenPropertyNames();\n      }\n      return __allHiddenPropertyNames;\n    }\n  }\n\n  /** Includes local methods. */\n  public boolean hasDeclaredMethod(Identifier name) {\n    return EconomicMaps.containsKey(declaredMethods, name);\n  }\n\n  /** Does return local methods. */\n  public @Nullable ClassMethod getDeclaredMethod(Identifier name) {\n    return EconomicMaps.get(declaredMethods, name);\n  }\n\n  /** Includes local methods. */\n  public Iterable<ClassMethod> getDeclaredMethods() {\n    return EconomicMaps.getValues(declaredMethods);\n  }\n\n  /** Does not return local methods. */\n  public @Nullable ClassMethod getMethod(Identifier name) {\n    return EconomicMaps.get(getAllMethods(), name);\n  }\n\n  /** Does not include local methods. */\n  public Iterable<ClassMethod> getMethods() {\n    return EconomicMaps.getValues(getAllMethods());\n  }\n\n  public @Nullable VmClass getSuperclass() {\n    return superclass;\n  }\n\n  @Override\n  public VmTyped getPrototype() {\n    return prototype;\n  }\n\n  @Idempotent\n  public boolean isAbstract() {\n    return VmModifier.isAbstract(modifiers);\n  }\n\n  @Idempotent\n  public boolean isExternal() {\n    return VmModifier.isExternal(modifiers);\n  }\n\n  @Idempotent\n  public boolean isOpen() {\n    return VmModifier.isOpen(modifiers);\n  }\n\n  @Idempotent\n  public boolean isClosed() {\n    return VmModifier.isClosed(modifiers);\n  }\n\n  @Idempotent\n  public boolean isInstantiable() {\n    return VmModifier.isInstantiable(modifiers);\n  }\n\n  @Idempotent\n  public boolean isNullClass() {\n    return isClass(BaseModule.getNullClass(), \"pkl.base#Null\");\n  }\n\n  @Idempotent\n  public boolean isCollectionClass() {\n    return isClass(BaseModule.getCollectionClass(), \"pkl.base#Collection\");\n  }\n\n  @Idempotent\n  public boolean isListClass() {\n    return isClass(BaseModule.getListClass(), \"pkl.base#List\");\n  }\n\n  @Idempotent\n  public boolean isSetClass() {\n    return isClass(BaseModule.getSetClass(), \"pkl.base#Set\");\n  }\n\n  @Idempotent\n  public boolean isMapClass() {\n    return isClass(BaseModule.getMapClass(), \"pkl.base#Map\");\n  }\n\n  @Idempotent\n  public boolean isListingClass() {\n    return isClass(BaseModule.getListingClass(), \"pkl.base#Listing\");\n  }\n\n  @Idempotent\n  public boolean isMappingClass() {\n    return isClass(BaseModule.getMappingClass(), \"pkl.base#Mapping\");\n  }\n\n  @Idempotent\n  public boolean isDynamicClass() {\n    return isClass(BaseModule.getDynamicClass(), \"pkl.base#Dynamic\");\n  }\n\n  @Idempotent\n  public boolean isPairClass() {\n    return isClass(BaseModule.getPairClass(), \"pkl.base#Pair\");\n  }\n\n  @Idempotent\n  public boolean isFunctionClass() {\n    return isClass(BaseModule.getFunctionClass(), \"pkl.base#Function\");\n  }\n\n  @Idempotent\n  public boolean isFunctionNClass() {\n    return superclass != null\n        && superclass.isClass(BaseModule.getFunctionClass(), \"pkl.base#Function\");\n  }\n\n  @Idempotent\n  public boolean isModuleClass() {\n    return isClass(BaseModule.getModuleClass(), \"pkl.base#Module\");\n  }\n\n  @Idempotent\n  public boolean isClassClass() {\n    return isClass(BaseModule.getClassClass(), \"pkl.base#Class\");\n  }\n\n  @Idempotent\n  public boolean isVarArgsClass() {\n    return isClass(BaseModule.getVarArgsClass(), \"pkl.base#VarArgs\");\n  }\n\n  private boolean isClass(@Nullable VmClass clazz, String qualifiedClassName) {\n    // may be null during evaluation of base module\n    return clazz != null ? this == clazz : getQualifiedName().equals(qualifiedClassName);\n  }\n\n  public boolean isSuperclassOf(VmClass other) {\n    if (isClosed()) return this == other;\n\n    for (var clazz = other; clazz != null; clazz = clazz.getSuperclass()) {\n      if (clazz == this) return true;\n    }\n    return false;\n  }\n\n  public boolean isSubclassOf(VmClass other) {\n    return other.isSuperclassOf(this);\n  }\n\n  public void visitMethodDefsTopDown(Consumer<ClassMethod> visitor) {\n    if (superclass != null) {\n      superclass.visitMethodDefsTopDown(visitor);\n    }\n    EconomicMaps.getValues(declaredMethods).forEach(visitor);\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  public VmTyped getMirror() {\n    synchronized (mirrorLock) {\n      if (__mirror == null) {\n        __mirror = MirrorFactories.classFactory.create(this);\n      }\n      return __mirror;\n    }\n  }\n\n  @TruffleBoundary\n  public EconomicMap<Object, ObjectMember> getTypedToDynamicMembers() {\n    synchronized (typedToDynamicMembersLock) {\n      if (__typedToDynamicMembers == null) {\n        __typedToDynamicMembers =\n            createDelegatingMembers(\n                (member) ->\n                    new UntypedObjectMemberNode(\n                        null, new FrameDescriptor(), member, new DelegateToExtraStorageObjNode()));\n      }\n      return __typedToDynamicMembers;\n    }\n  }\n\n  @TruffleBoundary\n  public EconomicMap<Object, ObjectMember> getDynamicToTypedMembers() {\n    synchronized (dynamicToTypedMembersLock) {\n      if (__dynamicToTypedMembers == null) {\n        __dynamicToTypedMembers =\n            createDelegatingMembers(\n                (member) ->\n                    TypeCheckedPropertyNodeGen.create(\n                        null,\n                        new FrameDescriptor(),\n                        member,\n                        new DelegateToExtraStorageObjOrParentNode()));\n      }\n      return __dynamicToTypedMembers;\n    }\n  }\n\n  @TruffleBoundary\n  public EconomicMap<Object, ObjectMember> getMapToTypedMembers() {\n    synchronized (mapToTypedMembersLock) {\n      if (__mapToTypedMembers == null) {\n        __mapToTypedMembers =\n            createDelegatingMembers(\n                (member) ->\n                    TypeCheckedPropertyNodeGen.create(\n                        null,\n                        new FrameDescriptor(),\n                        member,\n                        new DelegateToExtraStorageMapOrParentNode()));\n      }\n      return __mapToTypedMembers;\n    }\n  }\n\n  private EconomicMap<Object, ObjectMember> createDelegatingMembers(\n      Function<ObjectMember, MemberNode> memberNodeFactory) {\n    var result = EconomicMaps.<Object, ObjectMember>create();\n    for (var cursor = getAllProperties().getEntries(); cursor.advance(); ) {\n      var property = cursor.getValue();\n      // Typed->Dynamic conversion: Dynamic objects cannot currently have hidden members.\n      // Dynamic/Map->Typed conversion: Overall it seems more useful for the typed object\n      // to inherit its prototype's value for the hidden property (e.g., Module.output).\n      if (property.isHidden()) continue;\n\n      var name = cursor.getKey();\n      var member =\n          new ObjectMember(\n              VmUtils.unavailableSourceSection(),\n              VmUtils.unavailableSourceSection(),\n              VmModifier.NONE,\n              name,\n              name.toString());\n      member.initMemberNode(memberNodeFactory.apply(member));\n      result.put(name, member);\n    }\n    return result;\n  }\n\n  public VmSet getModifierMirrors() {\n    return VmModifier.getMirrors(modifiers, true);\n  }\n\n  public VmList getTypeParameterMirrors() {\n    var builder = VmList.EMPTY.builder();\n    for (var typeParameter : typeParameters) {\n      builder.add(MirrorFactories.typeParameterFactory.create(typeParameter));\n    }\n    return builder.build();\n  }\n\n  public VmValue getSuperclassMirror() {\n    return superclass == null ? VmNull.withoutDefault() : superclass.getMirror();\n  }\n\n  public VmValue getSupertypeMirror() {\n    return supertypeNode == null ? VmNull.withoutDefault() : supertypeNode.getMirror();\n  }\n\n  public VmMap getPropertyMirrors() {\n    var builder = VmMap.builder();\n    for (var property : declaredProperties.getValues()) {\n      if (property.isLocal()) continue;\n      builder.add(property.getName().toString(), property.getMirror());\n    }\n    return builder.build();\n  }\n\n  public VmMap getAllPropertyMirrors() {\n    var builder = VmMap.builder();\n    for (var property : getAllProperties().getValues()) {\n      if (property.isLocal()) continue;\n      builder.add(property.getName().toString(), property.getMirror());\n    }\n    return builder.build();\n  }\n\n  public VmMap getMethodMirrors() {\n    var builder = VmMap.builder();\n    for (var method : declaredMethods.getValues()) {\n      if (method.isLocal()) continue;\n      builder.add(method.getName().toString(), method.getMirror());\n    }\n    return builder.build();\n  }\n\n  public VmMap getAllMethodMirrors() {\n    var builder = VmMap.builder();\n    for (var method : getAllMethods().getValues()) {\n      if (method.isLocal()) continue;\n      builder.add(method.getName().toString(), method.getMirror());\n    }\n    return builder.build();\n  }\n\n  @Override\n  @TruffleBoundary\n  public PClass export() {\n    synchronized (pClassLock) {\n      if (__pClass == null) {\n        var exportedAnnotations = new ArrayList<PObject>();\n        var properties =\n            CollectionUtils.<String, PClass.Property>newLinkedHashMap(\n                EconomicMaps.size(declaredProperties));\n        var methods =\n            CollectionUtils.<String, PClass.Method>newLinkedHashMap(\n                EconomicMaps.size(declaredMethods));\n\n        // set pClass before exporting class members to prevent\n        // infinite recursion in case of cyclic references\n        __pClass =\n            new PClass(\n                VmUtils.exportDocComment(docComment),\n                new SourceLocation(headerSection.getStartLine(), sourceSection.getEndLine()),\n                VmModifier.export(modifiers, true),\n                exportedAnnotations,\n                classInfo,\n                typeParameters,\n                properties,\n                methods);\n\n        for (var parameter : typeParameters) {\n          parameter.initOwner(__pClass);\n        }\n\n        if (supertypeNode != null) {\n          assert superclass != null;\n          __pClass.initSupertype(TypeNode.export(supertypeNode), superclass.export());\n        }\n\n        VmUtils.exportAnnotations(annotations, exportedAnnotations);\n\n        for (var property : EconomicMaps.getValues(declaredProperties)) {\n          if (isClassPropertyDefinition(property)) {\n            properties.put(property.getName().toString(), property.export(__pClass));\n          }\n        }\n\n        for (var method : EconomicMaps.getValues(declaredMethods)) {\n          if (method.isLocal()) continue;\n          methods.put(method.getName().toString(), method.export(__pClass));\n        }\n      }\n\n      return __pClass;\n    }\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitClass(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertClass(this, path);\n  }\n\n  @Override\n  public String toString() {\n    return getDisplayName();\n  }\n\n  private UnmodifiableEconomicMap<Identifier, ClassProperty> getAllProperties() {\n    synchronized (allPropertiesLock) {\n      if (__allProperties == null) {\n        // can't do this in ClassNode because it requires a fully initialized inheritance hierarchy\n        // (which may not yet exist when ClassNode runs due to circular class dependencies)\n        __allProperties = collectAllProperties();\n      }\n      return __allProperties;\n    }\n  }\n\n  private UnmodifiableEconomicMap<Identifier, ClassMethod> getAllMethods() {\n    synchronized (allMethodsLock) {\n      if (__allMethods == null) {\n        // can't do this in ClassNode because it requires a fully initialized inheritance hierarchy\n        // (which may not yet exist when ClassNode runs due to circular class dependencies)\n        __allMethods = collectAllMethods();\n      }\n      return __allMethods;\n    }\n  }\n\n  /**\n   * Tells if the given property defines a member of this class. Requires a fully initialized\n   * inheritance hierarchy.\n   */\n  private boolean isClassPropertyDefinition(ClassProperty declaredProperty) {\n    if (declaredProperty.isLocal() || declaredProperty.isClass() || declaredProperty.isTypeAlias())\n      return false;\n    return getProperty(declaredProperty.getName()) == declaredProperty;\n  }\n\n  @TruffleBoundary\n  private UnmodifiableEconomicMap<Identifier, ClassProperty> collectAllProperties() {\n    if (EconomicMaps.isEmpty(declaredProperties)) {\n      return superclass == null ? EconomicMaps.create() : superclass.getAllProperties();\n    }\n\n    var size =\n        EconomicMaps.size(declaredProperties)\n            + (superclass == null ? 0 : EconomicMaps.size(superclass.getAllProperties()));\n    var result = EconomicMaps.<Identifier, ClassProperty>create(size);\n\n    if (superclass != null) {\n      EconomicMaps.putAll(result, superclass.getAllProperties());\n    }\n\n    for (var property : EconomicMaps.getValues(declaredProperties)) {\n      if (property.isLocal()) continue;\n\n      // A property is considered a class property definition\n      // if it has a type annotation or has no superdefinition (ad-hoc case).\n      // Otherwise, it is considered an object property definition,\n      // which means it affects the class prototype but not the class itself.\n      // An example for the latter is when `Module.output` is overridden with `output { ... }`.\n      if (property.getTypeNode() != null || !EconomicMaps.containsKey(result, property.getName())) {\n        EconomicMaps.put(result, property.getName(), property);\n      }\n    }\n\n    return result;\n  }\n\n  @TruffleBoundary\n  private UnmodifiableEconomicMap<Identifier, ClassMethod> collectAllMethods() {\n    if (EconomicMaps.isEmpty(declaredMethods)) {\n      return superclass == null ? EconomicMaps.create() : superclass.getAllMethods();\n    }\n\n    var size =\n        EconomicMaps.size(declaredMethods)\n            + (superclass == null ? 0 : EconomicMaps.size(superclass.getAllMethods()));\n    var result = EconomicMaps.<Identifier, ClassMethod>create(size);\n\n    if (superclass != null) {\n      EconomicMaps.putAll(result, superclass.getAllMethods());\n    }\n\n    for (var method : EconomicMaps.getValues(declaredMethods)) {\n      if (method.isLocal()) continue;\n\n      EconomicMaps.put(result, method.getName(), method);\n    }\n\n    return result;\n  }\n\n  @TruffleBoundary\n  private UnmodifiableEconomicSet<Object> collectAllRegularPropertyNames() {\n    if (EconomicMaps.isEmpty(declaredProperties)) {\n      return superclass == null ? EconomicSet.create() : superclass.getAllRegularPropertyNames();\n    }\n\n    var size = superclass == null ? 0 : superclass.getAllRegularPropertyNames().size();\n    var result = EconomicSet.create(size);\n    for (var property : EconomicMaps.getValues(declaredProperties)) {\n      if (!(property.isLocal() || isHiddenProperty(property.getName()) || property.isExternal())) {\n        result.add(property.getName());\n      }\n    }\n\n    if (superclass == null) {\n      return result;\n    }\n\n    if (result.isEmpty()) {\n      return superclass.getAllRegularPropertyNames();\n    }\n\n    result.addAll(superclass.getAllRegularPropertyNames());\n    return result;\n  }\n\n  @TruffleBoundary\n  private UnmodifiableEconomicSet<Object> collectAllHiddenPropertyNames() {\n    if (EconomicMaps.isEmpty(declaredProperties)) {\n      return superclass == null ? EconomicSet.create() : superclass.getAllHiddenPropertyNames();\n    }\n\n    var size = superclass == null ? 0 : superclass.getAllHiddenPropertyNames().size();\n    var result = EconomicSet.create(size);\n    for (var property : EconomicMaps.getValues(declaredProperties)) {\n      if (property.isHidden()) {\n        result.add(property.getName());\n      }\n    }\n\n    if (superclass == null) {\n      return result;\n    }\n\n    if (result.isEmpty()) {\n      return superclass.getAllHiddenPropertyNames();\n    }\n\n    result.addAll(superclass.getAllHiddenPropertyNames());\n    return result;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    // each class is represented by a unique instance of VmClass\n    return this == obj;\n  }\n\n  @Override\n  public int hashCode() {\n    // use a more deterministic hash code than System.identityHashCode()\n    return classInfo.hashCode();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmCollection.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.Iterator;\nimport org.organicdesign.fp.xform.Xform;\n\npublic abstract class VmCollection extends VmValue implements Iterable<Object> {\n  public interface Builder<T extends VmCollection> {\n    void add(Object element);\n\n    void addAll(Iterable<?> elements);\n\n    T build();\n  }\n\n  public abstract int getLength();\n\n  public abstract boolean isEmpty();\n\n  @Override\n  public boolean isSequence() {\n    return true;\n  }\n\n  public abstract VmCollection add(Object element);\n\n  public abstract VmCollection concatenate(VmCollection other);\n\n  public abstract Iterator<Object> reverseIterator();\n\n  public abstract Builder<? extends VmCollection> builder();\n\n  public final void checkNonEmpty() {\n    if (isEmpty()) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder()\n          .evalError(\"expectedNonEmptyCollection\")\n          .withProgramValue(\"Collection\", this)\n          .build();\n    }\n  }\n\n  @SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\n  public abstract boolean isLengthOne();\n\n  public final void checkLengthOne() {\n    if (!isLengthOne()) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder()\n          .evalError(\"expectedSingleElementCollection\")\n          .withProgramValue(\"Collection\", this)\n          .build();\n    }\n  }\n\n  protected static void checkPositive(long n) {\n    VmUtils.checkPositive(n);\n  }\n\n  @TruffleBoundary\n  public final boolean startsWith(VmCollection other) {\n    if (getLength() < other.getLength()) return false;\n\n    var iter = iterator();\n    var otherIter = other.iterator();\n\n    //noinspection WhileLoopReplaceableByForEach\n    while (otherIter.hasNext()) {\n      if (!iter.next().equals(otherIter.next())) return false;\n    }\n\n    return true;\n  }\n\n  @TruffleBoundary\n  public final boolean endsWith(VmCollection other) {\n    if (getLength() < other.getLength()) return false;\n\n    var iter = reverseIterator();\n    var otherIter = other.reverseIterator();\n\n    while (otherIter.hasNext()) {\n      if (!iter.next().equals(otherIter.next())) return false;\n    }\n\n    return true;\n  }\n\n  @TruffleBoundary\n  public final VmList replaceRange(long start, long exclusiveEnd, VmCollection replacement) {\n    var result =\n        Xform.of(this).take(start).concat(replacement).concat(Xform.of(this).drop(exclusiveEnd));\n    return VmList.create(result);\n  }\n\n  @TruffleBoundary\n  public final Object replaceRangeOrNull(long start, long exclusiveEnd, VmCollection replacement) {\n    var length = getLength();\n\n    if (start < 0 || start > length) {\n      return VmNull.withoutDefault();\n    }\n\n    if (exclusiveEnd < start || exclusiveEnd > length) {\n      return VmNull.withoutDefault();\n    }\n\n    var result =\n        Xform.of(this).take(start).concat(replacement).concat(Xform.of(this).drop(exclusiveEnd));\n    return VmList.create(result);\n  }\n\n  @TruffleBoundary\n  public final VmCollection flatten() {\n    var builder = builder();\n    for (var elem : this) {\n      if (elem instanceof Iterable<?> iterable) {\n        builder.addAll(iterable);\n      } else if (elem instanceof VmListing listing) {\n        listing.forceAndIterateMemberValues(\n            (key, member, value) -> {\n              builder.add(value);\n              return true;\n            });\n      } else {\n        CompilerDirectives.transferToInterpreter();\n        throw new VmExceptionBuilder()\n            .evalError(\"cannotFlattenCollectionWithNonCollectionElement\")\n            .withProgramValue(\"Element\", elem)\n            .build();\n      }\n    }\n    return builder.build();\n  }\n\n  @TruffleBoundary\n  public final VmCollection zip(VmCollection other) {\n    var builder = builder();\n    var iter1 = iterator();\n    var iter2 = other.iterator();\n    while (iter1.hasNext() && iter2.hasNext()) {\n      builder.add(new VmPair(iter1.next(), iter2.next()));\n    }\n    return builder.build();\n  }\n\n  @TruffleBoundary\n  public final String join(String separator) {\n    if (isEmpty()) return \"\";\n\n    var iter = iterator();\n    var builder = new StringBuilder();\n    builder.append(iter.next());\n\n    while (iter.hasNext()) {\n      builder.append(separator);\n      builder.append(iter.next());\n    }\n\n    return builder.toString();\n  }\n\n  public final String toString() {\n    return VmValueRenderer.multiLine(Integer.MAX_VALUE).render(this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmContext.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.TruffleLanguage.ContextReference;\nimport com.oracle.truffle.api.TruffleLanguage.Env;\nimport com.oracle.truffle.api.instrumentation.Instrumenter;\nimport com.oracle.truffle.api.nodes.Node;\nimport java.nio.file.Path;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.pkl.core.Logger;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.evaluatorSettings.TraceMode;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ProjectDependenciesManager;\nimport org.pkl.core.packages.PackageResolver;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmContext {\n  private static final ContextReference<VmContext> REFERENCE =\n      ContextReference.create(VmLanguage.class);\n  private final VmValueTrackerFactory valueTrackerFactory;\n\n  public VmContext(VmLanguage vmLanguage, Env env) {\n    this.valueTrackerFactory =\n        new VmValueTrackerFactory(env.lookup(Instrumenter.class), vmLanguage);\n  }\n\n  @LateInit private Holder holder;\n\n  public static final class Holder {\n    private static final String OUTPUT_FORMAT_KEY = \"pkl.outputFormat\";\n\n    private final StackFrameTransformer frameTransformer;\n    private final SecurityManager securityManager;\n    private final HttpClient httpClient;\n    private final ModuleResolver moduleResolver;\n    private final ResourceManager resourceManager;\n    private final Logger logger;\n    private final Map<String, String> environmentVariables;\n    private final Path moduleCacheDir;\n    private final Map<String, String> externalProperties;\n    private final ModuleCache moduleCache;\n    private final @Nullable PackageResolver packageResolver;\n    private final @Nullable ProjectDependenciesManager projectDependenciesManager;\n    private final TraceMode traceMode;\n    private final boolean powerAssertions;\n\n    public Holder(\n        StackFrameTransformer frameTransformer,\n        SecurityManager securityManager,\n        HttpClient httpClient,\n        ModuleResolver moduleResolver,\n        ResourceManager resourceManager,\n        Logger logger,\n        Map<String, String> environmentVariables,\n        Map<String, String> externalProperties,\n        @Nullable Path moduleCacheDir,\n        @Nullable String outputFormat,\n        @Nullable PackageResolver packageResolver,\n        @Nullable ProjectDependenciesManager projectDependenciesManager,\n        TraceMode traceMode,\n        boolean powerAssertions) {\n\n      this.frameTransformer = frameTransformer;\n      this.securityManager = securityManager;\n      this.httpClient = httpClient;\n      this.moduleResolver = moduleResolver;\n      this.resourceManager = resourceManager;\n      this.logger = logger;\n      this.environmentVariables = environmentVariables;\n      this.moduleCacheDir = moduleCacheDir;\n\n      // treat outputFormat as an external property from here on, at least for now\n      var props = new HashMap<>(externalProperties);\n      if (outputFormat != null) {\n        props.put(OUTPUT_FORMAT_KEY, outputFormat);\n      }\n      this.externalProperties = props;\n\n      moduleCache = new ModuleCache();\n      this.packageResolver = packageResolver;\n      this.projectDependenciesManager = projectDependenciesManager;\n      this.traceMode = traceMode;\n      this.powerAssertions = powerAssertions;\n    }\n  }\n\n  public static VmContext get(@Nullable Node node) {\n    return REFERENCE.get(node);\n  }\n\n  public void initialize(Holder holder) {\n    assert this.holder == null;\n    this.holder = holder;\n  }\n\n  public ModuleCache getModuleCache() {\n    return holder.moduleCache;\n  }\n\n  public @Nullable Path getModuleCacheDir() {\n    return holder.moduleCacheDir;\n  }\n\n  public StackFrameTransformer getFrameTransformer() {\n    return holder.frameTransformer;\n  }\n\n  public SecurityManager getSecurityManager() {\n    return holder.securityManager;\n  }\n\n  public HttpClient getHttpClient() {\n    return holder.httpClient;\n  }\n\n  public ModuleResolver getModuleResolver() {\n    return holder.moduleResolver;\n  }\n\n  public ResourceManager getResourceManager() {\n    return holder.resourceManager;\n  }\n\n  public Logger getLogger() {\n    return holder.logger;\n  }\n\n  public Map<String, String> getEnvironmentVariables() {\n    return holder.environmentVariables;\n  }\n\n  public Map<String, String> getExternalProperties() {\n    return holder.externalProperties;\n  }\n\n  public @Nullable PackageResolver getPackageResolver() {\n    return holder.packageResolver;\n  }\n\n  public @Nullable ProjectDependenciesManager getProjectDependenciesManager() {\n    return holder.projectDependenciesManager;\n  }\n\n  public TraceMode getTraceMode() {\n    return holder.traceMode;\n  }\n\n  public boolean getPowerAssertionsEnabled() {\n    return holder.powerAssertions;\n  }\n\n  public VmValueTrackerFactory getValueTrackerFactory() {\n    return valueTrackerFactory;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmDataSize.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport static java.util.Map.*;\n\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport java.util.*;\nimport org.pkl.core.DataSize;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.Value;\nimport org.pkl.core.util.MathUtils;\nimport org.pkl.core.util.Nullable;\n\n@ValueType\npublic final class VmDataSize extends VmValue implements Comparable<VmDataSize> {\n  private static final Map<Identifier, DataSizeUnit> UNITS =\n      Map.ofEntries(\n          entry(Identifier.B, DataSizeUnit.BYTES),\n          entry(Identifier.KB, DataSizeUnit.KILOBYTES),\n          entry(Identifier.KIB, DataSizeUnit.KIBIBYTES),\n          entry(Identifier.MB, DataSizeUnit.MEGABYTES),\n          entry(Identifier.MIB, DataSizeUnit.MEBIBYTES),\n          entry(Identifier.GB, DataSizeUnit.GIGABYTES),\n          entry(Identifier.GIB, DataSizeUnit.GIBIBYTES),\n          entry(Identifier.TB, DataSizeUnit.TERABYTES),\n          entry(Identifier.TIB, DataSizeUnit.TEBIBYTES),\n          entry(Identifier.PB, DataSizeUnit.PETABYTES),\n          entry(Identifier.PIB, DataSizeUnit.PEBIBYTES));\n\n  private final double value;\n  private final DataSizeUnit unit;\n\n  public VmDataSize(double value, DataSizeUnit unit) {\n    this.value = value;\n    this.unit = unit;\n  }\n\n  public static @Nullable DataSizeUnit toUnit(Identifier identifier) {\n    return UNITS.get(identifier);\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getDataSizeClass();\n  }\n\n  public double getValue() {\n    return value;\n  }\n\n  public DataSizeUnit getUnit() {\n    return unit;\n  }\n\n  public VmDataSize add(VmDataSize other) {\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return new VmDataSize(convertValueTo(other.unit) + other.value, other.unit);\n    }\n    return new VmDataSize(value + other.convertValueTo(unit), unit);\n  }\n\n  public VmDataSize subtract(VmDataSize other) {\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return new VmDataSize(convertValueTo(other.unit) - other.value, other.unit);\n    }\n    return new VmDataSize(value - other.convertValueTo(unit), unit);\n  }\n\n  public VmDataSize multiply(double num) {\n    return new VmDataSize(value * num, unit);\n  }\n\n  public VmDataSize divide(double num) {\n    return new VmDataSize(value / num, unit);\n  }\n\n  public double divide(VmDataSize other) {\n    // use same conversion strategy as add/subtract\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return convertValueTo(other.unit) / other.value;\n    }\n    return value / other.convertValueTo(unit);\n  }\n\n  public VmDataSize remainder(double num) {\n    return new VmDataSize(value % num, unit);\n  }\n\n  public VmDataSize pow(double num) {\n    return new VmDataSize(StrictMath.pow(value, num), unit);\n  }\n\n  public VmDataSize round() {\n    return new VmDataSize(StrictMath.rint(value), unit);\n  }\n\n  public VmDataSize convertTo(DataSizeUnit unit) {\n    return new VmDataSize(convertValueTo(unit), unit);\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public Value export() {\n    return new DataSize(value, unit);\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitDataSize(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertDataSize(this, path);\n  }\n\n  @Override\n  public int compareTo(VmDataSize other) {\n    // use same conversion strategy as add/subtract\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return Double.compare(convertValueTo(other.unit), other.value);\n    }\n    return Double.compare(value, other.convertValueTo(unit));\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmDataSize other)) return false;\n    // converting to a fixed unit guarantees that equals() is commutative and consistent with\n    // hashCode()\n    return convertValueTo(DataSizeUnit.BYTES) == other.convertValueTo(DataSizeUnit.BYTES);\n  }\n\n  @Override\n  public int hashCode() {\n    return Double.hashCode(convertValueTo(DataSizeUnit.BYTES));\n  }\n\n  @Override\n  public String toString() {\n    return MathUtils.isMathematicalInteger(value) ? (long) value + \".\" + unit : value + \".\" + unit;\n  }\n\n  private double convertValueTo(DataSizeUnit other) {\n    return value * unit.getBytes() / other.getBytes();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmDuration.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport java.util.*;\nimport org.pkl.core.*;\nimport org.pkl.core.util.DurationUtils;\nimport org.pkl.core.util.Nullable;\n\n@ValueType\npublic final class VmDuration extends VmValue implements Comparable<VmDuration> {\n  private static final Map<Identifier, DurationUnit> UNITS =\n      Map.of(\n          Identifier.NS, DurationUnit.NANOS,\n          Identifier.US, DurationUnit.MICROS,\n          Identifier.MS, DurationUnit.MILLIS,\n          Identifier.S, DurationUnit.SECONDS,\n          Identifier.MIN, DurationUnit.MINUTES,\n          Identifier.H, DurationUnit.HOURS,\n          Identifier.D, DurationUnit.DAYS);\n\n  private final double value;\n  private final DurationUnit unit;\n\n  public VmDuration(double value, DurationUnit unit) {\n    this.value = value;\n    this.unit = unit;\n  }\n\n  public static @Nullable DurationUnit toUnit(Identifier identifier) {\n    return UNITS.get(identifier);\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getDurationClass();\n  }\n\n  public VmDuration add(VmDuration other) {\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return new VmDuration(getValue(other.unit) + other.value, other.unit);\n    }\n    return new VmDuration(value + other.getValue(unit), unit);\n  }\n\n  public VmDuration subtract(VmDuration other) {\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return new VmDuration(getValue(other.unit) - other.value, other.unit);\n    }\n    return new VmDuration(value - other.getValue(unit), unit);\n  }\n\n  public double getValue() {\n    return value;\n  }\n\n  public double getValue(DurationUnit other) {\n    return value * unit.getNanos() / other.getNanos();\n  }\n\n  public DurationUnit getUnit() {\n    return unit;\n  }\n\n  public VmDuration multiply(double num) {\n    return new VmDuration(value * num, unit);\n  }\n\n  public VmDuration divide(double num) {\n    return new VmDuration(value / num, unit);\n  }\n\n  public double divide(VmDuration other) {\n    // use same conversion strategy as add/subtract\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return getValue(other.unit) / other.value;\n    }\n    return value / other.getValue(unit);\n  }\n\n  public VmDuration remainder(double num) {\n    return new VmDuration(value % num, unit);\n  }\n\n  public VmDuration pow(double num) {\n    return new VmDuration(StrictMath.pow(value, num), unit);\n  }\n\n  public VmDuration round() {\n    return new VmDuration(StrictMath.rint(value), unit);\n  }\n\n  public VmDuration convertTo(DurationUnit unit) {\n    return new VmDuration(getValue(unit), unit);\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public Value export() {\n    return new Duration(value, unit);\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitDuration(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertDuration(this, path);\n  }\n\n  @Override\n  public int compareTo(VmDuration other) {\n    // use same conversion strategy as add/subtract\n    if (unit.ordinal() <= other.unit.ordinal()) {\n      return Double.compare(getValue(other.unit), other.value);\n    }\n    return Double.compare(value, other.getValue(unit));\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmDuration other)) return false;\n    // converting to a fixed unit guarantees that equals() is commutative and consistent with\n    // hashCode()\n    return getValue(DurationUnit.NANOS) == other.getValue(DurationUnit.NANOS);\n  }\n\n  @Override\n  public int hashCode() {\n    return Double.hashCode(getValue(DurationUnit.NANOS));\n  }\n\n  @Override\n  public String toString() {\n    return DurationUtils.toPklString(value, unit);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmDynamic.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport java.util.Objects;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.EconomicMaps;\n\npublic final class VmDynamic extends VmObject {\n  private int cachedRegularMemberCount = -1;\n\n  private static final class EmptyHolder {\n    private static final VmDynamic EMPTY =\n        new VmDynamic(\n            VmUtils.createEmptyMaterializedFrame(),\n            BaseModule.getDynamicClass().getPrototype(),\n            EconomicMaps.create(),\n            0);\n  }\n\n  private final int length;\n\n  public static VmDynamic empty() {\n    return EmptyHolder.EMPTY;\n  }\n\n  public VmDynamic(\n      MaterializedFrame enclosingFrame,\n      VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      int length) {\n    super(enclosingFrame, Objects.requireNonNull(parent), members);\n    this.length = length;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getDynamicClass();\n  }\n\n  /** Returns the number of elements in this object. */\n  public int getLength() {\n    return length;\n  }\n\n  /** Tells whether this object has any elements. */\n  public boolean hasElements() {\n    return length != 0;\n  }\n\n  @Override\n  public boolean isSequence() {\n    return hasElements();\n  }\n\n  @Override\n  @TruffleBoundary\n  public PObject export() {\n    var properties =\n        CollectionUtils.<String, Object>newLinkedHashMap(EconomicMaps.size(cachedValues));\n\n    iterateMemberValues(\n        (key, member, value) -> {\n          properties.put(key.toString(), VmValue.exportNullable(value));\n          return true;\n        });\n\n    return new PObject(PClassInfo.Dynamic, properties);\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitDynamic(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertDynamic(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(Object obj) {\n    if (this == obj) // noinspection Contract\n    return true;\n    if (!(obj instanceof VmDynamic other)) return false;\n\n    // could use shallow force, but deep force is cached\n    force(false);\n    other.force(false);\n    if (getRegularMemberCount() != other.getRegularMemberCount()) return false;\n\n    var cursor = cachedValues.getEntries();\n    while (cursor.advance()) {\n      Object key = cursor.getKey();\n      if (isHiddenOrLocalProperty(key)) continue;\n\n      var value = cursor.getValue();\n      assert value != null;\n      var otherValue = other.getCachedValue(key);\n      if (!value.equals(otherValue)) return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    if (cachedHash != 0) return cachedHash;\n\n    force(false);\n    var result = 0;\n    var cursor = cachedValues.getEntries();\n\n    while (cursor.advance()) {\n      var key = cursor.getKey();\n      if (isHiddenOrLocalProperty(key)) continue;\n\n      var value = cursor.getValue();\n      assert value != null;\n      result += key.hashCode() ^ value.hashCode();\n    }\n\n    cachedHash = result;\n    return result;\n  }\n\n  // assumes object has been forced\n  public int getRegularMemberCount() {\n    if (cachedRegularMemberCount != -1) return cachedRegularMemberCount;\n\n    var result = 0;\n    for (var key : cachedValues.getKeys()) {\n      if (!isHiddenOrLocalProperty(key)) result += 1;\n    }\n    cachedRegularMemberCount = result;\n    return result;\n  }\n\n  private boolean isHiddenOrLocalProperty(Object key) {\n    return key instanceof Identifier\n        && (key == Identifier.DEFAULT || ((Identifier) key).isLocalProp());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmEvalException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.BiConsumer;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.Nullable;\n\npublic class VmEvalException extends VmException {\n  public VmEvalException(\n      @Nullable String message,\n      @Nullable Throwable cause,\n      boolean isExternalMessage,\n      Object[] messageArguments,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> messageBuilder,\n      List<ProgramValue> programValues,\n      @Nullable Node location,\n      @Nullable SourceSection sourceSection,\n      @Nullable String memberName,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      Map<CallTarget, StackFrame> insertedStackFrames) {\n\n    super(\n        message,\n        cause,\n        isExternalMessage,\n        messageArguments,\n        messageBuilder,\n        programValues,\n        location,\n        sourceSection,\n        memberName,\n        hintBuilder,\n        insertedStackFrames);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.exception.AbstractTruffleException;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.BiConsumer;\nimport org.pkl.core.*;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class VmException extends AbstractTruffleException {\n  private final boolean isExternalMessage;\n  private final Object[] messageArguments;\n  private final List<ProgramValue> programValues;\n  private final @Nullable SourceSection sourceSection;\n  private final @Nullable String memberName;\n  private final Map<CallTarget, StackFrame> insertedStackFrames;\n  @Nullable private final BiConsumer<AnsiStringBuilder, Boolean> messageBuilder;\n  @Nullable protected BiConsumer<AnsiStringBuilder, Boolean> hintBuilder;\n\n  public VmException(\n      @Nullable String message,\n      @Nullable Throwable cause,\n      boolean isExternalMessage,\n      Object[] messageArguments,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> messageBuilder,\n      List<ProgramValue> programValues,\n      @Nullable Node location,\n      @Nullable SourceSection sourceSection,\n      @Nullable String memberName,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      Map<CallTarget, StackFrame> insertedStackFrames) {\n    super(message, cause, UNLIMITED_STACK_TRACE, location);\n    this.messageBuilder = messageBuilder;\n    this.isExternalMessage = isExternalMessage;\n    this.messageArguments = messageArguments;\n    this.programValues = programValues;\n    this.sourceSection = sourceSection;\n    this.memberName = memberName;\n    this.insertedStackFrames = insertedStackFrames;\n    this.hintBuilder = hintBuilder;\n  }\n\n  public final boolean isExternalMessage() {\n    return isExternalMessage;\n  }\n\n  public final Object[] getMessageArguments() {\n    return messageArguments;\n  }\n\n  public final List<ProgramValue> getProgramValues() {\n    return programValues;\n  }\n\n  public final @Nullable SourceSection getSourceSection() {\n    return sourceSection;\n  }\n\n  public final @Nullable String getMemberName() {\n    return memberName;\n  }\n\n  /**\n   * Stack frames to insert into the stack trace presented to the user. For each entry `(target,\n   * frame)`, `frame` will be inserted below the top-most frame associated with `target`.\n   */\n  public final Map<CallTarget, StackFrame> getInsertedStackFrames() {\n    return insertedStackFrames;\n  }\n\n  public @Nullable BiConsumer<AnsiStringBuilder, Boolean> getMessageBuilder() {\n    return messageBuilder;\n  }\n\n  public @Nullable BiConsumer<AnsiStringBuilder, Boolean> getHintBuilder() {\n    return hintBuilder;\n  }\n\n  public void setHint(String hint) {\n    this.hintBuilder = ((builder, aBoolean) -> builder.append(hint));\n  }\n\n  public enum Kind {\n    EVAL_ERROR,\n    UNDEFINED_VALUE,\n    WRAPPED,\n    BUG\n  }\n\n  public record ProgramValue(String name, Object value) {\n    private static final VmValueRenderer valueRenderer = VmValueRenderer.singleLine(80);\n\n    @Override\n    @TruffleBoundary\n    public String toString() {\n      return valueRenderer.render(value);\n    }\n  }\n\n  @TruffleBoundary\n  public PklException toPklException(StackFrameTransformer transformer, boolean color) {\n    var renderer = new VmExceptionRenderer(new StackTraceRenderer(transformer), color, true);\n    var rendered = renderer.render(this);\n    return new PklException(rendered);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmExceptionBuilder.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.*;\nimport java.util.function.BiConsumer;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.runtime.MemberLookupSuggestions.Candidate.Kind;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Error message guidelines:\n *\n * <ul>\n *   <li>Pkl strives to provide a great experience for casual users. Hence it must excel at error\n *       reporting.\n *   <li>Be concrete and concise. Examples and explanations can help but must carry their weight.\n *   <li>The source line is considered an integral part of the error message. Assume it's always\n *       presented to the user. Design the main message accordingly and avoid duplicated\n *       information.\n *   <li>Use correct \"natural language\" spelling. Most messages should be sentences that start with\n *       an uppercase letter and end with a dot.\n *   <li>The main message should typically be a single line and sentence. Try to make it both easy\n *       to understand for novices and easy to recognize for experienced users. Use {@link\n *       VmExceptionBuilder#withHint} for longer explanations.\n *   <li>Don't include arbitrary-size information in the main message but instead use {@link\n *       VmExceptionBuilder#withProgramValue}.\n *   <li>Use {@link VmExceptionBuilder#withExternalMessage} whenever possible.\n *   <li>Avoid abbreviations (i.e., e.g., etc., ...). Some users will not be familiar with them.\n *   <li>Use backticks for inline code (cf. Markdown). (For identifiers, *emphasis* may be\n *       preferable but isn't currently used. One problem with special formatting is that error\n *       output doesn't always go to a terminal and hence may be rendered verbatim.)\n */\n@SuppressWarnings(\"UnusedReturnValue\")\npublic final class VmExceptionBuilder {\n\n  private @Nullable Object receiver;\n  private @Nullable Map<CallTarget, StackFrame> insertedStackFrames;\n  private VmException wrappedException;\n  private @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder;\n\n  public static class MultilineValue {\n    private final Iterable<?> lines;\n\n    private MultilineValue(Iterable<?> lines) {\n      this.lines = lines;\n    }\n\n    public static Object of(Iterable<?> lines) {\n      return new MultilineValue(lines);\n    }\n\n    public static Object of(Stream<?> lines) {\n      return new MultilineValue(lines.collect(Collectors.toList()));\n    }\n\n    public String toString() {\n      var builder = new StringBuilder();\n      var first = true;\n      for (var value : lines) {\n        if (first) {\n          first = false;\n        } else {\n          builder.append(\"\\n\");\n        }\n        builder.append(value);\n      }\n      return builder.toString();\n    }\n  }\n\n  private @Nullable String message;\n  private @Nullable BiConsumer<AnsiStringBuilder, Boolean> messageBuilder;\n  private @Nullable Throwable cause;\n  private VmException.Kind kind = VmException.Kind.EVAL_ERROR;\n  private boolean isExternalMessage;\n  private Object[] messageArguments = new Object[0];\n  private final List<VmException.ProgramValue> programValues = new ArrayList<>();\n  private @Nullable Node location;\n  private @Nullable SourceSection sourceSection;\n  private @Nullable String memberName;\n\n  public VmExceptionBuilder typeMismatch(Object value, VmClass expectedType) {\n    if (value instanceof VmNull) {\n      return evalError(\"typeMismatchValue\", expectedType, \"null\");\n    }\n\n    return evalError(\"typeMismatch\", expectedType, VmUtils.getClass(value))\n        .withProgramValue(\"Value\", value);\n  }\n\n  public VmExceptionBuilder typeMismatch(\n      Object value, VmClass expectedType1, VmClass expectedType2) {\n    if (value instanceof VmNull) {\n      return evalError(\"typeMismatchValue2\", expectedType1, expectedType2, \"null\");\n    }\n\n    return evalError(\"typeMismatch2\", expectedType1, expectedType2, VmUtils.getClass(value))\n        .withProgramValue(\"Value\", value);\n  }\n\n  public VmExceptionBuilder unreachableCode() {\n    return bug(\"Unreachable code.\");\n  }\n\n  public VmExceptionBuilder undefinedValue() {\n    kind = VmException.Kind.UNDEFINED_VALUE;\n    return withExternalMessage(\"undefinedValue\");\n  }\n\n  public VmExceptionBuilder undefinedPropertyValue(Identifier propertyName, Object receiver) {\n    kind = VmException.Kind.UNDEFINED_VALUE;\n    this.receiver = receiver;\n    return withExternalMessage(\"undefinedPropertyValue\", propertyName);\n  }\n\n  public VmExceptionBuilder cannotFindMember(VmObjectLike receiver, Object memberKey) {\n    if (memberKey instanceof Identifier identifier) {\n      return cannotFindProperty(receiver, identifier, true, false);\n    }\n    if (memberKey instanceof String string) {\n      var candidates = KeyLookupSuggestions.forObject(receiver, string);\n      if (!candidates.isEmpty()) {\n        return evalError(\n            \"cannotFindKeyListCandidates\",\n            new ProgramValue(\"\", memberKey),\n            new MultilineValue(candidates));\n      }\n    }\n    return evalError(\"cannotFindKey\", new ProgramValue(\"\", memberKey));\n  }\n\n  public VmExceptionBuilder cannotFindProperty(\n      VmObjectLike receiver,\n      Identifier propertyName,\n      // true -> property read, false -> property definition\n      boolean isRead,\n      boolean isImplicitReceiver) {\n\n    var memberKinds = isRead ? EnumSet.allOf(Kind.class) : EnumSet.of(Kind.PROPERTY);\n\n    var candidates =\n        new MemberLookupSuggestions(receiver, propertyName, -1, memberKinds)\n            .find(isImplicitReceiver);\n\n    if (candidates.isEmpty()) {\n      if (isImplicitReceiver) {\n        // probably wouldn't be useful to list all members in scope (includes all pkl.base members)\n        evalError(\"cannotFindPropertyInScope\", propertyName);\n      } else if (receiver.isModuleObject()) {\n        evalError(\n            \"cannotFindPropertyInModule\",\n            propertyName,\n            VmUtils.getModuleInfo(receiver).getModuleName(),\n            new MultilineValue(collectPropertyNames(receiver, isRead)));\n      } else {\n        var propertyNames = collectPropertyNames(receiver, isRead);\n        evalError(\n            \"cannotFindPropertyInObject\",\n            propertyName,\n            receiver.getVmClass(),\n            propertyNames.isEmpty() ? \"(none)\" : new MultilineValue(propertyNames));\n      }\n    } else {\n      if (isImplicitReceiver) {\n        evalError(\n            \"cannotFindPropertyInScopeListCandidates\",\n            propertyName,\n            new MultilineValue(candidates));\n      } else if (receiver.isModuleObject()) {\n        evalError(\n            \"cannotFindPropertyInModuleListCandidates\",\n            propertyName,\n            VmUtils.getModuleInfo(receiver).getModuleName(),\n            new MultilineValue(candidates));\n      } else {\n        evalError(\n            \"cannotFindPropertyInObjectListCandidates\",\n            propertyName,\n            receiver.getVmClass(),\n            new MultilineValue(candidates));\n      }\n    }\n\n    return this;\n  }\n\n  // `foo.bar()`\n  public VmExceptionBuilder cannotFindMethod(\n      VmObjectLike receiver, Identifier methodName, int arity, boolean isImplicitReceiver) {\n\n    var candidates =\n        new MemberLookupSuggestions(receiver, methodName, arity, EnumSet.allOf(Kind.class))\n            .find(isImplicitReceiver);\n\n    if (candidates.isEmpty()) {\n      if (isImplicitReceiver) {\n        // probably not useful to list all members in scope (includes all pkl.base members)\n        evalError(\"cannotFindMethodInScope\", methodName);\n      } else if (receiver.isModuleObject()) {\n        evalError(\n            \"cannotFindMethodInModule\",\n            methodName,\n            VmUtils.getModuleInfo(receiver).getModuleName(),\n            new MultilineValue(collectMethodNames(receiver.getVmClass())));\n      } else {\n        evalError(\n            \"cannotFindMethodInClass\",\n            methodName,\n            receiver.getVmClass(),\n            new MultilineValue(collectMethodNames(receiver.getVmClass())));\n      }\n    } else {\n      if (isImplicitReceiver) {\n        evalError(\n            \"cannotFindMethodInScopeListCandidates\", methodName, new MultilineValue(candidates));\n      } else if (receiver.isModuleObject()) {\n        evalError(\n            \"cannotFindMethodInModuleListCandidates\",\n            methodName,\n            VmUtils.getModuleInfo(receiver).getModuleName(),\n            new MultilineValue(candidates));\n      } else {\n        evalError(\n            \"cannotFindMethodInClassListCandidates\",\n            methodName,\n            receiver.getVmClass(),\n            new MultilineValue(candidates));\n      }\n    }\n\n    return this;\n  }\n\n  public VmExceptionBuilder cannotFindKey(VmMap map, Object key) {\n    if (key instanceof String string) {\n      var candidates = KeyLookupSuggestions.forMap(map, string);\n      if (!candidates.isEmpty()) {\n        return evalError(\n            \"cannotFindKeyListCandidates\",\n            new ProgramValue(\"\", key),\n            new MultilineValue(candidates));\n      }\n    }\n\n    return evalError(\"cannotFindKey\", new ProgramValue(\"\", key));\n  }\n\n  // not internationalized\n  public VmExceptionBuilder bug(String message, Object... args) {\n    kind = VmException.Kind.BUG;\n    return withMessage(message, args);\n  }\n\n  private VmExceptionBuilder withMessage(String message, Object... args) {\n    this.message = message;\n    messageArguments = args;\n    isExternalMessage = false;\n\n    return this;\n  }\n\n  private VmExceptionBuilder withExternalMessage(String message, Object... args) {\n    this.message = message;\n    messageArguments = args;\n    isExternalMessage = true;\n\n    return this;\n  }\n\n  // slow path, hence no need to cache anything (also resource bundles are cached by default)\n  public VmExceptionBuilder evalError(String messageKey, Object... args) {\n    return withExternalMessage(messageKey, args);\n  }\n\n  public VmExceptionBuilder adhocEvalError(String message, Object... args) {\n    return withMessage(message, args);\n  }\n\n  public VmExceptionBuilder withMessageBuilder(\n      BiConsumer<AnsiStringBuilder, Boolean> messageBuilder) {\n    this.messageBuilder = messageBuilder;\n    return this;\n  }\n\n  public VmExceptionBuilder withProgramValue(String name, Object value) {\n    programValues.add(new ProgramValue(name, value));\n    return this;\n  }\n\n  public VmExceptionBuilder withLocation(Node location) {\n    this.location = location;\n    withSourceSection(location.getSourceSection());\n    return this;\n  }\n\n  public VmExceptionBuilder withOptionalLocation(@Nullable Node location) {\n    if (location != null) withLocation(location);\n    return this;\n  }\n\n  public VmExceptionBuilder withSourceSection(@Nullable SourceSection sourceSection) {\n    this.sourceSection = sourceSection;\n    return this;\n  }\n\n  public VmExceptionBuilder withMemberName(String memberName) {\n    this.memberName = memberName;\n    return this;\n  }\n\n  public VmExceptionBuilder withCause(Throwable cause) {\n    this.cause = cause;\n    if (this.message == null) {\n      var causeMessage = cause.getMessage();\n      this.message = causeMessage == null ? \"None (cause has no message)\" : causeMessage;\n    }\n    return this;\n  }\n\n  public VmExceptionBuilder withHint(@Nullable String hint) {\n    if (hint != null) {\n      this.hintBuilder = (builder, ignored) -> builder.append(hint);\n    }\n    return this;\n  }\n\n  public VmExceptionBuilder withHintBuilder(\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder) {\n    this.hintBuilder = hintBuilder;\n    return this;\n  }\n\n  public VmExceptionBuilder wrapping(VmException nestedException) {\n    this.wrappedException = nestedException;\n    this.kind = VmException.Kind.WRAPPED;\n    return this;\n  }\n\n  public VmExceptionBuilder withInsertedStackFrames(\n      Map<CallTarget, StackFrame> insertedStackFrames) {\n    this.insertedStackFrames = insertedStackFrames;\n    return this;\n  }\n\n  public VmException build() {\n    if (message == null && messageBuilder == null) {\n      throw new IllegalStateException(\"No message set.\");\n    }\n    if (message != null && messageBuilder != null) {\n      throw new IllegalStateException(\"Both message and messageBuilder are set\");\n    }\n\n    var effectiveInsertedStackFrames =\n        insertedStackFrames == null ? new HashMap<CallTarget, StackFrame>() : insertedStackFrames;\n    return switch (kind) {\n      case EVAL_ERROR ->\n          new VmEvalException(\n              message,\n              cause,\n              isExternalMessage,\n              messageArguments,\n              messageBuilder,\n              programValues,\n              location,\n              sourceSection,\n              memberName,\n              hintBuilder,\n              effectiveInsertedStackFrames);\n      case UNDEFINED_VALUE ->\n          new VmUndefinedValueException(\n              message,\n              cause,\n              isExternalMessage,\n              messageArguments,\n              messageBuilder,\n              programValues,\n              location,\n              sourceSection,\n              memberName,\n              hintBuilder,\n              receiver,\n              effectiveInsertedStackFrames);\n      case BUG ->\n          new VmBugException(\n              message,\n              cause,\n              isExternalMessage,\n              messageArguments,\n              messageBuilder,\n              programValues,\n              location,\n              sourceSection,\n              memberName,\n              hintBuilder,\n              effectiveInsertedStackFrames);\n      case WRAPPED ->\n          new VmWrappedEvalException(\n              message,\n              cause,\n              isExternalMessage,\n              messageArguments,\n              messageBuilder,\n              programValues,\n              location,\n              sourceSection,\n              memberName,\n              hintBuilder,\n              effectiveInsertedStackFrames,\n              wrappedException);\n    };\n  }\n\n  private List<Identifier> collectPropertyNames(VmObjectLike object, boolean isRead) {\n    var result = new HashSet<Identifier>();\n    object.iterateMembers(\n        (key, member) -> {\n          if (member.isProp() && (isRead || !member.isExternal())) {\n            result.add(member.getName());\n          }\n          return true;\n        });\n    return result.stream().sorted().collect(Collectors.toList());\n  }\n\n  private List<Identifier> collectMethodNames(VmClass clazz) {\n    var result = new ArrayList<Identifier>();\n    clazz.getMethods().forEach(method -> result.add(method.getName()));\n    result.sort(Comparator.naturalOrder());\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmExceptionRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URLEncoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.stream.Collectors;\nimport org.pkl.core.Release;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.AnsiTheme;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmExceptionRenderer {\n  private final @Nullable StackTraceRenderer stackTraceRenderer;\n  private final boolean color;\n  private final boolean powerAssertions;\n\n  /**\n   * Constructs an error renderer with the given stack trace renderer. If stack trace renderer is\n   * {@code null}, stack traces will not be included in error output.\n   */\n  public VmExceptionRenderer(\n      @Nullable StackTraceRenderer stackTraceRenderer, boolean color, boolean powerAssertions) {\n    this.stackTraceRenderer = stackTraceRenderer;\n    this.color = color;\n    this.powerAssertions = powerAssertions;\n  }\n\n  @TruffleBoundary\n  public String render(VmException exception) {\n    var formatter = new AnsiStringBuilder(color);\n    render(exception, formatter);\n    return formatter.toString();\n  }\n\n  private void render(VmException exception, AnsiStringBuilder out) {\n    if (exception instanceof VmBugException bugException) {\n      renderBugException(bugException, out);\n    } else {\n      renderException(exception, out, true);\n    }\n  }\n\n  private void renderBugException(VmBugException exception, AnsiStringBuilder out) {\n    // if a cause exists, it's more useful to report just that\n    var exceptionToReport = exception.getCause() != null ? exception.getCause() : exception;\n    var exceptionUrl = URLEncoder.encode(exceptionToReport.toString(), StandardCharsets.UTF_8);\n\n    out.append(\"An unexpected error has occurred. Would you mind filing a bug report?\")\n        .append('\\n')\n        .append(\"Cmd+Double-click the link below to open an issue.\")\n        .append('\\n')\n        .append(\"Please copy and paste the entire error output into the issue's description.\")\n        .append(\"\\n\".repeat(2))\n        .append(\"https://github.com/apple/pkl/issues/new\")\n        .append(\"\\n\".repeat(2))\n        .append(exceptionUrl.replaceAll(\"\\\\+\", \"%20\"))\n        .append(\"\\n\\n\");\n\n    renderException(exception, out, true);\n\n    out.append('\\n').append(Release.current().versionInfo()).append(\"\\n\".repeat(2));\n\n    exceptionToReport.printStackTrace(out.toPrintWriter());\n  }\n\n  private void renderException(VmException exception, AnsiStringBuilder out, boolean withHeader) {\n    String message;\n    var hintBuilder = exception.getHintBuilder();\n    @Nullable String hint = null;\n    if (exception.isExternalMessage()) {\n      var totalMessage =\n          ErrorMessages.create(exception.getMessage(), exception.getMessageArguments());\n      // first paragraph is message, remainder is hint\n      var index = totalMessage.indexOf(\"\\n\\n\");\n      if (index != -1) {\n        message = totalMessage.substring(0, index);\n        hint = totalMessage.substring(index + 2);\n      } else {\n        message = totalMessage;\n      }\n    } else if (exception.getMessage() != null && exception.getMessageArguments().length != 0) {\n      message = String.format(exception.getMessage(), exception.getMessageArguments());\n    } else {\n      message = exception.getMessage();\n    }\n\n    if (withHeader) {\n      out.append(AnsiTheme.ERROR_HEADER, \"–– Pkl Error ––\").append('\\n');\n    }\n    if (exception.getMessageBuilder() != null) {\n      out.append(\n          AnsiTheme.ERROR_MESSAGE,\n          () -> exception.getMessageBuilder().accept(out, powerAssertions));\n      out.append('\\n');\n    } else {\n      out.append(AnsiTheme.ERROR_MESSAGE, message).append('\\n');\n    }\n\n    // include cause's message unless it's the same as this exception's message\n    if (exception.getCause() != null) {\n      var cause = exception.getCause();\n      var causeMessage = cause.getMessage();\n      // null for Truffle's LazyStackTrace\n      if (causeMessage != null && !causeMessage.equals(message)) {\n        out.append(cause.getClass().getSimpleName()).append(\": \").append(causeMessage).append('\\n');\n      }\n    }\n\n    var maxNameLength =\n        exception.getProgramValues().stream().mapToInt(v -> v.name().length()).max().orElse(0);\n\n    for (var value : exception.getProgramValues()) {\n      out.append(value.name())\n          .append(\" \".repeat(Math.max(0, maxNameLength - value.name().length())))\n          .append(\": \")\n          .append(value)\n          .append('\\n');\n    }\n\n    if (stackTraceRenderer != null) {\n      var frames = StackTraceGenerator.capture(exception);\n\n      if (exception instanceof VmWrappedEvalException vmWrappedEvalException) {\n        var sb = out.newInstance();\n        renderException(vmWrappedEvalException.getWrappedException(), sb, false);\n        hint = sb.toString().lines().map((it) -> \">\\t\" + it).collect(Collectors.joining(\"\\n\"));\n      }\n\n      if (!frames.isEmpty()) {\n        stackTraceRenderer.render(frames, hint, hintBuilder, out.append('\\n'));\n      } else if (hint != null) {\n        // render hint if there are no stack frames\n        out.append('\\n').append(AnsiTheme.ERROR_MESSAGE_HINT, hint);\n      } else if (hintBuilder != null) {\n        out.append('\\n')\n            .append(AnsiTheme.ERROR_MESSAGE_HINT, () -> hintBuilder.accept(out, powerAssertions));\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmFileDetector.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.nio.file.Path;\nimport java.nio.file.spi.FileTypeDetector;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmFileDetector extends FileTypeDetector {\n  @Override\n  public @Nullable String probeContentType(Path path) {\n    var fileName = path.getFileName();\n    if (fileName != null && fileName.toString().endsWith(\".pkl\")) {\n      return \"application/x-pkl\";\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmFunction.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.RootCallTarget;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport java.util.function.BiFunction;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmFunction extends VmObjectLike {\n\n  private final Object thisValue;\n  private final int paramCount;\n  private final PklRootNode rootNode;\n\n  public VmFunction(\n      MaterializedFrame enclosingFrame,\n      Object thisValue,\n      int paramCount,\n      PklRootNode rootNode,\n      @Nullable Object extraStorage) {\n    super(enclosingFrame);\n    this.thisValue = thisValue;\n    this.paramCount = paramCount;\n    this.rootNode = rootNode;\n    this.extraStorage = extraStorage;\n  }\n\n  public RootCallTarget getCallTarget() {\n    return rootNode.getCallTarget();\n  }\n\n  public int getParameterCount() {\n    return paramCount;\n  }\n\n  // if call site is a node, use ApplyVmFunction1Node.execute() or DirectCallNode.call() instead of\n  // this method\n  public Object apply(Object arg1) {\n    return getCallTarget().call(thisValue, this, arg1);\n  }\n\n  // if call site is a node, use ApplyVmFunction2Node.execute() or DirectCallNode.call() instead of\n  // this method\n  public Object apply(Object arg1, Object arg2) {\n    return getCallTarget().call(thisValue, this, arg1, arg2);\n  }\n\n  public VmFunction copy(\n      int newParamCount, @Nullable PklRootNode newRootNode, @Nullable Object newExtraStorage) {\n    return new VmFunction(\n        enclosingFrame,\n        thisValue,\n        newParamCount,\n        newRootNode == null ? rootNode : newRootNode,\n        newExtraStorage);\n  }\n\n  public Object getThisValue() {\n    return thisValue;\n  }\n\n  @Override\n  public VmObjectLike getParent() {\n    return getPrototype();\n  }\n\n  @Override\n  public boolean hasMember(Object key) {\n    return false;\n  }\n\n  @Override\n  public @Nullable ObjectMember getMember(Object key) {\n    return null;\n  }\n\n  @Override\n  public UnmodifiableEconomicMap<Object, ObjectMember> getMembers() {\n    return EconomicMaps.create();\n  }\n\n  public PklRootNode getRootNode() {\n    return rootNode;\n  }\n\n  @Override\n  public @Nullable Object getCachedValue(Object key) {\n    return null;\n  }\n\n  @Override\n  @TruffleBoundary\n  public void setCachedValue(Object key, Object value) {\n    throw new VmExceptionBuilder()\n        .bug(\"Class `VmFunction` does not support method `setCachedValue()`.\")\n        .build();\n  }\n\n  @Override\n  public boolean hasCachedValue(Object key) {\n    throw new VmExceptionBuilder()\n        .bug(\"Class `VmFunction` does not support method `hasCachedValue()`.\")\n        .build();\n  }\n\n  @Override\n  public boolean iterateMemberValues(MemberValueConsumer consumer) {\n    return true;\n  }\n\n  @Override\n  public boolean forceAndIterateMemberValues(ForcedMemberValueConsumer consumer) {\n    return true;\n  }\n\n  @Override\n  public boolean iterateAlreadyForcedMemberValues(ForcedMemberValueConsumer consumer) {\n    return true;\n  }\n\n  @Override\n  public boolean iterateMembers(BiFunction<Object, ObjectMember, Boolean> consumer) {\n    return true;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getFunctionNClass(paramCount);\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues, boolean recurse) {\n    // do nothing\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public Object export() {\n    throw new VmExceptionBuilder().evalError(\"cannotExportValue\", getVmClass()).build();\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitFunction(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertFunction(this, path);\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    return this == obj;\n  }\n\n  @Override\n  public int hashCode() {\n    return System.identityHashCode(this);\n  }\n\n  @Override\n  @TruffleBoundary\n  public String toString() {\n    return VmValueRenderer.singleLine(Integer.MAX_VALUE).render(this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmImportAnalyzer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.nio.file.NoSuchFileException;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.TreeMap;\nimport java.util.TreeSet;\nimport org.pkl.core.ImportGraph;\nimport org.pkl.core.ImportGraph.Import;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.ast.builder.ImportsAndReadsParser;\nimport org.pkl.core.ast.builder.ImportsAndReadsParser.Entry;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.util.GlobResolver;\nimport org.pkl.core.util.GlobResolver.InvalidGlobPatternException;\nimport org.pkl.core.util.IoUtils;\n\npublic class VmImportAnalyzer {\n  @TruffleBoundary\n  public static ImportGraph analyze(URI[] moduleUris, VmContext context)\n      throws IOException, SecurityManagerException, ExternalReaderProcessException {\n    var imports = new TreeMap<URI, Set<ImportGraph.Import>>();\n    var resolvedImports = new TreeMap<URI, URI>();\n    for (var moduleUri : moduleUris) {\n      var moduleKey = context.getModuleResolver().resolve(moduleUri);\n      var resolvedModuleKey = moduleKey.resolve(context.getSecurityManager());\n      analyzeSingle(moduleUri, resolvedModuleKey, context, imports, resolvedImports);\n    }\n    return new ImportGraph(imports, resolvedImports);\n  }\n\n  @TruffleBoundary\n  private static void analyzeSingle(\n      URI moduleUri,\n      ResolvedModuleKey resolvedModuleKey,\n      VmContext context,\n      Map<URI, Set<ImportGraph.Import>> imports,\n      Map<URI, URI> resolvedImports) {\n    var moduleResolver = context.getModuleResolver();\n    var securityManager = context.getSecurityManager();\n    var collectedImports = collectImports(resolvedModuleKey, moduleResolver, securityManager);\n    var importsInModule = new TreeSet<Import>();\n    for (var imprt : collectedImports) {\n      importsInModule.add(imprt.toImport());\n    }\n    imports.put(moduleUri, importsInModule);\n    resolvedImports.put(moduleUri, resolvedModuleKey.getUri());\n    for (var imprt : collectedImports) {\n      if (imports.containsKey(imprt.moduleUri)) {\n        continue;\n      }\n      analyzeSingle(imprt.moduleUri, imprt.resolvedModuleKey, context, imports, resolvedImports);\n    }\n  }\n\n  private static Set<ImportEntry> collectImports(\n      ResolvedModuleKey resolvedModuleKey,\n      ModuleResolver moduleResolver,\n      SecurityManager securityManager) {\n    List<Entry> importsAndReads;\n    var moduleKey = resolvedModuleKey.getOriginal();\n    try {\n      importsAndReads = ImportsAndReadsParser.parse(moduleKey, resolvedModuleKey);\n    } catch (VmException err) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotAnalyzeBecauseSyntaxError\", moduleKey.getUri())\n          .wrapping(err)\n          .build();\n    } catch (IOException err) {\n      throw new VmExceptionBuilder().evalError(\"ioErrorLoadingModule\", moduleKey.getUri()).build();\n    }\n    var result = new HashSet<ImportEntry>();\n    for (var entry : importsAndReads) {\n      if (!entry.isModule()) {\n        continue;\n      }\n      try {\n        if (entry.isGlob()) {\n          var theModuleKey =\n              moduleResolver.resolve(moduleKey.resolveUri(IoUtils.toUri(entry.stringValue())));\n          var elements =\n              GlobResolver.resolveGlob(\n                  securityManager,\n                  theModuleKey,\n                  moduleKey,\n                  moduleKey.getUri(),\n                  entry.stringValue());\n          for (var globElement : elements.values()) {\n            var moduleUri = globElement.uri();\n            var mk = moduleResolver.resolve(moduleUri);\n            var rmk = mk.resolve(securityManager);\n            result.add(new ImportEntry(moduleUri, rmk));\n          }\n        } else {\n          var resolvedUri =\n              IoUtils.resolve(securityManager, moduleKey, IoUtils.toUri(entry.stringValue()));\n          var mKey = moduleResolver.resolve(resolvedUri);\n          var rmk = mKey.resolve(securityManager);\n          result.add(new ImportEntry(resolvedUri, rmk));\n        }\n      } catch (InvalidGlobPatternException e) {\n        throw new VmExceptionBuilder()\n            .evalError(\"invalidGlobPattern\", entry.stringValue())\n            .withSourceSection(entry.sourceSection())\n            .build();\n      } catch (FileNotFoundException | NoSuchFileException e) {\n        throw new VmExceptionBuilder()\n            .evalError(\"cannotFindModule\", entry.stringValue())\n            .withSourceSection(entry.sourceSection())\n            .build();\n      } catch (URISyntaxException e) {\n        throw new VmExceptionBuilder()\n            .evalError(\"invalidModuleUri\", entry.stringValue())\n            .withHint(e.getReason())\n            .withSourceSection(entry.sourceSection())\n            .build();\n      } catch (IOException e) {\n        throw new VmExceptionBuilder()\n            .evalError(\"ioErrorLoadingModule\", entry.stringValue())\n            .withCause(e)\n            .withSourceSection(entry.sourceSection())\n            .build();\n      } catch (SecurityManagerException | PackageLoadError e) {\n        throw new VmExceptionBuilder()\n            .withSourceSection(entry.sourceSection())\n            .withCause(e)\n            .build();\n      } catch (ExternalReaderProcessException e) {\n        throw new VmExceptionBuilder()\n            .withSourceSection(entry.sourceSection())\n            .evalError(\"externalReaderFailure\")\n            .withCause(e)\n            .build();\n      }\n    }\n    return result;\n  }\n\n  private record ImportEntry(URI moduleUri, ResolvedModuleKey resolvedModuleKey) {\n    private Import toImport() {\n      return new Import(resolvedModuleKey.getOriginal().getUri());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmIntSeq.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport java.util.NoSuchElementException;\nimport java.util.PrimitiveIterator;\nimport org.pkl.core.util.Nullable;\n\n// Some code copied from kotlin.ranges.Progressions, kotlin.ranges.ProgressionIterators,\n// kotlin.internal.ProgressionUtil (Apache 2).\n@ValueType\npublic final class VmIntSeq extends VmValue implements Iterable<Long> {\n  public final long start;\n  public final long end;\n  public final long step;\n\n  public final long last;\n\n  public VmIntSeq(long start, long end, long step) {\n    assert step != 0;\n\n    this.start = start;\n    this.end = end;\n    this.step = step;\n\n    last =\n        step > 0\n            ? start >= end ? end : end - diffMod(end, start, step)\n            : start <= end ? end : end + diffMod(start, end, -step);\n  }\n\n  public boolean isEmpty() {\n    return step > 0 ? start > last : start < last;\n  }\n\n  public long getLength() {\n    return (Math.abs((end - start) / step)) + 1;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getIntSeqClass();\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {}\n\n  @Override\n  public Object export() {\n    throw new VmExceptionBuilder().evalError(\"cannotExportValue\", getVmClass()).build();\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitIntSeq(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertIntSeq(this, path);\n  }\n\n  @Override\n  public PrimitiveIterator.OfLong iterator() {\n    return new PrimitiveIterator.OfLong() {\n      boolean hasNext = !isEmpty();\n      long next = hasNext ? start : last;\n\n      @Override\n      public boolean hasNext() {\n        return hasNext;\n      }\n\n      @Override\n      public long nextLong() {\n        var result = next;\n        if (result == last) {\n          if (!hasNext) {\n            CompilerDirectives.transferToInterpreter();\n            throw new NoSuchElementException();\n          }\n          hasNext = false;\n        } else {\n          next += step;\n        }\n        return result;\n      }\n    };\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmIntSeq other)) return false;\n    return isEmpty()\n        ? other.isEmpty()\n        : start == other.start && last == other.last && step == other.step;\n  }\n\n  @Override\n  public int hashCode() {\n    if (isEmpty()) return 1;\n\n    var result = 1;\n    result = result * 31 + Long.hashCode(start);\n    result = result * 31 + Long.hashCode(last);\n    result = result * 31 + Long.hashCode(step);\n    return result;\n  }\n\n  @Override\n  @TruffleBoundary\n  public String toString() {\n    return step == 1\n        ? \"IntSeq(\" + start + \", \" + end + \")\"\n        : \"IntSeq(\" + start + \", \" + end + \").step(\" + step + \")\";\n  }\n\n  private static long mod(long a, long b) {\n    var mod = a % b;\n    return mod >= 0 ? mod : mod + b;\n  }\n\n  // (a - b) mod c\n  private static long diffMod(long a, long b, long c) {\n    return mod(mod(a, c) - mod(b, c), c);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmLanguage.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.ContextThreadLocal;\nimport com.oracle.truffle.api.TruffleLanguage;\nimport com.oracle.truffle.api.TruffleLanguage.ContextPolicy;\nimport com.oracle.truffle.api.instrumentation.ProvidedTags;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.Source;\nimport org.pkl.core.ast.builder.AstBuilder;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.Parser;\nimport org.pkl.parser.ParserError;\nimport org.pkl.parser.syntax.Module;\n\n@TruffleLanguage.Registration(\n    id = \"pkl\",\n    name = \"Pkl\",\n    version = \"0.32.0-dev\",\n    characterMimeTypes = VmLanguage.MIME_TYPE,\n    contextPolicy = ContextPolicy.SHARED)\n@ProvidedTags(PklTags.Expression.class)\npublic final class VmLanguage extends TruffleLanguage<VmContext> {\n  public static final String MIME_TYPE = \"application/x-pkl\";\n\n  private static final LanguageReference<VmLanguage> REFERENCE =\n      LanguageReference.create(VmLanguage.class);\n\n  public static VmLanguage get(@Nullable Node node) {\n    return REFERENCE.get(node);\n  }\n\n  public final ContextThreadLocal<VmLocalContext> localContext =\n      locals.createContextThreadLocal((ignoredCtx, ignoredThread) -> new VmLocalContext());\n\n  @Override\n  protected VmContext createContext(Env env) {\n    return new VmContext(this, env);\n  }\n\n  @Override\n  public CallTarget parse(ParsingRequest request) {\n    throw new UnsupportedOperationException(\"parse\");\n  }\n\n  public VmTyped loadModule(ModuleKey moduleKey) {\n    var context = VmContext.get(null);\n\n    return context\n        .getModuleCache()\n        .getOrLoad(\n            moduleKey,\n            context.getSecurityManager(),\n            context.getModuleResolver(),\n            VmUtils::createEmptyModule,\n            this::initializeModule,\n            null);\n  }\n\n  public VmTyped loadModule(ModuleKey moduleKey, @Nullable Node importNode) {\n    var context = VmContext.get(null);\n\n    return context\n        .getModuleCache()\n        .getOrLoad(\n            moduleKey,\n            context.getSecurityManager(),\n            context.getModuleResolver(),\n            VmUtils::createEmptyModule,\n            this::initializeModule,\n            importNode);\n  }\n\n  void initializeModule(\n      ModuleKey moduleKey,\n      ResolvedModuleKey resolvedModuleKey,\n      ModuleResolver moduleResolver,\n      Source source,\n      VmTyped emptyModule,\n      @Nullable Node importNode) {\n    var parser = new Parser();\n    Module moduleContext;\n    var sourceStr = source.getCharacters().toString();\n    try {\n      moduleContext = parser.parseModule(sourceStr);\n    } catch (ParserError e) {\n      var moduleName = IoUtils.inferModuleName(moduleKey);\n      MinPklVersionChecker.check(moduleName, e.getPartialParseResult(), importNode, sourceStr);\n      throw VmUtils.toVmException(e, source, moduleName);\n    }\n\n    var builder =\n        AstBuilder.create(\n            source, this, moduleContext, moduleKey, resolvedModuleKey, moduleResolver);\n    var moduleNode = builder.visitModule(moduleContext);\n    moduleNode.getCallTarget().call(emptyModule, emptyModule);\n    MinPklVersionChecker.check(emptyModule, importNode);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmList.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.List;\nimport org.organicdesign.fp.collections.UnmodCollection;\nimport org.organicdesign.fp.collections.UnmodIterable;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.Iterators.ReverseTruffleIterator;\nimport org.pkl.core.runtime.Iterators.TruffleIterator;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.paguro.RrbTree;\nimport org.pkl.core.util.paguro.RrbTree.ImRrbt;\nimport org.pkl.core.util.paguro.RrbTree.MutRrbt;\n\n// currently the backing collection is realized at the end of each VmList operation\n// this trades efficiency for ease of understanding, as it eliminates the complexity\n// of users having to deal with deferred operations that only fail later\n// perhaps we could find a compromise, e.g. realize every time a\n// property/local is read or a method parameter is set in our language\npublic final class VmList extends VmCollection {\n  public static final VmList EMPTY = new VmList(RrbTree.empty());\n\n  private final ImRrbt<Object> rrbt;\n\n  private boolean forced;\n\n  private VmList(ImRrbt<Object> rrbt) {\n    this.rrbt = rrbt;\n  }\n\n  @TruffleBoundary\n  public static VmList of(Object value) {\n    return new VmList(RrbTree.emptyMutable().append(value).immutable());\n  }\n\n  @TruffleBoundary\n  public static VmList of(Object value1, Object value2) {\n    return new VmList(RrbTree.emptyMutable().append(value1).append(value2).immutable());\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  static VmList create(ImRrbt<?> rrbt) {\n    if (rrbt.isEmpty()) return EMPTY;\n    return new VmList((ImRrbt<Object>) rrbt);\n  }\n\n  @TruffleBoundary\n  @SuppressWarnings(\"unchecked\")\n  static VmList create(MutRrbt<?> rrbt) {\n    if (rrbt.isEmpty()) return EMPTY;\n    return new VmList((ImRrbt<Object>) rrbt.immutable());\n  }\n\n  // keeping both `create(Iterable)` and `create(UnmodIterable)` around\n  // allows to easily find call sites that create a VmList\n  // from a non-Paguro collection (which should be rare)\n  @TruffleBoundary\n  public static VmList create(Iterable<?> iterable) {\n    return create(RrbTree.emptyMutable().concat(iterable).immutable());\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  static VmList create(UnmodIterable<?> iterable) {\n    return create((Iterable<Object>) iterable);\n  }\n\n  @TruffleBoundary\n  static VmList create(UnmodCollection<?> collection) {\n    if (collection.isEmpty()) return EMPTY;\n    return new VmList(RrbTree.emptyMutable().concat(collection).immutable());\n  }\n\n  @TruffleBoundary\n  public static VmList create(Object[] elements) {\n    if (elements.length == 0) return EMPTY;\n    var vector = RrbTree.emptyMutable();\n    for (var elem : elements) {\n      vector.append(elem);\n    }\n    return new VmList(vector.immutable());\n  }\n\n  @TruffleBoundary\n  public static VmList create(byte[] elements) {\n    if (elements.length == 0) return EMPTY;\n    var vector = RrbTree.emptyMutable();\n    for (var elem : elements) {\n      vector.append(Byte.toUnsignedLong(elem));\n    }\n    return new VmList(vector.immutable());\n  }\n\n  @TruffleBoundary\n  public static VmList create(Object[] elements, int length) {\n    if (elements.length == 0) return EMPTY;\n    var vector = RrbTree.emptyMutable();\n    for (var i = 0; i < length; i++) {\n      vector.append(elements[i]);\n    }\n    return new VmList(vector.immutable());\n  }\n\n  @TruffleBoundary\n  public static VmList createFromConstantNodes(ExpressionNode[] elements) {\n    if (elements.length == 0) return EMPTY;\n    var vector = RrbTree.emptyMutable();\n    for (var elem : elements) {\n      assert elem instanceof ConstantNode;\n      vector.append(((ConstantNode) elem).getValue());\n    }\n    return new VmList(vector.immutable());\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getListClass();\n  }\n\n  @Override\n  @TruffleBoundary\n  public int getLength() {\n    return rrbt.size();\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean isEmpty() {\n    return rrbt.isEmpty();\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean isLengthOne() {\n    return rrbt.size() == 1;\n  }\n\n  public long getLastIndex() {\n    return rrbt.size() - 1;\n  }\n\n  @Override\n  @TruffleBoundary\n  public VmList add(Object element) {\n    return VmList.create(rrbt.append(element));\n  }\n\n  @TruffleBoundary\n  public VmList replace(long index, Object element) {\n    return VmList.create(rrbt.replace((int) index, element));\n  }\n\n  @TruffleBoundary\n  public Object replaceOrNull(long index, Object element) {\n    if (index < 0 || index >= getLength()) {\n      return VmNull.withoutDefault();\n    }\n    return VmList.create(rrbt.replace((int) index, element));\n  }\n\n  @Override\n  @TruffleBoundary\n  public VmList concatenate(VmCollection other) {\n    return other.isEmpty() ? this : VmList.create(rrbt.concat(other));\n  }\n\n  @TruffleBoundary\n  public Object get(long index) {\n    return rrbt.get((int) index);\n  }\n\n  @TruffleBoundary\n  public Object getOrNull(long index) {\n    if (index < 0 || index >= getLength()) {\n      return VmNull.withoutDefault();\n    }\n    return rrbt.get((int) index);\n  }\n\n  @TruffleBoundary\n  public VmList subList(long start, long exclusiveEnd) {\n    return VmList.create(rrbt.subList((int) start, (int) exclusiveEnd));\n  }\n\n  @TruffleBoundary\n  public Object subListOrNull(long start, long exclusiveEnd) {\n    var length = getLength();\n\n    if (start < 0 || start > length) {\n      return VmNull.withoutDefault();\n    }\n    if (exclusiveEnd < start || exclusiveEnd > length) {\n      return VmNull.withoutDefault();\n    }\n    return VmList.create(rrbt.subList((int) start, (int) exclusiveEnd));\n  }\n\n  @Override\n  public Iterator<Object> iterator() {\n    if (rrbt.isEmpty()) return Iterators.emptyTruffleIterator();\n    return new TruffleIterator<>(rrbt);\n  }\n\n  @Override\n  public Iterator<Object> reverseIterator() {\n    if (rrbt.isEmpty()) return Iterators.emptyTruffleIterator();\n    return new ReverseTruffleIterator<>(rrbt);\n  }\n\n  @Override\n  @TruffleBoundary\n  public VmCollection.Builder<VmList> builder() {\n    return new Builder();\n  }\n\n  @TruffleBoundary\n  public Object getFirst() {\n    checkNonEmpty();\n    return rrbt.get(0);\n  }\n\n  @TruffleBoundary\n  public Object getFirstOrNull() {\n    if (rrbt.isEmpty()) return VmNull.withoutDefault();\n    return rrbt.get(0);\n  }\n\n  @TruffleBoundary\n  public VmList getRest() {\n    checkNonEmpty();\n    return VmList.create(rrbt.drop(1));\n  }\n\n  @TruffleBoundary\n  public Object getRestOrNull() {\n    if (rrbt.isEmpty()) return VmNull.withoutDefault();\n    return VmList.create(rrbt.drop(1));\n  }\n\n  @TruffleBoundary\n  public Object getLast() {\n    checkNonEmpty();\n    return rrbt.get(rrbt.size() - 1);\n  }\n\n  @TruffleBoundary\n  public Object getLastOrNull() {\n    if (isEmpty()) return VmNull.withoutDefault();\n    return rrbt.get(rrbt.size() - 1);\n  }\n\n  @TruffleBoundary\n  public Object getSingle() {\n    checkLengthOne();\n    return rrbt.get(0);\n  }\n\n  @TruffleBoundary\n  public Object getSingleOrNull() {\n    if (!isLengthOne()) return VmNull.withoutDefault();\n    return rrbt.get(0);\n  }\n\n  @TruffleBoundary\n  @SuppressWarnings(\"deprecation\")\n  public boolean contains(Object element) {\n    return rrbt.contains(element);\n  }\n\n  @TruffleBoundary\n  public long indexOf(Object elem) {\n    return rrbt.indexOf(elem);\n  }\n\n  @TruffleBoundary\n  public Object indexOfOrNull(Object elem) {\n    long result = rrbt.indexOf(elem);\n    if (result == -1) return VmNull.withoutDefault();\n    return result;\n  }\n\n  @TruffleBoundary\n  public long lastIndexOf(Object elem) {\n    return rrbt.lastIndexOf(elem);\n  }\n\n  @TruffleBoundary\n  public Object lastIndexOfOrNull(Object elem) {\n    long result = rrbt.lastIndexOf(elem);\n    if (result == -1) return VmNull.withoutDefault();\n    return result;\n  }\n\n  @TruffleBoundary\n  public VmPair split(long index) {\n    var tuple = rrbt.split((int) index);\n    return new VmPair(VmList.create(tuple._1()), VmList.create(tuple._2()));\n  }\n\n  @TruffleBoundary\n  public Object splitOrNull(long index) {\n    if (index < 0 || index > getLength()) {\n      return VmNull.withoutDefault();\n    }\n    return split(index);\n  }\n\n  @TruffleBoundary\n  public VmList take(long n) {\n    if (n == 0) return EMPTY;\n    if (n >= rrbt.size()) return this;\n\n    checkPositive(n);\n    return VmList.create(rrbt.take(n));\n  }\n\n  @TruffleBoundary\n  public VmList takeLast(long n) {\n    if (n == 0) return EMPTY;\n    if (n >= rrbt.size()) return this;\n\n    checkPositive(n);\n    return VmList.create(rrbt.drop(rrbt.size() - n));\n  }\n\n  @TruffleBoundary\n  public VmList drop(long n) {\n    if (n == 0) return this;\n    if (n >= rrbt.size()) return EMPTY;\n\n    checkPositive(n);\n    return VmList.create(rrbt.drop(n));\n  }\n\n  @TruffleBoundary\n  public VmList dropLast(long n) {\n    if (n == 0) return this;\n    if (n >= rrbt.size()) return EMPTY;\n\n    checkPositive(n);\n    return VmList.create(rrbt.take(rrbt.size() - n));\n  }\n\n  @TruffleBoundary\n  public VmList repeat(long n) {\n    if (n == 0) return EMPTY;\n    if (n == 1) return this;\n\n    checkPositive(n);\n\n    var result = rrbt.mutable();\n    for (var i = 1; i < n; i++) {\n      result = result.concat(rrbt);\n    }\n    return VmList.create(result);\n  }\n\n  @TruffleBoundary\n  public VmList reverse() {\n    return VmList.create(rrbt.reverse());\n  }\n\n  @TruffleBoundary\n  public Object[] toArray() {\n    return rrbt.toArray();\n  }\n\n  public VmList toList() {\n    return this;\n  }\n\n  @TruffleBoundary\n  public VmSet toSet() {\n    if (rrbt.isEmpty()) return VmSet.EMPTY;\n    return VmSet.create(rrbt);\n  }\n\n  @TruffleBoundary\n  public VmListing toListing() {\n    var builder = new VmObjectBuilder(rrbt.size());\n    for (var elem : rrbt) builder.addElement(elem);\n    return builder.toListing();\n  }\n\n  @TruffleBoundary\n  public VmDynamic toDynamic() {\n    var builder = new VmObjectBuilder(rrbt.size());\n    for (var elem : rrbt) builder.addElement(elem);\n    return builder.toDynamic();\n  }\n\n  @Override\n  @TruffleBoundary\n  public void force(boolean allowUndefinedValues) {\n    if (forced) return;\n\n    forced = true;\n\n    try {\n      for (var elem : rrbt) {\n        VmValue.force(elem, allowUndefinedValues);\n      }\n    } catch (Throwable t) {\n      forced = false;\n      throw t;\n    }\n  }\n\n  @Override\n  @TruffleBoundary\n  public List<Object> export() {\n    var result = new ArrayList<>(rrbt.size());\n    for (var elem : rrbt) {\n      result.add(VmValue.export(elem));\n    }\n    return result;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitList(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertList(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(@Nullable Object other) {\n    if (this == other) return true;\n    //noinspection SimplifiableIfStatement\n    if (!(other instanceof VmList list)) return false;\n    return rrbt.equals(list.rrbt);\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    return rrbt.hashCode();\n  }\n\n  private static final class Builder implements VmCollection.Builder<VmList> {\n    private final MutRrbt<Object> list = RrbTree.emptyMutable();\n\n    @Override\n    @TruffleBoundary\n    public void add(Object element) {\n      list.append(element);\n    }\n\n    @Override\n    @TruffleBoundary\n    public void addAll(Iterable<?> elements) {\n      list.concat(elements);\n    }\n\n    @Override\n    public VmList build() {\n      return VmList.create(list);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmListing.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.member.ListingOrMappingTypeCastNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmListing extends VmListingOrMapping {\n  private static final class EmptyHolder {\n    private static final VmListing EMPTY =\n        new VmListing(\n            VmUtils.createEmptyMaterializedFrame(),\n            BaseModule.getListingClass().getPrototype(),\n            EconomicMaps.create(),\n            0);\n  }\n\n  private final int length;\n\n  public static VmListing empty() {\n    return EmptyHolder.EMPTY;\n  }\n\n  public VmListing(\n      MaterializedFrame enclosingFrame,\n      VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      int length) {\n    super(enclosingFrame, parent, members);\n    this.length = length;\n  }\n\n  public VmListing(\n      MaterializedFrame enclosingFrame,\n      VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      int length,\n      ListingOrMappingTypeCastNode typeCastNode,\n      Object typeCheckReceiver,\n      VmObjectLike typeCheckOwner) {\n    super(enclosingFrame, parent, members, typeCastNode, typeCheckReceiver, typeCheckOwner);\n    this.length = length;\n  }\n\n  public static boolean isDefaultProperty(Object propertyKey) {\n    return propertyKey == Identifier.DEFAULT;\n  }\n\n  public int getLength() {\n    return length;\n  }\n\n  public boolean isEmpty() {\n    return length == 0;\n  }\n\n  @Override\n  public boolean isSequence() {\n    return true;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getListingClass();\n  }\n\n  @Override\n  @TruffleBoundary\n  public List<Object> export() {\n    var properties = new ArrayList<>(EconomicMaps.size(cachedValues));\n\n    iterateMemberValues(\n        (key, prop, value) -> {\n          if (isDefaultProperty(key)) return true;\n\n          properties.add(VmValue.exportNullable(value));\n          return true;\n        });\n\n    return properties;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitListing(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertListing(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmListing other)) return false;\n\n    if (length != other.length) return false;\n    // could use shallow force, but deep force is cached\n    force(false);\n    other.force(false);\n\n    var cursor = cachedValues.getEntries();\n    while (cursor.advance()) {\n      var key = cursor.getKey();\n      if (key instanceof Identifier) continue;\n\n      var value = cursor.getValue();\n      assert value != null;\n      var otherValue = other.getCachedValue(key);\n      if (!value.equals(otherValue)) return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    if (cachedHash != 0) return cachedHash;\n\n    force(false);\n    var result = 0;\n    var cursor = cachedValues.getEntries();\n\n    while (cursor.advance()) {\n      var key = cursor.getKey();\n      if (key instanceof Identifier) continue;\n\n      var value = cursor.getValue();\n      assert value != null;\n      result = 31 * result + value.hashCode();\n    }\n\n    cachedHash = result;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmListingOrMapping.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.member.ListingOrMappingTypeCastNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class VmListingOrMapping extends VmObject {\n  // reified type of listing elements and mapping values\n  private final @Nullable ListingOrMappingTypeCastNode typeCastNode;\n  private final @Nullable Object typeCheckReceiver;\n  private final @Nullable VmObjectLike typeCheckOwner;\n\n  public VmListingOrMapping(\n      MaterializedFrame enclosingFrame,\n      @Nullable VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    super(enclosingFrame, parent, members);\n    typeCastNode = null;\n    typeCheckReceiver = null;\n    typeCheckOwner = null;\n  }\n\n  public VmListingOrMapping(\n      MaterializedFrame enclosingFrame,\n      @Nullable VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      ListingOrMappingTypeCastNode typeCastNode,\n      Object typeCheckReceiver,\n      VmObjectLike typeCheckOwner) {\n    super(enclosingFrame, parent, members);\n    this.typeCastNode = typeCastNode;\n    this.typeCheckReceiver = typeCheckReceiver;\n    this.typeCheckOwner = typeCheckOwner;\n  }\n\n  // Recursively executes type casts between `owner` and `this` and returns the resulting value.\n  public final Object executeTypeCasts(\n      Object value,\n      VmObjectLike owner,\n      IndirectCallNode callNode,\n      // if non-null, a stack frame for this member is inserted if a type cast fails\n      @Nullable ObjectMember member,\n      // Next type cast to be performed by the caller.\n      // Avoids repeating the same type cast in some cases.\n      @Nullable ListingOrMappingTypeCastNode nextTypeCastNode) {\n    var newNextTypeCastNode = typeCastNode != null ? typeCastNode : nextTypeCastNode;\n    @SuppressWarnings(\"DataFlowIssue\")\n    var result =\n        this == owner\n            ? value\n            : ((VmListingOrMapping) parent)\n                .executeTypeCasts(value, owner, callNode, member, newNextTypeCastNode);\n    if (typeCastNode == null || typeCastNode == nextTypeCastNode) return result;\n    var callTarget = typeCastNode.getCallTarget();\n    try {\n      return callNode.call(callTarget, typeCheckReceiver, typeCheckOwner, result);\n    } catch (VmException e) {\n      CompilerDirectives.transferToInterpreter();\n      if (member != null) {\n        VmUtils.insertStackFrame(member, callTarget, e);\n      }\n      throw e;\n    }\n  }\n\n  @Override\n  @TruffleBoundary\n  public final @Nullable Object getCachedValue(Object key) {\n    var result = EconomicMaps.get(cachedValues, key);\n    // if this object has members, `this[key]` may differ from `parent[key]`, so stop the search\n    if (result != null || !members.isEmpty()) return result;\n\n    // Optimization: Recursively steal value from parent cache to avoid computing it multiple times.\n    // The current implementation has the following limitations and drawbacks:\n    // * It only works if a parent has, coincidentally, already cached `key`.\n    // * It turns getCachedValue() into an operation that isn't guaranteed to be fast and fail-safe.\n    // * It requires making VmObject.getCachedValue() non-final,\n    //   which is unfavorable for Truffle partial evaluation and JVM inlining.\n    // * It may not be worth its cost for constant members and members that are cheap to compute.\n\n    assert parent != null; // VmListingOrMapping always has a parent\n    result = parent.getCachedValue(key);\n    if (result == null) return null;\n\n    if (typeCastNode != null && !(key instanceof Identifier)) {\n      var callNode = IndirectCallNode.getUncached();\n      var callTarget = typeCastNode.getCallTarget();\n      try {\n        result = callNode.call(callTarget, typeCheckReceiver, typeCheckOwner, result);\n      } catch (VmException e) {\n        var member = VmUtils.findMember(parent, key);\n        assert member != null; // already found the member's cached value\n        VmUtils.insertStackFrame(member, callTarget, e);\n        throw e;\n      }\n    }\n    setCachedValue(key, result);\n    return result;\n  }\n\n  /**\n   * Tells whether the value type of this listing/mapping is known to be a subtype of {@code\n   * typeNode}. If {@code true}, type checks of individual values can be elided because\n   * listings/mappings are covariant in their value type.\n   */\n  public final boolean isValueTypeKnownSubtypeOf(TypeNode typeNode) {\n    if (typeNode.isNoopTypeCheck()) {\n      return true;\n    }\n    if (typeCastNode == null) {\n      return false;\n    }\n    return typeCastNode.getTypeNode().isEquivalentTo(typeNode);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmLocalContext.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\n/** A per-context thread-local value that can be used to influence execution. */\npublic class VmLocalContext {\n  private boolean shouldEagerTypecheck = false;\n\n  /** Whether we are currently inside a type test ({@code is} check). */\n  private boolean inTypeTest = false;\n\n  /**\n   * Number of active {@link VmValueTracker} instances. Used to determine if instrumentation is\n   * already active.\n   */\n  private int activeTrackerDepth = 0;\n\n  public VmLocalContext() {}\n\n  public void shouldEagerTypecheck(boolean shouldEagerTypecheck) {\n    this.shouldEagerTypecheck = shouldEagerTypecheck;\n  }\n\n  public boolean shouldEagerTypecheck() {\n    return this.shouldEagerTypecheck;\n  }\n\n  public void setInTypeTest(boolean inTypeTest) {\n    this.inTypeTest = inTypeTest;\n  }\n\n  public boolean isInTypeTest() {\n    return inTypeTest;\n  }\n\n  public void enterTracker() {\n    activeTrackerDepth++;\n  }\n\n  public void exitTracker() {\n    activeTrackerDepth--;\n  }\n\n  public boolean hasActiveTracker() {\n    return activeTrackerDepth > 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmMap.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.function.Consumer;\nimport org.organicdesign.fp.collections.ImMap;\nimport org.organicdesign.fp.collections.MutMap;\nimport org.organicdesign.fp.collections.PersistentHashMap;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.paguro.RrbTree;\nimport org.pkl.core.util.paguro.RrbTree.ImRrbt;\nimport org.pkl.core.util.paguro.RrbTree.MutRrbt;\n\npublic final class VmMap extends VmValue implements Iterable<Map.Entry<Object, Object>> {\n  public static final VmMap EMPTY = new VmMap(PersistentHashMap.empty(), RrbTree.empty());\n\n  private final ImMap<Object, Object> map;\n  private final ImRrbt<Object> keyOrder;\n\n  private boolean forced;\n\n  @TruffleBoundary\n  private VmMap(ImMap<Object, Object> map, ImRrbt<Object> keyOrder) {\n    assert map.size() == keyOrder.size();\n    assert map.keySet().equals(keyOrder.toImSet());\n    this.map = map;\n    this.keyOrder = keyOrder;\n  }\n\n  @TruffleBoundary\n  public static VmMap create(ImMap<Object, Object> map, ImRrbt<Object> keyOrder) {\n    if (map.isEmpty()) return EMPTY;\n    return new VmMap(map, keyOrder);\n  }\n\n  @TruffleBoundary\n  public static VmMap createFromConstantNodes(ExpressionNode[] constantNodes) {\n    // builder takes care of handling empty case\n    var builder = new Builder();\n    for (var i = 0; i < constantNodes.length; i += 2) {\n      var key = constantNodes[i];\n      var value = constantNodes[i + 1];\n      assert key instanceof ConstantNode;\n      assert value instanceof ConstantNode;\n      builder.add(((ConstantNode) key).getValue(), ((ConstantNode) value).getValue());\n    }\n    return builder.build();\n  }\n\n  @TruffleBoundary\n  public static Builder builder(VmMap map) {\n    return new Builder(map);\n  }\n\n  @TruffleBoundary\n  public static Builder builder() {\n    return new Builder();\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getMapClass();\n  }\n\n  @TruffleBoundary\n  public Iterator<Map.Entry<Object, Object>> iterator() {\n    if (keyOrder.isEmpty()) return Iterators.emptyTruffleIterator();\n\n    return new Iterator<>() {\n      final Iterator<Object> keyIterator = keyOrder.iterator();\n\n      @Override\n      @TruffleBoundary\n      public boolean hasNext() {\n        return keyIterator.hasNext();\n      }\n\n      @Override\n      @TruffleBoundary\n      public Map.Entry<Object, Object> next() {\n        var key = keyIterator.next();\n        var value = map.get(key);\n        assert value != null;\n        return Map.entry(key, value);\n      }\n\n      @Override\n      @TruffleBoundary\n      public void remove() {\n        throw new UnsupportedOperationException(\"remove\");\n      }\n\n      @Override\n      @TruffleBoundary\n      public void forEachRemaining(Consumer<? super Map.Entry<Object, Object>> action) {\n        throw new UnsupportedOperationException(\"forEachRemaining\");\n      }\n    };\n  }\n\n  @TruffleBoundary\n  public @Nullable Object getOrNull(Object key) {\n    return map.get(key);\n  }\n\n  @TruffleBoundary\n  public Object getOrVmNull(Object key) {\n    var result = map.get(key);\n    return result != null ? result : VmNull.withoutDefault();\n  }\n\n  @TruffleBoundary\n  public int getLength() {\n    return keyOrder.size();\n  }\n\n  @TruffleBoundary\n  public boolean isEmpty() {\n    return keyOrder.isEmpty();\n  }\n\n  @TruffleBoundary\n  public VmMap concatenate(VmMap other) {\n    if (other.isEmpty()) return this;\n\n    var mapBuilder = map.mutable();\n    var keyOrderBuilder = keyOrder.mutable();\n\n    for (var key : other.keyOrder) {\n      var value = other.map.get(key);\n\n      if (!map.containsKey(key)) {\n        keyOrderBuilder.append(key);\n      }\n      mapBuilder.assoc(key, value);\n    }\n\n    return VmMap.create(mapBuilder.immutable(), keyOrderBuilder.immutable());\n  }\n\n  @TruffleBoundary\n  public boolean containsKey(Object key) {\n    return map.containsKey(key);\n  }\n\n  @TruffleBoundary\n  public boolean containsValue(Object value) {\n    return map.containsValue(value);\n  }\n\n  @TruffleBoundary\n  public VmMap put(Object key, Object value) {\n    var newKeyOrder = map.containsKey(key) ? keyOrder : keyOrder.append(key);\n    return new VmMap(map.assoc(key, value), newKeyOrder);\n  }\n\n  @TruffleBoundary\n  public VmMap remove(Object key) {\n    if (!map.containsKey(key)) return this;\n    return new VmMap(\n        map.without(key), keyOrder.without(keyOrder.indexOf(key))); // `indexOf` is in O(n)\n  }\n\n  @TruffleBoundary\n  public VmSet keys() {\n    return VmSet.create(map.keySet(), keyOrder);\n  }\n\n  @TruffleBoundary\n  public VmList values() {\n    var builder = VmList.EMPTY.builder();\n    for (var key : keyOrder) {\n      var value = map.get(key);\n      assert value != null;\n      builder.add(value);\n    }\n    return builder.build();\n  }\n\n  @TruffleBoundary\n  public VmList entries() {\n    var builder = VmList.EMPTY.builder();\n    for (var key : keyOrder) {\n      var value = map.get(key);\n      assert value != null;\n      builder.add(new VmPair(key, value));\n    }\n    return builder.build();\n  }\n\n  @Override\n  @TruffleBoundary\n  public void force(boolean allowUndefinedValues) {\n    if (forced) return;\n\n    forced = true;\n\n    try {\n      for (var elem : map) {\n        VmValue.force(elem.getKey(), allowUndefinedValues);\n        VmValue.force(elem.getValue(), allowUndefinedValues);\n      }\n    } catch (Throwable t) {\n      forced = false;\n      throw t;\n    }\n  }\n\n  public VmMapping toMapping() {\n    var builder = new VmObjectBuilder(getLength());\n    for (var entry : this) {\n      builder.addEntry(VmUtils.getKey(entry), VmUtils.getValue(entry));\n    }\n    return builder.toMapping();\n  }\n\n  public VmDynamic toDynamic() {\n    var builder = new VmObjectBuilder(getLength());\n    for (var entry : this) {\n      var key = VmUtils.getKey(entry);\n      var value = VmUtils.getValue(entry);\n      if (key instanceof String) {\n        builder.addProperty(Identifier.get((String) key), value);\n      } else {\n        builder.addEntry(key, value);\n      }\n    }\n    return builder.toDynamic();\n  }\n\n  @Override\n  @TruffleBoundary\n  public Map<Object, Object> export() {\n    var result = CollectionUtils.newLinkedHashMap(keyOrder.size());\n    for (var key : keyOrder) {\n      var value = map.get(key);\n      assert value != null;\n      result.put(VmValue.export(key), VmValue.export(value));\n    }\n    return result;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitMap(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertMap(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(@Nullable Object other) {\n    if (this == other) return true;\n    //noinspection SimplifiableIfStatement\n    if (!(other instanceof VmMap vmMap)) return false;\n    return map.equals(vmMap.map);\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    return map.hashCode();\n  }\n\n  @TruffleBoundary\n  public String toString() {\n    return VmValueRenderer.singleLine(Integer.MAX_VALUE).render(this);\n  }\n\n  public static final class Builder {\n    private final MutMap<Object, Object> mapBuilder;\n    private final MutRrbt<Object> keyOrderBuilder;\n\n    @TruffleBoundary\n    private Builder(VmMap map) {\n      mapBuilder = map.map.mutable();\n      keyOrderBuilder = map.keyOrder.mutable();\n    }\n\n    @TruffleBoundary\n    private Builder() {\n      mapBuilder = PersistentHashMap.emptyMutable();\n      keyOrderBuilder = RrbTree.emptyMutable();\n    }\n\n    @TruffleBoundary\n    public void add(Object key, Object value) {\n      if (!mapBuilder.containsKey(key)) {\n        keyOrderBuilder.append(key);\n      }\n      mapBuilder.assoc(key, value);\n    }\n\n    @TruffleBoundary\n    public @Nullable Object get(Object key) {\n      return mapBuilder.get(key);\n    }\n\n    @TruffleBoundary\n    public VmMap build() {\n      if (mapBuilder.isEmpty()) return EMPTY;\n      return VmMap.create(mapBuilder.immutable(), keyOrderBuilder.immutable());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmMapping.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport java.util.HashSet;\nimport java.util.Map;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.member.ListingOrMappingTypeCastNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.MutableLong;\n\npublic final class VmMapping extends VmListingOrMapping {\n  private long cachedLength = -1;\n\n  @GuardedBy(\"this\")\n  private @LateInit VmSet __allKeys;\n\n  private static final class EmptyHolder {\n    private static final VmMapping EMPTY =\n        new VmMapping(\n            VmUtils.createEmptyMaterializedFrame(),\n            BaseModule.getMappingClass().getPrototype(),\n            EconomicMaps.create());\n  }\n\n  public static VmMapping empty() {\n    return EmptyHolder.EMPTY;\n  }\n\n  public VmMapping(\n      MaterializedFrame enclosingFrame,\n      VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    super(enclosingFrame, parent, members);\n  }\n\n  public VmMapping(\n      MaterializedFrame enclosingFrame,\n      VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      ListingOrMappingTypeCastNode typeCastNode,\n      Object typeCheckReceiver,\n      VmObjectLike typeCheckOwner) {\n    super(enclosingFrame, parent, members, typeCastNode, typeCheckReceiver, typeCheckOwner);\n  }\n\n  public static boolean isDefaultProperty(Object propertyKey) {\n    return propertyKey == Identifier.DEFAULT;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getMappingClass();\n  }\n\n  @TruffleBoundary\n  public VmSet getAllKeys() {\n    synchronized (this) {\n      if (__allKeys == null) {\n        // building upon parent's `getAllKeys()` should improve at least worst case efficiency\n        var parentKeys = parent instanceof VmMapping mapping ? mapping.getAllKeys() : VmSet.EMPTY;\n        var builder = VmSet.builder(parentKeys);\n        for (var cursor = members.getEntries(); cursor.advance(); ) {\n          var member = cursor.getValue();\n          if (!member.isEntry()) continue;\n          builder.add(cursor.getKey());\n        }\n        __allKeys = builder.build();\n      }\n      return __allKeys;\n    }\n  }\n\n  @Override\n  @TruffleBoundary\n  public Map<Object, Object> export() {\n    var properties = CollectionUtils.newLinkedHashMap(EconomicMaps.size(cachedValues));\n\n    iterateMemberValues(\n        (key, prop, value) -> {\n          if (isDefaultProperty(key)) return true;\n\n          properties.put(VmValue.export(key), VmValue.exportNullable(value));\n          return true;\n        });\n\n    return properties;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitMapping(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertMapping(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(Object obj) {\n    if (this == obj) // noinspection Contract\n    return true;\n    if (!(obj instanceof VmMapping other)) return false;\n\n    // could use shallow force, but deep force is cached\n    force(false);\n    other.force(false);\n    if (getLength() != other.getLength()) return false;\n\n    var cursor = cachedValues.getEntries();\n    while (cursor.advance()) {\n      Object key = cursor.getKey();\n      if (key instanceof Identifier) continue;\n\n      var value = cursor.getValue();\n      assert value != null;\n      var otherValue = other.getCachedValue(key);\n      if (!value.equals(otherValue)) return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    if (cachedHash != 0) return cachedHash;\n\n    force(false);\n    var result = 0;\n    var cursor = cachedValues.getEntries();\n\n    while (cursor.advance()) {\n      var key = cursor.getKey();\n      if (key instanceof Identifier) continue;\n\n      var value = cursor.getValue();\n      assert value != null;\n      result += key.hashCode() ^ value.hashCode();\n    }\n\n    cachedHash = result;\n    return result;\n  }\n\n  @TruffleBoundary\n  public long getLength() {\n    if (cachedLength != -1) return cachedLength;\n    var count = new MutableLong(0);\n    var visited = new HashSet<>();\n    iterateMembers(\n        (key, member) -> {\n          var alreadyVisited = !visited.add(key);\n          // important to record hidden member as visited before skipping it\n          // because any overriding member won't carry a `hidden` identifier\n          if (alreadyVisited || member.isLocalOrExternalOrHidden()) return true;\n          count.getAndIncrement();\n          return true;\n        });\n    cachedLength = count.get();\n    return cachedLength;\n  }\n\n  public boolean isEmpty() {\n    return getLength() == 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmNull.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport org.pkl.core.PNull;\nimport org.pkl.core.util.Nullable;\n\n@ValueType\npublic final class VmNull extends VmValue {\n  private static final VmNull WITHOUT_DEFAULT = new VmNull(null);\n\n  // worthwhile to create this lazily?\n  private final @Nullable Object defaultValue;\n\n  public static VmNull withoutDefault() {\n    return WITHOUT_DEFAULT;\n  }\n\n  public static VmNull withDefault(@Nullable Object defaultValue) {\n    return defaultValue == null ? withoutDefault() : new VmNull(defaultValue);\n  }\n\n  public static Object lift(@Nullable Object nullable) {\n    return nullable == null ? withoutDefault() : nullable;\n  }\n\n  public static @Nullable Object unwrap(Object value) {\n    return value instanceof VmNull ? null : value;\n  }\n\n  private VmNull(@Nullable Object defaultValue) {\n    this.defaultValue = defaultValue;\n  }\n\n  public Object getDefaultValue() {\n    // defer calling VmDynamic.empty() until this method is called\n    return defaultValue == null ? VmDynamic.empty() : defaultValue;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getNullClass();\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public Object export() {\n    return PNull.getInstance();\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitNull(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertNull(this, path);\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    return obj instanceof VmNull;\n  }\n\n  @Override\n  public int hashCode() {\n    return 0;\n  }\n\n  @Override\n  public String toString() {\n    return \"null\";\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmObject.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport java.util.*;\nimport java.util.function.BiFunction;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\n\n/** Corresponds to `pkl.base#Object`. */\npublic abstract class VmObject extends VmObjectLike {\n  @CompilationFinal protected @Nullable VmObject parent;\n  protected final UnmodifiableEconomicMap<Object, ObjectMember> members;\n  protected final EconomicMap<Object, Object> cachedValues;\n\n  protected int cachedHash;\n  private boolean forced;\n\n  public VmObject(\n      MaterializedFrame enclosingFrame,\n      @Nullable VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members,\n      EconomicMap<Object, Object> cachedValues) {\n    super(enclosingFrame);\n    this.parent = parent;\n    this.members = members;\n    this.cachedValues = cachedValues;\n\n    assert parent != this;\n  }\n\n  public VmObject(\n      MaterializedFrame enclosingFrame,\n      @Nullable VmObject parent,\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    this(enclosingFrame, parent, members, EconomicMaps.create());\n  }\n\n  public final void lateInitParent(VmObject parent) {\n    assert this.parent == null;\n    this.parent = parent;\n  }\n\n  @Override\n  public @Nullable VmObject getParent() {\n    return parent;\n  }\n\n  @Override\n  public final boolean hasMember(Object key) {\n    return EconomicMaps.containsKey(members, key);\n  }\n\n  @Override\n  public final @Nullable ObjectMember getMember(Object key) {\n    return EconomicMaps.get(members, key);\n  }\n\n  @Override\n  public final UnmodifiableEconomicMap<Object, ObjectMember> getMembers() {\n    return members;\n  }\n\n  @Override\n  public @Nullable Object getCachedValue(Object key) {\n    return EconomicMaps.get(cachedValues, key);\n  }\n\n  @Override\n  public final void setCachedValue(Object key, Object value) {\n    EconomicMaps.put(cachedValues, key, value);\n  }\n\n  @Override\n  public final boolean hasCachedValue(Object key) {\n    return EconomicMaps.containsKey(cachedValues, key);\n  }\n\n  @Override\n  @TruffleBoundary\n  public final boolean iterateMemberValues(MemberValueConsumer consumer) {\n    var visited = new HashSet<>();\n    return iterateMembers(\n        (key, member) -> {\n          var alreadyVisited = !visited.add(key);\n          // important to record hidden member as visited before skipping it\n          // because any overriding member won't carry a `hidden` identifier\n          if (alreadyVisited || member.isLocalOrExternalOrHidden()) return true;\n          return consumer.accept(key, member, getCachedValue(key));\n        });\n  }\n\n  @Override\n  @TruffleBoundary\n  public final boolean forceAndIterateMemberValues(ForcedMemberValueConsumer consumer) {\n    force(false, false);\n    return iterateAlreadyForcedMemberValues(consumer);\n  }\n\n  @Override\n  @TruffleBoundary\n  public final boolean iterateAlreadyForcedMemberValues(ForcedMemberValueConsumer consumer) {\n    var visited = new HashSet<>();\n    return iterateMembers(\n        (key, member) -> {\n          var alreadyVisited = !visited.add(key);\n          // important to record hidden member as visited before skipping it\n          // because any overriding member won't carry a `hidden` identifier\n          if (alreadyVisited || member.isLocalOrExternalOrHidden()) return true;\n          Object cachedValue = getCachedValue(key);\n          assert cachedValue != null; // forced\n          return consumer.accept(key, member, cachedValue);\n        });\n  }\n\n  @Override\n  @TruffleBoundary\n  public final boolean iterateMembers(BiFunction<Object, ObjectMember, Boolean> consumer) {\n    var parent = getParent();\n    if (parent != null) {\n      var completed = parent.iterateMembers(consumer);\n      if (!completed) return false;\n    }\n    var entries = members.getEntries();\n    while (entries.advance()) {\n      var member = entries.getValue();\n      if (member.isLocal()) continue;\n      if (!consumer.apply(entries.getKey(), member)) return false;\n    }\n    return true;\n  }\n\n  /** Evaluates this object's members. Skips local, hidden, and external members. */\n  @Override\n  @TruffleBoundary\n  public final void force(boolean allowUndefinedValues, boolean recurse) {\n    if (forced) return;\n\n    if (recurse) forced = true;\n\n    try {\n      for (VmObjectLike owner = this; owner != null; owner = owner.getParent()) {\n        var cursor = EconomicMaps.getEntries(owner.getMembers());\n        var clazz = owner.getVmClass();\n        while (cursor.advance()) {\n          var memberKey = cursor.getKey();\n          var member = cursor.getValue();\n          // isAbstract() can occur when VmAbstractObject.toString() is called\n          // on a prototype of an abstract class (e.g., in the Java debugger)\n          if (member.isLocalOrExternalOrAbstract() || clazz.isHiddenProperty(memberKey)) {\n            continue;\n          }\n\n          var memberValue = getCachedValue(memberKey);\n          if (memberValue == null) {\n            try {\n              memberValue = VmUtils.doReadMember(this, owner, memberKey, member);\n            } catch (VmUndefinedValueException e) {\n              if (!allowUndefinedValues) throw e;\n              continue;\n            }\n          }\n\n          if (recurse) {\n            VmValue.force(memberValue, allowUndefinedValues);\n          }\n        }\n      }\n    } catch (Throwable t) {\n      forced = false;\n      throw t;\n    }\n  }\n\n  @Override\n  public final void force(boolean allowUndefinedValues) {\n    force(allowUndefinedValues, true);\n  }\n\n  public final String toString() {\n    force(true, true);\n    return VmValueRenderer.singleLine(Integer.MAX_VALUE).render(this);\n  }\n\n  /**\n   * Exports this object's members. Skips local members, hidden members, class definitions, and type\n   * aliases. Members that haven't been forced have a `null` value.\n   */\n  @TruffleBoundary\n  protected final Map<String, Object> exportMembers() {\n    var result = CollectionUtils.<String, Object>newLinkedHashMap(EconomicMaps.size(cachedValues));\n\n    iterateMemberValues(\n        (key, member, value) -> {\n          if (member.isClass() || member.isTypeAlias()) return true;\n\n          result.put(key.toString(), VmValue.exportNullable(value));\n          return true;\n        });\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmObjectBuilder.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.member.SharedMemberNode;\nimport org.pkl.core.util.EconomicMaps;\n\n/** A builder for {@link VmObject}s whose {@link ObjectMember}s are determined at run time. */\npublic final class VmObjectBuilder {\n  private final EconomicMap<Object, ObjectMember> members;\n  private int elementCount = 0;\n\n  public VmObjectBuilder() {\n    members = EconomicMaps.create();\n  }\n\n  public VmObjectBuilder(int initialSize) {\n    members = EconomicMaps.create(initialSize);\n  }\n\n  public VmObjectBuilder addProperty(Identifier name, Object value) {\n    EconomicMaps.put(members, name, VmUtils.createSyntheticObjectProperty(name, \"\", value));\n    return this;\n  }\n\n  public VmObjectBuilder addElement(Object value) {\n    EconomicMaps.put(\n        members, (long) elementCount++, VmUtils.createSyntheticObjectElement(\"\", value));\n    return this;\n  }\n\n  public VmObjectBuilder addEntry(Object key, Object value) {\n    EconomicMaps.put(members, key, VmUtils.createSyntheticObjectEntry(\"\", value));\n    return this;\n  }\n\n  public VmObjectBuilder addEntry(Object key, SharedMemberNode valueNode) {\n    var entry =\n        new ObjectMember(\n            valueNode.getSourceSection(), valueNode.getHeaderSection(), VmModifier.ENTRY, null, \"\");\n    entry.initMemberNode(valueNode);\n    EconomicMaps.put(members, key, entry);\n    return this;\n  }\n\n  public VmListing toListing() {\n    return new VmListing(\n        VmUtils.createEmptyMaterializedFrame(),\n        BaseModule.getListingClass().getPrototype(),\n        members,\n        elementCount);\n  }\n\n  public VmMapping toMapping() {\n    return new VmMapping(\n        VmUtils.createEmptyMaterializedFrame(),\n        BaseModule.getMappingClass().getPrototype(),\n        members);\n  }\n\n  public VmMapping toMapping(Object extraStorage) {\n    var result = toMapping();\n    result.setExtraStorage(extraStorage);\n    return result;\n  }\n\n  public VmDynamic toDynamic() {\n    return new VmDynamic(\n        VmUtils.createEmptyMaterializedFrame(),\n        BaseModule.getDynamicClass().getPrototype(),\n        members,\n        elementCount);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmObjectLike.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport java.util.function.BiFunction;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Corresponds to `pkl.base#Object|pkl.base#Function`. The lexical scope is a chain of\n * `VmObjectLike` instances.\n */\npublic abstract class VmObjectLike extends VmValue {\n  /** The frame that was active when this object was instantiated. * */\n  protected final MaterializedFrame enclosingFrame;\n\n  protected @Nullable Object extraStorage;\n\n  protected VmObjectLike(MaterializedFrame enclosingFrame) {\n    this.enclosingFrame = enclosingFrame;\n  }\n\n  public final MaterializedFrame getEnclosingFrame() {\n    return enclosingFrame;\n  }\n\n  public final @Nullable Object getEnclosingReceiver() {\n    return VmUtils.getReceiverOrNull(enclosingFrame);\n  }\n\n  public final @Nullable VmObjectLike getEnclosingOwner() {\n    return VmUtils.getOwnerOrNull(enclosingFrame);\n  }\n\n  public final boolean hasExtraStorage() {\n    return extraStorage != null;\n  }\n\n  public Object getExtraStorage() {\n    assert extraStorage != null;\n    return extraStorage;\n  }\n\n  public final void setExtraStorage(@Nullable Object extraStorage) {\n    this.extraStorage = extraStorage;\n  }\n\n  public boolean isModuleObject() {\n    return false;\n  }\n\n  /**\n   * Returns the parent object in the prototype chain. For each concrete subclass X of VmObjectLike,\n   * the exact return type of this method is `X|VmTyped`.\n   */\n  public abstract @Nullable VmObjectLike getParent();\n\n  /** Always prefer this method over `getMembers().containsKey(key)`. */\n  @TruffleBoundary\n  public abstract boolean hasMember(Object key);\n\n  /** Always prefer this method over `getMembers().get(key)`. */\n  @TruffleBoundary\n  public abstract @Nullable ObjectMember getMember(Object key);\n\n  /** Returns the declared members of this object. */\n  public abstract UnmodifiableEconomicMap<Object, ObjectMember> getMembers();\n\n  /**\n   * Reads from the properties cache for this object. The cache contains the values of all members\n   * defined in this object or an ancestor thereof which have been requested with this object as the\n   * receiver.\n   */\n  @TruffleBoundary\n  public abstract @Nullable Object getCachedValue(Object key);\n\n  /**\n   * Writes to the properties cache for this object. The cache contains the values of all members\n   * defined in this object or an ancestor thereof which have been requested with this object as the\n   * receiver.\n   */\n  @TruffleBoundary\n  public abstract void setCachedValue(Object key, Object value);\n\n  /**\n   * Prefer this method over {@link #getCachedValue} if the value is not required. (There is no\n   * point in calling this method to determine whether to call {@link #getCachedValue}.)\n   */\n  @TruffleBoundary\n  public abstract boolean hasCachedValue(Object key);\n\n  /**\n   * Iterates over member definitions and their values in order of their definition, from the top of\n   * the prototype chain downwards. If a member value has not yet been evaluated, a `null` `value`\n   * is passed to `consumer`. If a member is defined in multiple objects in the prototype chain,\n   * i.e., is overridden along the way, it is visited only once, with the initial (i.e., upmost)\n   * `member` and the final (i.e., downmost) `value`. (This peculiar behavior serves two purposes in\n   * the current implementation: it guarantees that a `hidden` property is still recognized as such\n   * when overridden, and that an element is still recognized as such when overridden with entry\n   * syntax. It also means that members are visited in order of (first) definition.) Local, hidden,\n   * and external properties are not visited. If an invocation of `consumer` returns `false`, the\n   * remaining members are not visited, and `false` is returned. Otherwise, all members are visited,\n   * and `true` is returned.\n   */\n  public abstract boolean iterateMemberValues(MemberValueConsumer consumer);\n\n  /**\n   * Same as {@link #iterateMemberValues} except that it first performs a shallow {@link #force}. As\n   * a consequence, values passed to {@code consumer} are guaranteed to be non-null.\n   */\n  public abstract boolean forceAndIterateMemberValues(ForcedMemberValueConsumer consumer);\n\n  public abstract boolean iterateAlreadyForcedMemberValues(ForcedMemberValueConsumer consumer);\n\n  /**\n   * Iterates over member definitions in order of their definition, from the top of the prototype\n   * chain downwards. If a member is defined multiple times, each occurrence is visited. Local\n   * properties are not visited. If an invocation of `consumer` returns `false`, the remaining\n   * members are not visited, and `false` is returned. Otherwise, all members are visited, and\n   * `true` is returned.\n   */\n  public abstract boolean iterateMembers(BiFunction<Object, ObjectMember, Boolean> consumer);\n\n  /** Forces shallow or recursive (deep) evaluation of this object. */\n  public abstract void force(boolean allowUndefinedValues, boolean recurse);\n\n  /**\n   * Exports this object to an external representation. Does not export local, hidden, or external\n   * properties\n   */\n  public abstract Object export();\n\n  @FunctionalInterface\n  public interface MemberValueConsumer {\n    /**\n     * Returns true if {@link #iterateMemberValues} should continue calling this method for the\n     * remaining members, and false otherwise.\n     */\n    boolean accept(Object key, ObjectMember member, @Nullable Object value);\n  }\n\n  @FunctionalInterface\n  public interface ForcedMemberValueConsumer {\n    /**\n     * Returns true if {@link #forceAndIterateMemberValues} should continue calling this method for\n     * the remaining members, and false otherwise.\n     */\n    boolean accept(Object key, ObjectMember member, Object value);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmPair.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport java.util.Iterator;\nimport java.util.NoSuchElementException;\nimport org.pkl.core.Pair;\nimport org.pkl.core.util.Nullable;\n\n@ValueType\npublic final class VmPair extends VmValue implements Iterable<Object> {\n  private final Object first;\n  private final Object second;\n\n  private boolean forced;\n\n  public VmPair(Object first, Object second) {\n    this.first = first;\n    this.second = second;\n  }\n\n  public Object getFirst() {\n    return first;\n  }\n\n  public Object getSecond() {\n    return second;\n  }\n\n  @Override\n  public Iterator<Object> iterator() {\n    return new Iterator<>() {\n      int pos = 0;\n\n      @Override\n      public boolean hasNext() {\n        return pos < 2;\n      }\n\n      @Override\n      public Object next() {\n        return switch (pos++) {\n          case 0 -> first;\n          case 1 -> second;\n          default -> throw new NoSuchElementException(\"VmPair only has two elements.\");\n        };\n      }\n    };\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getPairClass();\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    if (forced) return;\n\n    forced = true;\n\n    try {\n      VmValue.force(first, allowUndefinedValues);\n      VmValue.force(second, allowUndefinedValues);\n    } catch (Throwable t) {\n      forced = false;\n      throw t;\n    }\n  }\n\n  @Override\n  public Object export() {\n    return new Pair<>(VmValue.export(first), VmValue.export(second));\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitPair(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertPair(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmPair other)) return false;\n    return first.equals(other.first) && second.equals(other.second);\n  }\n\n  @Override\n  public int hashCode() {\n    return first.hashCode() * 31 + second.hashCode();\n  }\n\n  @Override\n  @TruffleBoundary\n  public String toString() {\n    force(true);\n    return VmValueRenderer.singleLine(Integer.MAX_VALUE).render(this);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmPklBinaryEncoder.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.io.IOException;\nimport java.util.Deque;\nimport org.msgpack.core.MessageBufferPacker;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.stdlib.AbstractRenderer;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.pklbinary.PklBinaryCode;\n\n/** An encoder/renderer for <code>pkl-binary</code></a> encoding. */\npublic class VmPklBinaryEncoder extends AbstractRenderer {\n\n  // this type explicitly works with MessageBufferPacker:\n  // * assumes no I/O during packing (in-memory writes only)\n  // * IOExceptions are caught and assumed unreachable\n\n  private final MessageBufferPacker packer;\n\n  public VmPklBinaryEncoder(MessageBufferPacker packer, PklConverter converter) {\n    super(\"pkl-binary\", converter, false, false);\n    this.packer = packer;\n  }\n\n  public VmPklBinaryEncoder(MessageBufferPacker packer) {\n    this(packer, PklConverter.NOOP);\n  }\n\n  private void packCode(PklBinaryCode code) throws IOException {\n    packer.packByte(code.getCode());\n  }\n\n  @Override\n  public void visitString(String value) {\n    try {\n      packer.packString(value);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitBoolean(Boolean value) {\n    try {\n      packer.packBoolean(value);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitInt(Long value) {\n    try {\n      packer.packLong(value);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitFloat(Double value) {\n    try {\n      packer.packDouble(value);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitDuration(VmDuration value) {\n    try {\n      packer.packArrayHeader(3);\n      packCode(PklBinaryCode.DURATION);\n      packer.packDouble(value.getValue());\n      packer.packString(value.getUnit().toString());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitDataSize(VmDataSize value) {\n    try {\n      packer.packArrayHeader(3);\n      packCode(PklBinaryCode.DATASIZE);\n      packer.packDouble(value.getValue());\n      packer.packString(value.getUnit().toString());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitBytes(VmBytes value) {\n    try {\n      packer.packArrayHeader(2);\n      packCode(PklBinaryCode.BYTES);\n      packer.packBinaryHeader(value.getBytes().length);\n      packer.addPayload(value.getBytes());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitIntSeq(VmIntSeq value) {\n    try {\n      packer.packArrayHeader(4);\n      packCode(PklBinaryCode.INTSEQ);\n      packer.packLong(value.start);\n      packer.packLong(value.end);\n      packer.packLong(value.step);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  protected void visitDocument(Object value) {\n    visit(value);\n  }\n\n  @Override\n  protected void visitTopLevelValue(Object value) {\n    visit(value);\n  }\n\n  @Override\n  protected void visitRenderDirective(VmTyped value) {\n    try {\n      packer.writePayload(VmUtils.readBytesProperty(value).getBytes());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  protected void startDynamic(VmDynamic value) {\n    startObject(value, value.getRegularMemberCount());\n  }\n\n  @Override\n  protected void startTyped(VmTyped value) {\n    startObject(value, value.getVmClass().getAllRegularPropertyNames().size());\n  }\n\n  private void startObject(VmObjectLike value, int memberCount) {\n    try {\n      packer.packArrayHeader(4);\n      packCode(PklBinaryCode.OBJECT);\n      packer.packString(value.getVmClass().getDisplayName());\n      packer.packString(\n          value.getVmClass().getModule().getModuleInfo().getModuleKey().getUri().toString());\n      packer.packArrayHeader(memberCount);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  private void startList(PklBinaryCode code, int length) {\n    try {\n      packer.packArrayHeader(2);\n      packCode(code);\n      packer.packArrayHeader(length);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  private void startMap(PklBinaryCode code, int length) {\n    try {\n      packer.packArrayHeader(2);\n      packCode(code);\n      packer.packMapHeader(length);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  protected void startListing(VmListing value) {\n    startList(PklBinaryCode.LISTING, value.getLength());\n  }\n\n  @Override\n  protected void startMapping(VmMapping value) {\n    startMap(PklBinaryCode.MAPPING, (int) value.getLength());\n  }\n\n  @Override\n  protected void startList(VmList value) {\n    startList(PklBinaryCode.LIST, value.getLength());\n  }\n\n  @Override\n  protected void startSet(VmSet value) {\n    startList(PklBinaryCode.SET, value.getLength());\n  }\n\n  @Override\n  protected void startMap(VmMap value) {\n    startMap(PklBinaryCode.MAP, value.getLength());\n  }\n\n  @Override\n  protected void visitEntryKeyValue(\n      Object key, boolean isFirst, Deque<Object> valuePath, Object value) {\n    if (enclosingValue instanceof VmDynamic) {\n      try {\n        packer.packArrayHeader(3);\n        packCode(PklBinaryCode.ENTRY);\n      } catch (IOException e) {\n        throw PklBugException.unreachableCode();\n      }\n    }\n\n    super.visitEntryKeyValue(key, isFirst, valuePath, value);\n  }\n\n  @Override\n  protected void visitElement(long index, Object value, boolean isFirst) {\n    if (enclosingValue instanceof VmDynamic) {\n      try {\n        packer.packArrayHeader(3);\n        packCode(PklBinaryCode.ELEMENT);\n        packer.packLong(index);\n      } catch (IOException e) {\n        throw PklBugException.unreachableCode();\n      }\n    }\n    visit(value);\n  }\n\n  @Override\n  protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n    try {\n      packer.packArrayHeader(3);\n      packCode(PklBinaryCode.PROPERTY);\n      packer.packString(name.toString());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n    visit(value);\n  }\n\n  @Override\n  public void visitClass(VmClass value) {\n    try {\n      packer.packArrayHeader(3);\n      packCode(PklBinaryCode.CLASS);\n      packer.packString(value.getDisplayName());\n      packer.packString(value.getModule().getModuleInfo().getModuleKey().getUri().toString());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitTypeAlias(VmTypeAlias value) {\n    try {\n      packer.packArrayHeader(3);\n      packCode(PklBinaryCode.TYPEALIAS);\n      packer.packString(value.getDisplayName());\n      packer.packString(value.getModuleUri().toString());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitPair(VmPair value) {\n    try {\n      packer.packArrayHeader(3);\n      packCode(PklBinaryCode.PAIR);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n    visit(value.getFirst());\n    visit(value.getSecond());\n  }\n\n  @Override\n  public void visitRegex(VmRegex value) {\n    try {\n      packer.packArrayHeader(2);\n      packCode(PklBinaryCode.REGEX);\n      packer.packString(value.getPattern().pattern());\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitNull(VmNull value) {\n    try {\n      packer.packNil();\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  public void visitFunction(VmFunction value) {\n    try {\n      packer.packArrayHeader(1);\n      packCode(PklBinaryCode.FUNCTION);\n    } catch (IOException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  @Override\n  protected void visitEntryKey(Object key, boolean isFirst) {\n    visit(key);\n  }\n\n  @Override\n  protected void visitEntryValue(Object value) {\n    visit(value);\n  }\n\n  @Override\n  protected void endDynamic(VmDynamic value, boolean isEmpty) {\n    // noop\n  }\n\n  @Override\n  protected void endTyped(VmTyped value, boolean isEmpty) {\n    // noop\n  }\n\n  @Override\n  protected void endListing(VmListing value, boolean isEmpty) {\n    // noop\n  }\n\n  @Override\n  protected void endMapping(VmMapping value, boolean isEmpty) {\n    // noop\n  }\n\n  @Override\n  protected void endList(VmList value) {\n    // noop\n  }\n\n  @Override\n  protected void endSet(VmSet value) {\n    // noop\n  }\n\n  @Override\n  protected void endMap(VmMap value) {\n    // noop\n  }\n\n  @Override\n  protected boolean canRenderPropertyOrEntryOf(VmDynamic object) {\n    return true;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmRegex.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport org.pkl.core.ValueFormatter;\nimport org.pkl.core.util.Nullable;\n\n@ValueType\npublic final class VmRegex extends VmValue {\n  private final Pattern pattern;\n\n  public VmRegex(Pattern pattern) {\n    this.pattern = pattern;\n  }\n\n  public Pattern getPattern() {\n    return pattern;\n  }\n\n  @TruffleBoundary\n  public Matcher matcher(String input) {\n    return pattern.matcher(input);\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getRegexClass();\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public Pattern export() {\n    return pattern;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitRegex(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertRegex(this, path);\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmRegex other)) return false;\n    return pattern.pattern().equals(other.pattern.pattern());\n  }\n\n  @Override\n  public int hashCode() {\n    return pattern.pattern().hashCode();\n  }\n\n  @Override\n  public String toString() {\n    var builder = new StringBuilder();\n    builder.append(\"Regex(\");\n    ValueFormatter.withCustomStringDelimiters().formatStringValue(pattern.pattern(), \"\", builder);\n    builder.append(')');\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmSafeMath.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.nodes.Node;\nimport java.math.RoundingMode;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.util.MathUtils;\n\n/**\n * Uses methods from [java.lang.(Strict)Math] where appropriate, which may benefit from special\n * optimization by Graal. To control error messages in a single place (namely here),\n * [ArithmeticException]s thrown by [java.lang.StrictMath] are caught and rethrown.\n */\npublic final class VmSafeMath {\n  private VmSafeMath() {}\n\n  public static long negate(long x) {\n    try {\n      return Math.negateExact(x);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n  }\n\n  public static double negate(double x) {\n    return -x;\n  }\n\n  public static long add(long x, long y) {\n    try {\n      return StrictMath.addExact(x, y);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n  }\n\n  public static double add(double x, double y) {\n    return x + y;\n  }\n\n  public static long multiply(long x, long y) {\n    try {\n      return StrictMath.multiplyExact(x, y);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n  }\n\n  public static double multiply(double x, double y) {\n    return x * y;\n  }\n\n  public static long truncatingDivide(long x, long y) {\n    // for some reason, detecting division by zero by catching ArithmeticException\n    // does not work correctly in AOT mode, so let's do an explicit check for now\n    if (y == 0) {\n      CompilerDirectives.transferToInterpreter();\n      throw divisionByZero();\n    }\n\n    var result = x / y;\n\n    if ((x & y & result)\n        < 0) { // use same check as com.oracle.truffle.sl.nodes.expression.SLDivNode\n      CompilerDirectives.transferToInterpreter();\n      assert x == Long.MIN_VALUE && y == -1;\n      throw intOverflow();\n    }\n\n    return result;\n  }\n\n  public static long remainder(long x, long y) {\n    return x % y;\n  }\n\n  public static double remainder(double x, double y) {\n    return x % y;\n  }\n\n  public static int toInt32(long x) {\n    try {\n      return StrictMath.toIntExact(x);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder().evalError(\"intValueTooLarge\", x).build();\n    }\n  }\n\n  public static double truncate(double x) {\n    if (x < 0) {\n      return StrictMath.ceil(x);\n    }\n    return StrictMath.floor(x);\n  }\n\n  @TruffleBoundary\n  public static long toInt(double x, Node sourceNode) {\n    try {\n      return MathUtils.roundToLong(x, RoundingMode.DOWN);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder()\n          .withLocation(sourceNode)\n          .evalError(\n              Double.isFinite(x) ? \"cannotConvertLargeFloat\" : \"cannotConvertNonFiniteFloat\",\n              new ProgramValue(\"Float\", x))\n          .build();\n    }\n  }\n\n  public static long increment(long x) {\n    try {\n      return Math.incrementExact(x);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n  }\n\n  public static long decrement(long x) {\n    try {\n      return Math.decrementExact(x);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n  }\n\n  public static long abs(long x) {\n    if (x == Long.MIN_VALUE) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n    return StrictMath.abs(x);\n  }\n\n  public static long pow(long x, long y) {\n    assert y >= 0;\n\n    // handle cases not covered by GuavaMath.checkedPow\n    if (y > Integer.MAX_VALUE) {\n      if (x == 0 || x == 1) return x;\n      if (x == -1) return y % 2 == 0 ? 1 : -1;\n\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n\n    try {\n      return MathUtils.checkedPow(x, (int) y);\n    } catch (ArithmeticException e) {\n      CompilerDirectives.transferToInterpreter();\n      throw intOverflow();\n    }\n  }\n\n  private static VmException intOverflow() {\n    return new VmExceptionBuilder().evalError(\"integerOverflow\").build();\n  }\n\n  private static VmException divisionByZero() {\n    return new VmExceptionBuilder().evalError(\"divisionByZero\").build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmSet.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.Iterator;\nimport java.util.Set;\nimport org.organicdesign.fp.collections.ImSet;\nimport org.organicdesign.fp.collections.MutSet;\nimport org.organicdesign.fp.collections.PersistentHashSet;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.Iterators.ReverseTruffleIterator;\nimport org.pkl.core.runtime.Iterators.TruffleIterator;\nimport org.pkl.core.util.CollectionUtils;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.paguro.RrbTree;\nimport org.pkl.core.util.paguro.RrbTree.ImRrbt;\nimport org.pkl.core.util.paguro.RrbTree.MutRrbt;\n\npublic final class VmSet extends VmCollection {\n  public static final VmSet EMPTY = new VmSet(PersistentHashSet.empty(), RrbTree.empty());\n\n  private final ImSet<Object> set;\n  private final ImRrbt<Object> elementOrder;\n\n  boolean forced;\n\n  private VmSet(ImSet<Object> set, ImRrbt<Object> elementOrder) {\n    assert set.size() == elementOrder.size();\n    // assert set.equals(elementOrder.toImSet());\n    this.set = set;\n    this.elementOrder = elementOrder;\n  }\n\n  @TruffleBoundary\n  public static VmSet of(Object value) {\n    return new VmSet(\n        PersistentHashSet.emptyMutable().put(value).immutable(),\n        RrbTree.emptyMutable().append(value).immutable());\n  }\n\n  @TruffleBoundary\n  static VmSet create(ImSet<Object> set, ImRrbt<Object> elementOrder) {\n    if (elementOrder.isEmpty()) return EMPTY;\n    return new VmSet(set, elementOrder);\n  }\n\n  @TruffleBoundary\n  public static VmSet create(Iterable<?> iterable) {\n    // builder takes care of handling empty case\n    var builder = EMPTY.builder();\n    builder.addAll(iterable);\n    return builder.build();\n  }\n\n  @TruffleBoundary\n  public static VmSet createFromConstantNodes(ExpressionNode[] elements) {\n    // builder takes care of handling empty case\n    var builder = EMPTY.builder();\n    for (var elem : elements) {\n      assert elem instanceof ConstantNode;\n      builder.add(((ConstantNode) elem).getValue());\n    }\n    return builder.build();\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getSetClass();\n  }\n\n  @Override\n  @TruffleBoundary\n  public int getLength() {\n    return elementOrder.size();\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean isEmpty() {\n    return elementOrder.isEmpty();\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean isLengthOne() {\n    return elementOrder.size() == 1;\n  }\n\n  @Override\n  @TruffleBoundary\n  public VmSet add(Object element) {\n    if (set.contains(element)) return this;\n    return VmSet.create(set.put(element), elementOrder.append(element));\n  }\n\n  @Override\n  @TruffleBoundary\n  public VmSet concatenate(VmCollection other) {\n    if (other.isEmpty()) return this;\n\n    var setBuilder = set.mutable();\n    var elementOrderBuilder = elementOrder.mutable();\n\n    for (var element : other) {\n      if (!setBuilder.contains(element)) {\n        setBuilder.put(element);\n        elementOrderBuilder.append(element);\n      }\n    }\n    return VmSet.create(setBuilder.immutable(), elementOrderBuilder.immutable());\n  }\n\n  @Override\n  public Iterator<Object> iterator() {\n    if (elementOrder.isEmpty()) return Iterators.emptyTruffleIterator();\n    return new TruffleIterator<>(elementOrder);\n  }\n\n  @Override\n  @TruffleBoundary\n  public Iterator<Object> reverseIterator() {\n    if (elementOrder.isEmpty()) return Iterators.emptyTruffleIterator();\n    return new ReverseTruffleIterator<>(elementOrder);\n  }\n\n  @Override\n  public VmCollection.Builder<VmSet> builder() {\n    return new Builder();\n  }\n\n  public static VmCollection.Builder<VmSet> builder(VmSet set) {\n    return new Builder(set);\n  }\n\n  @TruffleBoundary\n  public Object getFirst() {\n    checkNonEmpty();\n    return elementOrder.get(0);\n  }\n\n  @TruffleBoundary\n  public Object getFirstOrNull() {\n    if (elementOrder.isEmpty()) return VmNull.withoutDefault();\n    return elementOrder.get(0);\n  }\n\n  @TruffleBoundary\n  public VmSet getRest() {\n    checkNonEmpty();\n    var first = elementOrder.get(0);\n    return VmSet.create(set.without(first), elementOrder.without(0));\n  }\n\n  @TruffleBoundary\n  public Object getRestOrNull() {\n    if (elementOrder.isEmpty()) return VmNull.withoutDefault();\n    var first = elementOrder.get(0);\n    return VmSet.create(set.without(first), elementOrder.without(0));\n  }\n\n  @TruffleBoundary\n  public Object getLast() {\n    checkNonEmpty();\n    return elementOrder.get(elementOrder.size() - 1);\n  }\n\n  @TruffleBoundary\n  public Object getLastOrNull() {\n    if (elementOrder.isEmpty()) return VmNull.withoutDefault();\n    return elementOrder.get(elementOrder.size() - 1);\n  }\n\n  @TruffleBoundary\n  public Object getSingle() {\n    checkLengthOne();\n    return elementOrder.get(0);\n  }\n\n  @TruffleBoundary\n  public Object getSingleOrNull() {\n    if (!isLengthOne()) return VmNull.withoutDefault();\n    return elementOrder.get(0);\n  }\n\n  @TruffleBoundary\n  public boolean contains(Object element) {\n    return set.contains(element);\n  }\n\n  @TruffleBoundary\n  public VmPair split(long index) {\n    var tuple = elementOrder.split((int) index);\n    return new VmPair(\n        VmSet.create(tuple._1().toImSet(), tuple._1()),\n        VmSet.create(tuple._2().toImSet(), tuple._2()));\n  }\n\n  @TruffleBoundary\n  public Object splitOrNull(long index) {\n    if (index < 0 || index > getLength()) {\n      return VmNull.withoutDefault();\n    }\n    return split(index);\n  }\n\n  @TruffleBoundary\n  public VmSet take(long n) {\n    if (n == 0) return EMPTY;\n    if (n >= elementOrder.size()) return this;\n\n    checkPositive(n);\n    var keepAndRemove = elementOrder.split(VmSafeMath.toInt32(n));\n    return VmSet.create(keepAndRemove._1().toImSet(), keepAndRemove._1());\n  }\n\n  @TruffleBoundary\n  public VmSet takeLast(long n) {\n    if (n == 0) return EMPTY;\n    if (n >= elementOrder.size()) return this;\n\n    checkPositive(n);\n    var removeAndKeep = elementOrder.split(elementOrder.size() - VmSafeMath.toInt32(n));\n    return VmSet.create(removeAndKeep._2().toImSet(), removeAndKeep._2());\n  }\n\n  @TruffleBoundary\n  public VmSet drop(long n) {\n    if (n == 0) return this;\n    if (n >= elementOrder.size()) return EMPTY;\n\n    checkPositive(n);\n    var removeAndKeep = elementOrder.split(VmSafeMath.toInt32(n));\n    return VmSet.create(removeAndKeep._2().toImSet(), removeAndKeep._2());\n  }\n\n  @TruffleBoundary\n  public VmSet dropLast(long n) {\n    if (n == 0) return this;\n    if (n >= elementOrder.size()) return EMPTY;\n\n    checkPositive(n);\n    var keepAndRemove = elementOrder.split(elementOrder.size() - VmSafeMath.toInt32(n));\n    return VmSet.create(keepAndRemove._1().toImSet(), keepAndRemove._1());\n  }\n\n  @TruffleBoundary\n  public VmList repeat(long n) {\n    return VmList.create(elementOrder).repeat(n);\n  }\n\n  @TruffleBoundary\n  public VmList reverse() {\n    return VmList.create(elementOrder).reverse();\n  }\n\n  @TruffleBoundary\n  public Object[] toArray() {\n    return elementOrder.toArray();\n  }\n\n  @TruffleBoundary\n  public VmList toList() {\n    return VmList.create(elementOrder);\n  }\n\n  public VmSet toSet() {\n    return this;\n  }\n\n  @TruffleBoundary\n  public VmListing toListing() {\n    var builder = new VmObjectBuilder(elementOrder.size());\n    for (var elem : elementOrder) builder.addElement(elem);\n    return builder.toListing();\n  }\n\n  @TruffleBoundary\n  public VmDynamic toDynamic() {\n    var builder = new VmObjectBuilder(elementOrder.size());\n    for (var elem : elementOrder) builder.addElement(elem);\n    return builder.toDynamic();\n  }\n\n  @Override\n  @TruffleBoundary\n  public void force(boolean allowUndefinedValues) {\n    if (forced) return;\n\n    forced = true;\n\n    try {\n      for (var elem : elementOrder) {\n        VmValue.force(elem, allowUndefinedValues);\n      }\n    } catch (Throwable t) {\n      forced = false;\n      throw t;\n    }\n  }\n\n  @Override\n  @TruffleBoundary\n  public Set<Object> export() {\n    var result = CollectionUtils.newLinkedHashSet(elementOrder.size());\n    for (var elem : elementOrder) {\n      result.add(VmValue.export(elem));\n    }\n    return result;\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitSet(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertSet(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(@Nullable Object other) {\n    if (this == other) return true;\n    //noinspection SimplifiableIfStatement\n    if (!(other instanceof VmSet vmSet)) return false;\n    return set.equals(vmSet.set);\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    return set.hashCode();\n  }\n\n  private static final class Builder implements VmCollection.Builder<VmSet> {\n    private final MutSet<Object> setBuilder;\n    private final MutRrbt<Object> elementOrderBuilder;\n\n    @TruffleBoundary\n    private Builder() {\n      setBuilder = PersistentHashSet.emptyMutable();\n      elementOrderBuilder = RrbTree.emptyMutable();\n    }\n\n    @TruffleBoundary\n    private Builder(VmSet set) {\n      setBuilder = set.set.mutable();\n      elementOrderBuilder = set.elementOrder.mutable();\n    }\n\n    @Override\n    @TruffleBoundary\n    public void add(Object element) {\n      if (!setBuilder.contains(element)) {\n        setBuilder.put(element);\n        elementOrderBuilder.append(element);\n      }\n    }\n\n    @Override\n    @TruffleBoundary\n    public void addAll(Iterable<?> elements) {\n      for (var elem : elements) {\n        if (!setBuilder.contains(elem)) {\n          setBuilder.put(elem);\n          elementOrderBuilder.append(elem);\n        }\n      }\n    }\n\n    @Override\n    @TruffleBoundary\n    public VmSet build() {\n      if (elementOrderBuilder.isEmpty()) return EMPTY;\n      return VmSet.create(setBuilder.immutable(), elementOrderBuilder.immutable());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmStackOverflowException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.util.HashMap;\nimport java.util.List;\n\npublic final class VmStackOverflowException extends VmException {\n\n  public VmStackOverflowException(StackOverflowError e) {\n    super(\n        \"stackOverflow\",\n        e,\n        true,\n        new Object[0],\n        null,\n        List.of(),\n        null,\n        null,\n        null,\n        null,\n        new HashMap<>());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmTypeAlias.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.Frame;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.concurrent.GuardedBy;\nimport org.pkl.core.Member.SourceLocation;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\nimport org.pkl.core.TypeAlias;\nimport org.pkl.core.TypeParameter;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeNode.ConstrainedTypeNode;\nimport org.pkl.core.ast.type.TypeNode.TypeVariableNode;\nimport org.pkl.core.ast.type.TypeNode.UnknownTypeNode;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmTypeAlias extends VmValue {\n  private final SourceSection sourceSection;\n  private final SourceSection headerSection;\n  private final SourceSection @Nullable [] docComment;\n  private final int modifiers;\n  private final List<VmTyped> annotations;\n  private final String simpleName;\n  private final VmTyped module;\n  private final String qualifiedName;\n  private final List<TypeParameter> typeParameters;\n  private final MaterializedFrame enclosingFrame;\n\n  @LateInit private TypeNode typeNode;\n\n  @LateInit\n  @GuardedBy(\"pTypeAliasLock\")\n  private TypeAlias __pTypeAlias;\n\n  private final Object pTypeAliasLock = new Object();\n\n  @LateInit\n  @GuardedBy(\"mirrorLock\")\n  private VmTyped __mirror;\n\n  private final Object mirrorLock = new Object();\n\n  public VmTypeAlias(\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      SourceSection @Nullable [] docComment,\n      int modifiers,\n      List<VmTyped> annotations,\n      String simpleName,\n      VmTyped module,\n      String qualifiedName,\n      List<TypeParameter> typeParameters,\n      MaterializedFrame enclosingFrame) {\n    this.sourceSection = sourceSection;\n    this.headerSection = headerSection;\n    this.docComment = docComment;\n    this.modifiers = modifiers;\n    this.annotations = annotations;\n    this.simpleName = simpleName;\n    this.module = module;\n    this.qualifiedName = qualifiedName;\n    this.typeParameters = typeParameters;\n    this.enclosingFrame = enclosingFrame;\n  }\n\n  public void initTypeCheckNode(TypeNode typeNode) {\n    assert this.typeNode == null;\n    this.typeNode = typeNode;\n  }\n\n  public SourceSection getHeaderSection() {\n    return headerSection;\n  }\n\n  /**\n   * Assuming a type alias of the form `typealias X = Y(constraint)`, returns the source section of\n   * `Y`.\n   */\n  @TruffleBoundary\n  public SourceSection getBaseTypeSection() {\n    if (typeNode instanceof ConstrainedTypeNode constrainedTypeNode) {\n      return constrainedTypeNode.getBaseTypeSection();\n    }\n\n    throw new VmExceptionBuilder()\n        .bug(\"Not a type alias of the form `typealias X = Y(constraint)`.\")\n        .withSourceSection(typeNode.getSourceSection())\n        .build();\n  }\n\n  /**\n   * Assuming a type alias of the form `typealias X = Y(constraint)`, returns the source section of\n   * `constraint`.\n   */\n  @TruffleBoundary\n  public SourceSection getConstraintSection() {\n    if (typeNode instanceof ConstrainedTypeNode) {\n      return ((ConstrainedTypeNode) typeNode).getFirstConstraintSection();\n    }\n\n    throw new VmExceptionBuilder()\n        .bug(\"Not a type alias of the form `typealias X = Y(constraint)`.\")\n        .withSourceSection(typeNode.getSourceSection())\n        .build();\n  }\n\n  public boolean isInitialized() {\n    return typeNode != null;\n  }\n\n  public SourceSection @Nullable [] getDocComment() {\n    return docComment;\n  }\n\n  public List<VmTyped> getAnnotations() {\n    return annotations;\n  }\n\n  public String getModuleName() {\n    return module.getVmClass().getModuleName();\n  }\n\n  public URI getModuleUri() {\n    return module.getVmClass().getPClassInfo().getModuleUri();\n  }\n\n  public VmTyped getModuleMirror() {\n    return module.getModuleInfo().getMirror(module);\n  }\n\n  public String getSimpleName() {\n    return simpleName;\n  }\n\n  public String getQualifiedName() {\n    return qualifiedName;\n  }\n\n  public String getDisplayName() {\n    // display `UInt` rather than `pkl.base#UInt`, etc.\n    // based on PClassInfo.getDisplayName\n    return getModuleUri().equals(PClassInfo.pklBaseUri) ? simpleName : qualifiedName;\n  }\n\n  public int getTypeParameterCount() {\n    return typeParameters.size();\n  }\n\n  public TypeNode getTypeNode() {\n    return typeNode;\n  }\n\n  public Frame getEnclosingFrame() {\n    return enclosingFrame;\n  }\n\n  @TruffleBoundary\n  public TypeNode instantiate(TypeNode[] typeArgumentNodes) {\n    // Cloning the type node means that the entire type check remains within a single root node,\n    // which should be good for interpreted and compiled performance alike:\n    // * Fewer root nodes to call\n    // * ControlFlowException used to implement union types doesn't escape root node\n    var clone = (TypeNode) typeNode.deepCopy();\n\n    if (typeParameters.isEmpty()) return clone;\n\n    clone.accept(\n        node -> {\n          if (node instanceof TypeVariableNode typeVarNode) {\n            int index = typeVarNode.getTypeParameterIndex();\n            // should not need to clone type argument node because it is not used by its original\n            // root node\n            node.replace(\n                typeArgumentNodes.length == 0\n                    ? new UnknownTypeNode(sourceSection)\n                    : typeArgumentNodes[index]);\n          }\n          return true;\n        });\n\n    return clone;\n  }\n\n  @Override\n  public VmClass getVmClass() {\n    return BaseModule.getTypeAliasClass();\n  }\n\n  @Override\n  public void force(boolean allowUndefinedValues) {\n    // do nothing\n  }\n\n  @Override\n  public TypeAlias export() {\n    synchronized (pTypeAliasLock) {\n      if (__pTypeAlias == null) {\n        var pAnnotations = new ArrayList<PObject>(annotations.size());\n\n        __pTypeAlias =\n            new TypeAlias(\n                VmUtils.exportDocComment(docComment),\n                new SourceLocation(headerSection.getStartLine(), sourceSection.getEndLine()),\n                VmModifier.export(modifiers, true),\n                pAnnotations,\n                simpleName,\n                getModuleName(),\n                qualifiedName,\n                typeParameters);\n\n        for (var parameter : typeParameters) {\n          parameter.initOwner(__pTypeAlias);\n        }\n\n        VmUtils.exportAnnotations(annotations, pAnnotations);\n        __pTypeAlias.initAliasedType(TypeNode.export(typeNode));\n      }\n\n      return __pTypeAlias;\n    }\n  }\n\n  public VmTyped getMirror() {\n    synchronized (mirrorLock) {\n      if (__mirror == null) {\n        __mirror = MirrorFactories.typeAliasFactory.create(this);\n      }\n      return __mirror;\n    }\n  }\n\n  public VmSet getModifierMirrors() {\n    return VmModifier.getMirrors(modifiers, false);\n  }\n\n  public VmList getTypeParameterMirrors() {\n    var builder = VmList.EMPTY.builder();\n    for (var typeParameter : typeParameters) {\n      builder.add(MirrorFactories.typeParameterFactory.create(typeParameter));\n    }\n    return builder.build();\n  }\n\n  public VmTyped getTypeMirror() {\n    return typeNode.getMirror();\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitTypeAlias(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertTypeAlias(this, path);\n  }\n\n  @Override\n  public boolean equals(Object obj) {\n    return this == obj;\n  }\n\n  @Override\n  public int hashCode() {\n    return qualifiedName.hashCode();\n  }\n\n  @Override\n  public String toString() {\n    return qualifiedName.startsWith(\"pkl.base#\") ? simpleName : qualifiedName;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmTyped.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.CompilationFinal;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.MaterializedFrame;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.pkl.core.Composite;\nimport org.pkl.core.PModule;\nimport org.pkl.core.PObject;\nimport org.pkl.core.ast.expression.unary.ImportNode;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmTyped extends VmObject {\n  @CompilationFinal @LateInit private VmClass clazz;\n\n  public VmTyped(\n      MaterializedFrame enclosingFrame,\n      @Nullable VmTyped parent,\n      // null -> will be initialized using lateInitVmClass() later\n      @Nullable VmClass clazz,\n      UnmodifiableEconomicMap<Object, ObjectMember> members) {\n    super(enclosingFrame, parent, members);\n    this.clazz = clazz;\n  }\n\n  public void lateInitVmClass(VmClass clazz) {\n    assert this.clazz == null : \"VmTyped.clazz has already been initialized.\";\n    this.clazz = clazz;\n  }\n\n  public void addProperty(ObjectMember property) {\n    EconomicMaps.put((EconomicMap<Object, ObjectMember>) members, property.getName(), property);\n  }\n\n  public void addProperties(UnmodifiableEconomicMap<Object, ObjectMember> properties) {\n    EconomicMaps.putAll((EconomicMap<Object, ObjectMember>) members, properties);\n  }\n\n  public VmClass getVmClass() {\n    assert clazz != null : \"VmTyped.clazz was not initialized.\";\n    return clazz;\n  }\n\n  public @Nullable VmTyped getParent() {\n    return (VmTyped) parent;\n  }\n\n  @Override\n  public boolean isPrototype() {\n    return this == getPrototype();\n  }\n\n  @Override\n  public boolean isModuleObject() {\n    return extraStorage instanceof ModuleInfo;\n  }\n\n  public ModuleInfo getModuleInfo() {\n    assert isModuleObject();\n    return (ModuleInfo) getExtraStorage();\n  }\n\n  public VmTyped getModuleMirror() {\n    assert isModuleObject();\n    return getModuleInfo().getMirror(this);\n  }\n\n  public VmValue getSupermoduleMirror() {\n    assert isModuleObject();\n\n    var parent = getParent();\n    assert parent != null;\n\n    return parent == BaseModule.getModuleClass().getPrototype()\n        ? VmNull.withoutDefault()\n        : parent.getModuleMirror();\n  }\n\n  public VmMap getImports() {\n    assert isModuleObject();\n\n    var builder = VmMap.builder();\n    for (var member : members.getValues()) {\n      if (member.isImport()) {\n        var memberNode = member.getMemberNode();\n        assert memberNode != null; // import is never a constant\n        builder.add(\n            member.getName().toString(),\n            ((ImportNode) memberNode.getBodyNode()).getImportUri().toString());\n      }\n    }\n    return builder.build();\n  }\n\n  public VmMap getClassMirrors() {\n    assert isModuleObject();\n\n    if (getModuleInfo().isAmend()) return VmMap.EMPTY;\n\n    var builder = VmMap.builder();\n    for (var member : members.getValues()) {\n      if (member.isClass() && !member.isLocal()) {\n        var className = member.getName();\n        var clazz = (VmClass) getCachedValue(className);\n        if (clazz == null) {\n          clazz = (VmClass) VmUtils.doReadMember(this, this, className, member);\n        }\n        builder.add(className.toString(), clazz.getMirror());\n      }\n    }\n    return builder.build();\n  }\n\n  public VmMap getTypeAliasMirrors() {\n    assert isModuleObject();\n\n    if (getModuleInfo().isAmend()) return VmMap.EMPTY;\n    var builder = VmMap.builder();\n    for (var member : members.getValues()) {\n      if (member.isTypeAlias() && !member.isLocal()) {\n        var typeAliasName = member.getName();\n        var typeAlias = (VmTypeAlias) getCachedValue(typeAliasName);\n        if (typeAlias == null) {\n          typeAlias = (VmTypeAlias) VmUtils.doReadMember(this, this, typeAliasName, member);\n        }\n        builder.add(typeAliasName.toString(), typeAlias.getMirror());\n      }\n    }\n    return builder.build();\n  }\n\n  @Override\n  @TruffleBoundary\n  public Composite export() {\n    if (!isModuleObject()) {\n      return new PObject(clazz.getPClassInfo(), exportMembers());\n    }\n\n    var moduleInfo = getModuleInfo();\n    return new PModule(\n        moduleInfo.getModuleKey().getUri(),\n        moduleInfo.getModuleName(),\n        clazz.getPClassInfo(),\n        exportMembers());\n  }\n\n  @Override\n  public void accept(VmValueVisitor visitor) {\n    visitor.visitTyped(this);\n  }\n\n  @Override\n  public <T> T accept(VmValueConverter<T> converter, Iterable<Object> path) {\n    return converter.convertTyped(this, path);\n  }\n\n  @Override\n  @TruffleBoundary\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof VmTyped other)) return false;\n\n    if (clazz != other.clazz) return false;\n    // could use shallow force, but deep force is cached\n    force(false);\n    other.force(false);\n\n    for (var key : clazz.getAllRegularPropertyNames()) {\n      var value = getCachedValue(key);\n      assert value != null;\n      var otherValue = other.getCachedValue(key);\n      if (!value.equals(otherValue)) return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  @TruffleBoundary\n  public int hashCode() {\n    if (cachedHash != 0) return cachedHash;\n\n    force(false);\n    var result = 0;\n\n    for (var key : clazz.getAllRegularPropertyNames()) {\n      var value = getCachedValue(key);\n      assert value != null;\n      result = 31 * result + value.hashCode();\n    }\n\n    cachedHash = result;\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmTypes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.dsl.TypeSystem;\n\n@TypeSystem({\n  String.class,\n  long.class,\n  double.class,\n  boolean.class,\n  VmDuration.class,\n  VmDataSize.class,\n  VmIntSeq.class,\n  VmList.class,\n  VmSet.class,\n  VmCollection.class,\n  VmMap.class,\n  VmListing.class,\n  VmMapping.class,\n  VmTyped.class,\n  VmDynamic.class,\n  VmFunction.class,\n  VmClass.class,\n  VmNull.class,\n  VmPair.class,\n  VmRegex.class,\n  VmTypeAlias.class,\n  VmObjectLike.class,\n  VmValue.class\n})\npublic class VmTypes {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmUndefinedValueException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.Collections;\nimport java.util.Deque;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.BiConsumer;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.Lexer;\n\npublic final class VmUndefinedValueException extends VmEvalException {\n  private final @Nullable Object receiver;\n\n  public VmUndefinedValueException(\n      @Nullable String message,\n      @Nullable Throwable cause,\n      boolean isExternalMessage,\n      Object[] messageArguments,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> messageBuilder,\n      List<ProgramValue> programValues,\n      @Nullable Node location,\n      @Nullable SourceSection sourceSection,\n      @Nullable String memberName,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      @Nullable Object receiver,\n      @Nullable Map<CallTarget, StackFrame> insertedStackFrames) {\n\n    super(\n        message,\n        cause,\n        isExternalMessage,\n        messageArguments,\n        messageBuilder,\n        programValues,\n        location,\n        sourceSection,\n        memberName,\n        hintBuilder,\n        insertedStackFrames == null ? Collections.emptyMap() : insertedStackFrames);\n\n    this.receiver = receiver;\n  }\n\n  public VmUndefinedValueException fillInHint(Deque<Object> path, Object topLevelValue) {\n    if (hintBuilder != null) return this;\n    var builder = new StringBuilder();\n    var memberKey = getMessageArguments()[0];\n    path.push(memberKey);\n    builder.append(\"The above error occurred when rendering path `\");\n    renderPath(builder, path);\n    builder.append('`');\n    path.pop();\n    if (topLevelValue instanceof VmTyped typed && typed.isModuleObject()) {\n      builder\n          .append(\" of module `\")\n          .append(typed.getModuleInfo().getModuleSchema(typed).getModuleUri())\n          .append('`');\n    }\n    builder.append('.');\n    this.hintBuilder = (b, ignored) -> b.append(builder.toString());\n    return this;\n  }\n\n  private void renderPath(StringBuilder builder, Deque<Object> path) {\n    var iter = path.descendingIterator();\n    var isTrailingPath = false;\n    while (iter.hasNext()) {\n      var pathPart = iter.next();\n      if (pathPart == VmValueConverter.TOP_LEVEL_VALUE) continue;\n      if (pathPart instanceof Identifier) {\n        if (isTrailingPath) {\n          builder.append('.');\n        } else {\n          isTrailingPath = true;\n        }\n        builder.append(Lexer.maybeQuoteIdentifier(pathPart.toString()));\n      } else {\n        builder.append('[').append(pathPart).append(']');\n      }\n    }\n  }\n\n  public @Nullable Object getReceiver() {\n    return receiver;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmUtils.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.Truffle;\nimport com.oracle.truffle.api.TruffleLanguage;\nimport com.oracle.truffle.api.TruffleStackTrace;\nimport com.oracle.truffle.api.frame.*;\nimport com.oracle.truffle.api.nodes.*;\nimport com.oracle.truffle.api.source.Source;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.net.URI;\nimport java.text.DecimalFormat;\nimport java.text.DecimalFormatSymbols;\nimport java.util.*;\nimport java.util.function.Function;\nimport java.util.regex.Pattern;\nimport java.util.regex.PatternSyntaxException;\nimport java.util.stream.Collectors;\nimport org.graalvm.polyglot.Context;\nimport org.graalvm.polyglot.Engine;\nimport org.organicdesign.fp.collections.ImMap;\nimport org.pkl.core.FileOutput;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PObject;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.StackFrameTransformer;\nimport org.pkl.core.ast.ConstantNode;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.SimpleRootNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.builder.AstBuilder;\nimport org.pkl.core.ast.builder.SymbolTable.CustomThisScope;\nimport org.pkl.core.ast.expression.primary.CustomThisNode;\nimport org.pkl.core.ast.expression.primary.ThisNode;\nimport org.pkl.core.ast.member.*;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.UnresolvedTypeNode;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.parser.Parser;\nimport org.pkl.parser.ParserError;\nimport org.pkl.parser.syntax.Expr;\n\npublic final class VmUtils {\n  /** See {@link VmUtils#shouldRunTypeCheck(VirtualFrame)}. */\n  public static final Object SKIP_TYPECHECK_MARKER = new Object();\n\n  public static final String REPL_TEXT = \"repl:text\";\n\n  public static final URI REPL_TEXT_URI = URI.create(REPL_TEXT);\n\n  private static final Engine PKL_ENGINE =\n      Engine.newBuilder(\"pkl\").option(\"engine.WarnInterpreterOnly\", \"false\").build();\n\n  private static final Pattern DOC_COMMENT_LINE_START =\n      Pattern.compile(\n          \"(?:^|\\n|\\r\\n?)[ \\t\\f]*///[ \\t\\f]?\",\n          Pattern.UNICODE_CHARACTER_CLASS | Pattern.UNICODE_CASE);\n\n  private static final SourceSection UNAVAILABLE_SOURCE_SECTION =\n      Source.newBuilder(\"pkl\", \"\", \"unavailable\")\n          .mimeType(VmLanguage.MIME_TYPE)\n          .uri(URI.create(\"source:unavailable\"))\n          .cached(false)\n          .build()\n          .createUnavailableSection();\n\n  private static final DecimalFormatSymbols ROOT_DECIMAL_FORMAT_SYMBOLS =\n      DecimalFormatSymbols.getInstance(Locale.ROOT);\n\n  private VmUtils() {}\n\n  static VmTyped createEmptyModule() {\n    return new VmTyped(createEmptyMaterializedFrame(), null, null, EconomicMaps.create());\n  }\n\n  @TruffleBoundary\n  public static MaterializedFrame createEmptyMaterializedFrame() {\n    return Truffle.getRuntime().createMaterializedFrame(new Object[] {null, null});\n  }\n\n  public static Context createContext(Runnable initializer) {\n    var context = Context.newBuilder(\"pkl\").engine(PKL_ENGINE).build();\n    context.initialize(\"pkl\");\n    context.enter();\n    try {\n      initializer.run();\n    } finally {\n      context.leave();\n    }\n    return context;\n  }\n\n  public static int countLeadingWhitespace(String str) {\n    var idx = 0;\n    while (idx < str.length() && Character.isWhitespace(str.charAt(idx))) {\n      idx += 1;\n    }\n    return idx;\n  }\n\n  public static String indent(String text, String indent) {\n    return text.lines().map(line -> indent + line).collect(Collectors.joining(\"\\n\"));\n  }\n\n  /** Returns the receiver of the message that was dispatched to the currently executing code. */\n  public static @Nullable Object getReceiverOrNull(Frame frame) {\n    return frame.getArguments()[0];\n  }\n\n  /** Returns the receiver of the message that was dispatched to the currently executing code. */\n  public static Object getReceiver(Frame frame) {\n    var result = getReceiverOrNull(frame);\n    assert result != null;\n    return result;\n  }\n\n  public static VmObjectLike getObjectReceiver(Frame frame) {\n    return (VmObjectLike) getReceiver(frame);\n  }\n\n  public static VmTyped getTypedObjectReceiver(Frame frame) {\n    return (VmTyped) getReceiver(frame);\n  }\n\n  /** Returns the owner of the currently executing code. */\n  public static @Nullable VmObjectLike getOwnerOrNull(Frame frame) {\n    return (VmObjectLike) frame.getArguments()[1];\n  }\n\n  /** Returns the owner of the currently executing code. */\n  public static VmObjectLike getOwner(Frame frame) {\n    var result = getOwnerOrNull(frame);\n    assert result != null;\n    return result;\n  }\n\n  /** Returns a `ObjectMember`'s key while executing the corresponding `MemberNode`. */\n  public static Object getMemberKey(Frame frame) {\n    return frame.getArguments()[2];\n  }\n\n  public static ModuleInfo getModuleInfo(VmObjectLike composite) {\n    assert composite.isModuleObject();\n    return (ModuleInfo) composite.getExtraStorage();\n  }\n\n  public static String readTextProperty(VmObjectLike receiver) {\n    return (String) VmUtils.readMember(receiver, Identifier.TEXT);\n  }\n\n  public static String readTextProperty(Object receiver) {\n    assert receiver instanceof VmObjectLike;\n    return (String) VmUtils.readMember((VmObjectLike) receiver, Identifier.TEXT);\n  }\n\n  public static VmBytes readBytesProperty(VmObjectLike receiver) {\n    return (VmBytes) VmUtils.readMember(receiver, Identifier.BYTES);\n  }\n\n  public static VmTyped readModuleOutput(VmTyped module) {\n    var value = VmUtils.readMember(module, Identifier.OUTPUT);\n    if (value instanceof VmTyped typedOutput\n        && typedOutput.getVmClass().getPClassInfo() == PClassInfo.ModuleOutput) {\n      return typedOutput;\n    }\n\n    var moduleUri = module.getModuleInfo().getModuleKey().getUri();\n    var builder =\n        new VmExceptionBuilder()\n            .evalError(\n                \"invalidModuleOutput\",\n                \"output\",\n                PClassInfo.ModuleOutput.getDisplayName(),\n                VmUtils.getClass(value).getPClassInfo().getDisplayName(),\n                moduleUri);\n    var outputMember = module.getMember(Identifier.OUTPUT);\n    assert outputMember != null;\n    var uriOfValueMember = outputMember.getSourceSection().getSource().getURI();\n    // If `output` was explicitly re-assigned, show that in the stack trace.\n    if (!uriOfValueMember.equals(PClassInfo.pklBaseUri)) {\n      builder.withSourceSection(outputMember.getBodySection()).withMemberName(\"output\");\n    }\n    throw builder.build();\n  }\n\n  public static Map<String, FileOutput> readFilesProperty(\n      VmObjectLike receiver, Function<VmTyped, FileOutput> fileOutputFactory) {\n    var filesOrNull = VmUtils.readMember(receiver, Identifier.FILES);\n    if (filesOrNull instanceof VmNull) {\n      return Map.of();\n    }\n    var files = (VmMapping) filesOrNull;\n    var result = new LinkedHashMap<String, FileOutput>();\n    files.forceAndIterateMemberValues(\n        (key, member, value) -> {\n          assert member.isEntry();\n          result.put((String) key, fileOutputFactory.apply((VmTyped) value));\n          return true;\n        });\n    return result;\n  }\n\n  @TruffleBoundary\n  public static Object readMember(VmObjectLike receiver, Object memberKey) {\n    var result = readMemberOrNull(receiver, memberKey);\n    if (result != null) return result;\n\n    throw new VmExceptionBuilder().cannotFindMember(receiver, memberKey).build();\n  }\n\n  @TruffleBoundary\n  public static @Nullable Object readMemberOrNull(\n      VmObjectLike receiver, Object memberKey, boolean checkType) {\n    return readMemberOrNull(receiver, memberKey, checkType, IndirectCallNode.getUncached());\n  }\n\n  @TruffleBoundary\n  public static @Nullable Object readMemberOrNull(\n      VmObjectLike receiver, Object memberKey, IndirectCallNode callNode) {\n    return readMemberOrNull(receiver, memberKey, true, callNode);\n  }\n\n  @TruffleBoundary\n  public static @Nullable Object readMemberOrNull(VmObjectLike receiver, Object memberKey) {\n    return readMemberOrNull(receiver, memberKey, true, IndirectCallNode.getUncached());\n  }\n\n  /**\n   * Before calling this method, always try `VmObject.getCachedValue()`. (This method writes to the\n   * cache, but doesn't read from it.)\n   */\n  @TruffleBoundary\n  public static Object doReadMember(\n      VmObjectLike receiver, VmObjectLike owner, Object memberKey, ObjectMember member) {\n    return doReadMember(receiver, owner, memberKey, member, true, IndirectCallNode.getUncached());\n  }\n\n  @TruffleBoundary\n  public static Object readMember(\n      VmObjectLike receiver, Object memberKey, IndirectCallNode callNode) {\n    var result = readMemberOrNull(receiver, memberKey, true, callNode);\n    if (result != null) return result;\n\n    throw new VmExceptionBuilder()\n        .cannotFindMember(receiver, memberKey)\n        .withLocation(callNode)\n        .build();\n  }\n\n  @TruffleBoundary\n  public static @Nullable Object readMemberOrNull(\n      VmObjectLike receiver, Object memberKey, boolean checkType, IndirectCallNode callNode) {\n    assert (!(memberKey instanceof Identifier identifier) || !identifier.isLocalProp())\n        : \"Must use ReadLocalPropertyNode for local properties.\";\n\n    final var cachedValue = receiver.getCachedValue(memberKey);\n    if (cachedValue != null) return cachedValue;\n\n    for (var owner = receiver; owner != null; owner = owner.getParent()) {\n      var member = owner.getMember(memberKey);\n      if (member == null) continue;\n      return doReadMember(receiver, owner, memberKey, member, checkType, callNode);\n    }\n\n    return null;\n  }\n\n  /**\n   * Before calling this method, always try `VmObject.getCachedValue()`. (This method writes to the\n   * cache, but doesn't read from it.)\n   */\n  @TruffleBoundary\n  public static Object doReadMember(\n      VmObjectLike receiver,\n      VmObjectLike owner,\n      Object memberKey,\n      ObjectMember member,\n      boolean checkType,\n      IndirectCallNode callNode) {\n\n    final var constantValue = member.getConstantValue();\n\n    // const members only need to be executed once on the prototype, and its cached value\n    // can be re-used for all children in the amends chain.\n    if (member.isConst() && owner != receiver) {\n      assert member.isProp();\n      assert owner.isPrototype();\n      var result = readMemberOrNull(owner, memberKey, checkType, callNode);\n      assert result != null;\n      receiver.setCachedValue(memberKey, result);\n      return result;\n    }\n\n    if (constantValue != null) {\n      var result = constantValue;\n      // for a property, Listing element, or Mapping value, do a type check\n      if (member.isProp()) {\n        var property = receiver.getVmClass().getProperty(member.getName());\n        if (property != null && property.getTypeNode() != null) {\n          var callTarget = property.getTypeNode().getCallTarget();\n          try {\n            if (checkType) {\n              result = callNode.call(callTarget, receiver, property.getOwner(), constantValue);\n            } else {\n              result =\n                  callNode.call(\n                      callTarget,\n                      receiver,\n                      property.getOwner(),\n                      constantValue,\n                      VmUtils.SKIP_TYPECHECK_MARKER);\n            }\n          } catch (VmException e) {\n            CompilerDirectives.transferToInterpreter();\n            insertStackFrame(member, callTarget, e);\n            throw e;\n          }\n        }\n      } else if (receiver instanceof VmListingOrMapping listingOrMapping\n          && owner instanceof VmListingOrMapping) {\n        // `owner instanceof VmListingOrMapping` guards against\n        // PropertiesRenderer amending VmDynamic with VmListing (hack?)\n        result = listingOrMapping.executeTypeCasts(constantValue, owner, callNode, member, null);\n      }\n\n      receiver.setCachedValue(memberKey, result);\n      return result;\n    }\n\n    var callTarget = member.getCallTarget();\n    Object result;\n    if (checkType) {\n      result = callNode.call(callTarget, receiver, owner, memberKey);\n    } else {\n      result = callNode.call(callTarget, receiver, owner, memberKey, VmUtils.SKIP_TYPECHECK_MARKER);\n    }\n    receiver.setCachedValue(memberKey, result);\n    return result;\n  }\n\n  /**\n   * Copies {@code numberOfLocalsToCopy} locals from {@code sourceFrame}, starting at {@code\n   * firstSourceSlot}, to {@code firstSourceSlot}, starting at {@code firstTargetSlot}.\n   */\n  public static void copyLocals(\n      VirtualFrame sourceFrame,\n      int firstSourceSlot,\n      VirtualFrame targetFrame,\n      int firstTargetSlot,\n      int numberOfLocalsToCopy) {\n    var sourceDescriptor = sourceFrame.getFrameDescriptor();\n    var targetDescriptor = targetFrame.getFrameDescriptor();\n    // Alternatively, locals could be copied with `numberOfLocalsToCopy`\n    // `ReadFrameSlotNode/WriteFrameSlotNode`'s.\n    for (int i = 0; i < numberOfLocalsToCopy; i++) {\n      var sourceSlot = firstSourceSlot + i;\n      var targetSlot = firstTargetSlot + i;\n      // If, for a particular call site of this method,\n      // slot kinds of `sourceDescriptor` will reach a steady state,\n      // then slot kinds of `targetDescriptor` will too.\n      var slotKind = sourceDescriptor.getSlotKind(sourceSlot);\n      switch (slotKind) {\n        case Boolean -> {\n          targetDescriptor.setSlotKind(targetSlot, FrameSlotKind.Boolean);\n          targetFrame.setBoolean(targetSlot, sourceFrame.getBoolean(sourceSlot));\n        }\n        case Long -> {\n          targetDescriptor.setSlotKind(targetSlot, FrameSlotKind.Long);\n          targetFrame.setLong(targetSlot, sourceFrame.getLong(sourceSlot));\n        }\n        case Double -> {\n          targetDescriptor.setSlotKind(targetSlot, FrameSlotKind.Double);\n          targetFrame.setDouble(targetSlot, sourceFrame.getDouble(sourceSlot));\n        }\n        case Object -> {\n          targetDescriptor.setSlotKind(targetSlot, FrameSlotKind.Object);\n          targetFrame.setObject(\n              targetSlot,\n              sourceFrame instanceof MaterializedFrame\n                  // Even though sourceDescriptor.getSlotKind is now Object,\n                  // it may have been a primitive kind when `sourceFrame`'s local was written.\n                  // Hence we need to read the local with getValue() instead of getObject().\n                  ? sourceFrame.getValue(sourceSlot)\n                  : sourceFrame.getObject(sourceSlot));\n        }\n        default -> {\n          CompilerDirectives.transferToInterpreter();\n          throw new VmExceptionBuilder().bug(\"Unexpected FrameSlotKind: \" + slotKind).build();\n        }\n      }\n    }\n  }\n\n  // A failed property type check looks as follows in the stack trace:\n  // x: Int(isPositive)\n  // at ...\n  // x = -10\n  // at ...\n  // However, if the value of `x` is a parse-time constant (as in `x = -10`),\n  // there's no root node for it and hence no stack trace element.\n  // In this case, insert a stack trace element to make the stack trace look the same\n  // as in the non-constant case. (Parse-time constants are an internal optimization.)\n  public static void insertStackFrame(\n      ObjectMember member, CallTarget location, VmException exception) {\n    var sourceSection = member.getBodySection();\n    if (!sourceSection.isAvailable()) {\n      sourceSection = member.getSourceSection();\n    }\n    if (sourceSection.isAvailable()) {\n      exception\n          .getInsertedStackFrames()\n          .put(location, createStackFrame(sourceSection, member.getQualifiedName()));\n    }\n  }\n\n  public static @Nullable ObjectMember findMember(VmObjectLike receiver, Object memberKey) {\n    for (var owner = receiver; owner != null; owner = owner.getParent()) {\n      var member = owner.getMember(memberKey);\n      if (member != null) return member;\n    }\n\n    return null;\n  }\n\n  public static ExpressionNode createThisNode(\n      SourceSection sourceSection, boolean isCustomThisScope) {\n    return isCustomThisScope ? new CustomThisNode(sourceSection) : new ThisNode(sourceSection);\n  }\n\n  public static boolean isPcfRenderDirective(Object value) {\n    return value instanceof VmTyped typed\n        && typed.getVmClass().getPClassInfo() == PClassInfo.PcfRenderDirective;\n  }\n\n  @TruffleBoundary\n  public static NodeInfo getNodeInfo(Node node) {\n    var info = node.getClass().getAnnotation(NodeInfo.class);\n    if (info != null) return info;\n    throw new VmExceptionBuilder()\n        .bug(\"Node class `%s` is missing a `@NodeInfo` annotation.\", node.getClass().getName())\n        .build();\n  }\n\n  // implements same behavior as AnyNodes#getClass\n  public static VmClass getClass(Object value) {\n    if (value instanceof VmValue vmValue) {\n      return vmValue.getVmClass();\n    }\n    if (value instanceof String) {\n      return BaseModule.getStringClass();\n    }\n    if (value instanceof Boolean) {\n      return BaseModule.getBooleanClass();\n    }\n    if (value instanceof Long) {\n      return BaseModule.getIntClass();\n    }\n    if (value instanceof Double) {\n      return BaseModule.getFloatClass();\n    }\n\n    CompilerDirectives.transferToInterpreter();\n    throw new VmExceptionBuilder().bug(\"Unknown Pkl data type `%s`.\", value).build();\n  }\n\n  @SuppressWarnings(\"unused\")\n  public static String getConfigValue(TruffleLanguage.Env env, String name, String defaultValue) {\n    var rawValue = env.getConfig().get(name);\n    if (rawValue == null) return defaultValue;\n\n    return rawValue.toString();\n  }\n\n  public static SourceSection unavailableSourceSection() {\n    return UNAVAILABLE_SOURCE_SECTION;\n  }\n\n  @TruffleBoundary\n  public static ImMap<Object, Object> put(ImMap<Object, Object> map, String key, Object value) {\n    return map.assoc(key, value);\n  }\n\n  @TruffleBoundary\n  public static StringBuilder createBuilder() {\n    return new StringBuilder();\n  }\n\n  @TruffleBoundary\n  public static void appendToBuilder(StringBuilder builder, String string) {\n    builder.append(string);\n  }\n\n  @TruffleBoundary\n  public static String builderToString(StringBuilder builder) {\n    return builder.toString();\n  }\n\n  public static void checkPositive(long n) {\n    if (n < 0) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder().evalError(\"expectedPositiveNumber\", n).build();\n    }\n  }\n\n  public static Source loadSource(ResolvedModuleKey resolvedKey) {\n    try {\n      var text = resolvedKey.loadSource();\n      return createSource(resolvedKey.getOriginal(), text);\n    } catch (IOException e) {\n      throw new VmExceptionBuilder()\n          .evalError(\"ioErrorLoadingModule\", resolvedKey.getOriginal().getUri())\n          .withCause(e)\n          .build();\n    }\n  }\n\n  public static Source createSource(ModuleKey moduleKey, String text) {\n    return Source.newBuilder(\"pkl\", text, moduleKey.getUri().toString())\n        .mimeType(VmLanguage.MIME_TYPE)\n        .uri(moduleKey.getUri())\n        .cached(false)\n        .build();\n  }\n\n  public static VmException toVmException(\n      ParserError e, String text, URI moduleUri, String moduleName) {\n    var source =\n        Source.newBuilder(\"pkl\", text, moduleName)\n            .mimeType(VmLanguage.MIME_TYPE)\n            .uri(moduleUri)\n            .cached(false)\n            .build();\n    return toVmException(e, source, moduleName);\n  }\n\n  // wanted to keep Parser/ParserError API free from\n  // Truffle classes (Source), hence put this method here\n  public static VmException toVmException(ParserError e, Source source, String moduleName) {\n    return new VmExceptionBuilder()\n        .adhocEvalError(e.getMessage())\n        .withSourceSection(source.createSection(e.span().charIndex(), e.span().length()))\n        .withMemberName(moduleName)\n        .build();\n  }\n\n  public static @Nullable String exportDocComment(SourceSection @Nullable [] docComment) {\n    if (docComment == null) return null;\n\n    var builder = new StringBuilder();\n    for (var i = 0; i < docComment.length; i++) {\n      if (i > 0) {\n        builder.append(\"\\n\");\n      }\n      var matcher = DOC_COMMENT_LINE_START.matcher(docComment[i].getCharacters());\n      var firstMatch = true;\n      while (matcher.find()) {\n        if (firstMatch) {\n          matcher.appendReplacement(builder, \"\");\n          firstMatch = false;\n        } else {\n          matcher.appendReplacement(builder, \"\\n\");\n        }\n      }\n      matcher.appendTail(builder);\n    }\n    return builder.toString();\n  }\n\n  public static List<PObject> exportAnnotations(List<VmTyped> annotations) {\n    var result = new ArrayList<PObject>(annotations.size());\n    exportAnnotations(annotations, result);\n    return result;\n  }\n\n  public static void exportAnnotations(List<VmTyped> annotations, List<PObject> result) {\n    for (var annotation : annotations) {\n      annotation.force(false);\n      result.add((PObject) annotation.export());\n    }\n  }\n\n  public static List<VmTyped> evaluateAnnotations(\n      VirtualFrame frame, ExpressionNode[] annotationNodes) {\n    var result = new ArrayList<VmTyped>(annotationNodes.length);\n    evaluateAnnotations(frame, annotationNodes, result);\n    return result;\n  }\n\n  @ExplodeLoop\n  public static void evaluateAnnotations(\n      VirtualFrame frame, ExpressionNode[] annotationNodes, List<VmTyped> result) {\n\n    for (var annotationNode : annotationNodes) {\n      var annotation = (VmTyped) annotationNode.executeGeneric(frame);\n      // do not force annotations here because running other code\n      // during class resolution will likely cause evaluation cycles\n      result.add(annotation);\n    }\n  }\n\n  public static int codePointOffsetToCharOffset(String string, long codePointOffset) {\n    return codePointOffsetToCharOffset(string, codePointOffset, 0);\n  }\n\n  @TruffleBoundary\n  public static int codePointOffsetToCharOffset(\n      String string, long codePointOffset, int startIndex) {\n    assert startIndex >= 0;\n    assert startIndex <= string.length();\n\n    var length = string.length();\n    var charOffset = startIndex;\n\n    while (charOffset < length && codePointOffset > 0) {\n      if (Character.isHighSurrogate(string.charAt(charOffset++))\n          && charOffset < length\n          && !Character.isLowSurrogate(string.charAt(charOffset++))) {\n        codePointOffset -= 2;\n      } else {\n        codePointOffset -= 1;\n      }\n    }\n\n    return codePointOffset != 0 ? -1 : charOffset;\n  }\n\n  @TruffleBoundary\n  public static int codePointOffsetFromEndToCharOffset(String string, long codePointOffset) {\n    var charOffset = string.length();\n\n    while (charOffset > 0 && codePointOffset > 0) {\n      if (Character.isLowSurrogate(string.charAt(--charOffset))\n          && charOffset > 0\n          && !Character.isHighSurrogate(string.charAt(--charOffset))) {\n        codePointOffset -= 2;\n      } else {\n        codePointOffset -= 1;\n      }\n    }\n\n    return codePointOffset != 0 ? -1 : charOffset;\n  }\n\n  public static DecimalFormat createDecimalFormat(int fractionDigits) {\n    var format = new DecimalFormat();\n    format.setDecimalFormatSymbols(ROOT_DECIMAL_FORMAT_SYMBOLS);\n    format.setMinimumFractionDigits(fractionDigits);\n    format.setMaximumFractionDigits(fractionDigits);\n    format.setGroupingUsed(false);\n    return format;\n  }\n\n  /** Creates a constant object property that has no corresponding definition in Pkl code. */\n  public static ObjectMember createSyntheticObjectProperty(\n      @Nullable Identifier identifier, String qualifiedName, Object constantValue) {\n    var member =\n        new ObjectMember(\n            unavailableSourceSection(),\n            unavailableSourceSection(),\n            VmModifier.NONE,\n            identifier,\n            qualifiedName);\n    member.initConstantValue(constantValue);\n    return member;\n  }\n\n  /** Creates a constant object entry that has no corresponding definition in Pkl code. */\n  public static ObjectMember createSyntheticObjectEntry(\n      String qualifiedName, Object constantValue) {\n    var member =\n        new ObjectMember(\n            unavailableSourceSection(),\n            unavailableSourceSection(),\n            VmModifier.ENTRY,\n            null,\n            qualifiedName);\n    member.initConstantValue(constantValue);\n    return member;\n  }\n\n  /** Creates a constant object element that has no corresponding definition in Pkl code. */\n  public static ObjectMember createSyntheticObjectElement(\n      String qualifiedName, Object constantValue) {\n    var member =\n        new ObjectMember(\n            unavailableSourceSection(),\n            unavailableSourceSection(),\n            VmModifier.ELEMENT,\n            null,\n            qualifiedName);\n    member.initConstantValue(constantValue);\n    return member;\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  public static ObjectMember createObjectProperty(\n      VmLanguage language,\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      Identifier propertyName,\n      String qualifiedName,\n      FrameDescriptor descriptor,\n      int modifiers,\n      ExpressionNode bodyNode,\n      @Nullable PropertyTypeNode typeNode) {\n\n    var property =\n        new ObjectMember(sourceSection, headerSection, modifiers, propertyName, qualifiedName);\n\n    // can't use ConstantNode for a local typed property\n    // because constant type check wouldn't find the property (type)\n    var isLocalTyped = property.isLocal() && typeNode != null;\n\n    if (bodyNode instanceof ConstantNode constantNode && !isLocalTyped) {\n      property.initConstantValue(constantNode);\n      return property;\n    }\n\n    property.initMemberNode(\n        typeNode != null\n            ? new TypedPropertyNode(language, descriptor, property, bodyNode, typeNode)\n            : property.isLocal()\n                ? new UntypedObjectMemberNode(language, descriptor, property, bodyNode)\n                : TypeCheckedPropertyNodeGen.create(language, descriptor, property, bodyNode));\n\n    return property;\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  public static ObjectMember createLocalObjectProperty(\n      VmLanguage language,\n      SourceSection sourceSection,\n      SourceSection headerSection,\n      Identifier propertyName,\n      String qualifiedName,\n      FrameDescriptor descriptor,\n      int modifiers,\n      ExpressionNode bodyNode,\n      @Nullable UnresolvedTypeNode typeNode) {\n\n    var property =\n        new ObjectMember(sourceSection, headerSection, modifiers, propertyName, qualifiedName);\n\n    // can't use ConstantNode for a local typed property\n    // because constant type check wouldn't find the property (type)\n    var isLocalTyped = property.isLocal() && typeNode != null;\n\n    if (bodyNode instanceof ConstantNode constantNode && !isLocalTyped) {\n      property.initConstantValue(constantNode);\n      return property;\n    }\n\n    property.initMemberNode(\n        typeNode != null\n            ? new LocalTypedPropertyNode(language, descriptor, property, bodyNode, typeNode)\n            : new UntypedObjectMemberNode(language, descriptor, property, bodyNode));\n\n    return property;\n  }\n\n  public static TypeNode[] resolveParameterTypes(\n      VirtualFrame frame, FrameDescriptor descriptor, UnresolvedTypeNode[] parameterTypeNodes) {\n\n    var resolvedNodes = new TypeNode[parameterTypeNodes.length];\n\n    for (var i = 0; i < parameterTypeNodes.length; i++) {\n      var unresolvedNode = parameterTypeNodes[i];\n      var typeNode =\n          unresolvedNode == null\n              ?\n              // resolved parameter type nodes are never null because they have\n              // another function besides type checking, namely setting frame slot\n              new TypeNode.UnknownTypeNode(VmUtils.unavailableSourceSection())\n              : unresolvedNode.execute(frame);\n\n      descriptor.setSlotKind(i, typeNode.getFrameSlotKind());\n      typeNode.initWriteSlotNode(i);\n      resolvedNodes[i] = typeNode;\n    }\n\n    return resolvedNodes;\n  }\n\n  public static void checkIsInstantiable(VmClass parentClass, @Nullable Node parentNode) {\n    if (parentClass.isInstantiable()) return;\n\n    CompilerDirectives.transferToInterpreter();\n\n    if (parentClass.isAbstract()) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotInstantiateAbstractClass\", parentClass)\n          .withOptionalLocation(parentNode)\n          .build();\n    }\n\n    assert parentClass.isExternal();\n    throw new VmExceptionBuilder()\n        .evalError(\"cannotInstantiateExternalClass\", parentClass)\n        .withOptionalLocation(parentNode)\n        .build();\n  }\n\n  @TruffleBoundary\n  public static Pattern compilePattern(String pattern, Node location) {\n    try {\n      return Pattern.compile(pattern, Pattern.UNICODE_CHARACTER_CLASS | Pattern.UNICODE_CASE);\n    } catch (PatternSyntaxException e) {\n      throw new VmExceptionBuilder()\n          .withLocation(location)\n          .evalError(\"invalidRegexSyntax\", pattern, e.getMessage())\n          .build();\n    }\n  }\n\n  @TruffleBoundary\n  public static <K, V> K getKey(Map.Entry<K, V> entry) {\n    return entry.getKey();\n  }\n\n  @TruffleBoundary\n  public static <K, V> V getValue(Map.Entry<K, V> entry) {\n    return entry.getValue();\n  }\n\n  public static String getDisplayUri(SourceSection section, StackFrameTransformer transformer) {\n    var sourceUri = section.getSource().getURI();\n    var frame =\n        new StackFrame(\n            sourceUri.toString(),\n            null,\n            List.of(),\n            section.getStartLine(),\n            section.getStartColumn(),\n            section.getEndLine(),\n            section.getEndColumn());\n    StackFrame transformed = transformer.apply(frame);\n    return transformed.getModuleUri();\n  }\n\n  public static String getDisplayUri(URI moduleUri, StackFrameTransformer transformer) {\n    var frame = new StackFrame(moduleUri.toString(), null, List.of(), 1, 1, 1, 1);\n    StackFrame transformed = transformer.apply(frame);\n    return transformed.getModuleUri();\n  }\n\n  public static StackFrame createStackFrame(SourceSection section, @Nullable String memberName) {\n    var moduleUri = section.getSource().getURI().toString();\n    var startLine = section.getStartLine();\n    var endLine = section.getEndLine();\n\n    var sourceLines = new ArrayList<String>(endLine - startLine + 1);\n    for (var line = startLine; line <= endLine; line++) {\n      sourceLines.add(section.getSource().getCharacters(line).toString());\n    }\n\n    return new StackFrame(\n        moduleUri,\n        memberName,\n        sourceLines,\n        startLine,\n        section.getStartColumn(),\n        endLine,\n        section.getEndColumn());\n  }\n\n  private static Expr parseExpressionNode(String expression, Source source) {\n    try {\n      return new Parser().parseExpressionInput(expression);\n    } catch (ParserError e) {\n      throw VmUtils.toVmException(e, source, REPL_TEXT);\n    }\n  }\n\n  public static Object evaluateExpression(\n      VmTyped module,\n      String expression,\n      SecurityManager securityManager,\n      ModuleResolver moduleResolver) {\n    var syntheticModule = ModuleKeys.synthetic(REPL_TEXT_URI, expression);\n    ResolvedModuleKey resolvedModule;\n    try {\n      resolvedModule = syntheticModule.resolve(securityManager);\n    } catch (IOException e) {\n      throw new UncheckedIOException(e);\n    } catch (SecurityManagerException e) {\n      throw new VmExceptionBuilder().withCause(e).build();\n    }\n    var source = VmUtils.loadSource(resolvedModule);\n    var moduleInfo =\n        new ModuleInfo(\n            source.createSection(0, source.getLength()),\n            VmUtils.unavailableSourceSection(),\n            null,\n            REPL_TEXT,\n            syntheticModule,\n            resolvedModule,\n            false);\n    var language = VmLanguage.get(null);\n    var builder = new AstBuilder(source, language, moduleInfo, moduleResolver);\n    var parsedExpression = parseExpressionNode(expression, source);\n    var exprNode = builder.visitExpr(parsedExpression);\n    var rootNode =\n        new SimpleRootNode(\n            language, new FrameDescriptor(), exprNode.getSourceSection(), \"\", exprNode);\n    var callNode = Truffle.getRuntime().createIndirectCallNode();\n    return callNode.call(rootNode.getCallTarget(), module, module);\n  }\n\n  public static int findCustomThisSlot(VirtualFrame frame) {\n    return frame\n        .getFrameDescriptor()\n        .getAuxiliarySlots()\n        .getOrDefault(CustomThisScope.FRAME_SLOT_ID, -1);\n  }\n\n  @TruffleBoundary\n  public static <K, V> V getMapValue(Map<K, V> map, K key) {\n    return map.get(key);\n  }\n\n  /**\n   * If true, the value computed by this node is not the final value exposed to user code but will\n   * still be amended.\n   *\n   * <p>Used to disable type check for to-be-amended properties. See {@link\n   * org.pkl.core.runtime.VmUtils#SKIP_TYPECHECK_MARKER}. IDEA: might be more appropriate to only\n   * skip constraints check\n   */\n  public static boolean shouldRunTypeCheck(VirtualFrame frame) {\n    return frame.getArguments().length != 4\n        || frame.getArguments()[3] != VmUtils.SKIP_TYPECHECK_MARKER;\n  }\n\n  @TruffleBoundary\n  public static String concat(String str1, String str2) {\n    return str1 + str2;\n  }\n\n  /** Check that a value is a VmTyped and that it inherits from the given class */\n  public static VmTyped checkAmends(Object value, VmClass clazz) {\n    if (!(value instanceof VmTyped typed)) {\n      throw new VmExceptionBuilder().typeMismatch(value, clazz).build();\n    }\n    return checkAmends(typed, clazz);\n  }\n\n  /** Check that a typed value inherits from the given class */\n  public static VmTyped checkAmends(VmTyped value, VmClass clazz) {\n    if (!value.getVmClass().isSubclassOf(clazz)) {\n      throw new VmExceptionBuilder().typeMismatch(value.getVmClass(), clazz).build();\n    }\n    return value;\n  }\n\n  public static boolean isPklBug(VmStackOverflowException e) {\n    // There's no good way to tell if a StackOverflowError came from Pkl, or from our\n    // implementation.\n    // This is a simple heuristic; it's pretty likely that any stack overflow error that occurs\n    // if there's less than 100 truffle frames is due to our own doing.\n    var truffleStackTraceElements = TruffleStackTrace.getStackTrace(e);\n    return truffleStackTraceElements != null && truffleStackTraceElements.size() < 100;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmValue.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport org.pkl.core.util.Nullable;\n\npublic abstract class VmValue {\n  public abstract VmClass getVmClass();\n\n  public VmTyped getPrototype() {\n    return getVmClass().getPrototype();\n  }\n\n  public boolean isPrototype() {\n    return false;\n  }\n\n  public boolean isDynamic() {\n    return this instanceof VmDynamic;\n  }\n\n  public boolean isListing() {\n    return this instanceof VmListing;\n  }\n\n  public boolean isMapping() {\n    return this instanceof VmMapping;\n  }\n\n  public boolean isTyped() {\n    return this instanceof VmTyped;\n  }\n\n  /**\n   * Tells if this value is a {@link VmCollection}, {@link VmListing}, or {@link VmDynamic} with\n   * {@link VmDynamic#hasElements() elements}.\n   */\n  public boolean isSequence() {\n    return false;\n  }\n\n  /** Forces recursive (deep) evaluation of this value. */\n  public abstract void force(boolean allowUndefinedValues);\n\n  public abstract Object export();\n\n  public abstract void accept(VmValueVisitor visitor);\n\n  public abstract <T> T accept(VmValueConverter<T> converter, Iterable<Object> path);\n\n  /** Forces recursive (deep) evaluation of the given value. */\n  public static void force(Object value, boolean allowUndefinedValues) {\n    if (value instanceof VmValue vmValue) {\n      vmValue.force(allowUndefinedValues);\n    }\n  }\n\n  /**\n   * Used to export values other than object member values. Such values aren't `@Nullable` (but can\n   * be `VmNull`).\n   */\n  public static Object export(Object value) {\n    if (value instanceof VmValue vmValue) {\n      return vmValue.export();\n    }\n    return value;\n  }\n\n  /** Used to export object member values. Such values are `null` if they haven't been forced. */\n  public static @Nullable Object exportNullable(@Nullable Object value) {\n    if (value instanceof VmValue vmValue) {\n      return vmValue.export();\n    }\n    return value;\n  }\n\n  /** Enables calling `vmValue.equals()` when not behind a Truffle boundary. */\n  @Override\n  public abstract boolean equals(Object obj);\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmValueConverter.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.util.Pair;\n\npublic interface VmValueConverter<T> {\n  Object WILDCARD_PROPERTY =\n      new Object() {\n        @Override\n        public String toString() {\n          return \"WILDCARD_PROPERTY\";\n        }\n      };\n\n  Object WILDCARD_ELEMENT =\n      new Object() {\n        @Override\n        public String toString() {\n          return \"WILDCARD_ELEMENT\";\n        }\n      };\n\n  Object TOP_LEVEL_VALUE =\n      new Object() {\n        @Override\n        public String toString() {\n          return \"TOP_LEVEL_VALUE\";\n        }\n      };\n\n  T convertString(String value, Iterable<Object> path);\n\n  T convertBoolean(Boolean value, Iterable<Object> path);\n\n  T convertInt(Long value, Iterable<Object> path);\n\n  T convertFloat(Double value, Iterable<Object> path);\n\n  T convertDuration(VmDuration value, Iterable<Object> path);\n\n  T convertDataSize(VmDataSize value, Iterable<Object> path);\n\n  T convertBytes(VmBytes vmBytes, Iterable<Object> path);\n\n  T convertIntSeq(VmIntSeq value, Iterable<Object> path);\n\n  T convertList(VmList value, Iterable<Object> path);\n\n  T convertSet(VmSet value, Iterable<Object> path);\n\n  T convertMap(VmMap value, Iterable<Object> path);\n\n  T convertTyped(VmTyped value, Iterable<Object> path);\n\n  T convertDynamic(VmDynamic value, Iterable<Object> path);\n\n  T convertListing(VmListing value, Iterable<Object> path);\n\n  T convertMapping(VmMapping value, Iterable<Object> path);\n\n  T convertClass(VmClass value, Iterable<Object> path);\n\n  T convertTypeAlias(VmTypeAlias value, Iterable<Object> path);\n\n  T convertNull(VmNull value, Iterable<Object> path);\n\n  T convertPair(VmPair value, Iterable<Object> path);\n\n  T convertRegex(VmRegex value, Iterable<Object> path);\n\n  T convertFunction(VmFunction value, Iterable<Object> path);\n\n  /** Returns with an empty identifier if the second value is a RenderDirective */\n  Pair<Identifier, T> convertProperty(ClassProperty property, Object value, Iterable<Object> path);\n\n  default T convert(Object value, Iterable<Object> path) {\n    if (value instanceof VmValue vmValue) {\n      return vmValue.accept(this, path);\n    }\n    if (value instanceof String string) {\n      return convertString(string, path);\n    }\n    if (value instanceof Boolean b) {\n      return convertBoolean(b, path);\n    }\n    if (value instanceof Long l) {\n      return convertInt(l, path);\n    }\n    if (value instanceof Double d) {\n      return convertFloat(d, path);\n    }\n\n    throw new IllegalArgumentException(\"Cannot convert VM value with unexpected type: \" + value);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmValueRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.util.ArrayDeque;\nimport java.util.Deque;\nimport org.pkl.core.ValueFormatter;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.parser.Lexer;\n\n/**\n * Renders values for use in REPL and error messages. Does not force values to avoid consecutive\n * errors and keep output succinct. (Alternatively it could force and recover from errors.)\n *\n * <p>Currently prints fully qualified class name for outermost object (if rendered value is an\n * object) and omits class names otherwise.\n */\npublic final class VmValueRenderer {\n  private final int lengthLimit;\n  private final String leadingOrTrailingNewline;\n  private final String interiorNewline;\n  private final String indent;\n  private String currIndent = \"\";\n  private static final VmValueRenderer maxSingleLine =\n      new VmValueRenderer(Integer.MAX_VALUE, \" \", \"; \", \"\");\n\n  public static VmValueRenderer singleLine(int lengthLimit) {\n    if (lengthLimit == Integer.MAX_VALUE) {\n      return maxSingleLine;\n    }\n    return new VmValueRenderer(lengthLimit, \" \", \"; \", \"\");\n  }\n\n  public static VmValueRenderer multiLine(int lengthLimit) {\n    return new VmValueRenderer(lengthLimit, \"\\n\", \"\\n\", \"  \");\n  }\n\n  private VmValueRenderer(\n      int lengthLimit, String leadingOrTrailingNewline, String interiorNewline, String indent) {\n    this.lengthLimit = lengthLimit;\n    this.leadingOrTrailingNewline = leadingOrTrailingNewline;\n    this.interiorNewline = interiorNewline;\n    this.indent = indent;\n  }\n\n  public String render(Object value) {\n    var builder = new StringBuilder();\n    render(value, builder);\n    return builder.toString();\n  }\n\n  private void render(Object value, StringBuilder builder) {\n    try {\n      new Visitor(builder).visit(value);\n    } catch (LengthLimitReached ignored) {\n    }\n  }\n\n  private enum Context {\n    EXPLICIT,\n    IMPLICIT\n  }\n\n  private class Visitor implements VmValueVisitor {\n    private final StringBuilder builder;\n    private final int initialLength;\n    private final ValueFormatter valueFormatter;\n\n    private final Deque<Context> contexts = new ArrayDeque<>();\n\n    private Visitor(StringBuilder builder) {\n      this.builder = builder;\n      this.valueFormatter = ValueFormatter.basic();\n      initialLength = builder.length();\n      contexts.push(Context.EXPLICIT);\n    }\n\n    @Override\n    public void visitString(String value) {\n      valueFormatter.formatStringValue(value, \"\", builder);\n      checkLengthLimit();\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      append(value);\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      append(value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      append(value);\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      append(value);\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      append(value);\n    }\n\n    private void renderByteSize(VmDataSize size) {\n      var value = size.getValue();\n      if (value % 1 == 0) {\n        append((int) value);\n      } else if ((value * 10) % 1 == 0) {\n        append(String.format(\"%.1f\", value));\n      } else {\n        append(String.format(\"%.2f\", value));\n      }\n      append(\".\");\n      append(size.getUnit());\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      append(\"Bytes(\");\n      // truncate bytes if over 8 bytes\n      renderByteElems(value, Math.min(value.getLength(), 8));\n      if (value.getLength() > 8) {\n        append(\", ... <total size: \");\n        renderByteSize(value.getSize());\n        append(\">\");\n      }\n      append(\")\");\n    }\n\n    private void renderByteElems(VmBytes value, int limit) {\n      var isFirst = true;\n      var bytes = value.getBytes();\n      for (var i = 0; i < limit; i++) {\n        if (isFirst) {\n          isFirst = false;\n        } else {\n          append(\", \");\n        }\n        append(Byte.toUnsignedInt(bytes[i]));\n      }\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      append(\"Pair(\");\n      visit(value.getFirst());\n      append(\", \");\n      visit(value.getSecond());\n      append(')');\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      append(value);\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      append(value);\n    }\n\n    @Override\n    public void visitList(VmList value) {\n      doVisitCollection(value, \"List(\");\n    }\n\n    @Override\n    public void visitSet(VmSet value) {\n      doVisitCollection(value, \"Set(\");\n    }\n\n    @Override\n    public void visitMap(VmMap value) {\n      contexts.push(Context.EXPLICIT);\n\n      append(\"Map(\");\n      var isFirst = true;\n      for (var entry : value) {\n        if (isFirst) {\n          isFirst = false;\n        } else {\n          append(\", \");\n        }\n\n        visit(entry.getKey());\n\n        append(\", \");\n\n        visit(entry.getValue());\n      }\n      append(')');\n\n      contexts.pop();\n    }\n\n    @Override\n    public void visitDynamic(VmDynamic value) {\n      var context = contexts.peek();\n\n      if (context == Context.EXPLICIT) {\n        append(\"new Dynamic \");\n      }\n\n      doVisitObject(value);\n    }\n\n    @Override\n    public void visitTyped(VmTyped value) {\n      writeClassName(value);\n      doVisitObject(value);\n    }\n\n    @Override\n    public void visitListing(VmListing value) {\n      var context = contexts.peek();\n\n      if (context == Context.EXPLICIT) {\n        append(\"new Listing \");\n      }\n\n      doVisitObject(value);\n    }\n\n    @Override\n    public void visitMapping(VmMapping value) {\n      var context = contexts.peek();\n\n      if (context == Context.EXPLICIT) {\n        append(\"new Mapping \");\n      }\n\n      doVisitObject(value);\n    }\n\n    @Override\n    public void visitFunction(VmFunction value) {\n      writeClassName(value);\n      append(\"{}\");\n    }\n\n    @Override\n    public void visitClass(VmClass value) {\n      append(value);\n    }\n\n    @Override\n    public void visitTypeAlias(VmTypeAlias value) {\n      append(value);\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      append(\"null\");\n    }\n\n    private void append(Object value) {\n      builder.append(value);\n      checkLengthLimit();\n    }\n\n    private void checkLengthLimit() {\n      if (builder.length() - initialLength < lengthLimit) return;\n\n      builder.delete(lengthLimit - 3, builder.length());\n      builder.append(\"...\");\n      throw new LengthLimitReached();\n    }\n\n    private void doVisitCollection(VmCollection collection, String prefix) {\n      contexts.push(Context.EXPLICIT);\n\n      append(prefix);\n      var isFirst = true;\n      for (var elem : collection) {\n        if (isFirst) {\n          isFirst = false;\n        } else {\n          append(\", \");\n        }\n        visit(elem);\n      }\n      append(')');\n\n      contexts.pop();\n    }\n\n    private void doVisitObject(VmObjectLike object) {\n      append('{');\n      var lengthAfterOpeningDelimiter = builder.length();\n\n      currIndent += indent;\n\n      var isEmpty = new MutableBoolean(true);\n      object.iterateMemberValues(\n          (key, member, value) -> {\n            // don't render type definitions\n            if (member.isClass() || member.isTypeAlias()) return true;\n\n            if (isEmpty.get()) {\n              append(leadingOrTrailingNewline);\n              isEmpty.set(false);\n            }\n\n            append(currIndent);\n\n            if (member.isProp()) {\n              contexts.push(Context.IMPLICIT);\n              writeIdentifier(key.toString());\n              if (value instanceof VmObjectLike) {\n                append(' ');\n              } else {\n                append(\" = \");\n              }\n            } else if (member.isElement()) {\n              contexts.push(Context.EXPLICIT);\n            } else {\n              assert member.isEntry();\n              contexts.push(Context.EXPLICIT);\n              append('[');\n              visit(key);\n              append(']');\n              contexts.pop();\n              contexts.push(Context.IMPLICIT);\n              if (value instanceof VmObjectLike) {\n                append(' ');\n              } else {\n                append(\" = \");\n              }\n            }\n\n            if (value == null) { // not forced\n              append('?');\n            } else {\n              visit(value);\n            }\n\n            contexts.pop();\n            append(interiorNewline);\n            return true;\n          });\n\n      if (!isEmpty.get()) {\n        // replace last interiorNewline with leadingOrTrailingNewline\n        builder.delete(builder.length() - interiorNewline.length(), builder.length());\n        append(leadingOrTrailingNewline);\n      }\n\n      currIndent = currIndent.substring(0, currIndent.length() - indent.length());\n      if (builder.length() > lengthAfterOpeningDelimiter) {\n        append(currIndent);\n      }\n      append('}');\n    }\n\n    private void writeClassName(VmValue value) {\n      var context = contexts.peek();\n      if (context == Context.IMPLICIT) return;\n\n      VmClass clazz = value.getVmClass();\n      append(\"new \");\n      append(clazz.getSimpleName());\n      append(' ');\n    }\n\n    private void writeIdentifier(String identifier) {\n      if (Lexer.isRegularIdentifier(identifier)) {\n        append(identifier);\n      } else {\n        append('`');\n        append(identifier);\n        append('`');\n      }\n    }\n  }\n\n  private static final class LengthLimitReached extends RuntimeException {\n    @Override\n    public Throwable fillInStackTrace() {\n      return this;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmValueTracker.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.instrumentation.EventBinding;\nimport com.oracle.truffle.api.instrumentation.ExecutionEventNode;\nimport com.oracle.truffle.api.instrumentation.ExecutionEventNodeFactory;\nimport com.oracle.truffle.api.instrumentation.Instrumenter;\nimport com.oracle.truffle.api.instrumentation.SourceSectionFilter;\nimport com.oracle.truffle.api.nodes.Node;\nimport java.util.ArrayList;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmValueTracker implements AutoCloseable {\n\n  private final EventBinding<ExecutionEventNodeFactory> binding;\n  private final VmLocalContext localContext;\n\n  private final Map<Node, List<Object>> values = new IdentityHashMap<>();\n\n  public VmValueTracker(Instrumenter instrumenter, VmLocalContext localContext) {\n    this.localContext = localContext;\n    localContext.enterTracker();\n    binding =\n        instrumenter.attachExecutionEventFactory(\n            SourceSectionFilter.newBuilder().tagIs(PklTags.Expression.class).build(),\n            context ->\n                new ExecutionEventNode() {\n                  @Override\n                  @TruffleBoundary\n                  protected void onReturnValue(VirtualFrame frame, @Nullable Object result) {\n                    if (result == null) {\n                      return;\n                    }\n                    var node = context.getInstrumentedNode();\n                    var myValues = values.getOrDefault(node, new ArrayList<>());\n                    myValues.add(result);\n                    values.put(node, myValues);\n                  }\n                });\n  }\n\n  public Map<Node, List<Object>> values() {\n    return values;\n  }\n\n  @Override\n  public void close() {\n    localContext.exitTracker();\n    binding.dispose();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmValueTrackerFactory.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.instrumentation.Instrumenter;\n\npublic final class VmValueTrackerFactory {\n\n  private final Instrumenter instrumenter;\n  private final VmLanguage language;\n\n  public VmValueTrackerFactory(Instrumenter instrumenter, VmLanguage language) {\n    this.instrumenter = instrumenter;\n    this.language = language;\n  }\n\n  @TruffleBoundary\n  public VmValueTracker create() {\n    return new VmValueTracker(instrumenter, language.localContext.get());\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmValueVisitor.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport java.util.Objects;\n\npublic interface VmValueVisitor {\n  void visitString(String value);\n\n  void visitBoolean(Boolean value);\n\n  void visitInt(Long value);\n\n  void visitFloat(Double value);\n\n  void visitDuration(VmDuration value);\n\n  void visitDataSize(VmDataSize value);\n\n  void visitBytes(VmBytes value);\n\n  void visitIntSeq(VmIntSeq value);\n\n  void visitList(VmList value);\n\n  void visitSet(VmSet value);\n\n  void visitMap(VmMap value);\n\n  void visitTyped(VmTyped value);\n\n  void visitDynamic(VmDynamic value);\n\n  void visitListing(VmListing value);\n\n  void visitMapping(VmMapping value);\n\n  void visitClass(VmClass value);\n\n  void visitTypeAlias(VmTypeAlias value);\n\n  void visitPair(VmPair value);\n\n  void visitRegex(VmRegex value);\n\n  void visitNull(VmNull value);\n\n  void visitFunction(VmFunction value);\n\n  default void visit(Object value) {\n    Objects.requireNonNull(value, \"Value to be visited must be non-null.\");\n\n    if (value instanceof VmValue vmValue) {\n      vmValue.accept(this);\n    } else if (value instanceof String string) {\n      visitString(string);\n    } else if (value instanceof Boolean b) {\n      visitBoolean(b);\n    } else if (value instanceof Long l) {\n      visitInt(l);\n    } else if (value instanceof Double d) {\n      visitFloat(d);\n    } else {\n      throw new IllegalArgumentException(\"Unknown VM value type: \" + value.getClass().getName());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/VmWrappedEvalException.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CallTarget;\nimport com.oracle.truffle.api.nodes.Node;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.BiConsumer;\nimport org.pkl.core.StackFrame;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.Nullable;\n\npublic class VmWrappedEvalException extends VmEvalException {\n\n  private final VmException wrappedException;\n\n  public VmWrappedEvalException(\n      @Nullable String message,\n      @Nullable Throwable cause,\n      boolean isExternalMessage,\n      Object[] messageArguments,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> messageBuilder,\n      List<ProgramValue> programValues,\n      @Nullable Node location,\n      @Nullable SourceSection sourceSection,\n      @Nullable String memberName,\n      @Nullable BiConsumer<AnsiStringBuilder, Boolean> hintBuilder,\n      Map<CallTarget, StackFrame> insertedStackFrames,\n      VmException wrappedException) {\n    super(\n        message,\n        cause,\n        isExternalMessage,\n        messageArguments,\n        messageBuilder,\n        programValues,\n        location,\n        sourceSection,\n        memberName,\n        hintBuilder,\n        insertedStackFrames);\n    this.wrappedException = wrappedException;\n  }\n\n  public VmException getWrappedException() {\n    return wrappedException;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/XmlModule.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.net.URI;\n\npublic final class XmlModule extends StdLibModule {\n  private static final VmTyped instance = VmUtils.createEmptyModule();\n\n  static {\n    loadModule(URI.create(\"pkl:xml\"), instance);\n  }\n\n  public static VmTyped getModule() {\n    return instance;\n  }\n\n  public static VmClass getInlineClass() {\n    return InlineClass.instance;\n  }\n\n  public static VmClass getCommentClass() {\n    return CommentClass.instance;\n  }\n\n  public static VmClass getCDataClass() {\n    return CDataClass.instance;\n  }\n\n  private static final class InlineClass {\n    static final VmClass instance = loadClass(\"Inline\");\n  }\n\n  private static final class CommentClass {\n    static final VmClass instance = loadClass(\"Comment\");\n  }\n\n  private static final class CDataClass {\n    static final VmClass instance = loadClass(\"CData\");\n  }\n\n  @TruffleBoundary\n  private static VmClass loadClass(String className) {\n    var theModule = getModule();\n    return (VmClass) VmUtils.readMember(theModule, Identifier.get(className));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/runtime/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.runtime;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/service/ExecutorSpiImpl.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.service;\n\nimport static org.pkl.core.module.ProjectDependenciesManager.PKL_PROJECT_FILENAME;\n\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.util.Collections;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.pkl.core.*;\nimport org.pkl.core.http.HttpClient;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.module.ModulePathResolver;\nimport org.pkl.core.project.Project;\nimport org.pkl.core.resource.ResourceReaders;\nimport org.pkl.executor.spi.v1.ExecutorSpi;\nimport org.pkl.executor.spi.v1.ExecutorSpiException;\nimport org.pkl.executor.spi.v1.ExecutorSpiOptions;\nimport org.pkl.executor.spi.v1.ExecutorSpiOptions2;\nimport org.pkl.executor.spi.v1.ExecutorSpiOptions3;\n\npublic final class ExecutorSpiImpl implements ExecutorSpi {\n  private static final int MAX_HTTP_CLIENTS = 3;\n\n  // Don't create a new HTTP client for every executor request.\n  // Instead, keep a cache of up to MAX_HTTP_CLIENTS clients.\n  // A cache size of 1 should be common.\n  private final Map<HttpClientKey, HttpClient> httpClients;\n\n  private final String pklVersion = Release.current().version().toString();\n\n  public ExecutorSpiImpl() {\n    // only LRU cache available in JDK\n    var map =\n        new LinkedHashMap<HttpClientKey, HttpClient>(8, 0.75f, true) {\n          @Override\n          protected boolean removeEldestEntry(Entry<HttpClientKey, HttpClient> eldest) {\n            return size() > MAX_HTTP_CLIENTS;\n          }\n        };\n    httpClients = Collections.synchronizedMap(map);\n  }\n\n  @Override\n  public String getPklVersion() {\n    return pklVersion;\n  }\n\n  @Override\n  public String evaluatePath(Path modulePath, ExecutorSpiOptions options) {\n    var allowedModules =\n        options.getAllowedModules().stream().map(Pattern::compile).collect(Collectors.toList());\n\n    var allowedResources =\n        options.getAllowedResources().stream().map(Pattern::compile).collect(Collectors.toList());\n\n    var securityManager =\n        SecurityManagers.standard(\n            allowedModules,\n            allowedResources,\n            SecurityManagers.defaultTrustLevels,\n            options.getRootDir());\n\n    var transformer = StackFrameTransformers.defaultTransformer;\n    if (options.getRootDir() != null) {\n      transformer =\n          transformer.andThen(\n              StackFrameTransformers.relativizeModuleUri(options.getRootDir().toUri()));\n    }\n\n    var resolver = new ModulePathResolver(options.getModulePath());\n\n    var builder =\n        EvaluatorBuilder.unconfigured()\n            .setStackFrameTransformer(transformer)\n            .setSecurityManager(securityManager)\n            .setHttpClient(getOrCreateHttpClient(options))\n            .addResourceReader(ResourceReaders.environmentVariable())\n            .addResourceReader(ResourceReaders.externalProperty())\n            .addResourceReader(ResourceReaders.modulePath(resolver))\n            .addResourceReader(ResourceReaders.pkg())\n            .addResourceReader(ResourceReaders.projectpackage())\n            .addResourceReader(ResourceReaders.file())\n            .addResourceReader(ResourceReaders.http())\n            .addResourceReader(ResourceReaders.https())\n            .addModuleKeyFactory(ModuleKeyFactories.standardLibrary)\n            .addModuleKeyFactories(ModuleKeyFactories.fromServiceProviders())\n            .addModuleKeyFactory(ModuleKeyFactories.modulePath(resolver))\n            .addModuleKeyFactory(ModuleKeyFactories.pkg)\n            .addModuleKeyFactory(ModuleKeyFactories.projectpackage)\n            .addModuleKeyFactory(ModuleKeyFactories.file)\n            .addModuleKeyFactory(ModuleKeyFactories.http)\n            .addModuleKeyFactory(ModuleKeyFactories.genericUrl)\n            .setEnvironmentVariables(options.getEnvironmentVariables())\n            .setExternalProperties(options.getExternalProperties())\n            .setTimeout(options.getTimeout())\n            .setOutputFormat(options.getOutputFormat())\n            .setModuleCacheDir(options.getModuleCacheDir());\n\n    try {\n      if (options.getProjectDir() != null) {\n        var project =\n            Project.loadFromPath(\n                options.getProjectDir().resolve(PKL_PROJECT_FILENAME),\n                securityManager,\n                null,\n                transformer,\n                options.getEnvironmentVariables());\n        builder.setProjectDependencies(project.getDependencies());\n      }\n\n      try (var evaluator = builder.build()) {\n        return evaluator.evaluateOutputText(ModuleSource.path(modulePath));\n      }\n    } catch (PklException e) {\n      throw new ExecutorSpiException(e.getMessage(), e.getCause());\n    } finally {\n      Closeables.closeQuietly(builder.getModuleKeyFactories());\n      Closeables.closeQuietly(builder.getResourceReaders());\n    }\n  }\n\n  private HttpClient getOrCreateHttpClient(ExecutorSpiOptions options) {\n    List<Path> certificateFiles;\n    List<byte[]> certificateBytes;\n    Map<URI, URI> rewrites;\n    int testPort;\n    try {\n      if (options instanceof ExecutorSpiOptions3 options3) {\n        rewrites = options3.getHttpRewrites();\n      } else {\n        rewrites = Map.of();\n      }\n      if (options instanceof ExecutorSpiOptions2 options2) {\n        certificateFiles = options2.getCertificateFiles();\n        certificateBytes = options2.getCertificateBytes();\n        testPort = options2.getTestPort();\n      } else {\n        certificateFiles = List.of();\n        certificateBytes = List.of();\n        testPort = -1;\n      }\n      // host pkl-executor does not have class ExecutorOptions2/ExecutorOptions3 defined.\n      // this will happen if the pkl-executor distribution is too old.\n    } catch (NoClassDefFoundError e) {\n      certificateFiles = List.of();\n      certificateBytes = List.of();\n      rewrites = Map.of();\n      testPort = -1;\n    }\n    var clientKey = new HttpClientKey(certificateFiles, certificateBytes, testPort, rewrites);\n    return httpClients.computeIfAbsent(\n        clientKey,\n        (key) -> {\n          var builder = HttpClient.builder();\n          for (var path : key.certificateFiles) {\n            builder.addCertificates(path);\n          }\n          for (var bytes : key.certificateBytes) {\n            builder.addCertificates(bytes);\n          }\n          builder.setRewrites(key.rewrites);\n          builder.setTestPort(key.testPort);\n          // If the above didn't add any certificates,\n          // builder will use the JVM's default SSL context.\n          return builder.buildLazily();\n        });\n  }\n\n  private record HttpClientKey(\n      List<Path> certificateFiles,\n      List<byte[]> certificateBytes,\n      int testPort,\n      Map<URI, URI> rewrites) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/settings/PklSettings.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.settings;\n\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.List;\nimport java.util.regex.Pattern;\nimport org.pkl.core.*;\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings;\nimport org.pkl.core.module.ModuleKeyFactories;\nimport org.pkl.core.resource.ResourceReaders;\nimport org.pkl.core.runtime.VmEvalException;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Java representation of a Pkl settings file. A Pkl settings file is a Pkl module amending the\n * {@literal pkl.settings} standard library module. To load a settings file, use one of the static\n * {@code load} methods.\n */\n// keep in sync with stdlib/settings.pkl\npublic record PklSettings(Editor editor, @Nullable PklEvaluatorSettings.Http http) {\n  private static final List<Pattern> ALLOWED_MODULES =\n      List.of(Pattern.compile(\"pkl:\"), Pattern.compile(\"file:\"));\n\n  private static final List<Pattern> ALLOWED_RESOURCES =\n      List.of(Pattern.compile(\"env:\"), Pattern.compile(\"file:\"));\n\n  /**\n   * Loads the user settings file ({@literal ~/.pkl/settings.pkl}). If this file does not exist,\n   * returns default settings defined by module {@literal pkl.settings}.\n   */\n  public static PklSettings loadFromPklHomeDir() throws VmEvalException {\n    return loadFromPklHomeDir(IoUtils.getPklHomeDir());\n  }\n\n  /** For testing only. */\n  static PklSettings loadFromPklHomeDir(Path pklHomeDir) throws VmEvalException {\n    var path = pklHomeDir.resolve(\"settings.pkl\");\n    return Files.exists(path)\n        ? load(ModuleSource.path(path))\n        : new PklSettings(Editor.SYSTEM, null);\n  }\n\n  /** Loads a settings file from the given path. */\n  public static PklSettings load(ModuleSource moduleSource) throws VmEvalException {\n    try (var evaluator =\n        EvaluatorBuilder.unconfigured()\n            .setSecurityManager(\n                SecurityManagers.standard(\n                    ALLOWED_MODULES, ALLOWED_RESOURCES, SecurityManagers.defaultTrustLevels, null))\n            .setStackFrameTransformer(StackFrameTransformers.defaultTransformer)\n            .addModuleKeyFactory(ModuleKeyFactories.standardLibrary)\n            .addModuleKeyFactory(ModuleKeyFactories.file)\n            .addResourceReader(ResourceReaders.environmentVariable())\n            .addEnvironmentVariables(System.getenv())\n            .build()) {\n      var module = evaluator.evaluateOutputValueAs(moduleSource, PClassInfo.Settings);\n      return parseSettings(module, moduleSource);\n    }\n  }\n\n  private static PklSettings parseSettings(PObject module, ModuleSource location)\n      throws VmEvalException {\n\n    if (!(module.getPropertyOrNull(\"editor\") instanceof PObject pObject)\n        || !(pObject.getPropertyOrNull(\"urlScheme\") instanceof String str)) {\n      throw new VmExceptionBuilder().evalError(\"invalidSettingsFile\", location.getUri()).build();\n    }\n    var editor = new Editor(str);\n    var httpSettings = PklEvaluatorSettings.Http.parse((Value) module.getProperty(\"http\"));\n    return new PklSettings(editor, httpSettings);\n  }\n\n  /**\n   * Returns the editor for viewing and editing Pkl files.\n   *\n   * <p>This method is deprecated, use {@link #editor()} instead.\n   */\n  @Deprecated(forRemoval = true)\n  public Editor getEditor() {\n    return editor;\n  }\n\n  /** An editor for viewing and editing Pkl files. */\n  public record Editor(String urlScheme) {\n    /** The editor associated with {@code file:} URLs ending in {@code .pkl}. */\n    public static final Editor SYSTEM = new Editor(\"%{url}, line %{line}\");\n\n    /** The <a href=\"https://www.jetbrains.com/idea\">IntelliJ IDEA</a> editor. */\n    public static final Editor IDEA = new Editor(\"idea://open?file=%{path}&line=%{line}\");\n\n    /** The <a href=\"https://macromates.com\">TextMate</a> editor. */\n    public static final Editor TEXT_MATE =\n        new Editor(\"txmt://open?url=%{url}&line=%{line}&column=%{column}\");\n\n    /** The <a href=\"https://www.sublimetext.com\">Sublime Text</a> editor. */\n    public static final Editor SUBLIME =\n        new Editor(\"subl://open?url=%{url}&line=%{line}&column=%{column}\");\n\n    /** The <a href=\"https://atom.io\">Atom</a> editor. */\n    public static final Editor ATOM =\n        new Editor(\"atom://open?url=%{url}&line=%{line}&column=%{column}\");\n\n    /** The <a href=\"https://code.visualstudio.com\">Visual Studio Code</a> editor. */\n    public static final Editor VS_CODE = new Editor(\"vscode://file/%{path}:%{line}:%{column}\");\n\n    /**\n     * Returns the URL scheme for opening files in this editor. The following placeholders are\n     * supported: {@code %{url}}, {@code %{path}}, {@code %{line}}, {@code %{column}}.\n     *\n     * <p>This method is deprecated; use {@link #urlScheme()} instead.\n     */\n    @Deprecated(forRemoval = true)\n    public String getUrlScheme() {\n      return urlScheme;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/settings/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.settings;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/AbstractRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.ArrayDeque;\nimport java.util.Deque;\nimport java.util.List;\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmCollection;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTypeAlias;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUndefinedValueException;\nimport org.pkl.core.runtime.VmValue;\nimport org.pkl.core.runtime.VmValueConverter;\nimport org.pkl.core.runtime.VmValueVisitor;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.core.util.Nullable;\n\npublic abstract class AbstractRenderer implements VmValueVisitor {\n\n  /** The name of this renderer. */\n  protected final String name;\n\n  protected final PklConverter converter;\n\n  /** Whether to skip visiting properties with null value (after conversion). */\n  private final boolean skipNullProperties;\n\n  /** Whether to skip visiting entries with null value (after conversion). */\n  private final boolean skipNullEntries;\n\n  @LateInit protected Deque<Object> currPath;\n\n  /** The value passed to either {@link #renderDocument(Object)} or {@link #renderValue(Object)}. */\n  @LateInit private Object topLevelValue;\n\n  /** The value directly enclosing the currently visited value, if any. */\n  protected @Nullable VmValue enclosingValue;\n\n  /** The (closest) {@link SourceSection} of the value being visited, for better error messages. */\n  protected @Nullable SourceSection currSourceSection = null;\n\n  protected AbstractRenderer(\n      String name, PklConverter converter, boolean skipNullProperties, boolean skipNullEntries) {\n    this.name = name;\n    this.converter = converter;\n    this.skipNullProperties = skipNullProperties;\n    this.skipNullEntries = skipNullEntries;\n  }\n\n  protected boolean isRenderDirective(VmValue value) {\n    return value.getVmClass() == BaseModule.getRenderDirectiveClass();\n  }\n\n  protected boolean isRenderDirective(Object value) {\n    return value instanceof VmTyped typed && isRenderDirective(typed);\n  }\n\n  public final void renderDocument(Object value) {\n    currPath = new ArrayDeque<>();\n    currPath.push(VmValueConverter.TOP_LEVEL_VALUE);\n    var converted = converter.convert(value, currPath);\n    this.topLevelValue = converted;\n    try {\n      visitDocument(converted);\n    } catch (VmException err) {\n      if (converted != value) {\n        err.setHint(\n            String.format(\n                \"This value was converted during rendering. Previous: %s. After: %s.\",\n                new VmException.ProgramValue(\"before\", value),\n                new VmException.ProgramValue(\"after\", converted)));\n        throw err;\n      }\n      throw err;\n    }\n  }\n\n  public final void renderValue(Object value) {\n    currPath = new ArrayDeque<>();\n    currPath.push(VmValueConverter.TOP_LEVEL_VALUE);\n    var converted = converter.convert(value, currPath);\n    this.topLevelValue = converted;\n    visitTopLevelValue(converted);\n  }\n\n  @Override\n  public void visit(Object value) {\n    try {\n      VmValueVisitor.super.visit(value);\n    } catch (VmUndefinedValueException e) {\n      // Only fill in the path if rendering the leaf member that threw the error. We know we are\n      // at a leaf if the error's receiver is the same as `value`.\n      if (e.getReceiver() == value) {\n        throw e.fillInHint(currPath, topLevelValue);\n      }\n      throw e;\n    }\n  }\n\n  protected abstract void visitDocument(Object value);\n\n  protected abstract void visitTopLevelValue(Object value);\n\n  /**\n   * Perform logic for rendering a render directive. Render directives should be rendered verbatim.\n   */\n  protected abstract void visitRenderDirective(VmTyped value);\n\n  protected abstract void startDynamic(VmDynamic value);\n\n  protected abstract void startTyped(VmTyped value);\n\n  protected abstract void startListing(VmListing value);\n\n  protected abstract void startMapping(VmMapping value);\n\n  protected abstract void startList(VmList value);\n\n  protected abstract void startSet(VmSet value);\n\n  protected abstract void startMap(VmMap value);\n\n  /**\n   * Visits an element of a {@link VmDynamic}, {@link VmListing}, {@link VmList}, or {@link VmSet}.\n   */\n  protected abstract void visitElement(long index, Object value, boolean isFirst);\n\n  /** Visits an entry key of a {@link VmDynamic}, {@link VmMapping}, or {@link VmMap}. */\n  protected abstract void visitEntryKey(Object key, boolean isFirst);\n\n  /** Visits an entry value of a {@link VmDynamic}, {@link VmMapping}, or {@link VmMap}. */\n  protected abstract void visitEntryValue(Object value);\n\n  /** Visits a property of a {@link VmDynamic} or {@link VmTyped}. */\n  protected abstract void visitProperty(Identifier name, Object value, boolean isFirst);\n\n  protected abstract void endDynamic(VmDynamic value, boolean isEmpty);\n\n  protected abstract void endTyped(VmTyped value, boolean isEmpty);\n\n  protected abstract void endListing(VmListing value, boolean isEmpty);\n\n  protected abstract void endMapping(VmMapping value, boolean isEmpty);\n\n  protected abstract void endList(VmList value);\n\n  protected abstract void endSet(VmSet value);\n\n  protected abstract void endMap(VmMap value);\n\n  @Override\n  public void visitTyped(VmTyped value) {\n    // value.getParent().getMember(value);\n    if (isRenderDirective(value)) {\n      visitRenderDirective(value);\n      return;\n    }\n\n    value.force(false, false);\n    startTyped(value);\n\n    var prevEnclosingValue = enclosingValue;\n    enclosingValue = value;\n    var isFirst = new MutableBoolean(true);\n\n    value.iterateAlreadyForcedMemberValues(\n        (memberKey, member, memberValue) -> {\n          if (member.isClass() || member.isTypeAlias()) return true;\n          assert member.isProp();\n          doVisitProperty(\n              (Identifier) memberKey,\n              memberValue,\n              value.getVmClass().getProperty((Identifier) memberKey),\n              member.getSourceSection(),\n              isFirst);\n          return true;\n        });\n\n    enclosingValue = prevEnclosingValue;\n    endTyped(value, isFirst.get());\n  }\n\n  @Override\n  public final void visitDynamic(VmDynamic value) {\n    value.force(false, false);\n    startDynamic(value);\n\n    var prevEnclosingValue = enclosingValue;\n    enclosingValue = value;\n    var isFirst = new MutableBoolean(true);\n    var canRenderPropertyOrEntry = canRenderPropertyOrEntryOf(value);\n\n    value.iterateAlreadyForcedMemberValues(\n        (memberKey, member, memberValue) -> {\n          var sourceSection = member.getSourceSection();\n          if (member.isProp()) {\n            if (!canRenderPropertyOrEntry) cannotRenderObjectWithElementsAndOtherMembers(value);\n            doVisitProperty((Identifier) memberKey, memberValue, null, sourceSection, isFirst);\n          } else if (member.isEntry()) {\n            if (!canRenderPropertyOrEntry) cannotRenderObjectWithElementsAndOtherMembers(value);\n            doVisitEntry(memberKey, memberValue, sourceSection, isFirst);\n          } else {\n            doVisitElement((long) memberKey, memberValue, sourceSection, isFirst.getAndSetFalse());\n          }\n          return true;\n        });\n\n    enclosingValue = prevEnclosingValue;\n    endDynamic(value, isFirst.get());\n  }\n\n  protected boolean canRenderPropertyOrEntryOf(VmDynamic object) {\n    return !object.hasElements();\n  }\n\n  private void cannotRenderObjectWithElementsAndOtherMembers(VmDynamic object) {\n    throw new VmExceptionBuilder()\n        .evalError(\"cannotRenderObjectWithElementsAndOtherMembers\", name)\n        .withProgramValue(\"Object\", object)\n        .build();\n  }\n\n  @Override\n  public final void visitListing(VmListing value) {\n    value.force(false, false);\n    startListing(value);\n\n    var prevEnclosingValue = enclosingValue;\n    enclosingValue = value;\n    var isFirst = new MutableBoolean(true);\n\n    value.iterateAlreadyForcedMemberValues(\n        (memberKey, member, memberValue) -> {\n          assert member.isElement();\n          doVisitElement(\n              (long) memberKey, memberValue, member.getSourceSection(), isFirst.getAndSetFalse());\n          return true;\n        });\n\n    enclosingValue = prevEnclosingValue;\n    endListing(value, isFirst.get());\n  }\n\n  @Override\n  public final void visitMapping(VmMapping value) {\n    value.force(false, false);\n    startMapping(value);\n\n    var prevEnclosingValue = enclosingValue;\n    enclosingValue = value;\n    var isFirst = new MutableBoolean(true);\n\n    value.iterateAlreadyForcedMemberValues(\n        (memberKey, member, memberValue) -> {\n          assert member.isEntry();\n          doVisitEntry(memberKey, memberValue, member.getSourceSection(), isFirst);\n          return true;\n        });\n\n    enclosingValue = prevEnclosingValue;\n    endMapping(value, isFirst.get());\n  }\n\n  @Override\n  public final void visitList(VmList value) {\n    startList(value);\n    doVisitCollectionElements(value);\n    endList(value);\n  }\n\n  @Override\n  public final void visitSet(VmSet value) {\n    startSet(value);\n    doVisitCollectionElements(value);\n    endSet(value);\n  }\n\n  private void doVisitCollectionElements(VmCollection value) {\n    var prevEnclosingValue = enclosingValue;\n    enclosingValue = value;\n    var index = 0L;\n\n    for (var elem : value) {\n      doVisitElement(index, elem, null, index == 0);\n      index += 1;\n    }\n\n    enclosingValue = prevEnclosingValue;\n  }\n\n  @Override\n  public final void visitMap(VmMap value) {\n    startMap(value);\n    var prevEnclosingValue = enclosingValue;\n    enclosingValue = value;\n    var isFirst = new MutableBoolean(true);\n\n    for (var entry : value) {\n      doVisitEntry(entry.getKey(), entry.getValue(), null, isFirst);\n    }\n\n    enclosingValue = prevEnclosingValue;\n    endMap(value);\n  }\n\n  private void doVisitProperty(\n      Identifier name,\n      Object value,\n      @Nullable ClassProperty classProperty,\n      SourceSection sourceSection,\n      MutableBoolean isFirst) {\n    var prevSourceSection = currSourceSection;\n    currSourceSection = sourceSection;\n    currPath.push(name);\n    if (classProperty != null) {\n      var propVal = converter.convertProperty(classProperty, value, currPath);\n      name = propVal.getFirst();\n      value = propVal.getSecond();\n    }\n    var convertedValue = converter.convert(value, currPath);\n    if (!(skipNullProperties && convertedValue instanceof VmNull)) {\n      visitProperty(name, convertedValue, isFirst.getAndSetFalse());\n    }\n    currPath.pop();\n    currSourceSection = prevSourceSection;\n  }\n\n  private void doVisitEntry(\n      Object key, Object value, @Nullable SourceSection sourceSection, MutableBoolean isFirst) {\n    var prevSourceSection = currSourceSection;\n    if (sourceSection != null) {\n      currSourceSection = sourceSection;\n    }\n    var valuePath = currPath;\n    try {\n      var convertedKey = converter.convert(key, List.of());\n      valuePath.push(convertedKey);\n      var convertedValue = converter.convert(value, valuePath);\n      if (skipNullEntries && (convertedValue instanceof VmNull)) {\n        return;\n      }\n\n      visitEntryKeyValue(convertedKey, isFirst.getAndSetFalse(), valuePath, convertedValue);\n    } finally {\n      valuePath.pop();\n      currSourceSection = prevSourceSection;\n    }\n  }\n\n  protected void visitEntryKeyValue(\n      Object key, boolean isFirst, Deque<Object> valuePath, Object value) {\n    currPath = new ArrayDeque<>();\n    visitEntryKey(key, isFirst);\n    currPath = valuePath;\n    visitEntryValue(value);\n  }\n\n  private void doVisitElement(\n      long index, Object value, @Nullable SourceSection sourceSection, boolean isFirst) {\n    var prevSourceSection = currSourceSection;\n    if (sourceSection != null) {\n      currSourceSection = sourceSection;\n    }\n    currPath.push(index);\n    var convertedValue = converter.convert(value, currPath);\n    visitElement(index, convertedValue, isFirst);\n    currPath.pop();\n    currSourceSection = prevSourceSection;\n  }\n\n  protected void cannotRenderTypeAddConverter(VmValue value) {\n    var builder =\n        new VmExceptionBuilder()\n            .evalError(\"cannotRenderTypeAddConverter\", value.getVmClass(), name)\n            .withProgramValue(\"Value\", value);\n    if (currSourceSection != null) {\n      builder.withSourceSection(currSourceSection);\n    }\n    throw builder.build();\n  }\n\n  @Override\n  public void visitTypeAlias(VmTypeAlias value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  @Override\n  public void visitClass(VmClass value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  @Override\n  public void visitFunction(VmFunction value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  protected void cannotRenderNonStringKey(Object key) {\n    assert enclosingValue != null;\n    var isMap = enclosingValue instanceof VmMap;\n    throw new VmExceptionBuilder()\n        .evalError(isMap ? \"cannotRenderNonStringMap\" : \"cannotRenderObjectWithNonStringKey\", name)\n        .withProgramValue(isMap ? \"Map\" : \"Object\", enclosingValue)\n        .withProgramValue(\"Key\", key)\n        .build();\n  }\n\n  protected void cannotRenderNonScalarKey(Object key) {\n    assert enclosingValue != null;\n    var isMap = enclosingValue instanceof VmMap;\n    throw new VmExceptionBuilder()\n        .evalError(isMap ? \"cannotRenderNonScalarMap\" : \"cannotRenderObjectWithNonScalarKey\", name)\n        .withProgramValue(isMap ? \"Map\" : \"Object\", enclosingValue)\n        .withProgramValue(\"Key\", key)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/AbstractStringRenderer.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmTypeAlias;\n\n/** Base class for renderers that are part of the standard library. */\npublic abstract class AbstractStringRenderer extends AbstractRenderer {\n  protected static final char LINE_BREAK = '\\n';\n\n  protected final StringBuilder builder;\n\n  /** The indent to be used. */\n  protected final String indent;\n\n  /** The current indent. Modified by {@link #increaseIndent()} and {@link #decreaseIndent()}. */\n  protected final StringBuilder currIndent = new StringBuilder();\n\n  public AbstractStringRenderer(\n      String name,\n      StringBuilder builder,\n      String indent,\n      PklConverter converter,\n      boolean skipNullProperties,\n      boolean skipNullEntries) {\n    super(name, converter, skipNullProperties, skipNullEntries);\n    this.builder = builder;\n    this.indent = indent;\n  }\n\n  protected void increaseIndent() {\n    currIndent.append(indent);\n  }\n\n  protected void decreaseIndent() {\n    currIndent.setLength(currIndent.length() - indent.length());\n  }\n\n  // override these to mark them final\n\n  @Override\n  public final void visitTypeAlias(VmTypeAlias value) {\n    super.visitTypeAlias(value);\n  }\n\n  @Override\n  public final void visitClass(VmClass value) {\n    super.visitClass(value);\n  }\n\n  @Override\n  public final void visitFunction(VmFunction value) {\n    super.visitFunction(value);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMemberNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport org.pkl.core.ast.ExpressionNode;\n\n@NodeChild(value = \"receiverNode\", type = ExpressionNode.class)\npublic abstract class ExternalMemberNode extends ExpressionNode {\n  protected ExternalMemberNode() {\n    // an external member node doesn't need a source section\n    // because the enclosing root node has the same source section,\n    // which it also injects into `VmEvalException`s\n    super();\n  }\n\n  protected abstract ExpressionNode getReceiverNode();\n\n  @TruffleBoundary\n  protected final String getQualifiedMemberName() {\n    return getRootNode().getName();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethod0Node.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.ast.ExpressionNode;\n\npublic abstract class ExternalMethod0Node extends ExternalMethodNode {\n  public interface Factory {\n    ExternalMethod0Node create(ExpressionNode receiverNode);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethod1Node.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"arg1Node\", type = ExpressionNode.class)\npublic abstract class ExternalMethod1Node extends ExternalMethodNode {\n  public abstract ExpressionNode getArg1Node();\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(@SuppressWarnings(\"unused\") Object receiver, Object argument) {\n    throw exceptionBuilder()\n        .evalError(\"methodNotDefined1\", getQualifiedMemberName(), VmUtils.getClass(argument))\n        .withProgramValue(\"Argument\", argument)\n        .build();\n  }\n\n  public interface Factory {\n    ExternalMethod1Node create(ExpressionNode receiverNode, ExpressionNode arg1Node);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethod2Node.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"arg1Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg2Node\", type = ExpressionNode.class)\npublic abstract class ExternalMethod2Node extends ExternalMethodNode {\n  protected abstract ExpressionNode getArg1Node();\n\n  protected abstract ExpressionNode getArg2Node();\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(@SuppressWarnings(\"unused\") Object receiver, Object arg1, Object arg2) {\n    throw exceptionBuilder()\n        .evalError(\n            \"methodNotDefined2\",\n            getQualifiedMemberName(),\n            VmUtils.getClass(arg1),\n            VmUtils.getClass(arg2))\n        .withProgramValue(\"Argument 1\", arg1)\n        .withProgramValue(\"Argument 2\", arg2)\n        .build();\n  }\n\n  public interface Factory {\n    ExternalMethod2Node create(\n        ExpressionNode receiverNode, ExpressionNode arg1Node, ExpressionNode arg2Node);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethod3Node.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"arg1Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg2Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg3Node\", type = ExpressionNode.class)\npublic abstract class ExternalMethod3Node extends ExternalMethodNode {\n  protected abstract ExpressionNode getArg1Node();\n\n  protected abstract ExpressionNode getArg2Node();\n\n  protected abstract ExpressionNode getArg3Node();\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(\n      @SuppressWarnings(\"unused\") Object receiver, Object arg1, Object arg2, Object arg3) {\n    throw exceptionBuilder()\n        .evalError(\n            \"methodNotDefined3\",\n            getQualifiedMemberName(),\n            VmUtils.getClass(arg1),\n            VmUtils.getClass(arg2),\n            VmUtils.getClass(arg3))\n        .withProgramValue(\"Argument 1\", arg1)\n        .withProgramValue(\"Argument 2\", arg2)\n        .withProgramValue(\"Argument 3\", arg3)\n        .build();\n  }\n\n  public interface Factory {\n    ExternalMethod3Node create(\n        ExpressionNode receiverNode,\n        ExpressionNode arg1Node,\n        ExpressionNode arg2Node,\n        ExpressionNode arg3Node);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethod4Node.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"arg1Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg2Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg3Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg4Node\", type = ExpressionNode.class)\npublic abstract class ExternalMethod4Node extends ExternalMethodNode {\n  protected abstract ExpressionNode getArg1Node();\n\n  protected abstract ExpressionNode getArg2Node();\n\n  protected abstract ExpressionNode getArg3Node();\n\n  protected abstract ExpressionNode getArg4Node();\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(\n      @SuppressWarnings(\"unused\") Object receiver,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      Object arg4) {\n    throw exceptionBuilder()\n        .evalError(\n            \"methodNotDefined4\",\n            getQualifiedMemberName(),\n            VmUtils.getClass(arg1),\n            VmUtils.getClass(arg2),\n            VmUtils.getClass(arg3),\n            VmUtils.getClass(arg4))\n        .withProgramValue(\"Argument 1\", arg1)\n        .withProgramValue(\"Argument 2\", arg2)\n        .withProgramValue(\"Argument 3\", arg3)\n        .withProgramValue(\"Argument 4\", arg4)\n        .build();\n  }\n\n  public interface Factory {\n    ExternalMethod4Node create(\n        ExpressionNode receiverNode,\n        ExpressionNode arg1Node,\n        ExpressionNode arg2Node,\n        ExpressionNode arg3Node,\n        ExpressionNode arg4Node);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethod5Node.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Fallback;\nimport com.oracle.truffle.api.dsl.NodeChild;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.runtime.VmUtils;\n\n@NodeChild(value = \"arg1Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg2Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg3Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg4Node\", type = ExpressionNode.class)\n@NodeChild(value = \"arg5Node\", type = ExpressionNode.class)\npublic abstract class ExternalMethod5Node extends ExternalMethodNode {\n  protected abstract ExpressionNode getArg1Node();\n\n  protected abstract ExpressionNode getArg2Node();\n\n  protected abstract ExpressionNode getArg3Node();\n\n  protected abstract ExpressionNode getArg4Node();\n\n  protected abstract ExpressionNode getArg5Node();\n\n  @Fallback\n  @TruffleBoundary\n  protected Object fallback(\n      @SuppressWarnings(\"unused\") Object receiver,\n      Object arg1,\n      Object arg2,\n      Object arg3,\n      Object arg4,\n      Object arg5) {\n    throw exceptionBuilder()\n        .evalError(\n            \"methodNotDefined5\",\n            getQualifiedMemberName(),\n            VmUtils.getClass(arg1),\n            VmUtils.getClass(arg2),\n            VmUtils.getClass(arg3),\n            VmUtils.getClass(arg4),\n            VmUtils.getClass(arg5))\n        .withProgramValue(\"Argument 1\", arg1)\n        .withProgramValue(\"Argument 2\", arg2)\n        .withProgramValue(\"Argument 3\", arg3)\n        .withProgramValue(\"Argument 4\", arg4)\n        .withProgramValue(\"Argument 5\", arg5)\n        .build();\n  }\n\n  public interface Factory {\n    ExternalMethod5Node create(\n        ExpressionNode receiverNode,\n        ExpressionNode arg1Node,\n        ExpressionNode arg2Node,\n        ExpressionNode arg3Node,\n        ExpressionNode arg4Node,\n        ExpressionNode arg5Node);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalMethodNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\npublic abstract class ExternalMethodNode extends ExternalMemberNode {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/ExternalPropertyNode.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.ast.ExpressionNode;\n\npublic abstract class ExternalPropertyNode extends ExternalMemberNode {\n  public interface Factory {\n    ExternalPropertyNode create(ExpressionNode receiverNode);\n  }\n\n  @Override\n  public boolean isInstrumentable() {\n    return false;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/LanguageAwareNode.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.runtime.VmLanguage;\n\n/** A node that requires access to `VmLanguage`. */\npublic interface LanguageAwareNode {\n  /**\n   * Initializes this node with a `VmLanguage` instance. This method is called once after\n   * instantiating this node.\n   */\n  void initLanguage(VmLanguage language);\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/PathConverterSupport.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.runtime.Identifier;\n\nfinal class PathConverterSupport {\n  private PathConverterSupport() {}\n\n  public static boolean pathMatches(Iterable<Object> pathSpec, Iterable<Object> path) {\n    var pathIterator = path.iterator();\n    for (var partSpec : pathSpec) {\n      if (!pathIterator.hasNext() || !isMatch(pathIterator.next(), partSpec)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  private static boolean isMatch(Object pathPart, Object pathPartSpec) {\n    if (pathPartSpec == PklConverter.WILDCARD_PROPERTY) {\n      return pathPart == PklConverter.WILDCARD_PROPERTY || pathPart instanceof Identifier;\n    }\n\n    if (pathPartSpec == PklConverter.WILDCARD_ELEMENT) {\n      return pathPart instanceof Long\n          || pathPart instanceof String\n          || !(pathPart instanceof Identifier || pathPart == PklConverter.TOP_LEVEL_VALUE);\n    }\n\n    return pathPart.equals(pathPartSpec);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/PathSpecParser.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmValueConverter;\n\nfinal class PathSpecParser {\n  /**\n   * Parses the path spec of a path-based Pkl output converter into a reverse array of path parts.\n   * Each part of the returned array is one of the following: - an Identifier (to be matched against\n   * property names) - a String (to be matched against map(ping) keys of type String) - a\n   * VmValueConverter.WILDCARD_PROPERTY (matches all property names) - a\n   * VmValueConverter.WILDCARD_ELEMENT (matches all list(ing)/set/map(ping) keys) - a\n   * VmValueConverter.TOP_LEVEL_VALUE\n   */\n  Object[] parse(String pathSpec) {\n    var result = new ArrayList<>();\n\n    // 0 -> start or after leading `^`\n    // 1 -> in property\n    // 2 -> in element\n    // 3 -> after `]`\n    // 4 -> after `.*`\n    // 5 -> after `[*`\n    var state = 0;\n\n    var partStartIdx = 0;\n    var codePoints = pathSpec.codePoints().toArray();\n    for (var idx = 0; idx < codePoints.length; idx++) {\n      switch (codePoints[idx]) {\n        case '^' -> {\n          if (idx != 0) throw invalidPattern(pathSpec);\n          result.add(VmValueConverter.TOP_LEVEL_VALUE);\n          partStartIdx = 1;\n        }\n        case '.' -> {\n          switch (state) {\n            case 1 -> {\n              int count = idx - partStartIdx;\n              if (count == 0) throw invalidPattern(pathSpec);\n              result.add(Identifier.get(new String(codePoints, partStartIdx, count)));\n            }\n            case 3, 4 -> {}\n            default -> throw invalidPattern(pathSpec);\n          }\n          partStartIdx = idx + 1;\n          state = 1;\n        }\n        case '[' -> {\n          switch (state) {\n            case 1 -> {\n              int count = idx - partStartIdx;\n              if (count == 0) throw invalidPattern(pathSpec);\n              result.add(Identifier.get(new String(codePoints, partStartIdx, count)));\n            }\n            case 0, 3, 4 -> {}\n            default -> throw invalidPattern(pathSpec);\n          }\n          partStartIdx = idx + 1;\n          state = 2;\n        }\n        case ']' -> {\n          switch (state) {\n            case 2 -> {\n              int count = idx - partStartIdx;\n              if (count == 0) throw invalidPattern(pathSpec);\n              result.add(new String(codePoints, partStartIdx, count));\n            }\n            case 5 -> {}\n            default -> throw invalidPattern(pathSpec);\n          }\n          state = 3;\n        }\n        case '*' ->\n            state =\n                switch (state) {\n                  case 0, 1 -> {\n                    if (partStartIdx != idx) throw invalidPattern(pathSpec);\n                    result.add(VmValueConverter.WILDCARD_PROPERTY);\n                    yield 4;\n                  }\n                  case 2 -> {\n                    if (partStartIdx != idx) throw invalidPattern(pathSpec);\n                    result.add(VmValueConverter.WILDCARD_ELEMENT);\n                    yield 5;\n                  }\n                  default -> throw invalidPattern(pathSpec);\n                };\n        default -> {\n          if (state > 2) throw invalidPattern(pathSpec);\n          if (state == 0) state = 1;\n        }\n      }\n    }\n\n    switch (state) {\n      case 0 -> {\n        if (result.isEmpty()) {\n          // \"\" matches top-level value (deprecated in 0.15, use \"^\" instead)\n          result.add(VmValueConverter.TOP_LEVEL_VALUE);\n        }\n      }\n      case 1 -> {\n        var count = codePoints.length - partStartIdx;\n        if (count == 0) throw invalidPattern(pathSpec);\n        result.add(Identifier.get(new String(codePoints, partStartIdx, count)));\n      }\n      case 3, 4 -> {}\n      default -> throw invalidPattern(pathSpec);\n    }\n\n    Collections.reverse(result);\n    return result.toArray();\n  }\n\n  private static VmException invalidPattern(String pathSpec) {\n    return new VmExceptionBuilder().evalError(\"invalidConverterPath\", pathSpec).build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/PklConverter.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport java.util.*;\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.Pair;\n\npublic final class PklConverter implements VmValueConverter<Object> {\n  private final Map<VmClass, VmFunction> typeConverters;\n  private final Map<VmClass, VmFunction> convertPropertyTransformers;\n  private final Pair<Object[], VmFunction>[] pathConverters;\n  private final Object rendererOrParser;\n\n  private final @Nullable VmFunction stringConverter;\n  private final @Nullable VmFunction booleanConverter;\n  private final @Nullable VmFunction intConverter;\n  private final @Nullable VmFunction floatConverter;\n  private final @Nullable VmFunction durationConverter;\n  private final @Nullable VmFunction dataSizeConverter;\n  private final @Nullable VmFunction bytesConverter;\n  private final @Nullable VmFunction intSeqConverter;\n  private final @Nullable VmFunction listConverter;\n  private final @Nullable VmFunction setConverter;\n  private final @Nullable VmFunction mapConverter;\n  private final @Nullable VmFunction listingConverter;\n  private final @Nullable VmFunction mappingConverter;\n  private final @Nullable VmFunction dynamicConverter;\n  private final @Nullable VmFunction pairConverter;\n  private final @Nullable VmFunction regexConverter;\n  private final @Nullable VmFunction nullConverter;\n  private final @Nullable VmFunction classConverter;\n  private final @Nullable VmFunction typeAliasConverter;\n\n  private PklConverter(\n      VmMapping converters, VmMapping convertPropertyTransformers, Object rendererOrParser) {\n    converters.force(false, false);\n    convertPropertyTransformers.force(false, false);\n    typeConverters = createTypeConverters(converters);\n    this.convertPropertyTransformers =\n        createConvertPropertyTransformers(convertPropertyTransformers);\n    pathConverters = createPathConverters(converters);\n    this.rendererOrParser = rendererOrParser;\n\n    stringConverter = typeConverters.get(BaseModule.getStringClass());\n    booleanConverter = typeConverters.get(BaseModule.getBooleanClass());\n    intConverter = typeConverters.get(BaseModule.getIntClass());\n    floatConverter = typeConverters.get(BaseModule.getFloatClass());\n    durationConverter = typeConverters.get(BaseModule.getDurationClass());\n    dataSizeConverter = typeConverters.get(BaseModule.getDataSizeClass());\n    bytesConverter = typeConverters.get(BaseModule.getBytesClass());\n    intSeqConverter = typeConverters.get(BaseModule.getIntSeqClass());\n    listConverter = typeConverters.get(BaseModule.getListClass());\n    setConverter = typeConverters.get(BaseModule.getSetClass());\n    mapConverter = typeConverters.get(BaseModule.getMapClass());\n    listingConverter = typeConverters.get(BaseModule.getListingClass());\n    mappingConverter = typeConverters.get(BaseModule.getMappingClass());\n    dynamicConverter = typeConverters.get(BaseModule.getDynamicClass());\n    pairConverter = typeConverters.get(BaseModule.getPairClass());\n    regexConverter = typeConverters.get(BaseModule.getRegexClass());\n    nullConverter = typeConverters.get(BaseModule.getNullClass());\n    classConverter = typeConverters.get(BaseModule.getClassClass());\n    typeAliasConverter = typeConverters.get(BaseModule.getTypeAliasClass());\n  }\n\n  public static final PklConverter NOOP =\n      new PklConverter(VmMapping.empty(), VmMapping.empty(), VmNull.withoutDefault());\n\n  public static PklConverter fromRenderer(VmTyped renderer) {\n    var converters = (VmMapping) VmUtils.readMember(renderer, Identifier.CONVERTERS);\n    var convertPropertyTransformers =\n        (VmMapping) VmUtils.readMember(renderer, Identifier.CONVERT_PROPERTY_TRANSFORMERS);\n    return new PklConverter(converters, convertPropertyTransformers, renderer);\n  }\n\n  public static PklConverter fromParser(VmTyped parser) {\n    var converters = (VmMapping) VmUtils.readMember(parser, Identifier.CONVERTERS);\n    return new PklConverter(\n        converters, VmMapping.empty(), parser); // no annotation converters in parsers\n  }\n\n  @Override\n  public Object convertString(String value, Iterable<Object> path) {\n    return doConvert(value, path, stringConverter);\n  }\n\n  @Override\n  public Object convertBoolean(Boolean value, Iterable<Object> path) {\n    return doConvert(value, path, booleanConverter);\n  }\n\n  @Override\n  public Object convertInt(Long value, Iterable<Object> path) {\n    return doConvert(value, path, intConverter);\n  }\n\n  @Override\n  public Object convertFloat(Double value, Iterable<Object> path) {\n    return doConvert(value, path, floatConverter);\n  }\n\n  @Override\n  public Object convertDuration(VmDuration value, Iterable<Object> path) {\n    return doConvert(value, path, durationConverter);\n  }\n\n  @Override\n  public Object convertDataSize(VmDataSize value, Iterable<Object> path) {\n    return doConvert(value, path, dataSizeConverter);\n  }\n\n  @Override\n  public Object convertBytes(VmBytes value, Iterable<Object> path) {\n    return doConvert(value, path, bytesConverter);\n  }\n\n  @Override\n  public Object convertIntSeq(VmIntSeq value, Iterable<Object> path) {\n    return doConvert(value, path, intSeqConverter);\n  }\n\n  @Override\n  public Object convertList(VmList value, Iterable<Object> path) {\n    return doConvert(value, path, listConverter);\n  }\n\n  @Override\n  public Object convertSet(VmSet value, Iterable<Object> path) {\n    return doConvert(value, path, setConverter);\n  }\n\n  @Override\n  public Object convertMap(VmMap value, Iterable<Object> path) {\n    return doConvert(value, path, mapConverter);\n  }\n\n  @Override\n  public Object convertListing(VmListing value, Iterable<Object> path) {\n    return doConvert(value, path, listingConverter);\n  }\n\n  @Override\n  public Object convertMapping(VmMapping value, Iterable<Object> path) {\n    return doConvert(value, path, mappingConverter);\n  }\n\n  @Override\n  public Object convertDynamic(VmDynamic value, Iterable<Object> path) {\n    return doConvert(value, path, dynamicConverter);\n  }\n\n  @Override\n  public Object convertTyped(VmTyped value, Iterable<Object> path) {\n    return doConvert(value, path, findTypeConverter(value.getVmClass()));\n  }\n\n  @Override\n  public Object convertPair(VmPair value, Iterable<Object> path) {\n    return doConvert(value, path, pairConverter);\n  }\n\n  @Override\n  public Object convertRegex(VmRegex value, Iterable<Object> path) {\n    return doConvert(value, path, regexConverter);\n  }\n\n  @Override\n  public Object convertFunction(VmFunction value, Iterable<Object> path) {\n    return doConvert(value, path, typeConverters.get(value.getVmClass()));\n  }\n\n  @Override\n  public Object convertClass(VmClass value, Iterable<Object> path) {\n    return doConvert(value, path, classConverter);\n  }\n\n  @Override\n  public Object convertTypeAlias(VmTypeAlias value, Iterable<Object> path) {\n    return doConvert(value, path, typeAliasConverter);\n  }\n\n  @Override\n  public Object convertNull(VmNull value, Iterable<Object> path) {\n    return doConvert(value, path, nullConverter);\n  }\n\n  @Override\n  public Pair<Identifier, Object> convertProperty(\n      ClassProperty property, Object value, Iterable<Object> path) {\n    var name = property.getName();\n\n    var annotations = property.getAllAnnotations(false);\n    if (annotations.isEmpty()) {\n      return Pair.of(name, value);\n    }\n\n    var prop = new VmPair(name.toString(), value);\n    for (var annotation : annotations) {\n      if (!annotation.getVmClass().isSubclassOf(BaseModule.getConvertPropertyClass())) {\n        continue;\n      }\n\n      var transformer = findConvertPropertyTransformer(annotation.getVmClass());\n      if (transformer != null) {\n        annotation = (VmTyped) transformer.apply(annotation);\n      }\n\n      var renderFunction = (VmFunction) VmUtils.readMember(annotation, Identifier.RENDER);\n      prop = (VmPair) renderFunction.apply(prop, rendererOrParser);\n    }\n\n    return Pair.of(Identifier.get((String) prop.getFirst()), prop.getSecond());\n  }\n\n  private Map<VmClass, VmFunction> createTypeConverters(VmMapping converters) {\n    var result = new HashMap<VmClass, VmFunction>();\n    converters.iterateMemberValues(\n        (key, member, value) -> {\n          assert value != null; // forced in ctor\n          if (key instanceof VmClass vmClass) {\n            result.put(vmClass, (VmFunction) value);\n          }\n          return true;\n        });\n    return result;\n  }\n\n  private Map<VmClass, VmFunction> createConvertPropertyTransformers(\n      VmMapping convertPropertyTransformers) {\n    var result = new HashMap<VmClass, VmFunction>();\n    convertPropertyTransformers.iterateMemberValues(\n        (key, member, value) -> {\n          assert value != null; // forced in ctor\n          result.put((VmClass) key, ((VmFunction) value));\n          return true;\n        });\n\n    return result;\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private Pair<Object[], VmFunction>[] createPathConverters(VmMapping converters) {\n    var result = new ArrayList<Pair<Object[], VmFunction>>();\n    var parser = new PathSpecParser();\n    converters.iterateMemberValues(\n        (key, member, value) -> {\n          assert value != null; // forced in ctor\n          if (key instanceof String string) {\n            result.add(Pair.of(parser.parse(string), (VmFunction) value));\n          }\n          return true;\n        });\n    return result.toArray(new Pair[0]);\n  }\n\n  private @Nullable VmFunction getPathConverter(Iterable<Object> path) {\n    for (var converter : pathConverters) {\n      if (PathConverterSupport.pathMatches(Arrays.asList(converter.first), path)) {\n        return converter.second;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Finds a type converter for the given class (if one exists).\n   *\n   * <p>Type converters are covariant, so an Animal converter will accept a Dog or a Cat. This\n   * method will return the most specific converter for a type.\n   */\n  private @Nullable VmFunction findTypeConverter(VmClass clazz) {\n    return findConverterByType(typeConverters, clazz);\n  }\n\n  private @Nullable VmFunction findConvertPropertyTransformer(VmClass clazz) {\n    return findConverterByType(convertPropertyTransformers, clazz);\n  }\n\n  private <T> @Nullable T findConverterByType(Map<VmClass, T> bag, VmClass clazz) {\n    for (var current = clazz; current != null; current = current.getSuperclass()) {\n      var found = bag.get(current);\n      if (found != null) return found;\n    }\n    return null;\n  }\n\n  private Object doConvert(\n      Object value, Iterable<Object> path, @Nullable VmFunction typeConverter) {\n    var pathConverter = getPathConverter(path);\n    if (pathConverter != null) {\n      // path converter wins over type converter\n      return pathConverter.apply(value);\n    }\n\n    if (typeConverter != null) {\n      return typeConverter.apply(value);\n    }\n\n    return value;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/PklName.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Associates a stdlib node class with a Pkl member name or a stdlib package with a Pkl module name.\n * Only required if the Java class/package can't have the same name as its corresponding Pkl\n * member/module.\n */\n@Target({ElementType.PACKAGE, ElementType.TYPE})\n// From\n// https://docs.gradle.org/current/userguide/java_plugin.html#aggregating_annotation_processors:\n// \"Aggregating\" processors [...] can only read CLASS or RUNTIME retention annotations.\n@Retention(RetentionPolicy.CLASS)\npublic @interface PklName {\n  /** The simple Pkl name of the annotated element. */\n  String value();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/VmObjectFactories.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.Version;\nimport org.pkl.core.runtime.SemVerModule;\nimport org.pkl.core.runtime.VmNull;\n\npublic final class VmObjectFactories {\n  private VmObjectFactories() {}\n\n  public static final VmObjectFactory<Version> versionFactory =\n      new VmObjectFactory<Version>(SemVerModule::getVersionClass)\n          .addIntProperty(\"major\", Version::getMajor)\n          .addIntProperty(\"minor\", Version::getMinor)\n          .addIntProperty(\"patch\", Version::getPatch)\n          .addProperty(\"preRelease\", (version) -> VmNull.lift(version.getPreRelease()))\n          .addProperty(\"build\", (version) -> VmNull.lift(version.getBuild()));\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/VmObjectFactory.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport java.util.function.Supplier;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.ast.member.TypeCheckedPropertyNodeGen;\nimport org.pkl.core.ast.member.UntypedObjectMemberNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class VmObjectFactory<E> {\n  private final Supplier<VmClass> classSupplier;\n  private final EconomicMap<Object, ObjectMember> members = EconomicMaps.create();\n  // not static to avoid compile-time evaluation by native-image\n  private final boolean isPropertyTypeChecked = IoUtils.isTestMode();\n\n  public VmObjectFactory(Supplier<VmClass> classSupplier) {\n    this.classSupplier = classSupplier;\n  }\n\n  public VmObjectFactory<E> addIntProperty(String name, IntProperty<E> impl) {\n    return doAddProperty(name, new IntPropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addBooleanProperty(String name, BooleanProperty<E> impl) {\n    return doAddProperty(name, new BooleanPropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addStringProperty(String name, Property<E, String> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addValueProperty(String name, Property<E, VmValue> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addDurationProperty(String name, Property<E, VmDuration> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addTypedProperty(String name, Property<E, VmTyped> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addListProperty(String name, Property<E, VmList> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addSetProperty(String name, Property<E, VmSet> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addMapProperty(String name, Property<E, VmMap> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public VmObjectFactory<E> addClassProperty(String name, Property<E, VmClass> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  public <T> VmObjectFactory<E> addProperty(String name, Property<E, T> impl) {\n    return doAddProperty(name, new PropertyNode<>(impl));\n  }\n\n  @TruffleBoundary\n  private VmObjectFactory<E> doAddProperty(String name, ExpressionNode bodyNode) {\n    var section = VmUtils.unavailableSourceSection();\n    var identifier = Identifier.get(name);\n    var member = new ObjectMember(section, section, VmModifier.NONE, identifier, name);\n    var node =\n        isPropertyTypeChecked\n            ? TypeCheckedPropertyNodeGen.create(null, new FrameDescriptor(), member, bodyNode)\n            : new UntypedObjectMemberNode(null, new FrameDescriptor(), member, bodyNode);\n    member.initMemberNode(node);\n    if (members.put(identifier, member) != null) {\n      throw new VmExceptionBuilder()\n          .bug(\n              \"Duplicate definition of property `\"\n                  + name\n                  + \"` for object of type `\"\n                  + classSupplier.get().getDisplayName()\n                  + \"`.\")\n          .build();\n    }\n    return this;\n  }\n\n  @TruffleBoundary\n  public VmTyped create(@Nullable E extraStorage) {\n    var clazz = classSupplier.get();\n    assert clazz != null;\n\n    var result =\n        new VmTyped(VmUtils.createEmptyMaterializedFrame(), clazz.getPrototype(), clazz, members);\n    result.setExtraStorage(extraStorage);\n    return result;\n  }\n\n  @FunctionalInterface\n  public interface IntProperty<E> {\n    long evaluate(E extraStorage);\n  }\n\n  @FunctionalInterface\n  public interface BooleanProperty<E> {\n    boolean evaluate(E extraStorage);\n  }\n\n  @FunctionalInterface\n  public interface Property<E, T> {\n    T evaluate(E extraStorage);\n\n    static <T> Property<T, T> identity() {\n      return t -> t;\n    }\n  }\n\n  private static final class IntPropertyNode<E> extends ExpressionNode {\n    private final IntProperty<E> impl;\n\n    public IntPropertyNode(IntProperty<E> impl) {\n      this.impl = impl;\n    }\n\n    @Override\n    public long executeInt(VirtualFrame frame) {\n      return doExecute(VmUtils.getOwner(frame));\n    }\n\n    @Override\n    public Object executeGeneric(VirtualFrame frame) {\n      return doExecute(VmUtils.getOwner(frame));\n    }\n\n    @TruffleBoundary\n    @SuppressWarnings(\"unchecked\")\n    private long doExecute(VmObjectLike owner) {\n      return impl.evaluate((E) owner.getExtraStorage());\n    }\n  }\n\n  private static final class BooleanPropertyNode<E> extends ExpressionNode {\n    private final BooleanProperty<E> impl;\n\n    public BooleanPropertyNode(BooleanProperty<E> impl) {\n      this.impl = impl;\n    }\n\n    @Override\n    public boolean executeBoolean(VirtualFrame frame) {\n      return doExecute(VmUtils.getOwner(frame));\n    }\n\n    @Override\n    public Object executeGeneric(VirtualFrame frame) {\n      return doExecute(VmUtils.getOwner(frame));\n    }\n\n    @TruffleBoundary\n    @SuppressWarnings(\"unchecked\")\n    private boolean doExecute(VmObjectLike owner) {\n      return impl.evaluate((E) owner.getExtraStorage());\n    }\n  }\n\n  private static final class PropertyNode<E, T> extends ExpressionNode {\n    private final Property<E, T> impl;\n\n    public PropertyNode(Property<E, T> impl) {\n      this.impl = impl;\n    }\n\n    @Override\n    public Object executeGeneric(VirtualFrame frame) {\n      return doExecute(VmUtils.getOwner(frame));\n    }\n\n    @TruffleBoundary\n    @SuppressWarnings(\"unchecked\")\n    private T doExecute(VmObjectLike owner) {\n      return impl.evaluate((E) owner.getExtraStorage());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/analyze/AnalyzeNodes.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.analyze;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport org.pkl.core.ImportGraph;\nimport org.pkl.core.ImportGraph.Import;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.AnalyzeModule;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmImportAnalyzer;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.VmObjectFactory;\n\npublic final class AnalyzeNodes {\n  private AnalyzeNodes() {}\n\n  private static VmObjectFactory<Import> importFactory =\n      new VmObjectFactory<Import>(AnalyzeModule::getImportClass)\n          .addStringProperty(\"uri\", (it) -> it.uri().toString());\n\n  private static VmObjectFactory<ImportGraph> importGraphFactory =\n      new VmObjectFactory<ImportGraph>(AnalyzeModule::getImportGraphClass)\n          .addMapProperty(\n              \"imports\",\n              graph -> {\n                var builder = VmMap.builder();\n                for (var entry : graph.imports().entrySet()) {\n                  var vmSetBuilder = VmSet.EMPTY.builder();\n                  for (var imprt : entry.getValue()) {\n                    vmSetBuilder.add(importFactory.create(imprt));\n                  }\n                  builder.add(entry.getKey().toString(), vmSetBuilder.build());\n                }\n                return builder.build();\n              })\n          .addMapProperty(\n              \"resolvedImports\",\n              graph -> {\n                var builder = VmMap.builder();\n                for (var entry : graph.resolvedImports().entrySet()) {\n                  builder.add(entry.getKey().toString(), entry.getValue().toString());\n                }\n                return builder.build();\n              });\n\n  public abstract static class importGraph extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(@SuppressWarnings(\"unused\") VmTyped self, VmSet moduleUris) {\n      var uris = new URI[moduleUris.getLength()];\n      var idx = 0;\n      for (var moduleUri : moduleUris) {\n        URI uri;\n        try {\n          uri = new URI((String) moduleUri);\n        } catch (URISyntaxException e) {\n          throw exceptionBuilder()\n              .evalError(\"invalidModuleUri\", moduleUri)\n              .withHint(e.getMessage())\n              .build();\n        }\n        if (!uri.isAbsolute()) {\n          throw exceptionBuilder().evalError(\"cannotAnalyzeRelativeModuleUri\", moduleUri).build();\n        }\n        uris[idx] = uri;\n        idx++;\n      }\n      var context = VmContext.get(this);\n      try {\n        var results = VmImportAnalyzer.analyze(uris, context);\n        return importGraphFactory.create(results);\n      } catch (IOException\n          | SecurityManagerException\n          | PackageLoadError\n          | ExternalReaderProcessException e) {\n        throw exceptionBuilder().withCause(e).build();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/analyze/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.analyze;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/AnyNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.internal.GetClassNode;\nimport org.pkl.core.ast.internal.GetClassNodeGen;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\npublic final class AnyNodes {\n  private AnyNodes() {}\n\n  public abstract static class getClass extends ExternalMethod0Node {\n    @Child private GetClassNode receiverClassNode = GetClassNodeGen.create(getReceiverNode());\n\n    @Specialization\n    protected VmClass eval(VirtualFrame frame, Object self) {\n      return receiverClassNode.executeWith(frame, self);\n    }\n  }\n\n  public abstract static class toString extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected String evalString(Object self) {\n      return self.toString();\n    }\n  }\n\n  public abstract static class ifNonNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    @SuppressWarnings(\"UnusedParameters\")\n    protected VmNull eval(VmNull self, VmFunction function) {\n      return self;\n    }\n\n    @Specialization(guards = \"isNonNull(self)\")\n    protected Object eval(Object self, VmFunction function) {\n      return applyLambdaNode.execute(function, self);\n    }\n\n    protected static boolean isNonNull(Object obj) {\n      return obj.getClass() != VmNull.class;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/BaseNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.runtime.VmRegex;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\n\n/**\n * External property and function implementations for the `base` module.\n *\n * <p>To reduce the chance of base module properties shadowing object properties, the only use of\n * properties in the base module is for logical constants (e.g. MaxInt), and they all start with an\n * uppercase letter.\n *\n * <p>For the same reason, the only use of methods in the base module is for constructor methods\n * (e.g. Pair()), and they all start with an uppercase letter.\n *\n * <p>Note that having base module *properties* read language context specific information (e.g.,\n * CLI args) would lead to incorrect behavior, as a single base module instance is shared across all\n * language contexts, and properties (whether external or not) are evaluated just once.\n */\n@SuppressWarnings(\"UnusedParameters\")\npublic final class BaseNodes {\n  private BaseNodes() {}\n\n  public abstract static class NaN extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped ignored) {\n      return Double.NaN;\n    }\n  }\n\n  public abstract static class Infinity extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped ignored) {\n      return Double.POSITIVE_INFINITY;\n    }\n  }\n\n  public abstract static class Regex extends ExternalMethod1Node {\n    // cache Regex object to avoid repeated java.util.Pattern.compile()\n    @Specialization(guards = \"pattern.equals(cachedPattern)\")\n    protected VmRegex evalCached(\n        VirtualFrame frame,\n        VmTyped self,\n        String pattern,\n        @Cached(\"pattern\") String cachedPattern,\n        @Cached(\"createRegex(frame, pattern)\") VmRegex cachedRegex) {\n\n      return cachedRegex;\n    }\n\n    @Specialization(replaces = \"evalCached\")\n    protected VmRegex eval(VirtualFrame frame, VmTyped self, String pattern) {\n      return createRegex(frame, pattern);\n    }\n\n    protected VmRegex createRegex(VirtualFrame frame, String pattern) {\n      return new VmRegex(VmUtils.compilePattern(pattern, getArg1Node()));\n    }\n  }\n\n  public abstract static class Undefined extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(VmTyped self) {\n      throw exceptionBuilder().undefinedValue().build();\n    }\n  }\n\n  public abstract static class Null extends ExternalMethod1Node {\n    @Specialization\n    protected VmNull eval(VmTyped self, Object defaultValue) {\n      return VmNull.withDefault(defaultValue);\n    }\n  }\n\n  public abstract static class List extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmTyped self, Object args) {\n      // invocations of this method are handled specially in AstBuilder\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().bug(\"Node `BaseNodes.List` should never be executed.\").build();\n    }\n  }\n\n  public abstract static class Set extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmTyped self, Object args) {\n      // invocations of this method are handled specially in AstBuilder\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().bug(\"Node `BaseNodes.Set` should never be executed.\").build();\n    }\n  }\n\n  public abstract static class Map extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmTyped self, Object args) {\n      // invocations of this method are handled specially in AstBuilder\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().bug(\"Node `BaseNodes.Map` should never be executed.\").build();\n    }\n  }\n\n  public abstract static class Pair extends ExternalMethod2Node {\n    @Specialization\n    protected VmPair eval(VirtualFrame frame, VmTyped self, Object first, Object second) {\n      return new VmPair(first, second);\n    }\n  }\n\n  public abstract static class IntSeq extends ExternalMethod2Node {\n    @Specialization\n    protected VmIntSeq eval(VirtualFrame frame, VmTyped self, long first, long second) {\n      return new VmIntSeq(first, second, 1L);\n    }\n  }\n\n  public abstract static class Bytes extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmTyped self, Object args) {\n      // invocations of this method are handled specially in AstBuilder\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().bug(\"Node `BaseNodes.Bytes` should never be executed.\").build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/BooleanNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\npublic final class BooleanNodes {\n  private BooleanNodes() {}\n\n  public abstract static class xor extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(boolean self, boolean other) {\n      return self ^ other;\n    }\n  }\n\n  public abstract static class implies extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(boolean self, boolean other) {\n      return !self || other;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/BytesNodes.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.nio.ByteBuffer;\nimport java.nio.charset.CharacterCodingException;\nimport java.nio.charset.Charset;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.ByteArrayUtils;\n\npublic final class BytesNodes {\n  private BytesNodes() {}\n\n  public abstract static class toList extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmBytes self) {\n      return self.toList();\n    }\n  }\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmBytes self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class size extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(VmBytes self) {\n      return self.getSize();\n    }\n  }\n\n  public abstract static class base64 extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmBytes self) {\n      return self.base64();\n    }\n  }\n\n  public abstract static class hex extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmBytes self) {\n      return self.hex();\n    }\n  }\n\n  public abstract static class md5 extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmBytes self) {\n      return ByteArrayUtils.md5(self.getBytes());\n    }\n  }\n\n  public abstract static class sha1 extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmBytes self) {\n      return ByteArrayUtils.sha1(self.getBytes());\n    }\n  }\n\n  public abstract static class sha256 extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmBytes self) {\n      return ByteArrayUtils.sha256(self.getBytes());\n    }\n  }\n\n  public abstract static class sha256Int extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmBytes self) {\n      return ByteArrayUtils.sha256Int(self.getBytes());\n    }\n  }\n\n  public abstract static class getOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmBytes self, long index) {\n      if (index < 0 || index >= self.getLength()) {\n        return VmNull.withoutDefault();\n      }\n      return self.get(index);\n    }\n  }\n\n  public abstract static class decodeToString extends ExternalMethod1Node {\n    @TruffleBoundary\n    private String doDecode(VmBytes self, String charset) throws CharacterCodingException {\n      var byteBuffer = ByteBuffer.wrap(self.getBytes());\n      var decoder = Charset.forName(charset).newDecoder();\n      return decoder.decode(byteBuffer).toString();\n    }\n\n    @Specialization\n    protected String eval(VmBytes self, String charset) {\n      try {\n        return doDecode(self, charset);\n      } catch (CharacterCodingException e) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder().evalError(\"characterCodingException\", charset).build();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/ClassNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\n\npublic final class ClassNodes {\n  private ClassNodes() {}\n\n  public abstract static class simpleName extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmClass self) {\n      return self.getSimpleName();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/CollectionNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.expression.binary.LessThanNode;\nimport org.pkl.core.ast.expression.binary.LessThanNodeGen;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1NodeGen;\nimport org.pkl.core.ast.lambda.ApplyVmFunction2Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction2NodeGen;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class CollectionNodes {\n  private CollectionNodes() {}\n\n  public abstract static class SortComparatorNode extends PklNode {\n    public abstract boolean executeWith(\n        VirtualFrame frame, Object left, Object right, @Nullable VmFunction function);\n  }\n\n  public static final class CompareNode extends SortComparatorNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Override\n    public boolean executeWith(\n        VirtualFrame frame, Object left, Object right, @Nullable VmFunction function) {\n      assert function == null;\n      return lessThanNode.executeWith(frame, left, right);\n    }\n  }\n\n  public static final class CompareByNode extends SortComparatorNode {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Override\n    public boolean executeWith(\n        VirtualFrame frame, Object left, Object right, @Nullable VmFunction selector) {\n      assert selector != null;\n      var leftResult = applyLambdaNode.execute(selector, left);\n      var rightResult = applyLambdaNode.execute(selector, right);\n      return lessThanNode.executeWith(frame, leftResult, rightResult);\n    }\n  }\n\n  public static final class CompareWithNode extends SortComparatorNode {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Override\n    public boolean executeWith(\n        VirtualFrame frame, Object left, Object right, @Nullable VmFunction comparator) {\n      assert comparator != null;\n      var result = applyLambdaNode.execute(comparator, left, right);\n\n      if (result instanceof Boolean b) return b;\n\n      // deprecated\n      if (result instanceof Long l) return l < 0;\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .typeMismatch(result, BaseModule.getBooleanClass(), BaseModule.getIntClass())\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/DataSizeNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.stdlib.*;\nimport org.pkl.core.util.MathUtils;\n\n@SuppressWarnings(\"unused\")\npublic final class DataSizeNodes {\n  private DataSizeNodes() {}\n\n  @ImportStatic(MathUtils.class)\n  @PklName(\"value\")\n  public abstract static class valueProperty extends ExternalPropertyNode {\n    @Specialization(guards = \"isMathematicalInteger(self.getValue())\")\n    protected long evalInt(VmDataSize self) {\n      return (long) self.getValue();\n    }\n\n    @Specialization(guards = \"!isMathematicalInteger(self.getValue())\")\n    protected double evalFloat(VmDataSize self) {\n      return self.getValue();\n    }\n  }\n\n  public abstract static class unit extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmDataSize self) {\n      return self.getUnit().getSymbol();\n    }\n  }\n\n  public abstract static class isPositive extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmDataSize self) {\n      return self.getValue() >= 0;\n    }\n  }\n\n  public abstract static class isBetween extends ExternalMethod2Node {\n    @Specialization\n    protected boolean eval(VmDataSize self, VmDataSize start, VmDataSize inclusiveEnd) {\n      return self.compareTo(start) >= 0 && self.compareTo(inclusiveEnd) <= 0;\n    }\n  }\n\n  public abstract static class toUnit extends ExternalMethod1Node {\n    @Specialization\n    protected VmDataSize eval(VmDataSize self, String str) {\n      var unit = DataSizeUnit.parse(str);\n      assert unit != null; // guaranteed by Pkl type check\n      return self.convertTo(unit);\n    }\n  }\n\n  public abstract static class isBinaryUnit extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmDataSize self) {\n      var ordinal = self.getUnit().ordinal();\n      return ordinal % 2 == 0;\n    }\n  }\n\n  public abstract static class isDecimalUnit extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmDataSize self) {\n      var ordinal = self.getUnit().ordinal();\n      return ordinal == 0 || ordinal % 2 == 1;\n    }\n  }\n\n  public abstract static class toBinaryUnit extends ExternalMethod0Node {\n    @Specialization\n    protected VmDataSize eval(VmDataSize self) {\n      return switch (self.getUnit()) {\n        case KILOBYTES -> self.convertTo(DataSizeUnit.KIBIBYTES);\n        case MEGABYTES -> self.convertTo(DataSizeUnit.MEBIBYTES);\n        case GIGABYTES -> self.convertTo(DataSizeUnit.GIBIBYTES);\n        case TERABYTES -> self.convertTo(DataSizeUnit.TEBIBYTES);\n        case PETABYTES -> self.convertTo(DataSizeUnit.PEBIBYTES);\n        default -> self;\n      };\n    }\n  }\n\n  public abstract static class toDecimalUnit extends ExternalMethod0Node {\n    @Specialization\n    protected VmDataSize eval(VmDataSize self) {\n      return switch (self.getUnit()) {\n        case KIBIBYTES -> self.convertTo(DataSizeUnit.KILOBYTES);\n        case MEBIBYTES -> self.convertTo(DataSizeUnit.MEGABYTES);\n        case GIBIBYTES -> self.convertTo(DataSizeUnit.GIGABYTES);\n        case TEBIBYTES -> self.convertTo(DataSizeUnit.TERABYTES);\n        case PEBIBYTES -> self.convertTo(DataSizeUnit.PETABYTES);\n        default -> self;\n      };\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/DurationNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.ImportStatic;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.stdlib.*;\nimport org.pkl.core.util.DurationUtils;\nimport org.pkl.core.util.MathUtils;\n\n@SuppressWarnings(\"unused\")\npublic final class DurationNodes {\n  private DurationNodes() {}\n\n  @ImportStatic(MathUtils.class)\n  @PklName(\"value\")\n  public abstract static class valueProperty extends ExternalPropertyNode {\n    @Specialization(guards = \"isMathematicalInteger(self.getValue())\")\n    protected long evalInt(VmDuration self) {\n      return (long) self.getValue();\n    }\n\n    @Specialization(guards = \"!isMathematicalInteger(self.getValue())\")\n    protected double evalFloat(VmDuration self) {\n      return self.getValue();\n    }\n  }\n\n  public abstract static class isoString extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmDuration self) {\n      try {\n        return DurationUtils.toIsoString(self.getValue(), self.getUnit());\n      } catch (ArithmeticException e) {\n        throw exceptionBuilder().evalError(\"cannotConvertToIsoDuration\", self).build();\n      }\n    }\n  }\n\n  public abstract static class unit extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmDuration self) {\n      return self.getUnit().getSymbol();\n    }\n  }\n\n  public abstract static class isPositive extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmDuration self) {\n      return self.getValue() >= 0;\n    }\n  }\n\n  public abstract static class isBetween extends ExternalMethod2Node {\n    @Specialization\n    protected boolean eval(VmDuration self, VmDuration start, VmDuration inclusiveEnd) {\n      return self.compareTo(start) >= 0 && self.compareTo(inclusiveEnd) <= 0;\n    }\n  }\n\n  public abstract static class toUnit extends ExternalMethod1Node {\n    @Specialization\n    protected VmDuration eval(VmDuration self, String str) {\n      DurationUnit unit = DurationUnit.parse(str);\n      assert unit != null; // guaranteed by Pkl type check\n      return self.convertTo(unit);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/DynamicNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\npublic final class DynamicNodes {\n  private DynamicNodes() {}\n\n  public abstract static class length extends ExternalMethod0Node {\n    @Specialization\n    protected long eval(VmDynamic self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class hasProperty extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmDynamic self, String name) {\n      var memberName = Identifier.get(name);\n      if (self.hasCachedValue(name)) return true;\n\n      for (VmObjectLike curr = self; curr != null; curr = curr.getParent()) {\n        if (curr.hasMember(memberName)) return true;\n      }\n      return false;\n    }\n  }\n\n  public abstract static class getProperty extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    @Specialization\n    protected Object eval(VmDynamic self, String name) {\n      return VmUtils.readMember(self, Identifier.get(name), callNode);\n    }\n  }\n\n  public abstract static class getPropertyOrNull extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    @Specialization\n    protected Object eval(VmDynamic self, String name) {\n      return VmNull.lift(VmUtils.readMemberOrNull(self, Identifier.get(name), callNode));\n    }\n  }\n\n  public abstract static class toMap extends ExternalMethod0Node {\n    @Specialization\n    protected VmMap eval(VmDynamic self) {\n      var builder = VmMap.builder();\n      self.forceAndIterateMemberValues( // could be smarter and skip forcing elements\n          (key, member, value) -> {\n            if (!member.isElement()) {\n              builder.add(key instanceof Identifier ? key.toString() : key, value);\n            }\n            return true;\n          });\n      return builder.build();\n    }\n  }\n\n  public abstract static class toList extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmDynamic self) {\n      var builder = VmList.EMPTY.builder();\n      self.forceAndIterateMemberValues( // could be smarter and only force elements\n          (key, member, value) -> {\n            if (member.isElement()) {\n              builder.add(value);\n            }\n            return true;\n          });\n      return builder.build();\n    }\n  }\n\n  public abstract static class toTyped extends ExternalMethod1Node {\n    @Specialization\n    protected VmObjectLike eval(VmDynamic self, VmClass clazz) {\n      if (!clazz.isSubclassOf(BaseModule.getTypedClass())) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder().evalError(\"notASubclassOfTyped\", clazz).build();\n      }\n\n      VmUtils.checkIsInstantiable(clazz, this);\n\n      var result =\n          new VmTyped(\n              VmUtils.createEmptyMaterializedFrame(),\n              clazz.getPrototype(),\n              clazz,\n              clazz.getDynamicToTypedMembers());\n      result.setExtraStorage(self);\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/FloatNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.math.RoundingMode;\nimport java.text.DecimalFormat;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmException.ProgramValue;\nimport org.pkl.core.runtime.VmSafeMath;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.MathUtils;\n\npublic final class FloatNodes {\n  private FloatNodes() {}\n\n  public abstract static class ns extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.NANOS);\n    }\n  }\n\n  public abstract static class us extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.MICROS);\n    }\n  }\n\n  public abstract static class ms extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.MILLIS);\n    }\n  }\n\n  public abstract static class s extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.SECONDS);\n    }\n  }\n\n  public abstract static class min extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.MINUTES);\n    }\n  }\n\n  public abstract static class h extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.HOURS);\n    }\n  }\n\n  public abstract static class d extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(double self) {\n      return new VmDuration(self, DurationUnit.DAYS);\n    }\n  }\n\n  public abstract static class b extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.BYTES);\n    }\n  }\n\n  public abstract static class kb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.KILOBYTES);\n    }\n  }\n\n  public abstract static class kib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.KIBIBYTES);\n    }\n  }\n\n  public abstract static class mb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.MEGABYTES);\n    }\n  }\n\n  public abstract static class mib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.MEBIBYTES);\n    }\n  }\n\n  public abstract static class gb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.GIGABYTES);\n    }\n  }\n\n  public abstract static class gib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.GIBIBYTES);\n    }\n  }\n\n  public abstract static class tb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.TERABYTES);\n    }\n  }\n\n  public abstract static class tib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.TEBIBYTES);\n    }\n  }\n\n  public abstract static class pb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.PETABYTES);\n    }\n  }\n\n  public abstract static class pib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(double self) {\n      return new VmDataSize(self, DataSizeUnit.PEBIBYTES);\n    }\n  }\n\n  public abstract static class sign extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(double self) {\n      return StrictMath.signum(self);\n    }\n  }\n\n  public abstract static class abs extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(double self) {\n      return StrictMath.abs(self);\n    }\n  }\n\n  public abstract static class ceil extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(double self) {\n      return StrictMath.ceil(self);\n    }\n  }\n\n  public abstract static class floor extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(double self) {\n      return StrictMath.floor(self);\n    }\n  }\n\n  public abstract static class round extends ExternalMethod0Node {\n    @Specialization\n    protected double eval(double self) {\n      return StrictMath.rint(self);\n    }\n  }\n\n  public abstract static class truncate extends ExternalMethod0Node {\n    @Specialization\n    protected double eval(double self) {\n      return VmSafeMath.truncate(self);\n    }\n  }\n\n  public abstract static class toInt extends ExternalMethod0Node {\n    @Specialization\n    protected long eval(double self) {\n      try {\n        return MathUtils.roundToLong(self, RoundingMode.DOWN);\n      } catch (ArithmeticException e) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\n                Double.isFinite(self) ? \"cannotConvertLargeFloat\" : \"cannotConvertNonFiniteFloat\",\n                new ProgramValue(\"Float\", self))\n            .build();\n      }\n    }\n  }\n\n  public abstract static class toFloat extends ExternalMethod0Node {\n    @Specialization\n    protected double eval(double self) {\n      return self;\n    }\n  }\n\n  public abstract static class toString extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(double self) {\n      return Double.toString(self);\n    }\n  }\n\n  public abstract static class toFixed extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(double self, long fractionDigits) {\n      // Guaranteed by Pkl method parameter constraint.\n      // 0..20 is what JS implementations of `Number.prototype.toFixed()`\n      // and Dart implementations of `num.toStringAsFixed()` must support and seems sufficient.\n      // `java.text.DecimalFormat` silently clamps the value to 0..340.\n      // `java.lang.String.format()` supports a larger range.\n      assert fractionDigits >= 0 && fractionDigits <= 20;\n\n      if (Double.isFinite(self)) {\n        // specialization that caches DecimalFormat in ThreadLocal\n        // (only) gives 3x speedup in microbenchmark\n        DecimalFormat format = VmUtils.createDecimalFormat((int) fractionDigits);\n        return format.format(self);\n      }\n\n      return Double.toString(self);\n    }\n  }\n\n  public abstract static class toDuration extends ExternalMethod1Node {\n    @Specialization\n    protected VmDuration eval(double self, String str) {\n      DurationUnit unit = DurationUnit.parse(str);\n      assert unit != null; // guaranteed by Pkl type check\n      return new VmDuration(self, unit);\n    }\n  }\n\n  public abstract static class toDataSize extends ExternalMethod1Node {\n    @Specialization\n    protected VmDataSize eval(double self, String str) {\n      DataSizeUnit unit = DataSizeUnit.parse(str);\n      assert unit != null; // guaranteed by Pkl type check\n      return new VmDataSize(self, unit);\n    }\n  }\n\n  public abstract static class isPositive extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(double self) {\n      return self >= 0;\n    }\n  }\n\n  public abstract static class isFinite extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(double self) {\n      return Double.isFinite(self);\n    }\n  }\n\n  public abstract static class isInfinite extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(double self) {\n      return Double.isInfinite(self);\n    }\n  }\n\n  public abstract static class isNaN extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(double self) {\n      return Double.isNaN(self);\n    }\n  }\n\n  public abstract static class isNonZero extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(double self) {\n      return self != 0;\n    }\n  }\n\n  public abstract static class isBetween extends ExternalMethod2Node {\n    @Specialization\n    protected boolean evalIntInt(double self, long start, long inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n\n    @Specialization\n    protected boolean evalIntFloat(double self, long start, double inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n\n    @Specialization\n    protected boolean evalFloatInt(double self, double start, long inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n\n    @Specialization\n    protected boolean evalFloatFloat(double self, double start, double inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/Function0Nodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.lambda.ApplyVmFunction0Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction0NodeGen;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\n\npublic final class Function0Nodes {\n  private Function0Nodes() {}\n\n  public abstract static class apply extends ExternalMethod0Node {\n    @Child private ApplyVmFunction0Node applyLambdaNode = ApplyVmFunction0NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmFunction self) {\n      return applyLambdaNode.execute(self);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/Function1Nodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\npublic final class Function1Nodes {\n  private Function1Nodes() {}\n\n  public abstract static class apply extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmFunction self, Object arg1) {\n      return applyLambdaNode.execute(self, arg1);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/Function2Nodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.lambda.ApplyVmFunction2Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction2NodeGen;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\n\npublic final class Function2Nodes {\n  private Function2Nodes() {}\n\n  public abstract static class apply extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmFunction self, Object arg1, Object arg2) {\n      return applyLambdaNode.execute(self, arg1, arg2);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/Function3Nodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.lambda.ApplyVmFunction3Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction3NodeGen;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.ExternalMethod3Node;\n\npublic final class Function3Nodes {\n  private Function3Nodes() {}\n\n  public abstract static class apply extends ExternalMethod3Node {\n    @Child private ApplyVmFunction3Node applyLambdaNode = ApplyVmFunction3NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmFunction self, Object arg1, Object arg2, Object arg3) {\n      return applyLambdaNode.execute(self, arg1, arg2, arg3);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/Function4Nodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.lambda.ApplyVmFunction4Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction4NodeGen;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.ExternalMethod4Node;\n\npublic final class Function4Nodes {\n  private Function4Nodes() {}\n\n  public abstract static class apply extends ExternalMethod4Node {\n    @Child private ApplyVmFunction4Node applyLambdaNode = ApplyVmFunction4NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmFunction self, Object arg1, Object arg2, Object arg3, Object arg4) {\n      return applyLambdaNode.execute(self, arg1, arg2, arg3, arg4);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/Function5Nodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.lambda.ApplyVmFunction5Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction5NodeGen;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.ExternalMethod5Node;\n\npublic final class Function5Nodes {\n  private Function5Nodes() {}\n\n  public abstract static class apply extends ExternalMethod5Node {\n    @Child private ApplyVmFunction5Node applyLambdaNode = ApplyVmFunction5NodeGen.create();\n\n    @Specialization\n    protected Object eval(\n        VmFunction self, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) {\n      return applyLambdaNode.execute(self, arg1, arg2, arg3, arg4, arg5);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/FunctionNodes.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\npublic final class FunctionNodes {\n  private FunctionNodes() {}\n\n  public abstract static class applyToList extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    @Specialization\n    protected Object eval(VmFunction self, VmList argList) {\n      var argCount = argList.getLength();\n\n      var args = new Object[2 + argCount];\n      args[0] = self.getThisValue();\n      args[1] = self;\n\n      var i = 2;\n      for (var arg : argList) {\n        args[i++] = arg;\n      }\n\n      return callNode.call(self.getCallTarget(), args);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/IntNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmSafeMath;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\n\npublic final class IntNodes {\n  private IntNodes() {}\n\n  public abstract static class ns extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.NANOS);\n    }\n  }\n\n  public abstract static class us extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.MICROS);\n    }\n  }\n\n  public abstract static class ms extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.MILLIS);\n    }\n  }\n\n  public abstract static class s extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.SECONDS);\n    }\n  }\n\n  public abstract static class min extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.MINUTES);\n    }\n  }\n\n  public abstract static class h extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.HOURS);\n    }\n  }\n\n  public abstract static class d extends ExternalPropertyNode {\n    @Specialization\n    protected VmDuration eval(long self) {\n      return new VmDuration(self, DurationUnit.DAYS);\n    }\n  }\n\n  public abstract static class b extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.BYTES);\n    }\n  }\n\n  public abstract static class kb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.KILOBYTES);\n    }\n  }\n\n  public abstract static class kib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.KIBIBYTES);\n    }\n  }\n\n  public abstract static class mb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.MEGABYTES);\n    }\n  }\n\n  public abstract static class mib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.MEBIBYTES);\n    }\n  }\n\n  public abstract static class gb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.GIGABYTES);\n    }\n  }\n\n  public abstract static class gib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.GIBIBYTES);\n    }\n  }\n\n  public abstract static class tb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.TERABYTES);\n    }\n  }\n\n  public abstract static class tib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.TEBIBYTES);\n    }\n  }\n\n  public abstract static class pb extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.PETABYTES);\n    }\n  }\n\n  public abstract static class pib extends ExternalPropertyNode {\n    @Specialization\n    protected VmDataSize eval(long self) {\n      return new VmDataSize(self, DataSizeUnit.PEBIBYTES);\n    }\n  }\n\n  public abstract static class sign extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(long self) {\n      return Long.signum(self);\n    }\n  }\n\n  public abstract static class abs extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(long self) {\n      return VmSafeMath.abs(self);\n    }\n  }\n\n  public abstract static class ceil extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(long self) {\n      return self;\n    }\n  }\n\n  public abstract static class floor extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(long self) {\n      return self;\n    }\n  }\n\n  public abstract static class toRadixString extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(long self, long radix) {\n      return (self < 0 ? \"-\" : \"\") + Long.toString(Math.abs(self), (int) radix);\n    }\n  }\n\n  public abstract static class round extends ExternalMethod0Node {\n    @Specialization\n    protected long eval(long self) {\n      return self;\n    }\n  }\n\n  public abstract static class truncate extends ExternalMethod0Node {\n    @Specialization\n    protected long eval(long self) {\n      return self;\n    }\n  }\n\n  public abstract static class toInt extends ExternalMethod0Node {\n    @Specialization\n    protected long eval(long self) {\n      return self;\n    }\n  }\n\n  public abstract static class toFloat extends ExternalMethod0Node {\n    @Specialization\n    protected double eval(long self) {\n      return self;\n    }\n  }\n\n  public abstract static class toString extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(long self) {\n      return Long.toString(self);\n    }\n  }\n\n  public abstract static class toFixed extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(long self, long fractionDigits) {\n      // see comment in FloatNodes.toFixed()\n      assert fractionDigits >= 0 && fractionDigits <= 20;\n\n      var format = VmUtils.createDecimalFormat((int) fractionDigits);\n      return format.format(self);\n    }\n  }\n\n  public abstract static class toDuration extends ExternalMethod1Node {\n    @Specialization\n    protected VmDuration eval(long self, String str) {\n      DurationUnit unit = DurationUnit.parse(str);\n      assert unit != null; // guaranteed by Pkl type check\n      return new VmDuration(self, unit);\n    }\n  }\n\n  public abstract static class toDataSize extends ExternalMethod1Node {\n    @Specialization\n    protected VmDataSize eval(long self, String str) {\n      DataSizeUnit unit = DataSizeUnit.parse(str);\n      assert unit != null; // guaranteed by Pkl type check\n      return new VmDataSize(self, unit);\n    }\n  }\n\n  public abstract static class shl extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(long self, long n) {\n      return self << n;\n    }\n  }\n\n  public abstract static class shr extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(long self, long n) {\n      return self >> n;\n    }\n  }\n\n  public abstract static class ushr extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(long self, long n) {\n      return self >>> n;\n    }\n  }\n\n  public abstract static class and extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(long self, long n) {\n      return self & n;\n    }\n  }\n\n  public abstract static class or extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(long self, long n) {\n      return self | n;\n    }\n  }\n\n  public abstract static class xor extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(long self, long n) {\n      return self ^ n;\n    }\n  }\n\n  public abstract static class inv extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(long self) {\n      return ~self;\n    }\n  }\n\n  public abstract static class isPositive extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(long self) {\n      return self >= 0;\n    }\n  }\n\n  public abstract static class isFinite extends ExternalPropertyNode {\n    @Specialization\n    @SuppressWarnings(\"UnusedParameters\")\n    protected boolean eval(long self) {\n      return true;\n    }\n  }\n\n  public abstract static class isInfinite extends ExternalPropertyNode {\n    @Specialization\n    @SuppressWarnings(\"UnusedParameters\")\n    protected boolean eval(long self) {\n      return false;\n    }\n  }\n\n  public abstract static class isNaN extends ExternalPropertyNode {\n    @Specialization\n    @SuppressWarnings(\"UnusedParameters\")\n    protected boolean eval(long self) {\n      return false;\n    }\n  }\n\n  public abstract static class isEven extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(long self) {\n      return (self & 1) == 0;\n    }\n  }\n\n  public abstract static class isOdd extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(long self) {\n      return (self & 1) != 0;\n    }\n  }\n\n  public abstract static class isNonZero extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(long self) {\n      return self != 0;\n    }\n  }\n\n  public abstract static class isBetween extends ExternalMethod2Node {\n    @Specialization\n    protected boolean evalIntInt(long self, long start, long inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n\n    @Specialization\n    protected boolean evalIntFloat(long self, long start, double inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n\n    @Specialization\n    protected boolean evalFloatInt(long self, double start, long inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n\n    @Specialization\n    protected boolean evalFloatFloat(long self, double start, double inclusiveEnd) {\n      return self >= start && self <= inclusiveEnd;\n    }\n  }\n\n  public abstract static class toChar extends ExternalMethod0Node {\n    @Specialization\n    protected String eval(long self) {\n      var codePoint = (int) self;\n      if (codePoint == self && Character.isValidCodePoint(codePoint)) {\n        return Character.toString(codePoint);\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"invalidCodePoint\", self).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/IntSeqNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport com.oracle.truffle.api.nodes.Node;\nimport org.pkl.core.ast.lambda.*;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.stdlib.PklName;\nimport org.pkl.core.util.EconomicMaps;\n\npublic final class IntSeqNodes {\n  private IntSeqNodes() {}\n\n  public abstract static class start extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmIntSeq self) {\n      return self.start;\n    }\n  }\n\n  public abstract static class end extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmIntSeq self) {\n      return self.end;\n    }\n  }\n\n  public abstract static class step extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmIntSeq self) {\n      return self.step;\n    }\n  }\n\n  @PklName(\"step\")\n  public abstract static class stepMethod extends ExternalMethod1Node {\n    @Specialization\n    protected VmIntSeq eval(VmIntSeq self, long step) {\n      return new VmIntSeq(self.start, self.end, step);\n    }\n  }\n\n  public abstract static class fold extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmIntSeq self, Object initial, VmFunction function) {\n      var result = initial;\n      var iter = self.iterator();\n      while (iter.hasNext()) {\n        result = applyLambdaNode.execute(function, result, iter.nextLong());\n      }\n      reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class map extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmIntSeq self, VmFunction function) {\n      var builder = VmList.EMPTY.builder();\n      var iterator = self.iterator();\n      while (iterator.hasNext()) {\n        builder.add(applyLambdaNode.execute(function, iterator.nextLong()));\n      }\n      reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class toList extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmList eval(VmIntSeq self) {\n      var builder = VmList.EMPTY.builder();\n      var iterator = self.iterator();\n      while (iterator.hasNext()) {\n        builder.add(iterator.nextLong());\n      }\n      reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class toListing extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmListing eval(VmIntSeq self) {\n      var result = EconomicMaps.<Object, ObjectMember>create();\n      var iterator = self.iterator();\n      long idx = 0;\n\n      while (iterator.hasNext()) {\n        EconomicMaps.put(\n            result,\n            idx,\n            VmUtils.createSyntheticObjectElement(String.valueOf(idx), iterator.nextLong()));\n        idx += 1;\n      }\n\n      reportLoopCount(this, self.getLength());\n\n      return new VmListing(\n          VmUtils.createEmptyMaterializedFrame(),\n          BaseModule.getListingClass().getPrototype(),\n          result,\n          result.size());\n    }\n  }\n\n  private static void reportLoopCount(Node node, long count) {\n    LoopNode.reportLoopCount(node, count > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) count);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/JsonRendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.json.JsonEscaper;\n\npublic final class JsonRendererNodes {\n  private JsonRendererNodes() {}\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      // JSON document can have any top-level value\n      // https://stackoverflow.com/a/3833312\n      // http://www.ietf.org/rfc/rfc7159.txt\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  private static JsonRenderer createRenderer(VmTyped self, StringBuilder builder) {\n    var indent = (String) VmUtils.readMember(self, Identifier.INDENT);\n    var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);\n    return new JsonRenderer(builder, indent, PklConverter.fromRenderer(self), omitNullProperties);\n  }\n\n  private static final class JsonRenderer extends AbstractStringRenderer {\n    private final String separator;\n\n    private final JsonEscaper escaper = new JsonEscaper(false);\n\n    JsonRenderer(\n        StringBuilder builder, String indent, PklConverter converter, boolean omitNullProperties) {\n      super(\"JSON\", builder, indent, converter, omitNullProperties, omitNullProperties);\n      separator = indent.isEmpty() ? \":\" : \": \";\n    }\n\n    @Override\n    protected void visitDocument(Object value) {\n      visit(value);\n      builder.append('\\n');\n    }\n\n    @Override\n    protected void visitTopLevelValue(Object value) {\n      visit(value);\n    }\n\n    /** Use same escaping strategy as {@link org.pkl.core.util.json.JsonWriter}. */\n    @Override\n    public void visitString(String value) {\n      builder.append('\"');\n      escaper.escape(value, builder);\n      builder.append('\"');\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      builder.append((long) value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      if (value.isNaN() || value.isInfinite()) {\n        throw new VmExceptionBuilder().evalError(\"cannotRenderValue\", value, name).build();\n      }\n      builder.append((double) value);\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      builder.append((boolean) value);\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      builder.append(\"null\");\n    }\n\n    @Override\n    public void visitRenderDirective(VmTyped value) {\n      // append verbatim\n      builder.append(VmUtils.readTextProperty(value));\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void startDynamic(VmDynamic value) {\n      if (value.hasElements()) {\n        doBeginArray();\n      } else {\n        doBeginObject();\n      }\n    }\n\n    @Override\n    protected void startTyped(VmTyped value) {\n      doBeginObject();\n    }\n\n    @Override\n    protected void startListing(VmListing value) {\n      doBeginArray();\n    }\n\n    protected void startMapping(VmMapping value) {\n      doBeginObject();\n    }\n\n    @Override\n    protected void startList(VmList value) {\n      doBeginArray();\n    }\n\n    @Override\n    protected void startSet(VmSet value) {\n      doBeginArray();\n    }\n\n    @Override\n    protected void startMap(VmMap value) {\n      doBeginObject();\n    }\n\n    private void doBeginArray() {\n      builder.append(\"[\");\n      increaseIndent();\n    }\n\n    private void doBeginObject() {\n      builder.append(\"{\");\n      increaseIndent();\n    }\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {\n      if (!isFirst) builder.append(',');\n      startNewLine();\n      visit(value);\n    }\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {\n      if (!isFirst) builder.append(',');\n      startNewLine();\n\n      if (key instanceof String string) {\n        visitString(string);\n        builder.append(separator);\n        return;\n      }\n\n      if (isRenderDirective(key)) {\n        visitRenderDirective((VmTyped) key);\n        builder.append(separator);\n        return;\n      }\n\n      cannotRenderNonStringKey(key);\n    }\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      visit(value);\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      if (!isFirst) builder.append(',');\n      startNewLine();\n      visitString(name.toString());\n      builder.append(separator);\n      visit(value);\n    }\n\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {\n      if (value.hasElements()) {\n        endArray(isEmpty);\n      } else {\n        endObject(isEmpty);\n      }\n    }\n\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {\n      endObject(isEmpty);\n    }\n\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {\n      endArray(isEmpty);\n    }\n\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {\n      endObject(isEmpty);\n    }\n\n    @Override\n    protected void endList(VmList value) {\n      endArray(value.isEmpty());\n    }\n\n    @Override\n    protected void endSet(VmSet value) {\n      endArray(value.isEmpty());\n    }\n\n    @Override\n    protected void endMap(VmMap value) {\n      endObject(value.isEmpty());\n    }\n\n    private void endArray(boolean isEmpty) {\n      decreaseIndent();\n      if (!isEmpty) startNewLine();\n      builder.append(']');\n    }\n\n    private void endObject(boolean isEmpty) {\n      decreaseIndent();\n      if (!isEmpty) startNewLine();\n      builder.append('}');\n    }\n\n    private void startNewLine() {\n      if (indent.isEmpty()) return;\n\n      builder.append('\\n');\n      builder.append(currIndent);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/ListNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport org.pkl.core.ast.expression.binary.*;\nimport org.pkl.core.ast.internal.IsInstanceOfNode;\nimport org.pkl.core.ast.internal.IsInstanceOfNodeGen;\nimport org.pkl.core.ast.lambda.*;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeNode.UInt8TypeAliasTypeNode;\nimport org.pkl.core.ast.type.VmTypeMismatchException;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.*;\nimport org.pkl.core.stdlib.base.CollectionNodes.CompareByNode;\nimport org.pkl.core.stdlib.base.CollectionNodes.CompareNode;\nimport org.pkl.core.stdlib.base.CollectionNodes.CompareWithNode;\nimport org.pkl.core.util.EconomicSets;\nimport org.pkl.core.util.LateInit;\n\n// duplication between ListNodes and SetNodes is \"intentional\"\n// (sharing nodes between VmCollection subtypes results in\n// polymorphic guards/calls which seems less Truffle idiomatic)\n@SuppressWarnings(\"Duplicates\")\npublic final class ListNodes {\n  private ListNodes() {}\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmList self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class isEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmList self) {\n      return self.isEmpty();\n    }\n  }\n\n  public abstract static class isNotEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmList self) {\n      return !self.isEmpty();\n    }\n  }\n\n  public abstract static class lastIndex extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmList self) {\n      return self.getLastIndex();\n    }\n  }\n\n  public abstract static class getOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmList self, long index) {\n      return self.getOrNull(index);\n    }\n  }\n\n  public abstract static class sublist extends ExternalMethod2Node {\n    @Specialization\n    protected Object eval(VmList self, long start, long exclusiveEnd) {\n      var length = self.getLength();\n\n      if (start < 0 || start > length) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", start, 0, length)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      if (exclusiveEnd < start || exclusiveEnd > length) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", exclusiveEnd, start, length)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return self.subList(start, exclusiveEnd);\n    }\n  }\n\n  public abstract static class sublistOrNull extends ExternalMethod2Node {\n    @Specialization\n    protected Object eval(VmList self, long start, long exclusiveEnd) {\n      return self.subListOrNull(start, exclusiveEnd);\n    }\n  }\n\n  public abstract static class first extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getFirst();\n    }\n  }\n\n  public abstract static class firstOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getFirstOrNull();\n    }\n  }\n\n  public abstract static class rest extends ExternalPropertyNode {\n    @Specialization\n    protected VmList eval(VmList self) {\n      return self.getRest();\n    }\n  }\n\n  public abstract static class restOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getRestOrNull();\n    }\n  }\n\n  public abstract static class last extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getLast();\n    }\n  }\n\n  public abstract static class lastOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getLastOrNull();\n    }\n  }\n\n  public abstract static class single extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getSingle();\n    }\n  }\n\n  public abstract static class singleOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmList self) {\n      return self.getSingleOrNull();\n    }\n  }\n\n  public abstract static class startsWith extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmList self, VmCollection other) {\n      return self.startsWith(other);\n    }\n  }\n\n  public abstract static class endsWith extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmList self, VmCollection other) {\n      return self.endsWith(other);\n    }\n  }\n\n  public abstract static class split extends ExternalMethod1Node {\n    @Specialization\n    protected VmPair eval(VmList self, long index) {\n\n      if (index < 0 || index > self.getLength()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", index, 0, self.getLength())\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return self.split(index);\n    }\n  }\n\n  public abstract static class splitOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmList self, long index) {\n      return self.splitOrNull(index);\n    }\n  }\n\n  public abstract static class partition extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmPair eval(VmList self, VmFunction function) {\n      var builder1 = self.builder();\n      var builder2 = self.builder();\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) {\n          builder1.add(elem);\n        } else {\n          builder2.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return new VmPair(builder1.build(), builder2.build());\n    }\n  }\n\n  public abstract static class contains extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmList self, Object element) {\n      return self.contains(element);\n    }\n  }\n\n  public abstract static class find extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotFindMatchingCollectionElement\")\n          .withProgramValue(\"Collection\", self)\n          .build();\n    }\n  }\n\n  public abstract static class findOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class findLast extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      var iterator = self.reverseIterator();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotFindMatchingCollectionElement\")\n          .withProgramValue(\"Collection\", self)\n          .build();\n    }\n  }\n\n  public abstract static class findLastOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      var iterator = self.reverseIterator();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class indexOf extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(VmList self, Object elem) {\n      var result = self.indexOf(elem);\n      if (result == -1) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"cannotFindCollectionElement\")\n            .withProgramValue(\"Element\", elem)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return result;\n    }\n  }\n\n  public abstract static class indexOfOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmList self, Object elem) {\n      return self.indexOfOrNull(elem);\n    }\n  }\n\n  public abstract static class lastIndexOf extends ExternalMethod1Node {\n    @Specialization\n    protected long eval(VmList self, Object elem) {\n      var result = self.lastIndexOf(elem);\n      if (result == -1) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"cannotFindCollectionElement\")\n            .withProgramValue(\"Element\", elem)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return result;\n    }\n  }\n\n  public abstract static class lastIndexOfOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmList self, Object elem) {\n      return self.lastIndexOfOrNull(elem);\n    }\n  }\n\n  public abstract static class findIndex extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected long eval(VmList self, VmFunction function) {\n      long idx = 0;\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return idx;\n        idx += 1;\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotFindMatchingCollectionElement\")\n          .withProgramValue(\"Collection\", self)\n          .build();\n    }\n  }\n\n  public abstract static class findIndexOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      long idx = 0;\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return idx;\n        idx += 1;\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class findLastIndex extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected long eval(VmList self, VmFunction function) {\n      var idx = self.getLength();\n      var iter = self.reverseIterator();\n      while (iter.hasNext()) {\n        idx -= 1;\n        if (applyLambdaNode.executeBoolean(function, iter.next())) return idx;\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotFindMatchingCollectionElement\")\n          .withProgramValue(\"Collection\", self)\n          .build();\n    }\n  }\n\n  public abstract static class findLastIndexOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      var idx = self.getLength();\n      var iter = self.reverseIterator();\n      while (iter.hasNext()) {\n        idx -= 1;\n        if (applyLambdaNode.executeBoolean(function, iter.next())) {\n          return (long) idx;\n        }\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class every extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmList self, VmFunction function) {\n      for (var elem : self) {\n        if (!applyLambdaNode.executeBoolean(function, elem)) return false;\n      }\n      return true;\n    }\n  }\n\n  public abstract static class any extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmList self, VmFunction function) {\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return true;\n      }\n      return false;\n    }\n  }\n\n  public abstract static class filter extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) {\n          builder.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class filterNonNull extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmList self) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (elem instanceof VmNull) continue;\n        builder.add(elem);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class filterIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, index++, elem)) {\n          builder.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class filterIsInstance extends ExternalMethod1Node {\n    @Child private IsInstanceOfNode isInstanceOfNode = IsInstanceOfNodeGen.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmClass clazz) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (isInstanceOfNode.executeBoolean(elem, clazz)) {\n          builder.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class isDistinct extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmList self) {\n      var visited = EconomicSets.create();\n\n      for (var elem : self) {\n        if (!EconomicSets.add(visited, elem)) return false;\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return true;\n    }\n  }\n\n  public abstract static class isDistinctBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmList self, VmFunction function) {\n      var visited = EconomicSets.create();\n\n      for (var elem : self) {\n        if (!EconomicSets.add(visited, applyLambdaNode.execute(function, elem))) return false;\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return true;\n    }\n  }\n\n  public abstract static class distinct extends ExternalPropertyNode {\n    @Specialization\n    protected VmList eval(VmList self) {\n      var builder = self.builder();\n      var visited = EconomicSets.create();\n\n      for (var elem : self) {\n        if (EconomicSets.add(visited, elem)) builder.add(elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class distinctBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      var visited = EconomicSets.create();\n\n      for (var elem : self) {\n        if (EconomicSets.add(visited, applyLambdaNode.execute(function, elem))) builder.add(elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class map extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        builder.add(applyLambdaNode.execute(function, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        builder.add(applyLambdaNode.execute(function, index++, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapNonNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        var newValue = applyLambdaNode.execute(function, elem);\n        if (newValue instanceof VmNull) continue;\n        builder.add(newValue);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapNonNullIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        var newValue = applyLambdaNode.execute(function, index++, elem);\n        if (newValue instanceof VmNull) continue;\n        builder.add(newValue);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatMap extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        builder.addAll(applyLambdaNode.executeCollection(function, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatMapIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        builder.addAll(applyLambdaNode.executeCollection(function, index++, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatten extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmList self) {\n      return (VmList) self.flatten();\n    }\n  }\n\n  public abstract static class take extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmList self, long n) {\n      return self.take(n);\n    }\n  }\n\n  public abstract static class takeWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (!applyLambdaNode.executeBoolean(function, elem)) {\n          return builder.build();\n        }\n        builder.add(elem);\n      }\n      return self;\n    }\n  }\n\n  public abstract static class takeLast extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmList self, long n) {\n      return self.takeLast(n);\n    }\n  }\n\n  public abstract static class takeLastWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var idx = self.getLength();\n      var iter = self.reverseIterator();\n      while (iter.hasNext()) {\n        if (!applyLambdaNode.executeBoolean(function, iter.next())) break;\n        idx -= 1;\n      }\n      return self.drop(idx);\n    }\n  }\n\n  public abstract static class drop extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmList self, long n) {\n      return self.drop(n);\n    }\n  }\n\n  public abstract static class dropWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var idx = 0;\n      for (var elem : self) {\n        if (!applyLambdaNode.executeBoolean(function, elem)) break;\n        idx += 1;\n      }\n      return self.drop(idx);\n    }\n  }\n\n  public abstract static class dropLast extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmList self, long n) {\n      return self.dropLast(n);\n    }\n  }\n\n  public abstract static class dropLastWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmList eval(VmList self, VmFunction function) {\n      var idx = self.getLength();\n      var iter = self.reverseIterator();\n      while (iter.hasNext()) {\n        if (!applyLambdaNode.executeBoolean(function, iter.next())) break;\n        idx -= 1;\n      }\n      return self.take(idx);\n    }\n  }\n\n  public abstract static class fold extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, Object initial, VmFunction function) {\n      var iter = self.iterator();\n      var result = initial;\n      while (iter.hasNext()) {\n        var elem = iter.next();\n        result = applyLambdaNode.execute(function, result, elem);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class foldBack extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, Object initial, VmFunction function) {\n      var iter = self.reverseIterator();\n      var result = initial;\n      while (iter.hasNext()) {\n        var elem = iter.next();\n        result = applyLambdaNode.execute(function, elem, result);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class foldIndexed extends ExternalMethod2Node {\n    @Child private ApplyVmFunction3Node applyLambdaNode = ApplyVmFunction3NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, Object initial, VmFunction function) {\n      var iter = self.iterator();\n      var result = initial;\n      long index = 0;\n\n      while (iter.hasNext()) {\n        var elem = iter.next();\n        result = applyLambdaNode.execute(function, index++, result, elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class reduce extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        result = applyLambdaNode.execute(function, result, elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class reduceOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        result = applyLambdaNode.execute(function, result, elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class groupBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      var builder = VmMap.builder();\n\n      for (Object elem : self) {\n        var key = applyLambdaNode.execute(function, elem);\n        var value = builder.get(key);\n        var newValue = value == null ? VmList.of(elem) : ((VmList) value).add(elem);\n        builder.add(key, newValue);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class min extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (lessThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minOrNull extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (lessThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class max extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (greaterThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxOrNull extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (greaterThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (lessThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (greaterThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minByOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (lessThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxByOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmList self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (greaterThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minWith extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.executeBoolean(function, elem, result);\n        if (cmpResult) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxWith extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.executeBoolean(function, result, elem);\n        if (cmpResult) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minWithOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.executeBoolean(function, elem, result);\n        if (cmpResult) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxWithOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmList self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.executeBoolean(function, result, elem);\n        if (cmpResult) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class sort extends ExternalMethod0Node {\n    @Child private CompareNode compareNode = new CompareNode();\n\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmList self) {\n      return VmList.create(MergeSort.sort(frame, self.toArray(), compareNode, null));\n    }\n  }\n\n  public abstract static class sortBy extends ExternalMethod1Node {\n    @Child private CompareByNode compareByNode = new CompareByNode();\n\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmList self, VmFunction selector) {\n      return VmList.create(MergeSort.sort(frame, self.toArray(), compareByNode, selector));\n    }\n  }\n\n  public abstract static class sortWith extends ExternalMethod1Node {\n    @Child private CompareWithNode compareWithNode = new CompareWithNode();\n\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmList self, VmFunction function) {\n      return VmList.create(MergeSort.sort(frame, self.toArray(), compareWithNode, function));\n    }\n  }\n\n  public abstract static class add extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmList self, Object element) {\n      return self.add(element);\n    }\n  }\n\n  public abstract static class replaceOrNull extends ExternalMethod2Node {\n    @Specialization\n    protected Object eval(VmList self, long index, Object replacement) {\n      return self.replaceOrNull(index, replacement);\n    }\n  }\n\n  public abstract static class replace extends ExternalMethod2Node {\n    @Specialization\n    protected VmList eval(VmList self, long index, Object replacement) {\n      if (index < 0 || index >= self.getLength()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", index, 0, self.getLength() - 1)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return self.replace(index, replacement);\n    }\n  }\n\n  public abstract static class replaceRange extends ExternalMethod3Node {\n    @Specialization\n    protected VmList eval(VmList self, long start, long exclusiveEnd, VmCollection replacement) {\n      var length = self.getLength();\n\n      if (start < 0 || start > length) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", start, 0, length)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n\n      if (exclusiveEnd < start || exclusiveEnd > length) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", exclusiveEnd, start, length)\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return self.replaceRange(start, exclusiveEnd, replacement);\n    }\n  }\n\n  public abstract static class replaceRangeOrNull extends ExternalMethod3Node {\n    @Specialization\n    protected Object eval(VmList self, long start, long exclusiveEnd, VmCollection replacement) {\n      return self.replaceRangeOrNull(start, exclusiveEnd, replacement);\n    }\n  }\n\n  public abstract static class repeat extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmList self, long n) {\n      return self.repeat(n);\n    }\n  }\n\n  public abstract static class count extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected long eval(VmList self, VmFunction function) {\n      long count = 0;\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) count += 1;\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return count;\n    }\n  }\n\n  public abstract static class reverse extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmList self) {\n      return self.reverse();\n    }\n  }\n\n  public abstract static class join extends ExternalMethod1Node {\n    @Specialization\n    protected String eval(VmList self, String separator) {\n      return self.join(separator);\n    }\n  }\n\n  public abstract static class zip extends ExternalMethod1Node {\n    @Specialization\n    protected VmCollection eval(VmList self, VmCollection coll) {\n      return self.zip(coll);\n    }\n  }\n\n  public abstract static class toList extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmList self) {\n      return self;\n    }\n  }\n\n  public abstract static class toSet extends ExternalMethod0Node {\n    @Specialization\n    protected VmSet eval(VmList self) {\n      return self.toSet();\n    }\n  }\n\n  public abstract static class toMap extends ExternalMethod2Node {\n    @Child private ApplyVmFunction1Node applyKeyExtractorNode = ApplyVmFunction1Node.create();\n    @Child private ApplyVmFunction1Node applyValueExtractorNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmMap eval(VmList self, VmFunction keyExtractor, VmFunction valueExtractor) {\n      var builder = VmMap.builder();\n\n      for (var elem : self) {\n        var key = applyKeyExtractorNode.execute(keyExtractor, elem);\n        var value = applyValueExtractorNode.execute(valueExtractor, elem);\n        builder.add(key, value);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class toListing extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmListing eval(VmList self) {\n      return self.toListing();\n    }\n  }\n\n  public abstract static class toDynamic extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmDynamic eval(VmList self) {\n      return self.toDynamic();\n    }\n  }\n\n  public abstract static class toBytes extends ExternalMethod0Node {\n\n    @Child @LateInit private TypeNode typeNode;\n\n    private TypeNode getTypeNode() {\n      if (typeNode == null) {\n        CompilerDirectives.transferToInterpreterAndInvalidate();\n        typeNode = new UInt8TypeAliasTypeNode();\n      }\n      return typeNode;\n    }\n\n    @Specialization\n    protected VmBytes eval(VirtualFrame frame, VmList self) {\n      var typeNode = getTypeNode();\n      var bytes = new byte[self.getLength()];\n      try {\n        for (var i = 0; i < self.getLength(); i++) {\n          var elem = self.get(i);\n          var num = (Long) typeNode.executeEagerly(frame, elem);\n          bytes[i] = num.byteValue();\n        }\n      } catch (VmTypeMismatchException e) {\n        CompilerDirectives.transferToInterpreter();\n        throw e.toVmException();\n      }\n      return new VmBytes(self, bytes);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/ListingNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.ast.lambda.*;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.*;\n\npublic final class ListingNodes {\n  private ListingNodes() {}\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmListing self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class isEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmListing self) {\n      return self.isEmpty();\n    }\n  }\n\n  public abstract static class isNotEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmListing self) {\n      return !self.isEmpty();\n    }\n  }\n\n  public abstract static class lastIndex extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmListing self) {\n      return self.getLength() - 1;\n    }\n  }\n\n  public abstract static class getOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmListing self, long index) {\n      if (index < 0 || index >= self.getLength()) {\n        return VmNull.withoutDefault();\n      }\n      return VmUtils.readMember(self, index);\n    }\n  }\n\n  public abstract static class getOrDefault extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n    @Child private ApplyVmFunction1Node applyNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmListing self, long index) {\n      if (index < 0 || index >= self.getLength()) {\n        var defaultFunction = (VmFunction) VmUtils.readMember(self, Identifier.DEFAULT, callNode);\n        return applyNode.execute(defaultFunction, index);\n      }\n      return VmUtils.readMember(self, index);\n    }\n  }\n\n  public abstract static class isDistinct extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected boolean eval(VmListing self) {\n      var visitedValues = CollectionUtils.newHashSet();\n      return self.forceAndIterateMemberValues((key, member, value) -> visitedValues.add(value));\n    }\n  }\n\n  public abstract static class isDistinctBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmListing self, VmFunction selector) {\n      var visitedValues = CollectionUtils.newHashSet();\n      return self.forceAndIterateMemberValues(\n          (key, member, value) -> visitedValues.add(applyNode.execute(selector, value)));\n    }\n  }\n\n  public abstract static class distinct extends ExternalPropertyNode {\n    @Specialization\n    protected VmListing eval(VmListing self) {\n      var visitedValues = CollectionUtils.newHashSet();\n      var builder = new VmObjectBuilder();\n\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            if (visitedValues.add(value)) {\n              builder.addElement(value);\n            }\n            return true;\n          });\n\n      return builder.toListing();\n    }\n  }\n\n  public abstract static class first extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmListing self) {\n      checkNonEmpty(self, this);\n      return VmUtils.readMember(self, 0L);\n    }\n  }\n\n  public abstract static class firstOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmListing self) {\n      if (self.isEmpty()) {\n        return VmNull.withoutDefault();\n      }\n      return VmUtils.readMember(self, 0L);\n    }\n  }\n\n  public abstract static class last extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmListing self) {\n      checkNonEmpty(self, this);\n      return VmUtils.readMember(self, self.getLength() - 1L);\n    }\n  }\n\n  public abstract static class lastOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmListing self) {\n      var length = self.getLength();\n      return length == 0 ? VmNull.withoutDefault() : VmUtils.readMember(self, length - 1L);\n    }\n  }\n\n  public abstract static class single extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmListing self) {\n      checkSingleton(self, this);\n      return VmUtils.readMember(self, 0L);\n    }\n  }\n\n  public abstract static class singleOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmListing self) {\n      if (self.getLength() != 1) {\n        return VmNull.withoutDefault();\n      }\n      return VmUtils.readMember(self, 0L);\n    }\n  }\n\n  public abstract static class distinctBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmListing eval(VmListing self, VmFunction selector) {\n      var visitedValues = CollectionUtils.newHashSet();\n      var builder = new VmObjectBuilder();\n\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            if (visitedValues.add(applyNode.execute(selector, value))) {\n              builder.addElement(value);\n            }\n            return true;\n          });\n\n      return builder.toListing();\n    }\n  }\n\n  public abstract static class every extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmListing self, VmFunction predicate) {\n      var result = new MutableBoolean(true);\n      self.iterateMemberValues(\n          (key, member, value) -> {\n            if (value == null) {\n              value = VmUtils.readMember(self, key);\n            }\n            result.set(applyNode.executeBoolean(predicate, value));\n            return result.get();\n          });\n      return result.get();\n    }\n  }\n\n  public abstract static class any extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmListing self, VmFunction predicate) {\n      var result = new MutableBoolean(false);\n      self.iterateMemberValues(\n          (key, member, value) -> {\n            if (value == null) {\n              value = VmUtils.readMember(self, key);\n            }\n            result.set(applyNode.executeBoolean(predicate, value));\n            return !result.get();\n          });\n      return result.get();\n    }\n  }\n\n  public abstract static class contains extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmListing self, Object element) {\n      var result = new MutableBoolean(false);\n      self.iterateMemberValues(\n          (key, member, value) -> {\n            if (value == null) {\n              value = VmUtils.readMember(self, key);\n            }\n            result.set(element.equals(value));\n            return !result.get();\n          });\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result.get();\n    }\n  }\n\n  public abstract static class fold extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmListing self, Object initial, VmFunction function) {\n      var result = new MutableReference<>(initial);\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            result.set(applyLambdaNode.execute(function, result.get(), value));\n            return true;\n          });\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result.get();\n    }\n  }\n\n  public abstract static class foldIndexed extends ExternalMethod2Node {\n    @Child private ApplyVmFunction3Node applyLambdaNode = ApplyVmFunction3NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmListing self, Object initial, VmFunction function) {\n      var index = new MutableLong(0);\n      var result = new MutableReference<>(initial);\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            result.set(\n                applyLambdaNode.execute(function, index.getAndIncrement(), result.get(), value));\n            return true;\n          });\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result.get();\n    }\n  }\n\n  public abstract static class join extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmListing self, String separator) {\n      if (self.isEmpty()) return \"\";\n\n      var builder = new StringBuilder();\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            if (!key.equals(0L)) {\n              builder.append(separator);\n            }\n            builder.append(value);\n            return true;\n          });\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.toString();\n    }\n  }\n\n  public abstract static class toList extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmListing self) {\n      var builder = VmList.EMPTY.builder();\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            builder.add(value);\n            return true;\n          });\n      return builder.build();\n    }\n  }\n\n  public abstract static class toSet extends ExternalMethod0Node {\n    @Specialization\n    protected VmSet eval(VmListing self) {\n      var builder = VmSet.EMPTY.builder();\n      self.forceAndIterateMemberValues(\n          (key, member, value) -> {\n            builder.add(value);\n            return true;\n          });\n      return builder.build();\n    }\n  }\n\n  private static void checkNonEmpty(VmListing self, PklNode node) {\n    if (self.isEmpty()) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder()\n          .evalError(\"expectedNonEmptyListing\")\n          .withLocation(node)\n          .build();\n    }\n  }\n\n  private static void checkSingleton(VmListing self, PklNode node) {\n    if (self.getLength() != 1) {\n      CompilerDirectives.transferToInterpreter();\n      throw new VmExceptionBuilder()\n          .evalError(\"expectedSingleElementListing\")\n          .withLocation(node)\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/MapNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport java.util.Map;\nimport org.pkl.core.ast.lambda.*;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.MutableReference;\n\npublic final class MapNodes {\n  private MapNodes() {}\n\n  public abstract static class getOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmMap self, Object key) {\n      return self.getOrVmNull(key);\n    }\n  }\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmMap self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class isEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmMap self) {\n      return self.isEmpty();\n    }\n  }\n\n  public abstract static class isNotEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmMap self) {\n      return !self.isEmpty();\n    }\n  }\n\n  public abstract static class keys extends ExternalPropertyNode {\n    @Specialization\n    protected VmSet eval(VmMap self) {\n      return self.keys();\n    }\n  }\n\n  public abstract static class values extends ExternalPropertyNode {\n    @Specialization\n    protected VmList eval(VmMap self) {\n      return self.values();\n    }\n  }\n\n  public abstract static class entries extends ExternalPropertyNode {\n    @Specialization\n    protected VmList eval(VmMap self) {\n      return self.entries();\n    }\n  }\n\n  public abstract static class containsKey extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmMap self, Object key) {\n      return self.containsKey(key);\n    }\n  }\n\n  public abstract static class containsValue extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmMap self, Object value) {\n      return self.containsValue(value);\n    }\n  }\n\n  public abstract static class put extends ExternalMethod2Node {\n    @Specialization\n    protected VmMap eval(VmMap self, Object key, Object value) {\n      return self.put(key, value);\n    }\n  }\n\n  public abstract static class remove extends ExternalMethod1Node {\n    @Specialization\n    protected VmMap eval(VmMap self, Object key) {\n      return self.remove(key);\n    }\n  }\n\n  public abstract static class filter extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmMap eval(VmMap self, VmFunction function) {\n      var builder = VmMap.builder();\n      for (var entry : self) {\n        var key = VmUtils.getKey(entry);\n        var value = VmUtils.getValue(entry);\n        if (applyLambdaNode.executeBoolean(function, key, value)) {\n          builder.add(key, value);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class fold extends ExternalMethod2Node {\n    @Child private ApplyVmFunction3Node applyLambdaNode = ApplyVmFunction3NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmMap self, Object initial, VmFunction function) {\n      var result = new MutableReference<>(initial);\n      for (var entry : self) {\n        result.set(\n            applyLambdaNode.execute(\n                function, result.get(), VmUtils.getKey(entry), VmUtils.getValue(entry)));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result.get();\n    }\n  }\n\n  public abstract static class map extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmMap eval(VmMap self, VmFunction function) {\n      var builder = VmMap.builder();\n      for (var entry : self) {\n        var pair =\n            applyLambdaNode.executePair(function, VmUtils.getKey(entry), VmUtils.getValue(entry));\n        builder.add(pair.getFirst(), pair.getSecond());\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapKeys extends ExternalMethod1Node {\n    @Specialization\n    protected VmMap eval(\n        VmMap self, VmFunction function, @Cached(\"create()\") ApplyVmFunction2Node applyNode) {\n      var builder = VmMap.builder();\n      for (var entry : self) {\n        builder.add(\n            applyNode.execute(function, VmUtils.getKey(entry), VmUtils.getValue(entry)),\n            VmUtils.getValue(entry));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapValues extends ExternalMethod1Node {\n    @Specialization\n    protected VmMap eval(\n        VmMap self, VmFunction function, @Cached(\"create()\") ApplyVmFunction2Node applyNode) {\n      var builder = VmMap.builder();\n      for (var entry : self) {\n        builder.add(\n            VmUtils.getKey(entry),\n            applyNode.execute(function, VmUtils.getKey(entry), VmUtils.getValue(entry)));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatMap extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmMap eval(VmMap self, VmFunction function) {\n      var builder = VmMap.builder();\n      for (var entry : self) {\n        VmMap flatMapResult =\n            applyLambdaNode.executeMap(function, VmUtils.getKey(entry), VmUtils.getValue(entry));\n\n        for (Map.Entry<Object, Object> flatMapEntry : flatMapResult) {\n          builder.add(VmUtils.getKey(flatMapEntry), VmUtils.getValue(flatMapEntry));\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class every extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected boolean eval(VmMap self, VmFunction function) {\n      for (var entry : self) {\n        if (!applyLambdaNode.executeBoolean(\n            function, VmUtils.getKey(entry), VmUtils.getValue(entry))) return false;\n      }\n      return true;\n    }\n  }\n\n  public abstract static class any extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected boolean eval(VmMap self, VmFunction function) {\n      for (var entry : self) {\n        if (applyLambdaNode.executeBoolean(\n            function, VmUtils.getKey(entry), VmUtils.getValue(entry))) return true;\n      }\n      return false;\n    }\n  }\n\n  public abstract static class toMap extends ExternalMethod0Node {\n    @Specialization\n    protected VmMap eval(VmMap self) {\n      return self;\n    }\n  }\n\n  public abstract static class toDynamic extends ExternalMethod0Node {\n    @Specialization\n    protected VmDynamic eval(VmMap self) {\n      return self.toDynamic();\n    }\n  }\n\n  public abstract static class toTyped extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmMap self, VmClass clazz) {\n      if (!clazz.isSubclassOf(BaseModule.getTypedClass())) {\n        throw exceptionBuilder().evalError(\"notASubclassOfTyped\", clazz).build();\n      }\n\n      VmUtils.checkIsInstantiable(clazz, null);\n\n      var result =\n          new VmTyped(\n              VmUtils.createEmptyMaterializedFrame(),\n              clazz.getPrototype(),\n              clazz,\n              clazz.getMapToTypedMembers());\n      result.setExtraStorage(self);\n      return result;\n    }\n  }\n\n  public abstract static class toMapping extends ExternalMethod0Node {\n    @Specialization\n    protected VmMapping eval(VmMap self) {\n      return self.toMapping();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/MappingNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction2Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction2NodeGen;\nimport org.pkl.core.ast.lambda.ApplyVmFunction3Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction3NodeGen;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.core.util.MutableReference;\n\npublic final class MappingNodes {\n  private MappingNodes() {}\n\n  public abstract static class isEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmMapping self) {\n      return self.isEmpty();\n    }\n  }\n\n  public abstract static class isNotEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmMapping self) {\n      return !self.isEmpty();\n    }\n  }\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmMapping self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class keys extends ExternalPropertyNode {\n    @Specialization\n    protected VmSet eval(VmMapping self) {\n      return self.getAllKeys();\n    }\n  }\n\n  public abstract static class containsKey extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmMapping self, Object key) {\n      if (self.hasCachedValue(key)) return true;\n\n      for (VmObjectLike curr = self; curr != null; curr = curr.getParent()) {\n        if (curr.hasMember(key)) return true;\n      }\n\n      return false;\n    }\n  }\n\n  public abstract static class containsValue extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmMapping self, Object value) {\n      var foundValue = new MutableBoolean(false);\n      self.iterateMemberValues(\n          (key, member, memberValue) -> {\n            if (memberValue == null) {\n              memberValue = VmUtils.readMember(self, key);\n            }\n            foundValue.set(value.equals(memberValue));\n            return !foundValue.get();\n          });\n      return foundValue.get();\n    }\n  }\n\n  public abstract static class getOrNull extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    @Specialization\n    protected Object eval(VmMapping self, Object key) {\n      return VmNull.lift(VmUtils.readMemberOrNull(self, key, callNode));\n    }\n  }\n\n  public abstract static class getOrDefault extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n    @Child private ApplyVmFunction1Node applyNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmMapping self, Object key) {\n      var value = VmUtils.readMemberOrNull(self, key, callNode);\n      if (value != null) {\n        return value;\n      }\n\n      var defaultFunction = (VmFunction) VmUtils.readMember(self, Identifier.DEFAULT, callNode);\n      return applyNode.execute(defaultFunction, key);\n    }\n  }\n\n  public abstract static class fold extends ExternalMethod2Node {\n    @Child private ApplyVmFunction3Node applyLambdaNode = ApplyVmFunction3NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmMapping self, Object initial, VmFunction function) {\n      var result = new MutableReference<>(initial);\n      self.forceAndIterateMemberValues(\n          (key, def, value) -> {\n            result.set(applyLambdaNode.execute(function, result.get(), key, value));\n            return true;\n          });\n      return result.get();\n    }\n  }\n\n  public abstract static class every extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected boolean eval(VmMapping self, VmFunction function) {\n      var result = new MutableBoolean(true);\n      self.iterateMemberValues(\n          (key, member, value) -> {\n            if (value == null) {\n              value = VmUtils.readMember(self, key);\n            }\n            result.set(applyLambdaNode.executeBoolean(function, key, value));\n            return result.get();\n          });\n      return result.get();\n    }\n  }\n\n  public abstract static class any extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected boolean eval(VmMapping self, VmFunction function) {\n      var result = new MutableBoolean(false);\n      self.iterateMemberValues(\n          (key, member, value) -> {\n            if (value == null) {\n              value = VmUtils.readMember(self, key);\n            }\n            result.set(applyLambdaNode.executeBoolean(function, key, value));\n            return !result.get();\n          });\n      return result.get();\n    }\n  }\n\n  public abstract static class toMap extends ExternalMethod0Node {\n    @Specialization\n    protected VmMap eval(VmMapping self) {\n      var builder = VmMap.builder();\n      self.forceAndIterateMemberValues(\n          (key, def, value) -> {\n            builder.add(key, value);\n            return true;\n          });\n      return builder.build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/MergeSort.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport org.pkl.core.runtime.VmFunction;\nimport org.pkl.core.stdlib.base.CollectionNodes.SortComparatorNode;\nimport org.pkl.core.util.Nullable;\n\nfinal class MergeSort {\n  // must be a power of two\n  private static final int INITIAL_MERGE_SORT_STRIDE = 8;\n\n  private MergeSort() {}\n\n  public static Object[] sort(\n      VirtualFrame frame,\n      Object[] array,\n      SortComparatorNode comparator,\n      @Nullable VmFunction function) {\n\n    var length = array.length;\n    var temp = new Object[length];\n\n    // start is inclusive, end is exclusive\n\n    for (var start = 0; start < length; start += INITIAL_MERGE_SORT_STRIDE) {\n      var end = Math.min(start + INITIAL_MERGE_SORT_STRIDE, length);\n      insertionSort(frame, array, start, end, comparator, function);\n    }\n\n    for (var stride = INITIAL_MERGE_SORT_STRIDE; stride < length; stride *= 2) {\n      for (var start = 0; start < length - stride; start += stride + stride) {\n        var end = Math.min(start + stride + stride, length);\n        var mid = start + stride; // start of second half\n        merge(frame, array, temp, start, mid, end, comparator, function);\n      }\n    }\n\n    return array;\n  }\n\n  private static void merge(\n      VirtualFrame frame,\n      Object[] array,\n      Object[] temp,\n      int start,\n      int mid,\n      int end,\n      SortComparatorNode comparator,\n      @Nullable VmFunction function) {\n\n    if (comparator.executeWith(frame, array[mid - 1], array[mid], function)) {\n      return; // already sorted\n    }\n\n    System.arraycopy(array, start, temp, start, end - start);\n\n    var i = start;\n    var j = mid;\n\n    for (var k = start; k < end; k++) {\n      if (i >= mid) array[k] = temp[j++];\n      else if (j >= end) array[k] = temp[i++];\n      else if (comparator.executeWith(frame, temp[j], temp[i], function)) array[k] = temp[j++];\n      else array[k] = temp[i++];\n    }\n  }\n\n  private static void insertionSort(\n      VirtualFrame frame,\n      Object[] array,\n      int start,\n      int end,\n      SortComparatorNode comparator,\n      @Nullable VmFunction function) {\n\n    for (var i = start; i < end; i++) {\n      for (var j = i;\n          j > start && comparator.executeWith(frame, array[j], array[j - 1], function);\n          j--) {\n        Object swap = array[j];\n        array[j] = array[j - 1];\n        array[j - 1] = swap;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/ModuleClassNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.net.URI;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklName;\n\n@PklName(\"Module\")\npublic final class ModuleClassNodes {\n  private ModuleClassNodes() {}\n\n  public abstract static class relativePathTo extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmList eval(VmObjectLike self, VmObjectLike other) {\n      var selfKey = VmUtils.getModuleInfo(self).getModuleKey();\n      var selfUri = selfKey.getUri();\n\n      if (!other.isModuleObject()) {\n        throw exceptionBuilder()\n            .evalError(\"expectedModule\")\n            // No meaningful SourceSection available, in this case.\n            .build();\n      }\n      var otherKey = VmUtils.getModuleInfo(other).getModuleKey();\n      var otherUri = otherKey.getUri();\n\n      var index = selfUri.toString().lastIndexOf('/');\n      if (index != -1) {\n        var baseUri = URI.create(selfUri.toString().substring(0, index + 1));\n        var relativizedUri = baseUri.relativize(otherUri);\n        if (!relativizedUri.isAbsolute()) {\n          var pathElements = relativizedUri.getPath().split(\"/\");\n          return VmList.create(pathElements, pathElements.length - 1);\n        }\n      }\n\n      throw exceptionBuilder()\n          .evalError(\"noDescendentPathBetweenModules\", selfUri, otherUri)\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/PListRendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.ArrayCharEscaper;\n\npublic final class PListRendererNodes {\n  private PListRendererNodes() {}\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  private static PListRenderer createRenderer(VmTyped self, StringBuilder builder) {\n    var indent = (String) VmUtils.readMember(self, Identifier.INDENT);\n    return new PListRenderer(builder, indent, PklConverter.fromRenderer(self));\n  }\n\n  // keep in sync with org.pkl.core.PListRenderer\n  private static final class PListRenderer extends AbstractStringRenderer {\n\n    // it's safe (though not required) to escape all the following characters in XML text nodes\n    private static final ArrayCharEscaper charEscaper =\n        ArrayCharEscaper.builder()\n            .withEscape('\"', \"&quot;\")\n            .withEscape('\\'', \"&apos;\")\n            .withEscape('<', \"&lt;\")\n            .withEscape('>', \"&gt;\")\n            .withEscape('&', \"&amp;\")\n            .build();\n\n    public PListRenderer(StringBuilder builder, String indent, PklConverter converter) {\n      super(\"XML property list\", builder, indent, converter, true, true);\n    }\n\n    @Override\n    public void visitString(String value) {\n      builder.append(\"<string>\").append(charEscaper.escape(value)).append(\"</string>\");\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      builder.append(\"<integer>\").append(value).append(\"</integer>\");\n    }\n\n    @Override\n    @SuppressWarnings(\"Duplicates\")\n    public void visitFloat(Double value) {\n      builder.append(\"<real>\");\n\n      if (value.isNaN()) {\n        builder.append(\"nan\");\n      } else if (value == Double.POSITIVE_INFINITY) {\n        builder.append(\"+infinity\");\n      } else if (value == Double.NEGATIVE_INFINITY) {\n        builder.append(\"-infinity\");\n      } else {\n        builder.append(value);\n      }\n\n      builder.append(\"</real>\");\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      if (value) {\n        builder.append(\"<true/>\");\n      } else {\n        builder.append(\"<false/>\");\n      }\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderType\", \"Duration\", \"XML property list\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderType\", \"DataSize\", \"XML property list\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      builder.append(\"<data>\");\n      builder.append(value.base64());\n      builder.append(\"</data>\");\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderType\", \"Regex\", \"XML property list\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderType\", \"IntSeq\", \"XML property list\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void visitDocument(Object value) {\n      if (!(value instanceof VmCollection\n          || value instanceof VmMap\n          || value instanceof VmObjectLike)) {\n        throw new VmExceptionBuilder()\n            .evalError(\"invalidPListTopLevelValue\", VmUtils.getClass(value))\n            .withProgramValue(\"Value\", value)\n            .build();\n      }\n      builder\n          .append(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\")\n          .append(LINE_BREAK)\n          .append(\n              \"<!DOCTYPE plist PUBLIC \\\"-//Apple//DTD PLIST 1.0//EN\\\" \\\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\\">\")\n          .append(LINE_BREAK)\n          .append(\"<plist version=\\\"1.0\\\">\")\n          .append(LINE_BREAK);\n\n      visit(value);\n\n      builder.append(LINE_BREAK).append(\"</plist>\").append(LINE_BREAK);\n    }\n\n    @Override\n    protected void visitTopLevelValue(Object value) {\n      visit(value);\n    }\n\n    @Override\n    protected void visitRenderDirective(VmTyped value) {\n      builder.append(VmUtils.readTextProperty(value));\n    }\n\n    @Override\n    protected void startDynamic(VmDynamic value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void startTyped(VmTyped value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void startListing(VmListing value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void startMapping(VmMapping value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void startList(VmList value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void startSet(VmSet value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void startMap(VmMap value) {\n      increaseIndent();\n    }\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {\n      if (isFirst) {\n        builder.append(\"<array>\").append(LINE_BREAK);\n      }\n      builder.append(currIndent);\n      visit(value);\n      builder.append(LINE_BREAK);\n    }\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {\n      if (isFirst) {\n        builder.append(\"<dict>\").append(LINE_BREAK);\n      }\n\n      if (isRenderDirective(key)) {\n        key = VmUtils.readTextProperty(key);\n      }\n\n      if (key instanceof String string) {\n        builder\n            .append(currIndent)\n            .append(\"<key>\")\n            .append(charEscaper.escape(string))\n            .append(\"</key>\")\n            .append(LINE_BREAK)\n            .append(currIndent);\n        return;\n      }\n\n      cannotRenderNonStringKey(key);\n    }\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      visit(value);\n      builder.append(LINE_BREAK);\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      if (isFirst) {\n        builder.append(\"<dict>\").append(LINE_BREAK);\n      }\n      builder\n          .append(currIndent)\n          .append(\"<key>\")\n          .append(charEscaper.escape(name.toString()))\n          .append(\"</key>\")\n          .append(LINE_BREAK)\n          .append(currIndent);\n      visit(value);\n      builder.append(LINE_BREAK);\n    }\n\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {\n      if (value.hasElements()) {\n        endArray(isEmpty);\n      } else {\n        endDict(isEmpty);\n      }\n    }\n\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {\n      endDict(isEmpty);\n    }\n\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {\n      endArray(isEmpty);\n    }\n\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {\n      endDict(isEmpty);\n    }\n\n    @Override\n    protected void endList(VmList value) {\n      endArray(value.isEmpty());\n    }\n\n    @Override\n    protected void endSet(VmSet value) {\n      endArray(value.isEmpty());\n    }\n\n    @Override\n    protected void endMap(VmMap value) {\n      endDict(value.isEmpty());\n    }\n\n    private void endDict(boolean isEmpty) {\n      decreaseIndent();\n      builder.append(currIndent);\n      if (isEmpty) {\n        builder.append(\"<dict/>\");\n      } else {\n        builder.append(\"</dict>\");\n      }\n    }\n\n    private void endArray(boolean isEmpty) {\n      decreaseIndent();\n      builder.append(currIndent);\n      if (isEmpty) {\n        builder.append(\"<array/>\");\n      } else {\n        builder.append(\"</array>\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/PairNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.stdlib.PklName;\n\npublic final class PairNodes {\n  private PairNodes() {}\n\n  public abstract static class first extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmPair self) {\n      return self.getFirst();\n    }\n  }\n\n  public abstract static class second extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmPair self) {\n      return self.getSecond();\n    }\n  }\n\n  public abstract static class key extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmPair self) {\n      return self.getFirst();\n    }\n  }\n\n  @PklName(\"value\")\n  public abstract static class valueProperty extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmPair self) {\n      return self.getSecond();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/PcfRenderer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport org.pkl.core.ValueFormatter;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmObjectLike;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.runtime.VmRegex;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.parser.Lexer;\n\npublic final class PcfRenderer extends AbstractStringRenderer {\n  private final ValueFormatter valueFormatter;\n\n  private boolean isDocument;\n  @LateInit private Object topLevelValue;\n\n  public PcfRenderer(\n      StringBuilder builder,\n      String indent,\n      PklConverter converter,\n      boolean omitNullProperties,\n      boolean useCustomStringDelimiters) {\n    super(\"Pcf\", builder, indent, converter, omitNullProperties, false);\n    this.valueFormatter = new ValueFormatter(true, useCustomStringDelimiters);\n  }\n\n  @Override\n  public void visitString(String value) {\n    increaseIndent();\n    valueFormatter.formatStringValue(value, currIndent, builder);\n    decreaseIndent();\n  }\n\n  private void renderStringElement(String value) {\n    valueFormatter.formatStringValue(value, currIndent, builder);\n  }\n\n  @Override\n  public void visitTyped(VmTyped value) {\n    if (VmUtils.isPcfRenderDirective(value)) {\n      visitPcfRenderDirective(value);\n    } else {\n      super.visitTyped(value);\n    }\n  }\n\n  @Override\n  public void visitInt(Long value) {\n    builder.append((long) value);\n  }\n\n  @Override\n  public void visitFloat(Double value) {\n    builder.append((double) value);\n  }\n\n  @Override\n  public void visitBoolean(Boolean value) {\n    builder.append((boolean) value);\n  }\n\n  @Override\n  public void visitDuration(VmDuration value) {\n    builder.append(value);\n  }\n\n  @Override\n  public void visitDataSize(VmDataSize value) {\n    builder.append(value);\n  }\n\n  @Override\n  public void visitBytes(VmBytes value) {\n    builder.append(value);\n  }\n\n  @Override\n  public void visitPair(VmPair value) {\n    builder.append(\"Pair(\");\n    visitStandaloneValue(value.getFirst());\n    builder.append(\", \");\n    visitStandaloneValue(value.getSecond());\n    builder.append(')');\n  }\n\n  @Override\n  public void visitRegex(VmRegex value) {\n    builder.append(value);\n  }\n\n  @Override\n  public void visitIntSeq(VmIntSeq value) {\n    builder.append(value);\n  }\n\n  @Override\n  public void visitNull(VmNull value) {\n    builder.append(\"null\");\n  }\n\n  @Override\n  protected void visitRenderDirective(VmTyped value) {\n    builder.append(VmUtils.readTextProperty(value));\n  }\n\n  private void visitPcfRenderDirective(VmTyped value) {\n    var before = VmUtils.readMember(value, Identifier.BEFORE);\n    if (before instanceof String string) { // not VmNull\n      builder.append(string);\n    }\n    visit(VmUtils.readMember(value, Identifier.VALUE));\n    var after = VmUtils.readMember(value, Identifier.AFTER);\n    if (after instanceof String string) { // not VmNull\n      builder.append(string);\n    }\n  }\n\n  @Override\n  protected void visitDocument(Object value) {\n    if (!(value instanceof VmTyped || value instanceof VmDynamic)) {\n      throw new VmExceptionBuilder()\n          .evalError(\"invalidPcfTopLevelValue\", VmUtils.getClass(value))\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n    isDocument = true;\n    topLevelValue = value;\n    visit(value);\n    if (!builder.isEmpty()) {\n      builder.append('\\n');\n    }\n  }\n\n  @Override\n  protected void visitTopLevelValue(Object value) {\n    topLevelValue = value;\n    visit(value);\n  }\n\n  @Override\n  protected boolean canRenderPropertyOrEntryOf(VmDynamic object) {\n    return true;\n  }\n\n  @Override\n  protected void startDynamic(VmDynamic value) {\n    startObject(value);\n  }\n\n  @Override\n  protected void startTyped(VmTyped value) {\n    startObject(value);\n  }\n\n  @Override\n  protected void startListing(VmListing value) {\n    startObject(value);\n  }\n\n  @Override\n  protected void startMapping(VmMapping value) {\n    startObject(value);\n  }\n\n  @Override\n  protected void startList(VmList value) {\n    builder.append(\"List(\");\n  }\n\n  @Override\n  protected void startSet(VmSet value) {\n    builder.append(\"Set(\");\n  }\n\n  @Override\n  protected void startMap(VmMap value) {\n    builder.append(\"Map(\");\n  }\n\n  @Override\n  protected void visitElement(long index, Object value, boolean isFirst) {\n    if (enclosingValue instanceof VmObjectLike) {\n      builder.append('\\n');\n      builder.append(currIndent);\n      if (value instanceof String string) {\n        renderStringElement(string);\n      } else {\n        visitStandaloneValue(value);\n      }\n    } else {\n      if (!isFirst) {\n        builder.append(\", \");\n      }\n      visitStandaloneValue(value);\n    }\n  }\n\n  private void visitStandaloneValue(Object value) {\n    if (value instanceof VmObjectLike && !isRenderDirective(value)) {\n      builder.append(\"new \");\n    }\n    visit(value);\n  }\n\n  @Override\n  protected void visitEntryKey(Object key, boolean isFirst) {\n    if (enclosingValue instanceof VmObjectLike) {\n      builder.append('\\n');\n      builder.append(currIndent);\n      builder.append('[');\n      visitStandaloneValue(key);\n      builder.append(']');\n    } else {\n      if (!isFirst) {\n        builder.append(\", \");\n      }\n      visitStandaloneValue(key);\n    }\n  }\n\n  @Override\n  protected void visitEntryValue(Object value) {\n    if (enclosingValue instanceof VmObjectLike) {\n      if (value instanceof VmObjectLike) {\n        builder.append(' ');\n      } else {\n        builder.append(\" = \");\n      }\n      visit(value);\n    } else {\n      builder.append(\", \");\n      visitStandaloneValue(value);\n    }\n  }\n\n  @Override\n  protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n    if (!builder.isEmpty()) {\n      builder.append('\\n');\n      builder.append(currIndent);\n    }\n    builder.append(Lexer.maybeQuoteIdentifier(name.toString()));\n    if (value instanceof VmObjectLike) {\n      builder.append(' ');\n    } else {\n      builder.append(\" = \");\n    }\n    visit(value);\n  }\n\n  @Override\n  protected void endDynamic(VmDynamic value, boolean isEmpty) {\n    endObject(value, isEmpty);\n  }\n\n  @Override\n  protected void endTyped(VmTyped value, boolean isEmpty) {\n    endObject(value, isEmpty);\n  }\n\n  @Override\n  protected void endListing(VmListing value, boolean isEmpty) {\n    endObject(value, isEmpty);\n  }\n\n  @Override\n  protected void endMapping(VmMapping value, boolean isEmpty) {\n    endObject(value, isEmpty);\n  }\n\n  @Override\n  protected void endList(VmList value) {\n    builder.append(')');\n  }\n\n  @Override\n  protected void endSet(VmSet value) {\n    builder.append(')');\n  }\n\n  @Override\n  protected void endMap(VmMap value) {\n    builder.append(')');\n  }\n\n  private void startObject(VmObjectLike value) {\n    if (isDocument && value == topLevelValue) return;\n\n    increaseIndent();\n    builder.append('{');\n  }\n\n  private void endObject(VmObjectLike value, boolean isEmpty) {\n    if (isDocument && value == topLevelValue) return;\n\n    decreaseIndent();\n    if (!isEmpty) {\n      builder.append('\\n');\n      builder.append(currIndent);\n    }\n    builder.append('}');\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/PcfRendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\n\npublic final class PcfRendererNodes {\n  private PcfRendererNodes() {}\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  private static PcfRenderer createRenderer(VmTyped self, StringBuilder builder) {\n    var indent = (String) VmUtils.readMember(self, Identifier.INDENT);\n    var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);\n    var useCustomStringDelimiters =\n        (boolean) VmUtils.readMember(self, Identifier.USE_CUSTOM_STRING_DELIMITERS);\n    return new PcfRenderer(\n        builder,\n        indent,\n        PklConverter.fromRenderer(self),\n        omitNullProperties,\n        useCustomStringDelimiters);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/PropertiesRendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.runtime.VmRegex;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.runtime.VmValue;\nimport org.pkl.core.runtime.VmValueConverter;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.core.util.properties.PropertiesUtils;\n\npublic final class PropertiesRendererNodes {\n  private PropertiesRendererNodes() {}\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  private static PropertiesRenderer createRenderer(VmTyped self, StringBuilder builder) {\n    var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);\n    var restrictCharset = (boolean) VmUtils.readMember(self, Identifier.RESTRICT_CHARSET);\n    return new PropertiesRenderer(\n        builder, omitNullProperties, restrictCharset, PklConverter.fromRenderer(self));\n  }\n\n  private static final class PropertiesRenderer extends AbstractStringRenderer {\n    private final boolean restrictCharset;\n\n    private boolean isDocument;\n\n    public PropertiesRenderer(\n        StringBuilder builder,\n        boolean omitNullProperties,\n        boolean restrictCharset,\n        PklConverter converter) {\n      super(\"Properties\", builder, \"\", converter, omitNullProperties, omitNullProperties);\n      this.restrictCharset = restrictCharset;\n    }\n\n    @Override\n    public void visitString(String value) {\n      visitPropertyValue(value);\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      visitPropertyValue(value);\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      visitPropertyValue(value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      visitPropertyValue(value);\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      if (isDocument) {\n        writeKey();\n        writeSeparator();\n        writeLineBreak();\n      }\n    }\n\n    @Override\n    protected void visitDocument(Object value) {\n      if (!(value instanceof VmMap\n          || value instanceof VmTyped\n          || value instanceof VmMapping\n          || value instanceof VmDynamic)) {\n        throw new VmExceptionBuilder()\n            .evalError(\"invalidPropertiesTopLevelValue\", VmUtils.getClass(value))\n            .withProgramValue(\"Value\", value)\n            .build();\n      }\n      if (!isRenderDirective(value)) {\n        isDocument = true;\n      }\n      visit(value);\n    }\n\n    @Override\n    protected void visitTopLevelValue(Object value) {\n      if ((value instanceof VmMap\n              || value instanceof VmTyped\n              || value instanceof VmMapping\n              || value instanceof VmDynamic)\n          && !isRenderDirective(value)) {\n        cannotRenderTypeAddConverter((VmValue) value);\n      }\n      isDocument = false;\n      visit(value);\n    }\n\n    @Override\n    protected void visitRenderDirective(VmTyped value) {\n      if (isDocument) {\n        writeKey();\n        writeSeparator();\n      }\n      builder.append(VmUtils.readTextProperty(value));\n      if (isDocument) {\n        writeLineBreak();\n      }\n    }\n\n    @Override\n    protected void startDynamic(VmDynamic value) {}\n\n    @Override\n    protected void startTyped(VmTyped value) {}\n\n    @Override\n    protected void startListing(VmListing value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void startMapping(VmMapping value) {}\n\n    @Override\n    protected void startList(VmList value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void startSet(VmSet value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void startMap(VmMap value) {}\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {}\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {}\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      visitKeyedValue(value);\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      visitKeyedValue(value);\n    }\n\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {}\n\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {}\n\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {}\n\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {}\n\n    @Override\n    protected void endList(VmList value) {}\n\n    @Override\n    protected void endSet(VmSet value) {}\n\n    @Override\n    protected void endMap(VmMap value) {}\n\n    private void writeValue(String value) {\n      builder.append(PropertiesUtils.renderPropertiesKeyOrValue(value, false, restrictCharset));\n    }\n\n    private void writeSeparator() {\n      builder.append(\" = \");\n    }\n\n    private void writeLineBreak() {\n      builder.append(\"\\n\");\n    }\n\n    private void visitPropertyValue(Object value) {\n      if (isDocument) {\n        writeKey();\n        writeSeparator();\n      }\n      writeValue(value.toString());\n      if (isDocument) {\n        writeLineBreak();\n      }\n    }\n\n    private void visitKeyedValue(Object value) {\n      // Edge-case: Dynamics are implicitly converted to Listing.\n      if (value instanceof VmDynamic dynamic && dynamic.hasElements()) {\n        var newValue =\n            new VmListing(\n                VmUtils.createEmptyMaterializedFrame(),\n                dynamic,\n                EconomicMaps.create(),\n                dynamic.getLength());\n        visit(converter.convert(newValue, currPath));\n      } else {\n        visit(value);\n      }\n    }\n\n    private void writeKey() {\n      var isFollowing = new MutableBoolean(false);\n      currPath\n          .descendingIterator()\n          .forEachRemaining(\n              path -> {\n                if (path == VmValueConverter.TOP_LEVEL_VALUE) {\n                  return;\n                }\n                if (isFollowing.get()) {\n                  builder.append('.');\n                }\n                if (isRenderDirective(path)) {\n                  builder.append(VmUtils.readTextProperty(path));\n                } else {\n                  builder.append(\n                      PropertiesUtils.renderPropertiesKeyOrValue(\n                          path.toString(), true, restrictCharset));\n                }\n                isFollowing.set(true);\n              });\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/RegexMatchFactory.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport java.util.regex.MatchResult;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.stdlib.VmObjectFactory;\nimport org.pkl.core.util.Pair;\n\nfinal class RegexMatchFactory {\n  private RegexMatchFactory() {}\n\n  static VmTyped create(Pair<MatchResult, Integer> extraStorage) {\n    return factory.create(extraStorage);\n  }\n\n  private static final VmObjectFactory<Pair<MatchResult, Integer>> factory =\n      new VmObjectFactory<>(BaseModule::getRegexMatchClass);\n\n  static {\n    factory\n        .addStringProperty(\n            \"value\",\n            resultAndIndex -> {\n              // index -1 -> regex match, index 0..n -> group match 0..n\n              // Regex match and group 0 match differ (only) in that the former has groups.\n              var index = resultAndIndex.second;\n              return resultAndIndex.first.group(index == -1 ? 0 : index);\n            })\n        .addIntProperty(\n            \"start\",\n            resultAndIndex -> {\n              var index = resultAndIndex.second;\n              return resultAndIndex.first.start(index == -1 ? 0 : index);\n            })\n        .addIntProperty(\n            \"end\",\n            resultAndIndex -> {\n              var index = resultAndIndex.second;\n              return resultAndIndex.first.end(index == -1 ? 0 : index);\n            })\n        .addListProperty(\n            \"groups\",\n            resultAndIndex -> {\n              var groupIndex = resultAndIndex.second;\n              if (groupIndex != -1) {\n                // a group match has no groups of its own\n                return VmList.EMPTY;\n              }\n              var result = resultAndIndex.first;\n              var builder = VmList.EMPTY.builder();\n              for (var i = 0; i <= result.groupCount(); i++) {\n                if (result.start(i) == -1) {\n                  // group produced no match\n                  builder.add(VmNull.withoutDefault());\n                } else {\n                  builder.add(factory.create(Pair.of(result, i)));\n                }\n              }\n              return builder.build();\n            });\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/RegexNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.Pair;\n\npublic final class RegexNodes {\n  private RegexNodes() {}\n\n  public abstract static class pattern extends ExternalPropertyNode {\n    @Specialization\n    protected String eval(VmRegex self) {\n      return self.getPattern().pattern();\n    }\n  }\n\n  public abstract static class groupCount extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected long eval(VmRegex self) {\n      return self.getPattern().matcher(\"\").groupCount();\n    }\n  }\n\n  public abstract static class findMatchesIn extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmList eval(VmRegex self, String str) {\n      var matcher = self.getPattern().matcher(str);\n\n      var builder = VmList.EMPTY.builder();\n      while (matcher.find()) {\n        // -1 indicates regex match instead of group match (see comment in RegexMatchNodes)\n        builder.add(RegexMatchFactory.create(Pair.of(matcher.toMatchResult(), -1)));\n      }\n\n      return builder.build();\n    }\n  }\n\n  public abstract static class matchEntire extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmValue eval(VmRegex self, String str) {\n      var matcher = self.getPattern().matcher(str);\n      if (!matcher.matches()) return VmNull.withoutDefault();\n\n      // -1 indicates regex match instead of group match (see comment in RegexMatchNodes)\n      return RegexMatchFactory.create(Pair.of(matcher.toMatchResult(), -1));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/SetNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport org.pkl.core.ast.expression.binary.GreaterThanNode;\nimport org.pkl.core.ast.expression.binary.GreaterThanNodeGen;\nimport org.pkl.core.ast.expression.binary.LessThanNode;\nimport org.pkl.core.ast.expression.binary.LessThanNodeGen;\nimport org.pkl.core.ast.internal.IsInstanceOfNode;\nimport org.pkl.core.ast.internal.IsInstanceOfNodeGen;\nimport org.pkl.core.ast.lambda.*;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.*;\nimport org.pkl.core.stdlib.base.CollectionNodes.CompareByNode;\nimport org.pkl.core.stdlib.base.CollectionNodes.CompareNode;\nimport org.pkl.core.stdlib.base.CollectionNodes.CompareWithNode;\n\n// duplication between ListNodes and SetNodes is \"intentional\"\n// (sharing nodes between VmCollection subtypes results in\n// polymorphic guards/calls which seems less Truffle idiomatic)\n@SuppressWarnings(\"Duplicates\")\npublic final class SetNodes {\n  private SetNodes() {}\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmSet self) {\n      return self.getLength();\n    }\n  }\n\n  public abstract static class isNotEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmSet self) {\n      return !self.isEmpty();\n    }\n  }\n\n  public abstract static class isEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(VmSet self) {\n      return self.isEmpty();\n    }\n  }\n\n  public abstract static class first extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getFirst();\n    }\n  }\n\n  public abstract static class firstOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getFirstOrNull();\n    }\n  }\n\n  public abstract static class rest extends ExternalPropertyNode {\n    @Specialization\n    protected VmSet eval(VmSet self) {\n      return self.getRest();\n    }\n  }\n\n  public abstract static class restOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getRestOrNull();\n    }\n  }\n\n  public abstract static class last extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getLast();\n    }\n  }\n\n  public abstract static class lastOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getLastOrNull();\n    }\n  }\n\n  public abstract static class single extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getSingle();\n    }\n  }\n\n  public abstract static class singleOrNull extends ExternalPropertyNode {\n    @Specialization\n    protected Object eval(VmSet self) {\n      return self.getSingleOrNull();\n    }\n  }\n\n  public abstract static class startsWith extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmSet self, VmCollection other) {\n      return self.startsWith(other);\n    }\n  }\n\n  public abstract static class endsWith extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmSet self, VmCollection other) {\n      return self.endsWith(other);\n    }\n  }\n\n  public abstract static class split extends ExternalMethod1Node {\n    @Specialization\n    protected VmPair eval(VmSet self, long index) {\n      if (index < 0 || index > self.getLength()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"elementIndexOutOfRange\", index, 0, self.getLength())\n            .withProgramValue(\"Collection\", self)\n            .build();\n      }\n      return self.split(index);\n    }\n  }\n\n  public abstract static class splitOrNull extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmSet self, long index) {\n      return self.splitOrNull(index);\n    }\n  }\n\n  public abstract static class partition extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmPair eval(VmSet self, VmFunction function) {\n      var builder1 = self.builder();\n      var builder2 = self.builder();\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) {\n          builder1.add(elem);\n        } else {\n          builder2.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return new VmPair(builder1.build(), builder2.build());\n    }\n  }\n\n  public abstract static class contains extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmSet self, Object element) {\n      return self.contains(element);\n    }\n  }\n\n  public abstract static class find extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotFindMatchingCollectionElement\")\n          .withProgramValue(\"Collection\", self)\n          .build();\n    }\n  }\n\n  public abstract static class findOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class findLast extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      var iterator = self.reverseIterator();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder()\n          .evalError(\"cannotFindMatchingCollectionElement\")\n          .withProgramValue(\"Collection\", self)\n          .build();\n    }\n  }\n\n  public abstract static class findLastOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      var iterator = self.reverseIterator();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (applyLambdaNode.executeBoolean(function, elem)) return elem;\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class every extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmSet self, VmFunction function) {\n      for (var elem : self) {\n        if (!applyLambdaNode.executeBoolean(function, elem)) return false;\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return true;\n    }\n  }\n\n  public abstract static class any extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected boolean eval(VmSet self, VmFunction function) {\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) return true;\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return false;\n    }\n  }\n\n  public abstract static class filter extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) {\n          builder.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class filterNonNull extends ExternalMethod0Node {\n    @Specialization\n    protected VmSet eval(VmSet self) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (elem instanceof VmNull) continue;\n        builder.add(elem);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class filterIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, index++, elem)) {\n          builder.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class filterIsInstance extends ExternalMethod1Node {\n    @Child private IsInstanceOfNode isInstanceOfNode = IsInstanceOfNodeGen.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmClass clazz) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (isInstanceOfNode.executeBoolean(elem, clazz)) {\n          builder.add(elem);\n        }\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class map extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        builder.add(applyLambdaNode.execute(function, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        builder.add(applyLambdaNode.execute(function, index++, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapNonNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        var newValue = applyLambdaNode.execute(function, elem);\n        if (newValue instanceof VmNull) continue;\n        builder.add(newValue);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class mapNonNullIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        var newValue = applyLambdaNode.execute(function, index++, elem);\n        if (newValue instanceof VmNull) continue;\n        builder.add(newValue);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatMap extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        builder.addAll(applyLambdaNode.executeCollection(function, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatMapIndexed extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      long index = 0;\n\n      for (var elem : self) {\n        builder.addAll(applyLambdaNode.executeCollection(function, index++, elem));\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class flatten extends ExternalMethod0Node {\n    @Specialization\n    protected VmSet eval(VmSet self) {\n      return (VmSet) self.flatten();\n    }\n  }\n\n  public abstract static class take extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, long n) {\n      return self.take(n);\n    }\n  }\n\n  public abstract static class takeWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var builder = self.builder();\n      for (var elem : self) {\n        if (!applyLambdaNode.executeBoolean(function, elem)) {\n          return builder.build();\n        }\n        builder.add(elem);\n      }\n      return self;\n    }\n  }\n\n  public abstract static class takeLast extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, long n) {\n      return self.takeLast(n);\n    }\n  }\n\n  public abstract static class takeLastWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var idx = self.getLength();\n      var iter = self.reverseIterator();\n      while (iter.hasNext()) {\n        if (!applyLambdaNode.executeBoolean(function, iter.next())) break;\n        idx -= 1;\n      }\n      return self.drop(idx);\n    }\n  }\n\n  public abstract static class drop extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, long n) {\n      return self.drop(n);\n    }\n  }\n\n  public abstract static class dropWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var idx = 0;\n      for (var elem : self) {\n        if (!applyLambdaNode.executeBoolean(function, elem)) break;\n        idx += 1;\n      }\n      return self.drop(idx);\n    }\n  }\n\n  public abstract static class dropLast extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, long n) {\n      return self.dropLast(n);\n    }\n  }\n\n  public abstract static class dropLastWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmSet eval(VmSet self, VmFunction function) {\n      var idx = self.getLength();\n      var iter = self.reverseIterator();\n      while (iter.hasNext()) {\n        if (!applyLambdaNode.executeBoolean(function, iter.next())) break;\n        idx -= 1;\n      }\n      return self.take(idx);\n    }\n  }\n\n  public abstract static class fold extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, Object initial, VmFunction function) {\n      var iter = self.iterator();\n      var result = initial;\n      while (iter.hasNext()) {\n        var elem = iter.next();\n        result = applyLambdaNode.execute(function, result, elem);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class foldBack extends ExternalMethod2Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, Object initial, VmFunction function) {\n      var iter = self.reverseIterator();\n      var result = initial;\n      while (iter.hasNext()) {\n        var elem = iter.next();\n        result = applyLambdaNode.execute(function, elem, result);\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class foldIndexed extends ExternalMethod2Node {\n    @Child private ApplyVmFunction3Node applyLambdaNode = ApplyVmFunction3NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, Object initial, VmFunction function) {\n      var iter = self.iterator();\n      var result = initial;\n      long index = 0;\n\n      while (iter.hasNext()) {\n        var elem = iter.next();\n        result = applyLambdaNode.execute(function, index++, result, elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class reduce extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        result = applyLambdaNode.execute(function, result, elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class reduceOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        result = applyLambdaNode.execute(function, result, elem);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class groupBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      var builder = VmMap.builder();\n\n      for (Object elem : self) {\n        var key = applyLambdaNode.execute(function, elem);\n        var value = builder.get(key);\n        var newValue = value == null ? VmSet.of(elem) : ((VmSet) value).add(elem);\n        builder.add(key, newValue);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class min extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (lessThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minOrNull extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (lessThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (lessThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minByOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private LessThanNode lessThanNode =\n        LessThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (lessThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minWith extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.execute(function, elem, result);\n        if (cmpResult instanceof Boolean b) {\n          if (b) result = elem;\n        } else if (cmpResult instanceof Long l) { // deprecated\n          if (l < 0) result = elem;\n        } else {\n          CompilerDirectives.transferToInterpreter();\n          throw exceptionBuilder()\n              .typeMismatch(cmpResult, BaseModule.getBooleanClass(), BaseModule.getIntClass())\n              .build();\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class minWithOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.execute(function, elem, result);\n        if (cmpResult instanceof Boolean b) {\n          if (b) result = elem;\n        } else if (cmpResult instanceof Long l) { // deprecated\n          if (l < 0) result = elem;\n        } else {\n          CompilerDirectives.transferToInterpreter();\n          throw exceptionBuilder()\n              .typeMismatch(cmpResult, BaseModule.getBooleanClass(), BaseModule.getIntClass())\n              .build();\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class max extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (greaterThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxOrNull extends ExternalPropertyNode {\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        if (greaterThanNode.executeWith(frame, elem, result)) {\n          result = elem;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxBy extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (greaterThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxByOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Child\n    @SuppressWarnings(\"ConstantConditions\")\n    private GreaterThanNode greaterThanNode =\n        GreaterThanNodeGen.create(VmUtils.unavailableSourceSection(), null, null);\n\n    @Specialization\n    protected Object eval(VirtualFrame frame, VmSet self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      var resultValue = applyLambdaNode.execute(function, result);\n\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var elemValue = applyLambdaNode.execute(function, elem);\n        if (greaterThanNode.executeWith(frame, elemValue, resultValue)) {\n          result = elem;\n          resultValue = elemValue;\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxWith extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      self.checkNonEmpty();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.execute(function, elem, result);\n        if (cmpResult instanceof Boolean b) {\n          if (b) result = elem;\n        } else if (cmpResult instanceof Long l) { // deprecated\n          if (l < 0) result = elem;\n        } else {\n          CompilerDirectives.transferToInterpreter();\n          throw exceptionBuilder()\n              .typeMismatch(cmpResult, BaseModule.getBooleanClass(), BaseModule.getIntClass())\n              .build();\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class maxWithOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction2Node applyLambdaNode = ApplyVmFunction2NodeGen.create();\n\n    @Specialization\n    protected Object eval(VmSet self, VmFunction function) {\n      if (self.isEmpty()) return VmNull.withoutDefault();\n\n      var iterator = self.iterator();\n      var result = iterator.next();\n      while (iterator.hasNext()) {\n        var elem = iterator.next();\n        var cmpResult = applyLambdaNode.execute(function, result, elem);\n        if (cmpResult instanceof Boolean b) {\n          if (b) result = elem;\n        } else if (cmpResult instanceof Long l) { // deprecated\n          if (l < 0) result = elem;\n        } else {\n          CompilerDirectives.transferToInterpreter();\n          throw exceptionBuilder()\n              .typeMismatch(cmpResult, BaseModule.getBooleanClass(), BaseModule.getIntClass())\n              .build();\n        }\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return result;\n    }\n  }\n\n  public abstract static class sort extends ExternalMethod0Node {\n    @Child private CompareNode compareNode = new CompareNode();\n\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmSet self) {\n      return VmList.create(MergeSort.sort(frame, self.toArray(), compareNode, null));\n    }\n  }\n\n  public abstract static class sortBy extends ExternalMethod1Node {\n    @Child private CompareByNode compareByNode = new CompareByNode();\n\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmSet self, VmFunction selector) {\n      return VmList.create(MergeSort.sort(frame, self.toArray(), compareByNode, selector));\n    }\n  }\n\n  public abstract static class sortWith extends ExternalMethod1Node {\n    @Child private CompareWithNode compareWithNode = new CompareWithNode();\n\n    @Specialization\n    protected VmList eval(VirtualFrame frame, VmSet self, VmFunction function) {\n      return VmList.create(MergeSort.sort(frame, self.toArray(), compareWithNode, function));\n    }\n  }\n\n  public abstract static class add extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, Object element) {\n      return self.add(element);\n    }\n  }\n\n  public abstract static class repeat extends ExternalMethod1Node {\n    @Specialization\n    protected VmList eval(VmSet self, long n) {\n      return self.repeat(n);\n    }\n  }\n\n  public abstract static class count extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected long eval(VmSet self, VmFunction function) {\n      var count = 0;\n      for (var elem : self) {\n        if (applyLambdaNode.executeBoolean(function, elem)) count += 1;\n      }\n      LoopNode.reportLoopCount(this, self.getLength());\n      return count;\n    }\n  }\n\n  public abstract static class reverse extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmSet self) {\n      return self.reverse();\n    }\n  }\n\n  public abstract static class join extends ExternalMethod1Node {\n    @Specialization\n    protected String eval(VmSet self, String separator) {\n      return self.join(separator);\n    }\n  }\n\n  public abstract static class zip extends ExternalMethod1Node {\n    @Specialization\n    protected VmCollection eval(VmSet self, VmCollection coll) {\n      return self.zip(coll);\n    }\n  }\n\n  public abstract static class toList extends ExternalMethod0Node {\n    @Specialization\n    protected VmList eval(VmSet self) {\n      return self.toList();\n    }\n  }\n\n  public abstract static class toSet extends ExternalMethod0Node {\n    @Specialization\n    protected VmSet eval(VmSet self) {\n      return self;\n    }\n  }\n\n  public abstract static class toMap extends ExternalMethod2Node {\n    @Child private ApplyVmFunction1Node applyKeyExtractorNode = ApplyVmFunction1Node.create();\n    @Child private ApplyVmFunction1Node applyValueExtractorNode = ApplyVmFunction1Node.create();\n\n    @Specialization\n    protected VmMap eval(VmSet self, VmFunction keyExtractor, VmFunction valueExtractor) {\n      var builder = VmMap.builder();\n\n      for (var elem : self) {\n        var key = applyKeyExtractorNode.execute(keyExtractor, elem);\n        var value = applyValueExtractorNode.execute(valueExtractor, elem);\n        builder.add(key, value);\n      }\n\n      LoopNode.reportLoopCount(this, self.getLength());\n      return builder.build();\n    }\n  }\n\n  public abstract static class toListing extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmListing eval(VmSet self) {\n      return self.toListing();\n    }\n  }\n\n  public abstract static class toDynamic extends ExternalMethod0Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmDynamic eval(VmSet self) {\n      return self.toDynamic();\n    }\n  }\n\n  public abstract static class intersect extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, VmSet other) {\n      VmSet smaller;\n      VmSet larger;\n\n      if (self.getLength() <= other.getLength()) {\n        smaller = self;\n        larger = other;\n      } else {\n        smaller = other;\n        larger = self;\n      }\n\n      var builder = VmSet.EMPTY.builder();\n      for (var elem : smaller) {\n        if (larger.contains(elem)) {\n          builder.add(elem);\n        }\n      }\n\n      return builder.build();\n    }\n  }\n\n  public abstract static class difference extends ExternalMethod1Node {\n    @Specialization\n    protected VmSet eval(VmSet self, VmSet other) {\n      var builder = VmSet.EMPTY.builder();\n      for (var elem : self) {\n        if (!other.contains(elem)) {\n          builder.add(elem);\n        }\n      }\n\n      return builder.build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/StringNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport java.io.UnsupportedEncodingException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.*;\nimport java.util.regex.*;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction1NodeGen;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.*;\nimport org.pkl.core.util.ByteArrayUtils;\nimport org.pkl.core.util.Pair;\nimport org.pkl.core.util.StringUtils;\n\n@SuppressWarnings(\"unused\")\npublic final class StringNodes {\n  private StringNodes() {}\n\n  public abstract static class TakeDropWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    protected int findOffset(String string, VmFunction function) {\n      var length = string.length();\n      var offset = 0;\n\n      while (offset < length) {\n        var codePoint = codePointAt(string, offset);\n        if (!applyLambdaNode.executeBoolean(function, codePoint)) break;\n        offset += codePoint.length();\n      }\n\n      // not exact because one loop iteration may increase index by two\n      LoopNode.reportLoopCount(this, offset);\n\n      return offset;\n    }\n\n    // allocating a String for each unicode character iterated over is expensive, but we cannot\n    // currently avoid this\n    // (we don't have/want a pkl.base#Char type, and pkl.base#String is always represented as\n    // java.lang.String)\n    @TruffleBoundary\n    private static String codePointAt(String string, int offset) {\n      var ch1 = string.charAt(offset);\n      if (Character.isHighSurrogate(ch1) && offset + 1 < string.length()) {\n        var ch2 = string.charAt(offset + 1);\n        if (Character.isLowSurrogate(ch2)) {\n          return String.valueOf(new char[] {ch1, ch2});\n        }\n      }\n      return String.valueOf(ch1);\n    }\n  }\n\n  public abstract static class TakeDropLastWhile extends ExternalMethod1Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1Node.create();\n\n    protected int findOffset(String string, VmFunction function) {\n      var length = string.length();\n      var offset = length;\n\n      while (offset > 0) {\n        var codePoint = codePointBefore(string, offset);\n        if (!applyLambdaNode.executeBoolean(function, codePoint)) break;\n        offset -= codePoint.length();\n      }\n\n      // not exact because one loop iteration may decrease index by two\n      LoopNode.reportLoopCount(this, length - offset);\n\n      return offset;\n    }\n\n    // allocating a String for each unicode character iterated over is expensive, but we cannot\n    // currently avoid this\n    // (we don't have/want a pkl.base#Char type, and pkl.base#String is always represented as\n    // java.lang.String)\n    @TruffleBoundary\n    private static String codePointBefore(String string, int offset) {\n      var ch2 = string.charAt(offset - 1);\n      if (Character.isLowSurrogate(ch2) && offset - 2 >= 0) {\n        var ch1 = string.charAt(offset - 2);\n        if (Character.isHighSurrogate(ch1)) {\n          return String.valueOf(new char[] {ch1, ch2});\n        }\n      }\n      return String.valueOf(ch2);\n    }\n  }\n\n  public abstract static class length extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected long eval(String self) {\n      return self.codePointCount(0, self.length());\n    }\n  }\n\n  public abstract static class lastIndex extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected long eval(String self) {\n      return self.codePointCount(0, self.length()) - 1;\n    }\n  }\n\n  public abstract static class isEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(String self) {\n      return self.isEmpty();\n    }\n  }\n\n  public abstract static class isNotEmpty extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(String self) {\n      return !self.isEmpty();\n    }\n  }\n\n  public abstract static class isBlank extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(String self) {\n      return StringUtils.isBlank(self);\n    }\n  }\n\n  public abstract static class isNotBlank extends ExternalPropertyNode {\n    @Specialization\n    protected boolean eval(String self) {\n      return !StringUtils.isBlank(self);\n    }\n  }\n\n  public abstract static class isRegex extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected boolean eval(String self) {\n      try {\n        Pattern.compile(self, Pattern.UNICODE_CASE);\n        return true;\n      } catch (PatternSyntaxException e) {\n        return false;\n      }\n    }\n  }\n\n  public abstract static class isBase64 extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected boolean eval(String self) {\n      try {\n        Base64.getDecoder().decode(self);\n        return true;\n      } catch (IllegalArgumentException e) {\n        return false;\n      }\n    }\n  }\n\n  public abstract static class chars extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected VmList eval(String self) {\n      var builder = VmList.EMPTY.builder();\n      self.codePoints().forEach(cp -> builder.add(Character.toString(cp)));\n      return builder.build();\n    }\n  }\n\n  public abstract static class codePoints extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected VmList eval(String self) {\n      var builder = VmList.EMPTY.builder();\n      self.codePoints().forEach(cp -> builder.add((long) cp));\n      return builder.build();\n    }\n  }\n\n  public abstract static class getOrNull extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self, long index) {\n      var charIndex = VmUtils.codePointOffsetToCharOffset(self, index);\n      if (charIndex == -1 || charIndex == self.length()) return VmNull.withoutDefault();\n\n      if (Character.isHighSurrogate(self.charAt(charIndex))) {\n        return self.substring(charIndex, charIndex + 2);\n      }\n      return self.substring(charIndex, charIndex + 1);\n    }\n  }\n\n  public abstract static class substring extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, long start, long exclusiveEnd) {\n      var charStart = VmUtils.codePointOffsetToCharOffset(self, start);\n      if (charStart == -1) {\n        throw exceptionBuilder()\n            .evalError(\"charIndexOutOfRange\", start, 0, self.codePointCount(0, self.length()))\n            .withProgramValue(\"String\", self)\n            .build();\n      }\n\n      var charExclusiveEnd =\n          VmUtils.codePointOffsetToCharOffset(self, exclusiveEnd - start, charStart);\n      if (charExclusiveEnd < charStart) {\n        throw exceptionBuilder()\n            .evalError(\n                \"charIndexOutOfRange\", exclusiveEnd, start, self.codePointCount(0, self.length()))\n            .withProgramValue(\"String\", self)\n            .build();\n      }\n\n      return self.substring(charStart, charExclusiveEnd);\n    }\n  }\n\n  public abstract static class substringOrNull extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self, long start, long exclusiveEnd) {\n      var charStart = VmUtils.codePointOffsetToCharOffset(self, start);\n      if (charStart == -1) {\n        return VmNull.withoutDefault();\n      }\n\n      var charExclusiveEnd =\n          VmUtils.codePointOffsetToCharOffset(self, exclusiveEnd - start, charStart);\n      if (charExclusiveEnd < charStart) {\n        return VmNull.withoutDefault();\n      }\n\n      return self.substring(charStart, charExclusiveEnd);\n    }\n  }\n\n  public abstract static class repeat extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, long count) {\n      // fail with our own exception if the resulting string exceeds length limit\n      VmSafeMath.toInt32(VmSafeMath.multiply(self.length(), count));\n\n      return self.repeat((int) count);\n    }\n  }\n\n  public abstract static class contains extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self, String other) {\n      return self.contains(other);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self, VmRegex regex) {\n      return regex.matcher(self).find();\n    }\n  }\n\n  public abstract static class matches extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self, VmRegex regex) {\n      return regex.matcher(self).matches();\n    }\n  }\n\n  public abstract static class startsWith extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self, String pattern) {\n      return self.startsWith(pattern);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self, VmRegex regex) {\n      return regex.matcher(self).lookingAt();\n    }\n  }\n\n  public abstract static class endsWith extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self, String pattern) {\n      return self.endsWith(pattern);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    // inefficient but at least correct\n    protected boolean eval(String self, VmRegex regex) {\n      var matcher = regex.matcher(self);\n      var end = -1;\n      while (matcher.find()) {\n        end = matcher.end();\n      }\n      return end == self.length();\n    }\n  }\n\n  public abstract static class indexOf extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected long eval(String self, String pattern) {\n      var charIndex = self.indexOf(pattern);\n      if (charIndex == -1) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"doesNotContainLiteralMatch\")\n            .withProgramValue(\"String\", self)\n            .withProgramValue(\"Pattern\", pattern)\n            .build();\n      }\n      return self.codePointCount(0, charIndex);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected long eval(String self, VmRegex regex) {\n      var matcher = regex.matcher(self);\n      if (!matcher.find()) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"doesNotContainRegexMatch\")\n            .withProgramValue(\"String\", self)\n            .withProgramValue(\"Pattern\", regex)\n            .build();\n      }\n      return self.codePointCount(0, matcher.start());\n    }\n  }\n\n  public abstract static class indexOfOrNull extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self, String pattern) {\n      var charIndex = self.indexOf(pattern);\n      if (charIndex == -1) {\n        return VmNull.withoutDefault();\n      }\n      return (long) self.codePointCount(0, charIndex);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self, VmRegex regex) {\n      var matcher = regex.matcher(self);\n      if (!matcher.find()) {\n        return VmNull.withoutDefault();\n      }\n      return (long) self.codePointCount(0, matcher.start());\n    }\n  }\n\n  public abstract static class lastIndexOf extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected long eval(String self, String pattern) {\n      var charIndex = self.lastIndexOf(pattern);\n      if (charIndex == -1) {\n        CompilerDirectives.transferToInterpreter();\n        throw exceptionBuilder()\n            .evalError(\"doesNotContainLiteralMatch\")\n            .withProgramValue(\"String\", self)\n            .withProgramValue(\"Pattern\", pattern)\n            .build();\n      }\n      return self.codePointCount(0, charIndex);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    // inefficient but at least correct\n    protected long eval(String self, VmRegex regex) {\n      var matcher = regex.matcher(self);\n\n      if (!findLast(matcher)) {\n        throw exceptionBuilder()\n            .evalError(\"doesNotContainRegexMatch\")\n            .withProgramValue(\"String\", self)\n            .withProgramValue(\"Pattern\", regex)\n            .build();\n      }\n\n      return self.codePointCount(0, matcher.start());\n    }\n  }\n\n  public abstract static class lastIndexOfOrNull extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self, String pattern) {\n      var charIndex = self.lastIndexOf(pattern);\n      if (charIndex == -1) {\n        return VmNull.withoutDefault();\n      }\n      return (long) self.codePointCount(0, charIndex);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    // inefficient but at least correct\n    protected Object eval(String self, VmRegex regex) {\n      var m = regex.matcher(self);\n      return findLast(m) ? (long) self.codePointCount(0, m.start()) : VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class take extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, long n) {\n      VmUtils.checkPositive(n);\n      var charIndex = VmUtils.codePointOffsetToCharOffset(self, n);\n      return charIndex == -1 ? self : self.substring(0, charIndex);\n    }\n  }\n\n  public abstract static class takeWhile extends TakeDropWhile {\n    @Specialization\n    protected String eval(String self, VmFunction function) {\n      return substringUntil(self, findOffset(self, function));\n    }\n  }\n\n  public abstract static class takeLast extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, long n) {\n      VmUtils.checkPositive(n);\n      var charIndex = VmUtils.codePointOffsetFromEndToCharOffset(self, n);\n      return charIndex == -1 ? self : self.substring(charIndex);\n    }\n  }\n\n  public abstract static class takeLastWhile extends TakeDropLastWhile {\n    @Specialization\n    protected String eval(String self, VmFunction function) {\n      return substringFrom(self, findOffset(self, function));\n    }\n  }\n\n  public abstract static class drop extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, long n) {\n      VmUtils.checkPositive(n);\n      var charIndex = VmUtils.codePointOffsetToCharOffset(self, n);\n      return charIndex == -1 ? \"\" : self.substring(charIndex);\n    }\n  }\n\n  public abstract static class dropWhile extends TakeDropWhile {\n    @Specialization\n    protected String eval(String self, VmFunction function) {\n      var idx = findOffset(self, function);\n      return substringFrom(self, idx);\n    }\n  }\n\n  public abstract static class dropLast extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, long n) {\n      VmUtils.checkPositive(n);\n      var charIndex = VmUtils.codePointOffsetFromEndToCharOffset(self, n);\n      return charIndex == -1 ? \"\" : self.substring(0, charIndex);\n    }\n  }\n\n  public abstract static class dropLastWhile extends TakeDropLastWhile {\n    @Specialization\n    protected String eval(String self, VmFunction function) {\n      var idx = findOffset(self, function);\n      return substringUntil(self, idx);\n    }\n  }\n\n  public abstract static class replaceAll extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, String pattern, String replacement) {\n      return self.replace(pattern, replacement);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, VmRegex regex, String replacement) {\n      try {\n        return regex.matcher(self).replaceAll(replacement);\n      } catch (IndexOutOfBoundsException | IllegalArgumentException e) {\n        throw exceptionBuilder()\n            .evalError(\n                \"errorInRegexReplacement\",\n                regex.getPattern().toString(),\n                replacement,\n                e.getMessage())\n            .build();\n      }\n    }\n  }\n\n  public abstract static class replaceFirst extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, String pattern, String replacement) {\n      int idx = self.indexOf(pattern);\n      if (idx == -1) return self;\n      return self.substring(0, idx) + replacement + self.substring(idx + pattern.length());\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, VmRegex regex, String replacement) {\n      try {\n        return regex.matcher(self).replaceFirst(replacement);\n      } catch (IndexOutOfBoundsException | IllegalArgumentException e) {\n        throw exceptionBuilder()\n            .evalError(\"errorInRegexReplacement\", regex.getPattern(), replacement, e.getMessage())\n            .build();\n      }\n    }\n  }\n\n  public abstract static class replaceLast extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, String pattern, String replacement) {\n      var idx = self.lastIndexOf(pattern);\n      if (idx == -1) return self;\n      return self.substring(0, idx) + replacement + self.substring(idx + pattern.length());\n    }\n\n    @TruffleBoundary\n    @Specialization\n    // inefficient but at least correct\n    protected String eval(String self, VmRegex regex, String replacement) {\n      try {\n        var matcher = regex.matcher(self);\n        if (!findLast(matcher)) return self;\n        var result = new StringBuilder();\n        matcher.appendReplacement(result, replacement);\n        matcher.appendTail(result);\n        return result.toString();\n      } catch (IndexOutOfBoundsException | IllegalArgumentException e) {\n        throw exceptionBuilder()\n            .evalError(\"errorInRegexReplacement\", regex.getPattern(), replacement, e.getMessage())\n            .build();\n      }\n    }\n  }\n\n  public abstract static class replaceRange extends ExternalMethod3Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, long start, long exclusiveEnd, String replacement) {\n      var charStart = VmUtils.codePointOffsetToCharOffset(self, start);\n      if (charStart == -1) {\n        throw exceptionBuilder()\n            .evalError(\"charIndexOutOfRange\", start, 0, self.codePointCount(0, self.length()))\n            .withProgramValue(\"String\", self)\n            .build();\n      }\n\n      var charExclusiveEnd =\n          VmUtils.codePointOffsetToCharOffset(self, exclusiveEnd - start, charStart);\n      if (charExclusiveEnd < charStart) {\n        throw exceptionBuilder()\n            .evalError(\n                \"charIndexOutOfRange\", exclusiveEnd, start, self.codePointCount(0, self.length()))\n            .withProgramValue(\"String\", self)\n            .build();\n      }\n\n      return self.substring(0, charStart) + replacement + self.substring(charExclusiveEnd);\n    }\n  }\n\n  public abstract static class replaceFirstMapped extends ExternalMethod2Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, String pattern, VmFunction mapper) {\n      return doEval(self, patternOf(pattern).matcher(self), mapper);\n    }\n\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, VmRegex regex, VmFunction mapper) {\n      return doEval(self, regex.matcher(self), mapper);\n    }\n\n    private String doEval(String self, Matcher matcher, VmFunction mapper) {\n      if (!matcher.find()) return self;\n      return self.substring(0, matcher.start())\n          + applyMapper(applyLambdaNode, matcher, mapper)\n          + self.substring(matcher.end());\n    }\n  }\n\n  public abstract static class replaceLastMapped extends ExternalMethod2Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, String pattern, VmFunction mapper) {\n      return doEval(self, patternOf(pattern).matcher(self), mapper);\n    }\n\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, VmRegex regex, VmFunction mapper) {\n      return doEval(self, regex.matcher(self), mapper);\n    }\n\n    private String doEval(String self, Matcher matcher, VmFunction mapper) {\n      return !findLast(matcher)\n          ? self\n          : self.substring(0, matcher.start())\n              + applyMapper(applyLambdaNode, matcher, mapper)\n              + self.substring(matcher.end());\n    }\n  }\n\n  public abstract static class replaceAllMapped extends ExternalMethod2Node {\n    @Child private ApplyVmFunction1Node applyLambdaNode = ApplyVmFunction1NodeGen.create();\n\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, String pattern, VmFunction mapper) {\n      return doEval(self, patternOf(pattern).matcher(self), mapper);\n    }\n\n    @Specialization\n    @TruffleBoundary\n    protected String eval(String self, VmRegex regex, VmFunction mapper) {\n      return doEval(self, regex.matcher(self), mapper);\n    }\n\n    private String doEval(String self, Matcher matcher, VmFunction mapper) {\n      if (!matcher.find()) return self;\n\n      var buffer = new StringBuilder();\n\n      do {\n        matcher.appendReplacement(buffer, applyMapper(applyLambdaNode, matcher, mapper));\n      } while (matcher.find());\n\n      matcher.appendTail(buffer);\n      return buffer.toString();\n    }\n  }\n\n  public abstract static class toLowerCase extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return self.toLowerCase(Locale.ROOT);\n    }\n  }\n\n  public abstract static class toUpperCase extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return self.toUpperCase(Locale.ROOT);\n    }\n  }\n\n  public abstract static class reverse extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return new StringBuilder(self).reverse().toString();\n    }\n  }\n\n  public abstract static class trim extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return self.strip();\n    }\n  }\n\n  public abstract static class trimStart extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return StringUtils.trimStart(self);\n    }\n  }\n\n  public abstract static class trimEnd extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return StringUtils.trimEnd(self);\n    }\n  }\n\n  public abstract static class padStart extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, long width, String ch) {\n      var length = self.length();\n      if (length >= width) return self;\n\n      var result = new StringBuilder(VmSafeMath.toInt32(width));\n      var c = ch.charAt(0);\n      for (var i = 0; i < width - length; i++) {\n        result.append(c);\n      }\n      result.append(self);\n      return result.toString();\n    }\n  }\n\n  public abstract static class padEnd extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self, long width, String ch) {\n      var length = self.length();\n      if (length >= width) return self;\n\n      var result = new StringBuilder(VmSafeMath.toInt32(width));\n      result.append(self);\n      var c = ch.charAt(0);\n      for (var i = 0; i < width - length; i++) {\n        result.append(c);\n      }\n      return result.toString();\n    }\n  }\n\n  public abstract static class split extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected VmList eval(String self, String separator) {\n      var parts = self.split(Pattern.quote(separator));\n      return VmList.create(parts);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected VmList eval(String self, VmRegex separator) {\n      return VmList.create(separator.getPattern().split(self));\n    }\n  }\n\n  public abstract static class splitLimit extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected VmList eval(String self, String separator, long limit) {\n      var parts = self.split(Pattern.quote(separator), (int) limit);\n      return VmList.create(parts);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected VmList eval(String self, VmRegex separator, long limit) {\n      var parts = separator.getPattern().split(self, (int) limit);\n      return VmList.create(parts);\n    }\n  }\n\n  public abstract static class capitalize extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      if (self.isEmpty()) return \"\";\n\n      var firstChar = self.codePointAt(0);\n      return Character.toString(Character.toTitleCase(firstChar))\n          + self.substring(Character.isBmpCodePoint(firstChar) ? 1 : 2);\n    }\n  }\n\n  public abstract static class decapitalize extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      if (self.isEmpty()) return \"\";\n\n      var firstChar = self.codePointAt(0);\n      return Character.toString(firstChar).toLowerCase(Locale.ROOT)\n          + self.substring(Character.isBmpCodePoint(firstChar) ? 1 : 2);\n    }\n  }\n\n  public abstract static class toInt extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected long eval(String self) {\n      try {\n        return Long.parseLong(removeUnderlinesFromNumber(self));\n      } catch (NumberFormatException e) {\n        throw exceptionBuilder()\n            .evalError(\"cannotParseStringAs\", \"Int\")\n            .withProgramValue(\"String\", self)\n            .build();\n      }\n    }\n  }\n\n  public abstract static class toIntOrNull extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self) {\n      try {\n        return Long.parseLong(removeUnderlinesFromNumber(self));\n      } catch (NumberFormatException e) {\n        return VmNull.withoutDefault();\n      }\n    }\n  }\n\n  public abstract static class toFloat extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected double eval(String self) {\n      try {\n        return Double.parseDouble(removeUnderlinesFromNumber(self));\n      } catch (NumberFormatException e) {\n        throw exceptionBuilder()\n            .evalError(\"cannotParseStringAs\", \"Float\")\n            .withProgramValue(\"String\", self)\n            .build();\n      }\n    }\n  }\n\n  public abstract static class toFloatOrNull extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self) {\n      try {\n        return Double.parseDouble(removeUnderlinesFromNumber(self));\n      } catch (NumberFormatException e) {\n        return VmNull.withoutDefault();\n      }\n    }\n  }\n\n  public abstract static class toBoolean extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(String self) {\n      if (self.equalsIgnoreCase(\"true\")) return true;\n      if (self.equalsIgnoreCase(\"false\")) return false;\n\n      throw exceptionBuilder()\n          .evalError(\"cannotParseStringAs\", \"Boolean\")\n          .withProgramValue(\"String\", self)\n          .build();\n    }\n  }\n\n  public abstract static class toBooleanOrNull extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected Object eval(String self) {\n      if (self.equalsIgnoreCase(\"true\")) return true;\n      if (self.equalsIgnoreCase(\"false\")) return false;\n      return VmNull.withoutDefault();\n    }\n  }\n\n  public abstract static class md5 extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return ByteArrayUtils.md5(self.getBytes(StandardCharsets.UTF_8));\n    }\n  }\n\n  public abstract static class sha1 extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return ByteArrayUtils.sha1(self.getBytes(StandardCharsets.UTF_8));\n    }\n  }\n\n  public abstract static class sha256 extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return ByteArrayUtils.sha256(self.getBytes(StandardCharsets.UTF_8));\n    }\n  }\n\n  public abstract static class sha256Int extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected long eval(String self) {\n      return ByteArrayUtils.sha256Int(self.getBytes(StandardCharsets.UTF_8));\n    }\n  }\n\n  public abstract static class base64 extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      return ByteArrayUtils.base64(self.getBytes(StandardCharsets.UTF_8));\n    }\n  }\n\n  public abstract static class base64Decoded extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected String eval(String self) {\n      try {\n        return new String(Base64.getDecoder().decode(self), StandardCharsets.UTF_8);\n      } catch (IllegalArgumentException e) {\n        throw exceptionBuilder()\n            .adhocEvalError(e.getMessage())\n            .withProgramValue(\"String\", self)\n            .withCause(e)\n            .build();\n      }\n    }\n  }\n\n  public abstract static class base64DecodedBytes extends ExternalPropertyNode {\n    @TruffleBoundary\n    @Specialization\n    protected VmBytes eval(String self) {\n      try {\n        return new VmBytes(Base64.getDecoder().decode(self));\n      } catch (IllegalArgumentException e) {\n        throw exceptionBuilder()\n            .adhocEvalError(e.getMessage())\n            .withProgramValue(\"String\", self)\n            .withCause(e)\n            .build();\n      }\n    }\n  }\n\n  public abstract static class encodeToBytes extends ExternalMethod1Node {\n    @TruffleBoundary\n    @Specialization\n    protected VmBytes eval(String self, String charsetName) {\n      try {\n        var bytes = self.getBytes(charsetName);\n        return new VmBytes(bytes);\n      } catch (UnsupportedEncodingException e) {\n        throw PklBugException.unreachableCode();\n      }\n    }\n  }\n\n  @TruffleBoundary\n  private static String substringFrom(String string, int start) {\n    return string.substring(start);\n  }\n\n  @TruffleBoundary\n  private static String substringUntil(String string, int end) {\n    return string.substring(0, end);\n  }\n\n  private static Pattern patternOf(String regex) {\n    return Pattern.compile(regex, Pattern.LITERAL | Pattern.UNICODE_CASE);\n  }\n\n  private static boolean findLast(Matcher m) {\n    if (!m.find()) return false;\n    MatchResult r;\n    do {\n      r = m.toMatchResult();\n    } while (m.find());\n\n    // Reset `m` to the last match before returning (should always be `true` at this point)\n    return m.region(r.start(), r.end()).lookingAt();\n  }\n\n  /**\n   * In `matcher`'s current match, apply `mapper` to the match and quote it (to prevent unintended\n   * regex replacement syntax from being \"double dereferenced\"). `matcher` must have a current match\n   * (i.e. the previous `find` returned `true`). The string returned is safe as a drop-in\n   * replacement.\n   */\n  private static String applyMapper(\n      ApplyVmFunction1Node applyNode, Matcher matcher, VmFunction mapper) {\n    // -1 indicates regex match instead of group match (see comments in RegexMatchNodes)\n    var regexMatch = RegexMatchFactory.create(Pair.of(matcher.toMatchResult(), -1));\n    var replacement = applyNode.executeString(mapper, regexMatch);\n    return Matcher.quoteReplacement(replacement);\n  }\n\n  /**\n   * Removes `_` from numbers to be parsed to be compatible with how Pkl parses numbers. Will return\n   * the string unmodified if it's invalid.\n   */\n  private static String removeUnderlinesFromNumber(String number) {\n    var builder = new StringBuilder();\n    var numberStart = true;\n    for (var i = 0; i < number.length(); i++) {\n      var c = number.charAt(i);\n      if (c != '_') {\n        builder.append(c);\n      } else if (numberStart) return number;\n\n      numberStart = c == '.' || c == 'e' || c == 'E';\n    }\n\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/TypedNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\npublic final class TypedNodes {\n  private TypedNodes() {}\n\n  public abstract static class hasProperty extends ExternalMethod1Node {\n    @Specialization\n    protected Object eval(VmTyped self, String name) {\n      return self.getVmClass().hasProperty(Identifier.get(name));\n    }\n  }\n\n  public abstract static class getProperty extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    @Specialization\n    protected Object eval(VmTyped self, String name) {\n      return VmUtils.readMember(self, Identifier.get(name), callNode);\n    }\n  }\n\n  public abstract static class getPropertyOrNull extends ExternalMethod1Node {\n    @Child private IndirectCallNode callNode = IndirectCallNode.create();\n\n    @Specialization\n    protected Object eval(VmTyped self, String name) {\n      return VmNull.lift(VmUtils.readMemberOrNull(self, Identifier.get(name), callNode));\n    }\n  }\n\n  public abstract static class toMap extends ExternalMethod0Node {\n    @Specialization\n    protected VmMap eval(VmTyped self) {\n      var builder = VmMap.builder();\n      self.forceAndIterateMemberValues(\n          (memberKey, memberDef, memberValue) -> {\n            // exclude type definitions\n            if (memberDef.isClass() || memberDef.isTypeAlias()) return true;\n            builder.add(memberKey.toString(), memberValue);\n            return true;\n          });\n      return builder.build();\n    }\n  }\n\n  public abstract static class toDynamic extends ExternalMethod0Node {\n    @Specialization\n    protected VmObjectLike eval(VmTyped self) {\n      var result =\n          new VmDynamic(\n              VmUtils.createEmptyMaterializedFrame(),\n              BaseModule.getDynamicClass().getPrototype(),\n              self.getVmClass().getTypedToDynamicMembers(),\n              0);\n      result.setExtraStorage(self);\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/YamlRendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.base;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmCollection;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.runtime.VmRegex;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.MutableBoolean;\nimport org.pkl.core.util.yaml.YamlEmitter;\n\npublic final class YamlRendererNodes {\n  private YamlRendererNodes() {}\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  private static YamlRenderer createRenderer(VmTyped self, StringBuilder builder) {\n    var mode = ((String) VmUtils.readMember(self, Identifier.MODE));\n    var indentWidth = ((Long) VmUtils.readMember(self, Identifier.INDENT_WIDTH)).intValue();\n    var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);\n    var isStream = (boolean) VmUtils.readMember(self, Identifier.IS_STREAM);\n    return new YamlRenderer(\n        builder,\n        \" \".repeat(indentWidth),\n        PklConverter.fromRenderer(self),\n        omitNullProperties,\n        mode,\n        isStream);\n  }\n\n  private static final class YamlRenderer extends AbstractStringRenderer {\n    private final boolean isStream;\n    private final YamlEmitter emitter;\n    private final String elementIndent;\n\n    private YamlRenderer(\n        StringBuilder builder,\n        String indent,\n        PklConverter converter,\n        boolean omitNullProperties,\n        String mode,\n        boolean isStream) {\n      super(\"YAML\", builder, indent, converter, omitNullProperties, omitNullProperties);\n\n      this.isStream = isStream;\n      this.emitter = YamlEmitter.create(builder, mode, indent);\n      elementIndent = indent.substring(1);\n    }\n\n    @Override\n    public void visitDocument(Object value) {\n      if (isStream) {\n        visitStream(value);\n      } else {\n        visit(value);\n      }\n      startNewLine();\n    }\n\n    private void visitStream(Object value) {\n      if (value instanceof VmListing listing) {\n        var isFirst = new MutableBoolean(true);\n        listing.forceAndIterateMemberValues(\n            ((key, member, element) -> {\n              if (!isFirst.getAndSetFalse()) {\n                startNewLine();\n                builder.append(\"---\");\n              }\n              visit(element);\n              return true;\n            }));\n        return;\n      }\n\n      if (value instanceof VmCollection collection) {\n        var first = true;\n        for (var element : collection) {\n          if (first) {\n            first = false;\n          } else {\n            startNewLine();\n            builder.append(\"---\");\n          }\n          visit(element);\n        }\n        return;\n      }\n\n      throw new VmExceptionBuilder()\n          .evalError(\"invalidYamlStreamTopLevelValue\", VmUtils.getClass(value))\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitTopLevelValue(Object value) {\n      visit(value);\n    }\n\n    @Override\n    public void visitString(String value) {\n      if (!builder.isEmpty()) builder.append(' ');\n      emitter.emit(value, currIndent, false);\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      if (!builder.isEmpty()) builder.append(' ');\n      emitter.emit(value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      if (!builder.isEmpty()) builder.append(' ');\n      emitter.emit(value);\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      if (!builder.isEmpty()) builder.append(' ');\n      emitter.emit(value);\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      if (!builder.isEmpty()) builder.append(' ');\n      emitter.emit(value.getBytes(), currIndent, false);\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitRenderDirective(VmTyped value) {\n      // append verbatim\n      builder.append(VmUtils.readTextProperty(value));\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      if (!builder.isEmpty()) builder.append(' ');\n      emitter.emitNull();\n    }\n\n    @Override\n    protected void startDynamic(VmDynamic value) {\n      if (value.hasElements()) {\n        startYamlSequence();\n      } else {\n        startYamlMapping();\n      }\n    }\n\n    @Override\n    protected void startTyped(VmTyped value) {\n      startYamlMapping();\n    }\n\n    @Override\n    protected void startListing(VmListing value) {\n      startYamlSequence();\n    }\n\n    @Override\n    protected void startMapping(VmMapping value) {\n      startYamlMapping();\n    }\n\n    @Override\n    protected void startList(VmList value) {\n      startYamlSequence();\n    }\n\n    @Override\n    protected void startSet(VmSet value) {\n      startYamlSequence();\n    }\n\n    @Override\n    protected void startMap(VmMap value) {\n      startYamlMapping();\n    }\n\n    private void startYamlMapping() {\n      if (enclosingValue != null) {\n        increaseIndent();\n      }\n      if (hasEnclosingSequence()) {\n        builder.append(elementIndent);\n      } else {\n        startNewLine();\n      }\n    }\n\n    private void startYamlSequence() {\n      if (hasEnclosingSequence()) {\n        increaseIndent();\n        builder.append(elementIndent);\n      } else {\n        startNewLine();\n      }\n    }\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {\n      if (!isFirst) {\n        startNewLine();\n      }\n      builder.append('-');\n      visit(value);\n    }\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {\n      if (!isFirst) {\n        startNewLine();\n      }\n\n      if (key instanceof String stringKey) {\n        emitter.emit(stringKey, currIndent, true);\n        builder.append(':');\n        return;\n      } else if (key instanceof Long longKey) {\n        emitter.emit(longKey);\n        builder.append(':');\n        return;\n      } else if (key instanceof Double doubleKey) {\n        emitter.emit(doubleKey);\n        builder.append(':');\n        return;\n      } else if (key instanceof Boolean booleanKey) {\n        emitter.emit(booleanKey);\n        builder.append(':');\n        return;\n      } else if (key instanceof VmNull) {\n        emitter.emitNull();\n        builder.append(':');\n        return;\n      }\n\n      if (isRenderDirective(key)) {\n        visitRenderDirective((VmTyped) key);\n        builder.append(':');\n        return;\n      }\n\n      cannotRenderNonScalarKey(key);\n    }\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      visit(value);\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      if (!isFirst) {\n        startNewLine();\n      }\n      emitter.emit(name.toString(), currIndent, true);\n      builder.append(':');\n      visit(value);\n    }\n\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {\n      if (value.hasElements()) {\n        endYamlSequence(isEmpty);\n      } else {\n        endYamlMapping(isEmpty);\n      }\n    }\n\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {\n      endYamlMapping(isEmpty);\n    }\n\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {\n      endYamlSequence(isEmpty);\n    }\n\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {\n      endYamlMapping(isEmpty);\n    }\n\n    @Override\n    protected void endList(VmList value) {\n      endYamlSequence(value.isEmpty());\n    }\n\n    @Override\n    protected void endSet(VmSet value) {\n      endYamlSequence(value.isEmpty());\n    }\n\n    @Override\n    protected void endMap(VmMap value) {\n      endYamlMapping(value.isEmpty());\n    }\n\n    private void endYamlSequence(boolean isEmpty) {\n      var hasEnclosingSequence = hasEnclosingSequence();\n      if (isEmpty) {\n        if (hasEnclosingSequence) {\n          builder.append(\"[]\");\n        } else {\n          undoStartNewLine();\n          builder.append(\" []\");\n        }\n      }\n      if (hasEnclosingSequence) {\n        decreaseIndent();\n      }\n    }\n\n    private void endYamlMapping(boolean isEmpty) {\n      if (isEmpty) {\n        if (hasEnclosingSequence()) {\n          builder.append(\"{}\");\n        } else {\n          undoStartNewLine();\n          builder.append(\" {}\");\n        }\n      }\n      if (enclosingValue != null) {\n        decreaseIndent();\n      }\n    }\n\n    private boolean hasEnclosingSequence() {\n      return enclosingValue != null && enclosingValue.isSequence();\n    }\n\n    private void startNewLine() {\n      var length = builder.length();\n      if (length == 0) return;\n\n      if (builder.charAt(length - 1) != '\\n') {\n        builder.append('\\n');\n      }\n      builder.append(currIndent);\n    }\n\n    private void undoStartNewLine() {\n      var length = builder.length();\n      if (length == 0) return;\n\n      builder.setLength(length - currIndent.length() - 1);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/base/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.base;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/benchmark/BenchmarkUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.benchmark;\n\nimport java.util.function.*;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.VmObjectFactory;\nimport org.pkl.core.util.Nullable;\n\nfinal class BenchmarkUtils {\n  private static final VmObjectFactory<BenchmarkResult> benchmarkResultFactory =\n      new VmObjectFactory<BenchmarkResult>(BenchmarkModule::getBenchmarkResultClass)\n          .addIntProperty(\"iterations\", BenchmarkResult::iterations)\n          .addIntProperty(\"repetitions\", BenchmarkResult::repetitions)\n          .addValueProperty(\"samples\", BenchmarkResult::samples)\n          .addDurationProperty(\"min\", BenchmarkResult::min)\n          .addDurationProperty(\"max\", BenchmarkResult::max)\n          .addDurationProperty(\"mean\", BenchmarkResult::mean)\n          // use short names of similar length in report\n          .addDurationProperty(\"stdev\", BenchmarkResult::stdDeviation)\n          .addDurationProperty(\"error\", BenchmarkResult::errorMargin);\n\n  private BenchmarkUtils() {}\n\n  static VmTyped runBenchmark(VmTyped benchmark, LongFunction<Object> iterationRunner) {\n    // inputs\n    var iterations = ((Long) VmUtils.readMember(benchmark, Identifier.ITERATIONS)).intValue();\n    var iterationTime = (VmDuration) VmUtils.readMember(benchmark, Identifier.ITERATION_TIME);\n    var iterationTimeNanos = Math.round(iterationTime.getValue(DurationUnit.NANOS));\n    var isVerbose = (boolean) VmUtils.readMember(benchmark, Identifier.IS_VERBOSE);\n\n    // warmup and sizing\n    long repetitions = 0;\n    for (int i = 0; i < iterations; i++) {\n      repetitions = runWarmupIteration(iterationRunner, iterationTimeNanos);\n    }\n\n    // measurement\n    var samples = new double[iterations];\n    var min = Double.MAX_VALUE;\n    var max = Double.MIN_VALUE;\n    var mean = 0.0;\n    var sumOfSquares = 0.0;\n\n    for (int i = 0; i < iterations; i++) {\n      var actualIterationTime = runMeasureIteration(iterationRunner, repetitions);\n      var sample = ((double) actualIterationTime) / repetitions;\n      samples[i] = sample;\n      min = Math.min(min, sample);\n      max = Math.max(max, sample);\n\n      // Art of Computer Programming vol. 2, Knuth, 4.2.2, (15) and (16)\n      var delta = sample - mean;\n      mean += delta / (i + 1);\n      sumOfSquares += delta * (sample - mean);\n    }\n\n    // result\n    // https://en.wikipedia.org/wiki/Standard_error#Assumptions_and_usage\n    var variance = sumOfSquares / (iterations - 1);\n    var stdDeviation = Math.sqrt(variance);\n    var stdError = stdDeviation / Math.sqrt(iterations);\n    var errorMargin = stdError * 2.576;\n    var result =\n        new BenchmarkResult(\n            iterations,\n            repetitions,\n            isVerbose ? samples : null,\n            min,\n            max,\n            mean,\n            stdDeviation,\n            errorMargin);\n    return benchmarkResultFactory.create(result);\n  }\n\n  private static long runWarmupIteration(LongFunction<Object> iterationRunner, long iterationTime) {\n    // 1, 2, 5, 1, 2, 5, etc.\n    var state = 1;\n    // 1, 2, 5, 10, 20, 50, etc. (more human-friendly than 1, 2, 4, 8, 16, 32, etc.)\n    var repetitions = 1L;\n    // try to land on `iterationTime * 1` on average\n    var minIterationTime = Math.round(iterationTime * 2 / 3.0);\n    var startTime = System.nanoTime();\n\n    do {\n      iterationRunner.apply(repetitions);\n      if (state == 1) {\n        state = 2;\n        repetitions *= 2;\n      } else if (state == 2) {\n        state = 5;\n        repetitions = repetitions * 5 / 2;\n      } else {\n        state = 1;\n        repetitions *= 2;\n      }\n    } while (System.nanoTime() - startTime < minIterationTime);\n\n    // we ran roughly this many repetitions in total\n    return repetitions;\n  }\n\n  private static long runMeasureIteration(LongFunction<Object> iterationRunner, long repetitions) {\n    var startTime = System.nanoTime();\n    iterationRunner.apply(repetitions);\n    return System.nanoTime() - startTime;\n  }\n\n  private static final class BenchmarkResult {\n    final long iterations;\n    final long repetitions;\n    final VmValue samples;\n    final VmDuration min;\n    final VmDuration max;\n    final VmDuration mean;\n    final VmDuration stdDeviation;\n    final VmDuration errorMargin;\n\n    BenchmarkResult(\n        long iterations,\n        long repetitions,\n        double @Nullable [] samples,\n        double min,\n        double max,\n        double mean,\n        double stdDeviation,\n        double errorMargin) {\n      this.iterations = iterations;\n      this.repetitions = repetitions;\n      var unit = chooseUnit(mean);\n      this.samples = toList(samples, unit);\n      this.min = toDuration(min, unit);\n      this.max = toDuration(max, unit);\n      this.mean = toDuration(mean, unit);\n      this.stdDeviation = toDuration(stdDeviation, unit);\n      this.errorMargin = toDuration(errorMargin, unit);\n    }\n\n    long iterations() {\n      return iterations;\n    }\n\n    long repetitions() {\n      return repetitions;\n    }\n\n    VmValue samples() {\n      return samples;\n    }\n\n    VmDuration min() {\n      return min;\n    }\n\n    VmDuration max() {\n      return max;\n    }\n\n    VmDuration mean() {\n      return mean;\n    }\n\n    VmDuration stdDeviation() {\n      return stdDeviation;\n    }\n\n    VmDuration errorMargin() {\n      return errorMargin;\n    }\n\n    private static DurationUnit chooseUnit(double nanos) {\n      if (nanos < 1_000) return DurationUnit.NANOS;\n      if (nanos < 1_000_000) return DurationUnit.MICROS;\n      if (nanos < 1_000_000_000) return DurationUnit.MILLIS;\n      return DurationUnit.SECONDS;\n    }\n\n    private static VmDuration toDuration(double nanos, DurationUnit unit) {\n      return new VmDuration(nanos / unit.getNanos(), unit);\n    }\n\n    private static VmValue toList(double @Nullable [] values, DurationUnit unit) {\n      if (values == null) return VmNull.withoutDefault();\n\n      var builder = VmList.EMPTY.builder();\n      for (var value : values) builder.add(toDuration(value, unit));\n      return builder.build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/benchmark/MicrobenchmarkNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.benchmark;\n\nimport static org.pkl.core.stdlib.benchmark.BenchmarkUtils.runBenchmark;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.frame.FrameDescriptor;\nimport com.oracle.truffle.api.frame.VirtualFrame;\nimport com.oracle.truffle.api.nodes.LoopNode;\nimport com.oracle.truffle.api.source.SourceSection;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.PklRootNode;\nimport org.pkl.core.ast.internal.BlackholeNode;\nimport org.pkl.core.ast.internal.BlackholeNodeGen;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.util.Nullable;\n\npublic final class MicrobenchmarkNodes {\n  public abstract static class run extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected VmTyped eval(VmTyped self) {\n      var codeMember = VmUtils.findMember(self, Identifier.EXPRESSION);\n      assert codeMember != null;\n      var codeMemberNode = codeMember.getMemberNode();\n      if (codeMemberNode == null) {\n        throw exceptionBuilder().evalError(\"constantMicrobenchmark\").build();\n      }\n      var runIterationsNode =\n          new RunIterationsNode(\n              VmLanguage.get(this),\n              new FrameDescriptor(),\n              (ExpressionNode) codeMemberNode.getBodyNode().deepCopy());\n      var callTarget = runIterationsNode.getCallTarget();\n      return runBenchmark(self, (iterations) -> callTarget.call(self, self, iterations));\n    }\n  }\n\n  public static final class RunIterationsNode extends PklRootNode {\n    private @Child BlackholeNode blackholeNode;\n\n    public RunIterationsNode(\n        VmLanguage language, FrameDescriptor descriptor, ExpressionNode iterationNode) {\n      super(language, descriptor);\n\n      this.blackholeNode = BlackholeNodeGen.create(iterationNode);\n    }\n\n    @Override\n    public boolean isInternal() {\n      return true;\n    }\n\n    @Override\n    public SourceSection getSourceSection() {\n      return VmUtils.unavailableSourceSection();\n    }\n\n    @Override\n    public @Nullable String getName() {\n      return null;\n    }\n\n    @Override\n    protected @Nullable Object executeImpl(VirtualFrame frame) {\n      var repetitions = (long) frame.getArguments()[2];\n      for (long i = 0; i < repetitions; i++) {\n        blackholeNode.executeGeneric(frame);\n      }\n      LoopNode.reportLoopCount(\n          this, repetitions > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) repetitions);\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/benchmark/OutputBenchmarkNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.benchmark;\n\nimport static org.pkl.core.stdlib.benchmark.BenchmarkUtils.runBenchmark;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.util.List;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.module.ResolvedModuleKey;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.util.MutableReference;\nimport org.pkl.core.util.Nullable;\n\npublic final class OutputBenchmarkNodes {\n  public abstract static class run extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected VmTyped eval(VmTyped self) {\n      var module = (VmTyped) VmUtils.readMember(self, Identifier.SOURCE_MODULE);\n      var moduleInfo = VmUtils.getModuleInfo(module);\n      var moduleKey = new UncachedModuleKey(moduleInfo.getModuleKey());\n      var blackhole = new MutableReference<String>(null);\n      var language = VmLanguage.get(this);\n      return runBenchmark(\n          self,\n          (repetitions) -> {\n            for (long i = 0; i < repetitions; i++) {\n              // Evaluate module in the same evaluator that evaluates this benchmark.\n              // Alternatively, we could use a separate evaluator.\n              var uncachedModule = language.loadModule(moduleKey);\n              var output = VmUtils.readMember(uncachedModule, Identifier.OUTPUT);\n              blackhole.set(VmUtils.readTextProperty(output));\n            }\n            return blackhole.get();\n          });\n    }\n  }\n\n  private static final class UncachedModuleKey implements ModuleKey {\n    private final ModuleKey delegate;\n\n    public UncachedModuleKey(ModuleKey delegate) {\n      this.delegate = delegate;\n    }\n\n    @Override\n    public URI getUri() {\n      return delegate.getUri();\n    }\n\n    @Override\n    public ResolvedModuleKey resolve(SecurityManager securityManager)\n        throws IOException, SecurityManagerException {\n      var resolvedDelegate = delegate.resolve(securityManager);\n      return new ResolvedModuleKey() {\n        @Override\n        public ModuleKey getOriginal() {\n          return UncachedModuleKey.this;\n        }\n\n        @Override\n        public URI getUri() {\n          return resolvedDelegate.getUri();\n        }\n\n        @Override\n        public String loadSource() throws IOException {\n          return resolvedDelegate.loadSource();\n        }\n      };\n    }\n\n    @Override\n    public boolean isCached() {\n      // don't cache module in memory (otherwise output will only be computed once)\n      return false;\n    }\n\n    @Override\n    public @Nullable Path getFileCacheLocation() {\n      // file caching is ok\n      return delegate.getFileCacheLocation();\n    }\n\n    @Override\n    public boolean hasHierarchicalUris() throws IOException, ExternalReaderProcessException {\n      return delegate.hasHierarchicalUris();\n    }\n\n    @Override\n    public boolean isLocal() {\n      return delegate.isLocal();\n    }\n\n    @Override\n    public boolean isGlobbable() throws IOException, ExternalReaderProcessException {\n      return delegate.isGlobbable();\n    }\n\n    @Override\n    public boolean hasElement(SecurityManager securityManager, URI uri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      return delegate.hasElement(securityManager, uri);\n    }\n\n    @Override\n    public List<PathElement> listElements(SecurityManager securityManager, URI baseUri)\n        throws IOException, SecurityManagerException, ExternalReaderProcessException {\n      return delegate.listElements(securityManager, baseUri);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/benchmark/ParserBenchmarkNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.benchmark;\n\nimport static org.pkl.core.stdlib.benchmark.BenchmarkUtils.runBenchmark;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.net.URI;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.ModuleKeys;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.ExternalMethod0Node;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.MutableReference;\n\npublic final class ParserBenchmarkNodes {\n  public abstract static class run extends ExternalMethod0Node {\n    @TruffleBoundary\n    @Specialization\n    protected VmTyped eval(VmTyped self) {\n      var sourceText = (String) VmUtils.readMember(self, Identifier.SOURCE_TEXT);\n      var moduleUri = (String) VmUtils.readMember(self, Identifier.SOURCE_URI);\n      ModuleKey moduleKey;\n      if (moduleUri.equals(\"repl:text\")) {\n        moduleKey = ModuleKeys.synthetic(URI.create(moduleUri), sourceText);\n      } else {\n        moduleKey =\n            ModuleKeys.cached(\n                VmContext.get(this).getModuleResolver().resolve(IoUtils.createUri(moduleUri)),\n                sourceText);\n      }\n      var blackhole = new MutableReference<VmTyped>(null);\n      var language = VmLanguage.get(this);\n      return runBenchmark(\n          self,\n          (repetitions) -> {\n            for (long i = 0; i < repetitions; i++) {\n              blackhole.set(language.loadModule(moduleKey));\n            }\n            return blackhole.get();\n          });\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/benchmark/package-info.java",
    "content": "@NonnullByDefault\n@PklName(\"Benchmark\")\npackage org.pkl.core.stdlib.benchmark;\n\nimport org.pkl.core.stdlib.PklName;\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.json;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport java.util.*;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.json.JsonHandler;\nimport org.pkl.core.util.json.JsonParser;\nimport org.pkl.core.util.json.ParseException;\n\npublic final class ParserNodes {\n  private ParserNodes() {}\n\n  public abstract static class parse extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(VmTyped self, String text) {\n      return doParse(self, text);\n    }\n\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(\n        VmTyped self, VmTyped resource, @Cached(\"create()\") IndirectCallNode callNode) {\n      var text = (String) VmUtils.readMember(resource, Identifier.TEXT, callNode);\n      return doParse(self, text);\n    }\n\n    private Object doParse(VmTyped self, String text) {\n      var converter = PklConverter.fromParser(self);\n      var useMapping = (boolean) VmUtils.readMember(self, Identifier.USE_MAPPING);\n      var handler = new Handler(converter, useMapping);\n      var parser = new JsonParser(handler);\n      try {\n        parser.parse(text);\n      } catch (ParseException e) {\n        throw exceptionBuilder().evalError(\"jsonParseError\").withHint(e.getMessage()).build();\n      }\n      return converter.convert(handler.value, List.of(VmValueConverter.TOP_LEVEL_VALUE));\n    }\n  }\n\n  private static class Handler\n      extends JsonHandler<EconomicMap<Object, ObjectMember>, EconomicMap<Object, ObjectMember>> {\n    private final PklConverter converter;\n    private final boolean useMapping;\n\n    private final Deque<Object> currPath = new ArrayDeque<>();\n\n    public Handler(PklConverter converter, boolean useMapping) {\n      this.converter = converter;\n      this.useMapping = useMapping;\n\n      currPath.push(VmValueConverter.TOP_LEVEL_VALUE);\n    }\n\n    private Object value;\n\n    @Override\n    public void endNull() {\n      value = VmNull.withoutDefault();\n    }\n\n    @Override\n    public void endBoolean(boolean value) {\n      this.value = value;\n    }\n\n    @Override\n    public void endString(String string) {\n      value = string;\n    }\n\n    @Override\n    public void endNumber(String string) {\n      try {\n        value = Long.valueOf(string);\n      } catch (NumberFormatException e) {\n        try {\n          value = Double.valueOf(string);\n        } catch (NumberFormatException e2) {\n          throw new ParseException(\"Cannot parse `\" + string + \"` as number.\", getLocation());\n        }\n      }\n    }\n\n    @Override\n    public EconomicMap<Object, ObjectMember> startArray() {\n      currPath.push(VmValueConverter.WILDCARD_ELEMENT);\n      return EconomicMaps.create();\n    }\n\n    @Override\n    public void endArray(@Nullable EconomicMap<Object, ObjectMember> members) {\n      assert members != null;\n      value =\n          new VmListing(\n              VmUtils.createEmptyMaterializedFrame(),\n              BaseModule.getListingClass().getPrototype(),\n              members,\n              EconomicMaps.size(members));\n      currPath.pop();\n    }\n\n    @Override\n    public void endArrayValue(@Nullable EconomicMap<Object, ObjectMember> members) {\n      assert members != null;\n      var size = EconomicMaps.size(members);\n      var member =\n          new ObjectMember(\n              VmUtils.unavailableSourceSection(),\n              VmUtils.unavailableSourceSection(),\n              VmModifier.ELEMENT,\n              null,\n              String.valueOf(size));\n      member.initConstantValue(converter.convert(value, currPath));\n      EconomicMaps.put(members, (long) size, member);\n    }\n\n    @Override\n    public EconomicMap<Object, ObjectMember> startObject() {\n      return EconomicMaps.create();\n    }\n\n    @Override\n    public void endObject(@Nullable EconomicMap<Object, ObjectMember> members) {\n      assert members != null;\n      if (useMapping) {\n        value =\n            new VmMapping(\n                VmUtils.createEmptyMaterializedFrame(),\n                BaseModule.getMappingClass().getPrototype(),\n                members);\n      } else {\n        value =\n            new VmDynamic(\n                VmUtils.createEmptyMaterializedFrame(),\n                BaseModule.getDynamicClass().getPrototype(),\n                members,\n                0);\n      }\n    }\n\n    @Override\n    public void startObjectValue(@Nullable EconomicMap<Object, ObjectMember> members, String name) {\n      currPath.push(Identifier.get(name));\n    }\n\n    @Override\n    public void endObjectValue(@Nullable EconomicMap<Object, ObjectMember> members, String name) {\n      assert members != null;\n      var memberName = useMapping ? name : Identifier.get(name);\n      var member =\n          new ObjectMember(\n              VmUtils.unavailableSourceSection(),\n              VmUtils.unavailableSourceSection(),\n              useMapping ? VmModifier.ENTRY : VmModifier.NONE,\n              useMapping ? null : (Identifier) memberName,\n              \"generated\");\n      member.initConstantValue(converter.convert(value, currPath));\n      EconomicMaps.put(members, memberName, member);\n      currPath.pop();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/json/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.json;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/jsonnet/RendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.jsonnet;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.util.Set;\nimport java.util.regex.Pattern;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.JsonnetModule;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.runtime.VmRegex;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.ArrayCharEscaper;\nimport org.pkl.core.util.IoUtils;\n\npublic final class RendererNodes {\n  private static Renderer createRenderer(VmTyped self, StringBuilder builder) {\n    var indent = (String) VmNull.unwrap(VmUtils.readMember(self, Identifier.INDENT));\n    if (indent == null) indent = \"\";\n    var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);\n    return new Renderer(builder, indent, omitNullProperties, PklConverter.fromRenderer(self));\n  }\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  private static final class Renderer extends AbstractStringRenderer {\n    // Pattern for object fields that we can render without any quotes.\n    // From: https://jsonnet.org/ref/spec.html#lexing\n    private static final Pattern ID_PATTERN = Pattern.compile(\"[_a-zA-Z][_a-zA-Z0-9]*\");\n\n    // Reserved Jsonnet language keywords.\n    // Object fields having these names must always be quoted.\n    private static final Set<String> RESERVED_KEYWORDS =\n        Set.of(\n            \"assert\",\n            \"else\",\n            \"error\",\n            \"false\",\n            \"for\",\n            \"function\",\n            \"if\",\n            \"import\",\n            \"importstr\",\n            \"in\",\n            \"local\",\n            \"null\",\n            \"self\",\n            \"super\",\n            \"tailstrict\",\n            \"then\",\n            \"true\");\n\n    // Pattern for multiline strings that are safe to print as multiline text blocks (using `|||`).\n    // Strings that have leading horizontal whitespace are not safe to print as text blocks,\n    // as it won't allow Jsonnet to unambiguously find the terminating `|||`.\n    private static final Pattern FIRST_NON_EMPTY_LINE_STARTS_WITH_NON_WHITESPACE =\n        Pattern.compile(\"\\\\n*\\\\S\");\n\n    private static final ArrayCharEscaper SINGLE_QUOTE_ESCAPER =\n        createBaseEscaper().withEscape('\\'', \"\\\\'\").build();\n\n    private static final ArrayCharEscaper DOUBLE_QUOTE_ESCAPER =\n        createBaseEscaper().withEscape('\"', \"\\\\\\\"\").build();\n\n    // behaves the same as jsonnetfmt's `jsonnet_string_escape()`\n    private static ArrayCharEscaper.Builder createBaseEscaper() {\n      var builder = ArrayCharEscaper.builder();\n      for (char ch = 0; ch < 0x20; ch++) {\n        builder.withEscape(ch, IoUtils.toUnicodeEscape(ch));\n      }\n      for (char ch = 0x80; ch <= 0x9f; ch++) {\n        builder.withEscape(ch, IoUtils.toUnicodeEscape(ch));\n      }\n      return builder\n          .withEscape('\\\\', \"\\\\\\\\\")\n          .withEscape('\\b', \"\\\\b\")\n          .withEscape('\\f', \"\\\\f\")\n          .withEscape('\\n', \"\\\\n\")\n          .withEscape('\\r', \"\\\\r\");\n    }\n\n    private final boolean renderInline;\n    private final char memberSeparator;\n\n    private Renderer(\n        StringBuilder builder, String indent, boolean omitNullProperties, PklConverter converter) {\n      super(\"Jsonnet\", builder, indent, converter, omitNullProperties, omitNullProperties);\n      renderInline = indent.isEmpty();\n      memberSeparator = renderInline ? ' ' : LINE_BREAK;\n    }\n\n    @Override\n    protected void visitDocument(Object value) {\n      visit(value);\n      builder.append(LINE_BREAK);\n    }\n\n    @Override\n    protected void visitTopLevelValue(Object value) {\n      visit(value);\n    }\n\n    @Override\n    protected void visitRenderDirective(VmTyped value) {\n      builder.append(VmUtils.readTextProperty(value));\n    }\n\n    @Override\n    public void visitTyped(VmTyped value) {\n      var vmClass = value.getVmClass();\n      if (vmClass == JsonnetModule.getImportStrClass()) {\n        // `importstr` constructs may not use multiline strings\n        builder.append(\"importstr \");\n        renderAsQuotedString((String) VmUtils.readMember(value, Identifier.PATH));\n      } else if (vmClass == JsonnetModule.getExtVarClass()) {\n        builder.append(\"std.extVar(\");\n        visitString((String) VmUtils.readMember(value, Identifier.NAME));\n        builder.append(')');\n      } else {\n        super.visitTyped(value);\n      }\n    }\n\n    @Override\n    public void visitString(String value) {\n      renderAsString(value);\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      builder.append(value);\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      builder.append(value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      builder.append(value);\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    private void startArray() {\n      builder.append('[');\n      increaseIndent();\n    }\n\n    private void startObject() {\n      builder.append('{');\n      increaseIndent();\n    }\n\n    private void endArray(boolean isEmpty) {\n      endValue(isEmpty);\n      builder.append(']');\n    }\n\n    private void endObject(boolean isEmpty) {\n      endValue(isEmpty);\n      if (!isEmpty && renderInline) {\n        builder.append(\" }\");\n      } else {\n        builder.append('}');\n      }\n    }\n\n    private void endValue(boolean isEmpty) {\n      decreaseIndent();\n      if (!isEmpty && !renderInline) {\n        builder.append(\",\\n\").append(currIndent);\n      }\n    }\n\n    @Override\n    public void startList(VmList value) {\n      startArray();\n    }\n\n    @Override\n    public void startSet(VmSet value) {\n      startArray();\n    }\n\n    @Override\n    public void startMap(VmMap value) {\n      startObject();\n    }\n\n    @Override\n    public void startTyped(VmTyped value) {\n      startObject();\n    }\n\n    @Override\n    public void startDynamic(VmDynamic value) {\n      if (value.hasElements()) {\n        startArray();\n      } else {\n        startObject();\n      }\n    }\n\n    @Override\n    public void startListing(VmListing value) {\n      startArray();\n    }\n\n    @Override\n    public void startMapping(VmMapping value) {\n      startObject();\n    }\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {\n      if (!isFirst) {\n        builder.append(',');\n      }\n      builder.append(memberSeparator).append(currIndent);\n      if (key instanceof String string) {\n        renderAsFieldName(string);\n      } else if (isRenderDirective(key)) {\n        visitRenderDirective((VmTyped) key);\n        builder.append(\": \");\n      } else {\n        cannotRenderNonStringKey(key);\n      }\n    }\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      visit(value);\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      if (!isFirst) {\n        builder.append(',');\n      }\n      builder.append(memberSeparator).append(currIndent);\n      renderAsFieldName(name.toString());\n      visit(value);\n    }\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {\n      if (!isFirst) {\n        builder.append(',');\n      }\n      // inline arrays don't have separators between the brackets; e.g. [1, 2, 3]\n      if (!isFirst || !renderInline) {\n        builder.append(memberSeparator).append(currIndent);\n      }\n      visit(value);\n    }\n\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {\n      if (value.hasElements()) {\n        endArray(isEmpty);\n      } else {\n        endObject(isEmpty);\n      }\n    }\n\n    @Override\n    protected void endList(VmList value) {\n      endArray(value.isEmpty());\n    }\n\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {\n      endArray(isEmpty);\n    }\n\n    @Override\n    protected void endMap(VmMap value) {\n      endObject(value.isEmpty());\n    }\n\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {\n      endObject(isEmpty);\n    }\n\n    @Override\n    protected void endSet(VmSet value) {\n      endArray(value.isEmpty());\n    }\n\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {\n      endObject(isEmpty);\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      builder.append(\"null\");\n    }\n\n    private void renderAsFieldName(String key) {\n      if (ID_PATTERN.matcher(key).matches() && !RESERVED_KEYWORDS.contains(key)) {\n        builder.append(key);\n      } else {\n        renderAsString(key);\n      }\n      builder.append(\": \");\n    }\n\n    private void renderAsString(String value) {\n      if (renderInline\n          || !value.contains(\"\\n\")\n          || !FIRST_NON_EMPTY_LINE_STARTS_WITH_NON_WHITESPACE.matcher(value).lookingAt()) {\n        renderAsQuotedString(value);\n      } else {\n        renderAsTextBlock(value);\n      }\n    }\n\n    private void renderAsQuotedString(String value) {\n      if (value.contains(\"'\") && !value.contains(\"\\\"\")) {\n        builder.append('\"').append(DOUBLE_QUOTE_ESCAPER.escape(value)).append('\"');\n      } else {\n        builder.append('\\'').append(SINGLE_QUOTE_ESCAPER.escape(value)).append('\\'');\n      }\n    }\n\n    private void renderAsTextBlock(String value) {\n      builder.append(\"|||\\n\");\n      value\n          .lines()\n          .forEach(line -> builder.append(currIndent).append(indent).append(line).append('\\n'));\n      builder.append(currIndent).append(\"|||\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/jsonnet/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.jsonnet;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/math/MathNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.math;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.MathUtils;\n\n// implementation notes:\n// according to graal folks, it shouldn't be necessary to put\n// java.lang.Math calls behind a @TruffleBoundary, and doing so\n// could prevent Graal from applying its java.lang.Math intrinsics\n// for now we assume the same holds for java.lang.StrictMath\n@SuppressWarnings(\"unused\")\npublic final class MathNodes {\n  private static final double LN_2 = StrictMath.log(2);\n\n  private MathNodes() {}\n\n  public abstract static class minInt extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Long.MIN_VALUE;\n    }\n  }\n\n  public abstract static class maxInt extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Long.MAX_VALUE;\n    }\n  }\n\n  public abstract static class minInt8 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Byte.MIN_VALUE;\n    }\n  }\n\n  public abstract static class maxInt8 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Byte.MAX_VALUE;\n    }\n  }\n\n  public abstract static class minInt16 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Short.MIN_VALUE;\n    }\n  }\n\n  public abstract static class maxInt16 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Short.MAX_VALUE;\n    }\n  }\n\n  public abstract static class minInt32 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Integer.MIN_VALUE;\n    }\n  }\n\n  public abstract static class maxInt32 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Integer.MAX_VALUE;\n    }\n  }\n\n  public abstract static class maxUInt extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return Long.MAX_VALUE;\n    }\n  }\n\n  public abstract static class maxUInt8 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return 255;\n    }\n  }\n\n  public abstract static class maxUInt16 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return 256L * 256 - 1;\n    }\n  }\n\n  public abstract static class maxUInt32 extends ExternalPropertyNode {\n    @Specialization\n    protected long eval(VmTyped self) {\n      return 256L * 256 * 256 * 256 - 1;\n    }\n  }\n\n  public abstract static class minFiniteFloat extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped self) {\n      return -Double.MAX_VALUE;\n    }\n  }\n\n  public abstract static class maxFiniteFloat extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped self) {\n      return Double.MAX_VALUE;\n    }\n  }\n\n  public abstract static class minPositiveFloat extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped self) {\n      return Double.MIN_VALUE;\n    }\n  }\n\n  public abstract static class e extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped self) {\n      return StrictMath.E;\n    }\n  }\n\n  public abstract static class pi extends ExternalPropertyNode {\n    @Specialization\n    protected double eval(VmTyped self) {\n      return StrictMath.PI;\n    }\n  }\n\n  public abstract static class exp extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.exp(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.exp(x);\n    }\n  }\n\n  public abstract static class sqrt extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.sqrt(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.sqrt(x);\n    }\n  }\n\n  public abstract static class cbrt extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.cbrt(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.cbrt(x);\n    }\n  }\n\n  public abstract static class log extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.log(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.log(x);\n    }\n  }\n\n  public abstract static class log2 extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      // based on com.google.common.math.DoubleMath.log2, but uses StrictMath\n      return StrictMath.log(x) / LN_2;\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      // based on com.google.common.math.DoubleMath.log2, but uses StrictMath\n      return StrictMath.log(x) / LN_2;\n    }\n  }\n\n  public abstract static class log10 extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.log10(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.log10(x);\n    }\n  }\n\n  public abstract static class sin extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.sin(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.sin(x);\n    }\n  }\n\n  public abstract static class cos extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.cos(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.cos(x);\n    }\n  }\n\n  public abstract static class tan extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.tan(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.tan(x);\n    }\n  }\n\n  public abstract static class asin extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.asin(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.asin(x);\n    }\n  }\n\n  public abstract static class acos extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.acos(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.acos(x);\n    }\n  }\n\n  public abstract static class atan extends ExternalMethod1Node {\n    @Specialization\n    protected double eval(VmTyped self, long x) {\n      return StrictMath.atan(x);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x) {\n      return StrictMath.atan(x);\n    }\n  }\n\n  public abstract static class atan2 extends ExternalMethod2Node {\n    @Specialization\n    protected double eval(VmTyped self, long x, long y) {\n      return StrictMath.atan2(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, long x, double y) {\n      return StrictMath.atan2(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x, double y) {\n      return StrictMath.atan2(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x, long y) {\n      return StrictMath.atan2(x, y);\n    }\n  }\n\n  public abstract static class gcd extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected long eval(VmTyped self, long x, long y) {\n      VmUtils.checkPositive(x);\n      VmUtils.checkPositive(y);\n\n      return MathUtils.gcd(x, y);\n    }\n  }\n\n  public abstract static class lcm extends ExternalMethod2Node {\n    @TruffleBoundary\n    @Specialization\n    protected long eval(VmTyped self, long x, long y) {\n      VmUtils.checkPositive(x);\n      VmUtils.checkPositive(y);\n\n      if (x == 0 || y == 0) return 0;\n\n      return VmSafeMath.abs(VmSafeMath.multiply(x / MathUtils.gcd(x, y), y));\n    }\n  }\n\n  public abstract static class isPowerOfTwo extends ExternalMethod1Node {\n    @Specialization\n    protected boolean eval(VmTyped self, long x) {\n      return MathUtils.isPowerOfTwo(x);\n    }\n\n    @TruffleBoundary\n    @Specialization\n    protected boolean eval(VmTyped self, double x) {\n      return MathUtils.isPowerOfTwo(x);\n    }\n  }\n\n  public abstract static class min extends ExternalMethod2Node {\n    @Specialization\n    protected long eval(VmTyped self, long x, long y) {\n      return StrictMath.min(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, long x, double y) {\n      return StrictMath.min(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x, long y) {\n      return StrictMath.min(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x, double y) {\n      return StrictMath.min(x, y);\n    }\n  }\n\n  public abstract static class max extends ExternalMethod2Node {\n    @Specialization\n    protected long eval(VmTyped self, long x, long y) {\n      return StrictMath.max(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, long x, double y) {\n      return StrictMath.max(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x, long y) {\n      return StrictMath.max(x, y);\n    }\n\n    @Specialization\n    protected double eval(VmTyped self, double x, double y) {\n      return StrictMath.max(x, y);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/math/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.math;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/pklbinary/RendererNodes.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.pklbinary;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.msgpack.core.MessageBufferPacker;\nimport org.msgpack.core.MessagePack;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmPklBinaryEncoder;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.Nullable;\n\npublic final class RendererNodes {\n\n  private abstract static class RenderMethod extends ExternalMethod1Node {\n    private @Nullable MessageBufferPacker messagePacker;\n\n    protected MessageBufferPacker getMessagePacker() {\n      if (messagePacker == null) {\n        messagePacker = MessagePack.newDefaultBufferPacker();\n      }\n      messagePacker.clear();\n      return messagePacker;\n    }\n  }\n\n  public abstract static class renderDocument extends RenderMethod {\n    @Specialization\n    @TruffleBoundary\n    protected VmBytes eval(VmTyped self, Object value) {\n      var packer = getMessagePacker();\n      createRenderer(self, packer).renderDocument(value);\n      return new VmBytes(packer.toByteArray());\n    }\n  }\n\n  public abstract static class renderValue extends RenderMethod {\n    @Specialization\n    @TruffleBoundary\n    protected VmBytes eval(VmTyped self, Object value) {\n      var packer = getMessagePacker();\n      createRenderer(self, packer).renderValue(value);\n      return new VmBytes(packer.toByteArray());\n    }\n  }\n\n  private static VmPklBinaryEncoder createRenderer(VmTyped self, MessageBufferPacker packer) {\n    return new VmPklBinaryEncoder(packer, PklConverter.fromRenderer(self));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/pklbinary/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.pklbinary;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/platform/PlatformNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.platform;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.Platform;\nimport org.pkl.core.Platform.Language;\nimport org.pkl.core.Platform.OperatingSystem;\nimport org.pkl.core.Platform.Runtime;\nimport org.pkl.core.Platform.VirtualMachine;\nimport org.pkl.core.runtime.PlatformModule;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.stdlib.VmObjectFactory;\n\npublic final class PlatformNodes {\n  private PlatformNodes() {}\n\n  public abstract static class current extends ExternalPropertyNode {\n    private static final VmObjectFactory<Language> languageFactory =\n        new VmObjectFactory<Language>(PlatformModule::getLanguageClass)\n            .addStringProperty(\"version\", Language::version);\n\n    private static final VmObjectFactory<Runtime> runtimeFactory =\n        new VmObjectFactory<Runtime>(PlatformModule::getRuntimeClass)\n            .addStringProperty(\"name\", Runtime::name)\n            .addStringProperty(\"version\", Runtime::version);\n\n    private static final VmObjectFactory<VirtualMachine> virtualMachineFactory =\n        new VmObjectFactory<VirtualMachine>(PlatformModule::getVirtualMachineClass)\n            .addStringProperty(\"name\", VirtualMachine::name)\n            .addStringProperty(\"version\", VirtualMachine::version);\n\n    private static final VmObjectFactory<OperatingSystem> operatingSystemFactory =\n        new VmObjectFactory<OperatingSystem>(PlatformModule::getOperatingSystemClass)\n            .addStringProperty(\"name\", OperatingSystem::name)\n            .addStringProperty(\"version\", OperatingSystem::version);\n\n    private static final VmObjectFactory<Platform.Processor> processorFactory =\n        new VmObjectFactory<Platform.Processor>(PlatformModule::getProcessorClass)\n            .addStringProperty(\"architecture\", Platform.Processor::architecture);\n\n    private static final VmObjectFactory<Platform> platformFactory =\n        new VmObjectFactory<Platform>(PlatformModule::getPlatformClass)\n            .addTypedProperty(\"language\", platform -> languageFactory.create(platform.language()))\n            .addTypedProperty(\"runtime\", platform -> runtimeFactory.create(platform.runtime()))\n            .addTypedProperty(\n                \"virtualMachine\",\n                platform -> virtualMachineFactory.create(platform.virtualMachine()))\n            .addTypedProperty(\n                \"operatingSystem\",\n                platform -> operatingSystemFactory.create(platform.operatingSystem()))\n            .addTypedProperty(\n                \"processor\", platform -> processorFactory.create(platform.processor()));\n\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(@SuppressWarnings(\"unused\") VmTyped self) {\n      return platformFactory.create(Platform.current());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/platform/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.platform;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/protobuf/RendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.protobuf;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Deque;\nimport java.util.Optional;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.ast.member.ClassProperty;\nimport org.pkl.core.ast.member.PropertyTypeNode;\nimport org.pkl.core.ast.type.TypeNode;\nimport org.pkl.core.ast.type.TypeNode.BooleanTypeNode;\nimport org.pkl.core.ast.type.TypeNode.IntSlotTypeNode;\nimport org.pkl.core.ast.type.TypeNode.IntTypeNode;\nimport org.pkl.core.ast.type.TypeNode.ListTypeNode;\nimport org.pkl.core.ast.type.TypeNode.ListingOrMappingTypeNode;\nimport org.pkl.core.ast.type.TypeNode.ListingTypeNode;\nimport org.pkl.core.ast.type.TypeNode.MapTypeNode;\nimport org.pkl.core.ast.type.TypeNode.MappingTypeNode;\nimport org.pkl.core.ast.type.TypeNode.NonFinalClassTypeNode;\nimport org.pkl.core.ast.type.TypeNode.NullableTypeNode;\nimport org.pkl.core.ast.type.TypeNode.ObjectSlotTypeNode;\nimport org.pkl.core.ast.type.TypeNode.SetTypeNode;\nimport org.pkl.core.ast.type.TypeNode.StringLiteralTypeNode;\nimport org.pkl.core.ast.type.TypeNode.StringTypeNode;\nimport org.pkl.core.ast.type.TypeNode.TypeAliasTypeNode;\nimport org.pkl.core.ast.type.TypeNode.UnionOfStringLiteralsTypeNode;\nimport org.pkl.core.ast.type.TypeNode.UnionTypeNode;\nimport org.pkl.core.ast.type.VmTypeMismatchException;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmBytes;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmDataSize;\nimport org.pkl.core.runtime.VmDuration;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmIntSeq;\nimport org.pkl.core.runtime.VmLanguage;\nimport org.pkl.core.runtime.VmList;\nimport org.pkl.core.runtime.VmListing;\nimport org.pkl.core.runtime.VmMap;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmNull;\nimport org.pkl.core.runtime.VmPair;\nimport org.pkl.core.runtime.VmRegex;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.runtime.VmValue;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.ArrayCharEscaper;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.json.JsonEscaper;\n\npublic final class RendererNodes {\n  // Defined here because only relevant to this class.\n  private static final Identifier SECONDS = Identifier.get(\"seconds\");\n  private static final Identifier NANOS = Identifier.get(\"nanos\");\n\n  private static final ArrayCharEscaper fieldNameEscaper =\n      ArrayCharEscaper.builder().withEscape('.', \"_\").withEscape('#', \"_\").build();\n\n  private static final StringTypeNode STRING_TYPE =\n      new StringTypeNode(VmUtils.unavailableSourceSection());\n  private static final IntTypeNode INT_TYPE = new IntTypeNode(VmUtils.unavailableSourceSection());\n\n  private RendererNodes() {}\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderType extends ExternalMethod1Node {\n    @SuppressWarnings(\"unused\")\n    @Specialization\n    protected String eval(VmTyped self, Object value) {\n      return renderType(value);\n    }\n  }\n\n  @TruffleBoundary\n  private static String renderType(Object value) {\n    var clazz =\n        value instanceof VmValue vmValue\n            ? vmValue.getVmClass()\n            : value instanceof TypeNode typeNode ? typeNode.getVmClass() : value.getClass();\n    if (clazz == null) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotResolveTypeForProtobuf\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n    var name =\n        clazz instanceof VmClass vmClass\n            ? vmClass.getSimpleName()\n            : ((Class<?>) clazz).getSimpleName();\n\n    return fieldNameEscaper.escape(name);\n  }\n\n  @TruffleBoundary\n  private static ProtobufRenderer createRenderer(VmTyped self, StringBuilder builder) {\n    var indent = (String) VmUtils.readMember(self, Identifier.INDENT);\n\n    return new ProtobufRenderer(builder, indent, PklConverter.fromRenderer(self));\n  }\n\n  private static final class ProtobufRenderer extends AbstractStringRenderer {\n    private final Deque<Identifier> propertyPath = new ArrayDeque<>();\n    private final Deque<Boolean> wrapperRequirement = new ArrayDeque<>();\n    private final JsonEscaper jsonEscaper = new JsonEscaper(false);\n\n    private @Nullable TypeNode collectionType = null;\n\n    public ProtobufRenderer(StringBuilder builder, String indent, PklConverter converter) {\n      super(\"Protobuf\", builder, indent, converter, true, true);\n    }\n\n    @Override\n    protected void visitDocument(Object value) {\n      visit(value);\n      startNewLine();\n    }\n\n    @Override\n    protected void visitTopLevelValue(Object value) {\n      if (value instanceof VmValue && !(value instanceof VmTyped || value instanceof VmDuration)) {\n        var name = value.getClass().getSimpleName();\n        if (name.startsWith(\"Vm\")) {\n          name = name.substring(2);\n        }\n        throw new VmExceptionBuilder().evalError(\"invalidProtobufTopLevelValue\", name).build();\n      }\n      assert propertyPath.isEmpty() && wrapperRequirement.isEmpty() : \"Corrupted traversal stack.\";\n      wrapperRequirement.push(false);\n      visit(value);\n      var wrap = wrapperRequirement.pop();\n      assert !wrap && propertyPath.isEmpty() && wrapperRequirement.isEmpty()\n          : \"Corrupted traversal stack.\";\n    }\n\n    @Override\n    protected void visitRenderDirective(VmTyped value) {\n      writePropertyName();\n      // append verbatim\n      builder.append(VmUtils.readTextProperty(value));\n    }\n\n    @Override\n    protected void startDynamic(VmDynamic value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderTypeAddConverter\", \"Dynamic\", \"Protobuf\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {}\n\n    @Override\n    protected void startTyped(VmTyped value) {\n      wrapperRequirement.push(false);\n      if (!propertyPath.isEmpty()) {\n        writePropertyName();\n        startMessage();\n      }\n    }\n\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {\n      var popped = wrapperRequirement.pop();\n      assert !popped : \"Corrupted traversal stack.\";\n      if (!propertyPath.isEmpty()) {\n        endMessage();\n      }\n    }\n\n    @Override\n    protected void startListing(VmListing value) {\n      startWrapper();\n    }\n\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {\n      endWrapper();\n    }\n\n    @Override\n    protected void startMapping(VmMapping value) {\n      startMaplike();\n    }\n\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {\n      endMaplike();\n    }\n\n    private void startMaplike() {\n      if (requiresWrapper()) {\n        writePropertyName();\n        propertyPath.push(Identifier.IT);\n        startMessage();\n      }\n      wrapperRequirement.push(true);\n    }\n\n    private void endMaplike() {\n      wrapperRequirement.pop();\n      if (requiresWrapper()) {\n        endMessage();\n        var popped = propertyPath.pop();\n        assert popped == Identifier.IT : \"Corrupted traversal stack.\";\n      }\n    }\n\n    @Override\n    protected void startList(VmList value) {\n      startWrapper();\n    }\n\n    @Override\n    protected void endList(VmList value) {\n      endWrapper();\n    }\n\n    @Override\n    protected void startSet(VmSet value) {\n      startWrapper();\n    }\n\n    @Override\n    protected void endSet(VmSet value) {\n      endWrapper();\n    }\n\n    @Override\n    protected void startMap(VmMap value) {\n      startMaplike();\n    }\n\n    @Override\n    protected void endMap(VmMap value) {\n      endMaplike();\n    }\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {\n      if (requiresWrapper()) {\n        propertyPath.push(Identifier.IT);\n      }\n      var typeName = computeName(collectionType, value);\n      var addedType = false;\n      if (typeName != null) {\n        addedType = true;\n        writePropertyName();\n        startMessage();\n        propertyPath.push(Identifier.get(\"it_\" + typeName));\n      }\n      wrapperRequirement.push(true);\n      visit(value);\n      var popped = wrapperRequirement.pop();\n      assert popped : \"Corrupted traversal stack.\";\n      if (addedType) {\n        propertyPath.pop();\n        endMessage();\n      }\n      if (requiresWrapper()) {\n        propertyPath.pop();\n      }\n    }\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {\n      var isDirective = isRenderDirective(key);\n      var isValidKey =\n          isDirective || key instanceof Long || key instanceof Boolean || key instanceof String;\n      if (!isValidKey) {\n        throw new VmExceptionBuilder()\n            .evalError(\"cannotRenderProtobufMapKey\")\n            .withProgramValue(\"Key\", key)\n            .build();\n      }\n      writePropertyName();\n      startMessage();\n      startNewLine();\n      builder.append(\"key: \");\n      if (isDirective) {\n        builder.append(VmUtils.readTextProperty(key));\n      } else if (key instanceof String string) {\n        builder.append('\"').append(jsonEscaper.escape(string)).append('\"');\n      } else {\n        builder.append(key);\n      }\n    }\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      propertyPath.push(Identifier.VALUE);\n      visit(value);\n      propertyPath.pop();\n      endMessage();\n    }\n\n    private @Nullable String computeName(@Nullable TypeNode it, Object value) {\n      if (it instanceof UnionTypeNode unionTypeNode) {\n        for (var type : unionTypeNode.getElementTypeNodes()) {\n          if (type instanceof UnionTypeNode) {\n            var computedName = computeName(type, value);\n            if (computedName != null) {\n              return computedName;\n            }\n          } else if (type instanceof NonFinalClassTypeNode) {\n            var clazz = type.getVmClass();\n            if (value instanceof VmValue vmValue) {\n              if (clazz == vmValue.getVmClass()) {\n                return clazz.getSimpleName();\n              }\n            }\n          }\n          try {\n            type.execute(VmUtils.createEmptyMaterializedFrame(), value);\n          } catch (VmTypeMismatchException e) {\n            continue;\n          }\n          return renderType(type);\n        }\n      }\n      return null;\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      var hasWrapper = false;\n      var hasCollection = false;\n      var prevCollectionType = collectionType;\n      Identifier expectedName = null;\n      propertyPath.push(name);\n      if (enclosingValue instanceof VmTyped) {\n        var clazz = value instanceof VmValue vmValue ? vmValue.getVmClass() : value.getClass();\n        // Compute the name of the field in the wrapper, based on the type, but only if a wrapper\n        // is required.\n        var optionalType =\n            Optional.of(name)\n                .map(enclosingValue.getVmClass()::getProperty)\n                .map(ClassProperty::getTypeNode)\n                .map(PropertyTypeNode::getTypeNode)\n                .map(this::resolveType);\n        if (optionalType.isPresent()) {\n          var type = optionalType.get();\n          var computedName = computeName(type, value);\n          if (computedName != null) {\n            hasWrapper = true;\n            writePropertyName();\n            expectedName = Identifier.get(\"it_\" + computedName);\n            propertyPath.push(expectedName);\n            startMessage();\n          } else if (type instanceof ListingOrMappingTypeNode listingOrMappingType) {\n            hasCollection = true;\n            collectionType = listingOrMappingType.getValueTypeNode();\n          } else if (type instanceof ListTypeNode listType) {\n            hasCollection = true;\n            collectionType = listType.getElementTypeNode();\n          } else if (type instanceof MapTypeNode mapType) {\n            hasCollection = true;\n            collectionType = mapType.getValueTypeNode();\n          } else if (type instanceof SetTypeNode setType) {\n            hasCollection = true;\n            collectionType = setType.getElementTypeNode();\n          } else if (type instanceof NonFinalClassTypeNode) {\n            if (type.getVmClass() != clazz) {\n              throw new VmExceptionBuilder()\n                  .evalError(\"cannotRenderSubtypeForProtobuf\", type.getVmClass(), clazz)\n                  .build();\n            }\n          }\n        }\n      }\n      visit(value);\n      if (hasWrapper) {\n        endMessage();\n        var popped = propertyPath.pop();\n        assert popped == expectedName : \"Corrupted traversal stack.\";\n      } else if (hasCollection) {\n        collectionType = prevCollectionType;\n      }\n      var popped = propertyPath.pop();\n      assert name == popped : \"Corrupted traversal stack.\";\n    }\n\n    private void startNewLine() {\n      if (indent.isEmpty() || builder.isEmpty() || builder.charAt(builder.length() - 1) == '\\n')\n        return;\n\n      builder.append('\\n');\n      builder.append(currIndent);\n    }\n\n    private void startWrapper() {\n      if (requiresWrapper()) {\n        writePropertyName();\n        startMessage();\n      }\n    }\n\n    private void endWrapper() {\n      if (requiresWrapper()) {\n        endMessage();\n      }\n    }\n\n    private boolean requiresWrapper() {\n      var result = wrapperRequirement.peek();\n      assert result != null : \"Corrupted traversal stack.\";\n      return result;\n    }\n\n    private void startMessage() {\n      builder.append('{');\n      increaseIndent();\n    }\n\n    private void endMessage() {\n      decreaseIndent();\n      if (builder.charAt(builder.length() - 1) != '{') {\n        startNewLine();\n      }\n      builder.append('}');\n    }\n\n    private void writePropertyName() {\n      if (propertyPath.isEmpty()) return;\n      startNewLine();\n      var name = propertyPath.peek();\n      assert name != null : \"Corrupted traversal stack.\";\n      builder.append(name);\n      builder.append(\": \");\n    }\n\n    @Override\n    public void visitString(String value) {\n      writePropertyName();\n      builder.append('\"').append(jsonEscaper.escape(value)).append('\"');\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      writePropertyName();\n      var nanos = (long) value.convertTo(DurationUnit.NANOS).getValue() % 1000000000;\n      var seconds = (long) Math.floor(value.convertTo(DurationUnit.SECONDS).getValue());\n      startMessage();\n\n      propertyPath.push(SECONDS);\n      writePropertyName();\n      builder.append(seconds);\n      propertyPath.pop();\n\n      propertyPath.push(NANOS);\n      writePropertyName();\n      builder.append(nanos);\n      propertyPath.pop();\n\n      endMessage();\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderTypeAddConverter\", \"DataSize\", \"Protobuf\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotRenderTypeAddConverter\", \"Bytes\", \"Protobuf\")\n          .withProgramValue(\"Value\", value)\n          .build();\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    @Override\n    public void visitNull(VmNull value) {\n      writePropertyName();\n      builder.append(value);\n    }\n\n    /**\n     * Resolves types for the purpose of protobuf rendering. \"Sees through\" nullable types and type\n     * aliases, simplifies variations of {@code Int} and {@code String} types (literate string\n     * types, {@code (U)Int_X_} type aliases, etc.), and checks that map key types are legal for\n     * protobuf.\n     */\n    // TODO: Memoize?\n    private @Nullable TypeNode resolveType(@Nullable TypeNode type) {\n      if (type instanceof IntTypeNode\n          || type instanceof StringTypeNode\n          || type instanceof BooleanTypeNode) {\n        return type;\n      } else if (type instanceof IntSlotTypeNode) {\n        return INT_TYPE;\n      } else if (type instanceof UnionOfStringLiteralsTypeNode\n          || type instanceof StringLiteralTypeNode) {\n        return STRING_TYPE;\n      } else if (type instanceof NullableTypeNode nullableType) {\n        return resolveType(nullableType.getElementTypeNode());\n      } else if (type instanceof TypeAliasTypeNode typeAliasType) {\n        return resolveType(typeAliasType.getVmTypeAlias().getTypeNode());\n      } else if (type instanceof ListingTypeNode listingType) {\n        var valueType = resolveType(listingType.getValueTypeNode());\n        assert valueType != null : \"Failed to resolve type node.\";\n\n        type =\n            requiresWrapper()\n                ? null\n                : new ListingTypeNode(\n                    VmUtils.unavailableSourceSection(), VmLanguage.get(null), valueType);\n        return type;\n      } else if (type instanceof MappingTypeNode mappingType) {\n        var keyType = resolveType(mappingType.getKeyTypeNode());\n        if (!(keyType instanceof IntTypeNode\n            || keyType instanceof StringTypeNode\n            || keyType instanceof BooleanTypeNode)) {\n          throw new VmExceptionBuilder()\n              .evalError(\"cannotRenderProtobufMapKeyType\")\n              .withSourceSection(type.getSourceSection())\n              .build();\n        }\n        var valueType = resolveType(mappingType.getValueTypeNode());\n        assert valueType != null : \"Incomplete or malformed Mapping type\";\n        mappingType =\n            new MappingTypeNode(\n                VmUtils.unavailableSourceSection(), VmLanguage.get(null), keyType, valueType);\n\n        type = requiresWrapper() ? null : mappingType;\n        return type;\n      } else if (type instanceof UnionTypeNode) {\n        // Some non-obvious normalization going on here:\n        // - A union type resolves to a union type, unless all element types are string or string\n        // literal types.\n        // - All element types are resolved also.\n        // - All string literal types are combined into a single String case.\n        var hasString = false;\n        var elements = new ArrayList<TypeNode>();\n        for (var t : ((UnionTypeNode) type).getElementTypeNodes()) {\n          var resolved = resolveType(t);\n          if (resolved instanceof StringLiteralTypeNode || resolved instanceof StringTypeNode) {\n            if (!hasString) {\n              hasString = true;\n              elements.add(new StringTypeNode(VmUtils.unavailableSourceSection()));\n            }\n          } else {\n            elements.add(resolved);\n          }\n        }\n        // Sort classes with lowest-in-hierarchy first, to correctly derive names for oneOf.\n        elements.sort(\n            (o1, o2) -> {\n              if (o1 instanceof ObjectSlotTypeNode && o2 instanceof ObjectSlotTypeNode) {\n                var t1 = o1.getVmClass();\n                var t2 = o2.getVmClass();\n                if (t1 == null || t2 == null) return 0;\n                return t1.isSubclassOf(t2) ? -1 : t2.isSubclassOf(t1) ? 1 : 0;\n              }\n              return 0;\n            });\n\n        type =\n            hasString && elements.size() == 1\n                ? elements.get(0)\n                : new UnionTypeNode(\n                    VmUtils.unavailableSourceSection(),\n                    -1,\n                    elements.toArray(new TypeNode[0]),\n                    false);\n        return type;\n      }\n      return type;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/protobuf/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.protobuf;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/reflect/ClassNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.reflect;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.VmClass;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\n\n// TODO: reflect.Class, reflect.Module, etc., should have identity-based equality\n//       (but not clear how to achieve this w/o adding support for user-defined equality)\npublic final class ClassNodes {\n  private ClassNodes() {}\n\n  public abstract static class isSubclassOf extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected boolean eval(VmTyped self, VmTyped other) {\n      return ((VmClass) self.getExtraStorage()).isSubclassOf(((VmClass) other.getExtraStorage()));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/reflect/DeclaredTypeNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.reflect;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.ast.PklNode;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.util.Pair;\n\n@SuppressWarnings(\"unused\")\npublic final class DeclaredTypeNodes {\n  private static final Identifier REFERENT = Identifier.get(\"referent\");\n\n  private DeclaredTypeNodes() {}\n\n  public abstract static class withTypeArgument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmTyped typeArgument) {\n      var referent = (VmTyped) VmUtils.readMember(self, REFERENT);\n      checkTypeArgumentCount(referent, 1, this);\n      return MirrorFactories.declaredTypeFactory.create(Pair.of(referent, VmList.of(typeArgument)));\n    }\n  }\n\n  public abstract static class withTypeArguments extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmList typeArguments) {\n      var referent = (VmTyped) VmUtils.readMember(self, REFERENT);\n      checkTypeArgumentCount(referent, typeArguments.getLength(), this);\n      return MirrorFactories.declaredTypeFactory.create(Pair.of(referent, typeArguments));\n    }\n  }\n\n  private static void checkTypeArgumentCount(VmTyped referent, int actualCount, PklNode node) {\n    var extraStorage = referent.getExtraStorage();\n    var typeParameterCount =\n        extraStorage instanceof VmClass vmClass\n            ? vmClass.getTypeParameterCount()\n            : ((VmTypeAlias) extraStorage).getTypeParameterCount();\n    if (typeParameterCount != actualCount) {\n      throw new VmExceptionBuilder()\n          .evalError(\"wrongTypeArgumentCount\", typeParameterCount, actualCount)\n          .withLocation(node)\n          .build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/reflect/ReflectNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.reflect;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.ExternalMethod2Node;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.util.Pair;\n\n@SuppressWarnings(\"unused\")\npublic final class ReflectNodes {\n  private ReflectNodes() {}\n\n  public abstract static class Module extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmTyped module) {\n      if (!module.isModuleObject()) {\n        throw exceptionBuilder().evalError(\"expectedModule\").withLocation(getArg1Node()).build();\n      }\n      return module.getModuleMirror();\n    }\n  }\n\n  public abstract static class moduleOf extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmTyped module) {\n      var candidate = module;\n      while (!candidate.isModuleObject()) {\n        candidate = candidate.getParent();\n        if (candidate == null) {\n          throw exceptionBuilder()\n              .bug(\"No module found in prototype chain.\")\n              .withLocation(getArg1Node())\n              .build();\n        }\n      }\n\n      return candidate.getModuleMirror();\n    }\n  }\n\n  public abstract static class Class extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmClass clazz) {\n      return clazz.getMirror();\n    }\n  }\n\n  public abstract static class TypeAlias extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmTypeAlias typeAlias) {\n      return typeAlias.getMirror();\n    }\n  }\n\n  public abstract static class DeclaredType extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmTyped referent) {\n      var extraStorage = referent.getExtraStorage();\n      assert extraStorage instanceof VmClass || extraStorage instanceof VmTypeAlias;\n\n      var typeParameterCount =\n          extraStorage instanceof VmClass vmClass\n              ? vmClass.getTypeParameterCount()\n              : ((VmTypeAlias) extraStorage).getTypeParameterCount();\n\n      var builder = VmList.EMPTY.builder();\n      for (var i = 0; i < typeParameterCount; i++) {\n        builder.add(MirrorFactories.unknownTypeFactory.create(null));\n      }\n\n      return MirrorFactories.declaredTypeFactory.create(Pair.of(referent, builder.build()));\n    }\n  }\n\n  public abstract static class FunctionType extends ExternalMethod2Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmList parameterTypes, VmTyped returnType) {\n      return MirrorFactories.functionTypeFactory2.create(Pair.of(parameterTypes, returnType));\n    }\n  }\n\n  public abstract static class StringLiteralType extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, String value) {\n      return MirrorFactories.stringLiteralTypeFactory2.create(value);\n    }\n  }\n\n  public abstract static class UnionType extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmList members) {\n      return MirrorFactories.unionTypeFactory2.create(members);\n    }\n  }\n\n  public abstract static class TypeVariable extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self, VmTyped referent) {\n      return MirrorFactories.typeVariableFactory2.create(referent);\n    }\n  }\n\n  public abstract static class moduleType extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self) {\n      return MirrorFactories.moduleTypeFactory.create(null);\n    }\n  }\n\n  public abstract static class unknownType extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self) {\n      return MirrorFactories.unknownTypeFactory.create(null);\n    }\n  }\n\n  public abstract static class nothingType extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self) {\n      return MirrorFactories.nothingTypeFactory.create(null);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/reflect/TypeNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.reflect;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\n\n@SuppressWarnings(\"unused\")\npublic final class TypeNodes {\n  private TypeNodes() {}\n\n  public abstract static class nullable extends ExternalPropertyNode {\n    @Specialization\n    @TruffleBoundary\n    protected VmTyped eval(VmTyped self) {\n      if (self.getVmClass() == ReflectModule.getNullableTypeClass()) return self;\n      return MirrorFactories.nullableTypeFactory2.create(self);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/reflect/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.reflect;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/registry/EmptyMemberRegistry.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.registry;\n\nfinal class EmptyMemberRegistry extends ExternalMemberRegistry {\n  static final ExternalMemberRegistry INSTANCE = new EmptyMemberRegistry();\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/registry/ExternalMemberRegistry.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.registry;\n\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.util.HashMap;\nimport java.util.Map;\nimport org.pkl.core.ast.ExpressionNode;\nimport org.pkl.core.ast.expression.primary.GetReceiverNode;\nimport org.pkl.core.ast.frame.ReadFrameSlotNodeGen;\nimport org.pkl.core.runtime.VmException;\nimport org.pkl.core.runtime.VmExceptionBuilder;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.stdlib.*;\nimport org.pkl.core.stdlib.ExternalPropertyNode.Factory;\n\npublic abstract class ExternalMemberRegistry {\n  private final Map<String, Factory> propertyFactories = new HashMap<>();\n  private final Map<String, ExternalMethod0Node.Factory> function0Factories = new HashMap<>();\n  private final Map<String, ExternalMethod1Node.Factory> function1Factories = new HashMap<>();\n  private final Map<String, ExternalMethod2Node.Factory> function2Factories = new HashMap<>();\n  private final Map<String, ExternalMethod3Node.Factory> function3Factories = new HashMap<>();\n  private final Map<String, ExternalMethod4Node.Factory> function4Factories = new HashMap<>();\n  private final Map<String, ExternalMethod5Node.Factory> function5Factories = new HashMap<>();\n\n  public final ExpressionNode getPropertyBody(String qualifiedName, SourceSection headerSection) {\n    var factory = propertyFactories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    return factory.create(new GetReceiverNode());\n  }\n\n  public final ExpressionNode getFunctionBody(\n      String qualifiedName, SourceSection headerSection, int paramCount) {\n\n    return switch (paramCount) {\n      case 0 -> getFunction0Body(qualifiedName, headerSection);\n      case 1 -> getFunction1Body(qualifiedName, headerSection);\n      case 2 -> getFunction2Body(qualifiedName, headerSection);\n      case 3 -> getFunction3Body(qualifiedName, headerSection);\n      case 4 -> getFunction4Body(qualifiedName, headerSection);\n      case 5 -> getFunction5Body(qualifiedName, headerSection);\n      default ->\n          throw new IllegalStateException(\n              \"External methods with more than 5 parameters are not currently supported.\");\n    };\n  }\n\n  protected void register(String memberName, ExternalPropertyNode.Factory factory) {\n    if (propertyFactories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  protected void register(String memberName, ExternalMethod0Node.Factory factory) {\n    if (function0Factories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  protected void register(String memberName, ExternalMethod1Node.Factory factory) {\n    if (function1Factories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  protected void register(String memberName, ExternalMethod2Node.Factory factory) {\n    if (function2Factories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  protected void register(String memberName, ExternalMethod3Node.Factory factory) {\n    if (function3Factories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  protected void register(String memberName, ExternalMethod4Node.Factory factory) {\n    if (function4Factories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  protected void register(String memberName, ExternalMethod5Node.Factory factory) {\n    if (function5Factories.put(memberName, factory) != null) {\n      throw duplicateRegistration(memberName);\n    }\n  }\n\n  private ExpressionNode getFunction0Body(String qualifiedName, SourceSection headerSection) {\n\n    var factory = function0Factories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    return factory.create(new GetReceiverNode());\n  }\n\n  private ExpressionNode getFunction1Body(String qualifiedName, SourceSection headerSection) {\n\n    var factory = function1Factories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    var sourceSection = VmUtils.unavailableSourceSection();\n    var param1Node = ReadFrameSlotNodeGen.create(sourceSection, 0);\n    return factory.create(new GetReceiverNode(), param1Node);\n  }\n\n  private ExpressionNode getFunction2Body(String qualifiedName, SourceSection headerSection) {\n\n    var factory = function2Factories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    var sourceSection = VmUtils.unavailableSourceSection();\n    var param1Node = ReadFrameSlotNodeGen.create(sourceSection, 0);\n    var param2Node = ReadFrameSlotNodeGen.create(sourceSection, 1);\n    return factory.create(new GetReceiverNode(), param1Node, param2Node);\n  }\n\n  private ExpressionNode getFunction3Body(String qualifiedName, SourceSection headerSection) {\n\n    var factory = function3Factories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    var sourceSection = VmUtils.unavailableSourceSection();\n    var param1Node = ReadFrameSlotNodeGen.create(sourceSection, 0);\n    var param2Node = ReadFrameSlotNodeGen.create(sourceSection, 1);\n    var param3Node = ReadFrameSlotNodeGen.create(sourceSection, 2);\n    return factory.create(new GetReceiverNode(), param1Node, param2Node, param3Node);\n  }\n\n  private ExpressionNode getFunction4Body(String qualifiedName, SourceSection headerSection) {\n\n    var factory = function4Factories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    var sourceSection = VmUtils.unavailableSourceSection();\n    var param1Node = ReadFrameSlotNodeGen.create(sourceSection, 0);\n    var param2Node = ReadFrameSlotNodeGen.create(sourceSection, 1);\n    var param3Node = ReadFrameSlotNodeGen.create(sourceSection, 2);\n    var param4Node = ReadFrameSlotNodeGen.create(sourceSection, 3);\n    return factory.create(new GetReceiverNode(), param1Node, param2Node, param3Node, param4Node);\n  }\n\n  private ExpressionNode getFunction5Body(String qualifiedName, SourceSection headerSection) {\n\n    var factory = function5Factories.get(qualifiedName);\n    if (factory == null) throw cannotFindMemberImpl(qualifiedName, headerSection);\n\n    var sourceSection = VmUtils.unavailableSourceSection();\n    var param1Node = ReadFrameSlotNodeGen.create(sourceSection, 0);\n    var param2Node = ReadFrameSlotNodeGen.create(sourceSection, 1);\n    var param3Node = ReadFrameSlotNodeGen.create(sourceSection, 2);\n    var param4Node = ReadFrameSlotNodeGen.create(sourceSection, 3);\n    var param5Node = ReadFrameSlotNodeGen.create(sourceSection, 4);\n    return factory.create(\n        new GetReceiverNode(), param1Node, param2Node, param3Node, param4Node, param5Node);\n  }\n\n  private VmException duplicateRegistration(String memberName) {\n    return new VmExceptionBuilder()\n        .bug(\"Duplicate registration of external member `%s`.\", memberName)\n        .build();\n  }\n\n  private VmException cannotFindMemberImpl(String qualifiedName, SourceSection headerSection) {\n    return new VmExceptionBuilder()\n        .bug(\"Cannot find implementation of external member `%s`.\", qualifiedName)\n        .withSourceSection(headerSection)\n        .withMemberName(qualifiedName)\n        .build();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/registry/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.registry;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/release/ReleaseNodes.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.release;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.Release;\nimport org.pkl.core.Release.Documentation;\nimport org.pkl.core.Release.SourceCode;\nimport org.pkl.core.Release.StandardLibrary;\nimport org.pkl.core.runtime.ReleaseModule;\nimport org.pkl.core.runtime.VmSet;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.stdlib.ExternalPropertyNode;\nimport org.pkl.core.stdlib.VmObjectFactories;\nimport org.pkl.core.stdlib.VmObjectFactory;\n\npublic final class ReleaseNodes {\n  private ReleaseNodes() {}\n\n  public abstract static class current extends ExternalPropertyNode {\n    private static final VmObjectFactory<SourceCode> sourceCodeFactory =\n        new VmObjectFactory<SourceCode>(ReleaseModule::getSourceCodeClass)\n            .addStringProperty(\"homepage\", SourceCode::homepage);\n\n    private static final VmObjectFactory<Documentation> documentationFactory =\n        new VmObjectFactory<Documentation>(ReleaseModule::getDocumentationClass)\n            .addStringProperty(\"homepage\", Documentation::homepage);\n\n    private static final VmObjectFactory<StandardLibrary> standardLibraryFactory =\n        new VmObjectFactory<StandardLibrary>(ReleaseModule::getStandardLibraryClass)\n            .addSetProperty(\"modules\", stdlib -> VmSet.create(stdlib.modules()));\n\n    private static final VmObjectFactory<Release> releaseFactory =\n        new VmObjectFactory<Release>(ReleaseModule::getReleaseClass)\n            .addTypedProperty(\n                \"version\", release -> VmObjectFactories.versionFactory.create(release.version()))\n            .addStringProperty(\"versionInfo\", Release::versionInfo)\n            .addStringProperty(\"commitId\", Release::commitId)\n            .addTypedProperty(\n                \"sourceCode\", release -> sourceCodeFactory.create(release.sourceCode()))\n            .addTypedProperty(\n                \"documentation\", release -> documentationFactory.create(release.documentation()))\n            .addTypedProperty(\n                \"standardLibrary\",\n                release -> standardLibraryFactory.create(release.standardLibrary()));\n\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(@SuppressWarnings(\"unused\") VmTyped self) {\n      return releaseFactory.create(Release.current());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/release/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.release;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/test/TestNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.test;\n\nimport com.oracle.truffle.api.CompilerDirectives;\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport java.util.stream.Collectors;\nimport org.pkl.core.ast.lambda.ApplyVmFunction0Node;\nimport org.pkl.core.ast.lambda.ApplyVmFunction0NodeGen;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.runtime.VmExceptionRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklName;\n\npublic final class TestNodes {\n  private static final VmExceptionRenderer testNodeRenderer =\n      new VmExceptionRenderer(null, false, false);\n\n  private TestNodes() {}\n\n  @PklName(\"catch\")\n  public abstract static class catchMethod extends ExternalMethod1Node {\n    @Child private ApplyVmFunction0Node applyLambdaNode = ApplyVmFunction0NodeGen.create();\n\n    @Specialization\n    protected String eval(@SuppressWarnings(\"unused\") VmTyped self, VmFunction function) {\n      try {\n        applyLambdaNode.execute(function);\n      } catch (VmException e) {\n        return render(e);\n      }\n      CompilerDirectives.transferToInterpreter();\n      throw exceptionBuilder().evalError(\"expectedAnException\").build();\n    }\n  }\n\n  public abstract static class catchOrNull extends ExternalMethod1Node {\n    @Child private ApplyVmFunction0Node applyLambdaNode = ApplyVmFunction0NodeGen.create();\n\n    @Specialization\n    protected Object eval(@SuppressWarnings(\"unused\") VmTyped self, VmFunction function) {\n      try {\n        applyLambdaNode.execute(function);\n      } catch (VmException e) {\n        return render(e);\n      }\n      return VmNull.withoutDefault();\n    }\n  }\n\n  @TruffleBoundary\n  private static String render(VmException e) {\n    return testNodeRenderer\n        .render(e)\n        .lines()\n        .skip(1) // remove meaningless header line\n        .collect(Collectors.joining(\" \")) // turn into single line\n        .strip();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/test/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.test;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/test/report/JUnitReport.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.test.report;\n\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Consumer;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.TestResults;\nimport org.pkl.core.TestResults.Error;\nimport org.pkl.core.TestResults.TestResult;\nimport org.pkl.core.TestResults.TestSectionResults;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.BaseModule;\nimport org.pkl.core.runtime.Identifier;\nimport org.pkl.core.runtime.VmDynamic;\nimport org.pkl.core.runtime.VmMapping;\nimport org.pkl.core.runtime.VmTyped;\nimport org.pkl.core.runtime.VmUtils;\nimport org.pkl.core.runtime.XmlModule;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.stdlib.xml.RendererNodes.Renderer;\nimport org.pkl.core.util.EconomicMaps;\n\npublic final class JUnitReport implements TestReport {\n\n  private final String aggregateSuiteName;\n\n  public JUnitReport(String aggregateSuiteName) {\n    this.aggregateSuiteName = aggregateSuiteName;\n  }\n\n  public JUnitReport() {\n    this(\"\");\n  }\n\n  @Override\n  public void report(TestResults results, Writer writer) throws IOException {\n    writer.append(renderXML(\"    \", \"1.0\", buildSuite(results)));\n  }\n\n  @Override\n  public void summarize(List<TestResults> allTestResults, Writer writer) throws IOException {\n    var totalTests = allTestResults.stream().mapToLong(TestResults::totalTests).sum();\n    var totalFailures = allTestResults.stream().mapToLong(TestResults::totalFailures).sum();\n\n    assert aggregateSuiteName != null;\n\n    var attrs =\n        buildAttributes(\n            \"name\", aggregateSuiteName,\n            \"tests\", totalTests,\n            \"failures\", totalFailures);\n\n    var suite =\n        buildXmlElement(\n            \"testsuites\",\n            attrs,\n            allTestResults.stream().map(this::buildSuite).toArray(VmDynamic[]::new));\n\n    writer.append(renderXML(\"    \", \"1.0\", suite));\n  }\n\n  private VmDynamic buildSuite(TestResults results) {\n    if (results.error() != null) {\n      var testCase = rootTestCase(results, results.error());\n      var attrs =\n          buildAttributes(\n              \"name\", results.moduleName(),\n              \"tests\", 1,\n              \"failures\", 1);\n      return buildXmlElement(\"testsuite\", attrs, testCase);\n    }\n\n    var testCases = testCases(results.moduleName(), results.facts());\n    testCases.addAll(testCases(results.moduleName(), results.examples()));\n\n    if (!results.logs().isBlank()) {\n      var err =\n          buildXmlElement(\n              \"system-err\",\n              VmMapping.empty(),\n              members -> members.put(\"body\", syntheticElement(makeCdata(results.logs()))));\n      testCases.add(err);\n    }\n\n    var attrs =\n        buildAttributes(\n            \"name\", results.moduleName(),\n            \"tests\", (long) results.totalTests(),\n            \"failures\", (long) results.totalFailures());\n\n    return buildXmlElement(\"testsuite\", attrs, testCases.toArray(new VmDynamic[0]));\n  }\n\n  private VmDynamic rootTestCase(TestResults results, TestResults.Error error) {\n    var testCaseAttrs =\n        buildAttributes(\"classname\", results.moduleName(), \"name\", results.moduleName());\n    var err = error(error);\n    return buildXmlElement(\"testcase\", testCaseAttrs, err.toArray(new VmDynamic[0]));\n  }\n\n  private ArrayList<VmDynamic> testCases(String moduleName, TestSectionResults testSectionResults) {\n    var elements = new ArrayList<VmDynamic>(testSectionResults.totalTests());\n\n    for (var res : testSectionResults.results()) {\n      var attrs =\n          buildAttributes(\n              \"classname\", moduleName + \".\" + testSectionResults.name(), \"name\", res.name());\n      var failures = failures(res);\n      failures.addAll(errors(res));\n      var element = buildXmlElement(\"testcase\", attrs, failures.toArray(new VmDynamic[0]));\n      elements.add(element);\n    }\n    return elements;\n  }\n\n  private ArrayList<VmDynamic> failures(TestResult res) {\n    var list = new ArrayList<VmDynamic>();\n    long i = 0;\n    for (var fail : res.failures()) {\n      var attrs = buildAttributes(\"message\", fail.kind());\n      long element = i++;\n      list.add(\n          buildXmlElement(\n              \"failure\",\n              attrs,\n              members -> members.put(element, syntheticElement(stripColors(fail.message())))));\n    }\n    return list;\n  }\n\n  private ArrayList<VmDynamic> errors(TestResult res) {\n    var list = new ArrayList<VmDynamic>();\n    long i = 0;\n    for (var error : res.errors()) {\n      var attrs = buildAttributes(\"message\", error.message());\n      long element = i++;\n      list.add(\n          buildXmlElement(\n              \"error\",\n              attrs,\n              members ->\n                  members.put(\n                      element, syntheticElement(stripColors(error.exception().getMessage())))));\n    }\n    return list;\n  }\n\n  private ArrayList<VmDynamic> error(Error error) {\n    var list = new ArrayList<VmDynamic>();\n    var attrs = buildAttributes(\"message\", error.message());\n    list.add(\n        buildXmlElement(\n            \"error\",\n            attrs,\n            members ->\n                members.put(\n                    1, syntheticElement(stripColors(\"\\n\" + error.exception().getMessage())))));\n    return list;\n  }\n\n  private VmDynamic buildXmlElement(String name, VmMapping attributes, VmDynamic... elements) {\n    return buildXmlElement(\n        name,\n        attributes,\n        members -> {\n          long i = 0;\n          for (var element : elements) {\n            members.put(i++, syntheticElement(element));\n          }\n        });\n  }\n\n  private VmDynamic buildXmlElement(\n      String name, VmMapping attributes, Consumer<EconomicMap<Object, ObjectMember>> gen) {\n    EconomicMap<Object, ObjectMember> members =\n        EconomicMaps.of(\n            Identifier.IS_XML_ELEMENT,\n                VmUtils.createSyntheticObjectProperty(Identifier.IS_XML_ELEMENT, \"\", true),\n            Identifier.NAME, VmUtils.createSyntheticObjectProperty(Identifier.NAME, \"\", name),\n            Identifier.ATTRIBUTES,\n                VmUtils.createSyntheticObjectProperty(Identifier.ATTRIBUTES, \"\", attributes),\n            Identifier.IS_BLOCK_FORMAT,\n                VmUtils.createSyntheticObjectProperty(Identifier.IS_BLOCK_FORMAT, \"\", true));\n    gen.accept(members);\n    return new VmDynamic(\n        VmUtils.createEmptyMaterializedFrame(),\n        BaseModule.getDynamicClass().getPrototype(),\n        members,\n        members.size() - 4);\n  }\n\n  private VmMapping buildAttributes(Object... attributes) {\n    EconomicMap<Object, ObjectMember> attrs = EconomicMaps.create(attributes.length);\n    for (int i = 0; i < attributes.length; i += 2) {\n      attrs.put(\n          attributes[i],\n          VmUtils.createSyntheticObjectEntry(attributes[i].toString(), attributes[i + 1]));\n    }\n    return new VmMapping(\n        VmUtils.createEmptyMaterializedFrame(), BaseModule.getMappingClass().getPrototype(), attrs);\n  }\n\n  private ObjectMember syntheticElement(Object constantValue) {\n    return VmUtils.createSyntheticObjectElement(\"\", constantValue);\n  }\n\n  private VmTyped makeCdata(String text) {\n    var clazz = XmlModule.getCDataClass();\n    // HACK: The property identifier here has to be `null` instead of `Identifier.TEXT` or\n    // a `Invalid sharing of AST nodes detected` error will be thrown.\n    EconomicMap<Object, ObjectMember> attrs =\n        EconomicMaps.of(Identifier.TEXT, VmUtils.createSyntheticObjectProperty(null, \"\", text));\n    return new VmTyped(VmUtils.createEmptyMaterializedFrame(), clazz.getPrototype(), clazz, attrs);\n  }\n\n  private String stripColors(String str) {\n    return str.replaceAll(\"\\033\\\\[[;\\\\d]*m\", \"\");\n  }\n\n  private static String renderXML(String indent, String version, VmDynamic value) {\n    var builder = new StringBuilder();\n    var renderer = new Renderer(builder, indent, version, \"\", VmMapping.empty(), PklConverter.NOOP);\n    renderer.renderDocument(value);\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/test/report/SimpleReport.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.test.report;\n\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.math.BigDecimal;\nimport java.math.RoundingMode;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.stream.Collectors;\nimport org.pkl.core.TestResults;\nimport org.pkl.core.TestResults.TestResult;\nimport org.pkl.core.TestResults.TestSectionResults;\nimport org.pkl.core.util.AnsiStringBuilder;\nimport org.pkl.core.util.AnsiStringBuilder.AnsiCode;\nimport org.pkl.core.util.AnsiTheme;\nimport org.pkl.core.util.StringUtils;\n\npublic final class SimpleReport implements TestReport {\n\n  private static final String passingMark = \"✔ \";\n  private static final String failingMark = \"✘ \";\n\n  private final boolean useColor;\n\n  public SimpleReport(boolean useColor) {\n    this.useColor = useColor;\n  }\n\n  @Override\n  public void report(TestResults results, Writer writer) throws IOException {\n    var builder = new AnsiStringBuilder(useColor);\n\n    builder.append(\"module \").append(results.moduleName()).append('\\n');\n\n    if (results.error() != null) {\n      var rendered = results.error().exception().getMessage();\n      appendPadded(builder, rendered, \"  \");\n      builder.append('\\n');\n    } else {\n      reportResults(results.facts(), builder);\n      reportResults(results.examples(), builder);\n    }\n\n    writer.append(builder.toString());\n  }\n\n  @Override\n  public void summarize(List<TestResults> allTestResults, Writer writer) throws IOException {\n    var totalTests = 0;\n    var totalFailedTests = 0;\n    var totalAsserts = 0;\n    var totalFailedAsserts = 0;\n    var isFailed = false;\n    var isExampleWrittenFailure = true;\n    for (var testResults : allTestResults) {\n      if (!isFailed) {\n        isFailed = testResults.failed();\n      }\n      if (testResults.failed()) {\n        isExampleWrittenFailure = testResults.isExampleWrittenFailure() & isExampleWrittenFailure;\n      }\n      totalTests += testResults.totalTests();\n      totalFailedTests += testResults.totalFailures();\n      totalAsserts += testResults.totalAsserts();\n      totalFailedAsserts += testResults.totalAssertsFailed();\n    }\n    var builder = new AnsiStringBuilder(useColor);\n    if (isFailed && isExampleWrittenFailure) {\n      builder.append(totalFailedTests).append(\" examples written\");\n    } else {\n      makeStatsLine(builder, \"tests\", totalTests, totalFailedTests, isFailed);\n      builder.append(\", \");\n      makeStatsLine(builder, \"asserts\", totalAsserts, totalFailedAsserts, isFailed);\n    }\n    builder.append('\\n');\n    writer.append(builder.toString());\n  }\n\n  private void reportResults(TestSectionResults section, AnsiStringBuilder builder) {\n    if (!section.results().isEmpty()) {\n      builder.append(\"  \").append(section.name()).append('\\n');\n      StringUtils.joinToStringBuilder(\n          builder, section.results(), \"\\n\", res -> reportResult(res, builder));\n      builder.append('\\n');\n    }\n  }\n\n  private void reportResult(TestResult result, AnsiStringBuilder builder) {\n    builder.append(\"    \");\n\n    if (result.isExampleWritten()) {\n      builder.append(\"✍️ \").append(result.name());\n    } else {\n      if (result.isFailure()) {\n        builder.append(AnsiTheme.FAILING_TEST_MARK, failingMark);\n      } else {\n        builder.append(AnsiTheme.PASSING_TEST_MARK, passingMark);\n      }\n      builder.append(AnsiTheme.TEST_NAME, result.name());\n      if (result.isFailure()) {\n        var failurePadding = \"       \";\n        builder.append(\"\\n\");\n        StringUtils.joinToStringBuilder(\n            builder,\n            result.failures(),\n            \"\\n\",\n            failure -> appendPadded(builder, failure.message(), failurePadding));\n        StringUtils.joinToStringBuilder(\n            builder,\n            result.errors(),\n            \"\\n\",\n            error -> appendPadded(builder, error.exception().getMessage(), failurePadding));\n      }\n    }\n  }\n\n  private static void appendPadded(AnsiStringBuilder builder, String lines, String padding) {\n    StringUtils.joinToStringBuilder(\n        builder,\n        lines.lines().collect(Collectors.toList()),\n        \"\\n\",\n        str -> {\n          if (!str.isEmpty()) builder.append(padding).append(str);\n        });\n  }\n\n  private void makeStatsLine(\n      AnsiStringBuilder sb, String kind, int total, int failed, boolean isFailed) {\n    var passed = total - failed;\n    var passRate = \"0.0\";\n    if (total > 0) {\n      var passedDecimal = new BigDecimal(passed);\n      var hundred = new BigDecimal(100);\n      var totalPrecise = new BigDecimal(total);\n      passRate =\n          hundred.multiply(passedDecimal).divide(totalPrecise, 1, RoundingMode.DOWN).toString();\n    }\n    var passRateLine = String.format(Locale.ROOT, \"%s%% %s pass\", passRate, kind);\n\n    var color = isFailed ? AnsiCode.RED : AnsiCode.GREEN;\n    sb.append(color, () -> sb.append(passRateLine));\n\n    if (isFailed) {\n      sb.append(\" [\").append(failed).append('/').append(total).append(\" failed]\");\n    } else {\n      sb.append(\" [\").append(passed).append(\" passed]\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/test/report/TestReport.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.test.report;\n\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Path;\nimport java.util.List;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.TestResults;\nimport org.pkl.core.util.StringBuilderWriter;\n\npublic interface TestReport {\n\n  void report(TestResults results, Writer writer) throws IOException;\n\n  void summarize(List<TestResults> allTestResults, Writer writer) throws IOException;\n\n  default String report(TestResults results) throws IOException {\n    try {\n      var builder = new StringBuilder();\n      var writer = new StringBuilderWriter(builder);\n      report(results, writer);\n      return builder.toString();\n    } catch (IOException e) {\n      throw new PklBugException(\"Unexpected IO exception.\", e);\n    }\n  }\n\n  default void reportToPath(TestResults results, Path path) throws IOException {\n    try (var writer = new FileWriter(path.toFile(), StandardCharsets.UTF_8)) {\n      report(results, writer);\n    }\n  }\n\n  default void summarizeToPath(List<TestResults> allTestResults, Path path) throws IOException {\n    try (var writer = new FileWriter(path.toFile(), StandardCharsets.UTF_8)) {\n      summarize(allTestResults, writer);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/xml/RendererNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.xml;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.AbstractStringRenderer;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.ArrayCharEscaper;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.core.util.xml.XmlValidator;\n\npublic final class RendererNodes {\n  private RendererNodes() {}\n\n  private static Renderer createRenderer(VmTyped self, StringBuilder builder) {\n    var indent = (String) VmUtils.readMember(self, Identifier.INDENT);\n    var xmlVersion = (String) VmUtils.readMember(self, Identifier.XML_VERSION);\n    var rootElementName = (String) VmUtils.readMember(self, Identifier.ROOT_ELEMENT_NAME);\n    var rootElementAttributes =\n        (VmMapping) VmUtils.readMember(self, Identifier.ROOT_ELEMENT_ATTRIBUTES);\n    return new Renderer(\n        builder,\n        indent,\n        xmlVersion,\n        rootElementName,\n        rootElementAttributes,\n        PklConverter.fromRenderer(self));\n  }\n\n  public abstract static class renderDocument extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderDocument(value);\n      return builder.toString();\n    }\n  }\n\n  public abstract static class renderValue extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected String eval(VmTyped self, Object value) {\n      var builder = new StringBuilder();\n      createRenderer(self, builder).renderValue(value);\n      return builder.toString();\n    }\n  }\n\n  public static final class Renderer extends AbstractStringRenderer {\n    // it's safe (though not required) to escape all the following characters in text nodes and\n    // attribute values\n    private static final ArrayCharEscaper stringEscaper =\n        ArrayCharEscaper.builder()\n            .withEscape('\"', \"&quot;\")\n            .withEscape('\\'', \"&apos;\")\n            .withEscape('<', \"&lt;\")\n            .withEscape('>', \"&gt;\")\n            .withEscape('&', \"&amp;\")\n            .build();\n\n    private final String version;\n    private final String rootElementName;\n    private final VmMapping rootElementAttributes;\n    private final XmlValidator validator;\n\n    private int lineNumber = 0;\n    private @Nullable Object deferredKey;\n\n    public Renderer(\n        StringBuilder builder,\n        String indent,\n        String version,\n        String rootElementName,\n        VmMapping rootElementAttributes,\n        PklConverter converter) {\n      super(\"XML\", builder, indent, converter, true, true);\n      this.version = version;\n      this.rootElementName = rootElementName;\n      this.rootElementAttributes = rootElementAttributes;\n      validator = XmlValidator.create(version);\n    }\n\n    @Override\n    public void visitDocument(Object value) {\n      builder\n          .append(\"<?xml version=\\\"\")\n          .append(stringEscaper.escape(version))\n          .append(\"\\\" encoding=\\\"UTF-8\\\"?>\");\n\n      if (isXmlElement(value)) {\n        renderXmlElement((VmDynamic) value);\n      } else {\n        writeXmlElement(rootElementName, rootElementAttributes, value, true, true);\n      }\n\n      builder.append(LINE_BREAK);\n    }\n\n    @Override\n    public void visitTopLevelValue(Object value) {\n      if (isXmlElement(value)) {\n        renderXmlElement((VmDynamic) value);\n      } else {\n        visit(value);\n      }\n    }\n\n    @Override\n    protected void visitRenderDirective(VmTyped value) {\n      builder.append(VmUtils.readTextProperty(value));\n    }\n\n    @Override\n    public void visitString(String value) {\n      builder.append(stringEscaper.escape(value));\n    }\n\n    @Override\n    public void visitInt(Long value) {\n      builder.append(value);\n    }\n\n    @Override\n    public void visitFloat(Double value) {\n      builder.append(value);\n    }\n\n    @Override\n    public void visitBoolean(Boolean value) {\n      builder.append(value);\n    }\n\n    @Override\n    public void visitDuration(VmDuration value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitDataSize(VmDataSize value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitBytes(VmBytes value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitPair(VmPair value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitRegex(VmRegex value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    public void visitIntSeq(VmIntSeq value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void startDynamic(VmDynamic value) {\n      if (isXmlElement(value)) {\n        throw new VmExceptionBuilder()\n            .evalError(\"elementNotSupportedHere\")\n            .withProgramValue(\"Value\", value)\n            .build();\n      }\n    }\n\n    @Override\n    public void startTyped(VmTyped value) {\n      if (isXmlInline(value)) {\n        throw new VmExceptionBuilder()\n            .evalError(\"inlineNotSupportedHere\")\n            .withProgramValue(\"Value\", value)\n            .build();\n      }\n    }\n\n    // No-op for XML\n    @Override\n    protected void startListing(VmListing value) {}\n\n    // No-op for XML\n    @Override\n    protected void startMapping(VmMapping value) {}\n\n    // No-op for XML\n    @Override\n    protected void startList(VmList value) {}\n\n    // No-op for XML\n    @Override\n    protected void startSet(VmSet value) {}\n\n    // No-op for XML\n    @Override\n    protected void startMap(VmMap value) {}\n\n    @Override\n    public void visitNull(VmNull value) {\n      cannotRenderTypeAddConverter(value);\n    }\n\n    @Override\n    protected void visitProperty(Identifier name, Object value, boolean isFirst) {\n      if (isXmlElement(value)) {\n        renderXmlElement((VmDynamic) value);\n      } else if (isXmlInline(value)) {\n        renderXmlInline((VmTyped) value);\n      } else {\n        writeXmlElement(name.toString(), null, value, true, true);\n      }\n    }\n\n    // No-op for XML\n    @Override\n    protected void endDynamic(VmDynamic value, boolean isEmpty) {}\n\n    // No-op for XML\n    @Override\n    protected void endTyped(VmTyped value, boolean isEmpty) {}\n\n    // No-op for XML\n    @Override\n    protected void endListing(VmListing value, boolean isEmpty) {}\n\n    // No-op for XML\n    @Override\n    protected void endMapping(VmMapping value, boolean isEmpty) {}\n\n    // No-op for XML\n    @Override\n    protected void endList(VmList value) {}\n\n    // No-op for XML\n    @Override\n    protected void endSet(VmSet value) {}\n\n    // No-op for XML\n    @Override\n    protected void endMap(VmMap value) {}\n\n    private void doVisitElement(Object value) {\n      if (!(value instanceof VmNull)) {\n        if (isXmlElement(value)) {\n          renderXmlElement((VmDynamic) value);\n        } else if (isXmlInline(value)) {\n          renderXmlInline((VmTyped) value);\n        } else if (isContent(value)) {\n          visit(value);\n        } else if (isRenderDirective(value)) {\n          builder.append(VmUtils.readTextProperty(value));\n        } else {\n          writeXmlElement(VmUtils.getClass(value).getSimpleName(), null, value, true, true);\n        }\n      }\n    }\n\n    @Override\n    protected void visitElement(long index, Object value, boolean isFirst) {\n      doVisitElement(value);\n    }\n\n    @Override\n    protected void visitEntryKey(Object key, boolean isFirst) {\n      deferredKey = key;\n    }\n\n    @Override\n    protected void visitEntryValue(Object value) {\n      if (isXmlElement(value)) {\n        renderXmlElement((VmDynamic) value);\n      } else if (isXmlInline(value)) {\n        renderXmlInline((VmTyped) value);\n      } else {\n        assert deferredKey != null;\n        assert enclosingValue != null;\n        if (isRenderDirective(deferredKey)) {\n          writeXmlElement(VmUtils.readTextProperty(deferredKey), null, value, true, false);\n        } else if (deferredKey instanceof String string) {\n          writeXmlElement(string, null, value, true, true);\n        } else {\n          assert deferredKey != null;\n          cannotRenderNonStringKey(deferredKey);\n        }\n      }\n    }\n\n    @Override\n    public void visitTyped(VmTyped value) {\n      if (isXmlComment(value)) {\n        renderXmlComment(value);\n      } else if (isXmlCData(value)) {\n        renderXmlCData(value);\n      } else {\n        super.visitTyped(value);\n      }\n    }\n\n    private static boolean isScalar(Object value) {\n      return value instanceof String\n          || value instanceof Boolean\n          || value instanceof Long\n          || value instanceof Double;\n    }\n\n    private static boolean isContent(Object value) {\n      return isScalar(value) || isXmlCData(value) || isXmlComment(value);\n    }\n\n    private static boolean isXmlElement(Object value) {\n      return value instanceof VmDynamic dynamic\n          && VmUtils.readMemberOrNull(dynamic, Identifier.IS_XML_ELEMENT) == Boolean.TRUE;\n    }\n\n    private void renderXmlElement(VmDynamic value) {\n      assert isXmlElement(value);\n\n      var name = VmUtils.readMember(value, Identifier.NAME);\n      // this check will be unnecessary once we have an XmlElement Pkl class\n      if (!(name instanceof String)) {\n        throw new VmExceptionBuilder().typeMismatch(value, BaseModule.getStringClass()).build();\n      }\n\n      Object attributes = VmUtils.readMember(value, Identifier.ATTRIBUTES);\n      // this check will be unnecessary once we have an XmlElement Pkl class\n      if (!(attributes instanceof VmMapping)) {\n        throw new VmExceptionBuilder().typeMismatch(value, BaseModule.getMappingClass()).build();\n      }\n\n      var isBlockFormat = VmUtils.readMember(value, Identifier.IS_BLOCK_FORMAT);\n      // this check will be unnecessary once we have an XmlElement Pkl class\n      if (!(isBlockFormat instanceof Boolean)) {\n        throw new VmExceptionBuilder().typeMismatch(value, BaseModule.getBooleanClass()).build();\n      }\n\n      writeXmlElement((String) name, (VmMapping) attributes, value, (Boolean) isBlockFormat, true);\n    }\n\n    private boolean isXmlInline(Object value) {\n      return value instanceof VmTyped typed && typed.getVmClass() == XmlModule.getInlineClass();\n    }\n\n    private void renderXmlInline(VmTyped object) {\n      assert isXmlInline(object);\n\n      var value = VmUtils.readMember(object, Identifier.VALUE);\n      visit(value);\n    }\n\n    private static boolean isXmlComment(Object value) {\n      return value instanceof VmTyped typed && typed.getVmClass() == XmlModule.getCommentClass();\n    }\n\n    private void renderXmlComment(VmTyped object) {\n      assert isXmlComment(object);\n\n      if (isBlockFormat(object)) startNewLine();\n\n      var comment = VmUtils.readTextProperty(object);\n      assert !comment.contains(\"--\"); // guaranteed by `xml.pkl`.\n\n      builder\n          .append(\"<!--\")\n          .append(VmUtils.readTextProperty(object)) // no escaping for comment\n          .append(\"-->\");\n    }\n\n    private static boolean isXmlCData(Object value) {\n      return value instanceof VmTyped typed && typed.getVmClass() == XmlModule.getCDataClass();\n    }\n\n    private void renderXmlCData(VmTyped object) {\n      assert isXmlCData(object);\n\n      var text = VmUtils.readTextProperty(object);\n      // Escape CDATA end token by splitting it into parts:\n      // https://stackoverflow.com/questions/223652/is-there-a-way-to-escape-a-cdata-end-token-in-xml\n      var cdataContents = text.replace(\"]]>\", \"]]]]><![CDATA[>\");\n      builder.append(\"<![CDATA[\").append(cdataContents).append(\"]]>\");\n    }\n\n    private void writeXmlElement(\n        String name,\n        @Nullable VmMapping attributes,\n        Object content,\n        boolean isBlockFormat,\n        boolean validateElementName) {\n      if (isBlockFormat) startNewLine();\n\n      if (validateElementName) {\n        validateName(name, \"element\");\n      }\n      builder.append(\"<\").append(name);\n      if (attributes != null) {\n        attributes.forceAndIterateMemberValues(\n            (key, member, value) -> {\n              builder.append(' ');\n              // this check will be unnecessary once we have an XmlElement Pkl class\n              if (!(key instanceof String string)) {\n                throw new VmExceptionBuilder()\n                    .typeMismatch(name, BaseModule.getStringClass())\n                    .build();\n              }\n              validateName(string, \"attribute\");\n              builder.append(string).append(\"=\\\"\");\n              // this check will be unnecessary once we have an XmlElement Pkl class\n              if (!isScalar(value)) {\n                throw new VmExceptionBuilder()\n                    // can only report two expected types for now\n                    .typeMismatch(name, BaseModule.getStringClass(), BaseModule.getBooleanClass())\n                    .build();\n              }\n              builder.append(stringEscaper.escape(value.toString())).append(\"\\\"\");\n              return true;\n            });\n      }\n      builder.append(\">\");\n\n      var prevLineNumber = lineNumber;\n      increaseIndent();\n\n      if (isXmlElement(content)) {\n        // this special casing is necessary because renderXmlElement() is implemented in terms of\n        // this method\n        ((VmDynamic) content)\n            .forceAndIterateMemberValues(\n                (key, member, value) -> {\n                  if (member.isElement()) doVisitElement(value);\n                  return true;\n                });\n      } else {\n        visit(content);\n      }\n\n      decreaseIndent();\n      if (prevLineNumber < lineNumber) startNewLine();\n\n      builder.append(\"</\").append(name).append(\">\");\n    }\n\n    private void validateName(String name, String kind) {\n      if (validator.isValidName(name)) return;\n\n      throw new VmExceptionBuilder().evalError(\"invalidXmlName\", version, kind, name).build();\n    }\n\n    private void startNewLine() {\n      if (builder.isEmpty()) return;\n\n      lineNumber += 1;\n      builder.append(LINE_BREAK).append(currIndent);\n    }\n  }\n\n  private static boolean isBlockFormat(VmObjectLike object) {\n    return (Boolean) VmUtils.readMember(object, Identifier.IS_BLOCK_FORMAT);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/xml/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.stdlib.xml;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/yaml/ParserNodes.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib.yaml;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.dsl.Cached;\nimport com.oracle.truffle.api.dsl.Specialization;\nimport com.oracle.truffle.api.nodes.IndirectCallNode;\nimport com.oracle.truffle.api.source.Source;\nimport com.oracle.truffle.api.source.SourceSection;\nimport java.net.URI;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport org.graalvm.collections.EconomicMap;\nimport org.pkl.core.ast.VmModifier;\nimport org.pkl.core.ast.member.ObjectMember;\nimport org.pkl.core.runtime.*;\nimport org.pkl.core.stdlib.ExternalMethod1Node;\nimport org.pkl.core.stdlib.PklConverter;\nimport org.pkl.core.util.EconomicMaps;\nimport org.pkl.core.util.yaml.snake.YamlUtils;\nimport org.snakeyaml.engine.v2.api.ConstructNode;\nimport org.snakeyaml.engine.v2.api.Load;\nimport org.snakeyaml.engine.v2.api.LoadSettings;\nimport org.snakeyaml.engine.v2.constructor.StandardConstructor;\nimport org.snakeyaml.engine.v2.exceptions.Mark;\nimport org.snakeyaml.engine.v2.exceptions.YamlEngineException;\nimport org.snakeyaml.engine.v2.nodes.*;\nimport org.snakeyaml.engine.v2.resolver.ScalarResolver;\nimport org.snakeyaml.engine.v2.schema.Schema;\n\npublic final class ParserNodes {\n  private static final Pattern WHITESPACE = Pattern.compile(\"\\\\s\");\n\n  private ParserNodes() {}\n\n  public abstract static class parse extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(VmTyped self, String text) {\n      var uri = \"input_string\";\n      return doParse(self, text, uri);\n    }\n\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(\n        VmTyped self, VmTyped resource, @Cached(\"create()\") IndirectCallNode callNode) {\n      var text = (String) VmUtils.readMember(resource, Identifier.TEXT, callNode);\n      var uri = (String) VmUtils.readMember(resource, Identifier.URI, callNode);\n      return doParse(self, text, uri);\n    }\n\n    private Object doParse(VmTyped self, String text, String uri) {\n      var converter = PklConverter.fromParser(self);\n      var load = createLoad(self, text, uri, converter);\n\n      try {\n        var document = load.loadFromString(text);\n        return converter.convert(document, List.of());\n      } catch (YamlEngineException e) {\n        if (e.getMessage()\n            .startsWith(\"Number of aliases for non-scalar nodes exceeds the specified\")) {\n          throw exceptionBuilder()\n              .evalError(\"yamlParseErrorTooManyAliases\", getMaxCollectionAliases(self))\n              .build();\n        }\n        throw exceptionBuilder().evalError(\"yamlParseError\").withHint(e.getMessage()).build();\n      }\n    }\n  }\n\n  public abstract static class parseAll extends ExternalMethod1Node {\n    @Specialization\n    @TruffleBoundary\n    protected VmList eval(VmTyped self, String text) {\n      var uri = \"input_string\";\n      return doParseAll(self, text, uri);\n    }\n\n    @Specialization\n    @TruffleBoundary\n    protected Object eval(\n        VmTyped self, VmTyped resource, @Cached(\"create()\") IndirectCallNode callNode) {\n      var text = (String) VmUtils.readMember(resource, Identifier.TEXT, callNode);\n      var uri = (String) VmUtils.readMember(resource, Identifier.URI, callNode);\n      return doParseAll(self, text, uri);\n    }\n\n    private VmList doParseAll(VmTyped self, String text, String uri) {\n      var converter = PklConverter.fromParser(self);\n      var load = createLoad(self, text, uri, converter);\n      var builder = VmList.EMPTY.builder();\n\n      try {\n        for (var document : load.loadAllFromString(text)) {\n          builder.add(converter.convert(document, List.of(VmValueConverter.TOP_LEVEL_VALUE)));\n        }\n      } catch (YamlEngineException e) {\n        if (e.getMessage()\n            .startsWith(\"Number of aliases for non-scalar nodes exceeds the specified\")) {\n          throw exceptionBuilder()\n              .evalError(\"yamlParseErrorTooManyAliases\", getMaxCollectionAliases(self))\n              .build();\n        }\n        throw exceptionBuilder().evalError(\"yamlParseError\").withHint(e.getMessage()).build();\n      }\n\n      return builder.build();\n    }\n  }\n\n  private static int getMaxCollectionAliases(VmTyped self) {\n    var max = (Long) VmUtils.readMember(self, Identifier.MAX_COLLECTION_ALIASES);\n    return max.intValue(); // has Pkl type `Int32(isPositive)`\n  }\n\n  private static Load createLoad(VmTyped self, String text, String uri, PklConverter converter) {\n    var mode = (String) VmUtils.readMember(self, Identifier.MODE);\n    var useMapping = (boolean) VmUtils.readMember(self, Identifier.USE_MAPPING);\n    var settings =\n        LoadSettings.builder()\n            .setMaxAliasesForCollections(getMaxCollectionAliases(self))\n            .setSchema(\n                new Schema() {\n                  @Override\n                  public ScalarResolver getScalarResolver() {\n                    return YamlUtils.getParserResolver(mode);\n                  }\n\n                  @Override\n                  public Map<Tag, ConstructNode> getSchemaTagConstructors() {\n                    // ParserNodes.Constructor ignores this method,\n                    // but it is called from its superclass.\n                    return Map.of();\n                  }\n                })\n            .setLabel(uri)\n            .build();\n    var source =\n        Source.newBuilder(\"pkl\", text, uri)\n            .mimeType(\"application/x-yaml\")\n            .uri(URI.create(uri))\n            .cached(false)\n            .build();\n    return new Load(settings, new Constructor(settings, source, converter, mode, useMapping));\n  }\n\n  // Note: We currently use the same [ConstructNode]s for all [YamlParser.mode]s.\n  // Using separate nodes might improve performance,\n  // and might result in more accurate rejection of invalid nodes with explicit tag.\n  private static final class Constructor extends StandardConstructor {\n    private final Source source;\n    private final PklConverter converter;\n    private final boolean useMapping;\n\n    private Deque<Object> currPath = new ArrayDeque<>();\n\n    public Constructor(\n        LoadSettings settings,\n        Source source,\n        PklConverter converter,\n        String mode,\n        boolean useMapping) {\n      super(settings);\n      this.source = source;\n      this.converter = converter;\n      this.useMapping = useMapping;\n\n      currPath.push(VmValueConverter.TOP_LEVEL_VALUE);\n\n      // remove constructors registered by superclass to have full control\n      tagConstructors.clear();\n\n      tagConstructors.put(Tag.NULL, new ConstructNull());\n      tagConstructors.put(Tag.BOOL, new ConstructBoolean());\n      tagConstructors.put(Tag.INT, new ConstructInt(mode.equals(\"compat\") || mode.equals(\"1.1\")));\n      tagConstructors.put(Tag.FLOAT, new ConstructFloat());\n      tagConstructors.put(Tag.BINARY, new ConstructBinary());\n      tagConstructors.put(Tag.SET, new ConstructSet());\n      tagConstructors.put(Tag.STR, new ConstructStr());\n      tagConstructors.put(Tag.SEQ, new ConstructSeq());\n      tagConstructors.put(Tag.MAP, new ConstructMap());\n\n      // Pkl doesn't have a timestamp type, so parse as string\n      tagConstructors.put(new Tag(Tag.PREFIX + \"timestamp\"), new ConstructStr());\n    }\n\n    public static class ConstructBoolean implements ConstructNode {\n      @Override\n      public Object construct(Node node) {\n        var value = ((ScalarNode) node).getValue();\n        return switch (value) {\n          case \"true\", \"True\", \"TRUE\", \"on\", \"On\", \"ON\", \"y\", \"Y\", \"yes\", \"Yes\", \"YES\" -> true;\n          default -> false;\n        };\n      }\n    }\n\n    public static class ConstructStr implements ConstructNode {\n      @Override\n      public Object construct(Node node) {\n        return ((ScalarNode) node).getValue();\n      }\n    }\n\n    private static class ConstructNull implements ConstructNode {\n      @Override\n      public VmNull construct(Node node) {\n        return VmNull.withoutDefault();\n      }\n    }\n\n    private static class ConstructInt implements ConstructNode {\n      final boolean enable11Octals;\n\n      ConstructInt(boolean enable11Octals) {\n        this.enable11Octals = enable11Octals;\n      }\n\n      @Override\n      public Long construct(Node node) {\n        var value = ((ScalarNode) node).getValue().replace(\"_\", \"\");\n\n        var firstChar = value.charAt(0);\n        var isNegative = firstChar == '-';\n        var offset = isNegative || firstChar == '+' ? 1 : 0;\n\n        if (value.contains(\":\")) {\n          return parseBase60(value, isNegative, offset);\n        }\n\n        var radix = 10;\n\n        if (value.charAt(offset) == '0' && value.length() > offset + 1) {\n          switch (value.charAt(offset + 1)) {\n            case 'b' -> {\n              radix = 2;\n              offset += 2;\n            }\n            case 'o' -> {\n              radix = 8;\n              offset += 2;\n            }\n            case 'x' -> {\n              radix = 16;\n              offset += 2;\n            }\n            default -> {\n              if (enable11Octals) {\n                radix = 8;\n                offset += 1;\n              }\n            }\n          }\n        }\n\n        var result = Long.parseLong(value, offset, value.length(), radix);\n        if (isNegative) result = -result;\n        return result;\n      }\n\n      private static long parseBase60(String value, boolean isNegative, int offset) {\n        var result = 0L;\n        var segments = value.substring(offset).split(\":\");\n        for (var segment : segments) {\n          var segmentNum = Long.parseLong(segment);\n          result = VmSafeMath.add(VmSafeMath.multiply(result, 60), segmentNum);\n        }\n        if (isNegative) result = -result;\n        return result;\n      }\n    }\n\n    public static class ConstructFloat implements ConstructNode {\n      @Override\n      public Double construct(Node node) {\n        var value = ((ScalarNode) node).getValue().replace(\"_\", \"\");\n\n        // `.` and `.___` are floats in 1.1; no revision/erratum exists\n        if (value.equals(\".\")) return 0.0;\n\n        if (value.contains(\":\")) return parseBase60(value);\n\n        return switch (value) {\n          case \".nan\", \".NaN\", \".NAN\" -> Double.NaN;\n          case \".inf\", \".Inf\", \".INF\", \"+.inf\", \"+.Inf\", \"+.INF\" -> Double.POSITIVE_INFINITY;\n          case \"-.inf\", \"-.Inf\", \"-.INF\" -> Double.NEGATIVE_INFINITY;\n          default -> Double.valueOf(value);\n        };\n      }\n\n      private static double parseBase60(String value) {\n        var isNegative = value.startsWith(\"-\");\n        if (isNegative || value.startsWith(\"+\")) value = value.substring(1);\n        var result = 0d;\n        var segments = value.split(\":\");\n        for (var segment : segments) {\n          var segmentNum = Double.parseDouble(segment);\n          result = VmSafeMath.add(VmSafeMath.multiply(result, 60), segmentNum);\n        }\n        if (isNegative) result = -result;\n        return result;\n      }\n    }\n\n    private static class ConstructBinary implements ConstructNode {\n      @Override\n      public VmBytes construct(Node node) {\n        var value = ((ScalarNode) node).getValue();\n        var encoded = WHITESPACE.matcher(value).replaceAll(\"\");\n        var decoded = Base64.getDecoder().decode(encoded);\n        return decoded.length == 0 ? VmBytes.EMPTY : new VmBytes(decoded);\n      }\n    }\n\n    private class ConstructSeq implements ConstructNode {\n      @Override\n      public VmListing construct(Node node) {\n        var sequenceNode = (SequenceNode) node;\n        var size = sequenceNode.getValue().size();\n        var members = EconomicMaps.<Object, ObjectMember>create(size);\n\n        var result =\n            new VmListing(\n                VmUtils.createEmptyMaterializedFrame(),\n                BaseModule.getListingClass().getPrototype(),\n                members,\n                size);\n\n        if (!node.isRecursive()) {\n          addMembers(sequenceNode, result);\n        }\n        return result;\n      }\n\n      @Override\n      public void constructRecursive(Node node, Object data) {\n        if (!node.isRecursive()) {\n          throw new YamlEngineException(\"Unexpected recursive sequence structure. Node: \" + node);\n        }\n\n        addMembers(((SequenceNode) node), (VmListing) data);\n      }\n\n      private void addMembers(SequenceNode node, VmListing listing) {\n        var members = (EconomicMap<Object, ObjectMember>) listing.getMembers();\n        long index = 0;\n\n        currPath.push(VmValueConverter.WILDCARD_ELEMENT);\n        for (var childNode : node.getValue()) {\n          var sourceSection = createSourceSection(childNode.getStartMark(), childNode.getEndMark());\n          var member =\n              new ObjectMember(\n                  sourceSection, sourceSection, VmModifier.ELEMENT, null, String.valueOf(index));\n          member.initConstantValue(converter.convert(constructObject(childNode), currPath));\n          EconomicMaps.put(members, index++, member);\n        }\n        currPath.pop();\n      }\n    }\n\n    private class ConstructSet implements ConstructNode {\n      @Override\n      public VmListing construct(Node node) {\n        var mappingNode = (MappingNode) node;\n        var size = mappingNode.getValue().size();\n        var members = EconomicMaps.<Object, ObjectMember>create(size);\n\n        var result =\n            new VmListing(\n                VmUtils.createEmptyMaterializedFrame(),\n                BaseModule.getListingClass().getPrototype(),\n                members,\n                size);\n\n        if (!node.isRecursive()) {\n          addMembers(mappingNode, result);\n        }\n        return result;\n      }\n\n      @Override\n      public void constructRecursive(Node node, Object data) {\n        if (!node.isRecursive()) {\n          throw new YamlEngineException(\"Unexpected recursive sequence structure. Node: \" + node);\n        }\n\n        addMembers(((MappingNode) node), (VmListing) data);\n      }\n\n      private void addMembers(MappingNode node, VmListing listing) {\n        var members = (EconomicMap<Object, ObjectMember>) listing.getMembers();\n        long index = 0;\n\n        flattenMapping(node);\n        currPath.push(VmValueConverter.WILDCARD_ELEMENT);\n        for (var tuple : node.getValue()) {\n          var keyNode = tuple.getKeyNode();\n          var sourceSection = createSourceSection(keyNode.getStartMark(), keyNode.getEndMark());\n          var member =\n              new ObjectMember(\n                  sourceSection, sourceSection, VmModifier.ELEMENT, null, String.valueOf(index));\n          member.initConstantValue(converter.convert(constructObject(keyNode), currPath));\n          EconomicMaps.put(members, index++, member);\n        }\n        currPath.pop();\n      }\n    }\n\n    private class ConstructMap implements ConstructNode {\n      @Override\n      public VmObject construct(Node node) {\n        var mappingNode = (MappingNode) node;\n        var size = mappingNode.getValue().size();\n        var members = EconomicMaps.<Object, ObjectMember>create(size);\n\n        VmObject result;\n        if (useMapping) {\n          result =\n              new VmMapping(\n                  VmUtils.createEmptyMaterializedFrame(),\n                  BaseModule.getMappingClass().getPrototype(),\n                  members);\n        } else {\n          result =\n              new VmDynamic(\n                  VmUtils.createEmptyMaterializedFrame(),\n                  BaseModule.getDynamicClass().getPrototype(),\n                  members,\n                  0);\n        }\n\n        if (!node.isRecursive()) {\n          addMembers(mappingNode, result);\n        }\n        return result;\n      }\n\n      @Override\n      public void constructRecursive(Node node, Object data) {\n        if (!node.isRecursive()) {\n          throw new YamlEngineException(\"Unexpected recursive sequence structure. Node: \" + node);\n        }\n\n        addMembers(((MappingNode) node), (VmObject) data);\n      }\n\n      private void addMembers(MappingNode node, VmObject object) {\n        var members = (EconomicMap<Object, ObjectMember>) object.getMembers();\n        var valuePath = currPath;\n        var keyPath = new ArrayDeque<>();\n\n        flattenMapping(node);\n        for (var tuple : node.getValue()) {\n          var keyNode = tuple.getKeyNode();\n          var valueNode = tuple.getValueNode();\n          var sourceSection = createSourceSection(keyNode.getStartMark(), valueNode.getEndMark());\n          var headerSection = createSourceSection(keyNode.getStartMark(), keyNode.getEndMark());\n\n          currPath = keyPath;\n          var key = constructObject(keyNode);\n          var convertedKey = converter.convert(key, currPath);\n          currPath = valuePath;\n\n          var memberName =\n              convertedKey instanceof String string && !useMapping ? Identifier.get(string) : null;\n\n          var member =\n              new ObjectMember(\n                  sourceSection,\n                  headerSection,\n                  memberName == null ? VmModifier.ENTRY : VmModifier.NONE,\n                  memberName,\n                  \"generated\");\n\n          currPath.push(\n              key instanceof String string\n                  ? Identifier.get(string)\n                  : VmValueConverter.WILDCARD_PROPERTY);\n          var value = constructObject(valueNode);\n          var convertedValue = converter.convert(value, currPath);\n          member.initConstantValue(convertedValue);\n          currPath.pop();\n\n          EconomicMaps.put(members, memberName != null ? memberName : convertedKey, member);\n        }\n      }\n    }\n\n    @SuppressWarnings({\"OptionalUsedAsFieldOrParameterType\", \"unused\"})\n    private SourceSection createSourceSection(Optional<Mark> start, Optional<Mark> end) {\n      // TODO: create real source section once https://github.com/oracle/graal/issues/902 has been\n      // fixed\n      var s = source;\n      return VmUtils.unavailableSourceSection();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/stdlib/yaml/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://bitbucket.org/asomov/snakeyaml-engine/\n *\n * <p>Original license:\n *\n * <p>Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n *\n * <p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n *\n * <p>1. Definitions.\n *\n * <p>\"License\" shall mean the terms and conditions for use, reproduction, and distribution as\n * defined by Sections 1 through 9 of this document.\n *\n * <p>\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is\n * granting the License.\n *\n * <p>\"Legal Entity\" shall mean the union of the acting entity and all other entities that control,\n * are controlled by, or are under common control with that entity. For the purposes of this\n * definition, \"control\" means (i) the power, direct or indirect, to cause the direction or\n * management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent\n * (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n *\n * <p>\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by\n * this License.\n *\n * <p>\"Source\" form shall mean the preferred form for making modifications, including but not\n * limited to software source code, documentation source, and configuration files.\n *\n * <p>\"Object\" form shall mean any form resulting from mechanical transformation or translation of a\n * Source form, including but not limited to compiled object code, generated documentation, and\n * conversions to other media types.\n *\n * <p>\"Work\" shall mean the work of authorship, whether in Source or Object form, made available\n * under the License, as indicated by a copyright notice that is included in or attached to the work\n * (an example is provided in the Appendix below).\n *\n * <p>\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or\n * derived from) the Work and for which the editorial revisions, annotations, elaborations, or other\n * modifications represent, as a whole, an original work of authorship. For the purposes of this\n * License, Derivative Works shall not include works that remain separable from, or merely link (or\n * bind by name) to the interfaces of, the Work and Derivative Works thereof.\n *\n * <p>\"Contribution\" shall mean any work of authorship, including the original version of the Work\n * and any modifications or additions to that Work or Derivative Works thereof, that is\n * intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an\n * individual or Legal Entity authorized to submit on behalf of the copyright owner. For the\n * purposes of this definition, \"submitted\" means any form of electronic, verbal, or written\n * communication sent to the Licensor or its representatives, including but not limited to\n * communication on electronic mailing lists, source code control systems, and issue tracking\n * systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and\n * improving the Work, but excluding communication that is conspicuously marked or otherwise\n * designated in writing by the copyright owner as \"Not a Contribution.\"\n *\n * <p>\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a\n * Contribution has been received by Licensor and subsequently incorporated within the Work.\n *\n * <p>2. Grant of Copyright License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display,\n * publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or\n * Object form.\n *\n * <p>3. Grant of Patent License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable (except as stated in this section) patent license to make, have made, use, offer to\n * sell, sell, import, and otherwise transfer the Work, where such license applies only to those\n * patent claims licensable by such Contributor that are necessarily infringed by their\n * Contribution(s) alone or by combination of their Contribution(s) with the Work to which such\n * Contribution(s) was submitted. If You institute patent litigation against any entity (including a\n * cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated\n * within the Work constitutes direct or contributory patent infringement, then any patent licenses\n * granted to You under this License for that Work shall terminate as of the date such litigation is\n * filed.\n *\n * <p>4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works\n * thereof in any medium, with or without modifications, and in Source or Object form, provided that\n * You meet the following conditions:\n *\n * <p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License;\n * and\n *\n * <p>(b) You must cause any modified files to carry prominent notices stating that You changed the\n * files; and\n *\n * <p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all\n * copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding\n * those notices that do not pertain to any part of the Derivative Works; and\n *\n * <p>(d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative\n * Works that You distribute must include a readable copy of the attribution notices contained\n * within such NOTICE file, excluding those notices that do not pertain to any part of the\n * Derivative Works, in at least one of the following places: within a NOTICE text file distributed\n * as part of the Derivative Works; within the Source form or documentation, if provided along with\n * the Derivative Works; or, within a display generated by the Derivative Works, if and wherever\n * such third-party notices normally appear. The contents of the NOTICE file are for informational\n * purposes only and do not modify the License. You may add Your own attribution notices within\n * Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the\n * Work, provided that such additional attribution notices cannot be construed as modifying the\n * License.\n *\n * <p>You may add Your own copyright statement to Your modifications and may provide additional or\n * different license terms and conditions for use, reproduction, or distribution of Your\n * modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and\n * distribution of the Work otherwise complies with the conditions stated in this License.\n *\n * <p>5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution\n * intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms\n * and conditions of this License, without any additional terms or conditions. Notwithstanding the\n * above, nothing herein shall supersede or modify the terms of any separate license agreement you\n * may have executed with Licensor regarding such Contributions.\n *\n * <p>6. Trademarks. This License does not grant permission to use the trade names, trademarks,\n * service marks, or product names of the Licensor, except as required for reasonable and customary\n * use in describing the origin of the Work and reproducing the content of the NOTICE file.\n *\n * <p>7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor\n * provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation,\n * any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n * PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or\n * redistributing the Work and assume any risks associated with Your exercise of permissions under\n * this License.\n *\n * <p>8. Limitation of Liability. In no event and under no legal theory, whether in tort (including\n * negligence), contract, or otherwise, unless required by applicable law (such as deliberate and\n * grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for\n * damages, including any direct, indirect, special, incidental, or consequential damages of any\n * character arising as a result of this License or out of the use or inability to use the Work\n * (including but not limited to damages for loss of goodwill, work stoppage, computer failure or\n * malfunction, or any and all other commercial damages or losses), even if such Contributor has\n * been advised of the possibility of such damages.\n *\n * <p>9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative\n * Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty,\n * indemnity, or other liability obligations and/or rights consistent with this License. However, in\n * accepting such obligations, You may act only on Your own behalf and on Your sole responsibility,\n * not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each\n * Contributor harmless for any liability incurred by, or claims asserted against, such Contributor\n * by reason of your accepting any such warranty or additional liability.\n *\n * <p>END OF TERMS AND CONDITIONS\n */\n@NonnullByDefault\npackage org.pkl.core.stdlib.yaml;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/AbstractCharEscaper.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\npublic abstract class AbstractCharEscaper {\n  protected abstract @Nullable String findReplacement(char ch);\n\n  public String escape(String str) {\n    // Optimization: Return original string if no escaping required.\n    // Because only escaping of chars is supported,\n    // it's safe to iterate over chars instead of code points.\n    var length = str.length();\n    for (var i = 0; i < length; i++) {\n      var ch = str.charAt(i);\n      if (findReplacement(ch) != null) {\n        return doEscape(str, i, new StringBuilder(length * 2)).toString();\n      }\n    }\n    return str;\n  }\n\n  public void escape(String str, StringBuilder builder) {\n    doEscape(str, 0, builder);\n  }\n\n  private StringBuilder doEscape(String str, int offset, StringBuilder builder) {\n    var start = 0;\n    var length = str.length();\n    for (var i = offset; i < length; i++) {\n      var ch = str.charAt(i);\n      var replacement = findReplacement(ch);\n      if (replacement == null) continue;\n      builder.append(str, start, i).append(replacement);\n      start = i + 1;\n    }\n    if (start < length) {\n      builder.append(str, start, length);\n    }\n    return builder;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/AnsiStringBuilder.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.io.PrintWriter;\nimport java.util.EnumSet;\nimport java.util.Set;\n\n@SuppressWarnings({\"DuplicatedCode\", \"UnusedReturnValue\"})\npublic final class AnsiStringBuilder {\n  private final StringBuilder builder = new StringBuilder();\n  private final boolean usingColor;\n\n  /** The set of ansi codes currently applied. */\n  private Set<AnsiCode> currentCodes = EnumSet.noneOf(AnsiCode.class);\n\n  /** The set of ansi codes intended to be applied the next time text is written. */\n  private Set<AnsiCode> declaredCodes = EnumSet.noneOf(AnsiCode.class);\n\n  public AnsiStringBuilder(boolean usingColor) {\n    this.usingColor = usingColor;\n  }\n\n  /** Append {@code value} to the string, ensuring it is formatted with {@code codes}. */\n  public AnsiStringBuilder append(Set<AnsiCode> codes, String value) {\n    if (!usingColor) {\n      builder.append(value);\n      return this;\n    }\n    var prevDeclaredCodes = declaredCodes;\n    declaredCodes = EnumSet.copyOf(codes);\n    declaredCodes.addAll(prevDeclaredCodes);\n    append(value);\n    declaredCodes = prevDeclaredCodes;\n    return this;\n  }\n\n  /** Append {@code value} to the string, ensuring it is formatted with {@code codes}. */\n  public AnsiStringBuilder append(AnsiCode code, int value) {\n    if (!usingColor) {\n      builder.append(value);\n      return this;\n    }\n    var prevDeclaredCodes = declaredCodes;\n    declaredCodes = EnumSet.of(code);\n    declaredCodes.addAll(prevDeclaredCodes);\n    append(value);\n    declaredCodes = prevDeclaredCodes;\n    return this;\n  }\n\n  /** Append {@code value} to the string, ensuring it is formatted with {@code codes}. */\n  public AnsiStringBuilder append(AnsiCode code, String value) {\n    if (!usingColor) {\n      builder.append(value);\n      return this;\n    }\n    var prevDeclaredCodes = declaredCodes;\n    declaredCodes = EnumSet.of(code);\n    declaredCodes.addAll(prevDeclaredCodes);\n    append(value);\n    declaredCodes = prevDeclaredCodes;\n    return this;\n  }\n\n  /**\n   * Apply {@code code} to every appended element within {@code runnable}.\n   *\n   * <p>This is a helper method. With this:\n   *\n   * <ul>\n   *   <li>There is no need to repeat the same style for multiple appends in a row.\n   *   <li>The parent style is added to any styles added applied in the children.\n   *       <p>For example, in the following snippet, {@code \"hello\"} is formatted in both bold and\n   *       red:\n   *       <pre>{@code\n   * var sb = new AnsiCodingStringBuilder(true);\n   * sb.append(AnsiCode.RED, () -> {\n   *   sb.append(AnsiCode.BOLD, \"hello\");\n   * });\n   *\n   * }</pre>\n   * </ul>\n   */\n  public AnsiStringBuilder append(AnsiCode code, Runnable runnable) {\n    if (!usingColor) {\n      runnable.run();\n      return this;\n    }\n    var prevDeclaredCodes = declaredCodes;\n    declaredCodes = EnumSet.of(code);\n    declaredCodes.addAll(prevDeclaredCodes);\n    runnable.run();\n    declaredCodes = prevDeclaredCodes;\n    return this;\n  }\n\n  public AnsiStringBuilder append(EnumSet<AnsiCode> codes, Runnable runnable) {\n    if (!usingColor) {\n      runnable.run();\n      return this;\n    }\n    var prevDeclaredCodes = declaredCodes;\n    declaredCodes = EnumSet.copyOf(codes);\n    declaredCodes.addAll(prevDeclaredCodes);\n    runnable.run();\n    declaredCodes = prevDeclaredCodes;\n    return this;\n  }\n\n  /** Provides a runnable where anything appended is not affected by the existing context. */\n  public AnsiStringBuilder appendSandboxed(Runnable runnable) {\n    if (!usingColor) {\n      runnable.run();\n      return this;\n    }\n    var myCodes = currentCodes;\n    var myDeclaredCodes = declaredCodes;\n    currentCodes = EnumSet.noneOf(AnsiCode.class);\n    declaredCodes = EnumSet.noneOf(AnsiCode.class);\n    doReset();\n    runnable.run();\n    doReset();\n    currentCodes = myCodes;\n    declaredCodes = myDeclaredCodes;\n    doAppendCodes(currentCodes);\n    return this;\n  }\n\n  /**\n   * Append a string whose contents are unknown, and might contain ANSI color codes.\n   *\n   * <p>Always add a reset and re-apply all colors after appending the string.\n   */\n  public AnsiStringBuilder appendUntrusted(String value) {\n    appendCodes();\n    builder.append(value);\n    if (usingColor) {\n      doReset();\n      doAppendCodes(currentCodes);\n    }\n    return this;\n  }\n\n  /**\n   * Append {@code value} to the string.\n   *\n   * <p>If called within {@link #append(AnsiCode, Runnable)}, applies any styles in the current\n   * context.\n   */\n  public AnsiStringBuilder append(String value) {\n    appendCodes();\n    builder.append(value);\n    return this;\n  }\n\n  /**\n   * Append the string representation of {@code value} to the string.\n   *\n   * <p>If called within {@link #append(AnsiCode, Runnable)}, applies any styles in the current\n   * context.\n   */\n  public AnsiStringBuilder append(char value) {\n    appendCodes();\n    builder.append(value);\n    return this;\n  }\n\n  /**\n   * Append the string representation of {@code value} to the string.\n   *\n   * <p>If called within {@link #append(AnsiCode, Runnable)}, applies any styles in the current\n   * context.\n   */\n  public AnsiStringBuilder append(int value) {\n    appendCodes();\n    builder.append(value);\n    return this;\n  }\n\n  /**\n   * Append the string representation of {@code value} to the string.\n   *\n   * <p>If called within {@link #append(AnsiCode, Runnable)}, applies any styles in the current\n   * context.\n   */\n  public AnsiStringBuilder append(Object value) {\n    appendCodes();\n    builder.append(value);\n    return this;\n  }\n\n  /** Returns a fresh instance of this string builder. */\n  public AnsiStringBuilder newInstance() {\n    return new AnsiStringBuilder(usingColor);\n  }\n\n  public PrintWriter toPrintWriter() {\n    return new PrintWriter(new StringBuilderWriter(builder));\n  }\n\n  public int length() {\n    return builder.length();\n  }\n\n  public void setLength(int length) {\n    builder.setLength(length);\n  }\n\n  /** Builds the data represented by this builder into a {@link String}. */\n  public String toString() {\n    // be a good citizen and unset any ansi escape codes currently set.\n    reset();\n    return builder.toString();\n  }\n\n  private void doAppendCodes(Set<AnsiCode> codes) {\n    if (codes.isEmpty()) return;\n    builder.append(\"\\033[\");\n    var isFirst = true;\n    for (var code : codes) {\n      if (isFirst) {\n        isFirst = false;\n      } else {\n        builder.append(';');\n      }\n      builder.append(code.value);\n    }\n    builder.append('m');\n  }\n\n  private void appendCodes() {\n    if (!usingColor || currentCodes.equals(declaredCodes)) return;\n    if (declaredCodes.containsAll(currentCodes)) {\n      var newCodes = EnumSet.copyOf(declaredCodes);\n      newCodes.removeAll(currentCodes);\n      doAppendCodes(newCodes);\n    } else {\n      reset();\n      doAppendCodes(declaredCodes);\n    }\n    currentCodes = declaredCodes;\n  }\n\n  private void reset() {\n    if (!usingColor || currentCodes.isEmpty()) return;\n    doReset();\n    currentCodes = EnumSet.noneOf(AnsiCode.class);\n  }\n\n  private void doReset() {\n    builder.append(\"\\033[0m\");\n  }\n\n  public enum AnsiCode {\n    RESET(0),\n    BOLD(1),\n    FAINT(2),\n\n    BLACK(30),\n    RED(31),\n    GREEN(32),\n    YELLOW(33),\n    BLUE(34),\n    MAGENTA(35),\n    CYAN(36),\n    WHITE(37),\n\n    BG_BLACK(40),\n    BG_RED(41),\n    BG_GREEN(42),\n    BG_YELLOW(43),\n    BG_BLUE(44),\n    BG_MAGENTA(45),\n    BG_CYAN(46),\n    BG_WHITE(47),\n\n    BRIGHT_BLACK(90),\n    BRIGHT_RED(91),\n    BRIGHT_GREEN(92),\n    BRIGHT_YELLOW(93),\n    BRIGHT_BLUE(94),\n    BRIGHT_MAGENTA(95),\n    BRIGHT_CYAN(96),\n    BRIGHT_WHITE(97),\n\n    BG_BRIGHT_BLACK(100),\n    BG_BRIGHT_RED(101),\n    BG_BRIGHT_GREEN(102),\n    BG_BRIGHT_YELLOW(103),\n    BG_BRIGHT_BLUE(104),\n    BG_BRIGHT_MAGENTA(105),\n    BG_BRIGHT_CYAN(106),\n    BG_BRIGHT_WHITE(107);\n\n    private final int value;\n\n    AnsiCode(int value) {\n      this.value = value;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/AnsiTheme.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.EnumSet;\nimport org.pkl.core.util.AnsiStringBuilder.AnsiCode;\n\npublic final class AnsiTheme {\n  private AnsiTheme() {}\n\n  public static final AnsiCode ERROR_MESSAGE_HINT = AnsiCode.YELLOW;\n  public static final AnsiCode ERROR_HEADER = AnsiCode.RED;\n  public static final EnumSet<AnsiCode> ERROR_MESSAGE = EnumSet.of(AnsiCode.RED, AnsiCode.BOLD);\n\n  public static final AnsiCode STACK_FRAME = AnsiCode.FAINT;\n  public static final AnsiCode STACK_TRACE_MARGIN = AnsiCode.YELLOW;\n  public static final AnsiCode STACK_TRACE_LINE_NUMBER = AnsiCode.FAINT;\n  public static final AnsiCode STACK_TRACE_LOOP_COUNT = AnsiCode.MAGENTA;\n  public static final AnsiCode STACK_TRACE_CARET = AnsiCode.RED;\n\n  public static final AnsiCode FAILING_TEST_MARK = AnsiCode.RED;\n  public static final AnsiCode PASSING_TEST_MARK = AnsiCode.GREEN;\n  public static final AnsiCode TEST_NAME = AnsiCode.FAINT;\n  public static final AnsiCode TEST_FACT_SOURCE = AnsiCode.RED;\n  public static final AnsiCode TEST_FAILURE_MESSAGE = AnsiCode.RED;\n  public static final EnumSet<AnsiCode> TEST_EXAMPLE_OUTPUT =\n      EnumSet.of(AnsiCode.RED, AnsiCode.BOLD);\n\n  public static final AnsiCode SYNTAX_KEYWORD = AnsiCode.BLUE;\n  public static final AnsiCode SYNTAX_NUMBER = AnsiCode.GREEN;\n  public static final AnsiCode SYNTAX_STRING = AnsiCode.YELLOW;\n  public static final AnsiCode SYNTAX_STRING_ESCAPE = AnsiCode.BRIGHT_YELLOW;\n  public static final AnsiCode SYNTAX_COMMENT = AnsiCode.FAINT;\n  public static final AnsiCode SYNTAX_OPERATOR = AnsiCode.RESET;\n  public static final AnsiCode SYNTAX_CONTROL = AnsiCode.BLUE;\n  public static final AnsiCode SYNTAX_CONSTANT = AnsiCode.CYAN;\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/ArrayCharEscaper.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.*;\n\npublic final class ArrayCharEscaper extends AbstractCharEscaper {\n  private final char minEscape;\n  private final @Nullable String[] replacements;\n\n  private ArrayCharEscaper(char minEscape, String[] replacements) {\n    this.minEscape = minEscape;\n    this.replacements = replacements;\n  }\n\n  public static Builder builder(int maxAllowedSize) {\n    return new Builder(maxAllowedSize);\n  }\n\n  public static Builder builder() {\n    return new Builder(256);\n  }\n\n  @Override\n  protected @Nullable String findReplacement(char ch) {\n    var index = ch - minEscape;\n    return index >= 0 && index < replacements.length ? replacements[index] : null;\n  }\n\n  public static class Builder {\n    private final int maxAllowedSize;\n    private final List<Pair<Character, String>> escapes = new ArrayList<>();\n\n    private char minEscape = Character.MAX_VALUE;\n    private char maxEscape = Character.MIN_VALUE;\n\n    private Builder(int maxAllowedSize) {\n      this.maxAllowedSize = maxAllowedSize;\n    }\n\n    public Builder withEscape(char ch, String escape) {\n      if (ch >= Character.MIN_SURROGATE) {\n        throw new IllegalArgumentException(String.valueOf(ch));\n      }\n      escapes.add(Pair.of(ch, escape));\n      if (ch < minEscape) minEscape = ch;\n      if (ch > maxEscape) maxEscape = ch;\n      return this;\n    }\n\n    public ArrayCharEscaper build() {\n      var arraySize = escapes.isEmpty() ? 0 : maxEscape - minEscape + 1;\n      if (arraySize > maxAllowedSize) {\n        throw new IllegalStateException(\n            \"Actual array size \"\n                + arraySize\n                + \" is greater than maximum allowed size \"\n                + maxAllowedSize);\n      }\n      var replacements = new String[arraySize];\n      for (var pair : escapes) {\n        replacements[pair.first - minEscape] = pair.second;\n      }\n      return new ArrayCharEscaper(minEscape, replacements);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/ByteArrayUtils.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.Base64;\nimport org.pkl.core.runtime.VmExceptionBuilder;\n\npublic final class ByteArrayUtils {\n  private ByteArrayUtils() {}\n\n  // TODO: implement this directly so we don't need a truffle boundary here.\n  @TruffleBoundary\n  public static String base64(byte[] input) {\n    return Base64.getEncoder().encodeToString(input);\n  }\n\n  @TruffleBoundary\n  public static String md5(byte[] input) {\n    return hash(input, \"MD5\");\n  }\n\n  @TruffleBoundary\n  public static String sha1(byte[] input) {\n    return hash(input, \"SHA-1\");\n  }\n\n  @TruffleBoundary\n  public static String sha256(byte[] input) {\n    return hash(input, \"SHA-256\");\n  }\n\n  @TruffleBoundary\n  public static long sha256Int(byte[] input) {\n    return hashInt(input, \"SHA-256\");\n  }\n\n  /**\n   * Implemented directly instead of using JRE's `new BigInteger.toString(16)` so we can AOT-compile\n   * this and do not need a Truffle boundary.\n   */\n  public static String toHex(byte[] hash) {\n    var hexDigitTable =\n        new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};\n\n    var builder = new StringBuilder(hash.length * 2);\n    for (var b : hash) {\n      builder.append(hexDigitTable[b >> 4 & 0xF]);\n      builder.append(hexDigitTable[b & 0xF]);\n    }\n    return builder.toString();\n  }\n\n  private static String hash(byte[] input, String algorithm) {\n    try {\n      var digest = MessageDigest.getInstance(algorithm);\n      var hash = digest.digest(input);\n      return toHex(hash);\n    } catch (NoSuchAlgorithmException e) {\n      // MD5, SHA-1, and SHA-265 are available in all JVM implementations\n      throw new VmExceptionBuilder().unreachableCode().withCause(e).build();\n    }\n  }\n\n  private static long hashInt(byte[] input, String algorithm) {\n    try {\n      var digest = MessageDigest.getInstance(algorithm);\n      var hash = digest.digest(input);\n\n      long hash64 = 0;\n      for (var i = 0; i < 8; i++) {\n        hash64 |= (hash[i] & 0xFFL) << (i * 8);\n      }\n      return hash64;\n    } catch (NoSuchAlgorithmException e) {\n      // MD5, SHA-1, and SHA-265 are available in all JVM implementations\n      throw new VmExceptionBuilder().unreachableCode().withCause(e).build();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/CodeGeneratorUtils.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.Set;\nimport org.pkl.core.PClassInfo;\nimport org.pkl.core.PType;\n\n/** Utilities shared across Java dnd Kotlin code generators. */\npublic final class CodeGeneratorUtils {\n  private static final int UNDERSCORE = '_';\n\n  private CodeGeneratorUtils() {}\n\n  public static boolean isRepresentableAsEnum(PType type, @Nullable Set<String> collector) {\n    if (type instanceof PType.StringLiteral stringLiteralType) {\n      if (collector != null) {\n        collector.add(stringLiteralType.getLiteral());\n      }\n      return true;\n    }\n    if (type instanceof PType.Alias aliasType) {\n      return isRepresentableAsEnum(aliasType.getAliasedType(), collector);\n    }\n    if (type instanceof PType.Union unionType) {\n      for (var elementType : unionType.getElementTypes()) {\n        if (!isRepresentableAsEnum(elementType, collector)) return false;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  public static boolean isRepresentableAsString(PType type) {\n    if (type instanceof PType.StringLiteral) {\n      return true;\n    }\n    if (type instanceof PType.Class classType) {\n      return classType.getPClass().getInfo() == PClassInfo.String;\n    }\n    if (type instanceof PType.Alias aliasType) {\n      return isRepresentableAsString(aliasType.getAliasedType());\n    }\n    if (type instanceof PType.Union unionType) {\n      for (var elementType : unionType.getElementTypes()) {\n        if (!isRepresentableAsString(elementType)) return false;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Converts the given Pkl string literal to an idiomatic enum constant name. Returns null if and\n   * only if the string literal could not be converted.\n   */\n  public static @Nullable String toEnumConstantName(String pklStringLiteral) {\n    if (pklStringLiteral.isEmpty()) return null;\n\n    var builder = new StringBuilder();\n\n    var firstCodePoint = pklStringLiteral.codePointAt(0);\n    if (Character.getType(firstCodePoint) == Character.DECIMAL_DIGIT_NUMBER) {\n      // prepend digit with underscore\n      builder.appendCodePoint(UNDERSCORE);\n    }\n\n    var iterator = pklStringLiteral.codePoints().iterator();\n    var seenPotentialWordEnd = false;\n\n    while (iterator.hasNext()) {\n      var codePoint = iterator.nextInt();\n      var category = Character.getType(codePoint);\n\n      if (isPunctuationOrSpacing(category)) {\n        // replace with underscore\n        builder.appendCodePoint(UNDERSCORE);\n        seenPotentialWordEnd = false;\n        continue;\n      }\n\n      if (!isValidIdentifierPart(codePoint, category)) {\n        // give up rather than trying to mangle\n        return null;\n      }\n\n      var isUpperCase = Character.isUpperCase(codePoint);\n      if (seenPotentialWordEnd && isUpperCase) {\n        // separate words with underscore\n        builder.appendCodePoint(UNDERSCORE).appendCodePoint(codePoint);\n        seenPotentialWordEnd = false;\n        continue;\n      }\n\n      builder.appendCodePoint(isUpperCase ? codePoint : Character.toUpperCase(codePoint));\n      seenPotentialWordEnd = !isUpperCase;\n    }\n\n    return builder.toString();\n  }\n\n  /**\n   * Tells whether the given Unicode code point is valid when used in the name of an identifier in\n   * generated code.\n   */\n  private static boolean isValidIdentifierPart(int codePoint, int category) {\n    return switch (category) {\n      // NOT Character.CURRENCY_SYMBOL, which is valid in Java, but invalid in Kotlin\n      case Character.LOWERCASE_LETTER,\n          Character.UPPERCASE_LETTER,\n          Character.MODIFIER_LETTER,\n          Character.OTHER_LETTER,\n          Character.TITLECASE_LETTER,\n          Character.LETTER_NUMBER,\n          Character.DECIMAL_DIGIT_NUMBER ->\n          true;\n      default -> codePoint == UNDERSCORE;\n    };\n  }\n\n  private static boolean isPunctuationOrSpacing(int category) {\n    return switch (category) {\n      // Punctuation\n      case Character.CONNECTOR_PUNCTUATION, // Pc\n          Character.DASH_PUNCTUATION, // Pd\n          Character.START_PUNCTUATION, // Ps\n          Character.END_PUNCTUATION, // Pe\n          Character.INITIAL_QUOTE_PUNCTUATION, // Pi\n          Character.FINAL_QUOTE_PUNCTUATION, // Pf\n          Character.OTHER_PUNCTUATION, // Po\n          // Spacing\n          Character.SPACE_SEPARATOR, // Zs\n          Character.LINE_SEPARATOR, // Zl\n          Character.PARAGRAPH_SEPARATOR -> // Zp\n          true;\n      default -> false;\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/CollectionUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\n\npublic final class CollectionUtils {\n  private static final float LOAD_FACTOR = 0.75f;\n\n  private CollectionUtils() {}\n\n  @TruffleBoundary\n  public static <T> HashSet<T> newHashSet() {\n    return new HashSet<>();\n  }\n\n  @TruffleBoundary\n  public static <T> HashSet<T> newHashSet(int expectedSize) {\n    return new HashSet<>((int) (expectedSize / LOAD_FACTOR) + 1, LOAD_FACTOR);\n  }\n\n  @TruffleBoundary\n  public static <T> LinkedHashSet<T> newLinkedHashSet(int expectedSize) {\n    return new LinkedHashSet<>((int) (expectedSize / LOAD_FACTOR) + 1, LOAD_FACTOR);\n  }\n\n  @TruffleBoundary\n  public static <K, V> HashMap<K, V> newHashMap(int expectedSize) {\n    return new HashMap<>((int) (expectedSize / LOAD_FACTOR) + 1, LOAD_FACTOR);\n  }\n\n  @TruffleBoundary\n  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(int expectedSize) {\n    return new LinkedHashMap<>((int) (expectedSize / LOAD_FACTOR) + 1, LOAD_FACTOR);\n  }\n\n  @TruffleBoundary\n  public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap(int expectedSize) {\n    return new ConcurrentHashMap<>((int) (expectedSize / LOAD_FACTOR) + 1, LOAD_FACTOR);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/DurationUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport org.pkl.core.DurationUnit;\n\npublic final class DurationUtils {\n  private DurationUtils() {}\n\n  public static String toPklString(double value, DurationUnit unit) {\n    return MathUtils.isMathematicalInteger(value) ? (long) value + \".\" + unit : value + \".\" + unit;\n  }\n\n  // see: https://standards.calconnect.org/csd/cc-18011.html#toc32\n  public static String toIsoString(double value, DurationUnit unit) {\n    // different rounding behavior from `VmDuration.convertValueTo()`\n    var totalSeconds = value * (unit.getNanos() / 1e9);\n\n    if (!Double.isFinite(totalSeconds)) {\n      throw new ArithmeticException(\n          \"Cannot convert Pkl duration `\"\n              + DurationUtils.toPklString(value, unit)\n              + \"` to ISO 8601 duration.\");\n    }\n\n    var absoluteSeconds = Math.abs(totalSeconds);\n    var hours = (long) (absoluteSeconds / 3600);\n    var minutes = (long) (absoluteSeconds / 60) % 60;\n    var seconds = (long) (absoluteSeconds % 60);\n    var nanos =\n        (long) (absoluteSeconds * 1_000_000_000 - Math.floor(absoluteSeconds) * 1_000_000_000);\n\n    var builder = new StringBuilder();\n\n    if (totalSeconds < 0.0) {\n      builder.append('-');\n    }\n\n    builder.append(\"PT\");\n\n    if (hours != 0) {\n      builder.append(hours);\n      builder.append('H');\n    }\n\n    if (minutes != 0) {\n      builder.append(minutes);\n      builder.append('M');\n    }\n\n    if (seconds != 0 || nanos != 0 || totalSeconds == 0) {\n      builder.append(seconds);\n      if (nanos != 0) {\n        builder.append('.');\n        var nanosString = String.valueOf(nanos);\n        builder.append(\"0\".repeat(9 - nanosString.length()));\n        for (int i = nanosString.length(); i >= 0; i--) {\n          if (nanosString.charAt(i - 1) != '0') {\n            nanosString = nanosString.substring(0, i);\n            break;\n          }\n        }\n        builder.append(nanosString);\n      }\n      builder.append('S');\n    }\n\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/EconomicMaps.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.util.Objects;\nimport java.util.function.BiFunction;\nimport org.graalvm.collections.EconomicMap;\nimport org.graalvm.collections.MapCursor;\nimport org.graalvm.collections.UnmodifiableEconomicMap;\nimport org.graalvm.collections.UnmodifiableMapCursor;\n\n/**\n * Puts {@link TruffleBoundary}s on {@link EconomicMap} methods and provides some added\n * functionality.\n */\npublic final class EconomicMaps {\n  private EconomicMaps() {}\n\n  public static <K, V> UnmodifiableEconomicMap<K, V> emptyMap() {\n    return EconomicMap.emptyMap();\n  }\n\n  @TruffleBoundary\n  public static <K, V> EconomicMap<K, V> create() {\n    return EconomicMap.create();\n  }\n\n  @TruffleBoundary\n  public static <K, V> EconomicMap<K, V> create(int initialSize) {\n    // for economic maps, size == capacity\n    return EconomicMap.create(initialSize);\n  }\n\n  @TruffleBoundary\n  public static <K, V> EconomicMap<K, V> of(K key, V value) {\n    var result = EconomicMap.<K, V>create(1);\n    result.put(key, value);\n    return result;\n  }\n\n  @TruffleBoundary\n  public static <K, V> EconomicMap<K, V> of(K key1, V value1, K key2, V value2) {\n    var result = EconomicMap.<K, V>create(2);\n    result.put(key1, value1);\n    result.put(key2, value2);\n    return result;\n  }\n\n  @TruffleBoundary\n  public static <K, V> EconomicMap<K, V> of(K key1, V value1, K key2, V value2, K key3, V value3) {\n    var result = EconomicMap.<K, V>create(3);\n    result.put(key1, value1);\n    result.put(key2, value2);\n    result.put(key3, value3);\n    return result;\n  }\n\n  @TruffleBoundary\n  public static <K, V> EconomicMap<K, V> of(\n      K key1, V value1, K key2, V value2, K key3, V value3, K key4, V value4) {\n    var result = EconomicMap.<K, V>create(4);\n    result.put(key1, value1);\n    result.put(key2, value2);\n    result.put(key3, value3);\n    result.put(key4, value4);\n    return result;\n  }\n\n  @TruffleBoundary\n  public static <K, V> @Nullable V get(UnmodifiableEconomicMap<K, V> self, K key) {\n    return self.get(key);\n  }\n\n  @TruffleBoundary\n  public static <K, V> @Nullable V get(UnmodifiableEconomicMap<K, V> self, K key, V defaultValue) {\n    return self.get(key, defaultValue);\n  }\n\n  @TruffleBoundary\n  public static <K, V> boolean containsKey(UnmodifiableEconomicMap<K, V> self, K key) {\n    return self.containsKey(key);\n  }\n\n  @TruffleBoundary\n  public static <K, V> int size(UnmodifiableEconomicMap<K, V> self) {\n    return self.size();\n  }\n\n  @TruffleBoundary\n  public static <K, V> boolean isEmpty(UnmodifiableEconomicMap<K, V> self) {\n    return self.isEmpty();\n  }\n\n  @TruffleBoundary\n  public static <K, V> Iterable<V> getValues(UnmodifiableEconomicMap<K, V> self) {\n    return self.getValues();\n  }\n\n  @TruffleBoundary\n  public static <K, V> Iterable<K> getKeys(UnmodifiableEconomicMap<K, V> self) {\n    return self.getKeys();\n  }\n\n  @TruffleBoundary\n  public static <K, V> UnmodifiableMapCursor<K, V> getEntries(UnmodifiableEconomicMap<K, V> self) {\n    return self.getEntries();\n  }\n\n  @TruffleBoundary\n  public static <K, V> @Nullable V put(EconomicMap<K, V> self, K key, @Nullable V value) {\n    return self.put(key, value);\n  }\n\n  @TruffleBoundary\n  public static <K, V> void putAll(EconomicMap<K, V> self, EconomicMap<K, V> other) {\n    self.putAll(other);\n  }\n\n  @TruffleBoundary\n  public static <K, V> void putAll(\n      EconomicMap<K, V> self, UnmodifiableEconomicMap<? extends K, ? extends V> other) {\n\n    self.putAll(other);\n  }\n\n  @TruffleBoundary\n  public static <K, V> void clear(EconomicMap<K, V> self) {\n    self.clear();\n  }\n\n  @TruffleBoundary\n  public static <K, V> V removeKey(EconomicMap<K, V> self, K key) {\n    return self.removeKey(key);\n  }\n\n  @TruffleBoundary\n  public static <K, V> MapCursor<K, V> getEntries(EconomicMap<K, V> self) {\n    return self.getEntries();\n  }\n\n  @TruffleBoundary\n  public static <K, V> void replaceAll(\n      EconomicMap<K, V> self, BiFunction<? super K, ? super V, ? extends V> function) {\n    self.replaceAll(function);\n  }\n\n  // inspired by java.util.AbstractMap#equals\n  @TruffleBoundary\n  @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n  public static boolean equals(UnmodifiableEconomicMap map1, UnmodifiableEconomicMap map2) {\n    if (map1 == map2) return true;\n\n    if (map1.size() != map2.size()) return false;\n\n    for (var cursor = map1.getEntries(); cursor.advance(); ) {\n      var key1 = cursor.getKey();\n      var value1 = cursor.getValue();\n      var value2 = map2.get(key1);\n      if (value2 == null) {\n        if (value1 != null || !map2.containsKey(key1)) return false;\n      } else {\n        if (!value2.equals(value1)) return false;\n      }\n    }\n\n    return true;\n  }\n\n  // inspired by java.util.AbstractMap#hashCode\n  @TruffleBoundary\n  public static int hashCode(UnmodifiableEconomicMap<?, ?> map) {\n    var result = 0;\n    for (var cursor = map.getEntries(); cursor.advance(); ) {\n      result += (cursor.getKey().hashCode() ^ Objects.hashCode(cursor.getValue()));\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/EconomicSets.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport org.graalvm.collections.EconomicSet;\n\npublic final class EconomicSets {\n  private EconomicSets() {}\n\n  @TruffleBoundary\n  public static <E> EconomicSet<E> create() {\n    return EconomicSet.create();\n  }\n\n  @TruffleBoundary\n  public static <E> boolean add(EconomicSet<E> self, E element) {\n    return self.add(element);\n  }\n\n  @TruffleBoundary\n  public static <E> boolean contains(EconomicSet<E> self, E element) {\n    return self.contains(element);\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/ErrorMessages.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.text.MessageFormat;\nimport java.util.Locale;\nimport java.util.ResourceBundle;\nimport java.util.stream.*;\n\npublic final class ErrorMessages {\n  private ErrorMessages() {}\n\n  public static String create(String messageName, Object... args) {\n    var locale = Locale.getDefault();\n    String errorMessage =\n        ResourceBundle.getBundle(\"org.pkl.core.errorMessages\", locale).getString(messageName);\n\n    // only format if `errorMessage` is a format string\n    if (args.length == 0) return errorMessage;\n\n    var formatter = new MessageFormat(errorMessage, locale);\n    return formatter.format(args);\n  }\n\n  public static String createIndented(String messageName, String indent, Object... args) {\n    return create(messageName, args)\n        .lines()\n        .map((msg) -> indent + msg)\n        .collect(Collectors.joining(\"\\n\"));\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/Exceptions.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\npublic final class Exceptions {\n  private Exceptions() {}\n\n  public static Throwable getRootCause(Throwable t) {\n    var result = t;\n    while (result.getCause() != null) {\n      result = result.getCause();\n    }\n    return result;\n  }\n\n  public static String getRootReason(Throwable t) {\n    var reason = getRootCause(t).getMessage();\n    if (reason == null || reason.isEmpty()) reason = \"(unknown reason)\";\n    return reason;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/GlobResolver.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.WeakHashMap;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.module.PathElement;\nimport org.pkl.core.runtime.ReaderBase;\n\npublic final class GlobResolver {\n  private GlobResolver() {}\n\n  public static final class InvalidGlobPatternException extends Exception {\n    public InvalidGlobPatternException(String message) {\n      super(message);\n    }\n  }\n\n  public record ResolvedGlobElement(String path, URI uri, boolean isDirectory) {\n    public ResolvedGlobElement(String path, URI uri, boolean isDirectory) {\n      this.path = path;\n      this.uri = uri.normalize();\n      this.isDirectory = isDirectory;\n    }\n  }\n\n  private static final char NULL = 0;\n\n  /**\n   * The maximum number of {@link ReaderBase#listElements(SecurityManager, URI)} calls to be made\n   * when resolving a glob pattern.\n   *\n   * <p>The intention is to prevent malicious programs from running, c.f. CVE-2010-2632. Otherwise,\n   * a complex glob pattern can starve CPU/memory on a host.\n   *\n   * <p>Glob limit value taken from <a\n   * href=\"https://github.com/openbsd/src/commit/46df4fe576b7\">https://github.com/openbsd/src/commit/46df4fe576b7</a>.\n   *\n   * <p>If test mode is enabled, a smaller value is used. This greatly speeds up the test that\n   * verifies enforcement of the limit (invalidGlobImport6.pkl).\n   *\n   * <p>Not a static field to prevent compile-time evaluation by native-image.\n   */\n  private static int maxListElements() {\n    return IoUtils.isTestMode() ? 512 : 16384;\n  }\n\n  private static final Map<String, Pattern> patterns =\n      Collections.synchronizedMap(new WeakHashMap<>());\n\n  private static char getNextChar(String pattern, int i) {\n    if (i >= pattern.length() - 1) {\n      return NULL;\n    }\n    return pattern.charAt(i + 1);\n  }\n\n  private static int consumeCharacterClass(String globPattern, int idx, StringBuilder sb)\n      throws InvalidGlobPatternException {\n    // don't match path separators\n    sb.append(\"[[^/]&&[\");\n    var i = idx;\n    switch (getNextChar(globPattern, i)) {\n      case '^' -> {\n        // verbatim; escape\n        sb.append(\"\\\\^\");\n        i++;\n      }\n      case '!' -> {\n        // negation\n        sb.append(\"^\");\n        i++;\n      }\n      case ']' -> {\n        // the first `]` in a character class is verbatim and not treated as a closing delimiter.\n        sb.append(']');\n        i++;\n      }\n      case NULL ->\n          throw new InvalidGlobPatternException(\n              ErrorMessages.create(\"invalidGlobMissingCharacterClassTerminator\"));\n    }\n    i++;\n    var current = globPattern.charAt(i);\n    while (current != ']') {\n      if (current == '[') {\n        var next = getNextChar(globPattern, i);\n        if (next == ':' || next == '=' || next == '.') {\n          throw new InvalidGlobPatternException(\n              ErrorMessages.create(\"invalidGlobUnsupportedFeature\"));\n        }\n      }\n      if (current == '/') {\n        throw new InvalidGlobPatternException(\n            ErrorMessages.create(\"invalidGlobInvalidCharacterInCharacterClass\", current));\n      } else if (current == '\\\\') {\n        sb.append(\"\\\\\\\\\");\n      } else {\n        sb.append(current);\n      }\n      i++;\n      if (i == globPattern.length()) {\n        throw new InvalidGlobPatternException(\n            ErrorMessages.create(\"invalidGlobMissingCharacterClassTerminator\"));\n      }\n      current = globPattern.charAt(i);\n    }\n    sb.append(\"]]\");\n    return i;\n  }\n\n  public static Pattern toRegexPattern(String globPattern) throws InvalidGlobPatternException {\n    var pattern = patterns.get(globPattern);\n    if (pattern == null) {\n      pattern = Pattern.compile(toRegexString(globPattern));\n      patterns.put(globPattern, pattern);\n    }\n    return pattern;\n  }\n\n  /** Converts a glob pattern to an equivalent regular expression pattern */\n  public static String toRegexString(String globPattern) throws InvalidGlobPatternException {\n    var sb = new StringBuilder(\"^\");\n    var inGroup = false;\n\n    for (var i = 0; i < globPattern.length(); i++) {\n      var current = globPattern.charAt(i);\n      switch (current) {\n        case '{' -> {\n          if (inGroup) {\n            throw new InvalidGlobPatternException(\n                ErrorMessages.create(\"invalidGlobNestedSubpattern\"));\n          }\n          inGroup = true;\n          sb.append(\"(?:(?:\");\n        }\n        case '}' -> {\n          if (inGroup) {\n            inGroup = false;\n            sb.append(\"))\");\n          } else {\n            sb.append('}');\n          }\n        }\n        case ',' -> {\n          if (inGroup) {\n            sb.append(\")|(?:\");\n          } else {\n            sb.append(',');\n          }\n        }\n        case '\\\\' -> {\n          var next = getNextChar(globPattern, i);\n          if (next == NULL) {\n            throw new InvalidGlobPatternException(\n                ErrorMessages.create(\"invalidGlobInvalidTerminatingCharacter\"));\n          }\n          if (next != '?' && next != '*' && next != '[' && next != '{' && next != '\\\\') {\n            throw new InvalidGlobPatternException(\n                ErrorMessages.create(\"invalidGlobInvalidEscapeCharacter\", next));\n          }\n          sb.append('\\\\').append(next);\n          i++;\n        }\n        case '[' -> i = consumeCharacterClass(globPattern, i, sb);\n        case '?' -> {\n          var next = getNextChar(globPattern, i);\n          if (next == '(') {\n            throw new InvalidGlobPatternException(ErrorMessages.create(\"invalidGlobExtGlob\"));\n          }\n          sb.append(\".\");\n        }\n        case '*' -> {\n          var next = getNextChar(globPattern, i);\n          if (next == '(') {\n            throw new InvalidGlobPatternException(ErrorMessages.create(\"invalidGlobExtGlob\"));\n          } else if (next == '*') {\n            // globstar, crosses directory boundaries\n            sb.append(\".*\");\n            i++;\n          } else {\n            // single wildcard matches everything up until the next directory character\n            sb.append(\"[^/]*\");\n          }\n        }\n        case '+', '@' -> {\n          var next = getNextChar(globPattern, i);\n          if (next == '(') {\n            throw new InvalidGlobPatternException(ErrorMessages.create(\"invalidGlobExtGlob\"));\n          }\n          sb.append(\"\\\\+\");\n        }\n        case '!' -> {\n          var next = getNextChar(globPattern, i);\n          if (next == '(') {\n            throw new InvalidGlobPatternException(ErrorMessages.create(\"invalidGlobExtGlob\"));\n          }\n          sb.append(\"!\");\n        }\n\n        // no special meaning in glob patterns but have special meaning in regex.\n        case '.', '(', '%', '^', '$', '|' -> sb.append(\"\\\\\").append(current);\n        default -> sb.append(current);\n      }\n    }\n    if (inGroup) {\n      throw new InvalidGlobPatternException(\"invalidGlobUnclosedSubpattern\");\n    }\n    return sb.append(\"$\").toString();\n  }\n\n  private static void resolveOpaqueGlob(\n      SecurityManager securityManager,\n      ReaderBase reader,\n      URI globUri,\n      Pattern pattern,\n      Map<String, ResolvedGlobElement> result)\n      throws IOException, SecurityManagerException, ExternalReaderProcessException {\n    var elements = reader.listElements(securityManager, globUri);\n    for (var elem : sorted(elements)) {\n      URI resolvedUri;\n      try {\n        resolvedUri = new URI(globUri.getScheme(), elem.getName(), null);\n      } catch (URISyntaxException e) {\n        throw new IllegalArgumentException(e.getMessage(), e);\n      }\n      if (pattern.matcher(resolvedUri.toString()).matches()) {\n        var path = resolvedUri.toString();\n        result.put(path, new ResolvedGlobElement(path, resolvedUri, false));\n      }\n    }\n  }\n\n  private static List<PathElement> sorted(List<PathElement> elements) {\n    return elements.stream().sorted(PathElement.comparator).collect(Collectors.toList());\n  }\n\n  private static Boolean isRegularPathPart(String pathPart) {\n    for (var i = 0; i < pathPart.length(); i++) {\n      var c = pathPart.charAt(i);\n      if (c == '\\\\' || c == '{' || c == '[' || c == '?' || c == '*') {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  private static String resolvePath(String basePath, String path, boolean hasAbsoluteGlob) {\n    if (basePath.isEmpty()) {\n      return path;\n    } else {\n      if (hasAbsoluteGlob) {\n        try {\n          path = new URI(null, null, path, null).toString();\n        } catch (URISyntaxException e) {\n          throw new IllegalArgumentException(e);\n        }\n      }\n      if (basePath.endsWith(\"/\")) {\n        return basePath + path;\n      } else {\n        return basePath + \"/\" + path;\n      }\n    }\n  }\n\n  private static List<ResolvedGlobElement> expandHierarchicalGlobPart(\n      SecurityManager securityManager,\n      ReaderBase reader,\n      String basePath,\n      Pattern globPartPattern,\n      URI baseUri,\n      boolean isGlobStar,\n      boolean hasAbsoluteGlob,\n      MutableLong listElementCallCount)\n      throws IOException,\n          SecurityManagerException,\n          InvalidGlobPatternException,\n          ExternalReaderProcessException {\n    var result = new ArrayList<ResolvedGlobElement>();\n    doExpandHierarchicalGlobPart(\n        securityManager,\n        reader,\n        basePath,\n        globPartPattern,\n        baseUri,\n        isGlobStar,\n        hasAbsoluteGlob,\n        listElementCallCount,\n        result);\n    return result;\n  }\n\n  private static void doExpandHierarchicalGlobPart(\n      SecurityManager securityManager,\n      ReaderBase reader,\n      String expandedGlobSoFar,\n      Pattern globPartPattern,\n      URI baseUri,\n      boolean isGlobStar,\n      boolean hasAbsoluteGlob,\n      MutableLong listElementCallCount,\n      List<ResolvedGlobElement> result)\n      throws IOException,\n          SecurityManagerException,\n          InvalidGlobPatternException,\n          ExternalReaderProcessException {\n\n    if (listElementCallCount.getAndIncrement() > maxListElements()) {\n      throw new InvalidGlobPatternException(ErrorMessages.create(\"invalidGlobTooComplex\"));\n    }\n    var elements = reader.listElements(securityManager, baseUri);\n    for (var element : sorted(elements)) {\n      var elementPath = resolvePath(expandedGlobSoFar, element.getName(), hasAbsoluteGlob);\n      if (globPartPattern.matcher(element.getName()).matches()) {\n        var name = element.isDirectory() ? element.getName() + \"/\" : element.getName();\n        var elementUri = IoUtils.resolve(reader, baseUri, name);\n        result.add(new ResolvedGlobElement(elementPath, elementUri, element.isDirectory()));\n      }\n      if (element.isDirectory() && isGlobStar) {\n        var elementUri = IoUtils.resolve(reader, baseUri, element.getName() + \"/\");\n        var newExpandedGlobPattern =\n            resolvePath(expandedGlobSoFar, element.getName(), hasAbsoluteGlob);\n        doExpandHierarchicalGlobPart(\n            securityManager,\n            reader,\n            newExpandedGlobPattern,\n            globPartPattern,\n            elementUri,\n            true,\n            hasAbsoluteGlob,\n            listElementCallCount,\n            result);\n      }\n    }\n  }\n\n  private static void resolveHierarchicalGlob(\n      SecurityManager securityManager,\n      ReaderBase reader,\n      String[] globPatternParts,\n      int idx,\n      URI baseUri,\n      String expandedGlobPatternSoFar,\n      boolean hasAbsoluteGlob,\n      Map<String, ResolvedGlobElement> result,\n      MutableLong listElementCallCount)\n      throws IOException,\n          SecurityManagerException,\n          InvalidGlobPatternException,\n          ExternalReaderProcessException {\n    var isLeaf = idx == globPatternParts.length - 1;\n    var patternPart = globPatternParts[idx];\n    if (isRegularPathPart(patternPart)) {\n      var newPath = resolvePath(expandedGlobPatternSoFar, patternPart, hasAbsoluteGlob);\n      if (isLeaf) {\n        var newBaseUri = IoUtils.resolve(reader, baseUri, patternPart);\n        if (reader.hasElement(securityManager, newBaseUri)) {\n          // Note: isDirectory is not meaningful here. Setting it to false is a way to skip setting\n          // it.\n          result.put(newPath, new ResolvedGlobElement(newPath, newBaseUri, false));\n        }\n      } else {\n        var newBaseUri = IoUtils.resolve(reader, baseUri, patternPart + \"/\");\n        resolveHierarchicalGlob(\n            securityManager,\n            reader,\n            globPatternParts,\n            idx + 1,\n            newBaseUri,\n            newPath,\n            hasAbsoluteGlob,\n            result,\n            listElementCallCount);\n      }\n    } else {\n      var globPartPattern = toRegexPattern(patternPart);\n      var isGlobStar = patternPart.contains(\"**\");\n      var matchedElements =\n          expandHierarchicalGlobPart(\n              securityManager,\n              reader,\n              expandedGlobPatternSoFar,\n              globPartPattern,\n              baseUri,\n              isGlobStar,\n              hasAbsoluteGlob,\n              listElementCallCount);\n      for (var element : matchedElements) {\n        if (isLeaf) {\n          result.put(element.path(), element);\n        } else if (element.isDirectory()) {\n          resolveHierarchicalGlob(\n              securityManager,\n              reader,\n              globPatternParts,\n              idx + 1,\n              element.uri(),\n              element.path(),\n              hasAbsoluteGlob,\n              result,\n              listElementCallCount);\n        }\n      }\n    }\n  }\n\n  /** Split a glob pattern into the base, non-wildcard parts, and the wildcard parts. */\n  private static Pair<String, String[]> splitGlobPatternIntoBaseAndWildcards(\n      ReaderBase reader, String globPattern, boolean hasAbsoluteGlob)\n      throws InvalidGlobPatternException {\n    var effectiveGlobPattern = globPattern;\n    var basePathSb = new StringBuilder();\n    if (hasAbsoluteGlob) {\n      var globUri = URI.create(globPattern);\n      if (reader.hasFragmentPaths()) {\n        effectiveGlobPattern = globUri.getFragment();\n        basePathSb.append(IoUtils.stripFragment(globUri)).append('#');\n      } else {\n        effectiveGlobPattern = globUri.getPath();\n        if (effectiveGlobPattern == null) {\n          throw new InvalidGlobPatternException(\n              ErrorMessages.create(\"invalidGlobNonHierarchicalUri\", globUri.getScheme()));\n        }\n        basePathSb.append(globUri.getScheme()).append(':');\n      }\n    }\n    var parts = effectiveGlobPattern.split(\"/\");\n    int i;\n\n    for (i = 0; i < parts.length; i++) {\n      var part = parts[i];\n      if (!isRegularPathPart(part)) {\n        break;\n      }\n      basePathSb.append(part).append('/');\n    }\n    return Pair.of(basePathSb.toString(), Arrays.copyOfRange(parts, i, parts.length));\n  }\n\n  /**\n   * Resolves a glob expression.\n   *\n   * <p>Each pair is the expanded form of the glob pattern, paired with its resolved absolute URI.\n   *\n   * <p>globPattern must be absolute if enclosing module details are null.\n   */\n  @TruffleBoundary\n  public static Map<String, ResolvedGlobElement> resolveGlob(\n      SecurityManager securityManager,\n      ReaderBase reader,\n      @Nullable ModuleKey enclosingModuleKey,\n      @Nullable URI enclosingUri,\n      String globPattern)\n      throws IOException,\n          SecurityManagerException,\n          InvalidGlobPatternException,\n          ExternalReaderProcessException {\n\n    var result = new LinkedHashMap<String, ResolvedGlobElement>();\n    var hasAbsoluteGlob = globPattern.matches(\"\\\\w+:.*\");\n    if ((enclosingModuleKey == null || enclosingUri == null) && !hasAbsoluteGlob) {\n      throw new PklBugException(\n          \"GlobResolver.resolveGlob() callers must check that the glob pattern is absolute if calling with null enclosing module info\");\n    }\n\n    if (reader.hasHierarchicalUris()) {\n      var splitPattern = splitGlobPatternIntoBaseAndWildcards(reader, globPattern, hasAbsoluteGlob);\n      var basePath = splitPattern.first;\n      var globParts = splitPattern.second;\n      // short-circuit for glob pattern with no wildcards (can only match 0 or 1 element)\n      if (globParts.length == 0) {\n        var resolvedUri =\n            enclosingUri == null\n                ? URI.create(globPattern)\n                : IoUtils.resolve(reader, enclosingUri, globPattern);\n        if (reader.hasElement(securityManager, resolvedUri)) {\n          result.put(globPattern, new ResolvedGlobElement(globPattern, resolvedUri, true));\n        }\n        return result;\n      }\n      URI baseUri;\n      try {\n        baseUri =\n            enclosingModuleKey == null\n                ? URI.create(basePath)\n                : IoUtils.resolve(securityManager, enclosingModuleKey, URI.create(basePath));\n      } catch (URISyntaxException e) {\n        // assertion: this is only thrown if the pattern starts with a triple-dot import.\n        // the language will throw an error if glob imports is combined with triple-dots.\n        throw new PklBugException(e);\n      }\n\n      resolveHierarchicalGlob(\n          securityManager,\n          reader,\n          globParts,\n          0,\n          baseUri,\n          basePath,\n          hasAbsoluteGlob,\n          result,\n          new MutableLong(0));\n    } else {\n      var regexPattern = toRegexPattern(globPattern);\n      // using \"dummy\" to make this a legitimate URI. The scheme specific part of the URI should be\n      // ignored by the reader.\n      var globUri =\n          hasAbsoluteGlob\n              ? URI.create(globPattern)\n              : URI.create(enclosingUri.getScheme() + \":dummy\");\n      resolveOpaqueGlob(securityManager, reader, globUri, regexPattern, result);\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/HttpUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.net.http.HttpResponse;\nimport org.pkl.core.PklBugException;\n\npublic final class HttpUtils {\n  private HttpUtils() {}\n\n  public static boolean isHttpUrl(URL url) {\n    var protocol = url.getProtocol();\n    return \"https\".equalsIgnoreCase(protocol) || \"http\".equalsIgnoreCase(protocol);\n  }\n\n  public static boolean isHttpUrl(URI uri) {\n    var scheme = uri.getScheme();\n    return \"https\".equalsIgnoreCase(scheme) || \"http\".equalsIgnoreCase(scheme);\n  }\n\n  public static void checkHasStatusCode200(HttpResponse<?> response) throws IOException {\n    if (response.statusCode() == 200) return;\n\n    var body = response.body();\n    if (body instanceof AutoCloseable closeable) {\n      try {\n        closeable.close();\n      } catch (Exception ignored) {\n      }\n    }\n\n    throw new IOException(\n        ErrorMessages.create(\"badHttpStatusCode\", response.statusCode(), response.uri()));\n  }\n\n  public static URI setPort(URI uri, int port) {\n    if (port < 0 || port > 65535) {\n      throw new IllegalArgumentException(String.valueOf(port));\n    }\n    try {\n      return new URI(\n          uri.getScheme(),\n          uri.getUserInfo(),\n          uri.getHost(),\n          port,\n          uri.getPath(),\n          uri.getQuery(),\n          uri.getFragment());\n    } catch (URISyntaxException e) {\n      throw PklBugException.unreachableCode(); // only port changed\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/ImportGraphUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.pkl.core.ImportGraph;\n\npublic class ImportGraphUtils {\n\n  private ImportGraphUtils() {}\n\n  /** Find import cycles inside the graph. */\n  public static List<List<URI>> findImportCycles(ImportGraph importGraph) {\n    var res = new ArrayList<List<URI>>();\n    for (var uri : importGraph.imports().keySet()) {\n      if (res.stream().anyMatch((it) -> it.contains(uri))) {\n        continue;\n      }\n      var cycle = doFindCycle(uri, importGraph, new ArrayList<>(List.of(uri)));\n      if (cycle != null) {\n        res.add(cycle);\n      }\n    }\n    return res;\n  }\n\n  private static @Nullable List<URI> doFindCycle(\n      URI currentUri, ImportGraph importGraph, List<URI> path) {\n    var imports = importGraph.imports().get(currentUri);\n    var startingUri = path.get(0);\n    for (var imprt : imports) {\n      var uri = imprt.uri();\n      if (uri.equals(startingUri)) {\n        return path;\n      }\n      if (path.contains(uri)) {\n        // there is a cycle, but it doesn't start at `startUri`\n        return null;\n      }\n      path.add(uri);\n      var cycle = doFindCycle(uri, importGraph, path);\n      if (cycle != null) {\n        return cycle;\n      }\n      path.remove(path.size() - 1);\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/IoUtils.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.TruffleOptions;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.Reader;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.FileSystemNotFoundException;\nimport java.nio.file.FileVisitResult;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.SimpleFileVisitor;\nimport java.nio.file.attribute.BasicFileAttributes;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipOutputStream;\nimport org.pkl.core.PklBugException;\nimport org.pkl.core.Platform;\nimport org.pkl.core.SecurityManager;\nimport org.pkl.core.SecurityManagerException;\nimport org.pkl.core.externalreader.ExternalReaderProcessException;\nimport org.pkl.core.module.ModuleKey;\nimport org.pkl.core.packages.PackageLoadError;\nimport org.pkl.core.runtime.ReaderBase;\nimport org.pkl.core.runtime.VmContext;\nimport org.pkl.core.runtime.VmExceptionBuilder;\n\npublic final class IoUtils {\n\n  // Don't match paths like `C:\\`, which are drive letters on Windows.\n  private static final Pattern uriLike = Pattern.compile(\"[\\\\w+.-]+:[^\\\\\\\\].*\");\n\n  private static final Pattern windowsPathLike = Pattern.compile(\"\\\\w:\\\\\\\\.*\");\n\n  private IoUtils() {}\n\n  public static URL toUrl(URI uri) throws IOException {\n    try {\n      return uri.toURL();\n    } catch (Error e) {\n      // best we can do for now\n      // rely on caller to provide context, e.g., the requested module URI\n      if (e.getClass().getName().equals(\"com.oracle.svm.core.jdk.UnsupportedFeatureError\")) {\n        throw new IOException(\"Unsupported protocol: \" + uri.getScheme());\n      }\n\n      throw e;\n    }\n  }\n\n  /** Checks whether the given string is \"URI-like\", i.e. matches a pattern like {@code foo:bar}. */\n  public static boolean isUriLike(String str) {\n    return uriLike.matcher(str).matches();\n  }\n\n  public static boolean isWindowsAbsolutePath(String str) {\n    if (!isWindows()) return false;\n    return windowsPathLike.matcher(str).matches();\n  }\n\n  /**\n   * Converts the given string to a {@link URI}. This method MUST be used for constructing module\n   * and resource URIs. Unlike {@code new URI(str)}, it correctly escapes paths of relative URIs.\n   */\n  public static URI toUri(String str) throws URISyntaxException {\n    if (isUriLike(str)) {\n      return new URI(str);\n    }\n    return new URI(null, null, str, null);\n  }\n\n  /** Converts a URI to a Path, normalizing any non-ASCII characters. */\n  public static Path pathOf(URI uri) {\n    // Path.of(URI) throws on non-ASCII characters so the module URI here must be normalized to\n    // ASCII\n    // Unfortunately there's no way to go from URI -> ASCII URI directly\n    // so this must transform URI -> ASCII String -> ASCII URI\n    try {\n      return Path.of(new URI(uri.toASCIIString()));\n    } catch (URISyntaxException e) {\n      // impossible to get here; we started from a valid URI to begin with\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  /** Like {@link #toUri(String)}, except without checked exceptions. */\n  public static URI createUri(String str) {\n    try {\n      return toUri(str);\n    } catch (URISyntaxException e) {\n      throw new IllegalArgumentException(e.getMessage(), e);\n    }\n  }\n\n  public static URI stripFragment(URI uri) {\n    try {\n      return new URI(\n          uri.getScheme(),\n          uri.getUserInfo(),\n          uri.getHost(),\n          uri.getPort(),\n          uri.getPath(),\n          uri.getQuery(),\n          null);\n    } catch (URISyntaxException e) {\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  public static String readString(URL url) throws IOException {\n    if (HttpUtils.isHttpUrl(url)) {\n      throw new IllegalArgumentException(\"Should use HTTP client to GET \" + url);\n    }\n    try (var stream = url.openStream()) {\n      return readString(stream);\n    }\n  }\n\n  public static String readString(InputStream inputStream) throws IOException {\n    return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);\n  }\n\n  public static byte[] readBytes(URI uri) throws IOException {\n    if (HttpUtils.isHttpUrl(uri)) {\n      throw new IllegalArgumentException(\"Should use HTTP client to GET \" + uri);\n    }\n    try (var stream = IoUtils.toUrl(uri).openStream()) {\n      return stream.readAllBytes();\n    }\n  }\n\n  public static String readString(Reader reader) throws IOException {\n    var builder = new StringBuilder();\n    var bytesRead = 0;\n    var buffer = new char[8 * 1024];\n    while ((bytesRead = reader.read(buffer, 0, buffer.length)) != -1) {\n      builder.append(buffer, 0, bytesRead);\n    }\n    return builder.toString();\n  }\n\n  public static String readClassPathResourceAsString(Class<?> clazz, String path)\n      throws IOException {\n    // use Class.getResourceAsStream() instead of ClassLoader.getResourceAsStream()\n    // because AOT doesn't support class loaders\n    var inputStream = clazz.getResourceAsStream(path);\n    if (inputStream == null) {\n      throw new IOException(String.format(\"Cannot find class path resource `%s`.\", path));\n    }\n    try (inputStream) {\n      return readString(inputStream);\n    }\n  }\n\n  public static void zipDirectory(Path sourceDir, Path targetFile) throws IOException {\n    try (var zipStream = new ZipOutputStream(Files.newOutputStream(targetFile))) {\n      Files.walkFileTree(\n          sourceDir,\n          new SimpleFileVisitor<>() {\n            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)\n                throws IOException {\n              var relativePath = relativize(file, sourceDir);\n              zipStream.putNextEntry(new ZipEntry(toNormalizedPathString(relativePath)));\n              Files.copy(file, zipStream);\n              zipStream.closeEntry();\n              return FileVisitResult.CONTINUE;\n            }\n          });\n    }\n  }\n\n  // not stored to avoid build-time initialization by native-image\n  public static Path getCurrentWorkingDir() {\n    return Path.of(System.getProperty(\"user.dir\"));\n  }\n\n  // not stored to avoid build-time initialization by native-image\n  public static Path getPklHomeDir() {\n    return Path.of(System.getProperty(\"user.home\"), \".pkl\");\n  }\n\n  // not stored to avoid build-time initialization by native-image\n  public static Path getDefaultModuleCacheDir() {\n    return getPklHomeDir().resolve(\"cache\");\n  }\n\n  // not stored to avoid build-time initialization by native-image\n  @SuppressWarnings(\"SystemGetProperty\")\n  public static String getLineSeparator() {\n    return System.getProperty(\"line.separator\");\n  }\n\n  public static Boolean isWindows() {\n    return Platform.current().operatingSystem().name().equals(\"Windows\");\n  }\n\n  public static String getName(String path) {\n    var lastSep = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\\\'));\n    return path.substring(lastSep + 1);\n  }\n\n  public static String getName(Path path) {\n    return getName(path.toString());\n  }\n\n  public static String getNameWithoutExtension(String path) {\n    var lastSep = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\\\'));\n    var lastDot = path.lastIndexOf('.');\n    return lastDot == -1 || lastDot < lastSep\n        ? path.substring(lastSep + 1)\n        : path.substring(lastSep + 1, lastDot);\n  }\n\n  public static String takeLastSegment(String name, char separator) {\n    var lastSep = name.lastIndexOf(separator);\n    return name.substring(lastSep + 1);\n  }\n\n  public static String dropLastSegment(String name, char separator) {\n    var lastSep = name.lastIndexOf(separator);\n    return lastSep == -1 ? name : name.substring(0, lastSep);\n  }\n\n  public static @Nullable Path toPath(URI uri) {\n    if (!uri.isAbsolute()) {\n      throw new IllegalArgumentException(\"Expected absolute URI, but got: \" + uri);\n    }\n\n    try {\n      return Path.of(uri);\n    } catch (IllegalArgumentException | FileSystemNotFoundException e) {\n      return null;\n    }\n  }\n\n  private static String doInferModuleName(URI moduleUri) {\n    var path = moduleUri.getPath();\n    if (path == null) { // equivalent to `URI.isOpaque()`\n      // convention: take last segment of dot-separated name\n      // after stripping any colon-separated version number\n      return takeLastSegment(dropLastSegment(moduleUri.getSchemeSpecificPart(), ':'), '.');\n    }\n    return getNameWithoutExtension(path);\n  }\n\n  public static String inferModuleName(ModuleKey moduleKey) {\n    var moduleUri = moduleKey.getUri();\n    if (\"jar\".equalsIgnoreCase(moduleUri.getScheme())) {\n      var uriString = moduleUri.toString();\n      var index = getExclamationMarkIndex(uriString);\n      var path = uriString.substring(index + 1);\n\n      return getNameWithoutExtension(path);\n    }\n\n    if (moduleKey.hasFragmentPaths()) {\n      var fragment = moduleUri.getFragment();\n      return getNameWithoutExtension(fragment);\n    }\n\n    return doInferModuleName(moduleUri);\n  }\n\n  public static URI ensurePathEndsWithSlash(URI uri) {\n    try {\n      // opaque uris don't have a path\n      if (uri.isOpaque()) return uri;\n\n      // nothing to do\n      if (uri.getPath().endsWith(\"/\")) return uri;\n\n      return new URI(\n          uri.getScheme(),\n          uri.getUserInfo(),\n          uri.getHost(),\n          uri.getPort(),\n          uri.getPath() + '/',\n          uri.getQuery(),\n          uri.getFragment());\n    } catch (URISyntaxException e) {\n      // adding a trailing slash should never cause this exception\n      throw new AssertionError(e);\n    }\n  }\n\n  public static URI resolve(ReaderBase reader, URI baseUri, String importUri) {\n    return resolve(reader, baseUri, createUri(importUri));\n  }\n\n  public static URI resolve(ReaderBase reader, URI baseUri, URI importUri) {\n    if (reader.hasFragmentPaths() && !importUri.isAbsolute() && importUri.getPath() != null) {\n      var fragment = baseUri.getFragment();\n      var newFragment = resolve(createUri(fragment), importUri);\n      return stripFragment(baseUri).resolve(\"#\" + newFragment);\n    }\n    return resolve(baseUri, importUri);\n  }\n\n  private static URI resolveTripleDotImport(\n      SecurityManager securityManager, ModuleKey moduleKey, String tripleDotPath)\n      throws IOException, SecurityManagerException, ExternalReaderProcessException {\n    var moduleKeyUri = moduleKey.getUri();\n    if (!moduleKey.isLocal() || !moduleKey.hasHierarchicalUris()) {\n      throw new VmExceptionBuilder()\n          .evalError(\"cannotResolveTripleDotImports\", moduleKeyUri)\n          .build();\n    }\n    var currentPath =\n        moduleKey.hasFragmentPaths() ? moduleKeyUri.getFragment() : moduleKeyUri.getPath();\n    var effectiveImportPath =\n        tripleDotPath.isEmpty()\n            ? currentPath.substring(currentPath.lastIndexOf('/') + 1)\n            : tripleDotPath;\n\n    var index = currentPath.lastIndexOf('/');\n    index = currentPath.lastIndexOf('/', index - 1);\n    var basePath = currentPath;\n    while (index > 0) {\n      basePath = basePath.substring(0, index + 1);\n      var candidatePath = basePath + effectiveImportPath;\n      // make sure triple-dot cannot resolve to the same path.\n      var candidateUri = resolve(moduleKey, moduleKeyUri, candidatePath);\n      if (!candidatePath.equals(currentPath)\n          && moduleKey.hasElement(securityManager, candidateUri)) {\n        return fixTripleSlashUri(moduleKeyUri, candidateUri);\n      }\n      index = basePath.lastIndexOf('/', index - 1);\n    }\n    var candidatePath = '/' + effectiveImportPath;\n    var candidateUri = resolve(moduleKey, moduleKeyUri, candidatePath);\n    if (!candidatePath.equals(currentPath) && moduleKey.hasElement(securityManager, candidateUri)) {\n      return fixTripleSlashUri(moduleKeyUri, candidateUri);\n    }\n    throw new FileNotFoundException();\n  }\n\n  public static Pair<String, String> parseDependencyNotation(String importPath) {\n    var idx = importPath.indexOf('/');\n    if (idx == -1) {\n      // treat named dependency without a subpath as the root path.\n      // i.e. resolve to `@foo` to `package://example.com/foo@1.0.0#/`\n      return Pair.of(importPath.substring(1), \"/\");\n    }\n    return Pair.of(importPath.substring(1, idx), importPath.substring(idx));\n  }\n\n  private static URI resolveProjectDependency(ModuleKey moduleKey, String notation)\n      throws IOException, ExternalReaderProcessException {\n    var parsed = parseDependencyNotation(notation);\n    var name = parsed.getFirst();\n    var path = parsed.getSecond();\n    var projectDependenciesManager = VmContext.get(null).getProjectDependenciesManager();\n    if (!moduleKey.hasHierarchicalUris() && projectDependenciesManager != null) {\n      throw new PackageLoadError(\n          \"cannotResolveDependencyWithoutHierarchicalUris\",\n          projectDependenciesManager.getProjectFileUri());\n    }\n    if (projectDependenciesManager == null\n        || !projectDependenciesManager.hasUri(moduleKey.getUri())) {\n      throw new PackageLoadError(\"cannotResolveDependencyNoProject\");\n    }\n    var dependency = projectDependenciesManager.getDependencies().get(name);\n    if (dependency != null) {\n      return dependency.getPackageUri().toPackageAssetUri(path).getUri();\n    }\n    throw new PackageLoadError(\"cannotFindDependencyInProject\", name);\n  }\n\n  /**\n   * Resolves {@code importUri} against the module key.\n   *\n   * <p>When {@code importUri} contains a triple-dot, it is resolved if the module key returns true\n   * for both {@link ModuleKey#isLocal()} and {@link ModuleKey#hasHierarchicalUris()}. Otherwise, an\n   * error is thrown.\n   *\n   * <p>When {@code importUri} starts with a {@code @}, it is resolved if the module key supports\n   * dependency notation ()\n   */\n  public static URI resolve(SecurityManager securityManager, ModuleKey moduleKey, URI importUri)\n      throws URISyntaxException,\n          IOException,\n          SecurityManagerException,\n          ExternalReaderProcessException {\n    if (importUri.isAbsolute()) {\n      return moduleKey.resolveUri(importUri);\n    }\n    var tripleDotPath = parseTripleDotPath(importUri);\n    if (tripleDotPath != null) {\n      return resolveTripleDotImport(securityManager, moduleKey, tripleDotPath);\n    }\n    var moduleScheme = moduleKey.getUri().getScheme();\n    var isPackage =\n        moduleScheme.equalsIgnoreCase(\"package\") || moduleScheme.equalsIgnoreCase(\"projectpackage\");\n    var relativePart = importUri.getSchemeSpecificPart();\n    // Special-case handling of project dependencies.\n    // We'll allow the Package and ProjectPackage module keys to resolve dependency notation on\n    // their own.\n    if (relativePart.startsWith(\"@\") && !isPackage) {\n      return resolveProjectDependency(moduleKey, relativePart);\n    }\n    return moduleKey.resolveUri(importUri);\n  }\n\n  public static URI resolve(URI baseUri, URI newUri) {\n    if (newUri.isAbsolute()) return newUri;\n\n    var scheme = baseUri.getScheme();\n\n    // Support resolving relative URI against base URI\n    // of the form \"jar:file:///some/archive.zip!/foo/bar.pkl\".\n    // See: https://bugs.openjdk.java.net/browse/JDK-8020755\n    if (\"jar\".equalsIgnoreCase(scheme)) {\n      var baseUriString = baseUri.toString();\n      var index = getExclamationMarkIndex(baseUriString);\n      var jarUri = baseUriString.substring(0, index + 1);\n      var jarPath = baseUriString.substring(index + 1);\n      var resolvedPath = resolve(URI.create(jarPath), newUri);\n      return URI.create(jarUri + resolvedPath);\n    }\n\n    return fixTripleSlashUri(baseUri, baseUri.resolve(newUri));\n  }\n\n  public static URI resolve(URI uri, String str) {\n    try {\n      return resolve(uri, toUri(str));\n    } catch (URISyntaxException e) {\n      throw new IllegalArgumentException(e.getMessage(), e);\n    }\n  }\n\n  // URI.relativize won't construct relative paths containing `..`.\n  // Can't use Path.relativize because certain URI characters will throw InvalidPathException\n  // on Windows.\n  public static URI relativize(URI uri, URI base) {\n    if (uri.isOpaque()\n        || base.isOpaque()\n        || !Objects.equals(uri.getScheme(), base.getScheme())\n        || !Objects.equals(uri.getAuthority(), base.getAuthority())) {\n      return uri;\n    }\n    var uriPath = uri.normalize().getPath();\n    var basePath = base.normalize().getPath();\n    try {\n      if (basePath.isEmpty()) {\n        return uri;\n      }\n      var uriParts = Arrays.asList(uriPath.split(\"/\"));\n      var baseParts = Arrays.asList(basePath.split(\"/\"));\n      if (!basePath.endsWith(\"/\")) {\n        // strip the last path segment of the base uri, unless it ends in a slash. `/foo/bar.pkl` ->\n        // `/foo`\n        baseParts = baseParts.subList(0, baseParts.size() - 1);\n      }\n      if (uriParts.equals(baseParts)) {\n        return new URI(null, null, null, -1, \"\", uri.getQuery(), uri.getFragment());\n      }\n      var start = 0;\n      while (start < Math.min(uriParts.size(), baseParts.size())) {\n        if (!uriParts.get(start).equals(baseParts.get(start))) {\n          break;\n        }\n        start++;\n      }\n      var uriPartsRemaining = uriParts.subList(start, uriParts.size());\n      var basePartsRemaining = baseParts.subList(start, baseParts.size());\n      if (basePartsRemaining.isEmpty()) {\n        return new URI(\n            null,\n            null,\n            null,\n            -1,\n            String.join(\"/\", uriPartsRemaining),\n            uri.getQuery(),\n            uri.getFragment());\n      }\n      var resultingPath =\n          \"../\".repeat(basePartsRemaining.size()) + String.join(\"/\", uriPartsRemaining);\n      return new URI(null, null, null, -1, resultingPath, uri.getQuery(), uri.getFragment());\n    } catch (URISyntaxException e) {\n      // Impossible; started from a valid URI to begin with.\n      throw PklBugException.unreachableCode();\n    }\n  }\n\n  // On Windows, `Path.relativize` will fail if the two paths have different roots.\n  public static Path relativize(Path path, Path base) {\n    if (isWindows()) {\n      if (path.isAbsolute() && base.isAbsolute() && !path.getRoot().equals(base.getRoot())) {\n        return path;\n      }\n    }\n    return base.relativize(path);\n  }\n\n  public static boolean isWhitespace(String str) {\n    return str.codePoints().allMatch(Character::isWhitespace);\n  }\n\n  /**\n   * Capitalizes the first Unicode character of the given string (rather than the first character of\n   * each word).\n   */\n  public static String capitalize(String str) {\n    if (str.isEmpty()) return str;\n\n    var cp = str.codePointAt(0);\n    if (Character.isTitleCase(cp)) return str;\n\n    var builder = new StringBuilder();\n    // title case seems more appropriate than upper case\n    builder.appendCodePoint(Character.toTitleCase(cp));\n    builder.append(str.substring(Character.charCount(cp)));\n    return builder.toString();\n  }\n\n  public static int getMaxLineLength(String str) {\n    return str.lines().map(String::length).max(Comparator.naturalOrder()).orElse(0);\n  }\n\n  public static <T> ServiceLoader<T> createServiceLoader(Class<T> serviceClass) {\n    if (TruffleOptions.AOT) {\n      // don't use ServiceLoader.load(Class, ClassLoader)\n      // because Class.getClassLoader() returns null in AOT mode\n      return ServiceLoader.load(serviceClass);\n    }\n\n    // don't use ServiceLoader.load(Class)\n    // because loading services from thread context class loader doesn't work inside gradle plugins\n    return ServiceLoader.load(serviceClass, IoUtils.class.getClassLoader());\n  }\n\n  // not a static field to avoid compile-time evaluation by native-image\n  public static boolean isTestMode() {\n    return Boolean.getBoolean(\"org.pkl.testMode\");\n  }\n\n  public static void setTestMode() {\n    System.setProperty(\"org.pkl.testMode\", \"true\");\n  }\n\n  public static void setSystemProxy(URI proxyAddress) {\n    // Set HTTP proxy settings to configure the certificate revocation checker, because\n    // there is no other way to configure it. (see https://bugs.openjdk.org/browse/JDK-8256409)\n    //\n    // This only influences the behavior of the revocation checker.\n    // Otherwise, proxying is handled by [ProxySelector].\n    System.setProperty(\"http.proxyHost\", proxyAddress.getHost());\n    System.setProperty(\n        \"http.proxyPort\",\n        proxyAddress.getPort() == -1 ? \"80\" : String.valueOf(proxyAddress.getPort()));\n  }\n\n  public static @Nullable String parseTripleDotPath(URI importUri) throws URISyntaxException {\n    var importScheme = importUri.getScheme();\n    if (importScheme != null) return null;\n\n    var schemeSpecificPart = importUri.getSchemeSpecificPart();\n    if (!schemeSpecificPart.startsWith(\"...\")) return null;\n\n    if (schemeSpecificPart.length() == 3) return \"\";\n\n    if (schemeSpecificPart.charAt(3) != '/' || schemeSpecificPart.length() == 4) {\n      throw new URISyntaxException(\n          importUri.toString(), ErrorMessages.create(\"invalidTripleDotSyntax\"));\n    }\n\n    return schemeSpecificPart.substring(4);\n  }\n\n  public static String toUnicodeEscape(int ch) {\n    var hex = Integer.toHexString(ch);\n    return switch (hex.length()) {\n      case 1 -> \"\\\\u000\" + hex;\n      case 2 -> \"\\\\u00\" + hex;\n      case 3 -> \"\\\\u0\" + hex;\n      case 4 -> \"\\\\u\" + hex;\n      default -> throw new IllegalArgumentException(String.valueOf(ch));\n    };\n  }\n\n  public static String toHexEscape(int ch) {\n    var hex = Integer.toHexString(ch);\n    return switch (hex.length()) {\n      case 1 -> \"\\\\x0\" + hex;\n      case 2 -> \"\\\\x\" + hex;\n      default -> throw new IllegalArgumentException(String.valueOf(ch));\n    };\n  }\n\n  public static boolean isHexDigit(char ch) {\n    return switch (ch) {\n      case '0',\n          '1',\n          '2',\n          '3',\n          '4',\n          '5',\n          '6',\n          '7',\n          '8',\n          '9',\n          'A',\n          'B',\n          'C',\n          'D',\n          'E',\n          'F',\n          'a',\n          'b',\n          'c',\n          'd',\n          'e',\n          'f' ->\n          true;\n      default -> false;\n    };\n  }\n\n  public static boolean isHexDigitOrUnderscore(char ch) {\n    return switch (ch) {\n      case '0',\n          '1',\n          '2',\n          '3',\n          '4',\n          '5',\n          '6',\n          '7',\n          '8',\n          '9',\n          'A',\n          'B',\n          'C',\n          'D',\n          'E',\n          'F',\n          'a',\n          'b',\n          'c',\n          'd',\n          'e',\n          'f',\n          '_' ->\n          true;\n      default -> false;\n    };\n  }\n\n  @SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\n  public static boolean isDecimalDigit(char ch) {\n    return switch (ch) {\n      case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> true;\n      default -> false;\n    };\n  }\n\n  @SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\n  public static boolean isDecimalDigitOrUnderscore(char ch) {\n    return switch (ch) {\n      case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '_' -> true;\n      default -> false;\n    };\n  }\n\n  public static boolean isNonZeroDecimalDigit(char ch) {\n    return switch (ch) {\n      case '1', '2', '3', '4', '5', '6', '7', '8', '9' -> true;\n      default -> false;\n    };\n  }\n\n  public static boolean isOctalDigit(char ch) {\n    return switch (ch) {\n      case '0', '1', '2', '3', '4', '5', '6', '7' -> true;\n      default -> false;\n    };\n  }\n\n  public static boolean isOctalDigitOrUnderscore(char ch) {\n    return switch (ch) {\n      case '0', '1', '2', '3', '4', '5', '6', '7', '_' -> true;\n      default -> false;\n    };\n  }\n\n  public static boolean isBinaryDigitOrUnderscore(char ch) {\n    return switch (ch) {\n      case '0', '1', '_' -> true;\n      default -> false;\n    };\n  }\n\n  /**\n   * Fix an issue where triple-slash URI's turn into single-slash URI's when using {@link\n   * URI#resolve(URI)}\n   */\n  public static URI fixTripleSlashUri(URI baseUri, URI newUri) {\n    // `getHost()` is erroneously `null` when parsing triple-slash URIs.\n    // Ensure that they are preserved during resolution.\n    if (baseUri.getScheme() != null\n        && baseUri.getScheme().equalsIgnoreCase(newUri.getScheme())\n        && baseUri.getSchemeSpecificPart().startsWith(\"///\")\n        && newUri.getHost() == null) {\n      try {\n        return new URI(\n            newUri.getScheme(),\n            newUri.getUserInfo(),\n            \"\",\n            newUri.getPort(),\n            newUri.getPath(),\n            newUri.getQuery(),\n            newUri.getFragment());\n      } catch (URISyntaxException e) {\n        throw new IllegalArgumentException(e.getMessage(), e);\n      }\n    }\n\n    return newUri;\n  }\n\n  public static boolean isReservedFilenameChar(char character) {\n    if (isWindows()) {\n      return isReservedWindowsFilenameChar(character);\n    }\n    // posix; only NULL and `/` are reserved.\n    return character == 0 || character == '/';\n  }\n\n  /** Tells if this character cannot be used for filenames on Windows. */\n  public static boolean isReservedWindowsFilenameChar(char character) {\n    return switch (character) {\n      case 0,\n          1,\n          2,\n          3,\n          4,\n          5,\n          6,\n          7,\n          8,\n          9,\n          10,\n          11,\n          12,\n          13,\n          14,\n          15,\n          16,\n          17,\n          18,\n          19,\n          20,\n          21,\n          22,\n          23,\n          24,\n          25,\n          26,\n          27,\n          28,\n          29,\n          30,\n          31,\n          '<',\n          '>',\n          ':',\n          '\"',\n          '\\\\',\n          '/',\n          '|',\n          '?',\n          '*' ->\n          true;\n      default -> false;\n    };\n  }\n\n  /**\n   * Windows reserves characters {@code <>:\"\\|?*} in filenames.\n   *\n   * <p>For any such characters, enclose their decimal character code with parentheses. Verbatim\n   * {@code (} is encoded as {@code ((}.\n   */\n  public static String encodePath(String path) {\n    if (path.isEmpty()) return path;\n    var sb = new StringBuilder();\n    for (var i = 0; i < path.length(); i++) {\n      var character = path.charAt(i);\n      if (isReservedWindowsFilenameChar(character) && character != '/') {\n        sb.append('(');\n        sb.append(ByteArrayUtils.toHex(new byte[] {(byte) character}));\n        sb.append(\")\");\n      } else if (character == '(') {\n        sb.append(\"((\");\n      } else {\n        sb.append(character);\n      }\n    }\n    return sb.toString();\n  }\n\n  /** Returns a path string that uses unix-like path separators. */\n  public static String toNormalizedPathString(Path path) {\n    if (isWindows()) {\n      return path.toString().replace(\"\\\\\", \"/\");\n    }\n    return path.toString();\n  }\n\n  private static int getExclamationMarkIndex(String jarUri) {\n    var index = jarUri.indexOf('!');\n    if (index == -1) {\n      throw new IllegalArgumentException(\"Invalid `jar:` URI (missing `!`): \" + jarUri);\n    }\n    return index;\n  }\n\n  public static void validateFileUri(URI uri) throws URISyntaxException {\n    if (!uri.getSchemeSpecificPart().startsWith(\"/\")) {\n      throw new URISyntaxException(uri.toString(), ErrorMessages.create(\"invalidOpaqueFileUri\"));\n    }\n  }\n\n  public static void validateRewriteRule(URI rewrite) {\n    if (!Objects.equals(rewrite.getScheme(), \"http\")\n        && !Objects.equals(rewrite.getScheme(), \"https\")) {\n      throw new IllegalArgumentException(\n          \"Rewrite rule must start with 'http://' or 'https://', but was '%s'\".formatted(rewrite));\n    }\n\n    if (!rewrite.toString().endsWith(\"/\")) {\n      throw new IllegalArgumentException(\n          \"Rewrite rule must end with '/', but was '%s'\".formatted(rewrite));\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/LateInit.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport javax.annotation.Nonnull;\nimport javax.annotation.meta.TypeQualifierNickname;\nimport javax.annotation.meta.When;\n\n/**\n * Indicates that the annotated field is initially {@code null} and initialized to a non-null value\n * before or upon first use. Corresponds to {@code lateinit} in Kotlin (but does not result in\n * automatic runtime non-null checks).\n *\n * <p>Note: Fields that are initialized late to a nullable value should only be annotated with\n * {@link Nullable} (same as in Kotlin).\n */\n@Target(ElementType.FIELD)\n@Retention(RetentionPolicy.RUNTIME)\n@Nonnull(when = When.UNKNOWN)\n@TypeQualifierNickname\npublic @interface LateInit {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/MathUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport java.math.RoundingMode;\n\npublic final class MathUtils {\n  private static final long FLOOR_SQRT_MAX_LONG = 3037000499L;\n\n  // The mask for the significand, according to the {@link\n  // Double#doubleToRawLongBits(double)} spec.\n  private static final long SIGNIFICAND_MASK = 0x000fffffffffffffL;\n\n  /** The implicit 1 bit that is omitted in significands of normal doubles. */\n  private static final long IMPLICIT_BIT = SIGNIFICAND_MASK + 1;\n\n  private static final double MIN_LONG_AS_DOUBLE = -0x1p63;\n  /*\n   * We cannot store Long.MAX_VALUE as a double without losing precision. Instead, we store\n   * Long.MAX_VALUE + 1 == -Long.MIN_VALUE, and then offset all comparisons by 1.\n   */\n  private static final double MAX_LONG_AS_DOUBLE_PLUS_ONE = 0x1p63;\n\n  private static final int SIGNIFICAND_BITS = 52;\n\n  private MathUtils() {}\n\n  @TruffleBoundary\n  public static long roundToLong(double x, RoundingMode mode) {\n    var z = roundIntermediate(x, mode);\n    checkInRange(MIN_LONG_AS_DOUBLE - z < 1.0 & z < MAX_LONG_AS_DOUBLE_PLUS_ONE);\n    return (long) z;\n  }\n\n  @TruffleBoundary\n  public static boolean isMathematicalInteger(double x) {\n    return isFinite(x)\n        && (x == 0.0\n            || SIGNIFICAND_BITS - Long.numberOfTrailingZeros(getSignificand(x))\n                <= StrictMath.getExponent(x));\n  }\n\n  /**\n   * Returns {@code true} if {@code x} represents a power of two.\n   *\n   * <p>\n   *\n   * <p>This differs from {@code Long.bitCount(x) == 1}, because {@code\n   * Long.bitCount(Long.MIN_VALUE) == 1}, but {@link Long#MIN_VALUE} is not a power of two.\n   */\n  public static boolean isPowerOfTwo(long x) {\n    return x > 0 && (x & (x - 1)) == 0;\n  }\n\n  /**\n   * Returns {@code true} if {@code x} is exactly equal to {@code 2^k} for some finite integer\n   * {@code k}.\n   */\n  @TruffleBoundary\n  public static boolean isPowerOfTwo(double x) {\n    if (x > 0.0 && isFinite(x)) {\n      long significand = getSignificand(x);\n      return (significand & (significand - 1)) == 0;\n    }\n    return false;\n  }\n\n  /**\n   * Returns the {@code b} to the {@code k}th power, provided it does not overflow.\n   *\n   * @throws ArithmeticException if {@code b} to the {@code k}th power overflows in signed {@code\n   *     long} arithmetic\n   */\n  @TruffleBoundary\n  public static long checkedPow(long b, int k) {\n    checkNonNegative(\"exponent\", k);\n    if (b >= -2 & b <= 2) {\n      return switch ((int) b) {\n        case 0 -> (k == 0) ? 1 : 0;\n        case 1 -> 1;\n        case (-1) -> ((k & 1) == 0) ? 1 : -1;\n        case 2 -> {\n          checkNoOverflow(k < Long.SIZE - 1);\n          yield 1L << k;\n        }\n        case (-2) -> {\n          checkNoOverflow(k < Long.SIZE);\n          yield ((k & 1) == 0) ? (1L << k) : (-1L << k);\n        }\n        default -> throw new AssertionError();\n      };\n    }\n    long accum = 1;\n    while (true) {\n      switch (k) {\n        case 0 -> {\n          return accum;\n        }\n        case 1 -> {\n          return checkedMultiply(accum, b);\n        }\n        default -> {\n          if ((k & 1) != 0) {\n            accum = checkedMultiply(accum, b);\n          }\n          k >>= 1;\n          if (k > 0) {\n            checkNoOverflow(-FLOOR_SQRT_MAX_LONG <= b && b <= FLOOR_SQRT_MAX_LONG);\n            b *= b;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Returns the greatest common divisor of {@code a, b}. Returns {@code 0} if {@code a == 0 && b ==\n   * 0}.\n   *\n   * @throws IllegalArgumentException if {@code a < 0} or {@code b < 0}\n   */\n  @TruffleBoundary\n  public static long gcd(long a, long b) {\n    /*\n     * The reason we require both arguments to be >= 0 is because otherwise, what do you return on\n     * gcd(0, Long.MIN_VALUE)? BigInteger.gcd would return positive 2^63, but positive 2^63 isn't an\n     * int.\n     */\n    checkNonNegative(\"a\", a);\n    checkNonNegative(\"b\", b);\n    if (a == 0) {\n      // 0 % b == 0, so b divides a, but the converse doesn't hold.\n      // BigInteger.gcd is consistent with this decision.\n      return b;\n    } else if (b == 0) {\n      return a; // similar logic\n    }\n    /*\n     * Uses the binary GCD algorithm; see http://en.wikipedia.org/wiki/Binary_GCD_algorithm. This is\n     * >60% faster than the Euclidean algorithm in benchmarks.\n     */\n    var aTwos = Long.numberOfTrailingZeros(a);\n    a >>= aTwos; // divide out all 2s\n    var bTwos = Long.numberOfTrailingZeros(b);\n    b >>= bTwos; // divide out all 2s\n    while (a != b) { // both a, b are odd\n      // The key to the binary GCD algorithm is as follows:\n      // Both a and b are odd. Assume a > b; then gcd(a - b, b) = gcd(a, b).\n      // But in gcd(a - b, b), a - b is even and b is odd, so we can divide out powers of two.\n\n      // We bend over backwards to avoid branching, adapting a technique from\n      // http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax\n\n      var delta = a - b; // can't overflow, since a and b are nonnegative\n\n      var minDeltaOrZero = delta & (delta >> (Long.SIZE - 1));\n      // equivalent to Math.min(delta, 0)\n\n      a = delta - minDeltaOrZero - minDeltaOrZero; // sets a to Math.abs(a - b)\n      // a is now nonnegative and even\n\n      b += minDeltaOrZero; // sets b to min(old a, b)\n      a >>= Long.numberOfTrailingZeros(a); // divide out all 2s, since 2 doesn't divide b\n    }\n    return a << Math.min(aTwos, bTwos);\n  }\n\n  /**\n   * Returns the product of {@code a} and {@code b}, provided it does not overflow.\n   *\n   * @throws ArithmeticException if {@code a * b} overflows in signed {@code long} arithmetic\n   */\n  @TruffleBoundary\n  public static long checkedMultiply(long a, long b) {\n    // Hacker's Delight, Section 2-12\n    var leadingZeros =\n        Long.numberOfLeadingZeros(a)\n            + Long.numberOfLeadingZeros(~a)\n            + Long.numberOfLeadingZeros(b)\n            + Long.numberOfLeadingZeros(~b);\n    /*\n     * If leadingZeros > Long.SIZE + 1 it's definitely fine, if it's < Long.SIZE it's definitely\n     * bad. We do the leadingZeros check to avoid the division below if at all possible.\n     *\n     * Otherwise, if b == Long.MIN_VALUE, then the only allowed values of a are 0 and 1. We take\n     * care of all a < 0 with their own check, because in particular, the case a == -1 will\n     * incorrectly pass the division check below.\n     *\n     * In all other cases, we check that either a is 0 or the result is consistent with division.\n     */\n    if (leadingZeros > Long.SIZE + 1) {\n      return a * b;\n    }\n    checkNoOverflow(leadingZeros >= Long.SIZE);\n    checkNoOverflow(a >= 0 | b != Long.MIN_VALUE);\n    var result = a * b;\n    checkNoOverflow(a == 0 || result / a == b);\n    return result;\n  }\n\n  /*\n   * This method returns a value y such that rounding y DOWN (towards zero) gives the same result as\n   * rounding x according to the specified mode.\n   */\n  private static double roundIntermediate(double x, RoundingMode mode) {\n    if (!isFinite(x)) {\n      throw new ArithmeticException(\"input is infinite or NaN\");\n    }\n    switch (mode) {\n      case UNNECESSARY:\n        checkRoundingUnnecessary(isMathematicalInteger(x));\n        return x;\n\n      case FLOOR:\n        if (x >= 0.0 || isMathematicalInteger(x)) {\n          return x;\n        } else {\n          return (long) x - 1;\n        }\n\n      case CEILING:\n        if (x <= 0.0 || isMathematicalInteger(x)) {\n          return x;\n        } else {\n          return (long) x + 1;\n        }\n\n      case DOWN:\n        return x;\n\n      case UP:\n        if (isMathematicalInteger(x)) {\n          return x;\n        } else {\n          return (long) x + (x > 0 ? 1 : -1);\n        }\n\n      case HALF_EVEN:\n        return StrictMath.rint(x);\n\n      case HALF_UP:\n        {\n          var z = StrictMath.rint(x);\n          if (StrictMath.abs(x - z) == 0.5) {\n            return x + StrictMath.copySign(0.5, x);\n          } else {\n            return z;\n          }\n        }\n\n      case HALF_DOWN:\n        {\n          var z = StrictMath.rint(x);\n          if (StrictMath.abs(x - z) == 0.5) {\n            return x;\n          } else {\n            return z;\n          }\n        }\n\n      default:\n        throw new AssertionError();\n    }\n  }\n\n  private static long getSignificand(double d) {\n    checkArgument(isFinite(d), \"not a normal value\");\n    var exponent = StrictMath.getExponent(d);\n    var bits = Double.doubleToRawLongBits(d);\n    bits &= SIGNIFICAND_MASK;\n    return (exponent == Double.MIN_EXPONENT - 1) ? bits << 1 : bits | IMPLICIT_BIT;\n  }\n\n  private static boolean isFinite(double d) {\n    return Math.getExponent(d) <= Double.MAX_EXPONENT;\n  }\n\n  private static void checkInRange(boolean condition) {\n    if (!condition) {\n      throw new ArithmeticException(\"not in range\");\n    }\n  }\n\n  private static void checkRoundingUnnecessary(boolean condition) {\n    if (!condition) {\n      throw new ArithmeticException(\"mode was UNNECESSARY, but rounding was necessary\");\n    }\n  }\n\n  private static void checkArgument(boolean expression, @Nullable Object errorMessage) {\n    if (!expression) {\n      throw new IllegalArgumentException(String.valueOf(errorMessage));\n    }\n  }\n\n  private static void checkNonNegative(String role, int x) {\n    if (x < 0) {\n      throw new IllegalArgumentException(role + \" (\" + x + \") must be >= 0\");\n    }\n  }\n\n  private static void checkNonNegative(@Nullable String role, long x) {\n    if (x < 0) {\n      throw new IllegalArgumentException(role + \" (\" + x + \") must be >= 0\");\n    }\n  }\n\n  private static void checkNoOverflow(boolean condition) {\n    if (!condition) {\n      throw new ArithmeticException(\"overflow\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/MutableBoolean.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\n\n/** A mutable boolean in a box. If you need a thread-safe box, use {@link AtomicBoolean} instead. */\npublic final class MutableBoolean {\n  private boolean value;\n\n  public MutableBoolean(boolean value) {\n    this.value = value;\n  }\n\n  public boolean get() {\n    return value;\n  }\n\n  public boolean getAndSetFalse() {\n    if (!value) return false;\n\n    value = false;\n    return true;\n  }\n\n  public void set(boolean value) {\n    this.value = value;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/MutableLong.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.concurrent.atomic.AtomicLong;\n\n/** A mutable long in a box. If you need a thread-safe box, use {@link AtomicLong} instead. */\npublic final class MutableLong {\n  private long value;\n\n  public MutableLong(long value) {\n    this.value = value;\n  }\n\n  public long get() {\n    return value;\n  }\n\n  public void set(long value) {\n    this.value = value;\n  }\n\n  public long getAndIncrement() {\n    return value++;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/MutableReference.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.concurrent.atomic.AtomicReference;\n\n/**\n * A mutable reference in a box. If you need a thread-safe box, use {@link AtomicReference} instead.\n */\npublic final class MutableReference<T> {\n  private @Nullable T value;\n\n  public MutableReference(@Nullable T value) {\n    this.value = value;\n  }\n\n  public T get() {\n    assert value != null;\n    return value;\n  }\n\n  public @Nullable T getOrNull() {\n    return value;\n  }\n\n  public boolean isNull() {\n    return value == null;\n  }\n\n  public void set(@Nullable T value) {\n    this.value = value;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/Nonnull.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.lang.annotation.*;\nimport javax.annotation.meta.TypeQualifierNickname;\nimport javax.annotation.meta.When;\n\n@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@javax.annotation.Nonnull(when = When.ALWAYS)\n@TypeQualifierNickname\npublic @interface Nonnull {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/NonnullByDefault.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport javax.annotation.meta.TypeQualifierDefault;\n\n/**\n * Indicates that method return types and method parameters in the annotated package are {@link\n * Nonnull} unless explicitly annotated with {@link Nullable}.\n *\n * <p>This annotation is a generalization of {@link javax.annotation.ParametersAreNonnullByDefault}.\n * All Pkl packages containing Java code should carry this annotation.\n *\n * <p>Ideally, this default would apply to every {@link ElementType#TYPE_USE}, but I haven't been\n * able to make this work reasonably in <a\n * href=\"https://youtrack.jetbrains.com/issue/IDEA-278618\">IntelliJ</a>.\n */\n@Documented\n@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER})\n@javax.annotation.Nonnull\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.PACKAGE)\npublic @interface NonnullByDefault {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/Nullable.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport static javax.annotation.meta.When.MAYBE;\n\nimport java.lang.annotation.*;\nimport javax.annotation.meta.TypeQualifierNickname;\n\n@Target({\n  ElementType.TYPE_PARAMETER,\n  ElementType.TYPE_USE,\n  ElementType.PARAMETER,\n  ElementType.FIELD,\n  ElementType.METHOD\n})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@javax.annotation.Nonnull(when = MAYBE)\n@TypeQualifierNickname\npublic @interface Nullable {}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/Pair.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;\nimport com.oracle.truffle.api.CompilerDirectives.ValueType;\n\n@ValueType\npublic final class Pair<S, T> {\n  public final S first;\n  public final T second;\n\n  private Pair(S first, T second) {\n    this.first = first;\n    this.second = second;\n  }\n\n  public static <S, T> Pair<S, T> of(S first, T second) {\n    return new Pair<>(first, second);\n  }\n\n  public S getFirst() {\n    return first;\n  }\n\n  public T getSecond() {\n    return second;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Pair<?, ?> other)) return false;\n    return first.equals(other.first) && second.equals(other.second);\n  }\n\n  @Override\n  public int hashCode() {\n    return 31 * first.hashCode() + second.hashCode();\n  }\n\n  @Override\n  @TruffleBoundary\n  public String toString() {\n    return \"Pair(\" + first + \", \" + second + \")\";\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/StringBuilderWriter.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.io.Writer;\n\npublic final class StringBuilderWriter extends Writer {\n  private final StringBuilder builder;\n\n  public StringBuilderWriter(StringBuilder builder) {\n    this.builder = builder;\n  }\n\n  @Override\n  public void write(int c) {\n    builder.append((char) c);\n  }\n\n  @Override\n  public void write(char[] cbuf) {\n    builder.append(cbuf);\n  }\n\n  @Override\n  public void write(String str) {\n    builder.append(str);\n  }\n\n  @Override\n  public void write(String str, int off, int len) {\n    builder.append(str, off, off + len);\n  }\n\n  @Override\n  public void write(char[] cbuf, int off, int len) {\n    builder.append(cbuf, off, len);\n  }\n\n  @Override\n  public Writer append(char c) {\n    builder.append(c);\n    return this;\n  }\n\n  @Override\n  public Writer append(CharSequence csq) {\n    builder.append(csq);\n    return this;\n  }\n\n  @Override\n  public Writer append(CharSequence csq, int start, int end) {\n    builder.append(csq, start, end);\n    return this;\n  }\n\n  @Override\n  public void flush() {} // do nothing\n\n  @Override\n  public void close() {} // do nothing\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/StringSimilarity.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.Arrays;\nimport javax.annotation.concurrent.Immutable;\n\n/**\n * The Jaro–Winkler distance metric is designed and best suited for short strings such as person\n * names, and to detect typos; it is (roughly) a variation of Damerau-Levenshtein, where the\n * substitution of 2 close characters is considered less important then the substitution of 2\n * characters that a far from each other. Jaro-Winkler was developed in the area of record linkage\n * (duplicate detection) (Winkler, 1990). It returns a value in the interval [0.0, 1.0]. The\n * distance is computed as 1 - Jaro-Winkler similarity.\n *\n * @author Thibault Debatty\n */\n@Immutable\npublic final class StringSimilarity {\n  private static final double DEFAULT_THRESHOLD = 0.7;\n  private static final int THREE = 3;\n  private static final double JW_COEF = 0.1;\n  private final double threshold;\n\n  /** Instantiate with default threshold (0.7). */\n  public StringSimilarity() {\n    this.threshold = DEFAULT_THRESHOLD;\n  }\n\n  /**\n   * Instantiate with given threshold to determine when Winkler bonus should be used. Set threshold\n   * to a negative value to get the Jaro distance.\n   */\n  public StringSimilarity(final double threshold) {\n    this.threshold = threshold;\n  }\n\n  /**\n   * Returns the current value of the threshold used for adding the Winkler bonus. The default value\n   * is 0.7.\n   *\n   * @return the current value of the threshold\n   */\n  public final double getThreshold() {\n    return threshold;\n  }\n\n  /**\n   * Compute Jaro-Winkler similarity.\n   *\n   * @param s1 The first string to compare.\n   * @param s2 The second string to compare.\n   * @return The Jaro-Winkler similarity in the range [0, 1]\n   */\n  public final double similarity(final String s1, final String s2) {\n    if (s1.equals(s2)) {\n      return 1;\n    }\n\n    var mtp = matches(s1, s2);\n    var m = (double) mtp[0];\n    if (m == 0) return m;\n\n    var j = ((m / s1.length() + m / s2.length() + (m - mtp[1]) / m)) / THREE;\n    var jw = j;\n\n    if (j > getThreshold()) {\n      jw = j + Math.min(JW_COEF, 1.0 / mtp[THREE]) * mtp[2] * (1 - j);\n    }\n    return jw;\n  }\n\n  /**\n   * Return 1 - similarity.\n   *\n   * @param s1 The first string to compare.\n   * @param s2 The second string to compare.\n   * @return 1 - similarity.\n   */\n  public final double distance(final String s1, final String s2) {\n    return 1.0 - similarity(s1, s2);\n  }\n\n  private int[] matches(final String s1, final String s2) {\n    String max, min;\n    if (s1.length() > s2.length()) {\n      max = s1;\n      min = s2;\n    } else {\n      max = s2;\n      min = s1;\n    }\n    var range = Math.max(max.length() / 2 - 1, 0);\n    var matchIndexes = new int[min.length()];\n    Arrays.fill(matchIndexes, -1);\n    var matchFlags = new boolean[max.length()];\n    var matches = 0;\n    for (var mi = 0; mi < min.length(); mi++) {\n      var c1 = min.charAt(mi);\n      for (int xi = Math.max(mi - range, 0), xn = Math.min(mi + range + 1, max.length());\n          xi < xn;\n          xi++) {\n        if (!matchFlags[xi] && c1 == max.charAt(xi)) {\n          matchIndexes[mi] = xi;\n          matchFlags[xi] = true;\n          matches++;\n          break;\n        }\n      }\n    }\n    var ms1 = new char[matches];\n    var ms2 = new char[matches];\n    for (int i = 0, si = 0; i < min.length(); i++) {\n      if (matchIndexes[i] != -1) {\n        ms1[si] = min.charAt(i);\n        si++;\n      }\n    }\n    for (int i = 0, si = 0; i < max.length(); i++) {\n      if (matchFlags[i]) {\n        ms2[si] = max.charAt(i);\n        si++;\n      }\n    }\n    var transpositions = 0;\n    for (var mi = 0; mi < ms1.length; mi++) {\n      if (ms1[mi] != ms2[mi]) {\n        transpositions++;\n      }\n    }\n    var prefix = 0;\n    for (var mi = 0; mi < min.length(); mi++) {\n      if (s1.charAt(mi) == s2.charAt(mi)) {\n        prefix++;\n      } else {\n        break;\n      }\n    }\n    return new int[] {matches, transpositions / 2, prefix, max.length()};\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/StringUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport java.util.function.Consumer;\n\n// Some code in this class was taken from the following Google Guava classes:\n// * com.google.common.base.CharMatcher\n// * com.google.common.base.Strings\npublic final class StringUtils {\n  // TABLE is a precomputed hashset of whitespace characters. MULTIPLIER serves as a hash function\n  // whose key property is that it maps 25 characters into the 32-slot table without collision.\n  // Basically this is an opportunistic fast implementation as opposed to \"good code\". For most\n  // other use-cases, the reduction in readability isn't worth it.\n  @SuppressWarnings(\"UnnecessaryUnicodeEscape\")\n  private static final String TABLE =\n      \"\\u2002\\u3000\\r\\u0085\\u200A\\u2005\\u2000\\u3000\"\n          + \"\\u2029\\u000B\\u3000\\u2008\\u2003\\u205F\\u3000\\u1680\"\n          + \"\\u0009\\u0020\\u2006\\u2001\\u202F\\u00A0\\u000C\\u2009\"\n          + \"\\u3000\\u2004\\u3000\\u3000\\u2028\\n\\u2007\\u3000\";\n\n  private static final int MULTIPLIER = 1682554634;\n  private static final int SHIFT = Integer.numberOfLeadingZeros(TABLE.length() - 1);\n\n  private StringUtils() {}\n\n  /** Tells if the given Unicode character has Unicode property \"White_Space\". */\n  public static boolean isWhitespace(int codePoint) {\n    return Character.isBmpCodePoint(codePoint) && isWhitespace((char) codePoint);\n  }\n\n  /** Tells if the given Java character has Unicode property \"White_Space\". */\n  public static boolean isWhitespace(char ch) {\n    return TABLE.charAt((MULTIPLIER * ch) >>> SHIFT) == ch;\n  }\n\n  /** Tells if all characters of the given string have Unicode property \"White_Space\". */\n  public static boolean isBlank(String str) {\n    for (var i = 0; i < str.length(); i++) {\n      if (!isWhitespace(str.charAt(i))) return false;\n    }\n    return true;\n  }\n\n  /** Removes any leading and trailing characters with Unicode property \"White_Space\". */\n  public static String trim(String str) {\n    var index = indexOfNonWhitespace(str);\n    if (index == str.length()) return \"\";\n\n    var lastIndex = lastIndexOfNonWhitespace(str);\n    return str.substring(index, lastIndex);\n  }\n\n  /** Removes any leading characters with Unicode property \"White_Space\". */\n  public static String trimStart(String str) {\n    return str.substring(indexOfNonWhitespace(str));\n  }\n\n  /** Removes any trailing characters with Unicode property \"White_Space\". */\n  public static String trimEnd(String str) {\n    return str.substring(0, lastIndexOfNonWhitespace(str));\n  }\n\n  public static <T> void joinToStringBuilder(\n      StringBuilder builder, Iterable<T> coll, String delimiter, Consumer<T> eachFn) {\n    var i = 0;\n    for (var v : coll) {\n      if (i++ != 0) {\n        builder.append(delimiter);\n      }\n      eachFn.accept(v);\n    }\n  }\n\n  public static <T> void joinToStringBuilder(\n      AnsiStringBuilder builder, Iterable<T> coll, String delimiter, Consumer<T> eachFn) {\n    var i = 0;\n    for (var v : coll) {\n      if (i != 0) {\n        builder.append(delimiter);\n      }\n      eachFn.accept(v);\n      i++;\n    }\n  }\n\n  public static <T> void joinToStringBuilder(\n      StringBuilder builder, Iterable<T> coll, String delimiter) {\n    joinToStringBuilder(builder, coll, delimiter, builder::append);\n  }\n\n  public static <T> void joinToStringBuilder(\n      StringBuilder builder, Iterable<T> coll, Consumer<T> eachFn) {\n    joinToStringBuilder(builder, coll, \", \", eachFn);\n  }\n\n  private static int indexOfNonWhitespace(String str) {\n    var length = str.length();\n    for (var i = 0; i < length; i++) {\n      if (!isWhitespace(str.charAt(i))) return i;\n    }\n    return length;\n  }\n\n  private static int lastIndexOfNonWhitespace(String str) {\n    var length = str.length();\n    for (var i = length; i > 0; i--) {\n      if (!isWhitespace(str.charAt(i - 1))) return i;\n    }\n    return 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/SyntaxHighlighter.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util;\n\nimport static org.pkl.parser.Token.FALSE;\nimport static org.pkl.parser.Token.NULL;\nimport static org.pkl.parser.Token.STRING_ESCAPE_BACKSLASH;\nimport static org.pkl.parser.Token.STRING_ESCAPE_NEWLINE;\nimport static org.pkl.parser.Token.STRING_ESCAPE_QUOTE;\nimport static org.pkl.parser.Token.STRING_ESCAPE_RETURN;\nimport static org.pkl.parser.Token.STRING_ESCAPE_TAB;\nimport static org.pkl.parser.Token.STRING_ESCAPE_UNICODE;\nimport static org.pkl.parser.Token.TRUE;\n\nimport java.util.EnumSet;\nimport org.pkl.parser.Lexer;\nimport org.pkl.parser.ParserError;\nimport org.pkl.parser.Token;\n\n/** Syntax highlighter that emits ansi color codes. */\npublic final class SyntaxHighlighter {\n  private SyntaxHighlighter() {}\n\n  private static final EnumSet<Token> stringEscape =\n      EnumSet.of(\n          STRING_ESCAPE_NEWLINE,\n          STRING_ESCAPE_TAB,\n          STRING_ESCAPE_RETURN,\n          STRING_ESCAPE_QUOTE,\n          STRING_ESCAPE_BACKSLASH,\n          STRING_ESCAPE_UNICODE);\n\n  private static final EnumSet<Token> constant = EnumSet.of(TRUE, FALSE, NULL);\n\n  private static final EnumSet<Token> operator =\n      EnumSet.of(\n          Token.COALESCE,\n          Token.LT,\n          Token.GT,\n          Token.NOT,\n          Token.EQUAL,\n          Token.NOT_EQUAL,\n          Token.LTE,\n          Token.GTE,\n          Token.AND,\n          Token.OR,\n          Token.PLUS,\n          Token.MINUS,\n          Token.POW,\n          Token.STAR,\n          Token.DIV,\n          Token.INT_DIV,\n          Token.MOD,\n          Token.PIPE);\n\n  private static final EnumSet<Token> keyword =\n      EnumSet.of(\n          Token.AMENDS,\n          Token.AS,\n          Token.EXTENDS,\n          Token.CLASS,\n          Token.TYPE_ALIAS,\n          Token.FUNCTION,\n          Token.MODULE,\n          Token.IMPORT,\n          Token.IMPORT_STAR,\n          Token.READ,\n          Token.READ_STAR,\n          Token.READ_QUESTION,\n          Token.TRACE,\n          Token.THROW,\n          Token.UNKNOWN,\n          Token.NOTHING,\n          Token.OUTER,\n          Token.SUPER,\n          Token.THIS,\n          Token.HIDDEN,\n          Token.ABSTRACT,\n          Token.CONST,\n          Token.FIXED,\n          Token.LOCAL,\n          Token.OPEN);\n\n  private static final EnumSet<Token> control =\n      EnumSet.of(\n          Token.NEW, Token.IF, Token.ELSE, Token.WHEN, Token.FOR, Token.IN, Token.OUT, Token.LET);\n\n  private static final EnumSet<Token> number =\n      EnumSet.of(Token.INT, Token.FLOAT, Token.BIN, Token.OCT, Token.HEX);\n\n  public static void writeTo(AnsiStringBuilder out, String src) {\n    var prevLength = out.length();\n    try {\n      var lexer = new Lexer(src);\n      doHighlightNormal(out, lexer.next(), lexer, Token.EOF);\n    } catch (ParserError err) {\n      // bail out and emit everything un-highlighted\n      out.setLength(prevLength);\n      out.append(src);\n    }\n  }\n\n  private static void highlightString(AnsiStringBuilder out, Lexer lexer, Token token) {\n    out.append(\n        AnsiTheme.SYNTAX_STRING,\n        () -> {\n          var next = token;\n          while (next != Token.STRING_END && next != Token.EOF) {\n            if (stringEscape.contains(next)) {\n              out.append(AnsiTheme.SYNTAX_STRING_ESCAPE, lexer.text());\n              next = advance(out, lexer);\n              continue;\n            } else if (next == Token.INTERPOLATION_START) {\n              out.append(AnsiTheme.SYNTAX_STRING_ESCAPE, lexer.text());\n              out.appendSandboxed(() -> doHighlightNormal(out, lexer.next(), lexer, Token.RPAREN));\n              out.append(AnsiTheme.SYNTAX_STRING_ESCAPE, lexer.text());\n              lexer.next();\n            }\n            out.append(lexer.text());\n            next = advance(out, lexer);\n          }\n          out.append(lexer.text());\n        });\n  }\n\n  private static void doHighlightNormal(AnsiStringBuilder out, Token next, Lexer lexer, Token end) {\n    {\n      while (next != end && next != Token.EOF) {\n        if (constant.contains(next)) {\n          out.append(AnsiTheme.SYNTAX_CONSTANT, lexer.text());\n        } else if (operator.contains(next)) {\n          out.append(AnsiTheme.SYNTAX_OPERATOR, lexer.text());\n        } else if (control.contains(next)) {\n          out.append(AnsiTheme.SYNTAX_CONTROL, lexer.text());\n        } else if (keyword.contains(next)) {\n          out.append(AnsiTheme.SYNTAX_KEYWORD, lexer.text());\n        } else if (next.isAffix()) {\n          out.append(AnsiTheme.SYNTAX_COMMENT, lexer.text());\n        } else if (number.contains(next)) {\n          out.append(AnsiTheme.SYNTAX_NUMBER, lexer.text());\n        } else if (next == Token.STRING_MULTI_START || next == Token.STRING_START) {\n          highlightString(out, lexer, next);\n        } else {\n          out.append(lexer.text());\n        }\n        next = advance(out, lexer);\n      }\n    }\n  }\n\n  private static Token advance(AnsiStringBuilder out, Lexer lexer) {\n    var prevCursor = lexer.getCursor();\n    var next = lexer.next();\n    // fill in any whitespace (includes semicolons)\n    if (lexer.getStartCursor() > prevCursor) {\n      out.append(lexer.textFor(prevCursor, lexer.getStartCursor() - prevCursor));\n    }\n    return next;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/Json.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.ListIterator;\nimport java.util.Map;\nimport java.util.Set;\nimport org.pkl.core.Version;\nimport org.pkl.core.util.ErrorMessages;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Parser for JSON.\n *\n * <p>JSON types are parsed into the following Java types:\n *\n * <table>\n *   <thead>\n *     <td>JSON type</td>\n *     <td>Java type</td>\n *   </thead>\n *   <tbody>\n *     <tr>\n *       <td>object</td>\n *       <td>{@link JsObject}</td>\n *     </tr>\n *     <tr>\n *       <td>array</td>\n *       <td>{@link JsArray}</td>\n *     </tr>\n *     <tr>\n *       <td>number</td>\n *       <td>{@link Integer} or {@link Double}</td>\n *     </tr>\n *     <tr>\n *       <td>boolean</td>\n *       <td>{@link Boolean}</td>\n *     </tr>\n *     <tr>\n *       <td>null</td>\n *       <td>{@code null}</td>\n *     </tr>\n *     <tr>\n *       <td>string</td>\n *       <td>{@link String}</td>\n *     </tr>\n *   </tbody>\n * </table>\n */\n@SuppressWarnings(\"unused\")\npublic final class Json {\n  @FunctionalInterface\n  public interface Mapper<R> {\n    R apply(Object arg) throws Exception;\n  }\n\n  /** Parses {@code input}, expecting it to be a JSON object. */\n  public static JsObject parseObject(String input) throws JsonParseException {\n    var handler = new Handler();\n    var parser = new JsonParser(handler);\n    try {\n      parser.parse(input);\n    } catch (ParseException e) {\n      throw new MalformedJsonException(e, input);\n    }\n    var ret = handler.value;\n    if (!(ret instanceof JsObject jsObject)) {\n      throw new FormatException(\"object\", ret.getClass());\n    }\n    return jsObject;\n  }\n\n  public abstract static class JsonParseException extends Exception {}\n\n  public static class MalformedJsonException extends JsonParseException {\n\n    private final String message;\n\n    public MalformedJsonException(ParseException e, String inputString) {\n      this.message = ErrorMessages.create(\"malformedJson\", e.getMessage(), inputString);\n      initCause(e);\n    }\n\n    @Override\n    public String getMessage() {\n      return message;\n    }\n  }\n\n  public static class FormatException extends JsonParseException {\n    private final String message;\n\n    public FormatException(String expected, Class<?> actual) {\n      this.message = ErrorMessages.create(\"badJsonFormat1\", expected, actual.getSimpleName());\n    }\n\n    public FormatException(String key, String expected, Class<?> actual) {\n      this.message = ErrorMessages.create(\"badJsonFormat2\", expected, key, actual);\n    }\n\n    @Override\n    public String getMessage() {\n      return message;\n    }\n  }\n\n  public static class MappingException extends JsonParseException {\n\n    private final String message;\n\n    public MappingException(String key, Exception e) {\n      this.message = ErrorMessages.create(\"badJsonInvalidMapping\", key, e.getMessage());\n      this.initCause(e);\n    }\n\n    @Override\n    public String getMessage() {\n      return message;\n    }\n  }\n\n  public static class MissingFieldException extends JsonParseException {\n\n    private final Object object;\n    private final String key;\n\n    public MissingFieldException(Object object, String key) {\n      this.object = object;\n      this.key = key;\n    }\n\n    @Override\n    public String getMessage() {\n      return ErrorMessages.create(\"badJsonMissingField\", key, object);\n    }\n  }\n\n  private static class Handler extends JsonHandler<JsArray, JsObject> {\n    Object value;\n\n    @Override\n    public void endString(String string) {\n      value = string;\n    }\n\n    @Override\n    public void endNull() {\n      value = null;\n    }\n\n    @Override\n    public void endBoolean(boolean value) {\n      this.value = value;\n    }\n\n    @Override\n    public void endNumber(String string) {\n      try {\n        value = Integer.valueOf(string);\n      } catch (NumberFormatException e) {\n        value = Double.valueOf(string);\n      }\n    }\n\n    @Override\n    public JsArray startArray() {\n      return new JsArray();\n    }\n\n    @Override\n    public void endArrayValue(JsArray array) {\n      array.add(value);\n    }\n\n    @Override\n    public void endArray(JsArray array) {\n      value = array;\n    }\n\n    @Override\n    public JsObject startObject() {\n      return new JsObject();\n    }\n\n    @Override\n    public void endObjectValue(JsObject object, String name) {\n      object.put(name, value);\n    }\n\n    @Override\n    public void endObject(JsObject object) {\n      value = object;\n    }\n  }\n\n  public static class JsObject implements Map<String, Object> {\n    private final Map<String, Object> delegate;\n\n    public JsObject() {\n      this.delegate = new HashMap<>();\n    }\n\n    public JsObject(int size) {\n      this.delegate = new HashMap<>(size);\n    }\n\n    public <T> T get(String key, Mapper<T> mapper) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        throw new MissingFieldException(this, key);\n      }\n      try {\n        return mapper.apply(ret);\n      } catch (Exception e) {\n        throw new MappingException(key, e);\n      }\n    }\n\n    public <T> @Nullable T getNullable(String key, Mapper<T> mapper) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        return null;\n      }\n      return get(key, mapper);\n    }\n\n    public boolean getBoolean(String key) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        throw new MissingFieldException(this, key);\n      }\n      if (!(ret instanceof Boolean b)) {\n        throw new FormatException(key, \"boolean\", ret.getClass());\n      }\n      return b;\n    }\n\n    public int getInt(String key) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        throw new MissingFieldException(this, key);\n      }\n      if (!(ret instanceof Integer i)) {\n        throw new FormatException(key, \"integer\", ret.getClass());\n      }\n      return i;\n    }\n\n    public String getString(String key) throws JsonParseException {\n      var ret = getStringOrNull(key);\n      if (ret == null) {\n        throw new MissingFieldException(this, key);\n      }\n      return ret;\n    }\n\n    public @Nullable String getStringOrNull(String key) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        return null;\n      }\n      if (!(ret instanceof String string)) {\n        throw new FormatException(key, \"string\", ret.getClass());\n      }\n      return string;\n    }\n\n    public JsObject getObject(String key) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        throw new MissingFieldException(this, key);\n      }\n      if (!(ret instanceof JsObject jsObject)) {\n        throw new FormatException(key, \"object\", ret.getClass());\n      }\n      return jsObject;\n    }\n\n    public JsArray getArray(String key) throws JsonParseException {\n      var ret = get(key);\n      if (ret == null) {\n        throw new MissingFieldException(this, key);\n      }\n      if (!(ret instanceof JsArray jsArray)) {\n        throw new FormatException(key, \"array\", ret.getClass());\n      }\n      return jsArray;\n    }\n\n    public Version getVersion(String key) throws JsonParseException {\n      var versionStr = getString(key);\n      try {\n        return Version.parse(versionStr);\n      } catch (IllegalArgumentException e) {\n        throw new MappingException(key, e);\n      }\n    }\n\n    public URI getURI(String key) throws JsonParseException {\n      var result = getURIOrNull(key);\n      if (result == null) {\n        throw new MissingFieldException(this, key);\n      }\n      return result;\n    }\n\n    public @Nullable URI getURIOrNull(String key) throws JsonParseException {\n      var uriStr = getStringOrNull(key);\n      if (uriStr == null) {\n        return null;\n      }\n      try {\n        return new URI(uriStr);\n      } catch (URISyntaxException e) {\n        throw new MappingException(key, e);\n      }\n    }\n\n    @Override\n    public int size() {\n      return delegate.size();\n    }\n\n    @Override\n    public boolean isEmpty() {\n      return delegate.isEmpty();\n    }\n\n    @Override\n    public boolean containsKey(Object key) {\n      return delegate.containsKey(key);\n    }\n\n    @Override\n    public boolean containsValue(Object value) {\n      return delegate.containsValue(value);\n    }\n\n    @Override\n    public @Nullable Object get(Object key) {\n      return delegate.get(key);\n    }\n\n    @Override\n    public @Nullable Object put(String key, Object value) {\n      return delegate.put(key, value);\n    }\n\n    @Override\n    public Object remove(Object key) {\n      return delegate.remove(key);\n    }\n\n    @Override\n    public void putAll(Map<? extends String, ?> m) {\n      delegate.putAll(m);\n    }\n\n    @Override\n    public void clear() {\n      delegate.clear();\n    }\n\n    @Override\n    public Set<String> keySet() {\n      return delegate.keySet();\n    }\n\n    @Override\n    public Collection<Object> values() {\n      return delegate.values();\n    }\n\n    @Override\n    public Set<Entry<String, Object>> entrySet() {\n      return delegate.entrySet();\n    }\n\n    @Override\n    public String toString() {\n      return delegate.toString();\n    }\n  }\n\n  public static class JsArray implements List<Object> {\n    private final List<Object> delegate;\n\n    public JsArray() {\n      this.delegate = new ArrayList<>();\n    }\n\n    public JsArray(int size) {\n      this.delegate = new ArrayList<>(size);\n    }\n\n    @Override\n    public int size() {\n      return delegate.size();\n    }\n\n    @Override\n    public boolean isEmpty() {\n      return delegate.isEmpty();\n    }\n\n    @Override\n    public boolean contains(Object o) {\n      return delegate.contains(o);\n    }\n\n    @Override\n    public Iterator<Object> iterator() {\n      return delegate.iterator();\n    }\n\n    @Override\n    public Object[] toArray() {\n      return delegate.toArray();\n    }\n\n    @Override\n    public <T> T[] toArray(T[] a) {\n      return delegate.toArray(a);\n    }\n\n    @Override\n    public boolean add(Object o) {\n      return delegate.add(o);\n    }\n\n    @Override\n    public boolean remove(Object o) {\n      return delegate.remove(o);\n    }\n\n    @SuppressWarnings(\"SlowListContainsAll\")\n    @Override\n    public boolean containsAll(Collection<?> c) {\n      return delegate.containsAll(c);\n    }\n\n    @Override\n    public boolean addAll(Collection<?> c) {\n      return delegate.addAll(c);\n    }\n\n    @Override\n    public boolean addAll(int index, Collection<?> c) {\n      return delegate.addAll(index, c);\n    }\n\n    @Override\n    public boolean removeAll(Collection<?> c) {\n      return delegate.removeAll(c);\n    }\n\n    @Override\n    public boolean retainAll(Collection<?> c) {\n      return delegate.retainAll(c);\n    }\n\n    @Override\n    public void clear() {\n      delegate.clear();\n    }\n\n    @Override\n    public @Nullable Object get(int index) {\n      return delegate.get(index);\n    }\n\n    @Override\n    public Object set(int index, Object element) {\n      return delegate.set(index, element);\n    }\n\n    @Override\n    public void add(int index, Object element) {\n      delegate.add(index, element);\n    }\n\n    @Override\n    public Object remove(int index) {\n      return delegate.remove(index);\n    }\n\n    @Override\n    public int indexOf(Object o) {\n      return delegate.indexOf(o);\n    }\n\n    @Override\n    public int lastIndexOf(Object o) {\n      return delegate.lastIndexOf(o);\n    }\n\n    @Override\n    public ListIterator<Object> listIterator() {\n      return delegate.listIterator();\n    }\n\n    @Override\n    public ListIterator<Object> listIterator(int index) {\n      return delegate.listIterator(index);\n    }\n\n    @Override\n    public List<Object> subList(int fromIndex, int toIndex) {\n      return delegate.subList(fromIndex, toIndex);\n    }\n\n    @Override\n    public String toString() {\n      return delegate.toString();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/JsonEscaper.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\nimport org.pkl.core.util.AbstractCharEscaper;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\npublic final class JsonEscaper extends AbstractCharEscaper {\n  /*\n   * From RFC 7159, \"All Unicode characters may be placed within the\n   * quotation marks except for the characters that must be escaped:\n   * quotation mark, reverse solidus, and the control characters\n   * (U+0000 through U+001F).\"\n   *\n   * We also escape '\\u2028' and '\\u2029', which JavaScript interprets as\n   * newline characters. This prevents eval() from failing with a syntax\n   * error. http://code.google.com/p/google-gson/issues/detail?id=341\n   */\n  private static final String[] REPLACEMENTS;\n  private static final String[] HTML_SAFE_REPLACEMENTS;\n\n  private final @Nullable String[] replacements;\n\n  static {\n    REPLACEMENTS = new String['\\\\' + 1];\n    for (var i = 0; i < 0x20; i++) {\n      REPLACEMENTS[i] = IoUtils.toUnicodeEscape(i);\n    }\n    REPLACEMENTS['\"'] = \"\\\\\\\"\";\n    REPLACEMENTS['\\t'] = \"\\\\t\";\n    REPLACEMENTS['\\b'] = \"\\\\b\";\n    REPLACEMENTS['\\n'] = \"\\\\n\";\n    REPLACEMENTS['\\r'] = \"\\\\r\";\n    REPLACEMENTS['\\f'] = \"\\\\f\";\n    REPLACEMENTS['\\\\'] = \"\\\\\\\\\";\n\n    HTML_SAFE_REPLACEMENTS = REPLACEMENTS.clone();\n    HTML_SAFE_REPLACEMENTS['<'] = \"\\\\u003c\";\n    HTML_SAFE_REPLACEMENTS['>'] = \"\\\\u003e\";\n    HTML_SAFE_REPLACEMENTS['&'] = \"\\\\u0026\";\n    HTML_SAFE_REPLACEMENTS['='] = \"\\\\u003d\";\n    HTML_SAFE_REPLACEMENTS['\\''] = \"\\\\u0027\";\n  }\n\n  public JsonEscaper(boolean isHtmlSafe) {\n    replacements = isHtmlSafe ? HTML_SAFE_REPLACEMENTS : REPLACEMENTS;\n  }\n\n  @Override\n  protected @Nullable String findReplacement(char ch) {\n    return ch <= '\\\\'\n        ? replacements[ch]\n        : ch == '\\u2028' ? \"\\\\u2028\" : ch == '\\u2029' ? \"\\\\u2029\" : null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/JsonHandler.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\n\n/**\n * A handler for parser events. Instances of this class can be given to a {@link JsonParser}. The\n * parser will then call the methods of the given handler while reading the input.\n *\n * <p>The default implementations of these methods do nothing. Subclasses may override only those\n * methods they are interested in. They can use <code>getLocation()</code> to access the current\n * character position of the parser at any point. The <code>start*</code> methods will be called\n * while the location points to the first character of the parsed element. The <code>end*</code>\n * methods will be called while the location points to the character position that directly follows\n * the last character of the parsed element. Example:\n *\n * <pre>\n * [\"lorem ipsum\"]\n *  ^            ^\n *  startString  endString\n * </pre>\n *\n * <p>Subclasses that build an object representation of the parsed JSON can return arbitrary handler\n * objects for JSON arrays and JSON objects in {@link #startArray()} and {@link #startObject()}.\n * These handler objects will then be provided in all subsequent parser events for this particular\n * array or object. They can be used to keep track the elements of a JSON array or object.\n *\n * @param <A> The type of handlers used for JSON arrays\n * @param <O> The type of handlers used for JSON objects\n * @see JsonParser\n */\npublic abstract class JsonHandler<A, O> {\n  @LateInit JsonParser parser;\n\n  /**\n   * Returns the current parser location.\n   *\n   * @return the current parser location\n   */\n  protected Location getLocation() {\n    return parser.getLocation();\n  }\n\n  /**\n   * Indicates the beginning of a <code>null</code> literal in the JSON input. This method will be\n   * called when reading the first character of the literal.\n   */\n  public void startNull() {}\n\n  /**\n   * Indicates the end of a <code>null</code> literal in the JSON input. This method will be called\n   * after reading the last character of the literal.\n   */\n  public void endNull() {}\n\n  /**\n   * Indicates the beginning of a boolean literal (<code>true</code> or <code>false</code>) in the\n   * JSON input. This method will be called when reading the first character of the literal.\n   */\n  public void startBoolean() {}\n\n  /**\n   * Indicates the end of a boolean literal (<code>true</code> or <code>false</code>) in the JSON\n   * input. This method will be called after reading the last character of the literal.\n   *\n   * @param value the parsed boolean value\n   */\n  public void endBoolean(boolean value) {}\n\n  /**\n   * Indicates the beginning of a string in the JSON input. This method will be called when reading\n   * the opening double quote character (<code>'&quot;'</code>).\n   */\n  public void startString() {}\n\n  /**\n   * Indicates the end of a string in the JSON input. This method will be called after reading the\n   * closing double quote character (<code>'&quot;'</code>).\n   *\n   * @param string the parsed string\n   */\n  public void endString(String string) {}\n\n  /**\n   * Indicates the beginning of a number in the JSON input. This method will be called when reading\n   * the first character of the number.\n   */\n  public void startNumber() {}\n\n  /**\n   * Indicates the end of a number in the JSON input. This method will be called after reading the\n   * last character of the number.\n   *\n   * @param string the parsed number string\n   */\n  public void endNumber(String string) {}\n\n  /**\n   * Indicates the beginning of an array in the JSON input. This method will be called when reading\n   * the opening square bracket character (<code>'['</code>).\n   *\n   * <p>This method may return an object to handle subsequent parser events for this array. This\n   * array handler will then be provided in all calls to {@link #startArrayValue(Object)\n   * startArrayValue()}, {@link #endArrayValue(Object) endArrayValue()}, and {@link\n   * #endArray(Object) endArray()} for this array.\n   *\n   * @return a handler for this array, or <code>null</code> if not needed\n   */\n  public @Nullable A startArray() {\n    return null;\n  }\n\n  /**\n   * Indicates the end of an array in the JSON input. This method will be called after reading the\n   * closing square bracket character (<code>']'</code>).\n   *\n   * @param array the array handler returned from {@link #startArray()}, or <code>null</code> if not\n   *     provided\n   */\n  public void endArray(@Nullable A array) {}\n\n  /**\n   * Indicates the beginning of an array element in the JSON input. This method will be called when\n   * reading the first character of the element, just before the call to the <code>start</code>\n   * method for the specific element type ({@link #startString()}, {@link #startNumber()}, etc.).\n   *\n   * @param array the array handler returned from {@link #startArray()}, or <code>null</code> if not\n   *     provided\n   */\n  public void startArrayValue(@SuppressWarnings(\"unused\") @Nullable A array) {}\n\n  /**\n   * Indicates the end of an array element in the JSON input. This method will be called after\n   * reading the last character of the element value, just after the <code>end</code> method for the\n   * specific element type (like {@link #endString(String) endString()}, {@link #endNumber(String)\n   * endNumber()}, etc.).\n   *\n   * @param array the array handler returned from {@link #startArray()}, or <code>null</code> if not\n   *     provided\n   */\n  public void endArrayValue(@Nullable A array) {}\n\n  /**\n   * Indicates the beginning of an object in the JSON input. This method will be called when reading\n   * the opening curly bracket character (<code>'{'</code>).\n   *\n   * <p>This method may return an object to handle subsequent parser events for this object. This\n   * object handler will be provided in all calls to {@link #startObjectName(Object)\n   * startObjectName()}, {@link #endObjectName(Object, String) endObjectName()}, {@link\n   * #startObjectValue(Object, String) startObjectValue()}, {@link #endObjectValue(Object, String)\n   * endObjectValue()}, and {@link #endObject(Object) endObject()} for this object.\n   *\n   * @return a handler for this object, or <code>null</code> if not needed\n   */\n  public @Nullable O startObject() {\n    return null;\n  }\n\n  /**\n   * Indicates the end of an object in the JSON input. This method will be called after reading the\n   * closing curly bracket character (<code>'}'</code>).\n   *\n   * @param object the object handler returned from {@link #startObject()}, or null if not provided\n   */\n  public void endObject(@Nullable O object) {}\n\n  /**\n   * Indicates the beginning of the name of an object member in the JSON input. This method will be\n   * called when reading the opening quote character ('&quot;') of the member name.\n   *\n   * @param object the object handler returned from {@link #startObject()}, or <code>null</code> if\n   *     not provided\n   */\n  public void startObjectName(@SuppressWarnings(\"unused\") @Nullable O object) {}\n\n  /**\n   * Indicates the end of an object member name in the JSON input. This method will be called after\n   * reading the closing quote character (<code>'\"'</code>) of the member name.\n   *\n   * @param object the object handler returned from {@link #startObject()}, or null if not provided\n   * @param name the parsed member name\n   */\n  @SuppressWarnings(\"unused\")\n  public void endObjectName(@Nullable O object, String name) {}\n\n  /**\n   * Indicates the beginning of the name of an object member in the JSON input. This method will be\n   * called when reading the opening quote character ('&quot;') of the member name.\n   *\n   * @param object the object handler returned from {@link #startObject()}, or <code>null</code> if\n   *     not provided\n   * @param name the member name\n   */\n  public void startObjectValue(@Nullable O object, String name) {}\n\n  /**\n   * Indicates the end of an object member value in the JSON input. This method will be called after\n   * reading the last character of the member value, just after the <code>end</code> method for the\n   * specific member type (like {@link #endString(String) endString()}, {@link #endNumber(String)\n   * endNumber()}, etc.).\n   *\n   * @param object the object handler returned from {@link #startObject()}, or null if not provided\n   * @param name the parsed member name\n   */\n  public void endObjectValue(@Nullable O object, String name) {}\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/JsonParser.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.StringReader;\nimport org.pkl.core.util.LateInit;\n\n/** A streaming parser for JSON text. The parser reports all events to a given handler. */\npublic final class JsonParser {\n\n  private static final int MAX_NESTING_LEVEL = 1000;\n  private static final int MIN_BUFFER_SIZE = 10;\n  private static final int DEFAULT_BUFFER_SIZE = 1024;\n\n  private final JsonHandler<Object, Object> handler;\n  @LateInit private Reader reader;\n  @LateInit private char[] buffer;\n  private int bufferOffset;\n  private int index;\n  private int fill;\n  private int line;\n  private int lineOffset;\n  private int current;\n  @LateInit private StringBuilder captureBuffer;\n  private int captureStart;\n  private int nestingLevel;\n\n  /*\n   * |                      bufferOffset\n   *                        v\n   * [a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t]        < input\n   *                       [l|m|n|o|p|q|r|s|t|?|?]    < buffer\n   *                          ^               ^\n   *                       |  index           fill\n   */\n\n  /**\n   * Creates a new JsonParser with the given handler. The parser will report all parser events to\n   * this handler.\n   *\n   * @param handler the handler to process parser events\n   */\n  @SuppressWarnings(\"unchecked\")\n  public JsonParser(JsonHandler<?, ?> handler) {\n    this.handler = (JsonHandler<Object, Object>) handler;\n    handler.parser = this;\n  }\n\n  /**\n   * Parses the given input string. The input must contain a valid JSON value, optionally padded\n   * with whitespace.\n   *\n   * @param string the input string, must be valid JSON\n   * @throws ParseException if the input is not valid JSON\n   */\n  public void parse(String string) {\n    var bufferSize = Math.max(MIN_BUFFER_SIZE, Math.min(DEFAULT_BUFFER_SIZE, string.length()));\n    try {\n      parse(new StringReader(string), bufferSize);\n    } catch (IOException exception) {\n      // StringReader does not throw IOException\n      throw new RuntimeException(exception);\n    }\n  }\n\n  /**\n   * Reads the entire input from the given reader and parses it as JSON. The input must contain a\n   * valid JSON value, optionally padded with whitespace.\n   *\n   * <p>Characters are read in chunks into a default-sized input buffer. Hence, wrapping a reader in\n   * an additional <code>BufferedReader</code> likely won't improve reading performance.\n   *\n   * @param reader the reader to read the input from\n   * @throws IOException if an I/O error occurs in the reader\n   * @throws ParseException if the input is not valid JSON\n   */\n  public void parse(Reader reader) throws IOException {\n    parse(reader, DEFAULT_BUFFER_SIZE);\n  }\n\n  /**\n   * Reads the entire input from the given reader and parses it as JSON. The input must contain a\n   * valid JSON value, optionally padded with whitespace.\n   *\n   * <p>Characters are read in chunks into an input buffer of the given size. Hence, wrapping a\n   * reader in an additional <code>BufferedReader</code> likely won't improve reading performance.\n   *\n   * @param reader the reader to read the input from\n   * @param buffersize the size of the input buffer in chars\n   * @throws IOException if an I/O error occurs in the reader\n   * @throws ParseException if the input is not valid JSON\n   */\n  public void parse(Reader reader, int buffersize) throws IOException {\n    if (buffersize <= 0) {\n      throw new IllegalArgumentException(\"buffersize is zero or negative\");\n    }\n    this.reader = reader;\n    buffer = new char[buffersize];\n    bufferOffset = 0;\n    index = 0;\n    fill = 0;\n    line = 1;\n    lineOffset = 0;\n    current = 0;\n    captureStart = -1;\n    read();\n    skipWhiteSpace();\n    readValue();\n    skipWhiteSpace();\n    if (!isEndOfText()) {\n      throw error(\"Unexpected character\");\n    }\n  }\n\n  private void readValue() throws IOException {\n    switch (current) {\n      case 'n' -> readNull();\n      case 't' -> readTrue();\n      case 'f' -> readFalse();\n      case '\"' -> readString();\n      case '[' -> readArray();\n      case '{' -> readObject();\n      case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> readNumber();\n      default -> throw expected(\"value\");\n    }\n  }\n\n  private void readArray() throws IOException {\n    var array = handler.startArray();\n    read();\n    if (++nestingLevel > MAX_NESTING_LEVEL) {\n      throw error(\"Nesting too deep\");\n    }\n    skipWhiteSpace();\n    if (readChar(']')) {\n      nestingLevel--;\n      handler.endArray(array);\n      return;\n    }\n    do {\n      skipWhiteSpace();\n      handler.startArrayValue(array);\n      readValue();\n      handler.endArrayValue(array);\n      skipWhiteSpace();\n    } while (readChar(','));\n    if (!readChar(']')) {\n      throw expected(\"',' or ']'\");\n    }\n    nestingLevel--;\n    handler.endArray(array);\n  }\n\n  private void readObject() throws IOException {\n    var object = handler.startObject();\n    read();\n    if (++nestingLevel > MAX_NESTING_LEVEL) {\n      throw error(\"Nesting too deep\");\n    }\n    skipWhiteSpace();\n    if (readChar('}')) {\n      nestingLevel--;\n      handler.endObject(object);\n      return;\n    }\n    do {\n      skipWhiteSpace();\n      handler.startObjectName(object);\n      var name = readName();\n      handler.endObjectName(object, name);\n      skipWhiteSpace();\n      if (!readChar(':')) {\n        throw expected(\"':'\");\n      }\n      skipWhiteSpace();\n      handler.startObjectValue(object, name);\n      readValue();\n      handler.endObjectValue(object, name);\n      skipWhiteSpace();\n    } while (readChar(','));\n    if (!readChar('}')) {\n      throw expected(\"',' or '}'\");\n    }\n    nestingLevel--;\n    handler.endObject(object);\n  }\n\n  private String readName() throws IOException {\n    if (current != '\"') {\n      throw expected(\"name\");\n    }\n    return readStringInternal();\n  }\n\n  private void readNull() throws IOException {\n    handler.startNull();\n    read();\n    readRequiredChar('u');\n    readRequiredChar('l');\n    readRequiredChar('l');\n    handler.endNull();\n  }\n\n  private void readTrue() throws IOException {\n    handler.startBoolean();\n    read();\n    readRequiredChar('r');\n    readRequiredChar('u');\n    readRequiredChar('e');\n    handler.endBoolean(true);\n  }\n\n  private void readFalse() throws IOException {\n    handler.startBoolean();\n    read();\n    readRequiredChar('a');\n    readRequiredChar('l');\n    readRequiredChar('s');\n    readRequiredChar('e');\n    handler.endBoolean(false);\n  }\n\n  private void readRequiredChar(char ch) throws IOException {\n    if (!readChar(ch)) {\n      throw expected(\"'\" + ch + \"'\");\n    }\n  }\n\n  private void readString() throws IOException {\n    handler.startString();\n    handler.endString(readStringInternal());\n  }\n\n  private String readStringInternal() throws IOException {\n    read();\n    startCapture();\n    while (current != '\"') {\n      if (current == '\\\\') {\n        pauseCapture();\n        readEscape();\n        startCapture();\n      } else if (current < 0x20) {\n        throw expected(\"valid string character\");\n      } else {\n        read();\n      }\n    }\n    var string = endCapture();\n    read();\n    return string;\n  }\n\n  private void readEscape() throws IOException {\n    read();\n    switch (current) {\n      case '\"', '/', '\\\\' -> captureBuffer.append((char) current);\n      case 'b' -> captureBuffer.append('\\b');\n      case 'f' -> captureBuffer.append('\\f');\n      case 'n' -> captureBuffer.append('\\n');\n      case 'r' -> captureBuffer.append('\\r');\n      case 't' -> captureBuffer.append('\\t');\n      case 'u' -> {\n        var hexChars = new char[4];\n        for (var i = 0; i < 4; i++) {\n          read();\n          if (!isHexDigit()) {\n            throw expected(\"hexadecimal digit\");\n          }\n          hexChars[i] = (char) current;\n        }\n        captureBuffer.append((char) Integer.parseInt(new String(hexChars), 16));\n      }\n      default -> throw expected(\"valid escape sequence\");\n    }\n    read();\n  }\n\n  private void readNumber() throws IOException {\n    handler.startNumber();\n    startCapture();\n    readChar('-');\n    var firstDigit = current;\n    if (!readDigit()) {\n      throw expected(\"digit\");\n    }\n    if (firstDigit != '0') {\n      //noinspection StatementWithEmptyBody\n      while (readDigit()) {}\n    }\n    readFraction();\n    readExponent();\n    handler.endNumber(endCapture());\n  }\n\n  @SuppressWarnings(\"UnusedReturnValue\")\n  private boolean readFraction() throws IOException {\n    if (!readChar('.')) {\n      return false;\n    }\n    if (!readDigit()) {\n      throw expected(\"digit\");\n    }\n    //noinspection StatementWithEmptyBody\n    while (readDigit()) {}\n    return true;\n  }\n\n  @SuppressWarnings(\"UnusedReturnValue\")\n  private boolean readExponent() throws IOException {\n    if (!readChar('e') && !readChar('E')) {\n      return false;\n    }\n    if (!readChar('+')) {\n      readChar('-');\n    }\n    if (!readDigit()) {\n      throw expected(\"digit\");\n    }\n    //noinspection StatementWithEmptyBody\n    while (readDigit()) {}\n    return true;\n  }\n\n  private boolean readChar(char ch) throws IOException {\n    if (current != ch) {\n      return false;\n    }\n    read();\n    return true;\n  }\n\n  private boolean readDigit() throws IOException {\n    if (!isDigit()) {\n      return false;\n    }\n    read();\n    return true;\n  }\n\n  private void skipWhiteSpace() throws IOException {\n    while (isWhiteSpace()) {\n      read();\n    }\n  }\n\n  private void read() throws IOException {\n    if (index == fill) {\n      if (captureStart != -1) {\n        captureBuffer.append(buffer, captureStart, fill - captureStart);\n        captureStart = 0;\n      }\n      bufferOffset += fill;\n      fill = reader.read(buffer, 0, buffer.length);\n      index = 0;\n      if (fill == -1) {\n        current = -1;\n        index++;\n        return;\n      }\n    }\n    if (current == '\\n') {\n      line++;\n      lineOffset = bufferOffset + index;\n    }\n    current = buffer[index++];\n  }\n\n  private void startCapture() {\n    if (captureBuffer == null) {\n      captureBuffer = new StringBuilder();\n    }\n    captureStart = index - 1;\n  }\n\n  private void pauseCapture() {\n    var end = current == -1 ? index : index - 1;\n    captureBuffer.append(buffer, captureStart, end - captureStart);\n    captureStart = -1;\n  }\n\n  private String endCapture() {\n    var start = captureStart;\n    var end = index - 1;\n    captureStart = -1;\n    if (!captureBuffer.isEmpty()) {\n      captureBuffer.append(buffer, start, end - start);\n      var captured = captureBuffer.toString();\n      captureBuffer.setLength(0);\n      return captured;\n    }\n    return new String(buffer, start, end - start);\n  }\n\n  Location getLocation() {\n    var offset = bufferOffset + index - 1;\n    var column = offset - lineOffset + 1;\n    return new Location(offset, line, column);\n  }\n\n  private ParseException expected(String expected) {\n    if (isEndOfText()) {\n      return error(\"Unexpected end of input\");\n    }\n    return error(\"Expected \" + expected);\n  }\n\n  private ParseException error(String message) {\n    return new ParseException(message, getLocation());\n  }\n\n  private boolean isWhiteSpace() {\n    return current == ' ' || current == '\\t' || current == '\\n' || current == '\\r';\n  }\n\n  private boolean isDigit() {\n    return current >= '0' && current <= '9';\n  }\n\n  private boolean isHexDigit() {\n    return current >= '0' && current <= '9'\n        || current >= 'a' && current <= 'f'\n        || current >= 'A' && current <= 'F';\n  }\n\n  private boolean isEndOfText() {\n    return current == -1;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/JsonWriter.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\nimport java.io.Closeable;\nimport java.io.Flushable;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.util.*;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Writes a JSON (<a href=\"http://www.ietf.org/rfc/rfc7159.txt\">RFC 7159</a>) encoded value to a\n * stream, one token at a time. The stream includes both literal values (strings, numbers, booleans\n * and nulls) as well as the begin and end delimiters of objects and arrays.\n *\n * <h3>Encoding JSON</h3>\n *\n * To encode your data as JSON, create a new {@code JsonWriter}. Each JSON document must contain one\n * top-level array or object. Call methods on the writer as you walk the structure's contents,\n * nesting arrays and objects as necessary:\n *\n * <ul>\n *   <li>To write <strong>arrays</strong>, first call {@link #beginArray()}. Write each of the\n *       array's elements with the appropriate {@link #value} methods or by nesting other arrays and\n *       objects. Finally close the array using {@link #endArray()}.\n *   <li>To write <strong>objects</strong>, first call {@link #beginObject()}. Write each of the\n *       object's properties by alternating calls to {@link #name} with the property's value. Write\n *       property values with the appropriate {@link #value} method or by nesting other objects or\n *       arrays. Finally close the object using {@link #endObject()}.\n * </ul>\n *\n * <h3>Example</h3>\n *\n * Suppose we'd like to encode a stream of messages such as the following:\n *\n * <pre>{@code\n * [\n *   {\n *     \"id\": 912345678901,\n *     \"text\": \"How do I stream JSON in Java?\",\n *     \"geo\": null,\n *     \"user\": {\n *       \"name\": \"json_newb\",\n *       \"followers_count\": 41\n *      }\n *   },\n *   {\n *     \"id\": 912345678902,\n *     \"text\": \"@json_newb just use JsonWriter!\",\n *     \"geo\": [50.454722, -104.606667],\n *     \"user\": {\n *       \"name\": \"jesse\",\n *       \"followers_count\": 2\n *     }\n *   }\n * ]\n * }</pre>\n *\n * This code encodes the above structure:\n *\n * <pre>{@code\n * public void writeJsonStream(OutputStream out, List<Message> messages) throws IOException {\n *   JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, \"UTF-8\"));\n *   writer.setIndent(\"    \");\n *   writeMessagesArray(writer, messages);\n *   writer.close();\n * }\n *\n * public void writeMessagesArray(JsonWriter writer, List<Message> messages) throws IOException {\n *   writer.beginArray();\n *   for (Message message : messages) {\n *     writeMessage(writer, message);\n *   }\n *   writer.endArray();\n * }\n *\n * public void writeMessage(JsonWriter writer, Message message) throws IOException {\n *   writer.beginObject();\n *   writer.name(\"id\").value(message.getId());\n *   writer.name(\"text\").value(message.getText());\n *   if (message.getGeo() != null) {\n *     writer.name(\"geo\");\n *     writeDoublesArray(writer, message.getGeo());\n *   } else {\n *     writer.name(\"geo\").nullValue();\n *   }\n *   writer.name(\"user\");\n *   writeUser(writer, message.getUser());\n *   writer.endObject();\n * }\n *\n * public void writeUser(JsonWriter writer, User user) throws IOException {\n *   writer.beginObject();\n *   writer.name(\"name\").value(user.getName());\n *   writer.name(\"followers_count\").value(user.getFollowersCount());\n *   writer.endObject();\n * }\n *\n * public void writeDoublesArray(JsonWriter writer, List<Double> doubles) throws IOException {\n *   writer.beginArray();\n *   for (Double value : doubles) {\n *     writer.value(value);\n *   }\n *   writer.endArray();\n * }\n * }</pre>\n *\n * <p>Each {@code JsonWriter} may be used to write a single JSON stream. Instances of this class are\n * not thread safe. Calls that would result in a malformed JSON string will fail with an {@link\n * IllegalStateException}.\n *\n * @author Jesse Wilson\n * @since 1.6\n */\n@SuppressWarnings({\"unused\", \"UnusedReturnValue\"})\npublic final class JsonWriter implements Closeable, Flushable {\n  /** An array with no elements requires no separators or newlines before it is closed. */\n  static final int EMPTY_ARRAY = 1;\n\n  /** An array with at least one value requires a comma and newline before the next element. */\n  static final int NONEMPTY_ARRAY = 2;\n\n  /** An object with no name/value pairs requires no separators or newlines before it is closed. */\n  static final int EMPTY_OBJECT = 3;\n\n  /** An object whose most recent element is a key. The next element must be a value. */\n  static final int DANGLING_NAME = 4;\n\n  /**\n   * An object with at least one name/value pair requires a comma and newline before the next\n   * element.\n   */\n  static final int NONEMPTY_OBJECT = 5;\n\n  /** No object or array has been started. */\n  static final int EMPTY_DOCUMENT = 6;\n\n  /** A document with at an array or object. */\n  static final int NONEMPTY_DOCUMENT = 7;\n\n  /** A document that's been closed and cannot be accessed. */\n  static final int CLOSED = 8;\n\n  /** The output data, containing at most one top-level array or object. */\n  private final Writer out;\n\n  private int[] stack = new int[32];\n  private int stackSize = 0;\n\n  {\n    push(EMPTY_DOCUMENT);\n  }\n\n  /**\n   * A string containing a full set of spaces for a single level of indentation, or null for no\n   * pretty printing.\n   */\n  private @Nullable String indent;\n\n  /** The name/value separator; either \":\" or \": \". */\n  private String separator = \":\";\n\n  private boolean lenient;\n\n  private boolean htmlSafe;\n\n  private JsonEscaper escaper = new JsonEscaper(false);\n\n  private @Nullable String deferredName;\n\n  private boolean serializeNulls = true;\n\n  /**\n   * Creates a new instance that writes a JSON-encoded stream to {@code out}. For best performance,\n   * ensure {@link Writer} is buffered; wrapping in {@link java.io.BufferedWriter BufferedWriter} if\n   * necessary.\n   */\n  public JsonWriter(Writer out) {\n    this.out = out;\n  }\n\n  /**\n   * Sets the indentation string to be repeated for each level of indentation in the encoded\n   * document. If {@code indent.isEmpty()} the encoded document will be compact. Otherwise the\n   * encoded document will be more human-readable.\n   *\n   * @param indent a string containing only whitespace.\n   */\n  public void setIndent(String indent) {\n    if (indent.isEmpty()) {\n      this.indent = null;\n      this.separator = \":\";\n    } else {\n      this.indent = indent;\n      this.separator = \": \";\n    }\n  }\n\n  /**\n   * Configure this writer to relax its syntax rules. By default, this writer only emits well-formed\n   * JSON as specified by <a href=\"http://www.ietf.org/rfc/rfc7159.txt\">RFC 7159</a>. Setting the\n   * writer to lenient permits the following:\n   *\n   * <ul>\n   *   <li>Top-level values of any type. With strict writing, the top-level value must be an object\n   *       or an array.\n   *   <li>Numbers may be {@link Double#isNaN() NaNs} or {@link Double#isInfinite() infinities}.\n   * </ul>\n   */\n  public void setLenient(boolean lenient) {\n    this.lenient = lenient;\n  }\n\n  /** Returns true if this writer has relaxed syntax rules. */\n  public boolean isLenient() {\n    return lenient;\n  }\n\n  /**\n   * Configure this writer to emit JSON that's safe for direct inclusion in HTML and XML documents.\n   * This escapes the HTML characters {@code <}, {@code >}, {@code &} and {@code =} before writing\n   * them to the stream. Without this setting, your XML/HTML encoder should replace these characters\n   * with the corresponding escape sequences.\n   */\n  public void setHtmlSafe(boolean htmlSafe) {\n    this.htmlSafe = htmlSafe;\n    this.escaper = new JsonEscaper(htmlSafe);\n  }\n\n  /**\n   * Returns true if this writer writes JSON that's safe for inclusion in HTML and XML documents.\n   */\n  public boolean isHtmlSafe() {\n    return htmlSafe;\n  }\n\n  /**\n   * Sets whether object members are serialized when their value is null. This has no impact on\n   * array elements. The default is true.\n   */\n  public void setSerializeNulls(boolean serializeNulls) {\n    this.serializeNulls = serializeNulls;\n  }\n\n  /**\n   * Returns true if object members are serialized when their value is null. This has no impact on\n   * array elements. The default is true.\n   */\n  public boolean getSerializeNulls() {\n    return serializeNulls;\n  }\n\n  /**\n   * Begins encoding a new array. Each call to this method must be paired with a call to {@link\n   * #endArray}.\n   *\n   * @return this writer.\n   */\n  public JsonWriter beginArray() throws IOException {\n    writeDeferredName();\n    return open(EMPTY_ARRAY, '[');\n  }\n\n  /**\n   * Ends encoding the current array.\n   *\n   * @return this writer.\n   */\n  public JsonWriter endArray() throws IOException {\n    return close(EMPTY_ARRAY, NONEMPTY_ARRAY, ']');\n  }\n\n  /**\n   * Begins encoding a new object. Each call to this method must be paired with a call to {@link\n   * #endObject}.\n   *\n   * @return this writer.\n   */\n  public JsonWriter beginObject() throws IOException {\n    writeDeferredName();\n    return open(EMPTY_OBJECT, '{');\n  }\n\n  /**\n   * Ends encoding the current object.\n   *\n   * @return this writer.\n   */\n  public JsonWriter endObject() throws IOException {\n    return close(EMPTY_OBJECT, NONEMPTY_OBJECT, '}');\n  }\n\n  /** Enters a new scope by appending any necessary whitespace and the given bracket. */\n  private JsonWriter open(int empty, char openBracket) throws IOException {\n    beforeValue();\n    push(empty);\n    out.write(openBracket);\n    return this;\n  }\n\n  /** Closes the current scope by appending any necessary whitespace and the given bracket. */\n  private JsonWriter close(int empty, int nonempty, char closeBracket) throws IOException {\n    var context = peek();\n    if (context != nonempty && context != empty) {\n      throw new IllegalStateException(\"Nesting problem.\");\n    }\n    if (deferredName != null) {\n      throw new IllegalStateException(\"Dangling name: \" + deferredName);\n    }\n\n    stackSize--;\n    if (context == nonempty) {\n      newline();\n    }\n    out.write(closeBracket);\n    return this;\n  }\n\n  private void push(int newTop) {\n    if (stackSize == stack.length) {\n      stack = Arrays.copyOf(stack, stackSize * 2);\n    }\n    stack[stackSize++] = newTop;\n  }\n\n  /** Returns the value on the top of the stack. */\n  private int peek() {\n    if (stackSize == 0) {\n      throw new IllegalStateException(\"JsonWriter is closed.\");\n    }\n    return stack[stackSize - 1];\n  }\n\n  /** Replace the value on the top of the stack with the given value. */\n  private void replaceTop(int topOfStack) {\n    stack[stackSize - 1] = topOfStack;\n  }\n\n  /**\n   * Encodes the property name.\n   *\n   * @param name the name of the forthcoming value. May not be null.\n   * @return this writer.\n   */\n  public JsonWriter name(String name) {\n    if (deferredName != null) {\n      throw new IllegalStateException();\n    }\n    if (stackSize == 0) {\n      throw new IllegalStateException(\"JsonWriter is closed.\");\n    }\n    deferredName = name;\n    return this;\n  }\n\n  private void writeDeferredName() throws IOException {\n    if (deferredName != null) {\n      beforeName();\n      string(deferredName);\n      deferredName = null;\n    }\n  }\n\n  /**\n   * Encodes {@code value}.\n   *\n   * @param value the literal string value, or null to encode a null literal.\n   * @return this writer.\n   */\n  public JsonWriter value(@Nullable String value) throws IOException {\n    if (value == null) {\n      return nullValue();\n    }\n    writeDeferredName();\n    beforeValue();\n    string(value);\n    return this;\n  }\n\n  /**\n   * Encodes {@code null}.\n   *\n   * @return this writer.\n   */\n  public JsonWriter nullValue() throws IOException {\n    if (deferredName != null) {\n      if (serializeNulls) {\n        writeDeferredName();\n      } else {\n        deferredName = null;\n        return this; // skip the name and the value\n      }\n    }\n    beforeValue();\n    out.write(\"null\");\n    return this;\n  }\n\n  /**\n   * Encodes {@code value}.\n   *\n   * @return this writer.\n   */\n  public JsonWriter value(boolean value) throws IOException {\n    writeDeferredName();\n    beforeValue();\n    out.write(value ? \"true\" : \"false\");\n    return this;\n  }\n\n  /**\n   * Encodes {@code value}.\n   *\n   * @return this writer.\n   */\n  public JsonWriter value(@Nullable Boolean value) throws IOException {\n    if (value == null) {\n      return nullValue();\n    }\n    writeDeferredName();\n    beforeValue();\n    out.write(value ? \"true\" : \"false\");\n    return this;\n  }\n\n  /**\n   * Encodes {@code value}.\n   *\n   * @param value a finite value. May not be {@link Double#isNaN() NaNs} or {@link\n   *     Double#isInfinite() infinities}.\n   * @return this writer.\n   */\n  public JsonWriter value(double value) throws IOException {\n    writeDeferredName();\n    if (!lenient && (Double.isNaN(value) || Double.isInfinite(value))) {\n      throw new IllegalArgumentException(\"Numeric values must be finite, but was \" + value);\n    }\n    beforeValue();\n    out.append(Double.toString(value));\n    return this;\n  }\n\n  /**\n   * Encodes {@code value}.\n   *\n   * @return this writer.\n   */\n  public JsonWriter value(long value) throws IOException {\n    writeDeferredName();\n    beforeValue();\n    out.write(Long.toString(value));\n    return this;\n  }\n\n  /**\n   * Encodes {@code value}.\n   *\n   * @param value a finite value. May not be {@link Double#isNaN() NaNs} or {@link\n   *     Double#isInfinite() infinities}.\n   * @return this writer.\n   */\n  public JsonWriter value(@Nullable Number value) throws IOException {\n    if (value == null) {\n      return nullValue();\n    }\n\n    writeDeferredName();\n    var string = value.toString();\n    if (!lenient\n        && (string.equals(\"-Infinity\") || string.equals(\"Infinity\") || string.equals(\"NaN\"))) {\n      throw new IllegalArgumentException(\"Numeric values must be finite, but was \" + value);\n    }\n    beforeValue();\n    out.append(string);\n    return this;\n  }\n\n  /** Writes the given raw text to the underlying writer. */\n  public JsonWriter rawText(String text) throws IOException {\n    out.append(text);\n    return this;\n  }\n\n  /**\n   * Ensures all buffered data is written to the underlying {@link Writer} and flushes that writer.\n   */\n  public void flush() throws IOException {\n    if (stackSize == 0) {\n      throw new IllegalStateException(\"JsonWriter is closed.\");\n    }\n    out.flush();\n  }\n\n  /**\n   * Flushes and closes this writer and the underlying {@link Writer}.\n   *\n   * @throws IOException if the JSON document is incomplete.\n   */\n  public void close() throws IOException {\n    out.close();\n\n    var size = stackSize;\n    if (size > 1 || size == 1 && stack[size - 1] != NONEMPTY_DOCUMENT) {\n      throw new IOException(\"Incomplete document\");\n    }\n    stackSize = 0;\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private void string(String value) throws IOException {\n    out.write('\"');\n    out.write(escaper.escape(value));\n    out.write('\"');\n  }\n\n  public void newline() throws IOException {\n    if (indent == null) {\n      return;\n    }\n\n    out.write('\\n');\n    for (int i = 1, size = stackSize; i < size; i++) {\n      out.write(indent);\n    }\n  }\n\n  /**\n   * Inserts any necessary separators and whitespace before a name. Also adjusts the stack to expect\n   * the name's value.\n   */\n  private void beforeName() throws IOException {\n    var context = peek();\n    if (context == NONEMPTY_OBJECT) { // first in object\n      out.write(',');\n    } else if (context != EMPTY_OBJECT) { // not in an object!\n      throw new IllegalStateException(\"Nesting problem.\");\n    }\n    newline();\n    replaceTop(DANGLING_NAME);\n  }\n\n  /**\n   * Inserts any necessary separators and whitespace before a literal value, inline array, or inline\n   * object. Also adjusts the stack to expect either a closing bracket or another element.\n   */\n  private void beforeValue() throws IOException {\n    switch (peek()) {\n      case NONEMPTY_DOCUMENT:\n        if (!lenient) {\n          throw new IllegalStateException(\"JSON must have only one top-level value.\");\n        }\n      // fall-through\n      case EMPTY_DOCUMENT: // first in document\n        replaceTop(NONEMPTY_DOCUMENT);\n        break;\n\n      case EMPTY_ARRAY: // first in array\n        replaceTop(NONEMPTY_ARRAY);\n        newline();\n        break;\n\n      case NONEMPTY_ARRAY: // another in array\n        out.append(',');\n        newline();\n        break;\n\n      case DANGLING_NAME: // value for name\n        out.append(separator);\n        replaceTop(NONEMPTY_OBJECT);\n        break;\n\n      default:\n        throw new IllegalStateException(\"Nesting problem.\");\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/Location.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\nimport org.pkl.core.util.Nullable;\n\n/** An immutable object that represents a location in the parsed text. */\npublic final class Location {\n  /** The absolute character index, starting at 0. */\n  public final int offset;\n\n  /** The line number, starting at 1. */\n  public final int line;\n\n  /** The column number, starting at 1. */\n  public final int column;\n\n  Location(int offset, int line, int column) {\n    this.offset = offset;\n    this.column = column;\n    this.line = line;\n  }\n\n  @Override\n  public String toString() {\n    return line + \":\" + column;\n  }\n\n  @Override\n  public int hashCode() {\n    return offset;\n  }\n\n  @Override\n  public boolean equals(@Nullable Object obj) {\n    if (this == obj) {\n      return true;\n    }\n    if (obj == null) {\n      return false;\n    }\n    if (getClass() != obj.getClass()) {\n      return false;\n    }\n    var other = (Location) obj;\n    return offset == other.offset && column == other.column && line == other.line;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/ParseException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.json;\n\n/** An unchecked exception to indicate that an input does not qualify as valid JSON. */\npublic final class ParseException extends RuntimeException {\n  private final Location location;\n\n  public ParseException(String message, Location location) {\n    super(message + \" at \" + location);\n    this.location = location;\n  }\n\n  /**\n   * Returns the location at which the error occurred.\n   *\n   * @return the error location\n   */\n  public Location getLocation() {\n    return location;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/json/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://github.com/ralfstx/minimal-json\n *\n * <p>Original license:\n *\n * <p>Copyright (c) 2016 EclipseSource.\n *\n * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * <p>The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * <p>THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * <p>This package also contains source code from:\n *\n * <p>https://github.com/google/gson\n *\n * <p>Original license:\n *\n * <p>Copyright (C) 2010 Google Inc.\n *\n * <p>Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file\n * except in compliance with the License. You may obtain a copy of the License at\n *\n * <p>http://www.apache.org/licenses/LICENSE-2.0\n *\n * <p>Unless required by applicable law or agreed to in writing, software distributed under the\n * License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n * express or implied. See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@NonnullByDefault\npackage org.pkl.core.util.json;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://github.com/tdebatty/java-string-similarity\n *\n * <p>Original license:\n *\n * <p>This project is licensed under the terms of the **MIT license**.\n *\n * <p>https://opensource.org/licenses/MIT\n *\n * <p>Copyright 2015 Thibault Debatty.\n *\n * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * <p>The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * <p>THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * <p>This package also contains source code from:\n *\n * <p>https://github.com/google/guava\n *\n * <p>Original license:\n *\n * <p>Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n *\n * <p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n *\n * <p>1. Definitions.\n *\n * <p>\"License\" shall mean the terms and conditions for use, reproduction, and distribution as\n * defined by Sections 1 through 9 of this document.\n *\n * <p>\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is\n * granting the License.\n *\n * <p>\"Legal Entity\" shall mean the union of the acting entity and all other entities that control,\n * are controlled by, or are under common control with that entity. For the purposes of this\n * definition, \"control\" means (i) the power, direct or indirect, to cause the direction or\n * management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent\n * (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n *\n * <p>\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by\n * this License.\n *\n * <p>\"Source\" form shall mean the preferred form for making modifications, including but not\n * limited to software source code, documentation source, and configuration files.\n *\n * <p>\"Object\" form shall mean any form resulting from mechanical transformation or translation of a\n * Source form, including but not limited to compiled object code, generated documentation, and\n * conversions to other media types.\n *\n * <p>\"Work\" shall mean the work of authorship, whether in Source or Object form, made available\n * under the License, as indicated by a copyright notice that is included in or attached to the work\n * (an example is provided in the Appendix below).\n *\n * <p>\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or\n * derived from) the Work and for which the editorial revisions, annotations, elaborations, or other\n * modifications represent, as a whole, an original work of authorship. For the purposes of this\n * License, Derivative Works shall not include works that remain separable from, or merely link (or\n * bind by name) to the interfaces of, the Work and Derivative Works thereof.\n *\n * <p>\"Contribution\" shall mean any work of authorship, including the original version of the Work\n * and any modifications or additions to that Work or Derivative Works thereof, that is\n * intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an\n * individual or Legal Entity authorized to submit on behalf of the copyright owner. For the\n * purposes of this definition, \"submitted\" means any form of electronic, verbal, or written\n * communication sent to the Licensor or its representatives, including but not limited to\n * communication on electronic mailing lists, source code control systems, and issue tracking\n * systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and\n * improving the Work, but excluding communication that is conspicuously marked or otherwise\n * designated in writing by the copyright owner as \"Not a Contribution.\"\n *\n * <p>\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a\n * Contribution has been received by Licensor and subsequently incorporated within the Work.\n *\n * <p>2. Grant of Copyright License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display,\n * publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or\n * Object form.\n *\n * <p>3. Grant of Patent License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable (except as stated in this section) patent license to make, have made, use, offer to\n * sell, sell, import, and otherwise transfer the Work, where such license applies only to those\n * patent claims licensable by such Contributor that are necessarily infringed by their\n * Contribution(s) alone or by combination of their Contribution(s) with the Work to which such\n * Contribution(s) was submitted. If You institute patent litigation against any entity (including a\n * cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated\n * within the Work constitutes direct or contributory patent infringement, then any patent licenses\n * granted to You under this License for that Work shall terminate as of the date such litigation is\n * filed.\n *\n * <p>4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works\n * thereof in any medium, with or without modifications, and in Source or Object form, provided that\n * You meet the following conditions:\n *\n * <p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License;\n * and\n *\n * <p>(b) You must cause any modified files to carry prominent notices stating that You changed the\n * files; and\n *\n * <p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all\n * copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding\n * those notices that do not pertain to any part of the Derivative Works; and\n *\n * <p>(d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative\n * Works that You distribute must include a readable copy of the attribution notices contained\n * within such NOTICE file, excluding those notices that do not pertain to any part of the\n * Derivative Works, in at least one of the following places: within a NOTICE text file distributed\n * as part of the Derivative Works; within the Source form or documentation, if provided along with\n * the Derivative Works; or, within a display generated by the Derivative Works, if and wherever\n * such third-party notices normally appear. The contents of the NOTICE file are for informational\n * purposes only and do not modify the License. You may add Your own attribution notices within\n * Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the\n * Work, provided that such additional attribution notices cannot be construed as modifying the\n * License.\n *\n * <p>You may add Your own copyright statement to Your modifications and may provide additional or\n * different license terms and conditions for use, reproduction, or distribution of Your\n * modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and\n * distribution of the Work otherwise complies with the conditions stated in this License.\n *\n * <p>5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution\n * intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms\n * and conditions of this License, without any additional terms or conditions. Notwithstanding the\n * above, nothing herein shall supersede or modify the terms of any separate license agreement you\n * may have executed with Licensor regarding such Contributions.\n *\n * <p>6. Trademarks. This License does not grant permission to use the trade names, trademarks,\n * service marks, or product names of the Licensor, except as required for reasonable and customary\n * use in describing the origin of the Work and reproducing the content of the NOTICE file.\n *\n * <p>7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor\n * provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation,\n * any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n * PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or\n * redistributing the Work and assume any risks associated with Your exercise of permissions under\n * this License.\n *\n * <p>8. Limitation of Liability. In no event and under no legal theory, whether in tort (including\n * negligence), contract, or otherwise, unless required by applicable law (such as deliberate and\n * grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for\n * damages, including any direct, indirect, special, incidental, or consequential damages of any\n * character arising as a result of this License or out of the use or inability to use the Work\n * (including but not limited to damages for loss of goodwill, work stoppage, computer failure or\n * malfunction, or any and all other commercial damages or losses), even if such Contributor has\n * been advised of the possibility of such damages.\n *\n * <p>9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative\n * Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty,\n * indemnity, or other liability obligations and/or rights consistent with this License. However, in\n * accepting such obligations, You may act only on Your own behalf and on Your sole responsibility,\n * not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each\n * Contributor harmless for any liability incurred by, or claims asserted against, such Contributor\n * by reason of your accepting any such warranty or additional liability.\n *\n * <p>END OF TERMS AND CONDITIONS\n *\n * <p>APPENDIX: How to apply the Apache License to your work.\n *\n * <p>To apply the Apache License to your work, attach the following boilerplate notice, with the\n * fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include\n * the brackets!) The text should be enclosed in the appropriate comment syntax for the file format.\n * We also recommend that a file or class name and description of purpose be included on the same\n * \"printed page\" as the copyright notice for easier identification within third-party archives.\n *\n * <p>Copyright [yyyy] [name of copyright owner]\n *\n * <p>Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file\n * except in compliance with the License. You may obtain a copy of the License at\n *\n * <p>http://www.apache.org/licenses/LICENSE-2.0\n *\n * <p>Unless required by applicable law or agreed to in writing, software distributed under the\n * License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n * express or implied. See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@NonnullByDefault\npackage org.pkl.core.util;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/paguro/RrbTree.java",
    "content": "/*\n * Copyright © 2016-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.paguro;\n\nimport static org.organicdesign.fp.collections.Cowry.*;\nimport static org.organicdesign.fp.indent.IndentUtils.arrayString;\nimport static org.organicdesign.fp.indent.IndentUtils.indentSpace;\n\nimport java.io.*;\nimport java.util.Arrays;\nimport java.util.List;\nimport org.organicdesign.fp.collections.BaseList;\nimport org.organicdesign.fp.collections.ImList;\nimport org.organicdesign.fp.collections.MutList;\nimport org.organicdesign.fp.collections.PersistentVector;\nimport org.organicdesign.fp.collections.UnmodIterable;\nimport org.organicdesign.fp.collections.UnmodSortedIterable;\nimport org.organicdesign.fp.collections.UnmodSortedIterator;\nimport org.organicdesign.fp.function.Fn0;\nimport org.organicdesign.fp.indent.Indented;\nimport org.organicdesign.fp.oneOf.Option;\nimport org.organicdesign.fp.tuple.Tuple2;\nimport org.organicdesign.fp.tuple.Tuple4;\nimport org.pkl.core.util.Nullable;\n\n/**\n * An RRB Tree is an immutable List (like Clojure's PersistentVector) that also supports random\n * inserts, deletes, and can be split and joined back together in logarithmic time. This is based on\n * the paper, \"RRB-Trees: Efficient Immutable Vectors\" by Phil Bagwell and Tiark Rompf, with the\n * following differences:\n *\n * <ul>\n *   <li>The Relaxed nodes can be sized between n/3 and 2n/3 (Bagwell/Rompf specify n and n-1)\n *   <li>The Join operation sticks the shorter tree unaltered into the larger tree (except for very\n *       small trees which just get concatenated).\n * </ul>\n *\n * <p>Details were filled in from the Cormen, Leiserson, Rivest &amp; Stein Algorithms book entry on\n * B-Trees. Also with an awareness of the Clojure PersistentVector by Rich Hickey. All errors are by\n * Glen Peterson.\n *\n * <h4>History (what little I know):</h4>\n *\n * 1972: B-Tree: Rudolf Bayer and Ed McCreight<br>\n * 1998: Purely Functional Data Structures: Chris Okasaki<br>\n * 2007: Clojure's Persistent Vector (and HashMap) implementations: Rich Hickey<br>\n * 2012: RRB-Tree: Phil Bagwell and Tiark Rompf<br>\n *\n * <p>Compared to other collections (timings summary from 2017-06-11):\n *\n * <ul>\n *   <li>append() - {@link ImRrbt} varies between 90% and 100% of the speed of {@link\n *       PersistentVector} (biggest difference above 100K). {@link MutRrbt} varies between 45% and\n *       80% of the speed of {@link PersistentVector.MutVector} (biggest difference from 100 to 1M).\n *   <li>get() - varies between 50% and 150% of the speed of PersistentVector (PV wins above 1K) if\n *       you build RRB using append(). If you build rrb using random inserts (worst case), it goes\n *       from 90% at 10 items down to 15% of the speed of the PV at 1M items.\n *   <li>iterate() - is about the same speed as PersistentVector\n *   <li>insert(0, item) - beats ArrayList above 1K items (worse than ArrayList below 100 items).\n *   <li>insert(random, item) - beats ArrayList above 10K items (worse than ArrayList until then).\n *   <li>O(log n) split(), join(), and remove() (not timed yet).\n * </ul>\n *\n * <p>Latest detailed timing results are <a target=\"_blank\"\n * href=\"https://docs.google.com/spreadsheets/d/1D0bjfsHpmK7aJzyE2WwArlioI6w69YhZ2f-x0yM6_Z0/edit?usp=sharing\">here</a>.\n */\n@SuppressWarnings(\"WeakerAccess\")\npublic abstract class RrbTree<E> implements BaseList<E>, Indented {\n\n  private static final Object[] EMPTY_ARRAY = new Object[0];\n\n  @SuppressWarnings(\"unchecked\")\n  private static <T> T[] singleElementArray(T elem) {\n    return (T[]) new Object[] {elem};\n  }\n\n  // Focus is like the tail in Rich Hickey's Persistent Vector, but named after the structure\n  // in Scala's implementation.  Tail and focus are both designed to allow repeated appends or\n  // inserts to the same area of a vector to be done in constant time.  Tail only handles appends\n  // but this can handle repeated inserts to any area of a vector.\n\n  /** Mutable version of an {@link RrbTree}. Timing information is available there. */\n  public static class MutRrbt<E> extends RrbTree<E> implements MutList<E> {\n    private E[] focus;\n    private int focusStartIndex;\n    private int focusLength;\n    private Node<E> root;\n    private int size;\n\n    MutRrbt(E[] f, int fi, int fl, Node<E> r, int s) {\n      focus = f;\n      focusStartIndex = fi;\n      focusLength = fl;\n      root = r;\n      size = s;\n    }\n\n    @Override\n    protected MutRrbt<E> makeNew(E[] f, int fi, int fl, Node<E> r, int s) {\n      return new MutRrbt<>(f, fi, fl, r, s);\n    }\n\n    /** {@inheritDoc} */\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public MutRrbt<E> append(E val) {\n      // If our focus isn't set up for appends or if it's full, insert it into the data structure\n      // where it belongs.  Then make a new focus\n      if ((focusLength >= STRICT_NODE_LENGTH)\n          || ((focusLength > 0) && (focusStartIndex < (size - focusLength)))) {\n        root = root.pushFocus(focusStartIndex, arrayCopy(focus, focusLength, null));\n        focus = (E[]) new Object[STRICT_NODE_LENGTH];\n        focus[0] = val;\n        focusStartIndex = size;\n        focusLength = 1;\n        size++;\n        return this;\n      }\n\n      // TODO: 3. Make the root the first argument to RrbTree, MutRrbt and ImRrbt.\n\n      if (focus.length <= focusLength) {\n        focus = arrayCopy(focus, STRICT_NODE_LENGTH, null);\n      }\n      focus[focusLength] = val;\n      focusLength++;\n      size++;\n      return this;\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public MutRrbt<E> appendSome(Fn0<? extends Option<E>> supplier) {\n      return supplier.apply().match(this::append, () -> this);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public MutRrbt<E> concat(@Nullable Iterable<? extends E> es) {\n      return (MutRrbt<E>) MutList.super.concat(es);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public MutRrbt<E> precat(@Nullable Iterable<? extends E> es) {\n      // We could check if es is sized and has a size >= MIN_NODE_LENGTH\n      // and if so, do something clever with writing chunks to the underlying tree.\n      // Until then, this will handle everything almost as well.\n      //\n      // If we insert(0, item) in order, they will end up reversed, so we have to\n      // add one to the insertion point for each item added.\n      int idx = 0;\n      if (es != null) {\n        for (E e : es) {\n          insert(idx, e);\n          idx++;\n        }\n      }\n      return this;\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public E get(int i) {\n      if ((i < 0) || (i > size)) {\n        throw new IndexOutOfBoundsException(\"Index: \" + i + \" size: \" + size);\n      }\n\n      if (i >= focusStartIndex) {\n        int focusOffset = i - focusStartIndex;\n        if (focusOffset < focusLength) {\n          return focus[focusOffset];\n        }\n        i -= focusLength;\n      }\n      return root.get(i);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> immutable() {\n      return new ImRrbt<>(arrayCopy(focus, focusLength, null), focusStartIndex, root, size);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public String indentedStr(int indent) {\n      return \"RrbTree(size=\"\n          + size\n          + \" fsi=\"\n          + focusStartIndex\n          + \" focus=\"\n          + arrayString(focus)\n          + \"\\n\"\n          + indentSpace(indent + 8)\n          + \"root=\"\n          + root.indentedStr(indent + 13)\n          + \")\";\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public MutRrbt<E> insert(int idx, E element) {\n      // If the focus is full, push it into the tree and make a new one with the new element.\n      if (focusLength >= STRICT_NODE_LENGTH) {\n        root = root.pushFocus(focusStartIndex, arrayCopy(focus, focusLength, null));\n        focus = singleElementArray(element);\n        focusStartIndex = idx;\n        focusLength = 1;\n        size++;\n        return this;\n      }\n\n      // If we have no focus, add a new one at the ideal spot.\n      // TODO: Make sure Immutable does this too.\n      if (focusLength == 0) {\n        focus = singleElementArray(element);\n        focusStartIndex = idx;\n        focusLength = 1;\n        size++;\n        return this;\n      }\n\n      // If the index is within the focus, add the item there.\n      int diff = idx - focusStartIndex;\n\n      if ((diff >= 0) && (diff <= focusLength)) {\n        // Here focus length cannot be zero!\n        // We want to double the length each time up to STRICT_NODE_LENGTH\n        // because there is no guarantee that the next insert will be in the same\n        // place, so this hedges our bets.\n        if (focus.length <= focusLength) {\n          int newLen =\n              (focusLength >= HALF_STRICT_NODE_LENGTH)\n                  ? STRICT_NODE_LENGTH\n                  : focusLength << 1; // double size.\n          focus = arrayCopy(focus, newLen, null);\n        }\n        // Shift existing items past insertion index to the right\n        int numItemsToShift = focusLength - diff;\n        if (numItemsToShift > 0) {\n          System.arraycopy(focus, diff, focus, diff + 1, numItemsToShift);\n        }\n        // Put new item into the focus.\n        focus[diff] = element;\n        focusLength++;\n        size++;\n        return this;\n      }\n\n      // Here we are left with an insert somewhere else than the current focus.\n      // Here the mutable version has a focus that's longer than the number of items used,\n      // So we need to shorten it before pushing it into the tree.\n      if (focusLength > 0) {\n        root = root.pushFocus(focusStartIndex, arrayCopy(focus, focusLength, null));\n      }\n      focus = singleElementArray(element);\n      focusStartIndex = idx;\n      focusLength = 1;\n      size++;\n      return this;\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public UnmodSortedIterator<E> iterator() {\n      return new Iter(pushFocus());\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    Node<E> pushFocus() {\n      return (focusLength == 0)\n          ? root\n          : root.pushFocus(focusStartIndex, arrayCopy(focus, focusLength, null));\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public String toString() {\n      return UnmodIterable.toString(\"MutRrbt\", this);\n    }\n\n    /**\n     * Joins the given tree to the right side of this tree (or this to the left side of that one) in\n     * something like O(log n) time.\n     */\n    public MutRrbt<E> join(RrbTree<E> that) {\n      return (MutRrbt<E>) super.join(that);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public MutRrbt<E> replace(int index, E item) {\n      if ((index < 0) || (index > size)) {\n        throw new IndexOutOfBoundsException(\"Index: \" + index + \" size: \" + size);\n      }\n      if (index >= focusStartIndex) {\n        int focusOffset = index - focusStartIndex;\n        if (focusOffset < focusLength) {\n          focus[focusOffset] = item;\n          return this;\n        }\n        index -= focusLength;\n      }\n      // About to do replace with maybe-adjusted index\n      root = root.replace(index, item);\n      return this;\n    }\n\n    /** {@inheritDoc} */\n    public MutRrbt<E> without(int index) {\n      return (MutRrbt<E>) super.without(index);\n    }\n\n    @Override\n    public int size() {\n      return size;\n    }\n\n    @Override\n    protected MutRrbt<E> mt() {\n      return emptyMutable();\n    }\n\n    /**\n     * Divides this RRB-Tree such that every index less-than the given index ends up in the\n     * left-hand tree and the indexed item and all subsequent ones end up in the right-hand tree.\n     *\n     * @param splitIndex the split point (excluded from the left-tree, included in the right one)\n     * @return two new sub-trees as determined by the split point. If the point is 0 or this.size()\n     *     one tree will be empty (but never null).\n     */\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public Tuple2<MutRrbt<E>, MutRrbt<E>> split(int splitIndex) {\n      return (Tuple2<MutRrbt<E>, MutRrbt<E>>) super.split(splitIndex);\n    }\n  }\n\n  /** Immutable version of an {@link RrbTree}. Timing information is available there. */\n  public static class ImRrbt<E> extends RrbTree<E> implements ImList<E>, Serializable {\n    private final E[] focus;\n    private final int focusStartIndex;\n    private final transient Node<E> root;\n    private final int size;\n\n    ImRrbt(E[] f, int fi, Node<E> r, int s) {\n      focus = f;\n      focusStartIndex = fi;\n      root = r;\n      size = s;\n    }\n\n    @Override\n    protected ImRrbt<E> makeNew(E[] f, int fi, int fl, Node<E> r, int s) {\n      return new ImRrbt<>(f, fi, r, s);\n    }\n\n    // ===================================== Serialization =====================================\n    // This class has a custom serialized form designed to be as small as possible.  It does not\n    // have the same internal structure as an instance of this class.\n\n    // For serializable.  Make sure to change whenever internal data format changes.\n    @Serial private static final long serialVersionUID = 20170625165600L;\n\n    // Check out Josh Bloch Item 78, p. 312 for an explanation of what's going on here.\n    private static class SerializationProxy<E> implements Serializable {\n      // For serializable.  Make sure to change whenever internal data format changes.\n      @Serial private static final long serialVersionUID = 20160904155600L;\n\n      private final int size;\n      private transient RrbTree<E> rrbTree;\n\n      SerializationProxy(RrbTree<E> v) {\n        size = v.size();\n        rrbTree = v;\n      }\n\n      // Taken from Josh Bloch Item 75, p. 298\n      @Serial\n      private void writeObject(ObjectOutputStream s) throws IOException {\n        s.defaultWriteObject();\n        // Write out all elements in the proper order\n        for (E entry : rrbTree) {\n          s.writeObject(entry);\n        }\n      }\n\n      @Serial\n      @SuppressWarnings(\"unchecked\")\n      private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {\n        s.defaultReadObject();\n        MutRrbt<E> temp = emptyMutable();\n        for (int i = 0; i < size; i++) {\n          temp.append((E) s.readObject());\n        }\n        rrbTree = temp.immutable();\n      }\n\n      @Serial\n      private Object readResolve() {\n        return rrbTree;\n      }\n    }\n\n    @Serial\n    private Object writeReplace() {\n      return new SerializationProxy<>(this);\n    }\n\n    @Serial\n    private void readObject(java.io.ObjectInputStream in)\n        throws IOException, ClassNotFoundException {\n      throw new InvalidObjectException(\"Proxy required\");\n    }\n\n    // =================================== Instance Methods ===================================\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> append(E val) {\n      // If our focus isn't set up for appends or if it's full, insert it into the data\n      // structure where it belongs.  Then make a new focus\n      if ((focus.length >= STRICT_NODE_LENGTH)\n          || ((focus.length > 0) && (focusStartIndex < (size - focus.length)))) {\n        Node<E> newRoot = root.pushFocus(focusStartIndex, focus);\n        return new ImRrbt<>(singleElementArray(val), size, newRoot, size + 1);\n      }\n      return new ImRrbt<>(\n          insertIntoArrayAt(val, focus, focus.length, null), focusStartIndex, root, size + 1);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> appendSome(Fn0<? extends Option<E>> supplier) {\n      return supplier.apply().match(this::append, () -> this);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> concat(@Nullable Iterable<? extends E> es) {\n      return this.mutable().concat(es).immutable();\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> precat(@Nullable Iterable<? extends E> es) {\n      return this.mutable().precat(es).immutable();\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public E get(int i) {\n      if ((i < 0) || (i > size)) {\n        throw new IndexOutOfBoundsException(\"Index: \" + i + \" size: \" + size);\n      }\n\n      if (i >= focusStartIndex) {\n        int focusOffset = i - focusStartIndex;\n        if (focusOffset < focus.length) {\n          return focus[focusOffset];\n        }\n        i -= focus.length;\n      }\n      return root.get(i);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> insert(int idx, E element) {\n      // If the focus is full, push it into the tree and make a new one with the new element.\n      if (focus.length >= STRICT_NODE_LENGTH) {\n        Node<E> newRoot = root.pushFocus(focusStartIndex, focus);\n        E[] newFocus = singleElementArray(element);\n        return new ImRrbt<>(newFocus, idx, newRoot, size + 1);\n      }\n\n      // If the index is within the focus, add the item there.\n      int diff = idx - focusStartIndex;\n\n      if ((diff >= 0) && (diff <= focus.length)) {\n        // new focus\n        E[] newFocus = insertIntoArrayAt(element, focus, diff, null);\n        return new ImRrbt<>(newFocus, focusStartIndex, root, size + 1);\n      }\n\n      // Here we are left with an insert somewhere else than the current focus.\n      Node<E> newRoot = focus.length > 0 ? root.pushFocus(focusStartIndex, focus) : root;\n      E[] newFocus = singleElementArray(element);\n      return new ImRrbt<>(newFocus, idx, newRoot, size + 1);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public MutRrbt<E> mutable() {\n      // TODO: Should we defensively copy the root as well?\n      return new MutRrbt<>(\n          arrayCopy(focus, focus.length, null), focusStartIndex, focus.length, root, size);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public UnmodSortedIterator<E> iterator() {\n      return new Iter(pushFocus());\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    Node<E> pushFocus() {\n      return (focus.length == 0) ? root : root.pushFocus(focusStartIndex, focus);\n    }\n\n    /**\n     * Joins the given tree to the right side of this tree (or this to the left side of that one) in\n     * something like O(log n) time.\n     */\n    public ImRrbt<E> join(RrbTree<E> that) {\n      return (ImRrbt<E>) super.join(that);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public ImRrbt<E> replace(int index, E item) {\n      if ((index < 0) || (index > size)) {\n        throw new IndexOutOfBoundsException(\"Index: \" + index + \" size: \" + size);\n      }\n      if (index >= focusStartIndex) {\n        int focusOffset = index - focusStartIndex;\n        if (focusOffset < focus.length) {\n          return new ImRrbt<>(\n              replaceInArrayAt(item, focus, focusOffset, null), focusStartIndex, root, size);\n        }\n        index -= focus.length;\n      }\n      // About to do replace with maybe-adjusted index\n      return new ImRrbt<>(focus, focusStartIndex, root.replace(index, item), size);\n    }\n\n    /** {@inheritDoc} */\n    public ImRrbt<E> without(int index) {\n      return (ImRrbt<E>) super.without(index);\n    }\n\n    @Override\n    public int size() {\n      return size;\n    }\n\n    @Override\n    protected ImRrbt<E> mt() {\n      return empty();\n    }\n\n    /**\n     * Divides this RRB-Tree such that every index less-than the given index ends up in the\n     * left-hand tree and the indexed item and all subsequent ones end up in the right-hand tree.\n     *\n     * @param splitIndex the split point (excluded from the left-tree, included in the right one)\n     * @return two new sub-trees as determined by the split point. If the point is 0 or this.size()\n     *     one tree will be empty (but never null).\n     */\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public Tuple2<ImRrbt<E>, ImRrbt<E>> split(int splitIndex) {\n      return (Tuple2<ImRrbt<E>, ImRrbt<E>>) super.split(splitIndex);\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public String indentedStr(int indent) {\n      return \"RrbTree(size=\"\n          + size\n          + \" fsi=\"\n          + focusStartIndex\n          + \" focus=\"\n          + arrayString(focus)\n          + \"\\n\"\n          + indentSpace(indent + 8)\n          + \"root=\"\n          + root.indentedStr(indent + 13)\n          + \")\";\n    }\n\n    /** {@inheritDoc} */\n    @Override\n    public String toString() {\n      return UnmodIterable.toString(\"ImRrbt\", this);\n    }\n\n    @SuppressWarnings(\"rawtypes\")\n    private static final ImRrbt EMPTY_IM_RRBT = new ImRrbt<>(emptyArray(), 0, emptyLeaf(), 0);\n  }\n\n  /** Returns the empty, immutable RRB-Tree (there is only one) */\n  @SuppressWarnings(\"unchecked\")\n  public static <T> ImRrbt<T> empty() {\n    return (ImRrbt<T>) ImRrbt.EMPTY_IM_RRBT;\n  }\n\n  /** Returns the empty, mutable RRB-Tree (there is only one) */\n  @SuppressWarnings(\"unchecked\")\n  public static <T> MutRrbt<T> emptyMutable() {\n    return (MutRrbt<T>) empty().mutable();\n  }\n\n  // ===================================== Instance Methods =====================================\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract RrbTree<E> append(E t);\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract RrbTree<E> appendSome(Fn0<? extends Option<E>> supplier);\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract E get(int i);\n\n  /**\n   * Inserts an item in the RRB tree pushing the current element at that index and all subsequent\n   * elements to the right.\n   *\n   * @param idx the insertion point\n   * @param element the item to insert\n   * @return a new RRB-Tree with the item inserted.\n   */\n  @SuppressWarnings(\"WeakerAccess\")\n  public abstract RrbTree<E> insert(int idx, E element);\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract UnmodSortedIterator<E> iterator();\n\n  /*\n  I'm implementing something like the [Bagwell/Rompf RRB-Tree][1] and I'm a little unsatisfied with\n  the details of the join/merge algorithm.  I wonder if there's a standard way to do this that they\n  assume that I know (I don't), or if someone has come up with a better way to do this.\n\n  My basic approach was to fit the shorter tree into the left-most or right-most leg of the taller\n  tree at the correct height.  For `a.join(b)`, if `b` is taller, fit `a` into `b`'s left-most leg at\n  the right height, otherwise fit `b` into `a`'s right-most leg at the right height\n\n  Overview:\n\n  1. Push the focus of both trees, so we don't have to worry about it.\n\n  2. Find the height of each tree.\n\n  3. Stick the shorter tree into the proper level of the larger tree (on the left or right as\n  appropriate).  If the leftmost/rightmost node at the proper level of the larger tree is full,\n  add a \"skinny leg\" (a new root with a single child) to the short tree and stick it on the left or\n  right one level up in the large one.  If the large tree is packed, several skinny-leg insertion\n  attempts may be required, or even a new root added to the large tree with 2 children: the old\n  large tree and the smaller tree on the appropriate side of it.\n\n  Optimization: If one tree is really small, we could do an append or prepend.\n\n  I don't see the advantage of zipping nodes together at every level the very complicated\n  way it seems to do in the paper.  Even after all that work, it still has nodes of varying sizes and\n  involves changing more nodes than maybe necessary.\n\n    [1]: https://infoscience.epfl.ch/record/169879/files/RMTrees.pdf\n  */\n\n  /**\n   * Joins the given tree to the right side of this tree (or this to the left side of that one) in\n   * something like O(log n) time.\n   */\n  public RrbTree<E> join(RrbTree<E> that) {\n    // We don't want to wonder below if we're inserting leaves or branch-nodes.\n    // Also, it leaves the tree cleaner to just smash leaves onto the bigger tree.\n    // Ultimately, we might want to see if we can grab the tail and stick it where it\n    // belongs but for now, this should be alright.\n    if (that.size() <= MAX_NODE_LENGTH) {\n      return (RrbTree<E>) concat(that);\n    }\n    if (this.size() <= MAX_NODE_LENGTH) {\n      for (int i = 0; i < size(); i++) {\n        that = that.insert(i, this.get(i));\n      }\n      return that;\n    }\n\n    // OK, here we've eliminated the case of merging a leaf into a tree.  We only have to\n    // deal with tree-into-tree merges below.\n    //\n    // Note that if the right-hand tree is bigger, we'll effectively add this tree to the\n    // left-hand side of that one.  It's logically the same as adding that tree to the right\n    // of this, but the mechanism by which it happens is a little different.\n    Node<E> leftRoot = pushFocus();\n    Node<E> rightRoot = that.pushFocus();\n\n    // Whether to add the right tree to the left one (true) or vice-versa (false).\n    // True also means left is taller, false: right is taller.\n    boolean leftIntoRight = leftRoot.height() < rightRoot.height();\n    Node<E> taller = leftIntoRight ? rightRoot : leftRoot;\n    Node<E> shorter = leftIntoRight ? leftRoot : rightRoot;\n\n    // Most compact: Descend the taller tree to shorter.height and find room for all\n    //     shorter children as children of that node.\n    //\n    // Next: add the shorter node, unchanged, as a child to the taller tree at\n    //       shorter.height + 1\n    //\n    // If that level of the taller tree is full, add an ancestor to the shorter node and try to\n    // fit at the next level up in the taller tree.\n    //\n    // If this brings us to the top of the taller tree (both trees are the same height), add a\n    // new parent node with leftRoot and rightRoot as children\n\n    // Walk down the taller tree to one below the shorter, remembering ancestors.\n    Node<E> n = taller;\n\n    // This is the maximum we can descend into the taller tree (before running out of tree)\n\n    // Actual amount we're going to descend.\n    int descentDepth = taller.height() - shorter.height();\n    Node<E>[] ancestors = genericNodeArray(descentDepth);\n    int i = 0;\n    for (; i < ancestors.length; i++) {\n      // Add an ancestor to array\n      ancestors[i] = n;\n      n = n.endChild(leftIntoRight);\n    }\n    // i is incremented before leaving the loop, so decrement it here to make it point\n    // to ancestors.length - 1;\n    i--;\n\n    // Most compact: Descend the taller tree to shorter.height and find room for all\n    //     shorter children as children of that node.\n    if (n.thisNodeHasRelaxedCapacity(shorter.numChildren())) {\n      // Adding kids of shorter to proper level of taller...\n      Node<E>[] kids;\n      kids = ((Relaxed<E>) shorter).nodes;\n      n = n.addEndChildren(leftIntoRight, kids);\n    }\n\n    if (i >= 0) {\n      // Go back up one after lowest check.\n      n = ancestors[i];\n      i--;\n    }\n\n    // TODO: Is this used?\n    // While nodes in the taller are full, add a parent to the shorter and try the next level\n    // up.\n    while (!n.thisNodeHasRelaxedCapacity(1) && (i >= 0)) {\n\n      // no room for short at this level (n has too many kids)\n      n = ancestors[i];\n      i--;\n\n      shorter = addAncestor(shorter);\n\n      // Sometimes we care about which is shorter and sometimes about left and right.\n      // Since we fixed the shorter tree, we have to update the left/right\n      // pointer to point to the new shorter.\n      if (leftIntoRight) {\n        leftRoot = shorter;\n      } else {\n        rightRoot = shorter;\n      }\n    }\n\n    // Here we either have 2 trees of equal height, or\n    // we have room in n for the shorter as a child.\n\n    if (shorter.height() == (n.height() - 1)) {\n      // Shorter one level below n and there's room\n      // Trees are not equal height and there's room somewhere.\n      n = n.addEndChild(leftIntoRight, shorter);\n    } else if (i < 0) {\n      // 2 trees of equal height: make a new parent\n\n      @SuppressWarnings(\"unchecked\") // Need raw types here.\n      Node<E>[] newRootArray = new Node[] {leftRoot, rightRoot};\n      int leftSize = leftRoot.size();\n      Node<E> newRoot =\n          new Relaxed<>(new int[] {leftSize, leftSize + rightRoot.size()}, newRootArray);\n      return makeNew(emptyArray(), 0, 0, newRoot, newRoot.size());\n    } else {\n      throw new IllegalStateException(\"How did we get here?\");\n    }\n\n    // We've merged the nodes.  Now see if we need to create new parents\n    // to hold the changed sub-nodes...\n    while (i >= 0) {\n      Node<E> anc = ancestors[i];\n      // By definition, I think that if we need a new root node, then we aren't dealing with\n\n      // leaf nodes, but I could be wrong.\n      // I also think we should get rid of relaxed nodes and everything will be much\n      // easier.\n      Relaxed<E> rel = (Relaxed<E>) anc;\n\n      int repIdx = leftIntoRight ? 0 : rel.numChildren() - 1;\n      n =\n          Relaxed.replaceInRelaxedAt(\n              rel.cumulativeSizes, rel.nodes, n, repIdx, n.size() - rel.nodes[repIdx].size());\n      i--;\n    }\n\n    return makeNew(emptyArray(), 0, 0, n, n.size());\n  }\n\n  /**\n   * Allows removing duplicated code by letting super-class produce new members of subclass types.\n   */\n  protected abstract RrbTree<E> makeNew(E[] f, int fi, int fl, Node<E> r, int s);\n\n  /** Creates a new empty (\"M-T\") tree of the appropriate (mutable/immutable) type. */\n  protected abstract RrbTree<E> mt();\n\n  /**\n   * {@inheritDoc} Precat is implemented here because it is a very cheap operation on an RRB-Tree.\n   * It's not implemented on PersistentVector because it is very expensive there.\n   */\n  @Override\n  public abstract RrbTree<E> precat(@Nullable Iterable<? extends E> es);\n\n  /** Internal method - do not use. */\n  abstract Node<E> pushFocus();\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract RrbTree<E> replace(int index, E item);\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract int size();\n\n  /**\n   * Divides this RRB-Tree such that every index less-than the given index ends up in the left-hand\n   * tree and the indexed item and all subsequent ones end up in the right-hand tree.\n   *\n   * @param splitIndex the split point (excluded from the left-tree, included in the right one)\n   * @return two new sub-trees as determined by the split point. If the point is 0 or this.size()\n   *     one tree will be empty (but never null).\n   */\n  public Tuple2<? extends RrbTree<E>, ? extends RrbTree<E>> split(int splitIndex) {\n    if (splitIndex < 1) {\n      if (splitIndex == 0) {\n        return Tuple2.of(mt(), this);\n      } else {\n        throw new IndexOutOfBoundsException(\"Constraint violation failed: 1 <= splitIndex <= size\");\n      }\n    } else if (splitIndex >= size()) {\n      if (splitIndex == size()) {\n        return Tuple2.of(this, mt());\n      } else {\n        throw new IndexOutOfBoundsException(\"Constraint violation failed: 1 <= splitIndex <= size\");\n      }\n    }\n    // Push the focus before splitting.\n    Node<E> newRoot = pushFocus();\n\n    // If a leaf-node is split, the fragments become the new focus for each side of the split.\n    // Otherwise, the focus can be left empty, or the last node of each side can be made into\n    // the focus.\n\n    SplitNode<E> split = newRoot.splitAt(splitIndex);\n\n    E[] lFocus = split.leftFocus();\n    Node<E> left = eliminateUnnecessaryAncestors(split.left());\n\n    E[] rFocus = split.rightFocus();\n    Node<E> right = eliminateUnnecessaryAncestors(split.right());\n\n    // These branches are identical, just different classes.\n    return Tuple2.of(\n        makeNew(lFocus, left.size(), lFocus.length, left, left.size() + lFocus.length),\n        makeNew(rFocus, 0, rFocus.length, right, right.size() + rFocus.length));\n  }\n\n  /**\n   * Returns a new RrbTree minus the given item (all items to the right are shifted left one) This\n   * is O(log n).\n   */\n  public RrbTree<E> without(int index) {\n    if ((index > 0) && (index < size() - 1)) {\n      Tuple2<? extends RrbTree<E>, ? extends RrbTree<E>> s1 = split(index);\n      Tuple2<? extends RrbTree<E>, ? extends RrbTree<E>> s2 = s1._2().split(1);\n      return s1._1().join(s2._2());\n    } else if (index == 0) {\n      return split(1)._2();\n    } else if (index == size() - 1) {\n      return split(size() - 1)._1();\n    } else {\n      throw new IndexOutOfBoundsException(\"Failed test: 0 <= index < size\");\n    }\n  }\n\n  private static <E> Node<E> eliminateUnnecessaryAncestors(Node<E> n) {\n    while (!(n instanceof Leaf) && (n.numChildren() == 1)) {\n      n = n.child(0);\n    }\n    return n;\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private static <E> Node<E> addAncestor(Node<E> n) {\n    return new Relaxed<>(new int[] {n.size()}, (Node<E>[]) new Node[] {n});\n  }\n\n  // ================================== Standard Object Methods ==================================\n\n  /** {@inheritDoc} */\n  @SuppressWarnings(\"unchecked\")\n  @Override\n  public boolean equals(Object other) {\n    if (this == other) {\n      return true;\n    }\n    if (!(other instanceof List)) {\n      return false;\n    }\n    List<? extends E> that = (List<? extends E>) other;\n    return (this.size() == that.size())\n        && UnmodSortedIterable.equal(this, UnmodSortedIterable.castFromList(that));\n  }\n\n  /** This implementation is correct and compatible with java.util.AbstractList, but O(n). */\n  @Override\n  public int hashCode() {\n    int ret = 1;\n    for (E item : this) {\n      ret *= 31;\n      if (item != null) {\n        ret += item.hashCode();\n      }\n    }\n    return ret;\n  }\n\n  /** {@inheritDoc} */\n  @Override\n  public abstract String indentedStr(int indent);\n\n  // ================================== Implementation Details ==================================\n\n  // Definitions:\n  // Relaxed: short for \"Relaxed Radix.\"   Relaxed nodes are of somewhat varying sizes, ranging\n  //          from MIN_NODE_LENGTH (Cormen et al. calls this \"Minimum Degree\") to MAX_NODE_LENGTH.\n  //          This requires linear interpolation, a bit of searching, and subtraction to find an\n  //          index into a sub-node, but supports inserts, split, and combine (with another\n  //          RrbTree)\n\n  // There's bit shifting going on here because it's a very fast operation.\n  // Shifting right by 5 is eons faster than dividing by 32.\n  private static final int NODE_LENGTH_POW_2 = 5; // 2 for testing, 5 for real\n\n  // 0b00000000000000000000000000100000 = 0x20 = 32\n  static final int STRICT_NODE_LENGTH = 1 << NODE_LENGTH_POW_2;\n\n  private static final int HALF_STRICT_NODE_LENGTH = STRICT_NODE_LENGTH >> 1;\n\n  // (MIN_NODE_LENGTH + MAX_NODE_LENGTH) / 2 should equal STRICT_NODE_LENGTH so that they have\n  // roughly the\n  // same average node size to make the index interpolation easier.\n  private static final int MIN_NODE_LENGTH = (STRICT_NODE_LENGTH + 1) * 2 / 3;\n  // Always check if less-than this.  Never if less-than-or-equal.  Cormen adds a -1 here and tests\n  // for <= (I think!).\n  private static final int MAX_NODE_LENGTH = ((STRICT_NODE_LENGTH + 1) * 4 / 3);\n\n  @SuppressWarnings(\"rawtypes\")\n  private static final Leaf EMPTY_LEAF = new Leaf<>(EMPTY_ARRAY);\n\n  @SuppressWarnings(\"unchecked\")\n  private static <T> Leaf<T> emptyLeaf() {\n    return (Leaf<T>) EMPTY_LEAF;\n  }\n\n  // ================================ Node private inner classes ================================\n\n  protected interface Node<T> extends Indented {\n    /** Returns the immediate child node at the given index. */\n    Node<T> child(int childIdx);\n\n    /** Returns the leftMost (first) or right-most (last) child */\n    Node<T> endChild(boolean leftMost);\n\n    /** Adds a node as the first/leftmost or last/rightmost child */\n    Node<T> addEndChild(boolean leftMost, Node<T> shorter);\n\n    /** Adds kids as leftmost or rightmost of current children */\n    Node<T> addEndChildren(boolean leftMost, Node<T>[] newKids);\n\n    /** Return the item at the given index */\n    T get(int i);\n\n    /** Returns the maximum depth below this node. Leaf nodes are height 1. */\n    int height();\n\n    /** Number of items stored in this node */\n    int size();\n\n    /** Can this node take the specified number of children? */\n    boolean thisNodeHasRelaxedCapacity(int numItems);\n\n    /**\n     * Can we put focus at the given index without reshuffling nodes?\n     *\n     * @param index the index we want to insert at\n     * @param size the number of items to insert. Must be size < MAX_NODE_LENGTH\n     * @return true if we can do so without otherwise adjusting the tree.\n     */\n    boolean hasRelaxedCapacity(int index, int size);\n\n    /** Returns the number of immediate children of this node, not all descendants. */\n    int numChildren();\n\n    // Because we want to append/insert into the focus as much as possible, we will treat\n    // the insert or append of a single item as a degenerate case.  Instead, the primary way\n    // to add to the internal data structure will be to push the entire focus array into it\n    Node<T> pushFocus(int index, T[] oldFocus);\n\n    Node<T> replace(int idx, T t);\n\n    SplitNode<T> splitAt(int splitIndex);\n  }\n\n  /** This class is the return type when splitting a node. */\n  protected static class SplitNode<T> extends Tuple4<Node<T>, T[], Node<T>, T[]>\n      implements Indented {\n    /**\n     * Constructor.\n     *\n     * @param ln Left-hand whole-node\n     * @param lf Left-focus (leftover items from left node)\n     * @param rn Right-hand whole-node\n     * @param rf Right-focus (leftover items from right node)\n     */\n    SplitNode(Node<T> ln, T[] lf, Node<T> rn, T[] rf) {\n      super(ln, lf, rn, rf);\n    }\n\n    public Node<T> left() {\n      return _1;\n    }\n\n    public T[] leftFocus() {\n      return _2;\n    }\n\n    public Node<T> right() {\n      return _3;\n    }\n\n    public T[] rightFocus() {\n      return _4;\n    }\n\n    public int size() {\n      return _1.size() + _2.length + _3.size() + _4.length;\n    }\n\n    @Override\n    public String indentedStr(int indent) {\n      StringBuilder sB =\n          new StringBuilder() // indentSpace(indent)\n              .append(\"SplitNode(\");\n      int nextIndent = indent + sB.length();\n      String nextIndentStr = indentSpace(nextIndent).toString();\n      return sB.append(\"left=\")\n          .append(left().indentedStr(nextIndent + 5))\n          .append(\",\\n\")\n          .append(nextIndentStr)\n          .append(\"leftFocus=\")\n          .append(arrayString(leftFocus()))\n          .append(\",\\n\")\n          .append(nextIndentStr)\n          .append(\"right=\")\n          .append(right().indentedStr(nextIndent + 6))\n          .append(\",\\n\")\n          .append(nextIndentStr)\n          .append(\"rightFocus=\")\n          .append(arrayString(rightFocus()))\n          .append(\")\")\n          .toString();\n    }\n\n    @Override\n    public String toString() {\n      return indentedStr(0);\n    }\n  }\n\n  private static class Leaf<T> implements Node<T> {\n    final T[] items;\n\n    Leaf(T[] ts) {\n      items = ts;\n    }\n\n    @Override\n    public Node<T> child(int childIdx) {\n      throw new UnsupportedOperationException(\"Don't call this on a leaf\");\n    }\n\n    /** Returns the leftMost (first) or right-most (last) child */\n    @Override\n    public Node<T> endChild(boolean leftMost) {\n      throw new UnsupportedOperationException(\"Don't call this on a leaf\");\n    }\n\n    /** Adds a node as the first/leftmost or last/rightmost child */\n    @Override\n    public Node<T> addEndChild(boolean leftMost, Node<T> shorter) {\n      throw new UnsupportedOperationException(\"Don't call this on a leaf\");\n    }\n\n    /** Adds kids as leftmost or rightmost of current children */\n    @Override\n    public Node<T> addEndChildren(boolean leftMost, Node<T>[] newKids) {\n      throw new UnsupportedOperationException(\"Don't call this on a leaf\");\n    }\n\n    @Override\n    public T get(int i) {\n      return items[i];\n    }\n\n    @Override\n    public int height() {\n      return 1;\n    }\n\n    @Override\n    public int size() {\n      return items.length;\n    }\n\n    @Override\n    public boolean hasRelaxedCapacity(int index, int size) {\n      return (items.length + size) < MAX_NODE_LENGTH;\n    }\n\n    @Override\n    public SplitNode<T> splitAt(int splitIndex) {\n      // Should we just ensure that the split is between 1 and items.length (exclusive)?\n      if (splitIndex == 0) {\n        return new SplitNode<>(emptyLeaf(), emptyArray(), emptyLeaf(), items);\n      }\n      if (splitIndex == items.length) {\n        return new SplitNode<>(emptyLeaf(), items, emptyLeaf(), emptyArray());\n      }\n      Tuple2<T[], T[]> split = splitArray(items, splitIndex);\n      T[] splitL = split._1();\n      T[] splitR = split._2();\n      Leaf<T> leafL = emptyLeaf();\n      Leaf<T> leafR = emptyLeaf();\n      if (splitL.length > STRICT_NODE_LENGTH) {\n        leafL = new Leaf<>(splitL);\n        splitL = emptyArray();\n      }\n      if (splitR.length > STRICT_NODE_LENGTH) {\n        leafR = new Leaf<>(splitR);\n        splitR = emptyArray();\n      }\n      return new SplitNode<>(leafL, splitL, leafR, splitR);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    private Leaf<T>[] spliceAndSplit(T[] oldFocus, int splitIndex) {\n      // Consider optimizing:\n      T[] newItems = spliceIntoArrayAt(oldFocus, items, splitIndex, null);\n\n      // Shift right one is divide-by 2.\n      Tuple2<T[], T[]> split = splitArray(newItems, newItems.length >> 1);\n\n      return new Leaf[] {new Leaf<>(split._1()), new Leaf<>(split._2())};\n    }\n\n    @Override\n    public int numChildren() {\n      return size();\n    }\n\n    // I think this can only be called when the root node is a leaf.\n    @Override\n    public Node<T> pushFocus(int index, T[] oldFocus) {\n      // We put the empty Leaf as the root of the empty vector.  It stays there\n      // until the first call to this method, at which point, the oldFocus becomes the\n      // new root.\n      if (items.length == 0) {\n        return new Leaf<>(oldFocus);\n      }\n\n      if ((items.length + oldFocus.length) < MAX_NODE_LENGTH) {\n        return new Leaf<>(spliceIntoArrayAt(oldFocus, items, index, null));\n        //                                                    (Class<T>) items[0].getClass()));\n      }\n\n      // We should only get here when the root node is a leaf.\n      // Maybe we should be more circumspect with our array creation, but for now, just\n      // jam it into one big array, then split it up for simplicity\n      Leaf<T>[] res = spliceAndSplit(oldFocus, index);\n      Leaf<T> leftLeaf = res[0];\n      Leaf<T> rightLeaf = res[1];\n      int leftSize = leftLeaf.size();\n      return new Relaxed<>(new int[] {leftSize, leftSize + rightLeaf.size()}, res);\n    }\n\n    @Override\n    public Node<T> replace(int idx, T t) {\n      return new Leaf<>(replaceInArrayAt(t, items, idx, null));\n    }\n\n    @Override\n    public boolean thisNodeHasRelaxedCapacity(int numItems) {\n      return items.length + numItems < MAX_NODE_LENGTH;\n    }\n\n    @Override\n    public String toString() {\n      return arrayString(items);\n    }\n\n    @Override\n    public String indentedStr(int indent) {\n      return arrayString(items);\n    }\n  } // end class Leaf\n\n  // Contains a relaxed tree of nodes that average around 32 items each.\n  private static class Relaxed<T> implements Node<T> {\n\n    // Holds the size of each sub-node and plus all nodes to its left.  You could think of this\n    // as maxIndex + 1. This is a separate array so that it can be retrieved in a single memory\n    // fetch.  Note that this is a 1-based count, not a zero-based index.\n    final int[] cumulativeSizes;\n    // The sub nodes\n    final Node<T>[] nodes;\n\n    // Constructor\n    Relaxed(int[] szs, Node<T>[] ns) {\n      cumulativeSizes = szs;\n      nodes = ns;\n    }\n\n    @Override\n    public Node<T> child(int childIdx) {\n      return nodes[childIdx];\n    }\n\n    /** Returns the leftMost (first) or right-most (last) child */\n    @Override\n    public Node<T> endChild(boolean leftMost) {\n      return nodes[leftMost ? 0 : nodes.length - 1];\n    }\n\n    /** Adds a node as the first/leftmost or last/rightmost child */\n    @Override\n    public Node<T> addEndChild(boolean leftMost, Node<T> shorter) {\n      return insertInRelaxedAt(cumulativeSizes, nodes, shorter, leftMost ? 0 : nodes.length);\n    }\n\n    /** Adds kids as leftmost or rightmost of current children */\n    @Override\n    public Node<T> addEndChildren(boolean leftMost, Node<T>[] newKids) {\n      @SuppressWarnings(\"unchecked\")\n      Node<T>[] res = spliceIntoArrayAt(newKids, nodes, leftMost ? 0 : nodes.length, Node.class);\n      // TODO: Figure out which side we inserted on and do the math to adjust counts instead\n      // of looking them up.\n      return new Relaxed<>(makeSizeArray(res), res);\n    }\n\n    @Override\n    public int height() {\n      return nodes[0].height() + 1;\n    }\n\n    @Override\n    public int size() {\n      return cumulativeSizes[cumulativeSizes.length - 1];\n    }\n\n    /**\n     * Converts the index of an item into the index of the sub-node containing that item.\n     *\n     * @param treeIndex The index of the item in the tree\n     * @return The index of the immediate child of this node that the desired node resides in.\n     */\n    private int subNodeIndex(int treeIndex) {\n      // treeSize = cumulativeSizes[cumulativeSizes.length - 1]\n      // range of sub-node indices: 0 to cumulativeSizes.length - 1\n      // range of tree indices: 0 to treeSize\n      // liner interpolation:\n      //     treeIndex / treeSize ~= subNodeIndex / cumulativeSizes.length\n      // solve for endIdxSlot\n      //     cumulativeSizes.length * (treeIndex / treeSize) =  subNodeIndex\n      // Put division last\n      //     subNodeIndex = cumulativeSizes.length * treeIndex / treeSize\n      //\n      // Now guess the sub-node index (quickly).\n\n      var guessLong = StrictMath.multiplyExact((long) cumulativeSizes.length, treeIndex) / size();\n      if (guessLong >= cumulativeSizes.length) {\n        // Guessed beyond end length - returning last item.\n        return cumulativeSizes.length - 1;\n      }\n      var guess = (int) guessLong;\n      int guessedCumSize = cumulativeSizes[guess];\n\n      // Now we must check the guess.  The cumulativeSizes we store are slightly misnamed because\n      // the max valid treeIndex for a node is its size - 1.  If our guessedCumSize is\n      //  - less than the treeIndex\n      //         Increment guess and check result again until greater, then return\n      //         that guess\n      //  - greater than (treeIndex + MIN_NODE_SIZE)\n      //         Decrement guess and check result again until less, then return PREVIOUS guess\n      //  - equal to the treeIndex (see note about size)\n      //         If treeIndex == size Return guess\n      //         Else return guess + 1\n\n      // guessedCumSize less than the treeIndex\n      //         Increment guess and check result again until greater, then return\n      //         that guess\n      if (guessedCumSize < treeIndex) {\n        while (guess < (cumulativeSizes.length - 1)) {\n          guessedCumSize = cumulativeSizes[++guess];\n          if (guessedCumSize >= treeIndex) {\n            // See note in equal case below...\n            return (guessedCumSize == treeIndex) ? guess + 1 : guess;\n          }\n        }\n        throw new IllegalStateException(\"Can we get here?  If so, how?\");\n      } else if (guessedCumSize > (treeIndex + MIN_NODE_LENGTH)) {\n\n        // guessedCumSize greater than (treeIndex + MIN_NODE_LENGTH)\n        //         Decrement guess and check result again until less, then return PREVIOUS guess\n        while (guess > 0) {\n          int nextGuess = guess - 1;\n          guessedCumSize = cumulativeSizes[nextGuess];\n\n          if (guessedCumSize <= treeIndex) {\n            return guess;\n          }\n          guess = nextGuess;\n        }\n        return guess;\n      } else if (guessedCumSize == treeIndex) {\n        // guessedCumSize equal to the treeIndex (see note about size)\n        //         If treeIndex == size Return guess\n        //         Else return guess + 1\n        //                System.out.println(\"    Equal, so should be simple...\");\n        // For an append just one element beyond the end of the existing data structure,\n        // just try to add it to the last node.  This might seem overly permissive to accept\n        // these as inserts or appends without differentiating between the two, but it flows\n        // naturally with this data structure and I think makes it easier to use without\n        // encouraging user programming errors.\n        // Hopefully this still leads to a relatively balanced tree...\n        return (treeIndex == size()) ? guess : guess + 1;\n      } else {\n        return guess;\n      }\n    }\n\n    /**\n     * Converts the index of an item into the index to pass to the sub-node containing that item.\n     *\n     * @param index The index of the item in the entire tree\n     * @param subNodeIndex the index into this node's array of sub-nodes.\n     * @return The index to pass to the sub-branch the item resides in\n     */\n    // Better name might be: nextLevelIndex?  subNodeSubIndex?\n    private int subNodeAdjustedIndex(int index, int subNodeIndex) {\n      return (subNodeIndex == 0) ? index : index - cumulativeSizes[subNodeIndex - 1];\n    }\n\n    @Override\n    public T get(int index) {\n      int subNodeIndex = subNodeIndex(index);\n      return nodes[subNodeIndex].get(subNodeAdjustedIndex(index, subNodeIndex));\n    }\n\n    @Override\n    public boolean thisNodeHasRelaxedCapacity(int numNodes) {\n      return nodes.length + numNodes < MAX_NODE_LENGTH;\n    }\n\n    @Override\n    public boolean hasRelaxedCapacity(int index, int size) {\n      // I think we can add any number of items (less than MAX_NODE_LENGTH)\n      if (thisNodeHasRelaxedCapacity(1)) {\n        return true;\n      }\n      int subNodeIndex = subNodeIndex(index);\n      return nodes[subNodeIndex].hasRelaxedCapacity(\n          subNodeAdjustedIndex(index, subNodeIndex), size);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    Relaxed<T>[] split() {\n      int midpoint = nodes.length >> 1; // Shift-right one is the same as dividing by 2.\n      Relaxed<T> left =\n          new Relaxed<>(Arrays.copyOf(cumulativeSizes, midpoint), Arrays.copyOf(nodes, midpoint));\n      int[] rightCumSizes = new int[nodes.length - midpoint];\n      int leftCumSizes = cumulativeSizes[midpoint - 1];\n      for (int j = 0; j < rightCumSizes.length; j++) {\n        rightCumSizes[j] = cumulativeSizes[midpoint + j] - leftCumSizes;\n      }\n      // I checked this at javaRepl and indeed this starts from the correct item.\n      Relaxed<T> right =\n          new Relaxed<>(rightCumSizes, Arrays.copyOfRange(nodes, midpoint, nodes.length));\n      return new Relaxed[] {left, right};\n    }\n\n    @Override\n    public SplitNode<T> splitAt(int splitIndex) {\n      int size = size();\n      if (splitIndex == 0) {\n        return new SplitNode<>(emptyLeaf(), emptyArray(), emptyLeaf(), emptyArray());\n      }\n      if (splitIndex == size) {\n        return new SplitNode<>(this, emptyArray(), emptyLeaf(), emptyArray());\n      }\n\n      int subNodeIndex = subNodeIndex(splitIndex);\n      Node<T> subNode = nodes[subNodeIndex];\n\n      if ((subNodeIndex > 0) && (splitIndex == cumulativeSizes[subNodeIndex - 1])) {\n        // Falls on an existing node boundary\n        Tuple2<Node<T>[], Node<T>[]> splitNodes = splitArray(nodes, subNodeIndex);\n\n        int[][] splitCumSizes = splitArray(cumulativeSizes, subNodeIndex);\n        int[] leftCumSizes = splitCumSizes[0];\n        int[] rightCumSizes = splitCumSizes[1];\n        int bias = leftCumSizes[leftCumSizes.length - 1];\n        for (int i = 0; i < rightCumSizes.length; i++) {\n          rightCumSizes[i] = rightCumSizes[i] - bias;\n        }\n        Node<T> left = new Relaxed<>(leftCumSizes, splitNodes._1());\n        Node<T> right = new Relaxed<>(rightCumSizes, splitNodes._2());\n\n        return new SplitNode<>(\n            left, emptyArray(),\n            right, emptyArray());\n      }\n\n      int subNodeAdjustedIndex = subNodeAdjustedIndex(splitIndex, subNodeIndex);\n      SplitNode<T> split = subNode.splitAt(subNodeAdjustedIndex);\n\n      final Node<T> left;\n      Node<T> splitLeft = split.left();\n\n      if (subNodeIndex == 0) {\n        left = splitLeft;\n      } else {\n        boolean haveLeft = (splitLeft.size() > 0);\n        int numLeftItems = subNodeIndex + (haveLeft ? 1 : 0);\n        int[] leftCumSizes = new int[numLeftItems];\n        Node<T>[] leftNodes = genericNodeArray(numLeftItems);\n        System.arraycopy(cumulativeSizes, 0, leftCumSizes, 0, numLeftItems);\n        if (haveLeft) {\n          // we (and the static analyzer) know numLeftItems > 1 because:\n          // * subNodeIndexcan't be negative because nodes[subNodeIndex] succeeded\n          // * subNodeIndex can't be zero because we're in the else\n          // * haveLeft is true\n          int cumulativeSize = leftCumSizes[numLeftItems - 2];\n          leftCumSizes[numLeftItems - 1] = cumulativeSize + splitLeft.size();\n        }\n        // Copy one less item if we are going to add the split one in a moment.\n        // I could have written:\n        //     haveLeft ? numLeftItems - 1\n        //              : numLeftItems\n        // but that's always equal to subNodeIndex.\n        System.arraycopy(nodes, 0, leftNodes, 0, subNodeIndex);\n        if (haveLeft) {\n          // I don't know why I have to fix this here.\n          while (splitLeft.height() < this.height() - 1) {\n            splitLeft = addAncestor(splitLeft);\n          }\n          leftNodes[numLeftItems - 1] = splitLeft;\n        }\n        left = new Relaxed<>(leftCumSizes, leftNodes);\n      }\n\n      final Node<T> right = fixRight(nodes, split.right(), subNodeIndex);\n\n      return new SplitNode<>(\n          left, split.leftFocus(),\n          right, split.rightFocus());\n    }\n\n    @Override\n    public int numChildren() {\n      return nodes.length;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public Node<T> pushFocus(int index, T[] oldFocus) {\n      // TODO: Review this entire method.\n      int subNodeIndex = subNodeIndex(index);\n      Node<T> subNode = nodes[subNodeIndex];\n      int subNodeAdjustedIndex = subNodeAdjustedIndex(index, subNodeIndex);\n\n      // 1st choice: insert into the subNode if it has enough space enough to handle it\n      if (subNode.hasRelaxedCapacity(subNodeAdjustedIndex, oldFocus.length)) {\n        // Push the focus down to a lower-level node w. capacity.\n        Node<T> newNode = subNode.pushFocus(subNodeAdjustedIndex, oldFocus);\n        // Make a copy of our nodesArray, replacing the old node at subNodeIndex with the\n        // new node\n        return replaceInRelaxedAt(cumulativeSizes, nodes, newNode, subNodeIndex, oldFocus.length);\n      }\n\n      // I think this is a root node thing.\n      if (!thisNodeHasRelaxedCapacity(1)) {\n        // For now, split at half of size.\n        Relaxed<T>[] split = split();\n        int max1 = split[0].size();\n        Relaxed<T> newRelaxed = new Relaxed<>(new int[] {max1, max1 + split[1].size()}, split);\n        return newRelaxed.pushFocus(index, oldFocus);\n      }\n\n      if (subNode instanceof Leaf) {\n        // Here we already know:\n        //  - the leaf doesn't have capacity\n        //  - We don't need to split ourselves\n        // Therefore:\n        //  - If the focus is big enough to be its own leaf and the index is on a leaf\n        //    boundary and , make it one.\n        //  - Else, insert into the array and replace one leaf with two.\n\n        final Node<T>[] newNodes;\n        final int[] newCumSizes;\n        final int numToSkip;\n\n        //  If the focus is big enough to be its own leaf and the index is on a leaf\n        // boundary, make it one.\n        if ((oldFocus.length >= MIN_NODE_LENGTH)\n            && (subNodeAdjustedIndex == 0 || subNodeAdjustedIndex == subNode.size())) {\n\n          // Insert-between\n          // Just add a new leaf\n          Leaf<T> newNode = new Leaf<>(oldFocus);\n\n          // If we aren't inserting before the existing leaf node, we're inserting after.\n          if (subNodeAdjustedIndex != 0) {\n            subNodeIndex++;\n          }\n\n          newNodes = insertIntoArrayAt(newNode, nodes, subNodeIndex, Node.class);\n          // Increment newCumSizes for the changed item and all items to the right.\n          newCumSizes = new int[cumulativeSizes.length + 1];\n          int cumulativeSize = 0;\n          if (subNodeIndex > 0) {\n            System.arraycopy(cumulativeSizes, 0, newCumSizes, 0, subNodeIndex);\n            cumulativeSize = newCumSizes[subNodeIndex - 1];\n          }\n          newCumSizes[subNodeIndex] = cumulativeSize + oldFocus.length;\n          numToSkip = 1;\n        } else {\n          // Grab the array from the existing leaf node, make the insert, and yield two\n          // new leaf nodes.\n          // Split-to-insert\n          Leaf<T>[] res = ((Leaf<T>) subNode).spliceAndSplit(oldFocus, subNodeAdjustedIndex);\n          Leaf<T> leftLeaf = res[0];\n          Leaf<T> rightLeaf = res[1];\n\n          newNodes = new Node[nodes.length + 1];\n\n          // Increment newCumSizes for the changed item and all items to the right.\n          newCumSizes = new int[cumulativeSizes.length + 1];\n          int leftSize = 0;\n\n          // Copy nodes and cumulativeSizes before split\n          if (subNodeIndex > 0) {\n            System.arraycopy(nodes, 0, newNodes, 0, subNodeIndex);\n            System.arraycopy(cumulativeSizes, 0, newCumSizes, 0, subNodeIndex);\n\n            leftSize = cumulativeSizes[subNodeIndex - 1];\n          }\n\n          // Copy split nodes and cumulativeSizes\n          newNodes[subNodeIndex] = leftLeaf;\n          newNodes[subNodeIndex + 1] = rightLeaf;\n          leftSize += leftLeaf.size();\n          newCumSizes[subNodeIndex] = leftSize;\n          newCumSizes[subNodeIndex + 1] = leftSize + rightLeaf.size();\n\n          if (subNodeIndex < (nodes.length - 1)) {\n            System.arraycopy(\n                nodes,\n                subNodeIndex + 1,\n                newNodes,\n                subNodeIndex + 2,\n                nodes.length - subNodeIndex - 1);\n          }\n          numToSkip = 2;\n        }\n        for (int i = subNodeIndex + numToSkip; i < newCumSizes.length; i++) {\n          newCumSizes[i] = cumulativeSizes[i - 1] + oldFocus.length;\n        }\n\n        return new Relaxed<>(newCumSizes, newNodes);\n        // end if subNode instanceof Leaf\n      }\n\n      // Here we have capacity and the full sub-node is not a leaf or strict, so we have to\n      // split the appropriate sub-node.\n\n      // For now, split at half of size.\n      Relaxed<T>[] newSubNode = ((Relaxed<T>) subNode).split();\n\n      Relaxed<T> node1 = newSubNode[0];\n      Relaxed<T> node2 = newSubNode[1];\n      Node<T>[] newNodes = genericNodeArray(nodes.length + 1);\n\n      // If we aren't inserting at the first item, array-copy the nodes before the insert\n      // point.\n      if (subNodeIndex > 0) {\n        System.arraycopy(nodes, 0, newNodes, 0, subNodeIndex);\n      }\n\n      // Insert the new item.\n      newNodes[subNodeIndex] = node1;\n      newNodes[subNodeIndex + 1] = node2;\n\n      // If we aren't inserting at the last item, array-copy the nodes after the insert point.\n      // FIXME: the static analyzer says this is always true but I don't believe it\n      // FIXME: \"find cause\" doesn't appear to account for the possible mutation on L1556\n      //noinspection ConstantValue\n      if (subNodeIndex < nodes.length) {\n        System.arraycopy(\n            nodes, subNodeIndex + 1, newNodes, subNodeIndex + 2, nodes.length - subNodeIndex - 1);\n      }\n\n      int[] newCumSizes = new int[cumulativeSizes.length + 1];\n      int cumulativeSize = 0;\n      if (subNodeIndex > 0) {\n        System.arraycopy(cumulativeSizes, 0, newCumSizes, 0, subNodeIndex);\n        cumulativeSize = cumulativeSizes[subNodeIndex - 1];\n      }\n\n      for (int i = subNodeIndex; i < newCumSizes.length; i++) {\n        // TODO: Calculate instead of loading into memory.  See splitAt calculation above.\n        cumulativeSize += newNodes[i].size();\n        newCumSizes[i] = cumulativeSize;\n      }\n\n      Relaxed<T> newRelaxed = new Relaxed<>(newCumSizes, newNodes);\n\n      return newRelaxed.pushFocus(index, oldFocus);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public Node<T> replace(int index, T t) {\n      int subNodeIndex = subNodeIndex(index);\n      Node<T> alteredNode =\n          nodes[subNodeIndex].replace(subNodeAdjustedIndex(index, subNodeIndex), t);\n      Node<T>[] newNodes = replaceInArrayAt(alteredNode, nodes, subNodeIndex, Node.class);\n      return new Relaxed<>(cumulativeSizes, newNodes);\n    }\n\n    @Override\n    public String indentedStr(int indent) {\n      StringBuilder sB = new StringBuilder().append(\"Relaxed(\");\n      int nextIndent = indent + sB.length();\n      sB.append(\"cumulativeSizes=\")\n          .append(arrayString(cumulativeSizes))\n          .append(\"\\n\")\n          .append(indentSpace(nextIndent))\n          .append(\"nodes=[\");\n      // + 6 for \"nodes=\"\n      return showSubNodes(sB, nodes, nextIndent + 7).append(\"])\").toString();\n    }\n\n    @Override\n    public String toString() {\n      return indentedStr(0);\n    }\n\n    /**\n     * This asks each node what size it is, then puts the cumulative sizes into a new array. In\n     * theory, it might be faster to figure out what side we added/removed nodes and do some\n     * addition/subtraction (in the amount of the added/removed nodes). But I want to optimize other\n     * things first and be sure everything is correct before experimenting with that. After all, it\n     * might not even be faster!\n     *\n     * @param newNodes the nodes to take sizes from.\n     * @return An array of cumulative sizes of each node in the passed array.\n     */\n    private static int[] makeSizeArray(@SuppressWarnings(\"rawtypes\") Node[] newNodes) {\n      int[] newCumSizes = new int[newNodes.length];\n      int cumulativeSize = 0;\n      for (int i = 0; i < newCumSizes.length; i++) {\n        cumulativeSize += newNodes[i].size();\n        newCumSizes[i] = cumulativeSize;\n      }\n      return newCumSizes;\n    }\n\n    // TODO: Search for more opportunities to use this\n    /**\n     * Replace a node in a relaxed node by recalculating the cumulative sizes and copying all sub\n     * nodes.\n     *\n     * @param is original cumulative sizes\n     * @param ns original nodes\n     * @param newNode replacement node\n     * @param subNodeIndex index to replace in this node's immediate children\n     * @param insertSize the difference in size between the original node and the new node.\n     * @return a new immutable Relaxed node with the immediate child node replaced.\n     */\n    static <T> Relaxed<T> replaceInRelaxedAt(\n        int[] is, Node<T>[] ns, Node<T> newNode, int subNodeIndex, int insertSize) {\n      @SuppressWarnings(\"unchecked\")\n      Node<T>[] newNodes = replaceInArrayAt(newNode, ns, subNodeIndex, Node.class);\n      // Increment newCumSizes for the changed item and all items to the right.\n      int[] newCumSizes = new int[is.length];\n      if (subNodeIndex > 0) {\n        System.arraycopy(is, 0, newCumSizes, 0, subNodeIndex);\n      }\n      for (int i = subNodeIndex; i < is.length; i++) {\n        newCumSizes[i] = is[i] + insertSize;\n      }\n      return new Relaxed<>(newCumSizes, newNodes);\n    }\n\n    /**\n     * Insert a node in a relaxed node by recalculating the cumulative sizes and copying all sub\n     * nodes.\n     *\n     * @param oldCumSizes original cumulative sizes\n     * @param ns original nodes\n     * @param newNode replacement node\n     * @param subNodeIndex index to insert in this node's immediate children\n     * @return a new immutable Relaxed node with the immediate child node inserted.\n     */\n    static <T> Relaxed<T> insertInRelaxedAt(\n        int[] oldCumSizes, Node<T>[] ns, Node<T> newNode, int subNodeIndex) {\n      @SuppressWarnings(\"unchecked\")\n      Node<T>[] newNodes = insertIntoArrayAt(newNode, ns, subNodeIndex, Node.class);\n\n      int oldLen = oldCumSizes.length;\n\n      int[] newCumSizes = new int[oldLen + 1];\n      // Copy unchanged cumulative sizes\n      if (subNodeIndex > 0) {\n        System.arraycopy(oldCumSizes, 0, newCumSizes, 0, subNodeIndex);\n      }\n      // insert the cumulative size of the new node\n      int newNodeSize = newNode.size();\n      // Find cumulative size of previous node\n      int prevNodeTotal = (subNodeIndex == 0) ? 0 : oldCumSizes[subNodeIndex - 1];\n\n      newCumSizes[subNodeIndex] = newNodeSize + prevNodeTotal;\n\n      for (int i = subNodeIndex; i < oldCumSizes.length; i++) {\n        newCumSizes[i + 1] = oldCumSizes[i] + newNodeSize;\n      }\n      return new Relaxed<>(newCumSizes, newNodes);\n    }\n\n    /**\n     * Fixes up nodes on the right-hand side of the split. Might want to explain this better...\n     *\n     * @param origNodes the immediate children of the node we're splitting\n     * @param splitRight the pre-split right node\n     * @param subNodeIndex the index to split children at?\n     * @return a copy of this node with only the right-hand side of the split.\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static <T> Node<T> fixRight(Node<T>[] origNodes, Node<T> splitRight, int subNodeIndex) {\n      Node<T> right;\n      if (subNodeIndex == (origNodes.length - 1)) {\n        right = new Relaxed<T>(new int[] {splitRight.size()}, new Node[] {splitRight});\n      } else {\n        boolean haveRightSubNode = splitRight.size() > 0;\n        // If we have a rightSubNode, it's going to need a space in our new node array.\n        int numRightNodes = (origNodes.length - subNodeIndex) - (haveRightSubNode ? 0 : 1);\n        // Here the first (leftmost) node of the right-hand side was turned into the focus\n        // and we have additional right-hand origNodes to adjust the parent for.\n        int[] rightCumSizes = new int[numRightNodes];\n        Node<T>[] rightNodes = genericNodeArray(numRightNodes);\n\n        int cumulativeSize = 0;\n        int destCopyStartIdx = 0;\n\n        if (haveRightSubNode) {\n          System.arraycopy(origNodes, subNodeIndex + 1, rightNodes, 1, numRightNodes - 1);\n\n          rightNodes[0] = splitRight;\n          cumulativeSize = splitRight.size();\n          rightCumSizes[0] = cumulativeSize;\n          destCopyStartIdx = 1;\n        } else {\n          System.arraycopy(origNodes, subNodeIndex + 1, rightNodes, 0, numRightNodes);\n        }\n\n        // For relaxed nodes, we could calculate from previous cumulativeSizes instead of\n        // calling .size() on each one.  For strict, we could just add a strict amount.\n        // For now, this works.\n        for (int i = destCopyStartIdx; i < numRightNodes; i++) {\n          cumulativeSize += rightNodes[i].size();\n          rightCumSizes[i] = cumulativeSize;\n        }\n\n        right = new Relaxed<>(rightCumSizes, rightNodes);\n      }\n      return right;\n    } // end fixRight()\n  } // end class Relaxed\n\n  // =================================== Tree-walking Iterator ==================================\n\n  /** Holds a node and the index of the child node we are currently iterating in. */\n  private static final class IdxNode<E> {\n    int idx = 0;\n    final Node<E> node;\n\n    IdxNode(Node<E> n) {\n      node = n;\n    }\n\n    public boolean hasNext() {\n      return idx < node.numChildren();\n    }\n\n    public Node<E> next() {\n      return node.child(idx++);\n    }\n  }\n\n  final class Iter implements UnmodSortedIterator<E> {\n\n    // We want this iterator to walk the node tree.\n    private final IdxNode<E>[] stack;\n    private int stackMaxIdx = -1;\n\n    private E[] leafArray;\n    private int leafArrayIdx;\n\n    // Focus must be pre-pushed so we don't have to ever check the index.\n    @SuppressWarnings(\"unchecked\")\n    private Iter(Node<E> root) {\n      stack = (IdxNode<E>[]) new IdxNode<?>[root.height()];\n      leafArray = findLeaf(root);\n    }\n\n    // Descent to the leftmost unused leaf node.\n    private E[] findLeaf(Node<E> node) {\n      // Descent to left-most bottom node.\n      while (!(node instanceof Leaf)) {\n        IdxNode<E> in = new IdxNode<>(node);\n        // Add indexNode to ancestor stack\n        stack[++stackMaxIdx] = in;\n        node = in.next();\n      }\n      return ((Leaf<E>) node).items;\n    }\n\n    private E[] nextLeafArray() {\n      // While nodes are used up, get next node from node one level up.\n      while ((stackMaxIdx > -1) && !stack[stackMaxIdx].hasNext()) {\n        stackMaxIdx--;\n      }\n\n      if (stackMaxIdx < 0) {\n        return emptyArray();\n      }\n      // If node one level up is used up, find a node that isn't used up and descend to its\n      // leftmost leaf.\n      return findLeaf(stack[stackMaxIdx].next());\n    }\n\n    @Override\n    public boolean hasNext() {\n      if (leafArrayIdx < leafArray.length) {\n        return true;\n      }\n      leafArray = nextLeafArray();\n      leafArrayIdx = 0;\n      return leafArray.length > 0;\n    }\n\n    @Override\n    public E next() {\n      // If there's no more in this leaf array, get the next one\n      if (leafArrayIdx >= leafArray.length) {\n        leafArray = nextLeafArray();\n        leafArrayIdx = 0;\n      }\n      // Return the next item in the leaf array and increment index\n      return leafArray[leafArrayIdx++];\n    }\n  }\n\n  // =================================== Array Helper Functions ==================================\n  // Helper function to avoid type warnings.\n\n  @SuppressWarnings(\"unchecked\")\n  private static <T> Node<T>[] genericNodeArray(int size) {\n    return (Node<T>[]) new Node<?>[size];\n  }\n\n  // =============================== Debugging and pretty-printing ===============================\n\n  private static StringBuilder showSubNodes(StringBuilder sB, Object[] items, int nextIndent) {\n    boolean isFirst = true;\n    for (Object n : items) {\n      if (isFirst) {\n        isFirst = false;\n      } else {\n        if (items[0] instanceof Leaf) {\n          sB.append(\" \");\n        } else {\n          sB.append(\"\\n\").append(indentSpace(nextIndent));\n        }\n      }\n      //noinspection rawtypes\n      sB.append(((Node) n).indentedStr(nextIndent));\n    }\n    return sB;\n  }\n} // end class RrbTree\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/paguro/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://github.com/GlenKPeterson/Paguro\n *\n * <p>Paguro contains some code that is licensed under the Eclipse Public License 1.0. This code is\n * not included in the Pkl source. Only Paguro code licensed under Apache 2.0 is included here.\n *\n * <p>Original license:\n *\n * <p>Copyright 2016-05-28 PlanBase Inc. & Glen Peterson\n *\n * <p>Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file\n * except in compliance with the License.\n *\n * <p>You may obtain a copy of the License at\n *\n * <p>http://www.apache.org/licenses/LICENSE-2.0\n *\n * <p>Unless required by applicable law or agreed to in writing, software distributed under the\n * License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n * express or implied.\n *\n * <p>See the License for the specific language governing permissions and limitations under the\n * License.\n */\n@NonnullByDefault\npackage org.pkl.core.util.paguro;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/pklbinary/AbstractPklBinaryDecoder.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.pklbinary;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Deque;\nimport java.util.Formatter;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.regex.Pattern;\nimport org.msgpack.core.MessageInsufficientBufferException;\nimport org.msgpack.core.MessagePackException;\nimport org.msgpack.core.MessageUnpacker;\nimport org.pkl.core.DataSizeUnit;\nimport org.pkl.core.DurationUnit;\nimport org.pkl.core.Pair;\nimport org.pkl.core.util.LateInit;\n\n/**\n * Base class for implementing a decoder/parser for the <a\n * href=\"https://pkl-lang.org/main/current/bindings-specification/binary-encoding.html\"><code>\n * pkl-binary</code></a> encoding.\n */\npublic abstract class AbstractPklBinaryDecoder {\n  private final MessageUnpacker unpacker;\n  @LateInit protected Deque<Object> currPath;\n\n  protected AbstractPklBinaryDecoder(MessageUnpacker unpacker) {\n    this.unpacker = unpacker;\n  }\n\n  protected static class DecodeException extends RuntimeException {\n    public DecodeException(String msg, Object... args) {\n      super(new Formatter().format(msg, args).toString());\n    }\n  }\n\n  protected final Object decode() {\n    currPath = new ArrayDeque<>();\n    try {\n      try {\n        return doDecode();\n      } catch (MessageInsufficientBufferException e) {\n        throw new DecodeException(\"Unexpected EOF\", e);\n      }\n    } catch (IOException e) {\n      throw doIOFail(e);\n    } catch (MessagePackException | DecodeException e) {\n      var path = new ArrayList<String>(currPath.size());\n      for (var iter = currPath.descendingIterator(); iter.hasNext(); ) {\n        path.add(iter.next().toString());\n      }\n      Collections.reverse(path);\n      throw doFail(e, unpacker.getTotalReadBytes(), path);\n    }\n  }\n\n  private void assertLength(PklBinaryCode type, int len, int expected) {\n    if (len < expected) {\n      throw new DecodeException(\n          \"Expected %s structure to have at least %d slots, found %d\", type, expected + 1, len);\n    }\n  }\n\n  protected record DecodedObjectMember(PklBinaryCode type, Object key, Object value) {}\n\n  protected abstract RuntimeException doFail(Exception cause, long offset, List<String> path);\n\n  protected abstract RuntimeException doIOFail(IOException cause);\n\n  protected abstract Object doDecodeNull();\n\n  protected abstract Object doDecodeObject(\n      String className, URI moduleUri, DecodeIterator<DecodedObjectMember> iter);\n\n  protected abstract Object doDecodeMap(MapDecodeIterator iter);\n\n  protected abstract Object doDecodeMapping(MapDecodeIterator iter);\n\n  protected abstract Object doDecodeList(CollectionDecodeIterator iter);\n\n  protected abstract Object doDecodeListing(CollectionDecodeIterator iter);\n\n  protected abstract Object doDecodeSet(CollectionDecodeIterator iter);\n\n  protected abstract Object doDecodeDuration(double value, DurationUnit unit);\n\n  protected abstract Object doDecodeDataSize(double value, DataSizeUnit unit);\n\n  protected abstract Object doDecodePair(Object first, Object second);\n\n  protected abstract Object doDecodeIntSeq(long start, long end, long step);\n\n  protected abstract Object doDecodeRegex(Pattern pattern);\n\n  protected abstract Object doDecodeClass(String qualifiedName, URI moduleUri);\n\n  protected abstract Object doDecodeTypeAlias(String qualifiedName, URI moduleUri);\n\n  protected Object doDecodeFunction() {\n    throw new DecodeException(\"Cannot decode Function value\");\n  }\n\n  protected abstract Object doDecodeBytes(byte[] bytes);\n\n  private Object doDecode() throws IOException {\n    if (!unpacker.hasNext()) {\n      throw new DecodeException(\"Unexpected EOF\");\n    }\n\n    return switch (unpacker.getNextFormat().getValueType()) {\n      // primitives\n      case NIL -> {\n        unpacker.unpackNil();\n        yield doDecodeNull();\n      }\n      case STRING -> unpacker.unpackString();\n      case INTEGER -> unpacker.unpackLong();\n      case BOOLEAN -> unpacker.unpackBoolean();\n      case FLOAT -> unpacker.unpackDouble();\n      // non-primitive\n      case ARRAY -> decodeNonPrimitive();\n      // things we should never see outside a non-primitive\n      case BINARY -> throw new DecodeException(\"Unexpected msgpack bin value\");\n      case MAP -> throw new DecodeException(\"Unexpected msgpack map value\");\n      case EXTENSION -> throw new DecodeException(\"Unexpected msgpack ext value\");\n    };\n  }\n\n  private Object decodeNonPrimitive() throws IOException {\n    var len = unpacker.unpackArrayHeader();\n    if (len < 1) {\n      throw new DecodeException(\"Unexpected empty object array value\");\n    }\n\n    var codeInt = unpacker.unpackInt();\n    var code = PklBinaryCode.fromInt(codeInt);\n    if (code == null) {\n      throw new DecodeException(\"Unrecognized code 0x%x\", (byte) codeInt);\n    }\n\n    return switch (code) {\n      case OBJECT -> decodeObject(len);\n      case MAP -> decodeMap(len);\n      case MAPPING -> decodeMapping(len);\n      case LIST -> decodeList(len);\n      case LISTING -> decodeListing(len);\n      case SET -> decodeSet(len);\n      case DURATION -> decodeDuration(len);\n      case DATASIZE -> decodeDataSize(len);\n      case PAIR -> decodePair(len);\n      case INTSEQ -> decodeIntSeq(len);\n      case REGEX -> decodeRegex(len);\n      case CLASS -> decodeClass(len);\n      case TYPEALIAS -> decodeTypeAlias(len);\n      case FUNCTION -> decodeFunction(len);\n      case BYTES -> decodeBytes(len);\n      default -> throw new DecodeException(\"Unrecognized object code %s\", code);\n    };\n  }\n\n  private Object decodeObject(int len) throws IOException {\n    assertLength(PklBinaryCode.OBJECT, len, 3);\n    currPath.push(\"'object\");\n\n    var className = unpacker.unpackString();\n    if (className.isBlank()) {\n      throw new DecodeException(\"Unexpected blank object class name\");\n    }\n    var classModuleUriString = unpacker.unpackString();\n    if (classModuleUriString.isBlank()) {\n      throw new DecodeException(\"Unexpected blank object module URI\");\n    }\n    var classModuleUri = URI.create(classModuleUriString);\n\n    var result =\n        doDecodeObject(\n            className, classModuleUri, new ObjectDecodeIterator(unpacker.unpackArrayHeader()));\n    unpacker.skipValue(len - 4);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeMap(int len) throws IOException {\n    assertLength(PklBinaryCode.MAP, len, 1);\n    currPath.push(\"'map\");\n    var result = doDecodeMap(new MapDecodeIterator(unpacker.unpackMapHeader()));\n    unpacker.skipValue(len - 2);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeMapping(int len) throws IOException {\n    assertLength(PklBinaryCode.MAPPING, len, 1);\n    currPath.push(\"'mapping\");\n    var result = doDecodeMapping(new MapDecodeIterator(unpacker.unpackMapHeader()));\n    unpacker.skipValue(len - 2);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeList(int len) throws IOException {\n    assertLength(PklBinaryCode.LIST, len, 1);\n    currPath.push(\"'list\");\n    var result = doDecodeList(new CollectionDecodeIterator(unpacker.unpackArrayHeader()));\n    unpacker.skipValue(len - 2);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeListing(int len) throws IOException {\n    assertLength(PklBinaryCode.LISTING, len, 1);\n    currPath.push(\"'listing\");\n    var result = doDecodeListing(new CollectionDecodeIterator(unpacker.unpackArrayHeader()));\n    unpacker.skipValue(len - 2);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeSet(int len) throws IOException {\n    assertLength(PklBinaryCode.SET, len, 1);\n    currPath.push(\"'set\");\n    var result = doDecodeSet(new CollectionDecodeIterator(unpacker.unpackArrayHeader()));\n    currPath.pop();\n    unpacker.skipValue(len - 2);\n    return result;\n  }\n\n  private Object decodeDuration(int len) throws IOException {\n    assertLength(PklBinaryCode.DURATION, len, 2);\n    currPath.push(\"'duration\");\n    var durationValue = unpacker.unpackDouble();\n    var rawDurationUnit = unpacker.unpackString();\n    var durationUnit = DurationUnit.parse(rawDurationUnit);\n    if (durationUnit == null) {\n      throw new DecodeException(\"Invalid Duration unit `%s`\", rawDurationUnit);\n    }\n    var result = doDecodeDuration(durationValue, durationUnit);\n    unpacker.skipValue(len - 3);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeDataSize(int len) throws IOException {\n    assertLength(PklBinaryCode.DATASIZE, len, 2);\n    currPath.push(\"'datasize\");\n    var dataSizeValue = unpacker.unpackDouble();\n    var rawDataSizeUnit = unpacker.unpackString();\n    var dataSizeUnit = DataSizeUnit.parse(rawDataSizeUnit);\n    if (dataSizeUnit == null) {\n      throw new DecodeException(\"Invalid DataSize unit `%s`\", rawDataSizeUnit);\n    }\n    var result = doDecodeDataSize(dataSizeValue, dataSizeUnit);\n    unpacker.skipValue(len - 3);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodePair(int len) throws IOException {\n    assertLength(PklBinaryCode.PAIR, len, 2);\n    currPath.push(\"'pair\");\n    currPath.push(\"'first\");\n    var first = doDecode();\n    currPath.pop();\n    currPath.push(\"'second\");\n    var second = doDecode();\n    currPath.pop();\n    var result = doDecodePair(first, second);\n    unpacker.skipValue(len - 3);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeIntSeq(int len) throws IOException {\n    assertLength(PklBinaryCode.INTSEQ, len, 3);\n    currPath.push(\"'intseq\");\n    var start = unpacker.unpackLong();\n    var end = unpacker.unpackLong();\n    var step = unpacker.unpackLong();\n    var result = doDecodeIntSeq(start, end, step);\n    unpacker.skipValue(len - 4);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeRegex(int len) throws IOException {\n    assertLength(PklBinaryCode.REGEX, len, 1);\n    currPath.push(\"'regex\");\n    var result = doDecodeRegex(Pattern.compile(unpacker.unpackString()));\n    unpacker.skipValue(len - 2);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeClass(int len) throws IOException {\n    assertLength(PklBinaryCode.CLASS, len, 2);\n    currPath.push(\"'class\");\n\n    var name = unpacker.unpackString();\n    if (name.isBlank()) {\n      throw new DecodeException(\"Unexpected blank class name\");\n    }\n    var moduleUriString = unpacker.unpackString();\n    if (moduleUriString.isBlank()) {\n      throw new DecodeException(\"Unexpected blank class module URI\");\n    }\n    var moduleUri = URI.create(moduleUriString);\n\n    var result = doDecodeClass(name, moduleUri);\n    unpacker.skipValue(len - 3);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeTypeAlias(int len) throws IOException {\n    assertLength(PklBinaryCode.TYPEALIAS, len, 2);\n    currPath.push(\"'typealias\");\n\n    var name = unpacker.unpackString();\n    if (name.isBlank()) {\n      throw new DecodeException(\"Unexpected blank typealias name\");\n    }\n    var moduleUriString = unpacker.unpackString();\n    if (moduleUriString.isBlank()) {\n      throw new DecodeException(\"Unexpected blank typealias module URI\");\n    }\n    var moduleUri = URI.create(moduleUriString);\n\n    var result = doDecodeTypeAlias(name, moduleUri);\n    unpacker.skipValue(len - 3);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeFunction(int len) throws IOException {\n    assertLength(PklBinaryCode.FUNCTION, len, 0);\n    currPath.push(\"'function\");\n    var result = doDecodeFunction();\n    unpacker.skipValue(len - 1);\n    currPath.pop();\n    return result;\n  }\n\n  private Object decodeBytes(int len) throws IOException {\n    assertLength(PklBinaryCode.BYTES, len, 1);\n    currPath.push(\"'bytes\");\n    var result = doDecodeBytes(unpacker.readPayload(unpacker.unpackBinaryHeader()));\n    unpacker.skipValue(len - 2);\n    currPath.pop();\n    return result;\n  }\n\n  // some silly iterator classes because next() needs to handle IOException\n\n  protected abstract class DecodeIterator<T> implements Iterator<T> {\n    private final int size;\n    private int idx = 0;\n\n    DecodeIterator(int size) {\n      this.size = size;\n    }\n\n    public int getSize() {\n      return size;\n    }\n\n    public boolean hasNext() {\n      return idx < size;\n    }\n\n    public T next() {\n      currPath.push(idx);\n      try {\n        return getNext();\n      } catch (IOException e) {\n        throw doIOFail(e);\n      } finally {\n        currPath.pop();\n        idx++;\n      }\n    }\n\n    abstract T getNext() throws IOException;\n  }\n\n  protected class ObjectDecodeIterator extends DecodeIterator<DecodedObjectMember> {\n    ObjectDecodeIterator(int size) {\n      super(size);\n    }\n\n    @Override\n    DecodedObjectMember getNext() throws IOException {\n      var memberLen = unpacker.unpackArrayHeader();\n      if (memberLen != 3) {\n        throw new DecodeException(\"Expected 3 fields in object member, found %d\", memberLen);\n      }\n      var memberCodeInt = unpacker.unpackInt();\n      var memberCode = PklBinaryCode.fromInt(memberCodeInt);\n      if (memberCode == null) {\n        throw new DecodeException(\"Unrecognized code 0x%x\", (byte) memberCodeInt);\n      }\n      DecodedObjectMember member;\n      switch (memberCode) {\n        case PROPERTY -> {\n          var propertyName = unpacker.unpackString();\n          currPath.push(propertyName);\n          member = new DecodedObjectMember(memberCode, propertyName, doDecode());\n        }\n        case ENTRY -> {\n          var entryKey = doDecode();\n          currPath.push(entryKey);\n          member = new DecodedObjectMember(memberCode, entryKey, doDecode());\n        }\n        case ELEMENT -> {\n          var elementIndex = unpacker.unpackLong();\n          currPath.push(elementIndex);\n          member = new DecodedObjectMember(memberCode, elementIndex, doDecode());\n        }\n        default -> throw new DecodeException(\"Unrecognized member code %s\", memberCode);\n      }\n      currPath.pop();\n      return member;\n    }\n  }\n\n  protected class CollectionDecodeIterator extends DecodeIterator<Object> {\n    CollectionDecodeIterator(int size) {\n      super(size);\n    }\n\n    @Override\n    Object getNext() throws IOException {\n      return doDecode();\n    }\n  }\n\n  protected class MapDecodeIterator extends DecodeIterator<Pair<Object, Object>> {\n    MapDecodeIterator(int size) {\n      super(size);\n    }\n\n    @Override\n    Pair<Object, Object> getNext() throws IOException {\n      var key = doDecode();\n      currPath.push(key);\n      var val = doDecode();\n      currPath.pop();\n      return new Pair<>(key, val);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/pklbinary/PklBinaryCode.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.pklbinary;\n\nimport org.pkl.core.util.Nullable;\n\npublic enum PklBinaryCode {\n  OBJECT((byte) 0x01),\n  MAP((byte) 0x02),\n  MAPPING((byte) 0x03),\n  LIST((byte) 0x04),\n  LISTING((byte) 0x05),\n  SET((byte) 0x06),\n  DURATION((byte) 0x07),\n  DATASIZE((byte) 0x08),\n  PAIR((byte) 0x09),\n  INTSEQ((byte) 0x0A),\n  REGEX((byte) 0x0B),\n  CLASS((byte) 0x0C),\n  TYPEALIAS((byte) 0x0D),\n  FUNCTION((byte) 0x0E),\n  BYTES((byte) 0x0F),\n\n  PROPERTY((byte) 0x10),\n  ENTRY((byte) 0x11),\n  ELEMENT((byte) 0x12);\n\n  private final byte code;\n\n  PklBinaryCode(byte code) {\n    this.code = code;\n  }\n\n  public byte getCode() {\n    return code;\n  }\n\n  public static @Nullable PklBinaryCode fromInt(int value) {\n    return switch (value) {\n      case 0x01 -> PklBinaryCode.OBJECT;\n      case 0x02 -> PklBinaryCode.MAP;\n      case 0x03 -> PklBinaryCode.MAPPING;\n      case 0x04 -> PklBinaryCode.LIST;\n      case 0x05 -> PklBinaryCode.LISTING;\n      case 0x06 -> PklBinaryCode.SET;\n      case 0x07 -> PklBinaryCode.DURATION;\n      case 0x08 -> PklBinaryCode.DATASIZE;\n      case 0x09 -> PklBinaryCode.PAIR;\n      case 0x0A -> PklBinaryCode.INTSEQ;\n      case 0x0B -> PklBinaryCode.REGEX;\n      case 0x0C -> PklBinaryCode.CLASS;\n      case 0x0D -> PklBinaryCode.TYPEALIAS;\n      case 0x0E -> PklBinaryCode.FUNCTION;\n      case 0x0F -> PklBinaryCode.BYTES;\n\n      case 0x10 -> PklBinaryCode.PROPERTY;\n      case 0x11 -> PklBinaryCode.ENTRY;\n      case 0x12 -> PklBinaryCode.ELEMENT;\n      default -> null;\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/pklbinary/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.util.pklbinary;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/properties/PropertiesUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.properties;\n\nimport java.io.BufferedWriter;\n\npublic final class PropertiesUtils {\n\n  // Bitmap of characters that need escaping ('\\t', '\\n', '\\f', '\\r', ' ', '!', '#', ':', '=', '\\\\')\n  // in four 32-bit segments.\n  private static final int[] bitmapEscapeSpace = new int[] {13824, 603979787, 268435456, 0};\n\n  // Bitmap of characters that need escaping ('\\t', '\\n', '\\f', '\\r', ' ', '!', '#', ':', '=', '\\\\')\n  // in four 32-bit segments.\n  private static final int[] bitmapNoEscapeSpace = new int[] {13824, 603979786, 268435456, 0};\n\n  private static final char[] hexDigitTable =\n      new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};\n\n  // Hashtable for substituting characters that need escaping, using perfect hash function\n  // `character % 32`.\n  // The compacted array literal is equivalent to the code below:\n  //\n  // char[] hashtable = new char[32];\n  // hashtable['\\t' % 32 /*  9 */] =  't';\n  // hashtable['\\n' % 32 /* 10 */] =  'n';\n  // hashtable['\\f' % 32 /* 12 */] =  'f';\n  // hashtable['\\r' % 32 /* 13 */] =  'r';\n  // hashtable[ ' ' % 32 /*  0 */] =  ' ';\n  // hashtable[ '!' % 32 /*  1 */] =  '!';\n  // hashtable[ '#' % 32 /*  3 */] =  '#';\n  // hashtable[ ':' % 32 /* 26 */] =  ':';\n  // hashtable[ '=' % 32 /* 29 */] =  '=';\n  // hashtable['\\\\' % 32 /* 28 */] = '\\\\';\n  private static final char[] hashtable =\n      new char[] {\n        ' ', '!', 0, '#', 0, 0, 0, 0, 0, 't', 'n', 0, 'f', 'r', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        ':', 0, '\\\\', '=', 0, 0\n      };\n\n  private PropertiesUtils() {}\n\n  /**\n   * Write a property key or value according to {@link java.util.Properties#store0(BufferedWriter,\n   * String, boolean)}.\n   */\n  @SuppressWarnings(\"JavadocReference\")\n  public static String renderPropertiesKeyOrValue(\n      String value, boolean escapeSpace, boolean restrictCharset) {\n    if (value.isEmpty()) return \"\";\n    var builder = new StringBuilder();\n\n    if (!escapeSpace && value.charAt(0) == ' ') {\n      builder.append('\\\\'); // ensure escaping of first leading space\n    }\n\n    for (var i = 0; i < value.length(); i++) {\n      var c = value.charAt(i);\n      var bitmap = escapeSpace ? bitmapEscapeSpace : bitmapNoEscapeSpace;\n      var isEscapeChar = c < 128 && (bitmap[c >> 5] & (1 << c)) != 0;\n\n      if (isEscapeChar) {\n        builder.append('\\\\').append(hashtable[c % 32]);\n      } else if (restrictCharset && (c < 32 || c > 126)) {\n        builder\n            .append('\\\\')\n            .append('u')\n            .append(hexDigitTable[c >> 12 & 0xF])\n            .append(hexDigitTable[c >> 8 & 0xF])\n            .append(hexDigitTable[c >> 4 & 0xF])\n            .append(hexDigitTable[c & 0xF]);\n      } else {\n        builder.append(c);\n      }\n    }\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/xml/Xml10Validator.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.xml;\n\nimport java.util.Arrays;\n\n// Originally taken from:\n// https://github.com/apache/xerces2-j/blob/8ce366ce9a20e7ffcb1dd37d0c4b5663d65b1f7d/src/org/apache/xerces/util/XMLChar.java\n@SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\nfinal class Xml10Validator extends XmlValidator {\n  private static final byte[] CHARS = new byte[1 << 16];\n  private static final int MASK_NAME_START = 0x04;\n  private static final int MASK_NAME = 0x08;\n\n  static {\n    CHARS[9] = 35;\n    CHARS[10] = 19;\n    CHARS[13] = 19;\n    CHARS[32] = 51;\n    CHARS[33] = 49;\n    CHARS[34] = 33;\n    Arrays.fill(CHARS, 35, 38, (byte) 49); // Fill 3 of value (byte) 49\n    CHARS[38] = 1;\n    Arrays.fill(CHARS, 39, 45, (byte) 49); // Fill 6 of value (byte) 49\n    Arrays.fill(CHARS, 45, 47, (byte) -71); // Fill 2 of value (byte) -71\n    CHARS[47] = 49;\n    Arrays.fill(CHARS, 48, 58, (byte) -71); // Fill 10 of value (byte) -71\n    CHARS[58] = 61;\n    CHARS[59] = 49;\n    CHARS[60] = 1;\n    CHARS[61] = 49;\n    CHARS[62] = 33;\n    Arrays.fill(CHARS, 63, 65, (byte) 49); // Fill 2 of value (byte) 49\n    Arrays.fill(CHARS, 65, 91, (byte) -3); // Fill 26 of value (byte) -3\n    Arrays.fill(CHARS, 91, 93, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[93] = 1;\n    CHARS[94] = 33;\n    CHARS[95] = -3;\n    CHARS[96] = 33;\n    Arrays.fill(CHARS, 97, 123, (byte) -3); // Fill 26 of value (byte) -3\n    Arrays.fill(CHARS, 123, 183, (byte) 33); // Fill 60 of value (byte) 33\n    CHARS[183] = -87;\n    Arrays.fill(CHARS, 184, 192, (byte) 33); // Fill 8 of value (byte) 33\n    Arrays.fill(CHARS, 192, 215, (byte) -19); // Fill 23 of value (byte) -19\n    CHARS[215] = 33;\n    Arrays.fill(CHARS, 216, 247, (byte) -19); // Fill 31 of value (byte) -19\n    CHARS[247] = 33;\n    Arrays.fill(CHARS, 248, 306, (byte) -19); // Fill 58 of value (byte) -19\n    Arrays.fill(CHARS, 306, 308, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 308, 319, (byte) -19); // Fill 11 of value (byte) -19\n    Arrays.fill(CHARS, 319, 321, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 321, 329, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[329] = 33;\n    Arrays.fill(CHARS, 330, 383, (byte) -19); // Fill 53 of value (byte) -19\n    CHARS[383] = 33;\n    Arrays.fill(CHARS, 384, 452, (byte) -19); // Fill 68 of value (byte) -19\n    Arrays.fill(CHARS, 452, 461, (byte) 33); // Fill 9 of value (byte) 33\n    Arrays.fill(CHARS, 461, 497, (byte) -19); // Fill 36 of value (byte) -19\n    Arrays.fill(CHARS, 497, 500, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 500, 502, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 502, 506, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 506, 536, (byte) -19); // Fill 30 of value (byte) -19\n    Arrays.fill(CHARS, 536, 592, (byte) 33); // Fill 56 of value (byte) 33\n    Arrays.fill(CHARS, 592, 681, (byte) -19); // Fill 89 of value (byte) -19\n    Arrays.fill(CHARS, 681, 699, (byte) 33); // Fill 18 of value (byte) 33\n    Arrays.fill(CHARS, 699, 706, (byte) -19); // Fill 7 of value (byte) -19\n    Arrays.fill(CHARS, 706, 720, (byte) 33); // Fill 14 of value (byte) 33\n    Arrays.fill(CHARS, 720, 722, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 722, 768, (byte) 33); // Fill 46 of value (byte) 33\n    Arrays.fill(CHARS, 768, 838, (byte) -87); // Fill 70 of value (byte) -87\n    Arrays.fill(CHARS, 838, 864, (byte) 33); // Fill 26 of value (byte) 33\n    Arrays.fill(CHARS, 864, 866, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 866, 902, (byte) 33); // Fill 36 of value (byte) 33\n    CHARS[902] = -19;\n    CHARS[903] = -87;\n    Arrays.fill(CHARS, 904, 907, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[907] = 33;\n    CHARS[908] = -19;\n    CHARS[909] = 33;\n    Arrays.fill(CHARS, 910, 930, (byte) -19); // Fill 20 of value (byte) -19\n    CHARS[930] = 33;\n    Arrays.fill(CHARS, 931, 975, (byte) -19); // Fill 44 of value (byte) -19\n    CHARS[975] = 33;\n    Arrays.fill(CHARS, 976, 983, (byte) -19); // Fill 7 of value (byte) -19\n    Arrays.fill(CHARS, 983, 986, (byte) 33); // Fill 3 of value (byte) 33\n    CHARS[986] = -19;\n    CHARS[987] = 33;\n    CHARS[988] = -19;\n    CHARS[989] = 33;\n    CHARS[990] = -19;\n    CHARS[991] = 33;\n    CHARS[992] = -19;\n    CHARS[993] = 33;\n    Arrays.fill(CHARS, 994, 1012, (byte) -19); // Fill 18 of value (byte) -19\n    Arrays.fill(CHARS, 1012, 1025, (byte) 33); // Fill 13 of value (byte) 33\n    Arrays.fill(CHARS, 1025, 1037, (byte) -19); // Fill 12 of value (byte) -19\n    CHARS[1037] = 33;\n    Arrays.fill(CHARS, 1038, 1104, (byte) -19); // Fill 66 of value (byte) -19\n    CHARS[1104] = 33;\n    Arrays.fill(CHARS, 1105, 1117, (byte) -19); // Fill 12 of value (byte) -19\n    CHARS[1117] = 33;\n    Arrays.fill(CHARS, 1118, 1154, (byte) -19); // Fill 36 of value (byte) -19\n    CHARS[1154] = 33;\n    Arrays.fill(CHARS, 1155, 1159, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 1159, 1168, (byte) 33); // Fill 9 of value (byte) 33\n    Arrays.fill(CHARS, 1168, 1221, (byte) -19); // Fill 53 of value (byte) -19\n    Arrays.fill(CHARS, 1221, 1223, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 1223, 1225, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 1225, 1227, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 1227, 1229, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 1229, 1232, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 1232, 1260, (byte) -19); // Fill 28 of value (byte) -19\n    Arrays.fill(CHARS, 1260, 1262, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 1262, 1270, (byte) -19); // Fill 8 of value (byte) -19\n    Arrays.fill(CHARS, 1270, 1272, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 1272, 1274, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 1274, 1329, (byte) 33); // Fill 55 of value (byte) 33\n    Arrays.fill(CHARS, 1329, 1367, (byte) -19); // Fill 38 of value (byte) -19\n    Arrays.fill(CHARS, 1367, 1369, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[1369] = -19;\n    Arrays.fill(CHARS, 1370, 1377, (byte) 33); // Fill 7 of value (byte) 33\n    Arrays.fill(CHARS, 1377, 1415, (byte) -19); // Fill 38 of value (byte) -19\n    Arrays.fill(CHARS, 1415, 1425, (byte) 33); // Fill 10 of value (byte) 33\n    Arrays.fill(CHARS, 1425, 1442, (byte) -87); // Fill 17 of value (byte) -87\n    CHARS[1442] = 33;\n    Arrays.fill(CHARS, 1443, 1466, (byte) -87); // Fill 23 of value (byte) -87\n    CHARS[1466] = 33;\n    Arrays.fill(CHARS, 1467, 1470, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[1470] = 33;\n    CHARS[1471] = -87;\n    CHARS[1472] = 33;\n    Arrays.fill(CHARS, 1473, 1475, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[1475] = 33;\n    CHARS[1476] = -87;\n    Arrays.fill(CHARS, 1477, 1488, (byte) 33); // Fill 11 of value (byte) 33\n    Arrays.fill(CHARS, 1488, 1515, (byte) -19); // Fill 27 of value (byte) -19\n    Arrays.fill(CHARS, 1515, 1520, (byte) 33); // Fill 5 of value (byte) 33\n    Arrays.fill(CHARS, 1520, 1523, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 1523, 1569, (byte) 33); // Fill 46 of value (byte) 33\n    Arrays.fill(CHARS, 1569, 1595, (byte) -19); // Fill 26 of value (byte) -19\n    Arrays.fill(CHARS, 1595, 1600, (byte) 33); // Fill 5 of value (byte) 33\n    CHARS[1600] = -87;\n    Arrays.fill(CHARS, 1601, 1611, (byte) -19); // Fill 10 of value (byte) -19\n    Arrays.fill(CHARS, 1611, 1619, (byte) -87); // Fill 8 of value (byte) -87\n    Arrays.fill(CHARS, 1619, 1632, (byte) 33); // Fill 13 of value (byte) 33\n    Arrays.fill(CHARS, 1632, 1642, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 1642, 1648, (byte) 33); // Fill 6 of value (byte) 33\n    CHARS[1648] = -87;\n    Arrays.fill(CHARS, 1649, 1720, (byte) -19); // Fill 71 of value (byte) -19\n    Arrays.fill(CHARS, 1720, 1722, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 1722, 1727, (byte) -19); // Fill 5 of value (byte) -19\n    CHARS[1727] = 33;\n    Arrays.fill(CHARS, 1728, 1743, (byte) -19); // Fill 15 of value (byte) -19\n    CHARS[1743] = 33;\n    Arrays.fill(CHARS, 1744, 1748, (byte) -19); // Fill 4 of value (byte) -19\n    CHARS[1748] = 33;\n    CHARS[1749] = -19;\n    Arrays.fill(CHARS, 1750, 1765, (byte) -87); // Fill 15 of value (byte) -87\n    Arrays.fill(CHARS, 1765, 1767, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 1767, 1769, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[1769] = 33;\n    Arrays.fill(CHARS, 1770, 1774, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 1774, 1776, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 1776, 1786, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 1786, 2305, (byte) 33); // Fill 519 of value (byte) 33\n    Arrays.fill(CHARS, 2305, 2308, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[2308] = 33;\n    Arrays.fill(CHARS, 2309, 2362, (byte) -19); // Fill 53 of value (byte) -19\n    Arrays.fill(CHARS, 2362, 2364, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[2364] = -87;\n    CHARS[2365] = -19;\n    Arrays.fill(CHARS, 2366, 2382, (byte) -87); // Fill 16 of value (byte) -87\n    Arrays.fill(CHARS, 2382, 2385, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2385, 2389, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 2389, 2392, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2392, 2402, (byte) -19); // Fill 10 of value (byte) -19\n    Arrays.fill(CHARS, 2402, 2404, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 2404, 2406, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2406, 2416, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 2416, 2433, (byte) 33); // Fill 17 of value (byte) 33\n    Arrays.fill(CHARS, 2433, 2436, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[2436] = 33;\n    Arrays.fill(CHARS, 2437, 2445, (byte) -19); // Fill 8 of value (byte) -19\n    Arrays.fill(CHARS, 2445, 2447, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2447, 2449, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2449, 2451, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2451, 2473, (byte) -19); // Fill 22 of value (byte) -19\n    CHARS[2473] = 33;\n    Arrays.fill(CHARS, 2474, 2481, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[2481] = 33;\n    CHARS[2482] = -19;\n    Arrays.fill(CHARS, 2483, 2486, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2486, 2490, (byte) -19); // Fill 4 of value (byte) -19\n    Arrays.fill(CHARS, 2490, 2492, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[2492] = -87;\n    CHARS[2493] = 33;\n    Arrays.fill(CHARS, 2494, 2501, (byte) -87); // Fill 7 of value (byte) -87\n    Arrays.fill(CHARS, 2501, 2503, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2503, 2505, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 2505, 2507, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2507, 2510, (byte) -87); // Fill 3 of value (byte) -87\n    Arrays.fill(CHARS, 2510, 2519, (byte) 33); // Fill 9 of value (byte) 33\n    CHARS[2519] = -87;\n    Arrays.fill(CHARS, 2520, 2524, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 2524, 2526, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[2526] = 33;\n    Arrays.fill(CHARS, 2527, 2530, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 2530, 2532, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 2532, 2534, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2534, 2544, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 2544, 2546, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2546, 2562, (byte) 33); // Fill 16 of value (byte) 33\n    CHARS[2562] = -87;\n    Arrays.fill(CHARS, 2563, 2565, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2565, 2571, (byte) -19); // Fill 6 of value (byte) -19\n    Arrays.fill(CHARS, 2571, 2575, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 2575, 2577, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2577, 2579, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2579, 2601, (byte) -19); // Fill 22 of value (byte) -19\n    CHARS[2601] = 33;\n    Arrays.fill(CHARS, 2602, 2609, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[2609] = 33;\n    Arrays.fill(CHARS, 2610, 2612, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[2612] = 33;\n    Arrays.fill(CHARS, 2613, 2615, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[2615] = 33;\n    Arrays.fill(CHARS, 2616, 2618, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2618, 2620, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[2620] = -87;\n    CHARS[2621] = 33;\n    Arrays.fill(CHARS, 2622, 2627, (byte) -87); // Fill 5 of value (byte) -87\n    Arrays.fill(CHARS, 2627, 2631, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 2631, 2633, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 2633, 2635, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2635, 2638, (byte) -87); // Fill 3 of value (byte) -87\n    Arrays.fill(CHARS, 2638, 2649, (byte) 33); // Fill 11 of value (byte) 33\n    Arrays.fill(CHARS, 2649, 2653, (byte) -19); // Fill 4 of value (byte) -19\n    CHARS[2653] = 33;\n    CHARS[2654] = -19;\n    Arrays.fill(CHARS, 2655, 2662, (byte) 33); // Fill 7 of value (byte) 33\n    Arrays.fill(CHARS, 2662, 2674, (byte) -87); // Fill 12 of value (byte) -87\n    Arrays.fill(CHARS, 2674, 2677, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 2677, 2689, (byte) 33); // Fill 12 of value (byte) 33\n    Arrays.fill(CHARS, 2689, 2692, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[2692] = 33;\n    Arrays.fill(CHARS, 2693, 2700, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[2700] = 33;\n    CHARS[2701] = -19;\n    CHARS[2702] = 33;\n    Arrays.fill(CHARS, 2703, 2706, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[2706] = 33;\n    Arrays.fill(CHARS, 2707, 2729, (byte) -19); // Fill 22 of value (byte) -19\n    CHARS[2729] = 33;\n    Arrays.fill(CHARS, 2730, 2737, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[2737] = 33;\n    Arrays.fill(CHARS, 2738, 2740, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[2740] = 33;\n    Arrays.fill(CHARS, 2741, 2746, (byte) -19); // Fill 5 of value (byte) -19\n    Arrays.fill(CHARS, 2746, 2748, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[2748] = -87;\n    CHARS[2749] = -19;\n    Arrays.fill(CHARS, 2750, 2758, (byte) -87); // Fill 8 of value (byte) -87\n    CHARS[2758] = 33;\n    Arrays.fill(CHARS, 2759, 2762, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[2762] = 33;\n    Arrays.fill(CHARS, 2763, 2766, (byte) -87); // Fill 3 of value (byte) -87\n    Arrays.fill(CHARS, 2766, 2784, (byte) 33); // Fill 18 of value (byte) 33\n    CHARS[2784] = -19;\n    Arrays.fill(CHARS, 2785, 2790, (byte) 33); // Fill 5 of value (byte) 33\n    Arrays.fill(CHARS, 2790, 2800, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 2800, 2817, (byte) 33); // Fill 17 of value (byte) 33\n    Arrays.fill(CHARS, 2817, 2820, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[2820] = 33;\n    Arrays.fill(CHARS, 2821, 2829, (byte) -19); // Fill 8 of value (byte) -19\n    Arrays.fill(CHARS, 2829, 2831, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2831, 2833, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2833, 2835, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2835, 2857, (byte) -19); // Fill 22 of value (byte) -19\n    CHARS[2857] = 33;\n    Arrays.fill(CHARS, 2858, 2865, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[2865] = 33;\n    Arrays.fill(CHARS, 2866, 2868, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2868, 2870, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2870, 2874, (byte) -19); // Fill 4 of value (byte) -19\n    Arrays.fill(CHARS, 2874, 2876, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[2876] = -87;\n    CHARS[2877] = -19;\n    Arrays.fill(CHARS, 2878, 2884, (byte) -87); // Fill 6 of value (byte) -87\n    Arrays.fill(CHARS, 2884, 2887, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2887, 2889, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 2889, 2891, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 2891, 2894, (byte) -87); // Fill 3 of value (byte) -87\n    Arrays.fill(CHARS, 2894, 2902, (byte) 33); // Fill 8 of value (byte) 33\n    Arrays.fill(CHARS, 2902, 2904, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 2904, 2908, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 2908, 2910, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[2910] = 33;\n    Arrays.fill(CHARS, 2911, 2914, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 2914, 2918, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 2918, 2928, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 2928, 2946, (byte) 33); // Fill 18 of value (byte) 33\n    Arrays.fill(CHARS, 2946, 2948, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[2948] = 33;\n    Arrays.fill(CHARS, 2949, 2955, (byte) -19); // Fill 6 of value (byte) -19\n    Arrays.fill(CHARS, 2955, 2958, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2958, 2961, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[2961] = 33;\n    Arrays.fill(CHARS, 2962, 2966, (byte) -19); // Fill 4 of value (byte) -19\n    Arrays.fill(CHARS, 2966, 2969, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2969, 2971, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[2971] = 33;\n    CHARS[2972] = -19;\n    CHARS[2973] = 33;\n    Arrays.fill(CHARS, 2974, 2976, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2976, 2979, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2979, 2981, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 2981, 2984, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2984, 2987, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 2987, 2990, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 2990, 2998, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[2998] = 33;\n    Arrays.fill(CHARS, 2999, 3002, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 3002, 3006, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3006, 3011, (byte) -87); // Fill 5 of value (byte) -87\n    Arrays.fill(CHARS, 3011, 3014, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 3014, 3017, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[3017] = 33;\n    Arrays.fill(CHARS, 3018, 3022, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 3022, 3031, (byte) 33); // Fill 9 of value (byte) 33\n    CHARS[3031] = -87;\n    Arrays.fill(CHARS, 3032, 3047, (byte) 33); // Fill 15 of value (byte) 33\n    Arrays.fill(CHARS, 3047, 3056, (byte) -87); // Fill 9 of value (byte) -87\n    Arrays.fill(CHARS, 3056, 3073, (byte) 33); // Fill 17 of value (byte) 33\n    Arrays.fill(CHARS, 3073, 3076, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[3076] = 33;\n    Arrays.fill(CHARS, 3077, 3085, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[3085] = 33;\n    Arrays.fill(CHARS, 3086, 3089, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[3089] = 33;\n    Arrays.fill(CHARS, 3090, 3113, (byte) -19); // Fill 23 of value (byte) -19\n    CHARS[3113] = 33;\n    Arrays.fill(CHARS, 3114, 3124, (byte) -19); // Fill 10 of value (byte) -19\n    CHARS[3124] = 33;\n    Arrays.fill(CHARS, 3125, 3130, (byte) -19); // Fill 5 of value (byte) -19\n    Arrays.fill(CHARS, 3130, 3134, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3134, 3141, (byte) -87); // Fill 7 of value (byte) -87\n    CHARS[3141] = 33;\n    Arrays.fill(CHARS, 3142, 3145, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[3145] = 33;\n    Arrays.fill(CHARS, 3146, 3150, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 3150, 3157, (byte) 33); // Fill 7 of value (byte) 33\n    Arrays.fill(CHARS, 3157, 3159, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 3159, 3168, (byte) 33); // Fill 9 of value (byte) 33\n    Arrays.fill(CHARS, 3168, 3170, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 3170, 3174, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3174, 3184, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 3184, 3202, (byte) 33); // Fill 18 of value (byte) 33\n    Arrays.fill(CHARS, 3202, 3204, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[3204] = 33;\n    Arrays.fill(CHARS, 3205, 3213, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[3213] = 33;\n    Arrays.fill(CHARS, 3214, 3217, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[3217] = 33;\n    Arrays.fill(CHARS, 3218, 3241, (byte) -19); // Fill 23 of value (byte) -19\n    CHARS[3241] = 33;\n    Arrays.fill(CHARS, 3242, 3252, (byte) -19); // Fill 10 of value (byte) -19\n    CHARS[3252] = 33;\n    Arrays.fill(CHARS, 3253, 3258, (byte) -19); // Fill 5 of value (byte) -19\n    Arrays.fill(CHARS, 3258, 3262, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3262, 3269, (byte) -87); // Fill 7 of value (byte) -87\n    CHARS[3269] = 33;\n    Arrays.fill(CHARS, 3270, 3273, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[3273] = 33;\n    Arrays.fill(CHARS, 3274, 3278, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 3278, 3285, (byte) 33); // Fill 7 of value (byte) 33\n    Arrays.fill(CHARS, 3285, 3287, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 3287, 3294, (byte) 33); // Fill 7 of value (byte) 33\n    CHARS[3294] = -19;\n    CHARS[3295] = 33;\n    Arrays.fill(CHARS, 3296, 3298, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 3298, 3302, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3302, 3312, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 3312, 3330, (byte) 33); // Fill 18 of value (byte) 33\n    Arrays.fill(CHARS, 3330, 3332, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[3332] = 33;\n    Arrays.fill(CHARS, 3333, 3341, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[3341] = 33;\n    Arrays.fill(CHARS, 3342, 3345, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[3345] = 33;\n    Arrays.fill(CHARS, 3346, 3369, (byte) -19); // Fill 23 of value (byte) -19\n    CHARS[3369] = 33;\n    Arrays.fill(CHARS, 3370, 3386, (byte) -19); // Fill 16 of value (byte) -19\n    Arrays.fill(CHARS, 3386, 3390, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3390, 3396, (byte) -87); // Fill 6 of value (byte) -87\n    Arrays.fill(CHARS, 3396, 3398, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 3398, 3401, (byte) -87); // Fill 3 of value (byte) -87\n    CHARS[3401] = 33;\n    Arrays.fill(CHARS, 3402, 3406, (byte) -87); // Fill 4 of value (byte) -87\n    Arrays.fill(CHARS, 3406, 3415, (byte) 33); // Fill 9 of value (byte) 33\n    CHARS[3415] = -87;\n    Arrays.fill(CHARS, 3416, 3424, (byte) 33); // Fill 8 of value (byte) 33\n    Arrays.fill(CHARS, 3424, 3426, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 3426, 3430, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3430, 3440, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 3440, 3585, (byte) 33); // Fill 145 of value (byte) 33\n    Arrays.fill(CHARS, 3585, 3631, (byte) -19); // Fill 46 of value (byte) -19\n    CHARS[3631] = 33;\n    CHARS[3632] = -19;\n    CHARS[3633] = -87;\n    Arrays.fill(CHARS, 3634, 3636, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 3636, 3643, (byte) -87); // Fill 7 of value (byte) -87\n    Arrays.fill(CHARS, 3643, 3648, (byte) 33); // Fill 5 of value (byte) 33\n    Arrays.fill(CHARS, 3648, 3654, (byte) -19); // Fill 6 of value (byte) -19\n    Arrays.fill(CHARS, 3654, 3663, (byte) -87); // Fill 9 of value (byte) -87\n    CHARS[3663] = 33;\n    Arrays.fill(CHARS, 3664, 3674, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 3674, 3713, (byte) 33); // Fill 39 of value (byte) 33\n    Arrays.fill(CHARS, 3713, 3715, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[3715] = 33;\n    CHARS[3716] = -19;\n    Arrays.fill(CHARS, 3717, 3719, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 3719, 3721, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[3721] = 33;\n    CHARS[3722] = -19;\n    Arrays.fill(CHARS, 3723, 3725, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[3725] = -19;\n    Arrays.fill(CHARS, 3726, 3732, (byte) 33); // Fill 6 of value (byte) 33\n    Arrays.fill(CHARS, 3732, 3736, (byte) -19); // Fill 4 of value (byte) -19\n    CHARS[3736] = 33;\n    Arrays.fill(CHARS, 3737, 3744, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[3744] = 33;\n    Arrays.fill(CHARS, 3745, 3748, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[3748] = 33;\n    CHARS[3749] = -19;\n    CHARS[3750] = 33;\n    CHARS[3751] = -19;\n    Arrays.fill(CHARS, 3752, 3754, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 3754, 3756, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[3756] = 33;\n    Arrays.fill(CHARS, 3757, 3759, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[3759] = 33;\n    CHARS[3760] = -19;\n    CHARS[3761] = -87;\n    Arrays.fill(CHARS, 3762, 3764, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 3764, 3770, (byte) -87); // Fill 6 of value (byte) -87\n    CHARS[3770] = 33;\n    Arrays.fill(CHARS, 3771, 3773, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[3773] = -19;\n    Arrays.fill(CHARS, 3774, 3776, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 3776, 3781, (byte) -19); // Fill 5 of value (byte) -19\n    CHARS[3781] = 33;\n    CHARS[3782] = -87;\n    CHARS[3783] = 33;\n    Arrays.fill(CHARS, 3784, 3790, (byte) -87); // Fill 6 of value (byte) -87\n    Arrays.fill(CHARS, 3790, 3792, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 3792, 3802, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 3802, 3864, (byte) 33); // Fill 62 of value (byte) 33\n    Arrays.fill(CHARS, 3864, 3866, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 3866, 3872, (byte) 33); // Fill 6 of value (byte) 33\n    Arrays.fill(CHARS, 3872, 3882, (byte) -87); // Fill 10 of value (byte) -87\n    Arrays.fill(CHARS, 3882, 3893, (byte) 33); // Fill 11 of value (byte) 33\n    CHARS[3893] = -87;\n    CHARS[3894] = 33;\n    CHARS[3895] = -87;\n    CHARS[3896] = 33;\n    CHARS[3897] = -87;\n    Arrays.fill(CHARS, 3898, 3902, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3902, 3904, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 3904, 3912, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[3912] = 33;\n    Arrays.fill(CHARS, 3913, 3946, (byte) -19); // Fill 33 of value (byte) -19\n    Arrays.fill(CHARS, 3946, 3953, (byte) 33); // Fill 7 of value (byte) 33\n    Arrays.fill(CHARS, 3953, 3973, (byte) -87); // Fill 20 of value (byte) -87\n    CHARS[3973] = 33;\n    Arrays.fill(CHARS, 3974, 3980, (byte) -87); // Fill 6 of value (byte) -87\n    Arrays.fill(CHARS, 3980, 3984, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 3984, 3990, (byte) -87); // Fill 6 of value (byte) -87\n    CHARS[3990] = 33;\n    CHARS[3991] = -87;\n    CHARS[3992] = 33;\n    Arrays.fill(CHARS, 3993, 4014, (byte) -87); // Fill 21 of value (byte) -87\n    Arrays.fill(CHARS, 4014, 4017, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 4017, 4024, (byte) -87); // Fill 7 of value (byte) -87\n    CHARS[4024] = 33;\n    CHARS[4025] = -87;\n    Arrays.fill(CHARS, 4026, 4256, (byte) 33); // Fill 230 of value (byte) 33\n    Arrays.fill(CHARS, 4256, 4294, (byte) -19); // Fill 38 of value (byte) -19\n    Arrays.fill(CHARS, 4294, 4304, (byte) 33); // Fill 10 of value (byte) 33\n    Arrays.fill(CHARS, 4304, 4343, (byte) -19); // Fill 39 of value (byte) -19\n    Arrays.fill(CHARS, 4343, 4352, (byte) 33); // Fill 9 of value (byte) 33\n    CHARS[4352] = -19;\n    CHARS[4353] = 33;\n    Arrays.fill(CHARS, 4354, 4356, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[4356] = 33;\n    Arrays.fill(CHARS, 4357, 4360, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[4360] = 33;\n    CHARS[4361] = -19;\n    CHARS[4362] = 33;\n    Arrays.fill(CHARS, 4363, 4365, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[4365] = 33;\n    Arrays.fill(CHARS, 4366, 4371, (byte) -19); // Fill 5 of value (byte) -19\n    Arrays.fill(CHARS, 4371, 4412, (byte) 33); // Fill 41 of value (byte) 33\n    CHARS[4412] = -19;\n    CHARS[4413] = 33;\n    CHARS[4414] = -19;\n    CHARS[4415] = 33;\n    CHARS[4416] = -19;\n    Arrays.fill(CHARS, 4417, 4428, (byte) 33); // Fill 11 of value (byte) 33\n    CHARS[4428] = -19;\n    CHARS[4429] = 33;\n    CHARS[4430] = -19;\n    CHARS[4431] = 33;\n    CHARS[4432] = -19;\n    Arrays.fill(CHARS, 4433, 4436, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 4436, 4438, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 4438, 4441, (byte) 33); // Fill 3 of value (byte) 33\n    CHARS[4441] = -19;\n    Arrays.fill(CHARS, 4442, 4447, (byte) 33); // Fill 5 of value (byte) 33\n    Arrays.fill(CHARS, 4447, 4450, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[4450] = 33;\n    CHARS[4451] = -19;\n    CHARS[4452] = 33;\n    CHARS[4453] = -19;\n    CHARS[4454] = 33;\n    CHARS[4455] = -19;\n    CHARS[4456] = 33;\n    CHARS[4457] = -19;\n    Arrays.fill(CHARS, 4458, 4461, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 4461, 4463, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 4463, 4466, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 4466, 4468, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[4468] = 33;\n    CHARS[4469] = -19;\n    Arrays.fill(CHARS, 4470, 4510, (byte) 33); // Fill 40 of value (byte) 33\n    CHARS[4510] = -19;\n    Arrays.fill(CHARS, 4511, 4520, (byte) 33); // Fill 9 of value (byte) 33\n    CHARS[4520] = -19;\n    Arrays.fill(CHARS, 4521, 4523, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[4523] = -19;\n    Arrays.fill(CHARS, 4524, 4526, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 4526, 4528, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 4528, 4535, (byte) 33); // Fill 7 of value (byte) 33\n    Arrays.fill(CHARS, 4535, 4537, (byte) -19); // Fill 2 of value (byte) -19\n    CHARS[4537] = 33;\n    CHARS[4538] = -19;\n    CHARS[4539] = 33;\n    Arrays.fill(CHARS, 4540, 4547, (byte) -19); // Fill 7 of value (byte) -19\n    Arrays.fill(CHARS, 4547, 4587, (byte) 33); // Fill 40 of value (byte) 33\n    CHARS[4587] = -19;\n    Arrays.fill(CHARS, 4588, 4592, (byte) 33); // Fill 4 of value (byte) 33\n    CHARS[4592] = -19;\n    Arrays.fill(CHARS, 4593, 4601, (byte) 33); // Fill 8 of value (byte) 33\n    CHARS[4601] = -19;\n    Arrays.fill(CHARS, 4602, 7680, (byte) 33); // Fill 3078 of value (byte) 33\n    Arrays.fill(CHARS, 7680, 7836, (byte) -19); // Fill 156 of value (byte) -19\n    Arrays.fill(CHARS, 7836, 7840, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 7840, 7930, (byte) -19); // Fill 90 of value (byte) -19\n    Arrays.fill(CHARS, 7930, 7936, (byte) 33); // Fill 6 of value (byte) 33\n    Arrays.fill(CHARS, 7936, 7958, (byte) -19); // Fill 22 of value (byte) -19\n    Arrays.fill(CHARS, 7958, 7960, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 7960, 7966, (byte) -19); // Fill 6 of value (byte) -19\n    Arrays.fill(CHARS, 7966, 7968, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 7968, 8006, (byte) -19); // Fill 38 of value (byte) -19\n    Arrays.fill(CHARS, 8006, 8008, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 8008, 8014, (byte) -19); // Fill 6 of value (byte) -19\n    Arrays.fill(CHARS, 8014, 8016, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 8016, 8024, (byte) -19); // Fill 8 of value (byte) -19\n    CHARS[8024] = 33;\n    CHARS[8025] = -19;\n    CHARS[8026] = 33;\n    CHARS[8027] = -19;\n    CHARS[8028] = 33;\n    CHARS[8029] = -19;\n    CHARS[8030] = 33;\n    Arrays.fill(CHARS, 8031, 8062, (byte) -19); // Fill 31 of value (byte) -19\n    Arrays.fill(CHARS, 8062, 8064, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 8064, 8117, (byte) -19); // Fill 53 of value (byte) -19\n    CHARS[8117] = 33;\n    Arrays.fill(CHARS, 8118, 8125, (byte) -19); // Fill 7 of value (byte) -19\n    CHARS[8125] = 33;\n    CHARS[8126] = -19;\n    Arrays.fill(CHARS, 8127, 8130, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 8130, 8133, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[8133] = 33;\n    Arrays.fill(CHARS, 8134, 8141, (byte) -19); // Fill 7 of value (byte) -19\n    Arrays.fill(CHARS, 8141, 8144, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 8144, 8148, (byte) -19); // Fill 4 of value (byte) -19\n    Arrays.fill(CHARS, 8148, 8150, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 8150, 8156, (byte) -19); // Fill 6 of value (byte) -19\n    Arrays.fill(CHARS, 8156, 8160, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 8160, 8173, (byte) -19); // Fill 13 of value (byte) -19\n    Arrays.fill(CHARS, 8173, 8178, (byte) 33); // Fill 5 of value (byte) 33\n    Arrays.fill(CHARS, 8178, 8181, (byte) -19); // Fill 3 of value (byte) -19\n    CHARS[8181] = 33;\n    Arrays.fill(CHARS, 8182, 8189, (byte) -19); // Fill 7 of value (byte) -19\n    Arrays.fill(CHARS, 8189, 8400, (byte) 33); // Fill 211 of value (byte) 33\n    Arrays.fill(CHARS, 8400, 8413, (byte) -87); // Fill 13 of value (byte) -87\n    Arrays.fill(CHARS, 8413, 8417, (byte) 33); // Fill 4 of value (byte) 33\n    CHARS[8417] = -87;\n    Arrays.fill(CHARS, 8418, 8486, (byte) 33); // Fill 68 of value (byte) 33\n    CHARS[8486] = -19;\n    Arrays.fill(CHARS, 8487, 8490, (byte) 33); // Fill 3 of value (byte) 33\n    Arrays.fill(CHARS, 8490, 8492, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 8492, 8494, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[8494] = -19;\n    Arrays.fill(CHARS, 8495, 8576, (byte) 33); // Fill 81 of value (byte) 33\n    Arrays.fill(CHARS, 8576, 8579, (byte) -19); // Fill 3 of value (byte) -19\n    Arrays.fill(CHARS, 8579, 12293, (byte) 33); // Fill 3714 of value (byte) 33\n    CHARS[12293] = -87;\n    CHARS[12294] = 33;\n    CHARS[12295] = -19;\n    Arrays.fill(CHARS, 12296, 12321, (byte) 33); // Fill 25 of value (byte) 33\n    Arrays.fill(CHARS, 12321, 12330, (byte) -19); // Fill 9 of value (byte) -19\n    Arrays.fill(CHARS, 12330, 12336, (byte) -87); // Fill 6 of value (byte) -87\n    CHARS[12336] = 33;\n    Arrays.fill(CHARS, 12337, 12342, (byte) -87); // Fill 5 of value (byte) -87\n    Arrays.fill(CHARS, 12342, 12353, (byte) 33); // Fill 11 of value (byte) 33\n    Arrays.fill(CHARS, 12353, 12437, (byte) -19); // Fill 84 of value (byte) -19\n    Arrays.fill(CHARS, 12437, 12441, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 12441, 12443, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 12443, 12445, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 12445, 12447, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 12447, 12449, (byte) 33); // Fill 2 of value (byte) 33\n    Arrays.fill(CHARS, 12449, 12539, (byte) -19); // Fill 90 of value (byte) -19\n    CHARS[12539] = 33;\n    Arrays.fill(CHARS, 12540, 12543, (byte) -87); // Fill 3 of value (byte) -87\n    Arrays.fill(CHARS, 12543, 12549, (byte) 33); // Fill 6 of value (byte) 33\n    Arrays.fill(CHARS, 12549, 12589, (byte) -19); // Fill 40 of value (byte) -19\n    Arrays.fill(CHARS, 12589, 19968, (byte) 33); // Fill 7379 of value (byte) 33\n    Arrays.fill(CHARS, 19968, 40870, (byte) -19); // Fill 20902 of value (byte) -19\n    Arrays.fill(CHARS, 40870, 44032, (byte) 33); // Fill 3162 of value (byte) 33\n    Arrays.fill(CHARS, 44032, 55204, (byte) -19); // Fill 11172 of value (byte) -19\n    Arrays.fill(CHARS, 55204, 55296, (byte) 33); // Fill 92 of value (byte) 33\n    Arrays.fill(CHARS, 57344, 65534, (byte) 33); // Fill 8190 of value (byte) 33\n  }\n\n  @Override\n  public boolean isValidName(String name) {\n    var length = name.length();\n    if (length == 0) return false;\n\n    if (!isNameStart(name.charAt(0))) return false;\n\n    for (var i = 1; i < length; ++i) {\n      if (!isName(name.charAt(i))) return false;\n    }\n\n    return true;\n  }\n\n  private static boolean isNameStart(int c) {\n    return c < 0x10000 && (CHARS[c] & MASK_NAME_START) != 0;\n  }\n\n  private static boolean isName(int c) {\n    return c < 0x10000 && (CHARS[c] & MASK_NAME) != 0;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/xml/Xml11Validator.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.xml;\n\nimport java.util.Arrays;\n\n// Originally taken from:\n// https://github.com/apache/xerces2-j/blob/8ce366ce9a20e7ffcb1dd37d0c4b5663d65b1f7d/src/org/apache/xerces/util/XML11Char.java\n@SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\nfinal class Xml11Validator extends XmlValidator {\n  private static final byte[] CHARS = new byte[1 << 16];\n  private static final int MASK_NAME_START = 0x04;\n  private static final int MASK_NAME = 0x08;\n\n  static {\n    Arrays.fill(CHARS, 1, 9, (byte) 17); // Fill 8 of value (byte) 17\n    CHARS[9] = 35;\n    CHARS[10] = 3;\n    Arrays.fill(CHARS, 11, 13, (byte) 17); // Fill 2 of value (byte) 17\n    CHARS[13] = 3;\n    Arrays.fill(CHARS, 14, 32, (byte) 17); // Fill 18 of value (byte) 17\n    CHARS[32] = 35;\n    Arrays.fill(CHARS, 33, 38, (byte) 33); // Fill 5 of value (byte) 33\n    CHARS[38] = 1;\n    Arrays.fill(CHARS, 39, 45, (byte) 33); // Fill 6 of value (byte) 33\n    Arrays.fill(CHARS, 45, 47, (byte) -87); // Fill 2 of value (byte) -87\n    CHARS[47] = 33;\n    Arrays.fill(CHARS, 48, 58, (byte) -87); // Fill 10 of value (byte) -87\n    CHARS[58] = 45;\n    CHARS[59] = 33;\n    CHARS[60] = 1;\n    Arrays.fill(CHARS, 61, 65, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 65, 91, (byte) -19); // Fill 26 of value (byte) -19\n    Arrays.fill(CHARS, 91, 93, (byte) 33); // Fill 2 of value (byte) 33\n    CHARS[93] = 1;\n    CHARS[94] = 33;\n    CHARS[95] = -19;\n    CHARS[96] = 33;\n    Arrays.fill(CHARS, 97, 123, (byte) -19); // Fill 26 of value (byte) -19\n    Arrays.fill(CHARS, 123, 127, (byte) 33); // Fill 4 of value (byte) 33\n    Arrays.fill(CHARS, 127, 133, (byte) 17); // Fill 6 of value (byte) 17\n    CHARS[133] = 35;\n    Arrays.fill(CHARS, 134, 160, (byte) 17); // Fill 26 of value (byte) 17\n    Arrays.fill(CHARS, 160, 183, (byte) 33); // Fill 23 of value (byte) 33\n    CHARS[183] = -87;\n    Arrays.fill(CHARS, 184, 192, (byte) 33); // Fill 8 of value (byte) 33\n    Arrays.fill(CHARS, 192, 215, (byte) -19); // Fill 23 of value (byte) -19\n    CHARS[215] = 33;\n    Arrays.fill(CHARS, 216, 247, (byte) -19); // Fill 31 of value (byte) -19\n    CHARS[247] = 33;\n    Arrays.fill(CHARS, 248, 768, (byte) -19); // Fill 520 of value (byte) -19\n    Arrays.fill(CHARS, 768, 880, (byte) -87); // Fill 112 of value (byte) -87\n    Arrays.fill(CHARS, 880, 894, (byte) -19); // Fill 14 of value (byte) -19\n    CHARS[894] = 33;\n    Arrays.fill(CHARS, 895, 8192, (byte) -19); // Fill 7297 of value (byte) -19\n    Arrays.fill(CHARS, 8192, 8204, (byte) 33); // Fill 12 of value (byte) 33\n    Arrays.fill(CHARS, 8204, 8206, (byte) -19); // Fill 2 of value (byte) -19\n    Arrays.fill(CHARS, 8206, 8232, (byte) 33); // Fill 26 of value (byte) 33\n    CHARS[8232] = 35;\n    Arrays.fill(CHARS, 8233, 8255, (byte) 33); // Fill 22 of value (byte) 33\n    Arrays.fill(CHARS, 8255, 8257, (byte) -87); // Fill 2 of value (byte) -87\n    Arrays.fill(CHARS, 8257, 8304, (byte) 33); // Fill 47 of value (byte) 33\n    Arrays.fill(CHARS, 8304, 8592, (byte) -19); // Fill 288 of value (byte) -19\n    Arrays.fill(CHARS, 8592, 11264, (byte) 33); // Fill 2672 of value (byte) 33\n    Arrays.fill(CHARS, 11264, 12272, (byte) -19); // Fill 1008 of value (byte) -19\n    Arrays.fill(CHARS, 12272, 12289, (byte) 33); // Fill 17 of value (byte) 33\n    Arrays.fill(CHARS, 12289, 55296, (byte) -19); // Fill 43007 of value (byte) -19\n    Arrays.fill(CHARS, 57344, 63744, (byte) 33); // Fill 6400 of value (byte) 33\n    Arrays.fill(CHARS, 63744, 64976, (byte) -19); // Fill 1232 of value (byte) -19\n    Arrays.fill(CHARS, 64976, 65008, (byte) 33); // Fill 32 of value (byte) 33\n    Arrays.fill(CHARS, 65008, 65534, (byte) -19); // Fill 526 of value (byte) -19\n  }\n\n  @Override\n  public boolean isValidName(String name) {\n    final int length = name.length();\n    if (length == 0) return false;\n\n    int i = 1;\n    char ch = name.charAt(0);\n    if (!isNameStart(ch)) {\n      if (length > 1 && isHighSurrogate(ch)) {\n        char ch2 = name.charAt(1);\n        if (!isLowSurrogate(ch2) || !isNameStart(supplemental(ch, ch2))) {\n          return false;\n        }\n        i = 2;\n      } else {\n        return false;\n      }\n    }\n    while (i < length) {\n      ch = name.charAt(i);\n      if (!isName(ch)) {\n        if (++i < length && isHighSurrogate(ch)) {\n          char ch2 = name.charAt(i);\n          if (!isLowSurrogate(ch2) || !isName(supplemental(ch, ch2))) {\n            return false;\n          }\n        } else {\n          return false;\n        }\n      }\n      ++i;\n    }\n    return true;\n  }\n\n  private static boolean isNameStart(int c) {\n    return (c < 0x10000 && (CHARS[c] & MASK_NAME_START) != 0) || (0x10000 <= c && c < 0xF0000);\n  }\n\n  private static boolean isName(int c) {\n    return (c < 0x10000 && (CHARS[c] & MASK_NAME) != 0) || (c >= 0x10000 && c < 0xF0000);\n  }\n\n  private static boolean isHighSurrogate(int c) {\n    return (0xD800 <= c && c <= 0xDB7F);\n  }\n\n  private static boolean isLowSurrogate(int c) {\n    return (0xDC00 <= c && c <= 0xDFFF);\n  }\n\n  private static int supplemental(char h, char l) {\n    return (h - 0xD800) * 0x400 + (l - 0xDC00) + 0x10000;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/xml/XmlValidator.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.xml;\n\npublic abstract class XmlValidator {\n  public abstract boolean isValidName(String name);\n\n  public static XmlValidator create(String version) {\n    return switch (version) {\n      case \"1.0\" -> new Xml10Validator();\n      case \"1.1\" -> new Xml11Validator();\n      default -> throw new IllegalArgumentException(version);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/xml/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://github.com/apache/xerces2-j\n *\n * <p>Original license:\n *\n * <p>Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n *\n * <p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n *\n * <p>1. Definitions.\n *\n * <p>\"License\" shall mean the terms and conditions for use, reproduction, and distribution as\n * defined by Sections 1 through 9 of this document.\n *\n * <p>\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is\n * granting the License.\n *\n * <p>\"Legal Entity\" shall mean the union of the acting entity and all other entities that control,\n * are controlled by, or are under common control with that entity. For the purposes of this\n * definition, \"control\" means (i) the power, direct or indirect, to cause the direction or\n * management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent\n * (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n *\n * <p>\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by\n * this License.\n *\n * <p>\"Source\" form shall mean the preferred form for making modifications, including but not\n * limited to software source code, documentation source, and configuration files.\n *\n * <p>\"Object\" form shall mean any form resulting from mechanical transformation or translation of a\n * Source form, including but not limited to compiled object code, generated documentation, and\n * conversions to other media types.\n *\n * <p>\"Work\" shall mean the work of authorship, whether in Source or Object form, made available\n * under the License, as indicated by a copyright notice that is included in or attached to the work\n * (an example is provided in the Appendix below).\n *\n * <p>\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or\n * derived from) the Work and for which the editorial revisions, annotations, elaborations, or other\n * modifications represent, as a whole, an original work of authorship. For the purposes of this\n * License, Derivative Works shall not include works that remain separable from, or merely link (or\n * bind by name) to the interfaces of, the Work and Derivative Works thereof.\n *\n * <p>\"Contribution\" shall mean any work of authorship, including the original version of the Work\n * and any modifications or additions to that Work or Derivative Works thereof, that is\n * intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an\n * individual or Legal Entity authorized to submit on behalf of the copyright owner. For the\n * purposes of this definition, \"submitted\" means any form of electronic, verbal, or written\n * communication sent to the Licensor or its representatives, including but not limited to\n * communication on electronic mailing lists, source code control systems, and issue tracking\n * systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and\n * improving the Work, but excluding communication that is conspicuously marked or otherwise\n * designated in writing by the copyright owner as \"Not a Contribution.\"\n *\n * <p>\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a\n * Contribution has been received by Licensor and subsequently incorporated within the Work.\n *\n * <p>2. Grant of Copyright License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display,\n * publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or\n * Object form.\n *\n * <p>3. Grant of Patent License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable (except as stated in this section) patent license to make, have made, use, offer to\n * sell, sell, import, and otherwise transfer the Work, where such license applies only to those\n * patent claims licensable by such Contributor that are necessarily infringed by their\n * Contribution(s) alone or by combination of their Contribution(s) with the Work to which such\n * Contribution(s) was submitted. If You institute patent litigation against any entity (including a\n * cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated\n * within the Work constitutes direct or contributory patent infringement, then any patent licenses\n * granted to You under this License for that Work shall terminate as of the date such litigation is\n * filed.\n *\n * <p>4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works\n * thereof in any medium, with or without modifications, and in Source or Object form, provided that\n * You meet the following conditions:\n *\n * <p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License;\n * and\n *\n * <p>(b) You must cause any modified files to carry prominent notices stating that You changed the\n * files; and\n *\n * <p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all\n * copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding\n * those notices that do not pertain to any part of the Derivative Works; and\n *\n * <p>(d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative\n * Works that You distribute must include a readable copy of the attribution notices contained\n * within such NOTICE file, excluding those notices that do not pertain to any part of the\n * Derivative Works, in at least one of the following places: within a NOTICE text file distributed\n * as part of the Derivative Works; within the Source form or documentation, if provided along with\n * the Derivative Works; or, within a display generated by the Derivative Works, if and wherever\n * such third-party notices normally appear. The contents of the NOTICE file are for informational\n * purposes only and do not modify the License. You may add Your own attribution notices within\n * Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the\n * Work, provided that such additional attribution notices cannot be construed as modifying the\n * License.\n *\n * <p>You may add Your own copyright statement to Your modifications and may provide additional or\n * different license terms and conditions for use, reproduction, or distribution of Your\n * modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and\n * distribution of the Work otherwise complies with the conditions stated in this License.\n *\n * <p>5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution\n * intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms\n * and conditions of this License, without any additional terms or conditions. Notwithstanding the\n * above, nothing herein shall supersede or modify the terms of any separate license agreement you\n * may have executed with Licensor regarding such Contributions.\n *\n * <p>6. Trademarks. This License does not grant permission to use the trade names, trademarks,\n * service marks, or product names of the Licensor, except as required for reasonable and customary\n * use in describing the origin of the Work and reproducing the content of the NOTICE file.\n *\n * <p>7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor\n * provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation,\n * any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n * PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or\n * redistributing the Work and assume any risks associated with Your exercise of permissions under\n * this License.\n *\n * <p>8. Limitation of Liability. In no event and under no legal theory, whether in tort (including\n * negligence), contract, or otherwise, unless required by applicable law (such as deliberate and\n * grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for\n * damages, including any direct, indirect, special, incidental, or consequential damages of any\n * character arising as a result of this License or out of the use or inability to use the Work\n * (including but not limited to damages for loss of goodwill, work stoppage, computer failure or\n * malfunction, or any and all other commercial damages or losses), even if such Contributor has\n * been advised of the possibility of such damages.\n *\n * <p>9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative\n * Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty,\n * indemnity, or other liability obligations and/or rights consistent with this License. However, in\n * accepting such obligations, You may act only on Your own behalf and on Your sole responsibility,\n * not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each\n * Contributor harmless for any liability incurred by, or claims asserted against, such Contributor\n * by reason of your accepting any such warranty or additional liability.\n *\n * <p>END OF TERMS AND CONDITIONS\n *\n * <p>APPENDIX: How to apply the Apache License to your work.\n *\n * <p>To apply the Apache License to your work, attach the following boilerplate notice, with the\n * fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include\n * the brackets!) The text should be enclosed in the appropriate comment syntax for the file format.\n * We also recommend that a file or class name and description of purpose be included on the same\n * \"printed page\" as the copyright notice for easier identification within third-party archives.\n *\n * <p>Copyright [yyyy] [name of copyright owner]\n *\n * <p>Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file\n * except in compliance with the License. You may obtain a copy of the License at\n *\n * <p>http://www.apache.org/licenses/LICENSE-2.0\n *\n * <p>Unless required by applicable law or agreed to in writing, software distributed under the\n * License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n * express or implied. See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@NonnullByDefault\npackage org.pkl.core.util.xml;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/Yaml11Emitter.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml;\n\nimport org.pkl.core.util.IoUtils;\n\n@SuppressWarnings(\"DuplicatedCode\")\npublic final class Yaml11Emitter extends YamlEmitter {\n  public Yaml11Emitter(StringBuilder builder, String indent) {\n    super(builder, indent);\n  }\n\n  @Override\n  protected boolean isReservedWord(String str) {\n    return isReserved11Word(str);\n  }\n\n  protected boolean isNumber(String str, int colonIndex) {\n    var length = str.length();\n    assert length > 0;\n\n    if (length == 1) {\n      var ch = str.charAt(0);\n      return IoUtils.isDecimalDigit(ch) || ch == '.';\n    }\n\n    var offset =\n        switch (str.charAt(0)) {\n          case '+', '-' -> 1;\n          default -> 0;\n        };\n\n    if (colonIndex != -1) {\n      return Yaml11Emitter.isSexagesimalNumber(str, offset, length, colonIndex);\n    }\n\n    switch (str.charAt(offset)) {\n      case 'o':\n        return Yaml11Emitter.isOctalNumber(str, offset + 1, length);\n      case '0':\n        if (offset == length - 1) return true;\n        switch (str.charAt(offset + 1)) {\n          case 'b':\n            return Yaml11Emitter.isBinaryNumber(str, offset + 2, length);\n          case 'x':\n            return Yaml11Emitter.isHexadecimalNumber(str, offset + 2, length);\n        }\n    }\n\n    return isDecimalNumber(str, offset, length);\n  }\n\n  static boolean isBinaryNumber(String str, int start, int length) {\n    if (start == length) return false;\n    for (var i = start; i < length; i++) {\n      var ch = str.charAt(i);\n      if (!IoUtils.isBinaryDigitOrUnderscore(ch)) return false;\n    }\n    return true;\n  }\n\n  static boolean isOctalNumber(String str, int start, int length) {\n    if (start == length) return false;\n    for (var i = start; i < length; i++) {\n      var ch = str.charAt(i);\n      if (!IoUtils.isOctalDigitOrUnderscore(ch)) return false;\n    }\n    return true;\n  }\n\n  static boolean isDecimalNumber(String str, int start, int length) {\n    var ch = '\\0';\n    int index;\n\n    for (index = start; index < length; index++) {\n      ch = str.charAt(index);\n      if (!IoUtils.isDecimalDigitOrUnderscore(ch)) break;\n    }\n    if (index == length) return true;\n\n    if (ch != '.') return false;\n\n    for (index = index + 1; index < length; index++) {\n      ch = str.charAt(index);\n      if (!IoUtils.isDecimalDigitOrUnderscore(ch)) break;\n    }\n    if (index == length) return true;\n\n    if (!(ch == 'e' || ch == 'E')) return false;\n\n    index++;\n    if (index + 1 >= length) return false;\n    ch = str.charAt(index);\n    if (!(ch == '-' || ch == '+')) return false;\n    for (index = index + 1; index < length; index++) {\n      ch = str.charAt(index);\n      if (!IoUtils.isDecimalDigit(ch)) break;\n    }\n\n    return index == length;\n  }\n\n  static boolean isHexadecimalNumber(String str, int start, int length) {\n    if (start == length) return false;\n    for (var i = start; i < length; i++) {\n      var ch = str.charAt(i);\n      if (!IoUtils.isHexDigitOrUnderscore(ch)) return false;\n    }\n    return true;\n  }\n\n  static boolean isSexagesimalNumber(String str, int start, int length, int colonIndex) {\n    if (!IoUtils.isNonZeroDecimalDigit(str.charAt(start))) return false;\n    // SonarQube: overflow is ok, will just throw IOOBE\n    for (var i = start + 1; i < colonIndex; i++) {\n      if (!IoUtils.isDecimalDigitOrUnderscore(str.charAt(i))) return false;\n    }\n\n    var state = 1;\n    // SonarQube: overflow is ok, will just throw IOOBE\n    for (var i = colonIndex + 1; i < length; i++) {\n      switch (state) {\n        case 0 -> {\n          switch (str.charAt(i)) {\n            case ':' -> state = 1;\n            case '.' -> state = 3;\n            default -> {\n              return false;\n            }\n          }\n        }\n        case 1 -> {\n          switch (str.charAt(i)) {\n            case '0', '1', '2', '3', '4', '5' -> state = 2;\n            case '6', '7', '8', '9' -> state = 0;\n            default -> {\n              return false;\n            }\n          }\n        }\n        case 2 -> {\n          switch (str.charAt(i)) {\n            case ':' -> state = 1;\n            case '.' -> state = 3;\n            case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> state = 0;\n            default -> {\n              return false;\n            }\n          }\n        }\n        case 3 -> {\n          for (var j = i; j < length; j++) {\n            if (!IoUtils.isDecimalDigitOrUnderscore(str.charAt(j))) return false;\n          }\n          return true;\n        }\n      }\n    }\n\n    return state != 1;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/Yaml12Emitter.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml;\n\nimport org.pkl.core.util.IoUtils;\n\n@SuppressWarnings(\"DuplicatedCode\")\npublic final class Yaml12Emitter extends YamlEmitter {\n  public Yaml12Emitter(StringBuilder builder, String indent) {\n    super(builder, indent);\n  }\n\n  @Override\n  protected boolean isReservedWord(String str) {\n    if (str.length() > 5) return false;\n\n    return switch (str) {\n      case \"\",\n          \"~\",\n          \"null\",\n          \"Null\",\n          \"NULL\",\n          \".nan\",\n          \".NaN\",\n          \".NAN\",\n          \".inf\",\n          \".Inf\",\n          \".INF\",\n          \"+.inf\",\n          \"+.Inf\",\n          \"+.INF\",\n          \"-.inf\",\n          \"-.Inf\",\n          \"-.INF\",\n          \"true\",\n          \"True\",\n          \"TRUE\",\n          \"false\",\n          \"False\",\n          \"FALSE\" ->\n          true;\n      default -> false;\n    };\n  }\n\n  @Override\n  protected boolean isNumber(String str, int colonIndex) {\n    var length = str.length();\n    assert length > 0;\n\n    if (length == 1) return IoUtils.isDecimalDigit(str.charAt(0));\n\n    switch (str.charAt(0)) {\n      case '0':\n        switch (str.charAt(1)) {\n          case 'o':\n            return isOctalNumber(str, 2, length);\n          case 'x':\n            return isHexadecimalNumber(str, 2, length);\n        }\n      case '-':\n      case '+':\n        return isDecimalNumber(str, 1, length);\n    }\n\n    return isDecimalNumber(str, 0, length);\n  }\n\n  static boolean isOctalNumber(String str, int start, int length) {\n    if (start == length) return false;\n    for (var i = start; i < length; i++) {\n      var ch = str.charAt(i);\n      if (!IoUtils.isOctalDigit(ch)) return false;\n    }\n    return true;\n  }\n\n  static boolean isHexadecimalNumber(String str, int start, int length) {\n    if (start == length) return false;\n    for (var i = start; i < length; i++) {\n      var ch = str.charAt(i);\n      if (!IoUtils.isHexDigit(ch)) return false;\n    }\n    return true;\n  }\n\n  static boolean isDecimalNumber(String str, int start, int length) {\n    var ch = '\\0';\n    int index;\n\n    for (index = start; index < length; index++) {\n      ch = str.charAt(index);\n      if (!IoUtils.isDecimalDigit(ch)) break;\n    }\n    if (index == length) return true;\n\n    if (ch == '.') {\n      for (index = index + 1; index < length; index++) {\n        ch = str.charAt(index);\n        if (!IoUtils.isDecimalDigit(ch)) break;\n      }\n      if (index == length) return true;\n    }\n\n    if (ch == 'e' || ch == 'E') {\n      index++;\n      if (index == length) return false;\n      ch = str.charAt(index);\n      if (ch == '-' || ch == '+') {\n        index++;\n        if (index == length) return false;\n      }\n      for (; index < length; index++) {\n        ch = str.charAt(index);\n        if (!IoUtils.isDecimalDigit(ch)) break;\n      }\n    }\n\n    return index == length;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/YamlCompatEmitter.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml;\n\nimport org.pkl.core.util.IoUtils;\n\n@SuppressWarnings(\"DuplicatedCode\")\npublic final class YamlCompatEmitter extends YamlEmitter {\n  public YamlCompatEmitter(StringBuilder builder, String indent) {\n    super(builder, indent);\n  }\n\n  @Override\n  protected boolean isReservedWord(String str) {\n    return isReserved11Word(str);\n  }\n\n  @Override\n  protected boolean isNumber(String str, int colonIndex) {\n    var length = str.length();\n    assert length > 0;\n\n    if (length == 1) {\n      var ch = str.charAt(0);\n      return IoUtils.isDecimalDigit(ch) || ch == '.';\n    }\n\n    var offset =\n        switch (str.charAt(0)) {\n          case '+', '-' -> 1;\n          default -> 0;\n        };\n\n    if (colonIndex != -1) {\n      return Yaml11Emitter.isSexagesimalNumber(str, offset, length, colonIndex);\n    }\n\n    switch (str.charAt(offset)) {\n      case 'o':\n        return Yaml11Emitter.isOctalNumber(str, offset + 1, length);\n      case '0':\n        if (offset == length - 1) return true;\n        switch (str.charAt(offset + 1)) {\n          case 'b':\n            return Yaml11Emitter.isBinaryNumber(str, offset + 2, length);\n          case 'o':\n            return Yaml11Emitter.isOctalNumber(str, offset + 2, length);\n          case 'x':\n            return Yaml11Emitter.isHexadecimalNumber(str, offset + 2, length);\n        }\n    }\n\n    return isDecimalNumber(str, offset, length);\n  }\n\n  // same as Yaml12Emitter.isDecimalNumber except for underscores\n  static boolean isDecimalNumber(String str, int start, int length) {\n    var ch = '\\0';\n    int index;\n\n    for (index = start; index < length; index++) {\n      ch = str.charAt(index);\n      if (!IoUtils.isDecimalDigitOrUnderscore(ch)) break;\n    }\n    if (index == length) return true;\n\n    if (ch == '.') {\n      for (index = index + 1; index < length; index++) {\n        ch = str.charAt(index);\n        if (!IoUtils.isDecimalDigitOrUnderscore(ch)) break;\n      }\n      if (index == length) return true;\n    }\n\n    if (ch == 'e' || ch == 'E') {\n      index++;\n      if (index == length) return false;\n      ch = str.charAt(index);\n      if (ch == '-' || ch == '+') {\n        index++;\n        if (index == length) return false;\n      }\n      for (; index < length; index++) {\n        ch = str.charAt(index);\n        if (!IoUtils.isDecimalDigit(ch)) break;\n      }\n    }\n\n    return index == length;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/YamlEmitter.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml;\n\nimport java.util.Base64;\n\n// Useful links:\n// https://yaml-online-parser.appspot.com\n// https://github.com/FasterXML/jackson-dataformats-text/pull/201\n// https://perlpunk.github.io/slides.tpcia2017/the-state-of-the-yaml/index.html\n// http://blogs.perl.org/users/tinita/2018/03/strings-in-yaml---to-quote-or-not-to-quote.html\npublic abstract class YamlEmitter {\n  private static final YamlEscaper escaper = new YamlEscaper();\n\n  protected final StringBuilder builder;\n  protected final String indent;\n\n  protected YamlEmitter(StringBuilder builder, String indent) {\n    this.builder = builder;\n    this.indent = indent;\n  }\n\n  public static YamlEmitter create(StringBuilder builder, String mode, String indent) {\n    return switch (mode) {\n      case \"compat\" -> new YamlCompatEmitter(builder, indent);\n      case \"1.1\" -> new Yaml11Emitter(builder, indent);\n      case \"1.2\" -> new Yaml12Emitter(builder, indent);\n      default -> throw new IllegalArgumentException(mode);\n    };\n  }\n\n  public void emit(String str, StringBuilder currIndent, boolean isKey) {\n    if (isReservedWord(str)) {\n      emitSingleQuotedString(str, -1);\n      return;\n    }\n\n    var length = str.length();\n    var needsEscaping = false;\n    var needsQuoting = false;\n    var hasNonNumberChar = false;\n    var newlineIndex = -1;\n    var colonIndex = -1;\n    var singleQuoteIndex = -1;\n\n    var first = str.charAt(0);\n    switch (first) {\n      case '\\n':\n        newlineIndex = 0;\n        break;\n      case '\\'':\n        needsQuoting = true;\n        singleQuoteIndex = 0;\n        break;\n      case '!':\n      case '%':\n      case '&':\n      case '*':\n      case '{':\n      case '}':\n      case '[':\n      case ']':\n      case ',':\n      case '#':\n      case '|':\n      case '>':\n      case '@':\n      case '`':\n      case '\"':\n      case ' ':\n        needsQuoting = true;\n        break;\n      case '-':\n      case ':':\n      case '?':\n        needsQuoting = length == 1 || str.charAt(1) == ' ';\n      case '0':\n      case '1':\n      case '2':\n      case '3':\n      case '4':\n      case '5':\n      case '6':\n      case '7':\n      case '8':\n      case '9':\n      case '+':\n      case '.':\n      case 'o':\n        break;\n      default:\n        needsEscaping = first < 0x20;\n        hasNonNumberChar = true;\n    }\n\n    for (int i = 1; i < length; i++) {\n      var ch = str.charAt(i);\n      switch (ch) {\n        case '\\n' -> {\n          if (newlineIndex == -1) {\n            newlineIndex = i;\n          }\n        }\n        case '\\'' -> {\n          hasNonNumberChar = true;\n          if (singleQuoteIndex == -1) {\n            singleQuoteIndex = i;\n          }\n        }\n        case ' ' -> {\n          needsQuoting = needsQuoting || i == length - 1;\n          hasNonNumberChar = true;\n        }\n        case '[', ']', '{', '}', ',' -> {\n          needsQuoting = needsQuoting || isKey;\n          hasNonNumberChar = true;\n        }\n        case '#' -> {\n          needsQuoting = needsQuoting || str.charAt(i - 1) == ' ';\n          hasNonNumberChar = true;\n        }\n        case ':' -> {\n          if (colonIndex == -1) {\n            colonIndex = i;\n          }\n          needsQuoting =\n              needsQuoting || i == (length - 1) || (i + 1 < length) && str.charAt(i + 1) == ' ';\n        }\n        // number chars\n        case '0',\n            '1',\n            '2',\n            '3',\n            '4',\n            '5',\n            '6',\n            '7',\n            '8',\n            '9',\n            'A',\n            'B',\n            'C',\n            'D',\n            'E',\n            'F',\n            'a',\n            'b',\n            'c',\n            'd',\n            'e',\n            'f',\n            '+',\n            '-',\n            '_',\n            '.',\n            'o',\n            'x' -> {}\n        default -> {\n          needsEscaping = needsEscaping || ch < 0x20;\n          hasNonNumberChar = true;\n        }\n      }\n    }\n\n    var pos = builder.length();\n\n    if (needsEscaping) {\n      emitDoubleQuotedString(str);\n    } else if (newlineIndex != -1) {\n      emitMultilineString(str, newlineIndex, currIndent);\n    } else if (needsQuoting || !hasNonNumberChar && isNumber(str, colonIndex)) {\n      emitSingleQuotedString(str, singleQuoteIndex);\n    } else {\n      builder.append(str);\n    }\n\n    // Make key explicit if it's more than 1024 characters long or a multiline string.\n    // (YAML spec mandates explicit key for keys longer than 1024 Unicode characters,\n    // for which 1024 characters is a safe approximation.)\n    if (isKey && (builder.length() - pos > 1024 || !needsEscaping && newlineIndex != -1)) {\n      builder.insert(pos, \"? \").append('\\n').append(currIndent);\n    }\n  }\n\n  public final void emit(long value) {\n    builder.append(value);\n  }\n\n  public final void emit(double value) {\n    builder.append(\n        Double.isNaN(value)\n            ? \".NaN\"\n            : value == Double.POSITIVE_INFINITY\n                ? \".Inf\"\n                : value == Double.NEGATIVE_INFINITY ? \"-.Inf\" : value);\n  }\n\n  public final void emit(boolean value) {\n    builder.append(value);\n  }\n\n  public final void emit(byte[] value, StringBuilder currIndent, boolean isKey) {\n    builder.append(\"!!binary \");\n    emit(Base64.getEncoder().encodeToString(value), currIndent, isKey);\n  }\n\n  public final void emitNull() {\n    builder.append(\"null\");\n  }\n\n  /** `Inf` and `NaN` are already taken care of by {@link #isReservedWord(String)}. */\n  protected abstract boolean isNumber(String str, int colonIndex);\n\n  public final String getResult() {\n    return builder.toString();\n  }\n\n  protected abstract boolean isReservedWord(String str);\n\n  protected static boolean isReserved11Word(String str) {\n    if (str.length() > 5) return false;\n\n    return switch (str) {\n      case \"\",\n          \"~\",\n          \"null\",\n          \"Null\",\n          \"NULL\",\n          \".nan\",\n          \".NaN\",\n          \".NAN\",\n          \".inf\",\n          \".Inf\",\n          \".INF\",\n          \"+.inf\",\n          \"+.Inf\",\n          \"+.INF\",\n          \"-.inf\",\n          \"-.Inf\",\n          \"-.INF\",\n          \"true\",\n          \"True\",\n          \"TRUE\",\n          \"false\",\n          \"False\",\n          \"FALSE\",\n          \"on\",\n          \"On\",\n          \"ON\",\n          \"off\",\n          \"Off\",\n          \"OFF\",\n          \"y\",\n          \"Y\",\n          \"yes\",\n          \"Yes\",\n          \"YES\",\n          \"n\",\n          \"N\",\n          \"no\",\n          \"No\",\n          \"NO\" ->\n          true;\n      default -> false;\n    };\n  }\n\n  private void emitMultilineString(String str, int newlineIndex, StringBuilder currIndent) {\n    currIndent.append(indent);\n\n    builder.append('|');\n    if (str.charAt(0) == ' ') {\n      builder.append(indent.length());\n    }\n\n    var length = str.length();\n    if (str.charAt(length - 1) == '\\n') {\n      if (length == 1 || str.charAt(length - 2) == '\\n') {\n        builder.append('+');\n      }\n    } else {\n      builder.append('-');\n    }\n\n    builder.append('\\n');\n\n    var start = 0;\n    for (int i = newlineIndex; i < length; i++) {\n      var ch = str.charAt(i);\n      if (ch != '\\n') continue;\n\n      if (i == start) {\n        // don't add leading indent before newline\n        builder.append('\\n');\n      } else {\n        builder.append(currIndent).append(str, start, i + 1);\n      }\n      start = i + 1;\n    }\n    if (start < length) {\n      builder.append(currIndent).append(str, start, length);\n    }\n\n    currIndent.setLength(currIndent.length() - indent.length());\n  }\n\n  private void emitDoubleQuotedString(String str) {\n    builder.append('\"');\n    escaper.escape(str, builder);\n    builder.append('\"');\n  }\n\n  private void emitSingleQuotedString(String str, int singleQuoteIndex) {\n    builder.append('\\'');\n\n    if (singleQuoteIndex == -1) {\n      builder.append(str);\n    } else {\n      var start = 0;\n      var length = str.length();\n      for (var i = singleQuoteIndex; i < length; i++) {\n        if (str.charAt(i) == '\\'') {\n          builder.append(str, start, i).append(\"''\");\n          start = i + 1;\n        }\n      }\n      if (start < length) {\n        builder.append(str, start, length);\n      }\n    }\n\n    builder.append('\\'');\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/YamlEscaper.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml;\n\nimport org.pkl.core.util.AbstractCharEscaper;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.Nullable;\n\n/**\n * Emits escape sequences for YAML. This is only used when emitting double-quoted strings.\n *\n * <p>Note: we don't need to escape space ({@code 0x20}) because we don't generate quoted multiline\n * strings. We also don't need to escape forward slash ({@code 0x2f}) because a normal forward slash\n * is also valid YAML.\n *\n * @see <a\n *     href=\"https://yaml.org/spec/1.2.2/#57-escaped-characters\">https://yaml.org/spec/1.2.2/#57-escaped-characters</a>\n */\npublic final class YamlEscaper extends AbstractCharEscaper {\n  private static final String[] REPLACEMENTS;\n\n  static {\n    REPLACEMENTS = new String[0xA0 + 1];\n    for (var i = 0; i < 0x20; i++) {\n      REPLACEMENTS[i] = IoUtils.toHexEscape(i);\n    }\n    // ns-esc-null\n    REPLACEMENTS[0x00] = \"\\\\0\";\n    // ns-esc-bell\n    REPLACEMENTS[0x07] = \"\\\\a\";\n    // ns-esc-backspace\n    REPLACEMENTS[0x08] = \"\\\\b\";\n    // ns-esc-horizontal-tab\n    REPLACEMENTS[0x09] = \"\\\\t\";\n    // ns-esc-line-feed\n    REPLACEMENTS[0x0A] = \"\\\\n\";\n    // ns-esc-vertical-tab\n    REPLACEMENTS[0x0B] = \"\\\\v\";\n    // ns-esc-form-feed\n    REPLACEMENTS[0x0C] = \"\\\\f\";\n    // ns-esc-carriage-return\n    REPLACEMENTS[0x0D] = \"\\\\r\";\n    // ns-esc-escape\n    REPLACEMENTS[0x1B] = \"\\\\e\";\n    // ns-esc-double-quote\n    REPLACEMENTS[0x22] = \"\\\\\\\"\";\n    // ns-esc-backslash\n    REPLACEMENTS[0x5c] = \"\\\\\\\\\";\n    // ns-esc-next-line\n    REPLACEMENTS[0x85] = \"\\\\N\";\n    // ns-esc-non-breaking-space\n    REPLACEMENTS[0xA0] = \"\\\\_\";\n  }\n\n  @Override\n  protected @Nullable String findReplacement(char ch) {\n    //noinspection UnnecessaryUnicodeEscape\n    return ch <= 0xA0 ? REPLACEMENTS[ch] : ch == '\\u2028' ? \"\\\\L\" : ch == '\\u2029' ? \"\\\\P\" : null;\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.core.util.yaml;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/Yaml11Resolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml.snake;\n\nimport java.util.regex.Pattern;\nimport org.snakeyaml.engine.v2.nodes.Tag;\n\n/** Scalar resolver compliant with YAML 1.1. */\nfinal class Yaml11Resolver extends YamlResolver {\n  // https://yaml.org/type/null.html\n  static final Pattern NULL1 = Pattern.compile(\"~|null|Null|NULL\");\n\n  // https://yaml.org/type/null.html\n  static final Pattern NULL2 = Pattern.compile(\"\");\n\n  // https://yaml.org/type/bool.html\n  static final Pattern BOOL =\n      Pattern.compile(\n          \"y|Y|yes|Yes|YES|n|N|no|No|NO\"\n              + \"|true|True|TRUE|false|False|FALSE\"\n              + \"|on|On|ON|off|Off|OFF\");\n\n  // https://yaml.org/type/int.html\n  static final Pattern INT =\n      Pattern.compile(\n          \"[-+]?(?:\"\n              + \"0b[0-1_]+\" // base 2\n              + \"|0[0-7_]+\" // base 8\n              + \"|(?:0|[1-9][0-9_]*)\" // base 10\n              + \"|0x[0-9a-fA-F_]+\" // base 16\n              + \"|[1-9][0-9_]*(?::[0-5]?[0-9])+\" // base 60\n              + \")\");\n\n  // https://yaml.org/type/float.html\n  // Assumption: `\\.[0-9.]*` should be `\\.[0-9_]*` (corrected below).\n  // This is backed up by the example `685.230_15e+03`.\n  private static final Pattern FLOAT =\n      Pattern.compile(\n          \"[-+]?(?:[0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][-+][0-9]+)?\" // base 10\n              + \"|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*\" // base 60\n              + \"|[-+]?\\\\.(?:inf|Inf|INF)\" // infinity\n              + \"|\\\\.(?:nan|NaN|NAN)\"); // not a number\n\n  Yaml11Resolver() {\n    addImplicitResolver(Tag.NULL, NULL1, \"~nN\");\n    addImplicitResolver(Tag.NULL, NULL2, \"\\0\");\n    addImplicitResolver(Tag.BOOL, BOOL, \"yYnNtTfFoO\");\n    addImplicitResolver(Tag.INT, INT, \"-+0123456789\"); // must come before float\n    addImplicitResolver(Tag.FLOAT, FLOAT, \"-+0123456789.\");\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/Yaml12Resolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml.snake;\n\nimport java.util.regex.Pattern;\nimport org.snakeyaml.engine.v2.nodes.Tag;\n\n/** Scalar resolver compliant with YAML 1.2 Core schema. */\nfinal class Yaml12Resolver extends YamlResolver {\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern NULL1 = Pattern.compile(\"~|null|Null|NULL\");\n\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern NULL2 = Pattern.compile(\"\");\n\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern BOOL = Pattern.compile(\"true|True|TRUE|false|False|FALSE\");\n\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern INT =\n      Pattern.compile(\n          \"[-+]?[0-9]+\" // base 10\n              + \"|0o[0-7]+\" // base 8 (no sign)\n              + \"|0x[0-9a-fA-F]+\"); // base 16 (no sign)\n\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern FLOAT =\n      Pattern.compile(\n          \"[-+]?(?:\\\\.[0-9]+|[0-9]+(?:\\\\.[0-9]*)?)(?:[eE][-+]?[0-9]+)?\" // number\n              + \"|[-+]?(?:\\\\.inf|\\\\.Inf|\\\\.INF)\" // infinity\n              + \"|\\\\.nan|\\\\.NaN|\\\\.NAN\"); // not a number\n\n  Yaml12Resolver() {\n    addImplicitResolver(Tag.NULL, NULL1, \"~nN\");\n    addImplicitResolver(Tag.NULL, NULL2, \"\\0\");\n    addImplicitResolver(Tag.BOOL, BOOL, \"tTfF\");\n    addImplicitResolver(Tag.INT, INT, \"-+0123456789\"); // must come before float\n    addImplicitResolver(Tag.FLOAT, FLOAT, \"-+0123456789.\");\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/YamlCompatEmitterResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml.snake;\n\nimport java.util.regex.Pattern;\nimport org.snakeyaml.engine.v2.nodes.Tag;\n\n/**\n * Modification of {@link Yaml11Resolver} tuned for <em>emitting</em> YAML that can be parsed by\n * real-world YAML 1.1 <em>and</em> 1.2 parsers. Modified regular expressions are marked with `(*)`.\n * Performs slightly more quoting than strictly necessary in any single version.\n */\nfinal class YamlCompatEmitterResolver extends YamlResolver {\n  // https://yaml.org/type/int.html\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern INT =\n      Pattern.compile(\n          \"[-+]?(?:\"\n              + \"0b[0-1_]+\" // base 2\n              + \"|0o?[0-7_]+\" // base 8 (*)\n              + \"|(?:0|[1-9][0-9_]*)\" // base 10\n              + \"|0x[0-9a-fA-F_]+\" // base 16\n              + \"|[1-9][0-9_]*(?::[0-5]?[0-9])+\" // base 60\n              + \")\");\n\n  // https://yaml.org/type/float.html\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern FLOAT =\n      Pattern.compile(\n          // YAML 1.1 base 10 w/ YAML 1.2 optional exponent sign (*)\n          // note: this means that a string containing a single dot is escaped\n          \"[-+]?(?:[0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][-+]?[0-9]+)?\"\n              + \"|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*\" // base 60\n              + \"|[-+]?\\\\.(?:inf|Inf|INF)\" // infinity\n              + \"|\\\\.(?:nan|NaN|NAN)\"); // not a number\n\n  YamlCompatEmitterResolver() {\n    addImplicitResolver(Tag.NULL, Yaml11Resolver.NULL1, \"~nN\");\n    addImplicitResolver(Tag.NULL, Yaml11Resolver.NULL2, \"\\0\");\n    addImplicitResolver(Tag.BOOL, Yaml11Resolver.BOOL, \"yYnNtTfFoO\");\n    addImplicitResolver(Tag.INT, INT, \"-+0123456789\"); // must come before float\n    addImplicitResolver(Tag.FLOAT, FLOAT, \"-+0123456789.\");\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/YamlCompatParserResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml.snake;\n\nimport java.util.regex.Pattern;\nimport org.snakeyaml.engine.v2.nodes.Tag;\n\n/**\n * Modification of {@link Yaml11Resolver} tuned for <em>parsing</em> real-world YAML 1.1\n * <em>and</em> 1.2. Modified regular expressions are marked with `(*)`.\n */\nfinal class YamlCompatParserResolver extends YamlResolver {\n  // https://yaml.org/type/int.html\n  // Note: base-60 is not supported because it is rarely used\n  // and it's common for base-60 like YAML strings not to be quoted.\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern INT =\n      Pattern.compile(\n          \"[-+]?(?:\"\n              + \"0b[0-1_]+\" // base 2\n              + \"|0o?[0-7_]+\" // base 8 (*)\n              + \"|(?:0|[1-9][0-9_]*)\" // base 10\n              + \"|0x[0-9a-fA-F_]+\" // base 16\n              + \")\");\n\n  // https://yaml.org/type/float.html\n  // Note: base-60 is not supported because it is rarely used\n  // and it's common for base-60 like YAML strings not to be quoted.\n  // https://yaml.org/spec/1.2/#id2804923\n  private static final Pattern FLOAT =\n      Pattern.compile(\n          // YAML 1.2 number w/ 1.1 underscores (*)\n          // note: this means that a single dot is parsed as string rather than float\n          \"[-+]?(?:\\\\.[0-9_]+|[0-9][0-9_]*(?:\\\\.[0-9_]*)?)(?:[eE][-+]?[0-9]+)?\"\n              + \"|[-+]?\\\\.(?:inf|Inf|INF)\" // infinity\n              + \"|\\\\.(?:nan|NaN|NAN)\"); // not a number\n\n  YamlCompatParserResolver() {\n    addImplicitResolver(Tag.NULL, Yaml11Resolver.NULL1, \"~nN\");\n    addImplicitResolver(Tag.NULL, Yaml11Resolver.NULL2, \"\\0\");\n    addImplicitResolver(Tag.BOOL, Yaml11Resolver.BOOL, \"yYnNtTfFoO\");\n    addImplicitResolver(Tag.INT, INT, \"-+0123456789\"); // must come before float\n    addImplicitResolver(Tag.FLOAT, FLOAT, \"-+0123456789.\");\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/YamlResolver.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml.snake;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport org.snakeyaml.engine.v2.nodes.Tag;\nimport org.snakeyaml.engine.v2.resolver.ScalarResolver;\n\npublic abstract class YamlResolver implements ScalarResolver {\n  private final Map<Character, List<ResolverTuple>> yamlImplicitResolvers = new HashMap<>();\n\n  protected void addImplicitResolver(Tag tag, Pattern regexp, String initialChars) {\n    for (var i = 0; i < initialChars.length(); i++) {\n      yamlImplicitResolvers\n          .computeIfAbsent(initialChars.charAt(i), ch -> new ArrayList<>())\n          .add(new ResolverTuple(tag, regexp));\n    }\n  }\n\n  @Override\n  public Tag resolve(String value, Boolean implicit) {\n    if (!implicit) return Tag.STR;\n\n    var resolvers = yamlImplicitResolvers.get(value.isEmpty() ? '\\0' : value.charAt(0));\n    if (resolvers == null) return Tag.STR;\n\n    for (var resolver : resolvers) {\n      if (resolver.regexp.matcher(value).matches()) return resolver.tag;\n    }\n\n    return Tag.STR;\n  }\n\n  private record ResolverTuple(Tag tag, Pattern regexp) {\n    @Override\n    public String toString() {\n      return \"Tuple tag=\" + tag + \" regexp=\" + regexp;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/YamlUtils.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util.yaml.snake;\n\nimport java.util.*;\nimport org.snakeyaml.engine.v2.common.ScalarStyle;\nimport org.snakeyaml.engine.v2.events.ImplicitTuple;\nimport org.snakeyaml.engine.v2.events.ScalarEvent;\nimport org.snakeyaml.engine.v2.nodes.Tag;\nimport org.snakeyaml.engine.v2.resolver.ScalarResolver;\n\n/** Utilities for parsing YAML. */\npublic final class YamlUtils {\n  private static final ScalarResolver YAML_COMPAT_EMITTER_RESOLVER =\n      new YamlCompatEmitterResolver();\n  private static final ScalarResolver YAML_COMPAT_PARSER_RESOLVER = new YamlCompatParserResolver();\n  private static final ScalarResolver YAML_11_RESOLVER = new Yaml11Resolver();\n  private static final ScalarResolver YAML_12_RESOLVER = new Yaml12Resolver();\n\n  @SuppressWarnings(\"OptionalUsedAsFieldOrParameterType\")\n  private static final Optional<String> STRING_TAG = Optional.of(Tag.STR.toString());\n\n  @SuppressWarnings(\"OptionalUsedAsFieldOrParameterType\")\n  private static final Optional<String> BINARY_TAG = Optional.of(Tag.BINARY.toString());\n\n  private static final ImplicitTuple TUPLE = new ImplicitTuple(true, true);\n\n  private YamlUtils() {}\n\n  public static ScalarResolver getEmitterResolver(String mode) {\n    return getScalarResolver(mode, YAML_COMPAT_EMITTER_RESOLVER);\n  }\n\n  public static ScalarResolver getParserResolver(String mode) {\n    return getScalarResolver(mode, YAML_COMPAT_PARSER_RESOLVER);\n  }\n\n  /**\n   * Constructs a {@link ScalarEvent} for emitting the given value as a YAML string. Uses the given\n   * resolver to determine whether the string needs to be quoted.\n   */\n  public static ScalarEvent stringScalar(String value, ScalarResolver resolver) {\n    var scalarStyle = value.contains(\"\\n\") ? ScalarStyle.LITERAL : ScalarStyle.PLAIN;\n    var inferredTag = resolver.resolve(value, true);\n    var tuple = new ImplicitTuple(Tag.STR.equals(inferredTag), true);\n    return new ScalarEvent(Optional.empty(), STRING_TAG, tuple, value, scalarStyle);\n  }\n\n  /** Constructs a {@link ScalarEvent} for emitting the given value as YAML binary. */\n  public static ScalarEvent bytesScalar(byte[] value) {\n    var encoded = Base64.getEncoder().encodeToString(value);\n    return new ScalarEvent(\n        Optional.empty(), BINARY_TAG, new ImplicitTuple(false, false), encoded, ScalarStyle.PLAIN);\n  }\n\n  /** Constructs a {@link ScalarEvent} for emitting the given value in plain style. */\n  public static ScalarEvent plainScalar(String value, Tag tag) {\n    return new ScalarEvent(\n        Optional.empty(), Optional.of(tag.toString()), TUPLE, value, ScalarStyle.PLAIN);\n  }\n\n  private static ScalarResolver getScalarResolver(\n      String mode, ScalarResolver yamlCompatEmitterResolver) {\n    return switch (mode) {\n      case \"compat\" -> yamlCompatEmitterResolver;\n      case \"1.1\" -> YAML_11_RESOLVER;\n      case \"1.2\" -> YAML_12_RESOLVER;\n      default -> throw new IllegalArgumentException(mode);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/main/java/org/pkl/core/util/yaml/snake/package-info.java",
    "content": "/**\n * This package contains source code from:\n *\n * <p>https://bitbucket.org/asomov/snakeyaml-engine/\n *\n * <p>Original license:\n *\n * <p>Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n *\n * <p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n *\n * <p>1. Definitions.\n *\n * <p>\"License\" shall mean the terms and conditions for use, reproduction, and distribution as\n * defined by Sections 1 through 9 of this document.\n *\n * <p>\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is\n * granting the License.\n *\n * <p>\"Legal Entity\" shall mean the union of the acting entity and all other entities that control,\n * are controlled by, or are under common control with that entity. For the purposes of this\n * definition, \"control\" means (i) the power, direct or indirect, to cause the direction or\n * management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent\n * (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n *\n * <p>\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by\n * this License.\n *\n * <p>\"Source\" form shall mean the preferred form for making modifications, including but not\n * limited to software source code, documentation source, and configuration files.\n *\n * <p>\"Object\" form shall mean any form resulting from mechanical transformation or translation of a\n * Source form, including but not limited to compiled object code, generated documentation, and\n * conversions to other media types.\n *\n * <p>\"Work\" shall mean the work of authorship, whether in Source or Object form, made available\n * under the License, as indicated by a copyright notice that is included in or attached to the work\n * (an example is provided in the Appendix below).\n *\n * <p>\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or\n * derived from) the Work and for which the editorial revisions, annotations, elaborations, or other\n * modifications represent, as a whole, an original work of authorship. For the purposes of this\n * License, Derivative Works shall not include works that remain separable from, or merely link (or\n * bind by name) to the interfaces of, the Work and Derivative Works thereof.\n *\n * <p>\"Contribution\" shall mean any work of authorship, including the original version of the Work\n * and any modifications or additions to that Work or Derivative Works thereof, that is\n * intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an\n * individual or Legal Entity authorized to submit on behalf of the copyright owner. For the\n * purposes of this definition, \"submitted\" means any form of electronic, verbal, or written\n * communication sent to the Licensor or its representatives, including but not limited to\n * communication on electronic mailing lists, source code control systems, and issue tracking\n * systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and\n * improving the Work, but excluding communication that is conspicuously marked or otherwise\n * designated in writing by the copyright owner as \"Not a Contribution.\"\n *\n * <p>\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a\n * Contribution has been received by Licensor and subsequently incorporated within the Work.\n *\n * <p>2. Grant of Copyright License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display,\n * publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or\n * Object form.\n *\n * <p>3. Grant of Patent License. Subject to the terms and conditions of this License, each\n * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\n * irrevocable (except as stated in this section) patent license to make, have made, use, offer to\n * sell, sell, import, and otherwise transfer the Work, where such license applies only to those\n * patent claims licensable by such Contributor that are necessarily infringed by their\n * Contribution(s) alone or by combination of their Contribution(s) with the Work to which such\n * Contribution(s) was submitted. If You institute patent litigation against any entity (including a\n * cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated\n * within the Work constitutes direct or contributory patent infringement, then any patent licenses\n * granted to You under this License for that Work shall terminate as of the date such litigation is\n * filed.\n *\n * <p>4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works\n * thereof in any medium, with or without modifications, and in Source or Object form, provided that\n * You meet the following conditions:\n *\n * <p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License;\n * and\n *\n * <p>(b) You must cause any modified files to carry prominent notices stating that You changed the\n * files; and\n *\n * <p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all\n * copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding\n * those notices that do not pertain to any part of the Derivative Works; and\n *\n * <p>(d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative\n * Works that You distribute must include a readable copy of the attribution notices contained\n * within such NOTICE file, excluding those notices that do not pertain to any part of the\n * Derivative Works, in at least one of the following places: within a NOTICE text file distributed\n * as part of the Derivative Works; within the Source form or documentation, if provided along with\n * the Derivative Works; or, within a display generated by the Derivative Works, if and wherever\n * such third-party notices normally appear. The contents of the NOTICE file are for informational\n * purposes only and do not modify the License. You may add Your own attribution notices within\n * Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the\n * Work, provided that such additional attribution notices cannot be construed as modifying the\n * License.\n *\n * <p>You may add Your own copyright statement to Your modifications and may provide additional or\n * different license terms and conditions for use, reproduction, or distribution of Your\n * modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and\n * distribution of the Work otherwise complies with the conditions stated in this License.\n *\n * <p>5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution\n * intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms\n * and conditions of this License, without any additional terms or conditions. Notwithstanding the\n * above, nothing herein shall supersede or modify the terms of any separate license agreement you\n * may have executed with Licensor regarding such Contributions.\n *\n * <p>6. Trademarks. This License does not grant permission to use the trade names, trademarks,\n * service marks, or product names of the Licensor, except as required for reasonable and customary\n * use in describing the origin of the Work and reproducing the content of the NOTICE file.\n *\n * <p>7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor\n * provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation,\n * any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n * PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or\n * redistributing the Work and assume any risks associated with Your exercise of permissions under\n * this License.\n *\n * <p>8. Limitation of Liability. In no event and under no legal theory, whether in tort (including\n * negligence), contract, or otherwise, unless required by applicable law (such as deliberate and\n * grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for\n * damages, including any direct, indirect, special, incidental, or consequential damages of any\n * character arising as a result of this License or out of the use or inability to use the Work\n * (including but not limited to damages for loss of goodwill, work stoppage, computer failure or\n * malfunction, or any and all other commercial damages or losses), even if such Contributor has\n * been advised of the possibility of such damages.\n *\n * <p>9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative\n * Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty,\n * indemnity, or other liability obligations and/or rights consistent with this License. However, in\n * accepting such obligations, You may act only on Your own behalf and on Your sole responsibility,\n * not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each\n * Contributor harmless for any liability incurred by, or claims asserted against, such Contributor\n * by reason of your accepting any such warranty or additional liability.\n *\n * <p>END OF TERMS AND CONDITIONS\n */\n@NonnullByDefault\npackage org.pkl.core.util.yaml.snake;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-core/src/main/resources/META-INF/services/java.nio.file.spi.FileTypeDetector",
    "content": "org.pkl.core.runtime.VmFileDetector\n"
  },
  {
    "path": "pkl-core/src/main/resources/META-INF/services/org.pkl.executor.spi.v1.ExecutorSpi",
    "content": "org.pkl.core.service.ExecutorSpiImpl\n"
  },
  {
    "path": "pkl-core/src/main/resources/org/pkl/core/Release.properties",
    "content": "version=@version@\ncommitId=@commitId@\nstdlibModules=@stdlibModules@\n"
  },
  {
    "path": "pkl-core/src/main/resources/org/pkl/core/errorMessages.properties",
    "content": "invalidModuleModifier=\\\nModifier `{0}` is not applicable to modules.\n\ninvalidAmendingModuleModifier=\\\nModifier `{0}` is not applicable to modules that amend another module.\n\ninvalidClassModifier=\\\nModifier `{0}` is not applicable to classes.\n\ninvalidTypeAliasModifier=\\\nModifier `{0}` is not applicable to type aliases.\n\ninvalidMethodModifier=\\\nModifier `{0}` is not applicable to methods.\n\ninvalidPropertyModifier=\\\nModifier `{0}` is not applicable to properties.\n\ninvalidObjectMemberModifier=\\\nModifier `{0}` is not applicable to object members.\n\ninvalidConstObjectMemberModifier=\\\nModifier `const` can only be applied to object members that are also `local`.\n\nobjectMethodMustBeLocal=\\\nMethod needs a `local` modifier because it is defined in an object, not a class.\n\nnonLocalObjectPropertyCannotHaveTypeAnnotation=\\\nA non-local object property cannot have a type annotation.\n\nforGeneratorCannotGenerateProperties=\\\nA for-generator cannot generate object properties (only entries and elements).\n\nforGeneratorCannotGenerateMethods=\\\nA for-generator cannot generate object methods (only entries and elements).\n\ncannotIterateOverThisValue=\\\nCannot iterate over value of type `{0}`.\n\ncyclicTypeAlias=\\\nType alias definitions must not be cyclic.\n\ncannotInvokeAbstractMethod=\\\nCannot invoke abstract method `{0}`.\n\ncannotInvokeAbstractProperty=\\\nCannot invoke abstract property `{0}`.\n\ncannotInvokeSupermethodFromHere=\\\nCannot invoke a supermethod from here.\n\nnotAModuleType=\\\nModule `{0}` cannot be extended or used as type because it amends another module.\n\ninvalidSupertype=\\\n`{0}` is not a valid supertype.\n\ncannotExtendFinalModule=\\\nCannot extend non-open module `{0}`.\\n\\\n\\n\\\nBy default, modules are closed for extension.\\n\\\nTo make a module extensible, add an `open` modifier: `open module my_module; ...`\n\ncannotExtendFinalClass=\\\nCannot extend non-open class `{0}`.\\n\\\n\\n\\\nBy default, classes are closed for extension.\\n\\\nTo make a class extensible, add an `open` modifier: `open class MyClass '{' ... '}'`\n\ncannotExtendExternalClass=\\\nCannot extend external class `{0}`.\\n\\\n\\n\\\nExternal classes can only be extended by standard library classes.\n\ncannotInstantiateExternalClass=\\\nCannot instantiate, or amend an instance of, external class `{0}`.\\n\\\n\\n\\\nTo create an instance of an external class, use its literal syntax or constructor method.\\n\\\nExamples:\\n\\\n* `123` uses literal syntax to create an instance of class `Int`.\\n\\\n* `Pair(1, 2)` uses the `Pair()` constructor method to create an instance of class `Pair`.\n\ncannotInstantiateAbstractClass=\\\nCannot instantiate abstract class `{0}`.\\n\\\n\\n\\\nAbstract classes cannot be instantiated.\\n\\\nInstead, instantiate a concrete subclass.\n\ncannotInstantiateType=\\\nCannot instantiate type `{0}`.\n\ncannotAmendPropertyDefinition=\\\nA property definition cannot be amended.\\n\\\n\\n\\\nUse definition syntax instead, for example `person: Person = new { ... }` instead of `person: Person { ... }`.\n\ncannotAmendLocalPropertyDefinition=\\\nA local property definition cannot be amended.\\n\\\n\\n\\\nUse definition syntax instead, for example `local person = new { ... }` instead of `local person { ... }`.\n\nmoduleCannotExtendSelf=\\\nModule `{0}` cannot extend itself.\n\nclassCannotExtendSelf=\\\nClass `{0}` cannot extend itself.\n\nmoduleCannotAmendSelf=\\\nModule `{0}` cannot amend itself.\n\nmissingLocalPropertyValue=\\\nMissing property value.\n\ncannotAssignFixedProperty=\\\nCannot assign to fixed property `{0}`.\n\ncannotAmendFixedProperty=\\\nCannot amend fixed property `{0}`.\n\ncannotAssignConstProperty=\\\nCannot assign to const property `{0}`.\n\n# suppress inspection \"UnusedProperty\"\ncannotAmendConstProperty=\\\nCannot amend const property `{0}`.\n\ncannotInferParent=\\\nCannot tell which parent to amend.\\n\\\n\\n\\\nPlease specify a parent explicitly, for example `new Person { ... }` instead of `new { ... }`.\n\nlistingAmendmentCannotHaveParameters=\\\nExpected a function that returns a `Listing`, but got a `Listing`.\n\nmappingAmendmentCannotHaveParameters=\\\nExpected a function that returns a `Mapping`, but got a `Mapping`.\n\nobjectAmendmentCannotHaveParameters=\\\nExpected a function that returns an object, but got an object.\n\nwrongFunctionAmendmentParameterCount=\\\nExpected a function with {0} parameters, but got {1}.\n\nwrongListingKeyType=\\\nExpected key of type `Int`, but got type `{0}`.\n\ncannotAddElementWithEntrySyntax=\\\nCannot use entry syntax to add an element.\\n\\\n\\n\\\nTo add an element, use `obj { value }` instead of `obj { [nextIndex] = value }`.\n\nobjectCannotHaveElement=\\\nObject of type `{0}` cannot have an element.\\n\\\n\\n\\\nOnly objects of type `Listing` and `Dynamic` can have elements. \\\nIf you did not mean to add an element, you probably got the syntax wrong. \\\nFor example, `obj '{' name }` adds an element, whereas `obj '{' name = \"Pigeon\" }` sets a property.\n\nobjectCannotHaveEntry=\\\nObject of type `{0}` cannot have an entry.\\n\\\n\\n\\\nOnly objects of type `Mapping` and `Dynamic` can have entries. \\\nIf you did not mean to add an entry, you probably got the syntax wrong. \\\nFor example, `obj '{' [\"name\"] = \"Pigeon\" }` adds an entry, whereas `obj '{' name = \"Pigeon\" }` sets a property.\n\nobjectCannotHaveProperty=\\\nObject of type `{0}` cannot have a property (other than `default`).\\n\\\n\\n\\\nObjects of type `Listing` and `Mapping` can only have a `default` property (and `local` properties). \\\nIf you did not mean to set a property, you probably got the syntax wrong. \\\nFor example, `obj '{' name = \"Pigeon\" }` sets a property, whereas `obj '{' [\"name\"] = \"Pigeon\" }` adds an entry.\n\nobjectCannotHavePredicateMember=\\\nObject of type `{0}` cannot have a predicate member.\n\nobjectCannotHaveSpreadEntry=\\\nCannot spread object containing entries into object of type `{0}`.\n\nobjectCannotHaveSpreadElement=\\\nCannot spread object containing elements into object of type `{0}`.\n\nobjectCannotHaveSpreadProperty=\\\nCannot spread object containing properties into object of type `{0}`.\n\nobjectSpreadDuplicateEntry=\\\nCannot spread object because the enclosing object already has a declaration of entry key `{0}`.\n\nobjectSpreadDuplicateProperty=\\\nCannot spread object because the enclosing object already has a declaration of property `{0}`.\n\ncannotSpreadObject=\\\nCannot spread value of type `{0}` into object of type `{1}`.\n\ncannotDeclareTypeParameter=\\\nOnly standard library members can have type parameters.\n\nduplicateTypeParameter=\\\nDuplicate type parameter `{0}`.\n\nnotAParameterizableClass=\\\nClass `{0}` does not have type parameters.\n\nnotASubclassOfTyped=\\\nClass `{0}` is not a subtype of `Typed`.\n\nexpectedModule=\\\nExpected a module as argument, but got an object that amends a module.\n\nwrongTypeArgumentCount=\\\nExpected {0} type argument(s) but got {1}.\n\nduplicateDefinition=\\\nDuplicate definition of member `{0}`.\n\nfloatTooLarge=\\\nFloat literal `{0}` is too large.\n\nintTooLarge=\\\nInt literal `{0}` is too large.\n\ninvalidCodePoint=\\\nDecimal `{0}` is not a valid Unicode code point.\n\ntooManyFunctionParameters=\\\nFunction literals can have at most five parameters.\n\nmissingMethodBody=\\\nMethod `{0}` is missing a body.\n\nredundantHiddenModifier=\\\nModifier `hidden` is redundant here; just use `local`.\n\nredundantFixedModifier=\\\nModifier `fixed` is redundant here; just use `local`.\n\nredundantOpenModifier=\\\nModifier `open` is redundant here; just use `abstract`.\n\nmethodMustBeConst=\\\nCannot call method `{0}` from here because it is not `const`.\\n\\\n\\n\\\nTo fix, do either of:\\n\\\n1. Add modifier `const` to method `{0}`\\n\\\n2. Self-import this module, and reference this method from the import.\n\npropertyMustBeConst=\\\nCannot reference property `{0}` from here because it is not `const`.\\n\\\n\\n\\\nTo fix, do either of:\\n\\\n1. Add modifier `const` to property `{0}`\\n\\\n2. Self-import this module, and reference this property from the import.\n\nmoduleIsNotConst=\\\nCannot reference `module` from const property `{0}`.\n\nmoduleIsNotConstClass=\\\nCannot reference `module` within a class body.\n\nmoduleIsNotConstAnnotation=\\\nCannot reference `module` within an annotation body.\n\nouterIsNotConst=\\\nCannot reference `outer` from here because it's not `const`.\n\nthisIsNotConst=\\\nCannot reference `this` from here because it is not `const`.\n\nmoduleMethodMustBeLocal=\\\nMethod needs a `local` modifier.\\n\\\n\\n\\\nTo define a non-local method, extend rather than amend the parent module (which must be `open` for extension).\n\nclassMustBeLocal=\\\nClass needs a `local` modifier.\\n\\\n\\n\\\nTo define a non-local class, extend rather than amend the parent module (which must be `open` for extension).\n\ntypeAliasMustBeLocal=\\\nType alias needs a `local` modifier.\\n\\\n\\n\\\nTo define a non-local type alias, extend rather than amend the parent module (which must be `open` for extension).\n\nexternalMemberCannotHaveBody=\\\nExternal members cannot have a body.\n\nabstractMemberCannotHaveBody=\\\nAbstract members cannot have a body.\n\nmethodNotDefined1=\\\nMethod `{0}` is not defined for argument type `{1}`.\n\nmethodNotDefined2=\\\nMethod `{0}` is not defined for argument types `{1}` and `{2}`.\n\nmethodNotDefined3=\\\nMethod `{0}` is not defined for argument types `{1}`, `{2}`, and `{3}`.\n\nmethodNotDefined4=\\\nMethod `{0}` is not defined for argument types `{1}`, `{2}`, `{3}`, and `{4}`.\n\nmethodNotDefined5=\\\nMethod `{0}` is not defined for argument types `{1}`, `{2}`, `{3}`, `{4}`, and `{5}`.\n\ncannotDefineExternalMember=\\\nExternal members can only be defined by standard library modules.\n\nwrongFunctionArgumentCount=\\\nExpected {0} function arguments but got {1}.\n\nnoOuterScope=\\\nTop-level scope does not have an outer scope.\n\noperatorNotDefined1=\\\nOperator `{0}` is not defined for operand type `{1}`.\n\noperatorNotDefined2=\\\nOperator `{0}` is not defined for operand types `{1}` and `{2}`.\n\noperatorNotDefinedLeft=\\\nOperator `{0}` is not defined for left operand type `{1}`.\n\ncharIndexOutOfRange=\\\nCharacter index `{0}` is out of range `{1}`..`{2}`.\n\nelementIndexOutOfRange=\\\nElement index `{0}` is out of range `{1}`..`{2}`.\n\ntypeMismatch=\\\nExpected value of type `{0}`, but got type `{1}`.\n\ntypeMismatch2=\\\nExpected value of type `{0}` or `{1}`, but got type `{2}`.\n\ntypeMismatchVersionConflict1=\\\nModule version conflict: Expected value of type `{0}` defined by module `{1}`, but got type `{0}` defined by module `{2}`.\n\ntypeMismatchVersionConflict2=\\\nModule version conflict: Expected value of type `{0}` defined in module `{1}`, but got type `{0}` defined in module `{2}`.\n\ntypeMismatchValue=\\\nExpected value of type `{0}`, but got `{1}`.\n\ntypeMismatchValue2=\\\nExpected value of type `{0}` or `{1}`, but got `{2}`.\n\ntypeMismatchDifferent=\\\nExpected value of type `{0}`, but got a different `{1}`.\n\ntypeMismatchBecause=\\\n* Value is not of type `{0}` because:\n\ntypeConstraintViolated=\\\nType constraint `{0}` violated.\n\ncannotFindPropertyInScope=\\\nCannot find property `{0}`.\n\ncannotFindPropertyInScopeListCandidates=\\\nCannot find property `{0}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{1}\n\ncannotFindPropertyInModule=\\\nCannot find property `{0}` in module `{1}`.\\n\\\n\\n\\\nAvailable properties in module `{1}`:\\n\\\n{2}\n\ncannotFindPropertyInModuleListCandidates=\\\nCannot find property `{0}` in module `{1}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{2}\n\ncannotFindPropertyInObject=\\\nCannot find property `{0}` in object of type `{1}`.\\n\\\n\\n\\\nAvailable properties:\\n\\\n{2}\n\ncannotFindPropertyInObjectListCandidates=\\\nCannot find property `{0}` in object of type `{1}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{2}\n\ncannotFindMethodInScope=\\\nCannot find method `{0}`.\n\ncannotFindMethodInScopeListCandidates=\\\nCannot find method `{0}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{1}\n\ncannotFindMethodInModule=\\\nCannot find method `{0}` in module `{1}`.\\n\\\n\\n\\\nAvailable methods in module `{1}`:\\n\\\n{2}\n\ncannotFindMethodInModuleListCandidates=\\\nCannot find method `{0}` in module `{1}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{2}\n\ncannotFindMethodInClass=\\\nCannot find method `{0}` in class `{1}`.\\n\\\n\\n\\\nAvailable methods in class `{1}`:\\n\\\n{2}\n\ncannotFindMethodInClassListCandidates=\\\nCannot find method `{0}` in class `{1}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{2}\n\ncannotFindKey=\\\nCannot find key `{0}`.\n\ncannotFindKeyListCandidates=\\\nCannot find key `{0}`.\\n\\\n\\n\\\nDid you mean any of the following?\\n\\\n{1}\n\nmissingMapValue=\\\nNumber of `Map()` arguments must be a multiple of two: `Map(key1, value1, key2, value2, ..., keyN, valueN)`\n\nundefinedValue=\\\nUndefined value.\n\nundefinedPropertyValue=\\\nTried to read property `{0}` but its value is undefined.\n\ncannotFindModule=\\\nCannot find module `{0}`.\n\nioErrorLoadingModule=\\\nI/O error loading module `{0}`.\n\nioErrorReadingResource=\\\nI/O error reading resource `{0}`.\n\nioErrorResolvingGlob=\\\nI/O error resolving glob pattern `{0}`.\n\nioErrorReadingTestOutputFile=\\\nI/O error reading test output file `{0}`.\n\nioErrorWritingTestOutputFile=\\\nI/O error writing test output file `{0}`.\n\ninvalidOutputFileStructure=\\\nTest output file `{0}` has invalid structure (delete the file and rerun the test).\n\ncannotEvaluateNonFileBasedTestModule=\\\nCannot evaluate test module `{0}` because it is not located on the file system.\n\nnoDescendentPathBetweenModules=\\\nNo descendent path exists between modules `{0}` and `{1}`.\n\nnoModuleLoaderRegistered=\\\nNo module loader is registered for module `{0}`.\n\nnoResourceReaderRegistered=\\\nNo resource reader is registered for scheme `{0}`.\n\ncannotFindCollectionElement=\\\nCannot find element in collection.\n\ncannotFindMatchingCollectionElement=\\\nCannot find matching element in collection.\n\nexpectedNonEmptyCollection=\\\nExpected a non-empty collection.\n\nexpectedSingleElementCollection=\\\nExpected a single-element collection.\n\ncannotFlattenCollectionWithNonCollectionElement=\\\nCannot flatten a collection containing a non-collection element.\n\nexpectedNonEmptyListing=\\\nExpected a non-empty Listing.\n\nexpectedSingleElementListing=\\\nExpected a single-element Listing.\n\nintegerOverflow=\\\nInteger overflow.\n\ndivisionByZero=\\\nDivision by zero.\n\ncannotConvertLargeFloat=\\\nCannot convert Float `{0}` to Int because it is too large.\n\ncannotConvertNonFiniteFloat=\\\nCannot convert non-finite Float `{0}` to Int.\n\nintValueTooLarge=\\\nInt value `{0}` is too large (only Int32 supported here).\n\nexpectedPositiveNumber=\\\nExpected a positive number, but got `{0}`.\n\ncannotFindResource=\\\nCannot find resource `{0}`.\n\ncannotGlobTripleDots=\\\nCannot combine glob imports with triple-dot module URIs.\n\ncannotGlobUri=\\\nCannot expand glob pattern `{0}` because scheme `{1}` is not globbable.\n\ncannotResolveInLocalDependencyNotGlobbable=\\\nCannot resolve import in local dependency because scheme `{0}` is not globbable.\n\ncannotResolveInLocalDependencyNotGlobbableNorLocal=\\\nCannot resolve import in local dependency because scheme `{0}` is not globbable and is not local.\n\nexpectedAnnotationClass=\\\nExpected an annotation class.\n\nexpectedNonNullValue=\\\nExpected a non-null value, but got `null`.\n\nnotAModuleImport=\\\nExpected `{0}` to be a module import, but it is not.\n\nnotAType=\\\nExpected `{0}` to be a type, but it is not.\n\ncannotFindModuleImport=\\\nCannot find module import `{0}`.\n\ncannotFindQualifiedType=\\\nCannot find type `{0}` in module `{1}`.\n\ncannotFindSimpleType=\\\nCannot find type `{0}`.\\n\\\n\\n\\\nSearched in the following places:\\n\\\n* Module `{1}` and any supermodules\\n\\\n* Module `pkl#base`\n\ncannotRenderType=\\\nCannot render value of type `{0}` as {1}.\n\ncannotRenderValue=\\\nCannot render value `{0}` as {1}.\n\ncannotRenderTypeAddConverter=\\\nCannot render value of type `{0}` as {1}.\\n\\\n\\n\\\nConsider adding a converter to `output.converters`.\n\ncannotConvertToIsoDuration=\\\nCannot convert duration `{0}` to ISO 8601 duration.\n\ninvalidTypeName=\\\nInvalid type name `{0}`.\\n\\\n\\n\\\nA qualified type name consists of a module import name and a type name.\\n\\\nExample: `importedModule.SomeClass`\n\ncannotRenderNonStringMap=\\\nCannot render map with non-string key as {0}.\n\ncannotRenderObjectWithNonStringKey=\\\nCannot render object with non-string key as {0}.\n\ncannotRenderNonScalarMap=\\\nCannot render map with non-scalar key as {0}.\n\ncannotRenderObjectWithNonScalarKey=\\\nCannot render object with non-scalar key as {0}.\n\ncannotRenderProtobufMapKey=\\\nCannot render map with a non-scalar, floating point or byte array key.\n\ncannotRenderProtobufMapKeyType=\\\nCannot render map with a non-scalar, floating point or byte array key type.\n\ncannotRenderObjectWithElementsAndOtherMembers=\\\nCannot render object with both elements and properties/entries as {0}.\n\ninlineNotSupportedHere=\\\n`xml.Inline` is not supported here.\n\nelementNotSupportedHere=\\\n`xml.Element` is not supported here.\n\ninvalidXmlName=\\\nInvalid XML {0} {1} name: `{2}`\n\ndoesNotContainLiteralMatch=\\\nString does not contain a match for literal pattern.\n\ndoesNotContainRegexMatch=\\\nString does not contain a match for regex pattern.\n\ncannotParseStringAs=\\\nCannot parse string as `{0}`.\n\nexpectedAnException=\\\nExpected an exception, but none was thrown.\n\ncannotEvaluateRelativeModuleUri=\\\nCannot evaluate relative module URI `{0}`.\n\ncannotAnalyzeRelativeModuleUri=\\\nCannot analyze relative module URI `{0}`.\n\ninvalidModuleUri=\\\nModule URI `{0}` has invalid syntax.\n\ninvalidModuleUriMissingSlash=\\\nModule URI `{0}` is missing a `/` after `{1}:`.\n\ninvalidUriMissingFragment=\\\nExpected URI to contain a fragment.\\n\\\n\\n\\\nThe URI must end in `#`, followed by a path string. \\\nFor example: `package://example.com/my/project@1.0.0#/path/to/file.pkl`.\n\ninvalidResourceUri=\\\nResource URI `{0}` has invalid syntax.\n\ninvalidGlobPattern=\\\nInvalid glob pattern `{0}`.\n\ninvalidGlobUnsupportedFeature=\\\nGlob patterns do not support named character classes, collating symbols, nor equivalence class expressions.\n\ninvalidGlobUnclosedSubpattern=\\\nMissing `}` character to terminate sub-pattern.\n\ninvalidGlobMissingCharacterClassTerminator=\\\nMissing `]` to terminate character class.\n\ninvalidGlobInvalidCharacterInCharacterClass=\\\nThe character `{0}` is not valid in a character class.\n\ninvalidGlobExtGlob=\\\nExtended globbing features are not supported.\n\ninvalidGlobNestedSubpattern=\\\nSub-patterns cannot be nested. To fix, remove or escape the inner `{` character.\n\ninvalidGlobInvalidTerminatingCharacter=\\\nThe backslash (`\\\\`) is the escape character, and cannot terminate a glob pattern.\n\ninvalidGlobInvalidEscapeCharacter=\\\nInvalid escape character `\\\\{0}`.\n\ninvalidGlobTooComplex=\\\nThe glob pattern is too complex.\n\ninvalidGlobNonHierarchicalUri=\\\nScheme `{0}` requires a hierarchical path (there must be a `/` after the first colon).\n\n# used as {1} in invalidModuleUri and invalidResourceUri\ninvalidTripleDotSyntax=\\\nexpected `...` or `.../path/to/my_module.pkl`\n\ncannotResolveTripleDotImports=\\\nCannot resolve a triple-dot import from module URI `{0}`.\\n\\\n\\n\\\nTriple-dot imports may only be resolved by module schemes that are considered local, and have hierarchical URIs.\n\ncannotHaveRelativeImport=\\\nModule `{0}` cannot have a relative import URI.\n\ncannotHaveRelativeResource=\\\nModule `{0}` cannot have a relative resource URI.\n\ncannotHaveRelativeFragment=\\\nCannot have a relative fragment path `{0}`.\\n\\\n\\n\\\nThe fragment of this URI is interpreted as a path, and it must be absolute (it should start with `/`).\n\nresourceNotInAllowList=\\\nRefusing to read resource `{0}` because it does not match any entry in the resource allowlist (`--allowed-resources`).\n\nmoduleNotInAllowList=\\\nRefusing to load module `{0}` because it does not match any entry in the module allowlist (`--allowed-modules`).\n\nresourcePastRootDir=\\\nRefusing to read resource `{0}` because it is not within the root directory (`--root-dir`).\n\nmodulePastRootDir=\\\nRefusing to load module `{0}` because it is not within the root directory (`--root-dir`).\n\ninsufficientModuleTrustLevel=\\\nRefusing to import module `{0}` because importing module `{1}` has an insufficient trust level.\n\ninvalidRegexSyntax=\\\nSyntax error in regex `{0}`: {1}\n\nerrorInRegexReplacement=\\\nError replacing matches for regex `{0}` with `{1}`: `{2}`\n\ninvalidPcfTopLevelValue=\\\nThe top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `{0}`.\n\ninvalidYamlStreamTopLevelValue=\\\nThe top-level value of a YAML stream must have type `Listing`, `List`, or `Set`, but got type `{0}`.\n\ninvalidPListTopLevelValue=\\\nThe top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `{0}`.\n\ninvalidPropertiesTopLevelValue=\\\nThe top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `{0}`.\n\ninvalidProtobufTopLevelValue=\\\nThe top-level value of a protobuf file must have type `Typed`, but got type `{0}`.\n\ncannotResolveTypeForProtobuf=\\\nFailed to resolve type required for rendering protobuf.\\n\\\n\\n\\\nConsider adding a type annotation.\n\ncannotRenderSubtypeForProtobuf=\\\nCannot render subtype {0} of specified type {1} in protobuf.\n\ncannotExportValue=\\\nA value of type `{0}` cannot be exported.\n\nincompatiblePklVersion=\\\nModule `{0}` requires Pkl version {1} or higher, but your Pkl version is {2}.\n\nmissingFixedModifier=\\\nMissing modifier `fixed`.\\n\\\n\\n\\\nProperty `{0}` must be declared fixed, because it overrides a fixed property on parent class `{1}`.\n\ncannotApplyFixedModifier=\\\nModifier `fixed` cannot be applied to property `{0}`.\\n\\\n\\n\\\nProperty `{0}` cannot be declared fixed, because it overrides a non-fixed property on parent class `{1}`.\n\nmissingConstModifier=\\\nMissing modifier `const`.\\n\\\n\\n\\\nProperty `{0}` must be declared const, because it overrides a const property on parent class `{1}`.\n\ncannotApplyConstModifier=\\\nModifier `const` cannot be applied to property `{0}`.\\n\\\n\\n\\\nProperty `{0}` cannot be declared const, because it overrides a non-const property on parent class `{1}`.\n\nunseparatedObjectMembers=\\\nObject members must be separated by whitespace, newline, or semicolon.\\n\\\nObject entries must be separated by newline or semicolon.\n\nunsupportedResourceType=\\\nResource reader `{0}` returned unsupported resource type `{1}`.\n\ninvalidConverterPath=\\\nConverter path `{0}` has invalid syntax.\n\njsonParseError=\\\nError parsing JSON document.\n\nyamlParseError=\\\nError parsing YAML document.\n\nyamlParseErrorTooManyAliases=\\\nError parsing YAML document: The number of aliases for collection nodes exceeds the allowed maximum of {0}.\\n\\\n\\n\\\nTo increase the allowed maximum, set `YamlRenderer.maxCollectionAliases`.\n\nevaluationTimedOut=\\\nEvaluation timed out after {0,number,#.##} second(s).\n\ncannotFindStdLibModule=\\\nCannot find standard library module `pkl:{0}`.\\n\\\n\\n\\\nAvailable standard library modules:\\n\\\n{1}\n\ninternalStdLibClass=\\\nClass `{0}` can only be used by the standard library.\n\ncannotAssignToNothing=\\\nExpected `nothing`, but got type `{0}`.\\n\\\n\\n\\\n`nothing` is typically used as the return type of functions that throw errors.\n\nconstantMicrobenchmark=\\\nMicrobenchmark is a constant expression.\n\nstackOverflow=\\\nA stack overflow occurred.\n\ncannotHaveCircularProjectDependenciesSingle=\\\nLocal project dependencies cannot be circular.\\n\\\n\\n\\\nCycle:\\n\\\n{0}\n\ncannotHaveCircularProjectDependenciesMultiple=\\\nLocal project dependencies cannot be circular.\\n\\\n\\n\\\nThe following circular imports were found.\\n\\\nNot all of them are necessarily problematic.\\n\\\nThe problematic cycles are those declared as local dependencies.\\n\\\n\\n\\\n{0}\n\ninvalidModuleOutput=\\\nExpected `{0}` of module `{3}` to be of type `{1}`, but got type `{2}`.\n\ncannotResolveDependencyWithoutHierarchicalUris=\\\nCannot import dependency because project URI `{0}` does not have a hierarchical path.\n\ncannotResolveDependencyNoProject=\\\nCannot import dependency because there is no project found.\\n\\\n\\n\\\nIf you meant to import a path that starts with `@`, prefix the path with `./` (e.g. `import \"./@myPath\").\\n\\\nIf you meant to import a dependency, ensure that this file is within a directory that contains a PklProject module.\n\ncannotFindDependencyInProject=\\\nCannot find a dependency named `{0}`, because it is not declared in the current project.\\n\\\n\\n\\\nTo fix this, add it to the `dependencies` section of your `PklProject` file, and resolve your dependencies.\n\ncannotFindDependencyInPackage=\\\nCannot find dependency named `{0}`, because it was not declared in package `{1}`.\n\nmissingVersionInPackageUri=\\\nInvalid path `{0}`.\\n\\\n\\n\\\nA package URI must have its path suffixed by its version (e.g. `package://example.com/my/package@1.0.0`).\n\nmissingPathInPackageUri=\\\nPackage URIs must have a path component.\\n\\\n\\n\\\nFor example, `/my/package@1.0.0` in URI `project://example.com/my/package@1.0.0`.\n\ninvalidSchemeInPackageUri=\\\nInvalid scheme: `{0}`.\\n\\\n\\n\\\nPackage URIs must have a `package:` scheme.\n\nmissingAuthorityInPackageUri=\\\nPackage URIs must have an authority component.\\n\\\n\\n\\\nFor example, `example.com` in URI `project://example.com/my/package@1.0.0`.\n\nunexpectedChecksumInPackageUri=\\\nDid not expect to find a checksum component in this package URI.\n\ncannotLoadProjectDepsJson=\\\nEncountered an error when attempting to load `PklProject.deps.json` at `{0}`.\\n\\\n\\n\\\nTry running `pkl project resolve` within the project directory to create a new set of dependencies.\n\ninvalidProjectDepsJson=\\\nCannot resolve dependency because file `{0}` is malformed.\\n\\\nRun `pkl project resolve` to re-create this file.\\n\\\n\\n\\\nDetails: {1}\n\nunresolvedProjectDependency=\\\nDid not find a resolved dependency for package `{0}`.\\n\\\n\\n\\\nRun `pkl project resolve` to update resolved dependencies.\n\nprojectDependenciesOutOfDateInPackage=\\\nTransitive dependency declared by package `{0}` is newer than what is declared in `PklProject.deps.json`.\\n\\\n\\n\\\nDeclared: `{1}`\\n\\\nResolved: `{2}`\\n\\\n\\n\\\nRun `pkl project resolve` to update resolved dependencies.\n\nprojectDependenciesOutOfDateInProject=\\\nProject `{0}` declares a dependency on a package that is newer than what is declared in `PklProject.deps.json`.\\n\\\n\\n\\\nDeclared: `{1}`\\n\\\nResolved: `{2}`\\n\\\n\\n\\\nRun `pkl project resolve` to update resolved dependencies.\n\ninvalidPackageZipChecksum=\\\nCannot download package `{0}` because the computed checksum does not match the expected checksum.\\n\\\n\\n\\\nComputed checksum: \"{1}\"\\n\\\nExpected checksum: \"{2}\"\\n\\\nAsset URL: \"{3}\"\n\ninvalidPackageMetadataChecksum=\\\nCannot download package `{0}` because the computed checksum for package metadata does not match the expected checksum.\\n\\\n\\n\\\nComputed checksum: \"{1}\"\\n\\\nExpected checksum: \"{2}\"\\n\\\nAsset URL: \"{3}\"\n\nbadHttpStatusCode=\\\nReceived unexpected status code `{0}` when making request `GET {1}`.\n\nioErrorMakingHttpGet=\\\nException when making request `GET {0}`:\\n\\\n{1}\n\nerrorConnectingToHost=\\\nError connecting to host `{0}`.\n\nerrorSslHandshake=\\\nError during SSL handshake with host `{0}`:\\n\\\n{1}\n\ncannotInitHttpClient=\\\nError initializing HTTP client:\\n\\\n{0}\n\ncannotFindCertFile=\\\nCannot find CA certificate file `{0}`.\n\ncannotReadCertFile=\\\nError reading CA certificate file `{0}`:\\n\\\n{1}\n\ncannotParseCertFile=\\\nError parsing CA certificate file `{0}`:\\n\\\n{1}\n\nemptyCertFile=\\\nCA certificate file `{0}` is empty.\n\ninvalidPackageZipUrl=\\\nExpected the zip asset for package `{0}` to be an HTTPS URI, but got `{1}`.\n\ninvalidDependencyMetadata=\\\nReceived invalid dependency metadata for package `{0}` when making request `GET {1}`:\\n\\\n{2}\n\nmalformedJson=\\\nMalformed JSON: {0}.\\n\\\n\\n\\\nOriginal input:\\n\\\n`{1}`\n\nbadJsonFormat1=\\\nExpected object of type `{0}`, but got type `{1}`.\n\nbadJsonFormat2=\\\nExpected object of type `{0}` at field `{1}`, but got type `{2}`.\n\nbadJsonInvalidMapping=\\\nFailed to parse key `{0}`: {1}.\n\nbadJsonMissingField=\\\nCannot find field \"{0}\" in object {1}.\n\nunsupportedProjectDepsVersion=\\\nUnsupported schemaVersion for `PklProject.deps.json`: {0}.\\n\\\n\\n\\\nRun `pkl project resolve` to re-generate this file.\n\ninvalidDeclaredChecksum=\\\nComputed checksum did not match declared checksum for dependency `{0}`.\\n\\\n\\n\\\nComputed: \"{1}\"\\n\\\nDeclared: \"{2}\"\n\ninvalidRelativeProjectImport=\\\nPath `{0}` includes path segments that are outside the project root directory.\n\nnoPackageDefinedByProject=\\\nNo package was declared in project `{0}`.\\n\\\n\\n\\\nAdd a `package` section to the PklProject file.\n\nrelativePathPropertyDefinedByProjectFromNonFileUri=\\\nInvalid property specified in project `{0}`\\n\\\n\\n\\\nProperty `{1}` is only permitted in PklProject files loaded from `file:` URIs.\n\ninvalidUsageOfProjectFromNonFileUri=\\\nInvalid usage of project `{0}`\\n\\\n\\n\\\nThis action can only be performed with PklProject files loaded from `file:` URIs.\n\npackageTestsFailed=\\\nFailed to create package `{0}`, because its API tests are failing.\n\npackageAlreadyPublishedWithDifferentContents=\\\nPackage `{0}` was already published with different contents.\\n\\\n\\n\\\nComputed checksum: {1}\\n\\\nPublished checksum: {2}\\n\\\n\\n\\\nThis likely means that you need to bump the package\\'s version.\n\nunableToAccessPublishedPackage=\\\nFailed trying to fetch package `{0}` from `{1}` (response code `{2}`).\n\nunexpectedPackageLoadError=\\\nUnexpected error resolving packages for project {0}.\\n\\\n\\n\\\n{1}\n\nmissingProjectInPackageCommand=\\\nCannot package project `{0}` because it depends on local project `{1}`, which is not included for packaging.\\n\\\n\\n\\\nProvide both projects as arguments to the `pkl project package` command.\\n\\\n\\n\\\nExample: `pkl project package \"{0}\" \"{1}\"`\n\ninvalidPackageUriChecksum=\\\nInvalid checksum specification: `{0}`.\\n\\\n\\n\\\nChecksums in package uris must have form `sha256:<checksum>`.\n\nunknownChecksumAlgorithm=\\\nUnrecognized checksum algorithm: `{0}`.\\n\\\n\\n\\\nThe only supported checksum algorithm is sha256.\n\ntestsFailed=\\\nTests failed.\n\n# suppress inspection \"HttpUrlsUsage\"\nmalformedProxyAddress=\\\nMalformed proxy URI (expecting `http://<host>[:<port>]`): `{0}`.\n\ncannotAnalyzeBecauseSyntaxError=\\\nFound a syntax error when parsing module `{0}`.\n\nmalformedMessageHeaderLength=\\\nMalformed message header (expected size 2, but got {0}).\n\nmalformedMessageHeaderException=\\\nMalformed message header.\n\nmalformedMessageHeaderUnrecognizedCode=\\\nMalformed message header (unrecognized code `{0}`).\n\nunhandledMessageCode=\\\nUnhandled decoding message code `{0}`.\n\nunhandledMessageType=\\\nUnhandled encoding message type `{0}`.\n\nmalformedMessageBody=\\\nMalformed message body for message with code `{0}`.\n\nmissingMessageParameter=\\\nMissing message parameter `{0}`\n\nunknownRequestId=\\\nReceived response {0} for unknown request ID `{1}`.\n\nexternalReaderFailure=\\\nFailed to communicate with external reader process.\n\nexternalReaderDoesNotSupportScheme=\\\nExternal {0} reader does not support scheme `{1}`.\n\nexternalReaderAlreadyTerminated=\\\nExternal reader process has already terminated.\n\ninvalidOpaqueFileUri=\\\nFile URIs must have a path that starts with `/` (e.g. file:/path/to/my_module.pkl).\\n\\\nTo resolve relative paths, remove the scheme prefix (remove \"file:\").\n\ninvalidStringBase64=\\\n`{0}` is not in base64 encoding.\n\ncharacterCodingException=\\\nInvalid bytes for charset \"{0}\".\n\ncommandSubcommandConflict=\\\nCommand `{0}` has subcommands with conflicting name \"{1}\".\\n\\\nElements of `command.subcommands` must have unique `name` values.\n\ncommandMustNotAssignOrAmendProperty=\\\nCommands must not assign or amend property `{0}`.\n\ncommandOptionNoTypeAnnotation=\\\nNo type annotation found for `{0}` property.\n\ncommandOptionsTypeNotClass=\\\nType annotation `{0}` on `options` property in `pkl:Command` subclass must be a class type.\n\ncommandOptionsTypeAbstractClass=\\\nCommand options class `{0}` may not be abstract.\n\ncommandOptionBothFlagAndArgument=\\\nFound both `@Flag` and `@Argument` annotations for options property `{0}`.\\n\\\n\\n\\\nOnly one option type may be specified.\n\ncommandOptionUnsupportedType=\\\nCommand option property `{0}` has unsupported {1}type `{2}`.\n\ncommandOptionUnexpectedDefaultValue=\\\nUnexpected default value for `@{1}` property `{0}`.\\n\\\n\\n\\\n{1}s may not specify a default value.\n\ncommandArgumentUnexpectedNonRepeatedNullableType=\\\nUnexpected nullable type for non-collection `@Argument` property `{0}`.\\n\\\n\\n\\\nArguments may not be nullable.\n\ncommandArgumentsMultipleRepeated=\\\nMore than one repeated option annotated with `@Argument` found: `{0}` and `{1}`.\\n\\\n\\n\\\nOnly one repeated argument is permitted per command.\n\ncommandFlagNameCollision=\\\nFlag option `{0}` {1} {2}collides with a reserved flag {1}.\\n\\\n\\n\\\nOption {1}s must not overlap with built-in options.\n\ncommandFlagInvalidType=\\\nOption `{0}` with annotation `@{1}` has invalid type `{2}`.\\n\\\nExpected type: `{3}`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotation1.pkl",
    "content": "/// doc comment\n/// doc comment\n@Ann\n@Ann2 { x = \"foo\" }\n@Ann3 {\n  x = \"foo\"\n  y = 1\n}\nmodule some.mod\n\n/// doc comment\n/// doc comment\n@Ann\n@Ann2 { x = \"foo\" }\n@Ann3 {\n  x = \"foo\"\n  y = 1\n}\nclass SomeClass {\n  /// doc comment\n  /// doc comment\n  @Ann\n  @Ann2 { x = \"foo\" }\n  @Ann3 {\n    x = \"foo\"\n    y = 1\n  }\n  function someMethod() = \"hi\"\n\n  /// doc comment\n  /// doc comment\n  @Ann\n  @Ann2 { x = \"foo\" }\n  @Ann3 {\n    x = \"foo\"\n    y = 1\n  }\n  someProperty: String = \"hi\"\n}\n\n/// doc comment\n/// doc comment\n@Ann\n@Ann2 { x = \"foo\" }\n@Ann3 {\n  x = \"foo\"\n  y = 1\n}\nfunction someMethod() = \"hi\"\n\n/// doc comment\n/// doc comment\n@Ann\n@Ann2 { x = \"foo\" }\n@Ann3 {\n  x = \"foo\"\n  y = 1\n}\nsomeProperty: String = \"hi\"\n\nclass Ann extends Annotation\n\nclass Ann2 extends Annotation {\n  x: String\n}\n\nclass Ann3 extends Annotation {\n  x: String\n  y: Int\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotation2.pkl",
    "content": "class NoAnn\n\n@NoAnn\ninvalidAnnotationOnTypeCheckedProperty = \"hi\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotation3.pkl",
    "content": "class NoAnn\n\n@NoAnn\ninvalidAnnotationOnTypedProperty: String = \"hi\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotation4.pkl",
    "content": "@Mapping {\n  a = \"hi\"\n  b = \"hi\"\n}\nsomeProperty: String = \"hi\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotation5.pkl",
    "content": "integer: Int = 1\n\n@integer someProperty: String = \"hi\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotation6.pkl",
    "content": "@Int someProperty: String = \"hi\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotationIsNotExpression.pkl",
    "content": "class MyAnn extends Annotation\n\nlocal myAnn = MyAnn\n\n@myAnn\nfoo = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/annotationIsNotExpression2.pkl",
    "content": "class Ann1 extends Annotation\n\nclass Ann2 extends Annotation\n\n@Ann1|Ann2\nfoo = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated1.pkl",
    "content": "open module deprecated1\n\nfunction f1(n) = n * 1000 + 1\n\n@Deprecated\nfunction f2(n) = n * 1000 + 2\n\nclass A {\n  @Deprecated\n  function f(n) = n * 1000 + 101\n}\n\nopen class B {\n  function f1(n) = n * 1000 + 201\n  @Deprecated\n  function f2(n) = n * 1000 + 202\n}\n\nclass C extends B {\n  @Deprecated\n  function f1(n) = n * 1000 + 301\n}\n\nres1 = f1(100)\nres1b = List(1, 2, 3).map((n) -> f1(n))\n\nres2 = f2(200)\nres2b = List(4, 5, 6).map((n) -> f2(n))\n\nres3 = new A {}.f(300)\nres3b = List(7, 8, 9).map((n) -> new A {}.f(n))\n\nres4 = new B {}.f1(400)\nres4b = List(10, 11, 12).map((n) -> new B {}.f1(n))\n\nres5 = new B {}.f2(500)\nres5b = List(13, 14, 15).map((n) -> new B {}.f2(n))\n\nres6 = new C {}.f1(600)\nres6b = List(16, 17, 18).map((n) -> new C {}.f1(n))\n\nres7 = new C {}.f2(700)\nres7b = List(19, 20, 21).map((n) -> new C {}.f2(n))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated2.pkl",
    "content": "module deprecated2\n\nextends \"deprecated1.pkl\"\n\n@Deprecated\nfunction f1(n) = -1 * (n * 1000 + 1)\n\nres1 = f1(800)\nres1b = List(22, 23, 24).map((n) -> f1(n))\n\nres2 = f2(900)\nres2b = List(25, 26, 27).map((n) -> f2(n))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecated3.pkl",
    "content": "module deprecated3\n\nimport \"deprecated1.pkl\"\nimport \"deprecated2.pkl\"\n\nres1 = deprecated1.f1(1000)\nres1b = List(28, 29, 30).map((n) -> deprecated1.f1(n))\n\nres2 = deprecated1.f2(1100)\nres2b = List(31, 32, 33).map((n) -> deprecated1.f2(n))\n\nres3 = deprecated2.f1(1200)\nres3b = List(34, 35, 36).map((n) -> deprecated2.f1(n))\n\nres4 = deprecated2.f2(1300)\nres4b = List(37, 38, 39).map((n) -> deprecated2.f2(n))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedNoRepeatedWarnings.pkl",
    "content": "@Deprecated\nfunction foo() = 0\n\nfunction bar() = foo()\n\nshouldWarnForFirstCallToFooFromBar = bar()\nshouldNotWarnForRepeatedCallToFooFromBar1 = bar()\nshouldNotWarnForRepeatedCallToFooFromBar2 = bar()\nshouldWarnForDirectCallToFoo = foo()\nshouldWarnForRepeatedDirectCallToFoo = foo()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage1.pkl",
    "content": "open module deprecatedWithMessage1\n\nfunction f1(n) = n * 1000 + 1\n\n@Deprecated { message = \"use f1 instead\"}\nfunction f2(n) = n * 1000 + 2\n\nclass A {\n  @Deprecated { message = \"use B.f1 instead\" }\n  function f(n) = n * 1000 + 101\n}\n\nopen class B {\n  function f1(n) = n * 1000 + 201\n  @Deprecated { message = \"use this.f1 instead\"}\n  function f2(n) = n * 1000 + 202\n}\n\nclass C extends B {\n  @Deprecated { message = \"avoid using C.f1\" }\n  function f1(n) = n * 1000 + 301\n}\n\nres1 = f1(100)\nres1b = List(1, 2, 3).map((n) -> f1(n))\n\nres2 = f2(200)\nres2b = List(4, 5, 6).map((n) -> f2(n))\n\nres3 = new A {}.f(300)\nres3b = List(7, 8, 9).map((n) -> new A {}.f(n))\n\nres4 = new B {}.f1(400)\nres4b = List(10, 11, 12).map((n) -> new B {}.f1(n))\n\nres5 = new B {}.f2(500)\nres5b = List(13, 14, 15).map((n) -> new B {}.f2(n))\n\nres6 = new C {}.f1(600)\nres6b = List(16, 17, 18).map((n) -> new C {}.f1(n))\n\nres7 = new C {}.f2(700)\nres7b = List(19, 20, 21).map((n) -> new C {}.f2(n))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage2.pkl",
    "content": "module deprecatedWithMessage2\n\nextends \"deprecatedWithMessage1.pkl\"\n\n@Deprecated { message = \"avoid using f1\" }\nfunction f1(n) = -1 * (n * 1000 + 1)\n\nres1 = f1(800)\nres1b = List(22, 23, 24).map((n) -> f1(n))\n\nres2 = f2(900)\nres2b = List(25, 26, 27).map((n) -> f2(n))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecatedWithMessage3.pkl",
    "content": "module deprecatedWithMessage3\n\nimport \"deprecatedWithMessage1.pkl\"\nimport \"deprecatedWithMessage2.pkl\"\n\nres1 = deprecatedWithMessage1.f1(1000)\nres1b = List(28, 29, 30).map((n) -> deprecatedWithMessage1.f1(n))\n\nres2 = deprecatedWithMessage1.f2(1100)\nres2b = List(31, 32, 33).map((n) -> deprecatedWithMessage1.f2(n))\n\nres3 = deprecatedWithMessage2.f1(1200)\nres3b = List(34, 35, 36).map((n) -> deprecatedWithMessage2.f1(n))\n\nres4 = deprecatedWithMessage2.f2(1300)\nres4b = List(37, 38, 39).map((n) -> deprecatedWithMessage2.f2(n))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/annotation/deprecationSuperMethod.pkl",
    "content": "open class Foo {\n  @Deprecated\n  function bar() = 40\n\n  @Deprecated { message=\"Use only Foo#qux\" }\n  function baz() = \"baz\"\n\n  function qux() = 0\n}\n\nclass Bar extends Foo {\n  function bar() = super.bar() + 2\n  function baz() = super.baz() + \" was called\"\n  function qux() = super.qux() - 1\n}\n\nbarCall = new Bar {}.bar()\nbazCall = new Bar {}.baz()\nquxCall = new Bar {}.qux()\n\nbarCall2ShouldNotWarn = new Bar {}.bar()\nbazCall2ShouldNotWarn = new Bar {}.baz()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/Resource.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  local empty = read(\"empty.txt\")\n  local fox = read(\"fox.txt\")\n\n  [\"text\"] {\n    empty.text\n    fox.text\n  }\n\n  [\"md5\"] {\n    empty.md5\n    fox.md5\n  }\n\n  [\"sha1\"] {\n    empty.sha1\n    empty.bytes.sha1\n    fox.sha1\n    fox.bytes.sha1\n  }\n\n  [\"sha256\"] {\n    empty.sha256\n    empty.bytes.sha256\n    fox.sha256\n    fox.bytes.sha256\n  }\n\n  [\"sha256Int\"] {\n    empty.sha256Int\n    empty.bytes.sha256Int\n    fox.sha256Int\n    fox.bytes.sha256Int\n  }\n\n  [\"in-language\"] {\n    new Resource {\n      base64 = Bytes(1, 2, 3, 4).base64\n    }.sha256\n\n    new Resource {\n      uri = \"foo:foo\"\n      text = \"foo bar\"\n      base64 = text.base64\n    }\n\n    new Resource { bytes = Bytes(1, 2, 3, 4) }.sha256\n\n    new Resource { bytes = Bytes(1, 2, 3, 4) }.base64\n\n    new Resource { base64 = \"AQIDBA==\" }.bytes\n  }\n\n  // test parsing of URIs.\n  // see https://github.com/apple/pkl/pull/1335\n  [\"absolute URI scheme with plus\"] {\n    module.catch(() -> read(\"foo+bar///?baz=buz\"))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/analyze1.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:analyze\"\nimport \"pkl:reflect\"\n\nimport \".../input-helper/analyze/a.pkl\"\nimport \".../input-helper/analyze/cyclicalA.pkl\"\nimport \".../input-helper/analyze/globImport.pkl\"\n\nexamples {\n  [\"basic\"] {\n    analyze.importGraph(Set(reflect.Module(a).uri))\n  }\n  [\"cycles\"] {\n    analyze.importGraph(Set(reflect.Module(cyclicalA).uri))\n  }\n  [\"globs\"] {\n    analyze.importGraph(Set(reflect.Module(globImport).uri))\n  }\n  [\"packages\"] {\n    analyze.importGraph(Set(\"package://localhost:0/birds@0.5.0#/Bird.pkl\"))\n  }\n}\n\noutput {\n  renderer {\n    // mimick result of `pkl analyze imports` CLI command\n    converters {\n      [Map] = (it) -> it.toMapping()\n      [Set] = (it) -> it.toListing()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/annotationConverters.pkl",
    "content": "open class Prefix extends ConvertProperty {\n  prefix: String\n\n  render = (prop, _) -> Pair(prefix + prop.key, prop.value)\n}\n\nclass CamelCase extends ConvertProperty {\n  render = (prop, _) ->\n    Pair(\n      prop.key.replaceAllMapped(Regex(\"[^A-Za-z0-9]+([A-Za-z0-9])\"), (match) ->\n        match.groups[1].value.toUpperCase()\n      ),\n      prop.value,\n    )\n}\n\nclass MultiplyValue extends ConvertProperty {\n  factor: Number\n  render = (prop, _) ->\n    Pair(prop.key, prop.value as Number * factor)\n}\n\nclass SubtractValue extends ConvertProperty {\n  difference: Number\n  render = (prop, _) ->\n    Pair(prop.key, prop.value as Number - difference)\n}\n\nopen class Foo {\n  no_converter: Int = 1\n\n  @Prefix { prefix = \"foo_\" }\n  prefixed_with_foo: Int = 2\n\n  @Prefix { prefix = \"foo_\" }\n  base_class_first: Int = 3\n\n  @MultiplyValue { factor = 2 }\n  transform_value: Int = 4\n\n  @SubtractValue { difference = 2 }\n  @MultiplyValue { factor = 3 }\n  @ConvertProperty {\n    render = (prop, _) -> Pair(prop.key, prop.value as Number + 4)\n  }\n  @MultiplyValue { factor = 3 }\n  @SubtractValue { difference = 11 }\n  in_order: Int = 5\n}\n\nclass Bar extends Foo {\n  @CamelCase\n  base_class_first: Int = 3\n}\n\noutput {\n  value = new Bar {}\n  renderer = new PcfRenderer {\n    convertPropertyTransformers {\n      [Prefix] { prefix = \"foo_\" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/any.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"getClass()\"] {\n    1.getClass().simpleName\n    1.2.getClass().simpleName\n    true.getClass().simpleName\n    \"hello\".getClass().simpleName\n    5.min.getClass().simpleName\n    5.mb.getClass().simpleName\n    List(1, 2, 3).getClass().simpleName\n    Map(\"one\", 1, \"two\", 2).getClass().simpleName\n    new Listing { 1; 2; 3 }.getClass().simpleName\n    new Mapping { [\"one\"] = 1; [\"two\"] = 2 }.getClass().simpleName\n    new Dynamic { x = 1; y = 2 }.getClass().simpleName\n    new Person { name = \"Pigeon\" }.getClass().simpleName\n    Person.getClass().simpleName\n    null.getClass().simpleName\n    Pair(1, 2).getClass().simpleName\n    import(\"pkl:base\").getClass().simpleName\n  }\n\n  [\"ifNonNull\"] {\n    local s = 10\n\n    s.ifNonNull((x) -> x)\n    s.ifNonNull((x) -> \"foo\")\n    s.ifNonNull((x) -> null)\n\n    null.ifNonNull((x) -> x)\n    null.ifNonNull((x) -> \"foo\")\n    null.ifNonNull((x) -> null)\n  }\n\n  [\"toString()\"] {\n    \"Pigeon\".toString()\n    42.toString()\n    1.23.toString()\n    true.toString()\n    1.23.ns.toString()\n    1.23.mb.toString()\n    Pair(1, 2).toString()\n    List(1, 2, 3).toString()\n    Set(1, 2, 3).toString()\n    Map(1, 2, 3, 4).toString()\n    new Listing { 1 2 3 }.toString()\n    new Mapping { [\"Pigeon\"] = 42; [\"Barn Owl\"] = 21 }.toString()\n    new Dynamic { name = \"Pigeon\"; age = 42 }.toString()\n    new Person2 { name = \"Pigeon\"; age = 42 }.toString()\n    null.toString()\n    Null(new Dynamic { name = \"Pigeon\" }).toString()\n  }\n}\n\nlocal class Person {\n  name: String\n}\n\nlocal class Person2 {\n  name: String\n  age: Int\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/anyConverter.pkl",
    "content": "class User {\n  name: String\n}\n\nclass Dog {\n  age: Int\n}\n\nclass Env {\n  type: \"test\"|\"prod\"\n}\n\nfoo = new Listing {\n  new User {\n    name = \"Pigeon\"\n  }\n  new Dog {\n    age = 5\n  }\n  new Env {\n    type = \"prod\"\n  }\n  \"42\"\n}\n\noutput {\n  renderer = new PcfRenderer {\n    converters {\n      [Any] = (o) -> if (o is module) o else \"Unconverted class: \\(o.getClass())\"\n      [Dog] = (d) -> \"Dog(\\(d.age))\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/baseModule.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"TODO()\"] {\n    module.catch(() -> TODO())\n  }\n\n  [\"Undefined()\"] {\n    module.catch(() -> Undefined())\n    module.catch(() -> obj.foo.bar.baz)\n    local obj = new {\n      foo {\n        bar {\n          baz = 3 + Undefined()\n        }\n      }\n    }\n  }\n\n  [\"Regex\"] {\n    Regex(\"\")\n    Regex(#\"[ab]\\s+\"#)\n    module.catch(() -> Regex(\"(\"))\n  }\n\n  [\"Pair()\"] {\n    Pair(1, \"two\")\n  }\n\n  [\"NaN\"] {\n    NaN\n  }\n\n  [\"Infinity\"] {\n    Infinity\n    -Infinity\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/benchmarkModule.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:Benchmark\"\n\nfacts {\n  [\"run microbenchmark\"] {\n    local benchmark = new Benchmark.Microbenchmark {\n      expression = IntSeq(1, 10).fold(0, (result, next) -> result + next)\n      iterations = 3\n      iterationTime = 1.ms\n      isVerbose = false\n    }\n    local result = benchmark.run()\n    \n    result.iterations == 3\n    result.repetitions >= 1\n    result.samples == null\n    result.min > 0.s\n    result.max >= result.min\n    result.mean >= result.min\n    result.mean <= result.max\n  }\n  \n  [\"run output benchmark (in verbose mode)\"] {\n    local benchmark = new Benchmark.OutputBenchmark {\n      sourceModule = import(\"../../input-helper/api/benchmark/moduleToBenchmark.pkl\")\n      iterations = 3\n      iterationTime = 1.ms\n      isVerbose = true\n    }\n    local result = benchmark.run()\n\n    result.iterations == 3\n    result.repetitions >= 1\n    result.samples != null\n    result.samples.length == 3\n    result.min == result.samples.min\n    result.max == result.samples.max\n    result.mean >= result.min\n    result.mean <= result.max\n  }\n  \n  [\"run parser benchmark\"] {\n    local benchmark = new Benchmark.ParserBenchmark {\n      sourceText = \"result = IntSeq(1, 10).fold(0, (result, next) -> result + next)\"\n      iterations = 3\n      iterationTime = 1.ms\n      isVerbose = false\n    }\n    local result = benchmark.run()\n\n    result.iterations == 3\n    result.repetitions >= 1\n    result.samples == null\n    result.min > 0.s\n    result.max >= result.min\n    result.mean >= result.min\n    result.mean <= result.max\n  }\n\n  [\"evaluate entire benchmark module\"] {\n    local benchmark = new Benchmark {\n      iterations = 3\n      iterationTime = 1.ms\n\n      microbenchmarks {\n        [\"micro\"] {\n          expression = IntSeq(1, 10).fold(0, (result, next) -> result + next)\n        }\n      }\n\n      outputBenchmarks {\n        [\"output\"] {\n          sourceModule = import(\"../../input-helper/api/benchmark/moduleToBenchmark.pkl\")\n        }\n      }\n\n      parserBenchmarks {\n        [\"parser\"] {\n          sourceText = \"result = IntSeq(1, 10).fold(0, (result, next) -> result + next)\"\n        }\n      }\n    }\n\n    local text = benchmark.output.text\n    text.contains(\"[\\\"micro\\\"]\")\n    text.contains(\"[\\\"output\\\"]\")\n    text.contains(\"[\\\"parser\\\"]\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/bytes.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal megaBytes = IntSeq(0, 999).map((_) -> 0).toBytes()\n\nexamples {\n  [\"md5\"] {\n    Bytes(1, 2, 3, 4).md5\n    Bytes().md5\n  }\n  [\"sha256\"] {\n    Bytes(1, 2, 3, 4).sha256\n    Bytes().sha256\n  }\n  [\"sha1\"] {\n    Bytes(1, 2, 3, 4).sha1\n    Bytes().sha1\n  }\n  [\"toString\"] {\n    Bytes(1, 2, 3, 4).toString()\n    Bytes().toString()\n  }\n  [\"base64\"] {\n    Bytes(1, 2, 3, 4).base64\n    Bytes().base64\n    \"AQIDBA==\".base64DecodedBytes.base64\n  }\n  [\"hex\"] {\n    Bytes(1, 2, 3, 4).hex\n    Bytes().hex\n  }\n  [\"length\"] {\n    Bytes().length\n    Bytes(1, 2, 3, 4).length\n    megaBytes.length\n  }\n  [\"size\"] {\n    Bytes().size\n    Bytes(1, 2, 3, 4).size\n    megaBytes.size\n  }\n  [\"decodeToString()\"] {\n    Bytes(0x66, 0x6f, 0x6f, 0x20, 0x62, 0x61, 0x72).decodeToString(\"UTF-8\")\n    \"foo bar\".encodeToBytes(\"UTF-8\").decodeToString(\"UTF-8\")\n  }\n  [\"getOrNull()\"] {\n    Bytes(1, 2, 3).getOrNull(0)\n    Bytes(1, 2, 3).getOrNull(1)\n    Bytes(1, 2, 3).getOrNull(2)\n    Bytes(1, 2, 3).getOrNull(3)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/dataSize.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"isPositive\"] {\n    0.mb.isPositive\n    0.0.mb.isPositive\n    1.mb.isPositive\n    0.1.mb.isPositive\n    (-0).mb.isPositive\n    (-0.0).mb.isPositive\n    !(-1).mb.isPositive\n    !(-0.1).mb.isPositive\n  }\n\n  [\"isBinaryUnit\"] {\n    1.pib.isBinaryUnit\n    2.tib.isBinaryUnit\n    3.gib.isBinaryUnit\n    4.mib.isBinaryUnit\n    5.kib.isBinaryUnit\n    6.b.isBinaryUnit\n\n    !1.pb.isBinaryUnit\n    !2.tb.isBinaryUnit\n    !3.gb.isBinaryUnit\n    !4.mb.isBinaryUnit\n    !5.kb.isBinaryUnit\n  }\n\n  [\"isDecimalUnit\"] {\n    1.pb.isDecimalUnit\n    2.tb.isDecimalUnit\n    3.gb.isDecimalUnit\n    4.mb.isDecimalUnit\n    5.kb.isDecimalUnit\n    6.b.isDecimalUnit\n\n    !1.pib.isDecimalUnit\n    !2.tib.isDecimalUnit\n    !3.gib.isDecimalUnit\n    !4.mib.isDecimalUnit\n    !5.kib.isDecimalUnit\n  }\n\n  [\"isBetween\"] {\n    3.kb.isBetween(2.kb, 4.kb)\n    3.kb.isBetween(3.kb, 4.kb)\n    3.kb.isBetween(2.kb, 3.kb)\n    3.kb.isBetween(3.kb, 3.kb)\n    3.kb.isBetween(2000.b, 3000.b)\n    !3.kb.isBetween(1.kb, 2.kb)\n    !3.kb.isBetween(4.kb, 2.kb)\n\n    3.3.kb.isBetween(2.2.kb, 4.4.kb)\n    3.3.kb.isBetween(3.3.kb, 4.4.kb)\n    3.3.kb.isBetween(2.2.kb, 3.3.kb)\n    3.3.kb.isBetween(3.3.kb, 3.3.kb)\n    3.3.kb.isBetween(2000.b, 3300.b)\n    !3.3.kb.isBetween(1.1.kb, 2.2.kb)\n    !3.3.kb.isBetween(4.4.kb, 2.2.kb)\n  }\n}\n\nexamples {\n  [\"value\"] {\n    1.b.value\n    2.2.kb.value\n    3.kib.value\n    4.4.mb.value\n    5.mib.value\n    6.6.gb.value\n    7.gib.value\n    8.8.tb.value\n    9.tib.value\n    10.1.pb.value\n    11.pib.value\n    List(1, 2.2, 3).map((d) -> d.mb.value)\n  }\n\n  [\"unit\"] {\n    1.b.unit\n    2.2.kb.unit\n    3.kib.unit\n    4.4.mb.unit\n    5.mib.unit\n    6.6.gb.unit\n    7.gib.unit\n    8.8.tb.unit\n    9.tib.unit\n    10.1.pb.unit\n    11.pib.unit\n  }\n\n\n  [\"toUnit()\"] {\n    1.pb.toUnit(\"pb\")\n    1.pb.toUnit(\"tb\")\n    1.pb.toUnit(\"gb\")\n    1.pb.toUnit(\"mb\")\n    1.pb.toUnit(\"kb\")\n    1.pb.toUnit(\"b\")\n\n    local b = 1.pb.toUnit(\"b\")\n    b.toUnit(\"pb\")\n    b.toUnit(\"tb\")\n    b.toUnit(\"gb\")\n    b.toUnit(\"mb\")\n    b.toUnit(\"kb\")\n    b.toUnit(\"b\")\n\n    1.pib.toUnit(\"pib\")\n    1.pib.toUnit(\"tib\")\n    1.pib.toUnit(\"gib\")\n    1.pib.toUnit(\"mib\")\n    1.pib.toUnit(\"kib\")\n    1.pib.toUnit(\"b\")\n\n    local b2 = 1.pib.toUnit(\"b\")\n    b2.toUnit(\"pib\")\n    b2.toUnit(\"tib\")\n    b2.toUnit(\"gib\")\n    b2.toUnit(\"mib\")\n    b2.toUnit(\"kib\")\n    b2.toUnit(\"b\")\n\n    module.catch(() -> 1.pb.toUnit(\"foo\"))\n    0.5.gb.toUnit(\"kb\")\n    0.5.gb.toUnit(\"gib\")\n  }\n\n  [\"toBinaryUnit()\"] {\n    1.024.pb.toBinaryUnit()\n    1.024.tb.toBinaryUnit()\n    1.024.gb.toBinaryUnit()\n    1.024.mb.toBinaryUnit()\n    1.024.kb.toBinaryUnit()\n    1.024.b.toBinaryUnit()\n\n    1.024.pib.toBinaryUnit()\n    1.024.tib.toBinaryUnit()\n    1.024.gib.toBinaryUnit()\n    1.024.mib.toBinaryUnit()\n    1.024.kib.toBinaryUnit()\n  }\n\n  [\"toDecimalUnit()\"] {\n    1.pb.toDecimalUnit()\n    1.tb.toDecimalUnit()\n    1.gb.toDecimalUnit()\n    1.mb.toDecimalUnit()\n    1.kb.toDecimalUnit()\n    1.b.toDecimalUnit()\n\n    1.pib.toDecimalUnit()\n    1.tib.toDecimalUnit()\n    1.gib.toDecimalUnit()\n    1.mib.toDecimalUnit()\n    1.kib.toDecimalUnit()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/dir1/dir2/relativePathTo.pkl",
    "content": "import \"pkl:test\"\n\nres1 = test.catch(() -> module.relativePathTo(import(\"../../module.pkl\")))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/duration.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:math\"\n\nfacts {\n  [\"isPositive\"] {\n    0.min.isPositive\n    0.0.min.isPositive\n    1.min.isPositive\n    0.1.min.isPositive\n\n    (-0).min.isPositive\n    (-0.0).min.isPositive\n    !(-1).min.isPositive\n    !(-0.1).min.isPositive\n  }\n\n  [\"isBetween\"] {\n    3.min.isBetween(2.min, 4.min)\n    3.min.isBetween(3.min, 4.min)\n    3.min.isBetween(2.min, 3.min)\n    3.min.isBetween(3.min, 3.min)\n    3.min.isBetween(120.s, 180.s)\n    !3.min.isBetween(1.min, 2.min)\n    !3.min.isBetween(4.min, 2.min)\n\n    3.3.min.isBetween(2.2.min, 4.4.min)\n    3.3.min.isBetween(3.3.min, 4.4.min)\n    3.3.min.isBetween(2.2.min, 3.3.min)\n    3.3.min.isBetween(3.3.min, 3.3.min)\n    3.3.min.isBetween(120.s, 210.s)\n    !3.3.min.isBetween(1.1.min, 2.2.min)\n    !3.3.min.isBetween(4.4.min, 2.2.min)\n  }\n}\n\nexamples {\n  local cases = new Listing {\n    1.ns\n    2.2.us\n    3.ms\n    4.4.s\n    5.min\n    6.6.h\n    7.d\n  }\n  [\"value\"] {\n    for (c in cases) {\n      c.value\n    }\n    List(1, 2.2, 3).map((d) -> d.mb.value)\n  }\n\n  [\"unit\"] {\n    for (c in cases) {\n      c.unit\n    }\n  }\n  \n  [\"isoString\"] {\n    for (c in cases) {\n      c.isoString\n    }\n    2000.5.ms.isoString\n    0.h.isoString\n    0.0.h.isoString\n    (-0.0).h.isoString\n    0.s.isoString\n    0.0.s.isoString\n    (-0.0).s.isoString\n    0.ms.isoString\n    0.0.ms.isoString\n    (-0.0).ms.isoString\n    100.d.isoString\n    (-10.001).s.isoString\n    (-3.1.h).isoString\n    math.maxFiniteFloat.s.isoString\n    module.catch(() -> (0/0).s.isoString)\n    module.catch(() -> (1/0).s.isoString)\n    module.catch(() -> (-1/0).s.isoString)\n    module.catch(() -> (math.maxFiniteFloat * 1.00000000001).s.isoString)\n  }\n\n  [\"toUnit()\"] {\n    1.d.toUnit(\"d\")\n    1.d.toUnit(\"h\")\n    1.d.toUnit(\"min\")\n    1.d.toUnit(\"s\")\n    1.d.toUnit(\"ms\")\n    1.d.toUnit(\"us\")\n    1.d.toUnit(\"ns\")\n\n    local ns = 1.d.toUnit(\"ns\")\n    ns.toUnit(\"d\")\n    ns.toUnit(\"h\")\n    ns.toUnit(\"min\")\n    ns.toUnit(\"s\")\n    ns.toUnit(\"us\")\n    ns.toUnit(\"ns\")\n\n    0.5.h.toUnit(\"s\")\n    1800.s.toUnit(\"h\")\n\n    module.catch(() -> 1.d.toUnit(\"foo\"))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/dynamic.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"length()\"] {\n    obj.length() == 2\n    ((obj) { \"three\"; \"four\" } { x = 1 } { \"five\" } {}).length() == 5\n    obj2.length() == 2\n    new Dynamic {}.length() == 0\n    new Dynamic { name = \"Pigeon\" }.length() == 0\n    new Dynamic { [\"name\"] = \"Pigeon\" }.length() == 0\n  }\n}\n\nexamples {\n  [\"getProperty()\"] {\n    pigeon.getProperty(\"name\")\n    pigeon.getProperty(\"na\" + \"me\")\n    pigeon.getProperty(\"age\")\n    module.catch(() -> pigeon.getProperty(\"other\"))\n  }\n\n  [\"getPropertyOrNull()\"] {\n    pigeon.getPropertyOrNull(\"name\")\n    pigeon.getPropertyOrNull(\"na\" + \"me\")\n    pigeon.getPropertyOrNull(\"age\")\n    pigeon.getPropertyOrNull(\"other\")\n  }\n\n  [\"hasProperty()\"] {\n    pigeon.hasProperty(\"name\")\n    pigeon.hasProperty(\"na\" + \"me\")\n    pigeon.hasProperty(\"age\")\n    pigeon.hasProperty(\"other\")\n\n    futurePigeon.hasProperty(\"name\")\n    pigeon.hasProperty(\"nostalgia\")\n    futurePigeon.hasProperty(\"nostalgia\")\n  }\n\n  [\"toMap()\"] {\n    pigeon.toMap()\n    obj.toMap()\n    obj2.toMap()\n  }\n\n  [\"toList()\"] {\n    pigeon.toList()\n    obj.toList()\n    obj2.toList()\n  }\n\n  [\"toTyped()\"] {\n    pigeon.toTyped(Person)\n    futurePigeon.toTyped(Person)\n    new Dynamic { age = 42 }.toTyped(Person)\n    new Dynamic { name = \"Pigeon\" }.toTyped(Person).name\n    module.catch(() -> new Dynamic { name = \"Pigeon\" }.toTyped(Person).age)\n    module.catch(() -> obj.toTyped(Pair)) // Pair is not a Typed\n    module.catch(() -> obj.toTyped(ValueRenderer)) // ValueRenderer is abstract\n  }\n}\n\nlocal obj = new Dynamic {\n  prop1 = \"prop1\"\n  prop2 = \"prop2\"\n  [\"name\"] = \"Pigeon\"\n  [\"age\"] = 42\n  \"one\"\n  \"two\"\n}\n\nlocal obj2 = (obj) {\n  [0] = \"one one\"\n  [1] = \"two two\"\n}\n\nlocal pigeon = new Dynamic {\n  local n = \"Pigeon\"\n  name = n\n  age = 42\n}\n\nlocal futurePigeon = (pigeon) {\n  age = 43\n  nostalgia = true\n}\n\nlocal class Person {\n  name: String = \"Default\"\n  age: UInt\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/empty.txt",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/float.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"isNaN\"] {\n    NaN.isNaN\n    !Infinity.isNaN\n    !(-Infinity).isNaN\n    !42.123.isNaN\n    !(-42.123).isNaN\n  }\n\n  [\"isFinite\"] {\n    42.123.isFinite\n    (-42.123).isFinite\n    !NaN.isFinite\n    !Infinity.isFinite\n    !(-Infinity).isFinite\n  }\n\n  [\"isInfinite\"] {\n    Infinity.isInfinite\n    (-Infinity).isInfinite\n    !42.123.isInfinite\n    !(-42.123).isInfinite\n    !NaN.isInfinite\n  }\n\n  [\"isPositive\"] {\n    42.123.isPositive\n    0.0.isPositive\n    Infinity.isPositive\n    (-0.0).isPositive\n    !(-42.123).isPositive\n    !NaN.isPositive\n    !(-Infinity).isPositive\n  }\n\n  [\"isBetween()\"] {\n    3.3.isBetween(2, 4)\n    3.3.isBetween(2.2, 4.4)\n    3.3.isBetween(2.2, 4)\n    3.3.isBetween(2, 4.4)\n    3.3.isBetween(2, 3.3)\n    3.3.isBetween(3.3, 4.0)\n    3.3.isBetween(3.3, 3.3)\n    !3.3.isBetween(1.1, 2.2)\n    !3.3.isBetween(4.4, 2.2)\n  }\n\n  [\"isNonZero\"] {\n    3.3.isNonZero\n    (-3.3).isNonZero\n    NaN.isNonZero\n    !0.isNonZero\n    !0.0.isNonZero\n    !(-0.0).isNonZero\n  }\n\n  [\"toDuration()\"] {\n    3.21.toDuration(\"min\") == 3.21.min\n    -99.999.toDuration(\"ms\") == -99.999.ms\n  }\n\n  [\"toDataSize()\"] {\n    3.21.toDataSize(\"kb\") == 3.21.kb\n    -99.999.toDataSize(\"gib\") == -99.999.gib\n  }\n}\n\nexamples {\n  [\"sign\"] {\n    2.34.sign\n    (-2.34).sign\n    0.0.sign\n    (-0.0).sign\n    NaN.sign\n    Infinity.sign\n    (-Infinity).sign\n  }\n\n  [\"abs\"] {\n    2.34.abs\n    (-2.34).abs\n    0.0.abs\n    (-0.0).abs\n    NaN.abs\n    Infinity.abs\n    (-Infinity).abs\n  }\n\n  [\"ceil\"] {\n    2.34.ceil\n    2.9.ceil\n    (-2.34).ceil\n    (-2.9).ceil\n    0.0.ceil\n    (-0.0).ceil\n    NaN.ceil\n    Infinity.ceil\n    (-Infinity).ceil\n  }\n\n  [\"floor\"] {\n    2.34.floor\n    2.9.floor\n    (-2.34).floor\n    (-2.9).floor\n    0.0.floor\n    (-0.0).floor\n    NaN.floor\n    Infinity.floor\n    (-Infinity).floor\n  }\n\n  [\"round()\"] {\n    2.34.round()\n    2.9.round()\n    (-2.34).round()\n    (-2.9).round()\n    0.0.round()\n    (-0.0).round()\n    NaN.round()\n    Infinity.round()\n    (-Infinity).round()\n  }\n\n  [\"truncate()\"] {\n    2.34.truncate()\n    2.9.truncate()\n    (-2.34).truncate()\n    (-2.9).truncate()\n    0.0.truncate()\n    (-0.0).truncate()\n    NaN.truncate()\n    Infinity.truncate()\n    (-Infinity).truncate()\n  }\n\n  [\"toInt()\"] {\n    2.34.toInt()\n    2.9.toInt()\n    (-2.34).toInt()\n    (-2.9).toInt()\n    0.0.toInt()\n    (-0.0).toInt()\n    module.catch(() -> Infinity.toInt())\n    module.catch(() -> (-Infinity).toInt())\n    module.catch(() -> NaN.toInt())\n    module.catch(() -> 9223372036854775808.1.toInt())\n  }\n\n  [\"toFloat()\"] {\n    2.34.toFloat()\n    2.9.toFloat()\n    (-2.34).toFloat()\n    (-2.9).toFloat()\n    0.0.toFloat()\n    (-0.0).toFloat()\n    NaN.toFloat()\n    Infinity.toFloat()\n    (-Infinity).toFloat()\n  }\n\n  [\"toString()\"] {\n    2.34.toString()\n    2.9.toString()\n    (-2.34).toString()\n    (-2.9).toString()\n    0.0.toString()\n    (-0.0).toString()\n    NaN.toString()\n    Infinity.toString()\n    (-Infinity).toString()\n  }\n\n  [\"toFixed()\"] {\n    2.34.toFixed(0)\n    2.9.toFixed(0)\n    (-2.34).toFixed(0)\n    (-2.9).toFixed(0)\n    0.0.toFixed(0)\n    (-0.0).toFixed(0)\n    NaN.toFixed(0)\n    Infinity.toFixed(0)\n    (-Infinity).toFixed(0)\n\n    2.34.toFixed(1)\n    2.9.toFixed(2)\n    (-2.34).toFixed(3)\n    (-2.9).toFixed(4)\n    0.0.toFixed(5)\n    (-0.0).toFixed(6)\n    NaN.toFixed(7)\n    Infinity.toFixed(8)\n    (-Infinity).toFixed(9)\n\n    1.23456789.toFixed(1)\n    (-1.23456789).toFixed(2)\n    1.23456789.toFixed(3)\n    (-1.23456789).toFixed(4)\n    1.23456789.toFixed(5)\n    (-1.23456789).toFixed(6)\n    1.23456789.toFixed(7)\n    (-1.23456789).toFixed(8)\n    1.23456789.toFixed(9)\n\n    123456789.123456789.toFixed(1)\n    123456789.123456789.toFixed(2)\n    123456789.123456789.toFixed(3)\n    123456789.123456789.toFixed(4)\n    123456789.123456789.toFixed(5)\n    123456789.123456789.toFixed(6)\n    123456789.123456789.toFixed(7)\n    123456789.123456789.toFixed(8)\n    123456789.123456789.toFixed(9)\n    \n    module.catch(() -> 1.23.toFixed(-1))\n    module.catch(() -> 1.23.toFixed(21))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/fox.txt",
    "content": "The quick brown fox jumps over the lazy dog."
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/int.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"isEven\"] {\n    (-124).isEven\n    0.isEven\n    !123.isEven\n  }\n\n  [\"isOdd\"] {\n    123.isOdd\n    !(-124).isOdd\n    !0.isOdd\n  }\n\n  [\"isNaN\"] {\n    !42.isNaN\n    !(-42).isNaN\n  }\n\n  [\"isFinite\"] {\n    42.isFinite\n    (-42).isFinite\n  }\n\n  [\"isInfinite\"] {\n    !42.isInfinite\n    !(-42).isInfinite\n  }\n\n  [\"isPositive\"] {\n    42.isPositive\n    0.isPositive\n    !(-42).isPositive\n  }\n\n  [\"isBetween()\"] {\n    3.isBetween(2, 4)\n    3.isBetween(2.2, 4.4)\n    3.isBetween(2.2, 4)\n    3.isBetween(2, 4.4)\n    3.isBetween(2, 3)\n    3.isBetween(3, 4)\n    3.isBetween(3, 3)\n    3.isBetween(3.0, 3.0)\n    !3.isBetween(1, 2)\n    !3.isBetween(4, 2)\n  }\n\n  [\"isNonZero\"] {\n    3.isNonZero\n    (-3).isNonZero\n    !0.isNonZero\n  }\n\n  [\"toDuration()\"] {\n    3.toDuration(\"min\") == 3.min\n    -99.toDuration(\"ms\") == -99.ms\n  }\n\n  [\"toDataSize()\"] {\n    3.toDataSize(\"kb\") == 3.kb\n    -99.toDataSize(\"gib\") == -99.gib\n  }\n}\n\nexamples {\n  [\"sign\"] {\n    123.sign\n    (-123).sign\n    0.sign\n    (-0).sign\n  }\n\n  [\"abs\"] {\n    123.abs\n    (-123).abs\n    0.abs\n    (-0).abs\n  }\n\n  [\"ceil\"] {\n    123.ceil\n    (-123).ceil\n    0.ceil\n    (-0).ceil\n  }\n\n  [\"floor\"] {\n    123.floor\n    (-123).floor\n    0.floor\n    (-0).floor\n  }\n  \n  [\"toRadixString()\"] {\n    123.toRadixString(16)\n    123.toRadixString(2)\n    123.toRadixString(33)\n\n    (-123).toRadixString(16)\n    (-123).toRadixString(2)\n    (-123).toRadixString(33)\n    \n    0.toRadixString(16)\n    0.toRadixString(2)\n    0.toRadixString(33)\n    \n    (-0).toRadixString(16)\n    (-0).toRadixString(2)\n    (-0).toRadixString(33)\n    \n    module.catch(() -> (-123).toRadixString(-1))\n    module.catch(() -> (-123).toRadixString(64))\n  }\n\n  [\"round()\"] {\n    123.round()\n    (-123).round()\n    0.round()\n    (-0).round()\n  }\n\n  [\"truncate()\"] {\n    123.truncate()\n    (-123).truncate()\n    0.truncate()\n    (-0).truncate()\n  }\n\n  [\"toInt()\"] {\n    123.toInt()\n    (-123).toInt()\n    0.toInt()\n    (-0).toInt()\n  }\n\n  [\"toFloat()\"] {\n    123.toFloat()\n    (-123).toFloat()\n    0.toFloat()\n    (-0).toFloat()\n  }\n\n  [\"toString()\"] {\n    123.toString()\n    (-123).toString()\n    0.toString()\n    (-0).toString()\n  }\n\n  [\"toFixed()\"] {\n    123.toFixed(0)\n    (-123).toFixed(0)\n    0.toFixed(0)\n    (-0).toFixed(0)\n\n    123.toFixed(1)\n    (-123).toFixed(2)\n    0.toFixed(3)\n    (-0).toFixed(4)\n    \n    123456789.toFixed(1)\n    123456789.toFixed(2)\n    123456789.toFixed(3)\n    123456789.toFixed(4)\n\n    module.catch(() -> 123.toFixed(21))\n    module.catch(() -> (-123).toFixed(-1))\n  }\n\n  [\"shl()\"] {\n    123.shl(2)\n    (-123).shl(2)\n    0.shl(2)\n  }\n\n  [\"shr()\"] {\n    123.shr(2)\n    (-123).shr(2)\n    0.shr(2)\n  }\n\n  [\"ushr()\"] {\n    123.ushr(2)\n    (-123).ushr(2)\n    0.ushr(2)\n  }\n\n  [\"and()\"] {\n    123.and(456)\n    (-123).and(456)\n  }\n\n  [\"or()\"] {\n    123.or(456)\n    (-123).or(456)\n  }\n\n  [\"xor()\"] {\n    123.xor(456)\n    (-123).xor(456)\n  }\n\n  [\"inv\"] {\n    123.inv\n    (-123).inv\n  }\n\n  [\"toChar()\"] {\n    \"a\".codePoints.single.toChar()\n    \"😊\".codePoints.single.toChar()\n    module.catch(() -> (-1).toChar())\n    module.catch(() -> (0x110000).toChar())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/intseq.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:math\"\n\nlocal id = (it) -> it\n\nexamples {\n  [\"construction\"] {\n    IntSeq(-3, 2)\n    IntSeq(5, 5)\n    IntSeq(5, 0)\n    IntSeq(0, 0)\n    IntSeq(0, 10)\n    IntSeq(-10, 0)\n  }\n\n  [\"construction with step\"] {\n    IntSeq(-3, 2).step(2)\n    IntSeq(2, -3).step(-2)\n    IntSeq(2, -3).step(-5)\n    IntSeq(2, -3).step(-7)\n\n    IntSeq(0, 1).step(math.minInt)\n    IntSeq(math.maxInt, math.minInt).step(math.minInt)\n    IntSeq(math.minInt, math.maxInt).step(math.maxInt)\n\n    module.catch(() -> IntSeq(-3, 2).step(0))\n  }\n\n  [\"start\"] {\n    IntSeq(-3, 2).start\n    IntSeq(2, -3).start\n  }\n\n  [\"end\"] {\n    IntSeq(-3, 2).end\n    IntSeq(2, -3).end\n  }\n\n  [\"step\"] {\n    IntSeq(-3, 2).step\n    IntSeq(-3, 2).step(2).step\n    IntSeq(2, -3).step\n    IntSeq(2, -3).step(-2).step\n  }\n\n  [\"fold\"] {\n    IntSeq(-3, 2).fold(List(), (l, e) -> l.add(e))\n    IntSeq(5, 5).fold(List(), (l, e) -> l.add(e))\n    IntSeq(5, 0).fold(List(), (l, e) -> l.add(e))\n    IntSeq(0, 0).fold(List(), (l, e) -> l.add(e))\n    IntSeq(0, 10).fold(List(), (l, e) -> l.add(e))\n    IntSeq(-10, 0).fold(List(), (l, e) -> l.add(e))\n\n    IntSeq(-3, 2).step(2).fold(List(), (l, e) -> l.add(e))\n    IntSeq(2, -3).step(-2).fold(List(), (l, e) -> l.add(e))\n    IntSeq(2, -3).step(-5).fold(List(), (l, e) -> l.add(e))\n    IntSeq(2, -3).step(-7).fold(List(), (l, e) -> l.add(e))\n  }\n\n  [\"map\"] {\n    IntSeq(-3, 2).map(id)\n    IntSeq(5, 5).map(id)\n    IntSeq(5, 0).map(id)\n    IntSeq(0, 0).map(id)\n    IntSeq(0, 10).map(id)\n    IntSeq(-10, 0).map(id)\n\n    IntSeq(-3, 2).step(2).map(id)\n    IntSeq(2, -3).step(-2).map(id)\n    IntSeq(2, -3).step(-5).map(id)\n    IntSeq(2, -3).step(-7).map(id)\n\n    IntSeq(0, 1).step(math.minInt).map(id)\n    IntSeq(math.maxInt, math.minInt).step(math.minInt).map(id)\n    IntSeq(math.minInt, math.maxInt).step(math.maxInt).map(id)\n  }\n\n  [\"cannot instantiate\"] {\n    module.catch(() -> new IntSeq {})\n  }\n\n  [\"toList\"] {\n    IntSeq(0, 3).toList() == List(0, 1, 2, 3)\n    IntSeq(-3, 2).step(2).toList() == List(-3, -1, 1)\n    IntSeq(5, 1).step(-2).toList() == List(5, 3, 1)\n  }\n\n  [\"toListing\"] {\n    IntSeq(0, 3).toListing() == new Listing { 0; 1; 2; 3 }\n    IntSeq(-3, 2).step(2).toListing() == new Listing { -3; -1; 1 }\n    IntSeq(5, 1).step(-2).toListing() == new Listing { 5; 3; 1 }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser1.pkl",
    "content": "import \"pkl:json\"\nimport \"pkl:test\"\n\nlocal parser = new json.Parser {}\n\nres1 = parser.parse(\"null\")\nres2 = parser.parse(\"true\")\nres3 = parser.parse(\"false\")\n\nres4 = parser.parse(\"123\")\n\n// json doesn't support leading zero\nres5 = test.catch(() -> parser.parse(\"0123\"))\n\n// json doesn't support binary literals\nres6 = test.catch(() -> parser.parse(\"b1001\"))\n\n// json doesn't support hex literals\nres7 = test.catch(() -> parser.parse(\"0x1A3\"))\n\nres8 = parser.parse(\"123.456\")\nres9 = parser.parse(\"123.456e2\")\n\n// empty document does not seem to be valid json\nres10 = test.catch(() -> parser.parse(\"\"))\nres11 = test.catch(() -> parser.parse(\"   \"))\n\nres12 = parser.parse(#\"\"hello\"\"#)\nres13 = parser.parse(#\"\"hello\\nworld\"\"#)\n\nres14 = parser.parse(\"\"\"\n  [\"one\", \"two\", \"three\"]\n  \"\"\")\n\nres15 = parser.parse(\"\"\"\n  { \"name\": \"Pigeon\", \"age\": 42 }\n  \"\"\")\n\n// from: https://en.wikipedia.org/wiki/JSON#JSON_sample\nres16 = parser.parse(\"\"\"\n  {\n    \"firstName\": \"John\",\n    \"lastName\": \"Smith\",\n    \"age\": 25,\n    \"address\": {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    },\n    \"phoneNumber\": [\n      {\n        \"type\": \"home\",\n        \"number\": \"212 555-1234\"\n      },\n      {\n        \"type\": \"fax\",\n        \"number\": \"646 555-4567\"\n      }\n    ],\n    \"gender\": {\n      \"type\": \"male\"\n    }\n  }\n  \"\"\")\n\n// invalid syntax\nres17 = test.catch(() -> parser.parse(\"!@#$%\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser2.pkl",
    "content": "import \"pkl:json\"\nimport \"pkl:test\"\n\nlocal parser = new json.Parser {\n  converters {\n    [Boolean] = (it) -> !it\n    [String] = (it) -> it + \"x\"\n    [Int] = (it) -> it + 1\n    [Float] = (it) -> it + 1.23\n    [Dynamic] = (it) -> (it) { other = \"other\" }\n    [Listing] = (it) -> (it) { \"other\" }\n  }\n}\n\nres1 = parser.parse(\"null\")\nres2 = parser.parse(\"true\")\nres3 = parser.parse(\"false\")\n\nres4 = parser.parse(\"123\")\n\nres8 = parser.parse(\"123.456\")\nres9 = parser.parse(\"123.456e2\")\n\n// empty document\nres10 = test.catch(() -> parser.parse(\"\"))\nres11 = test.catch(() -> parser.parse(\"   \"))\n\nres12 = parser.parse(#\"\"hello\"\"#)\nres13 = parser.parse(#\"\"hello\\nworld\"\"#)\n\nres14 = parser.parse(\"\"\"\n  [\"one\", \"two\", \"three\"]\n  \"\"\")\n\nres15 = parser.parse(\"\"\"\n  { \"name\": \"Pigeon\", \"age\": 42 }\n  \"\"\")\n\n// from: https://en.wikipedia.org/wiki/JSON#JSON_sample\nres16 = parser.parse(\"\"\"\n  {\n    \"firstName\": \"John\",\n    \"lastName\": \"Smith\",\n    \"age\": 25,\n    \"address\": {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    },\n    \"phoneNumber\": [\n      {\n        \"type\": \"home\",\n        \"number\": \"212 555-1234\"\n      },\n      {\n        \"type\": \"fax\",\n        \"number\": \"646 555-4567\"\n      }\n    ],\n    \"gender\": {\n      \"type\": \"male\"\n    }\n  }\n  \"\"\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser3.pkl",
    "content": "import \"pkl:json\"\n\nlocal parser = new json.Parser {\n  converters {\n    [\"^firstName\"] = (_) -> \"changed\"\n    [\"^city\"] = (_) -> \"no match\"\n    [\"age\"] = (_) -> 42\n    [\"address.city\"] = (it) -> it.reverse()\n    [\"state\"] = (_) -> \"CA\"\n    [\"phoneNumber[*].type\"] = (_) -> \"mobile\"\n    [\"phoneNumber[*]\"] = (it) -> it.type\n    [\"gender.*\"] = (_) -> \"female\"\n  }\n}\n\n// from: https://en.wikipedia.org/wiki/JSON#JSON_sample\nres1 = parser.parse(\"\"\"\n  {\n    \"firstName\": \"John\",\n    \"lastName\": \"Smith\",\n    \"age\": 25,\n    \"address\": {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    },\n    \"phoneNumber\": [\n      {\n        \"type\": \"home\",\n        \"number\": \"212 555-1234\"\n      },\n      {\n        \"type\": \"fax\",\n        \"number\": \"646 555-4567\"\n      }\n    ],\n    \"gender\": {\n      \"type\": \"male\"\n    }\n  }\n  \"\"\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser4.pkl",
    "content": "import \"pkl:json\"\n\nlocal parser = new json.Parser {\n  useMapping = true\n}\nres1 = parser.parse(\"\"\"\n  [\"one\", \"two\", \"three\"]\n  \"\"\")\n\nres2 = parser.parse(\"\"\"\n  { \"name\": \"Pigeon\", \"age\": 42 }\n  \"\"\")\n\nres3 = parser.parse(\"\"\"\n  {\n    \"firstName\": \"John\",\n    \"lastName\": \"Smith\",\n    \"age\": 25,\n    \"address\": {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    },\n    \"phoneNumber\": [\n      {\n        \"type\": \"home\",\n        \"number\": \"212 555-1234\"\n      },\n      {\n        \"type\": \"fax\",\n        \"number\": \"646 555-4567\"\n      }\n    ],\n    \"gender\": {\n      \"type\": \"male\"\n    }\n  }\n  \"\"\")\n\nres4 = res3 is Mapping\n\nres5 = res3[\"address\"] is Mapping\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonParser5.pkl",
    "content": "import \"pkl:json\"\n\nlocal parser = new json.Parser {\n  useMapping = true\n  converters {\n    [\"^firstName\"] = (_) -> \"changed\"\n    [\"^city\"] = (_) -> \"no match\"\n    [\"age\"] = (_) -> 42\n    [\"address.city\"] = (it) -> it.reverse()\n    [\"state\"] = (_) -> \"CA\"\n    [\"phoneNumber[*].type\"] = (_) -> \"mobile\"\n    [\"phoneNumber[*]\"] = (it) -> it[\"type\"]\n    [\"gender.*\"] = (_) -> \"female\"\n  }\n}\n\n// from: https://en.wikipedia.org/wiki/JSON#JSON_sample\nres1 = parser.parse(\"\"\"\n  {\n    \"firstName\": \"John\",\n    \"lastName\": \"Smith\",\n    \"age\": 25,\n    \"address\": {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    },\n    \"phoneNumber\": [\n      {\n        \"type\": \"home\",\n        \"number\": \"212 555-1234\"\n      },\n      {\n        \"type\": \"fax\",\n        \"number\": \"646 555-4567\"\n      }\n    ],\n    \"gender\": {\n      \"type\": \"male\"\n    }\n  }\n  \"\"\")\n\nres2 = res1 is Mapping\n\nres3 = res1[\"address\"] is Mapping\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer1.json.pkl",
    "content": "pigeon {\n  name = \"pigeon\"\n  age = 30\n}\n\noutput {\n  value = pigeon\n  renderer = new JsonRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer2.json.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"one\", true, \"two\", 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\" }\nres15 = null\nres16 = Pair(1, 2)\nres17 = IntSeq(1, 4)\n\noutput {\n  renderer = new JsonRenderer {\n    indent = \"    \"\n    converters {\n      [String] = (it) -> it.reverse()\n      [Boolean] = (it) -> !it\n      [Int] = (it) -> it + 1\n      [Float] = (it) -> it + 1.1\n      [Duration] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [DataSize] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [List] = (it) -> it.reverse()\n      [Set] = (it) -> it + List(4)\n      [Map] = (it) -> it + Map(\"three\", 3.s)\n      [Listing] = (it) -> (it) { 4 }\n      [Mapping] = (it) -> (it) { [\"three\"] = 3.s }\n      [Dynamic] = (it) -> (it) { other = \"other\" }\n      [Person] = (it) -> (it) { age = 40 } // fill in missing property\n      [Null] = (_) -> \"String\"\n      [Pair] = (it) -> List(it.first, it.second)\n      [IntSeq] = (it) -> List(it.start, it.end, it.step)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer2b.pkl",
    "content": "local renderer = new JsonRenderer {\n  converters {\n    [\"^apple\"] = (it) -> it.toUpperCase()\n    [\"^[*].apple\"] = (it) -> it.toUpperCase()\n    [\"^[apple]\"] = (it) -> it.toUpperCase()\n  }\n}\n\nlocal properties = renderer.renderDocument(\n  new Dynamic {\n    apple = \"yes\"\n    banana {\n      apple = \"no\"\n    }\n  })\n\nres1 = properties.contains(\"YES\")\nres2 = properties.contains(\"no\")\nres3 = !properties.contains(\"yes\")\nres4 = !properties.contains(\"NO\")\n\nlocal elements = renderer.renderDocument(\n  new Dynamic {\n    new {\n      apple = \"yes\"\n    }\n    new {\n      new {\n        apple = \"no\"\n      }\n    }\n  })\n\nres5 = elements.contains(\"YES\")\nres6 = elements.contains(\"no\")\nres7 = !elements.contains(\"yes\")\nres8 = !elements.contains(\"NO\")\n\nlocal entries = renderer.renderValue(\n  new Dynamic {\n    [\"apple\"] = \"yes\"\n    [\"banana\"] {\n      [\"apple\"] = \"no\"\n    }\n  })\n\nres9 = entries.contains(\"YES\")\nres10 = entries.contains(\"no\")\nres11 = !entries.contains(\"yes\")\nres12 = !entries.contains(\"NO\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer3.json.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"string\", true, 42, 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\"; age = 30 }\nres15 = null\nres16 = Pair(1, 2)\nres17 = IntSeq(1, 4)\n\noutput {\n  renderer = new JsonRenderer {\n    converters {\n      [String] = (_) -> \"converted\"\n      [Boolean] = (_) -> \"converted\"\n      [Int] = (_) -> \"converted\"\n      [Float] = (_) -> \"converted\"\n      [Duration] = (_) -> \"converted\"\n      [DataSize] = (_) -> \"converted\"\n      [List] = (_) -> \"converted\"\n      [Set] = (_) -> \"converted\"\n      [Map] = (_) ->\"converted\"\n      [Listing] = (_) ->\"converted\"\n      [Mapping] = (_) ->\"converted\"\n      [Dynamic] = (_) ->\"converted\"\n      [Person] = (_) -> \"converted\"\n      [Null] = (_) -> \"converted\"\n      [Pair] = (_) -> \"converted\"\n      [IntSeq] = (_) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer4.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new JsonRenderer {}\n\nres1 = renderer.renderValue(123)\nres2 = renderer.renderValue(1.23)\nres3 = renderer.renderValue(false)\nres4 = renderer.renderValue(\"pigeon\")\nres6 = renderer.renderValue(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderValue(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderValue(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderValue(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderValue(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderValue(new Person { name = \"pigeon\"; age = 42 })\nres13 = renderer.renderValue(null)\n\nres14 = test.catch(() -> renderer.renderValue(1.min))\nres15 = test.catch(() -> renderer.renderValue(Pair(1, 2)))\nres16 = test.catch(() -> renderer.renderValue(1.mb))\nres17 = test.catch(() -> renderer.renderValue(Person))\nres18 = test.catch(() -> renderer.renderValue(Email))\nres19 = test.catch(() -> renderer.renderValue((x) -> x))\nres20 = test.catch(() -> new JsonRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\nres21 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer5.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new JsonRenderer {}\n\nres1 = renderer.renderDocument(123)\nres2 = renderer.renderDocument(1.23)\nres3 = renderer.renderDocument(false)\nres4 = renderer.renderDocument(\"pigeon\")\nres6 = renderer.renderDocument(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderDocument(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderDocument(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderDocument(new Person { name = \"pigeon\"; age = 42 })\nres13 = renderer.renderDocument(null)\n\nres14 = test.catch(() -> renderer.renderDocument(1.min))\nres15 = test.catch(() -> renderer.renderDocument(Pair(1, 2)))\nres16 = test.catch(() -> renderer.renderDocument(1.mb))\nres17 = test.catch(() -> renderer.renderDocument(Person))\nres18 = test.catch(() -> renderer.renderDocument(Email))\nres19 = test.catch(() -> renderer.renderDocument((x) -> x))\nres20 = test.catch(() -> new JsonRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderDocument(42))\nres21 = test.catch(() -> renderer.renderDocument(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer6.json.pkl",
    "content": "name = \"pigeon\"\nage = 42\nfriends = new Listing {\n  \"barn owl\"\n  \"parrot\"\n}\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\n\noutput {\n  renderer = new JsonRenderer {\n    converters {\n      [\"name\"] = (it) -> it.reverse()\n      [\"friends[*]\"] = (it) -> it + \"x\"\n      [\"hobbies[*]\"] = (it) -> it.skill\n      [\"address.street\"] = (it) -> \"Other St.\"\n      [\"address.*\"] = (it) -> \"changed\"\n      [\"unmatched\"] = (it) -> \"unmatched\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer7.pkl",
    "content": "res1 = null\nres2 = 1\nres3 = \"Hello\"\nres4 {\n  foo = 1\n  bar = null\n}\n\noutput {\n  renderer = new JsonRenderer {\n    omitNullProperties = true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer8.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nm = new Mixin {}\n\noutput {\n  renderer = new JsonRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRenderer9.json5.pkl",
    "content": "import \"pkl:json\"\n\nimport \".../input-helper/api/annotationConverter.pkl\"\n\n@json.Property { name = \"FOO\" }\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new JsonRenderer {\n    convertPropertyTransformers {\n      // NB: this renders https://json5.org format which is a superset of JSON that supports commas. \n      [annotationConverter.LineComment] { prefix = \", // \" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonRendererEmptyComposites.pkl",
    "content": "a1 = List()\na2 = Set()\na3 = new Listing {}\n\nb1 = Map()\nb2 = new Mapping {}\nb3 = new Dynamic {}\n\nnested {\n  a1 = List()\n  a2 = Set()\n  a3 = new Listing {}\n\n  b1 = Map()\n  b2 = new Mapping {}\n  b3 = new Dynamic {}\n}\n\noutput {\n  renderer = new JsonRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer1.jsonnet.pkl",
    "content": "import \"pkl:jsonnet\"\n\nint = 123\n\nfloat = 1.23\n\nbool = true\n\nstring = \"Pigeon\"\n\nunicodeString = \"abc😀abc😎abc\"\n\nmultiLineString = \"\"\"\n  have a\n  great\n  day\n  \"\"\"\n\nclass Person {\n  name: String\n  age: Int\n  address: Address\n}\n\nclass Address {\n  street: String\n}\n\ntypedObject = new Person {\n  name = \"Bob\"\n  age = 42\n  address {\n    street = \"Abby Rd.\"\n  }\n}\n\ndynamicObject {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  friend = null\n}\n\nannoyingNames {\n  [\"5hello\"] = 123\n  [\"local\"] = \"remote\"\n  [\"foo.bar\"] = \"baz\"\n  [\"single'quote\"] = \"double\\\"quote\"\n}\n\nlist = new {\n  1\n  2\n  3\n  null\n}\n\nsomeExternalVariable = jsonnet.ExtVar(\"MY_VARIABLE\")\n\nsomeImportStr = jsonnet.ImportStr(\"my/private/key.pem\")\n\noutput {\n  renderer = new jsonnet.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer2.jsonnet.pkl",
    "content": "import \"pkl:jsonnet\"\n\nhello {\n  world {\n    1\n    \"foo\\nbar\"\n  }\n}\n\nemptyArray = List()\nemptyObject {}\n\noutput {\n  renderer = new jsonnet.Renderer {\n    indent = \"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer3.jsonnet.pkl",
    "content": "import \"pkl:jsonnet\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"string\", true, 42, 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\"; age = 30 }\nres15 = null\nres16 = Pair(1, 2)\nres17 = IntSeq(1, 4)\n\noutput {\n  renderer = new jsonnet.Renderer {\n    converters {\n      [String] = (it) -> \"converted\"\n      [Boolean] = (it) -> \"converted\"\n      [Int] = (it) -> \"converted\"\n      [Float] = (it) -> \"converted\"\n      [Duration] = (it) -> \"converted\"\n      [DataSize] = (it) -> \"converted\"\n      [List] = (it) -> \"converted\"\n      [Set] = (it) -> \"converted\"\n      [Map] = (it) ->\"converted\"\n      [Listing] = (it) ->\"converted\"\n      [Mapping] = (it) ->\"converted\"\n      [Dynamic] = (it) ->\"converted\"\n      [Person] = (it) -> \"converted\"\n      [Null] = (it) -> \"converted\"\n      [Pair] = (it) -> \"converted\"\n      [IntSeq] = (it) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer4.pkl",
    "content": "import \"pkl:test\"\nimport \"pkl:jsonnet\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new jsonnet.Renderer {}\n\nres1 = renderer.renderValue(123)\nres2 = renderer.renderValue(1.23)\nres3 = renderer.renderValue(false)\nres4 = renderer.renderValue(\"pigeon\")\nres6 = renderer.renderValue(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderValue(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderValue(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderValue(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderValue(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderValue(new Person { name = \"pigeon\"; age = 42 })\nres13 = renderer.renderValue(null)\n\nres14 = test.catch(() -> renderer.renderValue(Pair(1, 2)))\nres15 = test.catch(() -> renderer.renderValue(1.min))\nres16 = test.catch(() -> renderer.renderValue(1.mb))\nres17 = test.catch(() -> renderer.renderValue(Person))\nres18 = test.catch(() -> renderer.renderValue(Email))\nres19 = test.catch(() -> renderer.renderValue((x) -> x))\nres20 = test.catch(() -> new JsonRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\nres21 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer5.pkl",
    "content": "import \"pkl:test\"\nimport \"pkl:jsonnet\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new jsonnet.Renderer {}\n\nres1 = renderer.renderDocument(123)\nres2 = renderer.renderDocument(1.23)\nres3 = renderer.renderDocument(false)\nres4 = renderer.renderDocument(\"pigeon\")\nres6 = renderer.renderDocument(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderDocument(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderDocument(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderDocument(new Person { name = \"pigeon\"; age = 42 })\nres13 = renderer.renderDocument(null)\n\nres14 = test.catch(() -> renderer.renderDocument(Pair(1, 2)))\nres15 = test.catch(() -> renderer.renderDocument(1.min))\nres16 = test.catch(() -> renderer.renderDocument(1.mb))\nres17 = test.catch(() -> renderer.renderDocument(Person))\nres18 = test.catch(() -> renderer.renderDocument(Email))\nres19 = test.catch(() -> renderer.renderDocument((x) -> x))\nres20 = test.catch(() -> new JsonRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderDocument(42))\nres21 = test.catch(() -> renderer.renderDocument(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer6.jsonnet.pkl",
    "content": "import \"pkl:jsonnet\"\n\nname = \"pigeon\"\nage = 42\nfriends = new Listing {\n  \"barn owl\"\n  \"parrot\"\n}\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\n\noutput {\n  renderer = new jsonnet.Renderer {\n    converters {\n      [\"name\"] = (it) -> it.reverse()\n      [\"friends[*]\"] = (it) -> it + \"x\"\n      [\"hobbies[*]\"] = (it) -> it.skill\n      [\"address.street\"] = (it) -> \"Other St.\"\n      [\"address.*\"] = (it) -> \"changed\"\n      [\"unmatched\"] = (it) -> \"unmatched\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer7.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nimport \"pkl:jsonnet\"\n\nm = new Mixin {}\n\noutput {\n  renderer = new jsonnet.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/jsonnetRenderer8.jsonnet.pkl",
    "content": "import \"pkl:jsonnet\"\n\nimport \".../input-helper/api/annotationConverter.pkl\"\n\n@jsonnet.Property { name = \"FOO\" }\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new jsonnet.Renderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \", // \" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/list.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal list1 = List(1, 2, 3)\nlocal list2 = List(1, 2, 3, 4, 5)\nlocal list3 = List(1, 2, 3, 2, 1)\nlocal comparator = (x, y) -> x < y\nlocal comparator1 = (x, y) -> x <= y\n\nfacts {\n  [\"isEmpty\"] {\n    List().isEmpty\n    !list1.isEmpty\n  }\n\n  [\"isNotEmpty\"] {\n    !List().isNotEmpty\n    list1.isNotEmpty\n  }\n\n  [\"every()\"] {\n    list1.every((x) -> x <= 3)\n    !list1.every((x) -> x > 2)\n  }\n\n  [\"any()\"] {\n    list1.any((x) -> x > 2)\n    !list1.any((x) -> x > 3)\n  }\n\n  [\"contains()\"] {\n    list1.contains(2)\n    !list1.contains(4)\n  }\n\n  [\"startsWith()\"] {\n    list1.startsWith(List())\n    list1.startsWith(List(1, 2))\n    !list1.startsWith(List(1, 3))\n  }\n\n  [\"endsWith()\"] {\n    list1.endsWith(List())\n    list1.endsWith(List(2, 3))\n    !list1.endsWith(List(1, 3))\n  }\n\n  [\"isDistinct\"] {\n    list1.isDistinct\n    List(1, \"1\").isDistinct\n    List().isDistinct\n    !List(1, 2, 1).isDistinct\n    !List(\"Pigeon\", \"Barn Owl\", \"Pigeon\", \"Parrot\").isDistinct\n  }\n\n  [\"isDistinctBy()\"] {\n    list1.isDistinctBy((it) -> it)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").isDistinctBy((it) -> it.reverse())\n    List().isDistinctBy((it) -> 42)\n    !list1.isDistinctBy((it) -> it.isOdd)\n    !list1.isDistinctBy((it) -> 42)\n  }\n}\n\nexamples {\n  [\"every\"] {\n    module.catch(() -> list1.every((x) -> \"wrong type\"))\n  }\n\n  [\"any\"] {\n    module.catch(() -> list1.any((x) -> \"wrong type\"))\n  }\n\n  [\"length\"] {\n    list1.length\n  }\n\n  [\"filter()\"] {\n    list1.filter((x) -> x > 1)\n    list1.filter((x) -> x > 3)\n    module.catch(() -> list1. filter((x) -> \"wrong type\"))\n  }\n\n  [\"map()\"] {\n    list1.map((x) -> x * 2)\n    list1.map((x) -> List(x, x))\n  }\n\n  [\"flatMap()\"] {\n    list1.flatMap((x) -> List(x, x + 1))\n    module.catch(() -> list1.flatMap((x) -> \"wrong type\"))\n  }\n\n  [\"flatten()\"] {\n    List(List(1, 2), List(2, 3), List(4, 5)).flatten()\n    List(Set(1, 2), Set(2, 3), Set(4, 5)).flatten()\n    List(new Listing { 1; 2 }, new Listing { 2; 3 }, new Listing { 4; 5 }).flatten()\n    List(List(1, 2), Set(2, 3), new Listing { 4; 5 }).flatten()\n    List(List(), Set(), new Listing {}).flatten()\n  }\n\n  [\"first\"] {\n    list1.first\n  }\n\n  [\"rest\"] {\n    list1.rest\n  }\n\n  [\"last\"] {\n    list1.last\n  }\n\n  [\"single\"] {\n    List(1).single\n  }\n\n  [\"count()\"] {\n    list1.count((x) -> x >= 2)\n    list1.count((x) -> true)\n    list1.count((x) -> false)\n    module.catch(() -> list1.count((x) -> \"wrong type\"))\n  }\n\n  [\"find()\"] {\n    list1.find((x) -> x >= 2)\n    list1.find((x) -> true)\n    module.catch(() -> list1.find((x) -> \"wrong type\"))\n  }\n\n  [\"findLast()\"] {\n    list1.findLast((x) -> x >= 2)\n    list1.findLast((x) -> true)\n    module.catch(() -> list1.findLast((x) -> \"wrong type\"))\n  }\n\n  [\"indexOf()\"] {\n    list1.indexOf(2)\n    List(1,2,3,2,1).indexOf(2)\n  }\n\n  [\"lastIndexOf()\"] {\n    list1.lastIndexOf(2)\n    List(1,2,3,2,1).lastIndexOf(2)\n  }\n\n  [\"findIndex()\"] {\n    list1.findIndex((x) -> x >= 2)\n    List(1,2,3,2,1).findIndex((x) -> x >= 2)\n    module.catch(() -> list1.findIndex((x) -> \"wrong type\"))\n  }\n\n  [\"findLastIndex()\"] {\n    list1.findLastIndex((x) -> x >= 2)\n    List(1,2,3,2,1).findLastIndex((x) -> x >= 2)\n    module.catch(() -> list1.findLastIndex((x) -> \"wrong type\"))\n  }\n\n  [\"take()\"] {\n    list1.take(0)\n    list1.take(2)\n    list1.take(4)\n  }\n\n  [\"takeWhile()\"] {\n    list1.takeWhile((x) -> true)\n    list1.takeWhile((x) -> false)\n    list1.takeWhile((x) -> x < 3)\n    module.catch(() -> list1.takeWhile((x) -> \"wrong type\"))\n  }\n\n  [\"takeLast()\"] {\n    list1.takeLast(0)\n    list1.takeLast(2)\n    list1.takeLast(4)\n  }\n\n  [\"takeLastWhile()\"] {\n    list1.takeLastWhile((x) -> true)\n    list1.takeLastWhile((x) -> false)\n    list1.takeLastWhile((x) -> x > 1)\n    module.catch(() -> list1.takeLastWhile((x) -> \"wrong type\"))\n  }\n\n  [\"drop()\"] {\n    list1.drop(0)\n    list1.drop(2)\n    list1.drop(4)\n  }\n\n  [\"dropWhile()\"] {\n    list1.dropWhile((x) -> true)\n    list1.dropWhile((x) -> false)\n    list1.dropWhile((x) -> x < 3)\n    module.catch(() -> list1.dropWhile((x) -> \"wrong type\"))\n  }\n\n  [\"dropLast()\"] {\n    list1.dropLast(0)\n    list1.dropLast(2)\n    list1.dropLast(4)\n  }\n\n  [\"dropLastWhile()\"] {\n    list1.dropLastWhile((x) -> true)\n    list1.dropLastWhile((x) -> false)\n    list1.dropLastWhile((x) -> x > 1)\n    module.catch(() -> list1.dropLastWhile((x) -> \"wrong type\"))\n  }\n\n  [\"fold()\"] {\n    list1.fold(0, (acc, x) -> acc + x)\n    list1.fold(List(), (acc, x) -> acc.add(x))\n    List(1).fold(0, (acc, x) -> acc + x)\n    List().fold(0, (acc, x) -> acc + x)\n  }\n\n  [\"foldBack()\"] {\n    list1.foldBack(0, (x, acc) -> x + acc)\n    list1.foldBack(List(), (x, acc) -> acc.add(x))\n    List(1).foldBack(0, (x, acc) -> x + acc)\n    List().foldBack(0, (x, acc) -> x + acc)\n  }\n\n  [\"reduce()\"] {\n    list1.reduce((x, y) -> x + y)\n    List(1).reduce((x, y) -> x + y)\n    module.catch(() -> List().reduce((x, y) -> x + y))\n  }\n\n  [\"groupBy()\"] {\n    list2.groupBy((x) -> x)\n    list3.groupBy((x) -> x)\n    list2.groupBy((x) -> x.isOdd)\n    list3.groupBy((x) -> true)\n    List().groupBy((x) -> x)\n  }\n\n  [\"repeat()\"] {\n    list1.repeat(0)\n    list1.repeat(1)\n    list1.repeat(5)\n    List().repeat(0)\n    List().repeat(1)\n    List().repeat(5)\n    module.catch(() -> list1.repeat(-1))\n    List(0).repeat(118866785).length // triggers an overflow wraparound in original paguro impl\n  }\n\n  [\"sortWith()\"] {\n    List().sortWith(comparator)\n    List(3, 1, 1, 2, 1).sortWith(comparator)\n    List(3, 1, 2, 5, 4).sortWith(comparator)\n    List(0, 0, 1, 2, 3, 3, 4, 5, 4, 1).sortWith(comparator1)\n  }\n\n  [\"replaceRange()\"] {\n    list2.replaceRange(1, 4, List(9, 8))\n    list2.replaceRange(1, 4, List(9))\n    list2.replaceRange(1, 4, List())\n    list2.replaceRange(1, 1, List(9, 8))\n    list2.replaceRange(1, 1, List(9))\n    list2.replaceRange(1, 1, List())\n    module.catch(() -> list2.replaceRange(-1, 2, List(1)))\n    module.catch(() -> list2.replaceRange(3, 6, List(1)))\n  }\n\n  [\"toList()\"] {\n    list1.toList()\n    list2.toList()\n    list3.toList()\n  }\n\n  [\"toSet()\"] {\n    list1.toSet()\n    list2.toSet()\n    list3.toSet()\n    List(\n      new Dynamic { a = 1 },\n      new Dynamic { b = 2 },\n      new Dynamic { a = 1 }\n    ).toSet()\n  }\n\n  [\"toMap()\"] {\n    list1.toMap((x) -> x, (x) -> 2 * x)\n    local persons = List(\n      new Dynamic { name = \"Pigeon\"; age = 40 },\n      new Dynamic { name = \"Parrot\"; age = 30 }\n    )\n    persons.toMap((p) -> p.name, (p) -> p)\n  }\n\n  [\"lastIndex\"] {\n    list1.lastIndex\n    List().lastIndex\n  }\n\n  [\"add()\"] {\n    List().add(42)\n    list1.add(42)\n  }\n\n  [\"replace()\"] {\n    list1.replace(0, 42)\n    list1.replace(1, 42)\n    list1.replace(2, 42)\n    module.catch(() -> list1.replace(-1, 42))\n    module.catch(() -> list1.replace(3, 42))\n    module.catch(() -> List().replace(0, 42))\n  }\n\n  [\"minWith()\"] {\n    list1.minWith(comparator)\n    List(1).minWith(comparator)\n    module.catch(() -> List().minWith(comparator))\n  }\n\n  [\"maxWith()\"] {\n    list1.maxWith(comparator)\n    List(1).maxWith(comparator)\n    module.catch(() -> List().maxWith(comparator))\n  }\n\n  [\"zip()\"] {\n    List(1, 2, 3).zip(List(4, 5, 6))\n    List(1, 2, 3).zip(List(4, 5, 6, 7, 8))\n  }\n\n  [\"filterIndexed()\"] {\n    List(1, 2, 3).filterIndexed((i, n) -> i.isOdd)\n    List(1, 2, 3).filterIndexed((i, n) -> i.isEven)\n    List(1, 2, 3).filterIndexed((i, n) -> i.isOdd && n > 2)\n    List(1, 2, 3).filterIndexed((i, n) -> i.isEven && n > 2)\n  }\n\n  [\"mapIndexed()\"] {\n    List(1, 2, 3).mapIndexed((i, n) -> n * i)\n    List(1, 2, 3).mapIndexed((i, n) -> i.isOdd && n.isEven)\n  }\n\n  [\"mapNonNullIndexed()\"] {\n    List(1, 2, 3, 4).mapNonNullIndexed((i, n) -> if (n.isOdd) null else n * i)\n    List(1, 2, 3, 4, null).mapNonNullIndexed((i, n) -> if (n?.isOdd ?? true) null else n * i)\n  }\n\n  [\"flatMapIndexed()\"] {\n    List(1, 2, 3).flatMapIndexed((i, n) -> List(n * i))\n    List(1, 2, 3).flatMapIndexed((i, n) -> List(i.isOdd && n.isEven))\n  }\n\n  [\"foldIndexed()\"] {\n    list1.foldIndexed(0, (idx, x, y) -> idx + x + y)\n    List(1).foldIndexed(0, (idx, x, y) -> idx + x + y)\n    List().foldIndexed(0, (idx, x, y) -> idx + x + y)\n  }\n\n  [\"toListing()\"] {\n    list1.toListing()\n    List().toListing()\n  }\n\n  [\"toDynamic()\"] {\n    list1.toDynamic()\n    List().toDynamic()\n  }\n  \n  [\"toBytes()\"] {\n    list1.toBytes()\n    List().toBytes()\n    module.catch(() -> List(null).toBytes())\n    module.catch(() -> List(-1).toBytes())\n  }\n\n  [\"filterNonNull()\"] {\n    list1.filterNonNull()\n    List().filterNonNull()\n    List(1, null, 2, null, 3).filterNonNull()\n    List(null, null, null).filterNonNull()\n  }\n\n  [\"mapNonNull()\"] {\n    list1.mapNonNull((it) -> it)\n    list1.mapNonNull((it) -> null)\n    List().mapNonNull((it) -> it)\n    List(1, null, 2, null, 3).mapNonNull((it) -> it)\n  }\n\n  [\"filterIsInstance()\"] {\n    list1.filterIsInstance(Any)\n    list1.filterIsInstance(Int)\n    list1.filterIsInstance(Number)\n    list1.filterIsInstance(Float)\n    list1.filterIsInstance(String)\n    List(1, \"2\", 3.0, \"4\").filterIsInstance(String)\n    List().filterIsInstance(String)\n  }\n\n  [\"distinct\"] {\n    list1.distinct\n    List(1, 2, 1).distinct\n    List(\"Pigeon\", \"Barn Owl\", \"Pigeon\", \"Parrot\").distinct\n    List(1, \"1\").distinct\n    List().distinct\n  }\n\n  [\"distinctBy()\"] {\n    list1.distinctBy((it) -> it)\n    list1.distinctBy((it) -> it.isOdd)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").distinctBy((it) -> it.reverse())\n    list1.distinctBy((it) -> 42)\n    List().distinctBy((it) -> 42)\n  }\n\n  [\"split()\"] {\n    list1.split(0)\n    list1.split(1)\n    list1.split(2)\n    list1.split(3)\n    List().split(0)\n    module.catch(() -> list1.split(-1))\n    module.catch(() -> list1.split(4))\n  }\n\n  [\"partition()\"] {\n    list1.partition((it) -> it.isEven)\n    list1.partition((it) -> it.isOdd)\n    list1.partition((it) -> true)\n    list1.partition((it) -> false)\n    List().partition((it) -> throw(\"unreachable\"))\n  }\n\n  [\"min\"] {\n    list1.min\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").min\n    List(3.9, -8.4, 42, -99999).min\n    List(42, 42, 42).min\n    List(42, 42.0).min\n    List(42.0, 42).min\n    List(11.gb, 100.mb, 12.tb).min\n    List(11.s, 100.ms, 3.d).min\n    module.catch(() -> List().min)\n    module.catch(() -> List(1, \"Pigeon\", 3.d).min)\n  }\n\n  [\"max\"] {\n    list1.max\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").max\n    List(3.9, -8.4, 42, -99999).max\n    List(42, 42, 42).max\n    List(42, 42.0).max\n    List(42.0, 42).max\n    List(11.gb, 100.mb, 12.tb).max\n    List(11.s, 100.ms, 3.d).max\n    module.catch(() -> List().max)\n     module.catch(() -> List(1, \"Pigeon\", 3.d).max)\n  }\n\n  [\"minBy()\"] {\n    list1.minBy((it) -> it)\n    list1.minBy((it) -> -it)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").minBy((it) -> it.length)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").minBy((it) -> it.reverse())\n    List(11.gb, 100.mb, 12.tb).minBy((it) -> it.value)\n    List(11.gb, 100.mb, 12.tb).minBy((it) -> it)\n    List(11.s, 100.ms, 12.min).minBy((it) -> it.value)\n    List(11.s, 100.ms, 12.min).minBy((it) -> it)\n    module.catch(() -> List().minBy((it) -> it))\n    module.catch(() -> List(1, \"Pigeon\", 3.d).minBy((it) -> it))\n  }\n\n  [\"maxBy()\"] {\n    list1.maxBy((it) -> it)\n    list1.maxBy((it) -> -it)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxBy((it) -> it.length)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxBy((it) -> it.reverse())\n    List(11.gb, 100.mb, 12.tb).maxBy((it) -> it.value)\n    List(11.gb, 100.mb, 12.tb).maxBy((it) -> it)\n    List(11.s, 100.ms, 12.min).maxBy((it) -> it.value)\n    List(11.s, 100.ms, 12.min).maxBy((it) -> it)\n    module.catch(() -> List().maxBy((it) -> it))\n    module.catch(() -> List(1, \"Pigeon\", 3.d).maxBy((it) -> it))\n  }\n\n  [\"sort()\"] {\n    list1.sort()\n    List(3.9, -8.4, 42, -99999).sort()\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").sort()\n    List(11.gb, 100.mb, 12.tb).sort()\n    List(11.s, 100.ms, 3.d).sort()\n    List().sort()\n    module.catch(() -> List(1, \"Pigeon\", 3.d).sort())\n  }\n\n  [\"sortBy()\"] {\n    list1.sortBy((it) -> it)\n    list1.sortBy((it) -> -it)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").sortBy((it) -> it.length)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").sortBy((it) -> it.reverse())\n    List(11.gb, 100.mb, 12.tb).sortBy((it) -> it.value)\n    List(11.gb, 100.mb, 12.tb).sortBy((it) -> it)\n    List().sortBy((it) -> throw(\"unreachable\"))\n    List(0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10).sortBy((it) -> 42)\n  }\n\n  [\"reverse()\"] {\n    list1.reverse()\n    list1.reverse().reverse()\n    List(1, \"Pigeon\", 3.d).reverse()\n    List().reverse()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/listNullable.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal list1 = List(1, 2, 3)\n\nexamples {\n  [\"getOrNull()\"] {\n    list1.getOrNull(1)\n    list1.getOrNull(3)\n    list1.getOrNull(-1)\n  }\n\n  [\"sublistOrNull()\"] {\n    list1.sublistOrNull(1, 3)\n    list1.sublistOrNull(2, 4)\n  }\n\n  [\"firstOrNull\"] {\n    list1.firstOrNull\n    List().firstOrNull\n  }\n\n  [\"restOrNull\"] {\n    list1.restOrNull\n    List().restOrNull\n  }\n\n  [\"lastOrNull\"] {\n    list1.lastOrNull\n    List().lastOrNull\n  }\n\n  [\"singleOrNull\"] {\n    List(1).singleOrNull\n    list1.singleOrNull\n    List().singleOrNull\n  }\n\n  [\"findOrNull()\"] {\n    list1.findOrNull((x) -> x >= 2)\n    list1.findOrNull((x) -> false)\n    module.catch(() -> list1.findOrNull((x) -> \"wrong type\"))\n  }\n\n  [\"findLastOrNull()\"] {\n    list1.findLastOrNull((x) -> x >= 2)\n    list1.findLastOrNull((x) -> false)\n    module.catch(() -> list1.findLastOrNull((x) -> \"wrong type\"))\n  }\n\n  [\"indexOfOrNull()\"] {\n    list1.indexOfOrNull(2)\n    list1.indexOfOrNull(4)\n  }\n\n  [\"lastIndexOfOrNull()\"] {\n    list1.lastIndexOfOrNull(2)\n    list1.lastIndexOfOrNull(4)\n  }\n\n  [\"findIndexOrNull()\"] {\n    list1.findIndexOrNull((x) -> x >= 2)\n    list1.findIndexOrNull((x) -> false)\n    module.catch(() -> list1.findIndexOrNull((x) -> \"wrong type\"))\n  }\n\n  [\"findLastIndexOrNull()\"] {\n    list1.findLastIndexOrNull((x) -> x >= 2)\n    list1.findLastIndexOrNull((x) -> false)\n    module.catch(() -> list1.findLastIndexOrNull((x) -> \"wrong type\"))\n  }\n\n  [\"reduceOrNull()\"] {\n    list1.reduceOrNull((x, y) -> x + y)\n    List(1).reduceOrNull((x, y) -> x + y)\n    List().reduceOrNull((x, y) -> x + y)\n  }\n\n  [\"replaceRangeOrNull()\"] {\n    local list2 = List(1, 2, 3, 4, 5)\n    list2.replaceRangeOrNull(1, 4, List(9, 8))\n    list2.replaceRangeOrNull(1, 4, List(9))\n    list2.replaceRangeOrNull(1, 4, List())\n    list2.replaceRangeOrNull(1, 1, List(9, 8))\n    list2.replaceRangeOrNull(1, 1, List(9))\n    list2.replaceRangeOrNull(1, 1, List())\n    list2.replaceRangeOrNull(-1, 2, List(1))\n    list2.replaceRangeOrNull(3, 6, List(1))\n  }\n\n  [\"replaceOrNull()\"] {\n    list1.replaceOrNull(0, 42)\n    list1.replaceOrNull(1, 42)\n    list1.replaceOrNull(2, 42)\n\n    list1.replaceOrNull(-1, 42)\n    list1.replaceOrNull(3, 42)\n    List().replaceOrNull(0, 42)\n  }\n\n  [\"minWithOrNull()\"] {\n    local comparator = (x, y) -> x < y\n\n    list1.minWithOrNull(comparator)\n    List(1).minWithOrNull(comparator)\n    List().minWithOrNull(comparator)\n\n    list1.maxWithOrNull(comparator)\n    List(1).maxWithOrNull(comparator)\n    List().maxWithOrNull(comparator)\n  }\n\n  [\"splitOrNull()\"] {\n    list1.splitOrNull(0)\n    list1.splitOrNull(1)\n    list1.splitOrNull(2)\n    list1.splitOrNull(3)\n    List().split(0)\n    list1.splitOrNull(-1)\n    list1.splitOrNull(4)\n  }\n\n  [\"minOrNull\"] {\n    list1.minOrNull\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").minOrNull\n    List(3.9, -8.4, 42, -99999).minOrNull\n    List(42, 42, 42).minOrNull\n    List(42, 42.0).minOrNull\n    List(42.0, 42).minOrNull\n    List(11.gb, 100.mb, 12.tb).minOrNull\n    List(11.s, 100.ms, 3.d).minOrNull\n    List().minOrNull\n    module.catch(() -> List(1, \"Pigeon\", 3.d).minOrNull)\n  }\n\n  [\"maxOrNull\"] {\n    list1.maxOrNull\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxOrNull\n    List(3.9, -8.4, 42, -99999).maxOrNull\n    List(42, 42, 42).maxOrNull\n    List(42, 42.0).maxOrNull\n    List(42.0, 42).maxOrNull\n    List(11.gb, 100.mb, 12.tb).maxOrNull\n    List(11.s, 100.ms, 3.d).maxOrNull\n    List().maxOrNull\n    module.catch(() -> List(1, \"Pigeon\", 3.d).maxOrNull)\n  }\n\n  [\"minByOrNull()\"] {\n    list1.minByOrNull((it) -> it)\n    list1.minByOrNull((it) -> -it)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").minByOrNull((it) -> it.length)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").minByOrNull((it) -> it.reverse())\n    List(11.gb, 100.mb, 12.tb).minByOrNull((it) -> it.value)\n    List(11.gb, 100.mb, 12.tb).minByOrNull((it) -> it)\n    List(11.s, 100.ms, 12.min).minByOrNull((it) -> it.value)\n    List(11.s, 100.ms, 12.min).minByOrNull((it) -> it)\n    List().minByOrNull((it) -> it)\n    module.catch(() -> List(1, \"Pigeon\", 3.d).minByOrNull((it) -> it))\n  }\n\n  [\"maxByOrNull()\"] {\n    list1.maxByOrNull((it) -> it)\n    list1.maxByOrNull((it) -> -it)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxByOrNull((it) -> it.length)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxByOrNull((it) -> it.reverse())\n    List(11.gb, 100.mb, 12.tb).maxByOrNull((it) -> it.value)\n    List(11.gb, 100.mb, 12.tb).maxByOrNull((it) -> it)\n    List(11.s, 100.ms, 12.min).maxByOrNull((it) -> it.value)\n    List(11.s, 100.ms, 12.min).maxByOrNull((it) -> it)\n    List().maxByOrNull((it) -> it)\n    module.catch(() -> List(1, \"Pigeon\", 3.d).maxByOrNull((it) -> it))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/listing.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class Person { name: String }\n\nlocal empty = new Listing {}\n\nlocal empty2 = (empty) {}\n\nlocal base: Listing<Person> = new {\n  new { name = \"Pigeon\" }\n  new { name = \"Barn Owl\" }\n  new { name = \"Parrot\" }\n}\n\nlocal derived: Listing<Person> = (base) {\n  new { name = \"Albatross\" }\n  new { name = \"Elf Owl\" }\n}\n\nlocal duplicate: Listing<Person> = (base) {\n  new { name = \"Albatross\" }\n  new { name = \"Parrot\" }\n  new { name = \"Elf Owl\" }\n}\n\nlocal altered: Listing<Person> = (base) {\n  [0] { name = \"Wood Pigeon\" }\n}\n\nlocal computedIndex: Listing<Person> = (base) {\n  [computeIndex()] { name = \"Wood Pigeon\" }\n}\n\nlocal function computeIndex() = 0\n\nfacts {\n  [\"isEmpty\"] {\n    empty.isEmpty\n    empty2.isEmpty\n    !base.isEmpty\n    !derived.isEmpty\n    !altered.isEmpty\n    !computedIndex.isEmpty\n  }\n\n  [\"isNotEmpty\"] {\n    !empty.isNotEmpty\n    !empty2.isNotEmpty\n    base.isNotEmpty\n    derived.isNotEmpty\n    altered.isNotEmpty\n    computedIndex.isNotEmpty\n  }\n\n  [\"lastIndex\"] {\n    empty.lastIndex == -1\n    empty2.lastIndex == -1\n    base.lastIndex == 2\n    derived.lastIndex == 4\n    duplicate.lastIndex == 5\n    altered.lastIndex == 2\n    computedIndex.lastIndex == 2\n  }\n\n  [\"isDistinct\"] {\n    empty.isDistinct\n    empty2.isDistinct\n    base.isDistinct\n    derived.isDistinct\n    !duplicate.isDistinct\n    altered.isDistinct\n    computedIndex.isDistinct\n  }\n\n  [\"isDistinctBy()\"] {\n    empty.isDistinctBy((it) -> it)\n    empty2.isDistinctBy((it) -> it)\n    base.isDistinctBy((it) -> it)\n    derived.isDistinctBy((it) -> it)\n    !duplicate.isDistinctBy((it) -> it)\n    altered.isDistinctBy((it) -> it)\n    computedIndex.isDistinctBy((it) -> it)\n\n    empty.isDistinctBy((it) -> it.name)\n    empty2.isDistinctBy((it) -> it.name)\n    base.isDistinctBy((it) -> it.name)\n    derived.isDistinctBy((it) -> it.name)\n    !duplicate.isDistinctBy((it) -> it.name)\n    altered.isDistinctBy((it) -> it.name)\n    computedIndex.isDistinctBy((it) -> it.name)\n\n    empty.isDistinctBy((it) -> it.getClass())\n    empty2.isDistinctBy((it) -> it.getClass())\n    !base.isDistinctBy((it) -> it.getClass())\n    !derived.isDistinctBy((it) -> it.getClass())\n    !duplicate.isDistinctBy((it) -> it.getClass())\n    !altered.isDistinctBy((it) -> it.getClass())\n    !computedIndex.isDistinctBy((it) -> it.getClass())\n  }\n  \n  [\"getOrNull\"] {\n    empty.getOrNull(-1) == null\n    empty.getOrNull(0) == null\n    base.getOrNull(-1) == null\n    for (i, v in base) {\n      base.getOrNull(i) == v\n    }\n    base.getOrNull(base.length) == null\n  }\n  \n  [\"first\"] {\n    module.catch(() -> empty.first) == \"Expected a non-empty Listing.\"\n    base.first == base[0]\n    derived.first == base[0]\n    altered.first != base[0]\n    computedIndex.first == altered.first\n  }\n  \n  [\"firstOrNull\"] {\n    empty.firstOrNull == null\n    base.firstOrNull == base[0]\n    derived.firstOrNull == base[0]\n    altered.firstOrNull != base[0]\n    computedIndex.firstOrNull == altered.first\n  }\n\n  [\"last\"] {\n    module.catch(() -> empty.last) == \"Expected a non-empty Listing.\"\n    base.last == base[2]\n    derived.last == derived[4]\n    altered.last == base[2]\n    computedIndex.last == base[2]\n  }\n\n  [\"lastOrNull\"] {\n    empty.lastOrNull == null\n    base.lastOrNull == base[2]\n    derived.lastOrNull == derived[4]\n    altered.lastOrNull == base[2]\n    computedIndex.lastOrNull == base[2]\n  }\n\n  [\"single\"] {\n    module.catch(() -> empty.single) == \"Expected a single-element Listing.\"\n    module.catch(() -> base.single) == \"Expected a single-element Listing.\"\n    new Listing { 42 }.single == 42\n  }\n\n  [\"singleOrNull\"] {\n    empty.singleOrNull == null\n    base.singleOrNull == null\n    new Listing { 42 }.singleOrNull == 42\n  }\n\n  [\"every\"] {\n    !base.every((it) -> it.name.contains(\"rot\"))\n    base.every((it) -> !it.name.isBlank)\n    !((base) { new { name = \"EEEEE\" } }).every((it) -> it.name.contains(\"rot\"))\n  }\n  \n  [\"any\"] {\n    base.any((it) -> it.name.contains(\"rot\"))\n    !base.any((it) -> it.name.contains(\"inch\"))\n    ((base) { new { name = \"EEEEE\" } }).any((it) -> it.name.contains(\"rot\"))\n  }\n\n  [\"contains\"] {\n    !empty.contains(0)\n    base.contains(base[1])\n    derived.contains(base[1])\n    derived.contains(derived[3])\n    !altered.contains(base[0])\n    !computedIndex.contains(base[0])\n  }\n}\n\nexamples {\n  [\"length\"] {\n    empty.length\n    empty2.length\n    base.length\n    derived.length\n    altered.length\n    computedIndex.length\n    \n    local elementsAndEntries = (base) {\n      new { name = \"\" }\n      [2] { name = \"\" }\n      [computeIndex()] { name = \"\" }\n      new { name = \"\" }\n      [1 + 0] { name = \"\" }\n    }\n    elementsAndEntries.length\n  }\n\n  [\"toList()\"] {\n    empty.toList()\n    empty2.toList()\n    base.toList()\n    derived.toList()\n    duplicate.toList()\n    altered.toList()\n    computedIndex.toList()\n  }\n\n  [\"toSet()\"] {\n    empty.toSet()\n    empty2.toSet()\n    base.toSet()\n    derived.toSet()\n    duplicate.toSet()\n    altered.toSet()\n    computedIndex.toSet()\n  }\n\n  [\"distinct\"] {\n    empty.distinct\n    empty2.distinct\n    base.distinct\n    derived.distinct\n    duplicate.distinct\n    altered.distinct\n    computedIndex.distinct\n  }\n\n  [\"distinctBy()\"] {\n    empty.distinctBy((it) -> it)\n    empty2.distinctBy((it) -> it)\n    base.distinctBy((it) -> it)\n    derived.distinctBy((it) -> it)\n    duplicate.distinctBy((it) -> it)\n    altered.distinctBy((it) -> it)\n    computedIndex.distinctBy((it) -> it)\n\n    empty.distinctBy((it) -> it.name)\n    empty2.distinctBy((it) -> it.name)\n    base.distinctBy((it) -> it.name)\n    derived.distinctBy((it) -> it.name)\n    duplicate.distinctBy((it) -> it.name)\n    altered.distinctBy((it) -> it.name)\n    computedIndex.distinctBy((it) -> it.name)\n\n    empty.distinctBy((it) -> it.getClass())\n    empty2.distinctBy((it) -> it.getClass())\n    base.distinctBy((it) -> it.getClass())\n    derived.distinctBy((it) -> it.getClass())\n    duplicate.distinctBy((it) -> it.getClass())\n    altered.distinctBy((it) -> it.getClass())\n    computedIndex.distinctBy((it) -> it.getClass())\n  }\n\n  [\"fold\"] {\n    empty.fold(List(), (l, e) -> l.add(e))\n    base.fold(List(), (l, e) -> l.add(e))\n    derived.fold(List(), (l, e) -> l.add(e))\n    altered.fold(List(), (l, e) -> l.add(e))\n    computedIndex.fold(List(), (l, e) -> l.add(e))\n  }\n\n  [\"foldIndexed\"] {\n    empty.foldIndexed(List(), (i, l, e) -> l.add(Pair(i, e)))\n    base.foldIndexed(List(), (i, l, e) -> l.add(Pair(i, e)))\n    derived.foldIndexed(List(), (i, l, e) -> l.add(Pair(i, e)))\n    altered.foldIndexed(List(), (i, l, e) -> l.add(Pair(i, e)))\n    computedIndex.foldIndexed(List(), (i, l, e) -> l.add(Pair(i, e)))\n  }\n\n\n  local baseNum = new Listing { 1; 2; 3 }\n  local baseString = new Listing { \"Pigeon\"; \"Barn Owl\"; \"Parrot\" }\n  local derivedString = (baseString) { \"Albatross\"; \"Elf Owl\" }\n  local alteredString = (baseString) { [0] = \"Wood Pigeon\" }\n  local computedIndexString = (baseString) { [computeIndex()] = \"Wood Pigeon\" }\n\n  [\"join\"] {\n    empty.join(\"\")\n    baseNum.join(\"\")\n    baseNum.join(\", \")\n    baseString.join(\"\")\n    baseString.join(\"---\")\n    derivedString.join(\"\")\n    derivedString.join(\"\\n\")\n    alteredString.join(\"\")\n    alteredString.join(\"\\n\")\n    computedIndexString.join(\"\")\n    computedIndexString.join(\"\\n\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/map.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal map1: Map<String, Int> = Map(\"one\", 1, \"two\", 2, \"three\", 3)\n\nfacts {\n  [\"isEmpty\"] {\n    Map().isEmpty\n    !map1.isEmpty\n  }\n\n  [\"isNotEmpty\"] {\n    !Map().isNotEmpty\n    map1.isNotEmpty\n  }\n\n  [\"containsKey()\"] {\n    map1.containsKey(\"two\")\n    !Map().containsKey(\"two\")\n    !map1.containsKey(\"other\")\n  }\n\n  [\"containsValue()\"] {\n    map1.containsValue(3)\n    !Map().containsValue(3)\n    !map1.containsValue(4)\n  }\n\n  [\"every()\"] {\n    Map().every((k, v) -> throw(\"unreachable code\"))\n    map1.every((k, v) -> v < 10)\n    !map1.every((k, v) -> k.contains(\"o\"))\n  }\n\n  [\"any()\"] {\n    map1.any((k, v) -> k.contains(\"o\"))\n    !Map().any((k, v) -> throw(\"unreachable code\"))\n    !map1.any((k, v) -> false)\n  }\n}\n\nexamples {\n  [\"length\"] {\n    Map().length\n    map1.length\n  }\n\n  [\"getOrNull()\"] {\n    map1.getOrNull(\"one\")\n    map1.getOrNull(\"five\")\n  }\n\n  [\"keys\"] {\n    Map().keys\n    map1.keys\n    (Map(\"one\", 1, \"two\", 2) + Map(\"three\", 3, \"four\", 4)).keys\n  }\n\n  [\"values\"] {\n    Map().values\n    map1.values\n    (Map(\"one\", 1, \"two\", 2) + Map(\"three\", 3, \"four\", 4)).values\n  }\n\n  [\"remove()\"] {\n    Map().remove(\"two\")\n    map1.remove(\"two\")\n    map1.remove(2)\n  }\n\n  [\"filter()\"] {\n    Map().filter((k, v) -> throw(\"unreachable\"))\n    map1.filter((k, v) -> k.contains(\"o\"))\n    map1.filter((k, v) -> v.isEven)\n  }\n\n  [\"mapKeys()\"] {\n    Map().mapKeys((k, v) -> throw(\"unreachable\"))\n    map1.mapKeys((k, v) -> k.toUpperCase() + v.toString())\n    map1.mapKeys((k, v) -> k)\n  }\n\n  [\"mapValues()\"] {\n    Map().mapValues((k, v) -> throw(\"unreachable\"))\n    map1.mapValues((k, v) -> k.length + v * 3)\n    map1.mapValues((k, v) -> v)\n  }\n\n  [\"map()\"] {\n    Map().map((k, v) -> throw(\"unreachable\"))\n    map1.map((k, v) -> Pair(k, v * 3))\n    map1.map((k, v) -> Pair(v, k))\n    module.catch(() -> map1.map((k, v) -> 42))\n  }\n\n  [\"flatMap()\"] {\n    Map().flatMap((k, v) -> throw(\"unreachable\"))\n    map1.flatMap((k, v) -> Map(v, v * 3))\n    map1.flatMap((k, v) -> Map(k, k.reverse()))\n    module.catch(() -> map1.flatMap((k, v) -> 42))\n  }\n\n  [\"entries\"] {\n    Map().entries\n    map1.entries\n    (Map(\"one\", 1, \"two\", 2) + Map(\"three\", 3, \"four\", 4)).entries\n  }\n\n  [\"toMap()\"] {\n    Map().toMap()\n    map1.toMap()\n  }\n\n  [\"toDynamic()\"] {\n    Map().toDynamic()\n    map1.toDynamic()\n  }\n\n  [\"toMapping()\"] {\n    Map().toMapping()\n    map1.toMapping()\n  }\n\n  [\"put()\"] {\n    Map().put(\"one\", 1)\n    map1.put(\"one\", 1)\n    map1.put(\"four\", 4)\n    map1.put(\"one\", 4)\n  }\n\n  [\"toTyped()\"] {\n    Map(\"name\", \"Pigeon\", \"age\", 42).toTyped(Person)\n    Map(\"age\", 42, \"name\", \"Pigeon\").toTyped(Person)\n    Map(\"age\", 42).toTyped(Person).name\n    Map(\"name\", \"Pigeon\").toTyped(Person).hasProperty(\"name\")\n    Map(\"name\", \"Pigeon\").toTyped(Person).hasProperty(\"age\")\n    Map(\"name\", \"Pigeon\", \"age\", 42, \"hobby\", \"surfing\").toTyped(Person)\n    module.catch(() -> Map(\"name\", \"Pigeon\").toTyped(Person).age)\n    module.catch(() -> Map().toTyped(Int))\n    module.catch(() -> Map().toTyped(Abstract))\n  }\n}\n\nlocal class Person { name: String = \"Default\"; age: Int }\nlocal abstract class Abstract\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/mapping.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal base = new Mapping {\n  default {\n    name = Undefined()\n    age = 42\n  }\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 24\n  }\n}\n\nlocal derived = (base) {\n  [\"Pigeon\"] {\n    name = \"Piggy\"\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 84\n  }\n}\n\nlocal empty = new Mapping {\n  default = (_) -> 1\n}\n\nlocal empty2 = (empty) {\n  default = (name) -> name.length + 2\n  local `_` = 42\n  local function `_`() = 42\n}\n\nlocal typedMapping: Mapping<String, String> = new {\n  [\"hello\"] = \"hellooooo\"\n}\n\nlocal delegatingTypedMapping: Mapping<String, String|Int> = typedMapping\n\nfacts {\n  [\"isEmpty\"] {\n    !base.isEmpty\n    !derived.isEmpty\n    empty.isEmpty\n    empty2.isEmpty\n  }\n\n  [\"isNotEmpty\"] {\n    base.isNotEmpty\n    derived.isNotEmpty\n    !empty.isNotEmpty\n    !empty2.isNotEmpty\n  }\n\n  [\"containsKey()\"] {\n    base.containsKey(\"Pigeon\")\n    base.containsKey(\"Parrot\")\n    !base.containsKey(\"Barn Owl\")\n    !base.containsKey(\"Other\")\n\n    derived.containsKey(\"Pigeon\")\n    derived.containsKey(\"Parrot\")\n    derived.containsKey(\"Barn Owl\")\n    !derived.containsKey(\"Other\")\n\n    !empty.containsKey(\"Pigeon\")\n    !empty.containsKey(\"default\")\n    !empty2.containsKey(\"Pigeon\")\n\n    delegatingTypedMapping.containsKey(\"hello\")\n  }\n\n  [\"containsValue()\"] {\n    !empty.containsValue(\"Any value\")\n    for (_, v in derived) {\n      derived.containsValue(v)\n    }\n  }\n\n  [\"length\"] {\n    empty.length == 0\n    base.length == 2\n    derived.length == 3\n  }\n\n  [\"keys (of type string)\"] {\n    empty.keys == Set()\n    derived.keys == Set(\"Pigeon\", \"Parrot\", \"Barn Owl\")\n    base.keys == Set(\"Pigeon\", \"Parrot\")\n  }\n\n  [\"keys (of type object)\"] {\n    local base2 = new Mapping {\n      [empty] = \"one\"\n      [base] = \"two\"\n    }\n    local derived2 = (base2) {\n      [derived] = \"three\"\n    }\n\n    base2.keys == Set(empty, base)\n    derived2.keys == Set(empty, base, derived)\n  }\n\n  [\"every()\"] {\n    empty.every((_, _) -> throw(\"unreachable code\"))\n    base.every((k, v) -> k == \"Parrot\" || v.age > 30)\n    !base.every((k, _) -> k == \"Pigeon\")\n  }\n\n  [\"any()\"] {\n    base.any((k, _) -> k.contains(\"rot\"))\n    base.any((_, v) -> v.age > 40)\n    !base.any((k, _) -> k.contains(\"other\"))\n  }\n}\n\nexamples {\n  [\"getOrNull()\"] {\n    base.getOrNull(\"Pigeon\")\n    base.getOrNull(\"Parrot\")\n    base.getOrNull(\"Barn Owl\")\n    base.getOrNull(\"Other\")\n\n    derived.getOrNull(\"Pigeon\")\n    derived.getOrNull(\"Parrot\")\n    derived.getOrNull(\"Barn Owl\")\n    derived.getOrNull(\"Other\")\n\n    empty.getOrNull(\"Pigeon\")\n    empty2.getOrNull(\"Pigeon\")\n  }\n\n  [\"fold()\"] {\n    base.fold(List(), (l, k, v) -> l.add(Pair(k, v)))\n    derived.fold(List(), (l, k, v) -> l.add(Pair(k, v)))\n    empty.fold(List(), (l, k, v) -> l.add(Pair(k, v)))\n    empty2.fold(List(), (l, k, v) -> l.add(Pair(k, v)))\n  }\n\n  [\"toMap()\"] {\n    base.toMap()\n    derived.toMap()\n    empty.toMap()\n    empty2.toMap()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/mathModule.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:math\"\n\nexamples {\n  [\"minInt\"] {\n    math.minInt\n    math.minInt8\n    math.minInt16\n    math.minInt32\n  }\n\n  [\"maxInt\"] {\n    math.maxInt\n    math.maxInt8\n    math.maxInt16\n    math.maxInt32\n  }\n\n  [\"maxUInt\"] {\n    math.maxUInt\n    math.maxUInt8\n    math.maxUInt16\n    math.maxUInt32\n  }\n\n  [\"e\"] {\n    math.e\n  }\n\n  [\"pi\"] {\n    math.pi\n  }\n\n  [\"exp\"] {\n    math.exp(2)\n    math.exp(2.34)\n    math.exp(-2)\n    math.exp(-2.34)\n  }\n\n  [\"sqrt\"] {\n    math.sqrt(9)\n    math.sqrt(2)\n    math.sqrt(2.34)\n    math.sqrt(-2)\n    math.sqrt(-2.34)\n  }\n\n  [\"cbrt\"] {\n    math.cbrt(27)\n    math.cbrt(2)\n    math.cbrt(2.34)\n    math.cbrt(-2)\n    math.cbrt(-2.34)\n  }\n\n  [\"log\"] {\n    math.log(2)\n    math.log(2.34)\n    math.log(-2)\n    math.log(-2.34)\n  }\n\n  [\"log2\"] {\n    math.log2(2)\n    math.log2(2.34)\n    math.log2(-2)\n    math.log2(-2.34)\n  }\n\n  [\"log10\"] {\n    math.log10(2)\n    math.log10(2.34)\n    math.log10(-2)\n    math.log10(-2.34)\n  }\n\n  [\"sin\"] {\n    math.sin(0)\n    math.sin(math.pi)\n    math.sin(2)\n    math.sin(2.34)\n    math.sin(-2)\n    math.sin(-2.34)\n  }\n\n  [\"cos\"] {\n    math.cos(0)\n    math.cos(math.pi)\n    math.cos(2)\n    math.cos(2.34)\n    math.cos(-2)\n    math.cos(-2.34)\n  }\n\n  [\"tan\"] {\n    math.tan(0)\n    math.tan(math.pi)\n    math.tan(2)\n    math.tan(2.34)\n    math.tan(-2)\n    math.tan(-2.34)\n  }\n\n  [\"asin\"] {\n    math.asin(math.sin(0))\n    math.asin(math.sin(math.pi))\n    math.asin(math.sin(2))\n    math.asin(math.sin(2.34))\n    math.asin(math.sin(-2))\n    math.asin(math.sin(-2.34))\n  }\n\n  [\"acos\"] {\n    math.acos(math.cos(0))\n    math.acos(math.cos(math.pi))\n    math.acos(math.cos(2))\n    math.acos(math.cos(2.34))\n    math.acos(math.cos(-2))\n    math.acos(math.cos(-2.34))\n  }\n\n  [\"atan\"] {\n    math.atan(math.tan(0))\n    math.atan(math.tan(math.pi))\n    math.atan(math.tan(2))\n    math.atan(math.tan(2.34))\n    math.atan(math.tan(-2))\n    math.atan(math.tan(-2.34))\n  }\n\n  [\"atan2\"] {\n    math.atan2(4, -3)\n    math.atan2(4.5, -3.5)\n    math.atan2(4.5, -3)\n    math.atan2(4, 3.5)\n  }\n\n  [\"gcd\"] {\n    math.gcd(0, 0)\n    math.gcd(4, 6)\n    module.catch(() -> math.gcd(-4, 6))\n    module.catch(() -> math.gcd(4, -6))\n    math.gcd(9999999999999999, 888888888888888888)\n    module.catch(() -> math.gcd(4, 6.1))\n  }\n\n  [\"lcm\"] {\n    math.lcm(0, 0)\n    math.lcm(4, 6)\n    module.catch(() -> math.lcm(-4, 6))\n    module.catch(() -> math.lcm(4, -6))\n    module.catch(() -> math.lcm(9999999999999999, 88888888888))\n    module.catch(() -> math.lcm(4, 6.1))\n  }\n\n  [\"isPowerOfTwo\"] {\n    math.isPowerOfTwo(0)\n    math.isPowerOfTwo(0.0)\n    math.isPowerOfTwo(1)\n    math.isPowerOfTwo(1.0)\n    math.isPowerOfTwo(2)\n    math.isPowerOfTwo(2.0)\n    math.isPowerOfTwo(4096)\n    math.isPowerOfTwo(4096.0)\n    math.isPowerOfTwo(4097)\n    math.isPowerOfTwo(4096.01)\n    math.isPowerOfTwo(-8)\n    math.isPowerOfTwo(-8.0)\n  }\n\n  [\"max\"] {\n    math.max(0, 0)\n    math.max(0, 0.0)\n    math.max(0, -0.0)\n    math.max(2, 4)\n    math.max(4, -2)\n    math.max(123, 123.456)\n    math.max(123.455, 123.456)\n    math.max(NaN, NaN)\n    math.max(NaN, 2)\n    math.max(Infinity, -Infinity)\n  }\n\n  [\"min\"] {\n    math.min(0, 0)\n    math.min(0, 0.0)\n    math.min(0, -0.0)\n    math.min(2, 4)\n    math.min(4, -2)\n    math.min(123, 123.456)\n    math.min(123.455, 123.456)\n    math.min(NaN, NaN)\n    math.min(NaN, 2)\n    math.min(Infinity, -Infinity)\n  }\n}\n\nfacts {\n  [\"atan2\"] {\n    math.atan2(1, 0) == math.pi / 2\n    math.atan2(0, -1) == math.pi\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/module.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"relativePathTo()\"] {\n    module.relativePathTo(import(\"dir1/dir2/relativePathTo.pkl\"))\n    module.relativePathTo(import(\"list.pkl\"))\n    import(\"list.pkl\").relativePathTo(import(\"set.pkl\"))\n    module.relativePathTo(module)\n    module.catch(() -> import(\"dir1/dir2/relativePathTo.pkl\").relativePathTo(module))\n  }\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/moduleOutput.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\noutput {\n  text = \"some string\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/moduleOutput2.pkl",
    "content": "output {\n  renderer = new JsonRenderer {}\n}\n\n// defining properties after output {} used to cause NPE\nres1 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer1.plist.pkl",
    "content": "pigeon {\n  name = \"pigeon\"\n  age = 30\n}\n\noutput {\n  value = pigeon\n  renderer = new PListRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer2.plist.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"one\", true, \"two\", 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\" }\nres15 = null\nres16 = IntSeq(1, 4)\n\noutput {\n  renderer = new PListRenderer {\n    indent = \"    \"\n    converters {\n      [String] = (it) -> it.reverse()\n      [Boolean] = (it) -> !it\n      [Int] = (it) -> it + 1\n      [Float] = (it) -> it + 1.1\n      [Duration] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [DataSize] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [List] = (it) -> it.reverse()\n      [Set] = (it) -> it + List(4)\n      [Map] = (it) -> it + Map(\"three\", 3.s)\n      [Listing] = (it) -> (it) { 4 }\n      [Mapping] = (it) -> (it) { [\"three\"] = 3.s }\n      [Dynamic] = (it) -> (it) { other = \"other\" }\n      [Person] = (it) -> (it) { age = 40 } // fill in missing property\n      [Null] = (it) -> \"String\"\n      [Pair] = (it) -> Pair(it.second, it.first)\n      [IntSeq] = (it) -> List(it.start, it.end, it.step)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer3.plist.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres7 = List(\"string\", true, 42)\nres8 = Set(\"string\", true, 42)\nres9 = Map(\"string\", true, 42, 1.23)\nres10 = new Listing { \"string\"; true; 42 }\nres11 = new Mapping { [\"string\"] = true; [42] = 1.23 }\nres12 = new Dynamic { name = \"pigeon\"; age = 30 }\nres13 = new Person { name = \"pigeon\"; age = 30 }\nres14 = null\nres15 = Pair(1, 2)\nres16 = IntSeq(1, 4)\n\noutput {\n  renderer = new PListRenderer {\n    converters {\n      [String] = (it) -> \"converted\"\n      [Boolean] = (it) -> \"converted\"\n      [Int] = (it) -> \"converted\"\n      [Float] = (it) -> \"converted\"\n      [Duration] = (it) -> \"converted\"\n      [DataSize] = (it) -> \"converted\"\n      [List] = (it) -> \"converted\"\n      [Set] = (it) -> \"converted\"\n      [Map] = (it) -> \"converted\"\n      [Listing] = (it) -> \"converted\"\n      [Mapping] = (it) -> \"converted\"\n      [Dynamic] = (it) -> \"converted\"\n      [Person] = (it) -> \"converted\"\n      [Null] = (it) -> \"converted\"\n      [Pair] = (it) -> \"converted\"\n      [IntSeq] = (it) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer4.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new PListRenderer {}\n\nres1 = renderer.renderValue(123)\nres2 = renderer.renderValue(1.23)\nres3 = renderer.renderValue(false)\nres4 = renderer.renderValue(\"pigeon\")\nres6 = renderer.renderValue(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderValue(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderValue(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderValue(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderValue(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderValue(new Person { name = \"pigeon\"; age = 42 })\n\nres13 = test.catch(() -> renderer.renderValue(null))\nres14 = test.catch(() -> renderer.renderValue(1.min))\nres15 = test.catch(() -> renderer.renderValue(1.mb))\nres16 = test.catch(() -> renderer.renderValue(Person))\nres17 = test.catch(() -> renderer.renderValue(Email))\nres18 = test.catch(() -> renderer.renderValue((x) -> x))\nres19 = test.catch(() -> new PListRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\nres20 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer5.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new PListRenderer {}\n\nres1 = test.catch(() -> renderer.renderDocument(123))\nres2 = test.catch(() -> renderer.renderDocument(1.23))\nres3 = test.catch(() -> renderer.renderDocument(false))\nres4 = test.catch(() -> renderer.renderDocument(\"pigeon\"))\n\nres6 = renderer.renderDocument(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderDocument(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderDocument(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderDocument(new Person { name = \"pigeon\"; age = 42 })\n\nres13 = test.catch(() -> renderer.renderDocument(1.min))\nres14 = test.catch(() -> renderer.renderDocument(1.mb))\nres15 = test.catch(() -> renderer.renderDocument(Person))\nres16 = test.catch(() -> renderer.renderDocument(Email))\nres17 = test.catch(() -> renderer.renderDocument((x) -> x))\nres18 = test.catch(() -> renderer.renderDocument(null))\nres19 = test.catch(() -> renderer.renderDocument(Pair(1, 2)))\nres20 = test.catch(() -> new PListRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderDocument(42))\nres21 = test.catch(() -> renderer.renderDocument(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer6.plist.pkl",
    "content": "name = \"pigeon\"\nage = 42\nfriends = new Listing {\n  \"barn owl\"\n  \"parrot\"\n}\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\n\noutput {\n  renderer = new PListRenderer {\n    converters {\n      [\"name\"] = (it) -> it.reverse()\n      [\"friends[*]\"] = (it) -> it + \"x\"\n      [\"hobbies[*]\"] = (it) -> it.skill\n      [\"address.street\"] = (it) -> \"Other St.\"\n      [\"address.*\"] = (it) -> \"changed\"\n      [\"unmatched\"] = (it) -> \"unmatched\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer7.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nm = new Mixin {}\n\noutput {\n  renderer = new PListRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pListRenderer8.plist.pkl",
    "content": "import \".../input-helper/api/annotationConverter.pkl\"\n\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new PListRenderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \"<!-- \"; suffix = \" -->\" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pair.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal pair = Pair(\"Pigeon\", 42)\nlocal pair2 = Pair(new Dynamic { name = \"Pigeon\" }, List(1, 2, 3))\nlocal pair3 = Pair(null, Pair(Regex(\"Pigeon\"), 42.ms))\n\nexamples {\n  [\"first\"] {\n    pair.first\n    pair2.first\n    pair3.first\n  }\n\n  [\"second\"] {\n    pair.second\n    pair2.second\n    pair3.second\n  }\n\n  [\"key\"] {\n    pair.key\n    pair2.key\n    pair3.key\n  }\n\n  [\"value\"] {\n    pair.value\n    pair2.value\n    pair3.value\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer1.pkl",
    "content": "pigeon {\n  name = \"pigeon\"\n  age = 30\n}\n\n// dynamic object with properties and elements\nbarnOwl {\n  name = \"barn owl\"\n  \"surfing\"\n  age = 42\n  \"fire making\"\n}\n\nparrot {\n  new {\n    // multiline string that is a property within an element\n    lastName = \"\"\"\n      Flintstone\n\n      Flintstone\n      \"\"\"\n    \"\"\"\n    Flintstone\n\n    Flintstone\n    \"\"\"\n  }\n  // multiline string that is an element\n  \"\"\"\n  Flintstone\n\n  Flintstone\n  \"\"\"\n}\n\noutput {\n  renderer = new PcfRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer2.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"one\", true, \"two\", 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\" }\nres15 = null\nres16 = Pair(1, 2)\nres17 = IntSeq(1, 4)\n\noutput {\n  renderer = new PcfRenderer {\n    indent = \"    \"\n    converters {\n      [String] = (it) -> it.reverse()\n      [Boolean] = (it) -> !it\n      [Int] = (it) -> it + 1\n      [Float] = (it) -> it + 1.1\n      [Duration] = (it) -> it + 2.s\n      [DataSize] = (it) -> it + 2.mb\n      [List] = (it) -> it.reverse()\n      [Set] = (it) -> it + List(4)\n      [Map] = (it) -> it + Map(\"three\", 3.s)\n      [Listing] = (it) -> (it) { 4 }\n      [Mapping] = (it) -> (it) { [\"three\"] = 3.s }\n      [Dynamic] = (it) -> (it) { other = \"other\" }\n      [Person] = (it) -> (it) { age = 40 } // fill in missing property\n      [Null] = (_) -> \"String\"\n      [Pair] = (it) -> Pair(it.second, it.first)\n      [IntSeq] = (it) -> List(it.start, it.end, it.step)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer2b.pkl",
    "content": "local renderer = new PcfRenderer {\n  converters {\n    [\"^apple\"] = (it) -> it.toUpperCase()\n    [\"^[*].apple\"] = (it) -> it.toUpperCase()\n    [\"^[apple]\"] = (it) -> it.toUpperCase()\n  }\n}\n\nlocal properties = renderer.renderDocument(\n  new Dynamic {\n    apple = \"yes\"\n    banana {\n      apple = \"no\"\n    }\n  })\n\nres1 = properties.contains(\"YES\")\nres2 = properties.contains(\"no\")\nres3 = !properties.contains(\"yes\")\nres4 = !properties.contains(\"NO\")\n\nlocal elements = renderer.renderDocument(\n  new Dynamic {\n    new {\n      apple = \"yes\"\n    }\n    new {\n      new {\n        apple = \"no\"\n      }\n    }\n  })\n\nres5 = elements.contains(\"YES\")\nres6 = elements.contains(\"no\")\nres7 = !elements.contains(\"yes\")\nres8 = !elements.contains(\"NO\")\n\nlocal entries = renderer.renderValue(\n  new Dynamic {\n    [\"apple\"] = \"yes\"\n    [\"banana\"] {\n      [\"apple\"] = \"no\"\n    }\n  })\n\nres9 = entries.contains(\"YES\")\nres10 = entries.contains(\"no\")\nres11 = !entries.contains(\"yes\")\nres12 = !entries.contains(\"NO\")\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer3.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"string\", true, 42, 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\"; age = 30 }\nres15 = null\nres16 = Pair(1, 2)\nres17 = IntSeq(1, 4)\n\noutput {\n  renderer = new PcfRenderer {\n    converters {\n      [String] = (it) -> \"converted\"\n      [Boolean] = (it) -> \"converted\"\n      [Int] = (it) -> \"converted\"\n      [Float] = (it) -> \"converted\"\n      [Duration] = (it) -> \"converted\"\n      [DataSize] = (it) -> \"converted\"\n      [List] = (it) -> \"converted\"\n      [Set] = (it) -> \"converted\"\n      [Map] = (it) -> \"converted\"\n      [Listing] = (it) -> \"converted\"\n      [Mapping] = (it) -> \"converted\"\n      [Dynamic] = (it) -> \"converted\"\n      [Person] = (it) -> \"converted\"\n      [Null] = (it) -> \"converted\"\n      [Pair] = (it) -> \"converted\"\n      [IntSeq] = (it) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer4.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new PcfRenderer {}\n\nres1 = renderer.renderValue(123)\nres2 = renderer.renderValue(1.23)\nres3 = renderer.renderValue(false)\nres4 = renderer.renderValue(\"pigeon\")\nres5 = renderer.renderValue(List(\"pigeon\", \"parrot\"))\nres6 = renderer.renderValue(Set(\"pigeon\", \"parrot\"))\nres7 = renderer.renderValue(Map(\"name\", \"pigeon\", \"age\", 42))\nres8 = renderer.renderValue(new Listing { \"pigeon\"; \"parrot\" })\nres9 = renderer.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres10 = renderer.renderValue(new Dynamic { name = \"pigeon\"; age = 42 })\nres11 = renderer.renderValue(new Person { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderValue(1.min)\nres13 = renderer.renderValue(1.mb)\nres14 = renderer.renderValue(null)\nres15 = renderer.renderValue(Pair(1, 2))\nres16 = renderer.renderValue(IntSeq(1, 4))\nres17 = renderer.renderValue(IntSeq(1, 4).step(-2))\nres18 = renderer.renderValue(Regex(\"a.*b\"))\n\nres19 = test.catch(() -> renderer.renderValue(Person))\nres20 = test.catch(() -> renderer.renderValue(Email))\nres21 = test.catch(() -> renderer.renderValue((x) -> x))\nres22 = test.catch(() -> new PcfRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer5.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new PcfRenderer {}\n\nres1 = test.catch(() -> renderer.renderDocument(123))\nres2 = test.catch(() -> renderer.renderDocument(1.23))\nres3 = test.catch(() -> renderer.renderDocument(false))\nres4 = test.catch(() -> renderer.renderDocument(\"pigeon\"))\nres5 = test.catch(() -> renderer.renderDocument(List(\"pigeon\", \"parrot\")))\nres6 = test.catch(() -> renderer.renderDocument(Set(\"pigeon\", \"parrot\")))\nres7 = test.catch(() -> renderer.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42)))\nres8 = test.catch(() -> renderer.renderDocument(new Listing { \"pigeon\"; \"parrot\" }))\nres9 = test.catch(() -> renderer.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 }))\n\nres10 = renderer.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres11 = renderer.renderDocument(new Person { name = \"pigeon\"; age = 42 })\n\nres12 = test.catch(() -> renderer.renderDocument(1.min))\nres13 = test.catch(() -> renderer.renderDocument(1.mb))\nres14 = test.catch(() -> renderer.renderDocument(null))\nres15 = test.catch(() -> renderer.renderDocument(Pair(1, 2)))\n\nres16 = test.catch(() -> renderer.renderDocument(Person))\nres17 = test.catch(() -> renderer.renderDocument(Email))\nres18 = test.catch(() -> renderer.renderDocument((x) -> x))\nres19 = test.catch(() -> new PcfRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderDocument(42))\nres20 = test.catch(() -> renderer.renderDocument(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer6.pkl",
    "content": "foo = null\nbar = null\nbaz {\n  qux = 42\n  quux = null\n  corge = new Listing {\n    null\n    1337\n    null\n    \"Hello World\"\n  }\n  grault = new Mapping {\n    [\"garply\"] = null\n    [\"waldo\"] = 42\n    [new Listing {\n      \"pigeon\"\n    }] = null\n  }\n  thud = Pair(new Dynamic {}, new Listing {})\n}\n\noutput {\n  renderer = new PcfRenderer {\n    omitNullProperties = true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer7.pkl",
    "content": "rawString = import(\"../basic/rawString.pkl\")\n\nres39 = \"\"\"\n  \"\"\\\"#####\n\n  delimiters for multiline string\n  \"\"\"\nres40 = \"\"\"\n  \"#####\n\n  no delimiters for multiline string\n  \"\"\"\nres41 = \"\\\\#\"\n\noutput {\n  renderer = new PcfRenderer {\n    useCustomStringDelimiters = true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer8.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nm = new Mixin {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pcfRenderer9.pkl",
    "content": "import \".../input-helper/api/annotationConverter.pkl\"\n\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new PcfRenderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \" // \"; valuePrefix = \"= \" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/pklbinary1.msgpack.yaml.pkl",
    "content": "open module encoding1\n\nimport \"pkl:pklbinary\"\nimport \"pkl:base\"\n\nclass Foo {\n  dynamic: Dynamic = new {\n    hello = \"world\"\n    [\"hello\"] = \"world\"\n    \"hello world\"\n  }\n  string: String = \"foo\"\n  map = Map(\"foo\", \"bar\")\n  mapping: Mapping = new { [\"foo\"] = \"bar\" }\n  list = List(\"foo\", \"bar\")\n  listing: Listing = new { \"foo\"; 0 }\n  set = Set(\"foo\", \"bar\")\n  duration = 123.h\n  dataSize = 123.gib\n  pair = Pair(\"foo\", \"bar\")\n  intSeq = IntSeq(123, 456)\n  regex = Regex(\"foo.*\")\n  func: ((String, Int) -> Boolean)? =\n    (a, b) -> a.sha256Int + b % 2 == 0\n  bytes = Bytes(0x01, 0x02, 0x03)\n  moduleClass: Class\n  baseModuleClass: Class = base.getClass()\n  pklbinaryModuleClass: Class = pklbinary.getClass()\n  stdlibClass: Class = PcfRenderer\n  someClass: Class = Foo\n  stdlibTypealias: TypeAlias = UInt \n  someTypealias: TypeAlias = Bar\n  something: Any = new PcfRenderer {} // a non-external class from pkl:base\n}\n\ntypealias Bar = Mapping<String, String>\n\nclassInstance: Foo = new {\n  moduleClass = Map(true, module.getClass())[true]\n}\n\nhidden noFunc: Foo = (classInstance) { func = null }\n\nhidden encoded: Bytes = new pklbinary.Renderer {}.renderValue(noFunc)\n\noutput {\n  bytes = encoded\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/platformModule.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:platform\"\n\nlocal current = platform.current\n\nfacts {\n  [\"language\"] {\n    current.language.version != \"\"\n  }\n\n  [\"runtime\"] {\n    current.runtime.name != \"\"\n    current.runtime.version != \"\"\n  }\n\n  [\"virtualMachine\"] {\n    current.virtualMachine.name != \"\"\n    current.virtualMachine.version != \"\"\n  }\n\n  [\"operatingSystem\"] {\n    current.operatingSystem.name != \"\"\n    current.operatingSystem.version != \"\"\n  }\n\n  [\"processor\"] {\n    current.processor.architecture != \"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/plistRenderer2b.pkl",
    "content": "local renderer = new PListRenderer {\n  converters {\n    [\"^apple\"] = (it) -> it.toUpperCase()\n    [\"^[*].apple\"] = (it) -> it.toUpperCase()\n    [\"^[apple]\"] = (it) -> it.toUpperCase()\n  }\n}\n\nlocal properties = renderer.renderDocument(\n  new Dynamic {\n    apple = \"yes\"\n    banana {\n      apple = \"no\"\n    }\n  })\n\nres1 = properties.contains(\"YES\")\nres2 = properties.contains(\"no\")\nres3 = !properties.contains(\"yes\")\nres4 = !properties.contains(\"NO\")\n\nlocal elements = renderer.renderDocument(\n  new Dynamic {\n    new {\n      apple = \"yes\"\n    }\n    new {\n      new {\n        apple = \"no\"\n      }\n    }\n  })\n\nres5 = elements.contains(\"YES\")\nres6 = elements.contains(\"no\")\nres7 = !elements.contains(\"yes\")\nres8 = !elements.contains(\"NO\")\n\nlocal entries = renderer.renderValue(\n  new Dynamic {\n    [\"apple\"] = \"yes\"\n    [\"banana\"] {\n      [\"apple\"] = \"no\"\n    }\n  })\n\nres9 = entries.contains(\"YES\")\nres10 = entries.contains(\"no\")\nres11 = !entries.contains(\"yes\")\nres12 = !entries.contains(\"NO\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer1.properties.pkl",
    "content": "pigeon {\n  name = \"pigeon\"\n  age = 30\n}\n\noutput {\n  value = pigeon\n  renderer = new PropertiesRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer10.properties.pkl",
    "content": "foo = new PropertiesRenderer {}.renderValue(List(\"bar\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer11.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nm = new Mixin {}\n\noutput {\n  renderer = new PropertiesRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer12.properties.pkl",
    "content": "import \".../input-helper/api/annotationConverter.pkl\"\n\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new PropertiesRenderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \"\\n# \" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer2.properties.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"one\", true, \"two\", 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\" }\nres15 = null\nres16 = Pair(1, 2)\n\noutput {\n  renderer = new PropertiesRenderer {\n    omitNullProperties = false\n    converters = (jsonValueRenderer.converters) {\n      [List] = (it) -> jsonValueRenderer.renderValue(it.reverse())\n      [Set] = (it) -> jsonValueRenderer.renderValue(it + List(4))\n      [Map] = (it) -> jsonValueRenderer.renderValue(it + Map(\"three\", 3.s))\n      [Listing] = (it) -> jsonValueRenderer.renderValue((it) { 4 })\n      [Mapping] = (it) -> jsonValueRenderer.renderValue((it) { [\"three\"] = 3.s })\n      [Dynamic] = (it) -> jsonValueRenderer.renderValue((it) { other = \"other\" })\n      [Person] = (it) -> jsonValueRenderer.renderValue((it) { age = 40 } /* fill in missing property */)\n      [Pair] = (it) -> jsonValueRenderer.renderValue(List(it.second, it.first))\n      [IntSeq] = (it) -> jsonValueRenderer.renderValue(List(it.start, it.end, it.step))\n    }\n  }\n  local jsonValueRenderer = new JsonRenderer {\n    converters {\n      [String] = (it) -> it.reverse()\n      [Boolean] = (it) -> !it\n      [Int] = (it) -> it + 1\n      [Float] = (it) -> it + 1.1\n      [Duration] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [DataSize] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [Null] = (it) -> \"String\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer2b.pkl",
    "content": "local renderer = new PropertiesRenderer {\n  converters {\n    [\"^apple\"] = (it) -> it.toUpperCase()\n    [\"^[*].apple\"] = (it) -> it.toUpperCase()\n    [\"^[apple]\"] = (it) -> it.toUpperCase()\n  }\n}\n\nlocal properties = renderer.renderDocument(\n  new Dynamic {\n    apple = \"yes\"\n    banana {\n      apple = \"no\"\n    }\n  })\n\nres1 = properties.contains(\"YES\")\nres2 = properties.contains(\"no\")\nres3 = !properties.contains(\"yes\")\nres4 = !properties.contains(\"NO\")\n\nlocal elements = renderer.renderDocument(\n  new Dynamic {\n    [\"foo\"] {\n      apple = \"yes\"\n    }\n    [\"bar\"] {\n      [\"baz\"] {\n        apple = \"no\"\n      }\n    }\n  })\n\nres5 = elements.contains(\"YES\")\nres6 = elements.contains(\"no\")\nres7 = !elements.contains(\"yes\")\nres8 = !elements.contains(\"NO\")\n\nlocal entries = renderer.renderDocument(\n  new Dynamic {\n    [\"apple\"] = \"yes\"\n    [\"banana\"] {\n      [\"apple\"] = \"no\"\n    }\n  })\n\nres9 = entries.contains(\"YES\")\nres10 = entries.contains(\"no\")\nres11 = !entries.contains(\"yes\")\nres12 = !entries.contains(\"NO\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer3.properties.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nclass NullablePerson {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"string\", true, 42, 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\"; age = 30 }\nres15 = null\nres16 = Pair(1, 2)\nres17 = new NullablePerson { name = \"pigeon\"; age = 30 } // not rendered\nres18 = IntSeq(1, 4)\n\noutput {\n  renderer = new PropertiesRenderer {\n    converters {\n      [String] = (it) -> \"converted\"\n      [Boolean] = (it) -> \"converted\"\n      [Int] = (it) -> \"converted\"\n      [Float] = (it) -> \"converted\"\n      [Duration] = (it) -> \"converted\"\n      [DataSize] = (it) -> \"converted\"\n      [List] = (it) -> \"converted\"\n      [Set] = (it) -> \"converted\"\n      [Map] = (it) ->\"converted\"\n      [Listing] = (it) ->\"converted\"\n      [Mapping] = (it) ->\"converted\"\n      [Dynamic] = (it) ->\"converted\"\n      [Person] = (it) -> \"converted\"\n      [NullablePerson] = (it) -> null\n      [Null] = (it) -> \"converted\"\n      [Pair] = (it) -> \"converted\"\n      [IntSeq] = (it) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer4.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nres1 = new PropertiesRenderer {}.renderValue(123)\nres2 = new PropertiesRenderer {}.renderValue(1.23)\nres3 = new PropertiesRenderer {}.renderValue(false)\nres4 = new PropertiesRenderer {}.renderValue(\"pigeon\")\nres5 = new PropertiesRenderer {}.renderValue(null)\n\nres6 = test.catch(() -> new PropertiesRenderer {}.renderValue(1.min))\nres7 = test.catch(() -> new PropertiesRenderer {}.renderValue(1.mb))\nres8 = test.catch(() -> new PropertiesRenderer {}.renderValue(List(\"pigeon\", \"parrot\")))\nres9 = test.catch(() -> new PropertiesRenderer {}.renderValue(Set(\"pigeon\", \"parrot\")))\nres10 = test.catch(() -> new PropertiesRenderer {}.renderValue(Map(\"name\", \"pigeon\", \"age\", 42)))\nres11 = test.catch(() -> new PropertiesRenderer {}.renderValue(new Listing { \"pigeon\"; \"parrot\" }))\nres12 = test.catch(() -> new PropertiesRenderer {}.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 }))\nres13 = test.catch(() -> new PropertiesRenderer {}.renderValue(new Dynamic { name = \"pigeon\"; age = 42 }))\nres14 = test.catch(() -> new PropertiesRenderer {}.renderValue(new Person { name = \"pigeon\"; age = 42 }))\nres15 = test.catch(() -> new PropertiesRenderer {}.renderValue(Pair(1, 2)))\nres16 = test.catch(() -> new PropertiesRenderer {}.renderValue(Person))\nres17 = test.catch(() -> new PropertiesRenderer {}.renderValue(Email))\nres18 = test.catch(() -> new PropertiesRenderer {}.renderValue((x) -> x))\nres19 = test.catch(() -> new PropertiesRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\nres20 = test.catch(() -> new PropertiesRenderer {}.renderValue(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer5.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nres1 = new PropertiesRenderer {}.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42))\nres2 = new PropertiesRenderer {}.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres3 = new PropertiesRenderer {}.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres4 = new PropertiesRenderer {}.renderDocument(new Person { name = \"pigeon\"; age = 42 })\n\nres5 = test.catch(() -> new PropertiesRenderer {}.renderDocument(Pair(1, 2)))\nres6 = test.catch(() -> new PropertiesRenderer {}.renderDocument(null))\nres7 = test.catch(() -> new PropertiesRenderer {}.renderDocument(123))\nres8 = test.catch(() -> new PropertiesRenderer {}.renderDocument(1.23))\nres9 = test.catch(() -> new PropertiesRenderer {}.renderDocument(false))\nres10 = test.catch(() -> new PropertiesRenderer {}.renderDocument(\"pigeon\"))\nres11 = test.catch(() -> new PropertiesRenderer {}.renderDocument(List(\"pigeon\", \"parrot\")))\nres12 = test.catch(() -> new PropertiesRenderer {}.renderDocument(Set(\"pigeon\", \"parrot\")))\nres13 = test.catch(() -> new PropertiesRenderer {}.renderDocument(new Listing { \"pigeon\"; \"parrot\" }))\nres14 = test.catch(() -> new PropertiesRenderer {}.renderDocument(1.min))\nres15 = test.catch(() -> new PropertiesRenderer {}.renderDocument(1.mb))\nres16 = test.catch(() -> new PropertiesRenderer {}.renderDocument(Person))\nres17 = test.catch(() -> new PropertiesRenderer {}.renderDocument(Email))\nres18 = test.catch(() -> new PropertiesRenderer {}.renderDocument((x) -> x))\nres19 = test.catch(() -> new PropertiesRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderDocument(42))\nres20 = test.catch(() -> new PropertiesRenderer {}.renderDocument(IntSeq(1, 4)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer6.properties.pkl",
    "content": "res01 = \"\\t\\n\\u{000C}\\r\"         // i.e., \\t\\n\\f\\r\nres02 =  \"!#:=\\\\\\t\\n\\u{000C}\\r\"  // almost all escapes (except leading space)\nres03 = \" !#:=\\\\\\t\\n\\u{000C}\\r\"  // all escapes\n\n// ASCII ranges splits in the following categories/counts of characters:\nhidden escapedAscii = 9\nhidden escapedUnicode = 29\nhidden nonEscapedAscii = 90\n\nres04 = escapedAscii*1 == renderAndCount(res02, false, (value) -> countCharacters(value))\nres05 = escapedAscii*2 == renderAndCount(res02, true,  (value) -> countCharacters(value))\n\nres06 = escapedAscii*0 + 1 == renderAndCount(res02, false, (value) -> countBackslashes(value))\nres07 = escapedAscii*1 + 1 == renderAndCount(res02, true,  (value) -> countBackslashes(value))\n\nres08 = \"!#: =\\\\\"        // value: not escaping middle space\nres09 = \"!#:=\\\\ \"        // value: not escaping trailing space\nres10 = \" !#:=\\\\\"        // value: escaping leading space\n\n`!#: =\\\\` = \"res11\"      // key: escaping middle space\n`!#:=\\\\ ` = \"res12\"      // key: escaping trailing space\n` !#:=\\\\` = \"res13\"      // key: escaping leading space\n\nres14 = \"\\u{00}\\u{01}\\u{02}\\u{03}\\u{04}\\u{05}\\u{06}\\u{07}\\u{08}\\t\\n\\u{0B}\\u{0C}\\r\\u{0E}\\u{0F}\\u{10}\\u{11}\\u{12}\\u{13}\\u{14}\\u{15}\\u{16}\\u{17}\\u{18}\\u{19}\\u{1A}\\u{1B}\\u{1C}\\u{1D}\\u{1E}\\u{1F} !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\u{7F}\"\n\nres15 = escapedUnicode*1 + escapedAscii*1 + nonEscapedAscii*1 == renderAndCount(res14, false, (value) -> countCharacters(value))\nres16 = escapedUnicode*1 + escapedAscii*2 + nonEscapedAscii*1 == renderAndCount(res14, true,  (value) -> countCharacters(value))\n\nres17 = escapedUnicode*0 + escapedAscii*0 + 1 == renderAndCount(res14, false, (value) -> countBackslashes(value))\nres18 = escapedUnicode*0 + escapedAscii*1 + 1 == renderAndCount(res14, true,  (value) -> countBackslashes(value))\n\noutput {\n  renderer = new PropertiesRenderer {\n    restrictCharset = false\n  }\n}\n\nlocal function renderAndCount(value: String, render: Boolean, counter: (String) -> Int): Int =\n  counter.apply(if (render) new PropertiesRenderer { restrictCharset = false }.renderValue(value) else value)\n\nlocal function countCharacters(value: String): Int = value.length\n\nlocal function countBackslashes(value: String): Int = value.chars.count((c) -> c == \"\\\\\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer7.properties.pkl",
    "content": "res01 = \"\\t\\n\\u{000C}\\r\"         // i.e., \\t\\n\\f\\r\nres02 =  \"!#:=\\\\\\t\\n\\u{000C}\\r\"  // almost all escapes (except leading space)\nres03 = \" !#:=\\\\\\t\\n\\u{000C}\\r\"  // all escapes\n\n// ASCII ranges splits in the following categories/counts of characters:\nhidden escapedAscii = 9\nhidden escapedUnicode = 29\nhidden nonEscapedAscii = 90\n\nres04 = escapedAscii*1 == renderAndCount(res02, false, (value) -> countCharacters(value))\nres05 = escapedAscii*2 == renderAndCount(res02, true,  (value) -> countCharacters(value))\n\nres06 = escapedAscii*0 + 1 == renderAndCount(res02, false, (value) -> countBackslashes(value))\nres07 = escapedAscii*1 + 1 == renderAndCount(res02, true,  (value) -> countBackslashes(value))\n\nres08 = \"!#: =\\\\\"        // value: not escaping middle space\nres09 = \"!#:=\\\\ \"        // value: not escaping trailing space\nres10 = \" !#:=\\\\\"        // value: escaping leading space\n\n`!#: =\\\\` = \"res11\"      // key: escaping middle space\n`!#:=\\\\ ` = \"res12\"      // key: escaping trailing space\n` !#:=\\\\` = \"res13\"      // key: escaping leading space\n\nres14 = \"\\u{00}\\u{01}\\u{02}\\u{03}\\u{04}\\u{05}\\u{06}\\u{07}\\u{08}\\t\\n\\u{0B}\\u{0C}\\r\\u{0E}\\u{0F}\\u{10}\\u{11}\\u{12}\\u{13}\\u{14}\\u{15}\\u{16}\\u{17}\\u{18}\\u{19}\\u{1A}\\u{1B}\\u{1C}\\u{1D}\\u{1E}\\u{1F} !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\u{7F}\"\n\nres15 = escapedUnicode*1 + escapedAscii*1 + nonEscapedAscii*1 == renderAndCount(res14, false, (value) -> countCharacters(value))\nres16 = escapedUnicode*6 + escapedAscii*2 + nonEscapedAscii*1 == renderAndCount(res14, true,  (value) -> countCharacters(value))\n\nres17 = escapedUnicode*0 + escapedAscii*0 + 1 == renderAndCount(res14, false, (value) -> countBackslashes(value))\nres18 = escapedUnicode*1 + escapedAscii*1 + 1 == renderAndCount(res14, true,  (value) -> countBackslashes(value))\n\noutput {\n  renderer = new PropertiesRenderer {\n    restrictCharset = true\n  }\n}\n\nlocal function renderAndCount(value: String, render: Boolean, counter: (String) -> Int): Int =\n  counter.apply(if (render) new PropertiesRenderer { restrictCharset = true }.renderValue(value) else value)\n\nlocal function countCharacters(value: String): Int = value.length\n\nlocal function countBackslashes(value: String): Int = value.chars.count((c) -> c == \"\\\\\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer8.properties.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n  address: Address\n  hobbies: List<String>\n  friend: Person?\n}\n\nclass Address {\n  street: String\n}\n\nint = 123\n\nfloat = 1.23\n\nbool = true\n\nstring = \"Pigeon\"\n\nunicodeString = \"abc😀abc😎abc\"\n\nmultiLineString = \"\"\"\n  have a\n  great\n  day\n  \"\"\"\n\nlist = List(\n  123,\n  1.23,\n  bool,\n  string,\n  unicodeString,\n  multiLineString,\n  List(1, 2, 3),\n  Set(1, 2, 3),\n  Map(\"one\", 1),\n  new Dynamic { name = \"Pigeon\" }\n)\n\nset = Set(\n  int,\n  float,\n  bool,\n  string,\n  unicodeString,\n  multiLineString,\n  List(1, 2, 3),\n  Set(1, 2, 3),\n  Map(\"one\", 1),\n  new Dynamic { name = \"Pigeon\" }\n)\n\nmap = Map(\n  \"one\", int,\n  \"two\", float,\n  \"three\", bool,\n  \"four\", string,\n  \"five\", unicodeString,\n  \"six\", multiLineString,\n  \"seven\", List(1, 2, 3),\n  \"eight\", Set(1, 2, 3),\n  \"nine\", Map(\"one\", 1),\n  \"ten\", new Dynamic { name = \"Pigeon\" },\n  \"eleven\", null\n)\n\nlisting = new Listing {\n  123\n  1.23\n  bool\n  string\n  unicodeString\n  multiLineString\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1)\n  new { name = \"Pigeon\" }\n}\n\nmapping = new Mapping {\n  [\"one\"] = int\n  [\"two\"] = float\n  [\"three\"] = bool\n  [\"four\"] = string\n  [\"five\"] = unicodeString\n  [\"six\"] = multiLineString\n  [\"seven\"] = List(1, 2, 3)\n  [\"eight\"] = Set(1, 2, 3)\n  [\"nine\"] = Map(\"one\", 1)\n  [\"ten\"] = new { name = \"Pigeon\" }\n  [\"eleven\"] = null\n}\n\ntypedObject = new Person {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  hobbies = List(\n    \"swimming\",\n    \"gardening\",\n    \"reading\"\n  )\n  friend = null\n}\n\ncontainer {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n    hobbies = List(\n      \"swimming\",\n      \"gardening\",\n      \"reading\"\n    )\n  }\n  friend = null\n}\n\noutput {\n  renderer = new PropertiesRenderer {\n    converters = (jsonValueRenderer.converters) {\n      [Set]     = (it) -> jsonValueRenderer.renderValue(it)\n      [List]    = (it) -> jsonValueRenderer.renderValue(it)\n      [Listing] = (it) -> jsonValueRenderer.renderValue(it)\n    }\n  }\n  local jsonValueRenderer = new JsonRenderer { indent = \"\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRenderer9.properties.pkl",
    "content": "name = \"pigeon\"\nage = 42\nfriends = new Listing {\n  \"barn owl\"\n  \"parrot\"\n}\nmoreFriends = new {\n  \"elf owl\"\n  \"eagle\"\n}\ncouple = Pair(name, friends[1])\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\nclassification {\n  [\"red wolf\"] {\n    description = \"confidential\"\n  }\n  [\"pink panther\"] {\n    description = \"top secret\"\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\n\noutput {\n  renderer = new PropertiesRenderer {\n    converters {\n      [\"name\"] = (it) -> it.reverse()\n      [\"hobbies[*]\"] = (it) -> it.skill\n      [\"address.street\"] = (_) -> \"Other St.\"\n      [\"address.*\"] = (_) -> \"changed\"\n      [\"classification[pink panther]\"] = (_) -> \"official\"\n      [\"classification[*]\"] = (it) -> it.description\n      [\"unmatched\"] = (_) -> \"unmatched\"\n      [Listing] = (it) -> jsonRenderer.renderValue(it)\n      [Pair] = (it) -> jsonRenderer.renderValue(List(it.first, it.second))\n    }\n    local jsonRenderer = new JsonRenderer {\n      indent = \"\"\n      converters {\n        [\"[*]\"] = (it) -> it + \"x\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/propertiesRendererBug66849708.properties.pkl",
    "content": "object {\n  nullable = null\n  property = \"value\"\n}\n\nmapping {\n  [\"nullable\"] = null\n  [\"key\"] = \"value\"\n}\n\nmap = Map(\"nullable\", null, \"key\", \"value\")\n\noutput {\n  renderer = new PropertiesRenderer {\n    omitNullProperties = true\n    converters {\n      [\"object.property\"] = (it) -> \"converted\"\n      [\"mapping[key]\"] = (it) -> \"converted\"\n      [\"map[key]\"] = (it) -> \"converted\"\n    }\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/protobuf.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:protobuf\"\n\nlocal renderer = new protobuf.Renderer {}\nlocal function renderValue(it: Any): String =\n  renderer.renderValue(it)\n\n/// For testing inheritance; [Foo] is the _base_ class.\nlocal open class Foo {\n  foo: String\n}\n\n/// For testing inheritance; [Bar] is the _derived_ class.\nlocal class Bar extends Foo {\n  foo = \"Bar\"\n}\n\n/// For testing the rendering of types inside a `VmTyped`.\nlocal class Baz {\n  foo: Foo\n  bar: Bar\n  foos: Listing<Foo>\n  bars: Mapping<String, Bar>\n}\n\n/// For testing how rendering deals with _annotated_ (outer) collection types.\nlocal class CollectionTypes {\n  emptyList: List<Foo>\n  list: List<Foo> = List(new Bar {}, new Foo { foo = \"test foo\" })\n  emptyListing: Listing<Foo>\n  listing: Listing<Foo> = new {\n    new Bar { foo = \"listing bar\" }\n    new Foo { foo = \"listing foo\" }\n  }\n  emptyMap: Map<Int, String>\n  map: Map<Int, Foo> = Map(\n    1, new Bar { foo = \"first\" },\n    2, new Foo { foo = \"second\" }\n  )\n  emptyMapping: Mapping<Int, Bar>\n  mapping: String =\n    module.catch(() ->\n      renderValue(new Mapping<Foo, Bar> {\n        [new Foo { foo = \"key foo\" }] = new Bar { foo = \"value bar\" }\n      })\n    )\n  emptySet: Set<Foo>\n  set: Set<Foo> = Set(\n    new Bar { foo = \"setOne\" },\n    new Bar { foo = \"setTwo\" }\n  )\n  mappingWithUnannotatedValueType: Mapping<String, Listing> = new {\n    [\"some\"] {\n      new Bar {}\n      new Bar {}\n    }\n  }\n}\n\n/// For testing _admissable_ mapping key types.\nlocal class MappingKeys {\n  string: Mapping<String, Bar>\n  long: Mapping<Int, Bar>\n  int: Mapping<Int32, Bar>\n  short: Mapping<Int16, Bar>\n  boolean: Mapping<Boolean, Bar>\n}\n\n/// For testing that using _inadmissable_ mapping key types does indeed throw.\nlocal class InvalidMappingKey {\n  foo: Mapping<Bar, Bar>\n}\n\nlocal typealias StringLiteralUnion\n  = *\"Qux\"\n  | \"quux\"\n  | \"QUUX\"\n\nlocal typealias OpenEndedStringUnion\n  = *\"corge\"\n  | String // Not a union of string literals, although fully String-y.\n\nlocal typealias HeterogeneousUnion\n  = \"Grault\"\n  | \"GRAULT\"\n  | Int\n  | Foo\n\nlocal typealias SynonymPureEnum = StringLiteralUnion\n\nlocal class TypeAliasBehavior {\n  doubleAlias: SynonymPureEnum\n}\n\nlocal class StringLiteralUnionBehavior {\n  theProperty: StringLiteralUnion\n}\n\nlocal class OpenEndedStringUnionBehavior {\n  theProperty: OpenEndedStringUnion\n}\n\nlocal class HeterogeneousUnionBehavior {\n  theHeterogeneousUnion: Listing<HeterogeneousUnion>\n}\n\nlocal class HeterogeneousUnionBehaviorX {\n  theHeterogeneousUnion: HeterogeneousUnion\n}\n\nlocal class InvalidUnionBehavior {\n  myMapping: Mapping<HeterogeneousUnion, Int> = new {\n    [5] = 5\n  }\n}\n\nlocal class DynamicBehavior {\n  myDynamic: Dynamic\n}\n\nlocal class DurationBehavior {\n  myDuration: Duration = 42.ns\n}\n\nlocal class DataSizeBehavior {\n  myDataSize: DataSize\n}\n\nlocal class SubtypingBehavior {\n  myFoo: Foo\n  myFooOrBar: (Foo|Bar)?\n}\n\nexamples {\n  [\"Rendering primitive values\"] {\n    for (v in new Listing {\n      true\n      false\n\n      -42 as Int8\n      -42 as Int16\n      -42 as Int32\n      -42 as Int\n\n      42 as UInt8\n      42 as UInt16\n      42 as UInt32\n      42 as UInt\n\n      -13.37 as Float\n\n      -13.37 as Number\n      13.37 as Number\n      -42 as Number\n      42 as Number\n\n      \"Hello world\"\n\n      10.min\n      2.ms\n      120.ns\n      5.s + 120.ns\n    }) {\n      renderValue(v)\n    }\n  }\n\n  [\"Collection types\"] {\n    renderValue(new CollectionTypes {})\n  }\n\n  [\"Typed objects rendered as protobuf.ProtoMessage\"] {\n    renderValue(new Foo { foo = \"new\" })\n    renderValue(new Bar {})\n    renderValue(new Bar { foo = \"Baz\" })\n    renderValue(\n      new Baz {\n        foo {\n          foo = \"FOO\"\n        }\n        foos {\n          foo\n          outer.bar\n        }\n        bars {\n          [\"default\"] {}\n          [\"amended\"] {\n            foo = \"Bars\"\n          }\n        }\n      }\n    )\n    renderValue(new DurationBehavior {})\n  }\n\n  [\"Unsupported types\"] {\n    module.catch(() -> throw(renderValue(new DynamicBehavior {})))\n    module.catch(() -> throw(renderValue(new DataSizeBehavior { myDataSize = 10.kb })))\n  }\n\n  [\"Types not supported at top-level\"] {\n    module.catch(() -> throw(renderValue(Map(3,4))))\n    module.catch(() -> throw(renderValue(new Mapping {[1] = 2})))\n  }\n\n  [\"Keys in maps\"] {\n    renderValue(new MappingKeys {\n      string {\n        [\"Hello world\"] {}\n      }\n      long {\n        [1337] {}\n      }\n      int {\n        [42] {}\n      }\n      short {\n        [1] {}\n      }\n      boolean {\n        [false] {}\n      }\n    })\n    module.catch(() -> throw(renderValue(new InvalidMappingKey {\n      foo {\n        [new Bar {}] {}\n      }\n    })))\n  }\n\n  [\"typealiases\"] {\n    renderValue(new TypeAliasBehavior {})\n  }\n\n  [\"unions\"] {\n    renderValue(new StringLiteralUnionBehavior {})\n    renderValue(new OpenEndedStringUnionBehavior {})\n    renderValue(new HeterogeneousUnionBehaviorX {\n      theHeterogeneousUnion = \"Grault\"\n    })\n    renderValue(new HeterogeneousUnionBehavior {\n      theHeterogeneousUnion {\n        \"Grault\"\n        0\n        new Bar {}\n      }\n    })\n    module.catch(() -> renderValue(new InvalidUnionBehavior {}))\n  }\n  [\"subtypes\"] {\n    renderValue(new SubtypingBehavior {\n      myFoo = new Foo { foo = \"renders\" }\n    })\n    module.catch(() -> \n      renderValue(new SubtypingBehavior {\n        myFoo = new Bar { foo = \"shouldn't render\" }\n      })\n    )\n    renderValue(new SubtypingBehavior {\n      myFoo = new Foo { foo = \"renders\" }\n      myFooOrBar = new Bar { foo = \"also renders\" }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/protobuf2.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:protobuf\"\n\nlocal renderer = new protobuf.Renderer {}\n\nlocal class NestedStructures {\n  plainString: String = \"plain string\"\n  nestedListing: Listing<Listing<String>>\n  nestedListing2: Listing<Listing<Listing<Listing<String>>>>\n  nestedMapping: Mapping<String, Mapping<Int, Boolean>>\n  listingInMapping: Mapping<String, Listing<String>>\n  mappingInListing: Listing<Mapping<Int, Boolean>>\n  nestedList: List<List<String>>\n  nestedMap: Map<String, Map<Int, Boolean>>\n}\n\nexamples {\n  [\"some\"] {\n    renderer.renderDocument(new NestedStructures {\n      nestedListing {\n        new {\n          \"foo\"\n          \"bar\"\n        }\n        new {\n          \"baz\"\n          \"qux\"\n        }\n      }\n      nestedListing2 {\n        new {\n          new {\n            new {\n              \"foo\"\n              \"bar\"\n              \"baz\"\n            }\n          }\n        }\n      }\n      nestedMapping {\n        [\"quux\"] {\n          [42] = true\n          [1337] = false\n        }\n        [\"corge\"] {\n          [0] = false\n        }\n      }\n      listingInMapping {\n        [\"grault\"] {\n          \"grault1\"\n          \"grault2\"\n        }\n        [\"garply\"] {\n          \"garply1\"\n        }\n        [\"waldo\"] {}\n      }\n      mappingInListing {\n        new {\n          [-1] = false\n          [1] = true\n        }\n        new {\n          [-2] = true\n          [2] = false\n        }\n      }\n      nestedList = List(List(\"pigeon\", \"plugh\"), List(), List(\"xyzzy\"))\n      nestedMap = Map(\"thud\", Map(), \"wibble\", Map(1, false, 2, true), \"wobble\", Map(0, false))\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/protobuf3.txtpb.pkl",
    "content": "import \"pkl:protobuf\"\n\nimport \".../input-helper/api/annotationConverter.pkl\"\n\nclass Comment extends Annotation\n\n@protobuf.Property { name = \"FOO\" }\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new protobuf.Renderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \" # \" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect1.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:reflect\"\nimport \".../input-helper/api/reflect/BaseModule.pkl\"\nimport \".../input-helper/api/reflect/testHelpers.pkl\"\n\nlocal mod = reflect.Module(BaseModule)\nlocal modClass = mod.moduleClass\nlocal modClassProps = modClass.properties\n\nlocal personClass = mod.classes[\"Person\"]\nlocal myAnnClass = mod.classes[\"MyAnn\"]\n\nlocal myMapAlias = mod.typeAliases[\"MyMap\"]\n\nfacts {\n  [\"Reflecting a module\"] {\n    mod.reflectee == BaseModule\n    mod.annotations == testHelpers.MyAnn(\"module annotation\")\n    mod.docComment == \"module doc comment\"\n    mod.uri.matches(Regex(#\"file:///.*/input-helper/api/reflect/BaseModule.pkl\"#))\n    mod.supermodule == null\n    !mod.isAmend\n    mod.classes.keys == Set(\"Person\", \"MyAnn\")\n    mod.typeAliases.keys == Set(\"MyMap\")\n  }\n\n  [\"Reflecting a module class\"] {\n    modClass.reflectee == BaseModule.getClass()\n    modClass.docComment == \"module doc comment\"\n    modClass.annotations == testHelpers.MyAnn(\"module annotation\")\n    modClass.typeParameters == List()\n    modClass.superclass.reflectee == Module\n    modClass.supertype == reflect.DeclaredType(reflect.Class(Module))\n  }\n\n  [\"Reflecting properties\"] {\n    modClassProps[\"any\"].type == reflect.anyType\n    modClassProps[\"noth\"].type == reflect.nothingType\n    modClassProps[\"unkn\"].type == reflect.unknownType\n    modClassProps[\"union\"].type == reflect.UnionType(List(\n        reflect.intType,\n        reflect.listType.withTypeArgument(reflect.stringType),\n        reflect.DeclaredType(reflect.Class(BaseModule.Person))))\n    modClassProps[\"nullable\"].type == reflect.DeclaredType(reflect.Class(BaseModule.Person)).nullable\n    modClassProps[\"stringLiteral\"].type == reflect.StringLiteralType(\"yes\")\n    modClassProps[\"constrained\"].type == reflect.stringType\n    modClassProps[\"aliased\"].type ==\n      reflect.DeclaredType(reflect.TypeAlias(BaseModule.MyMap))\n        .withTypeArgument(reflect.DeclaredType(reflect.Class(BaseModule.Person)))\n  }\n  \n  [\"Reflecting a class\"] {\n    personClass.annotations == testHelpers.MyAnn(\"class annotation\")\n    personClass.docComment == \"class doc comment\"\n    personClass.location.displayUri.contains(\"BaseModule.pkl\")\n    personClass.reflectee == BaseModule.Person\n    personClass.typeParameters == List()\n    personClass.superclass == reflect.Class(Typed)\n    personClass.supertype == reflect.DeclaredType(personClass.superclass!!)\n    personClass.isSubclassOf(reflect.Class(Any))\n    personClass.isSubclassOf(reflect.Class(Typed))\n    personClass.isSubclassOf(personClass)\n    !personClass.isSubclassOf(reflect.Class(String))\n    !personClass.isSubclassOf(myAnnClass)\n  }\n  \n  [\"Reflecting an annotation class\"] {\n    myAnnClass.annotations == List()\n    myAnnClass.docComment == null\n    myAnnClass.location.displayUri.contains(\"BaseModule.pkl\")\n    myAnnClass.reflectee == BaseModule.MyAnn\n    myAnnClass.typeParameters == List()\n    myAnnClass.superclass == reflect.Class(Annotation)\n    myAnnClass.isSubclassOf(reflect.Class(Annotation))\n    !reflect.Class(Annotation).isSubclassOf(myAnnClass)    \n  }\n  \n  [\"Reflecting an alias\"] {\n    myMapAlias.annotations == testHelpers.MyAnn(\"type alias annotation\")\n    myMapAlias.docComment == \"type alias doc comment\"\n    myMapAlias.location.displayUri.contains(\"BaseModule.pkl\")\n    myMapAlias.reflectee == BaseModule.MyMap\n    myMapAlias.typeParameters.first.toDynamic().toMap() == Map(\"name\", \"V\", \"variance\", null)\n    myMapAlias.referent == reflect.mapType.withTypeArguments(List(\n        reflect.stringType,\n        reflect.TypeVariable(myMapAlias.typeParameters[0])))    \n  }\n  \n  [\"Enclosing declarations\"] {\n    personClass.enclosingDeclaration == mod\n    modClass.enclosingDeclaration == mod\n    myMapAlias.enclosingDeclaration == mod    \n  }\n}\n\nexamples {\n  [\"Reflected module properties of unknown type metadata\"] {\n    modClassProps.keys\n    testHelpers.property(modClassProps[\"int\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"float\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"string\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"boolean\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"duration\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"dataSize\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"pair\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"list\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"set\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"map\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"listing\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"mapping\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"dynamic\"], reflect.unknownType)\n    testHelpers.property(modClassProps[\"typed\"], reflect.unknownType)\n  }\n\n  [\"Reflected module properties of known type metadata\"] {\n    testHelpers.property(modClassProps[\"int2\"], reflect.intType)\n    testHelpers.property(modClassProps[\"float2\"], reflect.floatType)\n    testHelpers.property(modClassProps[\"string2\"], reflect.stringType)\n    testHelpers.property(modClassProps[\"boolean2\"], reflect.booleanType)\n    testHelpers.property(modClassProps[\"duration2\"], reflect.durationType)\n    testHelpers.property(modClassProps[\"dataSize2\"], reflect.dataSizeType)\n    testHelpers.property(modClassProps[\"pair2\"], reflect.pairType.withTypeArguments(List(reflect.intType, reflect.stringType)))\n    testHelpers.property(modClassProps[\"list2\"], reflect.listType.withTypeArgument(reflect.intType))\n    testHelpers.property(modClassProps[\"set2\"], reflect.setType.withTypeArgument(reflect.intType))\n    testHelpers.property(modClassProps[\"map2\"], reflect.mapType.withTypeArguments(List(reflect.intType, reflect.stringType)))\n    testHelpers.property(modClassProps[\"listing2\"], reflect.listingType.withTypeArgument(reflect.intType))\n    testHelpers.property(modClassProps[\"mapping2\"], reflect.mappingType.withTypeArguments(List(reflect.intType, reflect.stringType)))\n    testHelpers.property(modClassProps[\"dynamic2\"], reflect.dynamicType)\n    testHelpers.property(modClassProps[\"typed2\"], reflect.DeclaredType(reflect.Class(BaseModule.Person)))\n  }\n\n  [\"Reflected module methods metadata\"] {\n    local modClassMethods = modClass.methods\n    modClassMethods.keys\n\n    testHelpers.method(\n      modClassMethods[\"sing\"],\n      List(reflect.unknownType, reflect.unknownType),\n      reflect.unknownType)\n\n    testHelpers.method(\n      modClassMethods[\"sing2\"],\n      List(\n        reflect.DeclaredType(reflect.Class(BaseModule.Person)),\n        reflect.listType.withTypeArgument(reflect.stringType)),\n      reflect.stringType)\n  }\n  \n  [\"Reflected class properties metadata\"] {\n    local personClassProperties = personClass.properties\n    personClassProperties.keys\n    testHelpers.property(personClassProperties[\"name\"], reflect.stringType)\n    testHelpers.property(personClassProperties[\"age\"], reflect.intType)\n    modClassProps[\"hiddenProp\"].modifiers\n    modClassProps[\"constProp\"].modifiers\n    modClassProps[\"fixedProp\"].modifiers\n  }\n\n  [\"Reflected class methods metadata\"] {\n    local personClassMethods = personClass.methods\n    personClassMethods.keys\n    testHelpers.method(\n        personClassMethods[\"sing\"],\n        List(reflect.listType.withTypeArgument(reflect.stringType)),\n        reflect.stringType)\n  }\n\n  [\"Reflected annotation class properties metadata\"] {\n    testHelpers.property(myAnnClass.properties[\"text\"], reflect.stringType)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect2.pkl",
    "content": "/// Module doc comment line 1\n/// Module doc comment line 2\nmodule api.reflect\n\namends \".../snippetTest.pkl\"\n\nimport \"pkl:reflect\"\nimport \".../input-helper/api/reflect/BaseModule.pkl\"\nimport \".../input-helper/api/reflect/ExtendingModule.pkl\"\n\nlocal testHelpers = (import(\".../input-helper/api/reflect/testHelpers.pkl\")) {\n  referenceModule = \"ExtendingModule.pkl\"\n}\n\nlocal mod = reflect.Module(ExtendingModule)\nlocal modClass = mod.moduleClass\nlocal modClassProps = modClass.properties\nlocal modClassMethods = modClass.methods\nlocal person2Class = mod.classes[\"Person2\"]\n\nfacts {\n  [\"Reflecting an extending module\"] {\n    mod.reflectee == ExtendingModule\n    mod.annotations == testHelpers.MyAnn(\"extending module annotation\")\n    mod.docComment == \"extending module doc comment\"\n    mod.uri.matches(Regex(#\"file:///.*/input-helper/api/reflect/ExtendingModule.pkl\"#))\n    mod.supermodule == reflect.Module(BaseModule) == true\n    mod.isAmend == false\n    mod.classes.keys == Set(\"Person2\")\n    mod.typeAliases.keys == Set()\n  }\n  \n  [\"Reflecting an extending module class\"] {\n    modClass.reflectee == ExtendingModule.getClass()\n    modClass.annotations == testHelpers.MyAnn(\"extending module annotation\")\n    modClass.docComment == \"extending module doc comment\"\n  }\n  \n  [\"Reflecting properties\"] {\n    modClassProps.keys == Set(\"property\")\n  }\n  \n  [\"Reflecting methods\"] {\n    modClassMethods.keys == Set(\"method\")    \n  }\n  \n  [\"Reflecting an extended class\"] {\n    person2Class.annotations == List()\n    person2Class.docComment == null\n    person2Class.location.displayUri.contains(\"ExtendingModule.pkl\")\n    person2Class.reflectee == ExtendingModule.Person2\n    person2Class.typeParameters == List()\n    person2Class.superclass == reflect.Class(BaseModule.Person)\n    person2Class.supertype == reflect.DeclaredType(person2Class.superclass!!)\n    person2Class.properties.keys == Set()\n    person2Class.methods.keys == Set()    \n  }\n}\n\nexamples {\n  [\"Reflected module properties of known extending type metadata\"] {\n    testHelpers.property(modClassProps[\"property\"], reflect.DeclaredType(reflect.Class(ExtendingModule.Person2))) \n  }\n  [\"Reflecting a method from an extending module\"] {\n    testHelpers.method(\n      modClassMethods[\"method\"],\n      List(),\n      reflect.DeclaredType(reflect.Class(BaseModule.Person)))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect3.pkl",
    "content": "/// Module doc comment line 1\n/// Module doc comment line 2\nmodule api.reflect\n\namends \".../snippetTest.pkl\"\n\nimport \"pkl:reflect\"\nimport \".../input-helper/api/reflect/BaseModule.pkl\"\nimport \".../input-helper/api/reflect/amendingModule.pkl\"\nimport \".../input-helper/api/reflect/testHelpers.pkl\"\n\nlocal mod = reflect.Module(amendingModule)\n\nfacts {\n  [\"Reflecting an amended module\"] {\n    mod.reflectee == amendingModule\n    mod.annotations == testHelpers.MyAnn(\"amending module annotation\")\n    mod.docComment == \"amending module doc comment\"\n    mod.uri.matches(Regex(#\"file:///.*/input-helper/api/reflect/amendingModule.pkl\"#))\n    mod.supermodule == reflect.Module(BaseModule)\n    mod.isAmend\n    mod.classes.keys == Set()\n    mod.typeAliases.keys == Set()\n    mod.moduleClass.reflectee == BaseModule.getClass()\n    reflect.Module(module) == reflect.moduleOf((module) { facts { [\"Can amend\"] {} } })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/reflect4.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:reflect\"\n\nlocal class MyAnn extends Annotation\n\nopen local class A {\n  inheritedFromA: String\n  overriddenInBFromA: String\n  overriddenInCFromA: String\n  overriddenInBCFromA: String\n\n  fixed modA: String = \"\"\n  fixed modAOverrideB: String = \"\"\n  fixed modAOverrideC: String = \"\"\n  fixed modAOverrideBC: String = \"\"\n  fixed modAOverrideCB: String = \"\"\n\n  @Unlisted\n  annA: String\n  @Unlisted\n  annAOverrideB: String\n  @Unlisted\n  annAOverrideC: String\n  @Unlisted\n  annAOverrideBC: String\n}\n\nopen local class B extends A {\n  inheritedFromB: String\n  overriddenInBFromA: Int\n  overriddenInCFromB: String\n  overriddenInBCFromA: Int\n\n  fixed modB: String = \"\"\n  hidden fixed modAOverrideB: Int = 0\n  hidden fixed modAOverrideBC: Int = 0\n  fixed modAOverrideCB: Int = 0\n\n  @Unlisted\n  annB: String\n  @MyAnn\n  annAOverrideB: String\n  @MyAnn\n  annAOverrideBC: String\n}\n\nlocal class C extends B {\n  fromC: String\n  overriddenInCFromA: Int\n  overriddenInCFromB: Int\n  overriddenInBCFromA: Boolean\n\n  fixed modC: String = \"\"\n  hidden fixed modAOverrideC: Int = 0\n  fixed modAOverrideBC: Boolean = false\n  hidden fixed modAOverrideCB: Boolean = false\n\n  @Unlisted\n  annC: String\n  @MyAnn\n  annAOverrideC: String\n  @AlsoKnownAs { names { \"mergedAnnotations\" } }\n  annAOverrideBC: String\n}\n\nlocal class DisplayProperty {\n  hidden property: reflect.Property\n  fixed name = property.name\n  fixed annotations = property.annotations.map((it) -> it.toString()).toListing()\n  fixed allAnnotations = property.allAnnotations.map((it) -> it.toString()).toListing()\n  fixed modifiers = property.modifiers.toListing()\n  fixed allModifiers = property.allModifiers.toListing()\n  fixed type = property.type.getPropertyOrNull(\"referent\")?.getPropertyOrNull(\"name\") ?? \"unknown\"\n}\n\nexamples {\n  [\"C\"] {\n    reflect.Class(C).allProperties.mapValues((_, it) -> new DisplayProperty { property = it }).toMapping()\n  }\n  [\"module\"] {\n    new DisplayProperty { property = reflect.Class(module.getClass()).properties[\"output\"] }\n  }\n}\n\noutput { // override to test example \"module\", allModifiers should contain \"hidden\"\n  text = super.text + \"\\n// hello world\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/reflectedDeclaration.pkl",
    "content": "import \"pkl:reflect\"\n\ntypealias MyAlias = Boolean | String\n\nclass Rec {\n  rec: Rec?\n}\n\nalias = reflect.TypeAlias(MyAlias)\n\nrec = reflect.DeclaredType(reflect.Class(Rec))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/regex.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"construction\"] {\n    Regex(\"abc\")\n    Regex(\"abc\") is Regex\n  }\n\n  [\"pattern\"] {\n    Regex(\"\").pattern\n    Regex(#\"(?i)abc\"#).pattern\n    Regex(#\"a(\\s*)b(\\s*)c\"#).pattern\n    Regex(#\"a(?:\\s*)b\\(c\\)\"#).pattern\n  }\n\n  [\"groupCount\"] {\n    Regex(\"\").groupCount\n    Regex(#\"(?i)abc\"#).groupCount\n    Regex(#\"a(\\s*)b(\\s*)c\"#).groupCount\n    Regex(#\"a(?:\\s*)b\\(c\\)\"#).groupCount\n  }\n\n  [\"findMatchesIn()\"] {\n    Regex(#\"\\]\\*\\[\"#).findMatchesIn(\"[*] ... [*]\")\n    Regex(#\"\\[\\*\\]\"#).findMatchesIn(\"[*] ... [*]\")\n    Regex(#\"\"#).findMatchesIn(\"[*] ... [*]\")\n    Regex(#\".*\"#).findMatchesIn(\"[*] ... [*]\")\n    module.catch(() -> Regex(#\"*\"#).findMatchesIn(\"[*] ... [*]\"))\n\n    Regex(#\"foo(\\w*)bar(\\w*)\"#).findMatchesIn(\"fooPigeonbarBarnOwl\")\n    Regex(#\"foo(\\w*)bar(\\w*)\"#).findMatchesIn(\"other fooPigeonbarBarnOwl other fooParrotbarElfOwl\")\n    Regex(#\"(abc)|(def)\"#).findMatchesIn(\"xxxabcxxxdefxxxabc\")\n\n    Regex(#\"\\w+\"#).findMatchesIn(\"!!!abc!!!def!!!\").map((it) -> it.toString())\n    Regex(#\"(\\w)(\\w\\w)\"#).findMatchesIn(\"abc\").single.groups.map((it) -> it.toString())\n  }\n\n  [\"matchEntire()\"] {\n    Regex(#\"(\\d+)\\w+\"#).matchEntire(\"123abc\")\n    Regex(#\"(\\d+)\\w+\"#).matchEntire(\"123abc!!!\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/releaseModule.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:release\"\n\nlocal current = release.current\n\nfacts {\n  [\"version\"] {\n    current.version.major == 0\n    current.version.minor >= 16\n    current.version.patch >= 0\n  }\n\n  [\"versionInfo\"] {\n    current.versionInfo.contains(\"macOS\") || current.versionInfo.contains(\"Linux\") || current.versionInfo.contains(\"Windows\")\n  }\n\n  [\"commitId\"] {\n    current.commitId.matches(Regex(#\"[0-9a-f]{7,40}\"#))\n  }\n\n  [\"sourceCode\"] {\n    current.sourceCode.homepage.startsWith(\"https://\")\n    current.sourceCode.homepage.endsWith(\"/\")\n  }\n\n  [\"documentation\"] {\n    current.documentation.homepage.startsWith(\"https://\")\n    current.documentation.homepage.endsWith(\"/\")\n  }\n  \n  [\"standardLibrary\"] {\n    current.standardLibrary.modules.length > 10\n    current.standardLibrary.modules.every((it) -> it.startsWith(\"pkl:\"))\n    current.standardLibrary.modules.contains(\"pkl:base\")\n    !current.standardLibrary.modules.contains(\"pkl:package-info\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/renderDirective.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:xml\"\nimport \"pkl:jsonnet\"\nimport \"pkl:protobuf\"\n\nexamples {\n  for (format, renderer in new Mapping {\n    [\"pcf\"] = new PcfRenderer {}\n    [\"json\"] = new JsonRenderer {}\n    [\"jsonnet\"] = new jsonnet.Renderer {} \n    [\"plist\"] = new PListRenderer {}\n    [\"properties\"] = new PropertiesRenderer {}\n    [\"textproto\"] = new protobuf.Renderer {}\n    [\"xml\"] = new xml.Renderer {}\n    [\"yaml\"] = new YamlRenderer {}\n  }) {\n    [format] {\n      renderer.renderValue(new RenderDirective { text = \"1\\\"2\\n3\\t4'\" })\n      renderer.renderValue(new RenderDirective { text = #\"+* /\\-;)❌#✅<>\"# })\n      renderer.renderDocument(new NestedDirectives {\n        when (format == \"properties\") {\n          listing = null\n          mapping = null\n        }\n        when (format == \"textproto\") {\n          dynamic = null\n        }\n      })\n      renderer.renderDocument(new RenderDirective { text = #\"✅\\❌ /-#;)<>\"# })\n    }\n  }\n}\n\nlocal class NestedDirectives {\n  directiveProperty: RenderDirective = new { text = #\"✅/&\\;)*❌\"# }\n  normalProperty: Int = 42\n  dynamic: Dynamic? = new Dynamic {\n    foo {\n      bar {\n        baz = new RenderDirective { text = #\"+#✅<;)❌* /\\->\"# }\n      }\n      qux = new RenderDirective { text = #\"+\\✅)❌#-;<* />\"# }\n    }\n  }\n  listing: Listing? = new {\n    \"foo\"\n    new RenderDirective { text = \"💰\" }\n    \"baz\"\n  }\n  mapping: Mapping? = new {\n    [\"key\"] = \"value\"\n    [new RenderDirective { text = \"🔑\" }] = 42\n    [\"other\"] = new RenderDirective { text = \"💰\" }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/renderDirective2.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:xml\"\nimport \"pkl:jsonnet\"\nimport \"pkl:protobuf\"\n\nlocal class TypedTestCase {\n  property: String\n  elements: Listing<String>\n  entries: Mapping<String, String>\n}\n\nexamples {\n  for (format, renderer in new Mapping {\n    local converters: Mixin<ValueRenderer> = new {\n      converters {\n        [String] = (str) -> new RenderDirective { text = \"(\\(str))\" }\n      }\n    }\n    [\"pcf\"] = new PcfRenderer {} |> converters\n    [\"json\"] = new JsonRenderer {} |> converters\n    [\"jsonnet\"] = new jsonnet.Renderer {} |> converters\n    [\"plist\"] = new PListRenderer {} |> converters\n    [\"properties\"] = new PropertiesRenderer {\n      converters {\n        [Listing] = (it: Listing) -> it.join(\",\")\n      }\n    } |> converters\n    [\"textproto\"] = new protobuf.Renderer {\n      converters {\n        [Dynamic] = (it) ->\n          (it) {\n            elements = it.elements.toList().toListing()\n            entries = it.entries.toMap().toMapping()\n          }.toTyped(TypedTestCase)\n        [String] = (it) -> new RenderDirective { text = \"(\\(it))\"}\n      }\n    }\n    [\"xml\"] = new xml.Renderer {} |> converters\n    [\"yaml\"] = new YamlRenderer {} |> converters\n  }) {\n    [format] {\n      renderer.renderDocument(new Dynamic {\n        property = \"value\"\n        elements {\n          \"element1\"\n          \"element2\"\n        }\n        entries {\n          [\"key1\"] = \"value1\"\n          [\"key2\"] = \"value2\"\n        }\n      })\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/resource.txt",
    "content": "line1\nline2\nline3"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/semverModule.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:semver\"\nimport \"pkl:test\"\n\nexamples {\n  [\"Version\"] {\n    semver.Version(\"0.0.0\")\n    semver.Version(\"1.2.3\")\n    semver.Version(\"1.2.3-beta-1\")\n    semver.Version(\"1.2.3-beta-1+340249\")\n\n    test.catch(() -> semver.Version(\"1\"))\n    test.catch(() -> semver.Version(\"1.2\"))\n    test.catch(() -> semver.Version(\"1.02.3\"))\n    test.catch(() -> semver.Version(\"aaa\"))\n  }\n\n  [\"List.sortWith()\"] {\n    List(\n      semver.Version(\"100.0.0\"),\n      semver.Version(\"0.100.0\"),\n      semver.Version(\"0.0.100\")\n    )\n      .sortWith(semver.comparator)\n  }\n}\n\nfacts {\n  [\"parseOrNull()\"] {\n    semver.parseOrNull(\"0.0.0\") == semver.Version(\"0.0.0\")\n    semver.parseOrNull(\"1.2.3\") == semver.Version(\"1.2.3\")\n    semver.parseOrNull(\"1.2.3-beta-1\") == semver.Version(\"1.2.3-beta-1\")\n    semver.parseOrNull(\"1.2.3-beta-1+340249\") == semver.Version(\"1.2.3-beta-1+340249\")\n\n    semver.parseOrNull(\"1\") == null\n    semver.parseOrNull(\"1.2\") == null\n    semver.parseOrNull(\"1.02.3\") == null\n    semver.parseOrNull(\"aaa\") == null\n  }\n\n  [\"Version.major\"] {\n    semver.Version(\"0.0.0\").major == 0\n    semver.Version(\"0.1.2\").major == 0\n    semver.Version(\"1.2.3\").major == 1\n    semver.Version(\"1.2.3-rc-1\").major == 1\n    semver.Version(\"1.2.3-rc-1+abc\").major == 1\n    semver.Version(\"1.2.3+abc\").major == 1\n    semver.Version(\"777.888.999-rc-1+abc\").major == 777\n  }\n\n  [\"Version.minor\"] {\n    semver.Version(\"0.0.0\").minor == 0\n    semver.Version(\"0.1.2\").minor == 1\n    semver.Version(\"1.2.3\").minor == 2\n    semver.Version(\"1.2.3-rc-1\").minor == 2\n    semver.Version(\"1.2.3-rc-1+abc\").minor == 2\n    semver.Version(\"1.2.3+abc\").minor == 2\n    semver.Version(\"777.888.999-rc-1+abc\").minor == 888\n  }\n\n  [\"Version.patch\"] {\n    semver.Version(\"0.0.0\").patch == 0\n    semver.Version(\"0.1.2\").patch == 2\n    semver.Version(\"1.2.3\").patch == 3\n    semver.Version(\"1.2.3-rc-1\").patch == 3\n    semver.Version(\"1.2.3-rc-1+abc\").patch == 3\n    semver.Version(\"1.2.3+abc\").patch == 3\n    semver.Version(\"777.888.999-rc-1+abc\").patch == 999\n  }\n\n  [\"Version.preRelease\"] {\n    semver.Version(\"0.0.0\").preRelease == null\n    semver.Version(\"0.1.2\").preRelease == null\n    semver.Version(\"1.2.3\").preRelease == null\n    semver.Version(\"1.2.3-rc-1\").preRelease == \"rc-1\"\n    semver.Version(\"1.2.3-rc-1+abc\").preRelease == \"rc-1\"\n    semver.Version(\"1.2.3+abc\").preRelease == null\n    semver.Version(\"777.888.999-rc-1+abc\").preRelease == \"rc-1\"\n  }\n\n  [\"Version.build\"] {\n    semver.Version(\"0.0.0\").build == null\n    semver.Version(\"0.1.2\").build == null\n    semver.Version(\"1.2.3\").build == null\n    semver.Version(\"1.2.3-rc-1\").build == null\n    semver.Version(\"1.2.3-rc-1+abc\").build == \"abc\"\n    semver.Version(\"1.2.3+abc\").build == \"abc\"\n    semver.Version(\"777.888.999-rc-1+abc\").build == \"abc\"\n  }\n\n  [\"Version.equals()\"] {\n    semver.Version(\"0.0.0\").equals(semver.Version(\"0.0.0\"))\n    semver.Version(\"0.1.2\").equals(semver.Version(\"0.1.2\"))\n    semver.Version(\"1.2.3\").equals(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.2.3-rc-1\").equals(semver.Version(\"1.2.3-rc-1\"))\n    semver.Version(\"1.2.3+abc\").equals(semver.Version(\"1.2.3+abc\"))\n    semver.Version(\"1.2.3+abc\").equals(semver.Version(\"1.2.3+def\"))\n    semver.Version(\"1.2.3-rc-1+abc\").equals(semver.Version(\"1.2.3-rc-1+abc\"))\n    semver.Version(\"1.2.3-rc-1+abc\").equals(semver.Version(\"1.2.3-rc-1+def\"))\n\n    !semver.Version(\"0.0.0\").equals(semver.Version(\"0.0.1\"))\n    !semver.Version(\"1.2.3\").equals(semver.Version(\"2.2.3\"))\n    !semver.Version(\"1.2.3\").equals(semver.Version(\"1.3.3\"))\n    !semver.Version(\"1.2.3\").equals(semver.Version(\"1.2.4\"))\n    !semver.Version(\"1.2.3\").equals(semver.Version(\"1.2.3-rc-1\"))\n    !semver.Version(\"1.2.3-rc-1\").equals(semver.Version(\"1.2.3-rc-2\"))\n    !semver.Version(\"1.2.3-rc-1\").equals(semver.Version(\"1.2.3-rc-2+abc\"))\n  }\n\n  [\"Version.isLessThan()\"] {\n    semver.Version(\"0.0.0\").isLessThan(semver.Version(\"0.0.1\"))\n    semver.Version(\"0.0.0\").isLessThan(semver.Version(\"0.1.0\"))\n    semver.Version(\"0.0.0\").isLessThan(semver.Version(\"1.0.0\"))\n    semver.Version(\"1.2.3\").isLessThan(semver.Version(\"2.2.3\"))\n    semver.Version(\"1.2.3\").isLessThan(semver.Version(\"1.3.3\"))\n    semver.Version(\"1.2.3\").isLessThan(semver.Version(\"1.2.4\"))\n    semver.Version(\"1.2.3-alpha\").isLessThan(semver.Version(\"1.2.3-beta\"))\n\n    !semver.Version(\"0.0.1\").isLessThan(semver.Version(\"0.0.0\"))\n    !semver.Version(\"0.1.0\").isLessThan(semver.Version(\"0.0.0\"))\n    !semver.Version(\"1.0.0\").isLessThan(semver.Version(\"0.0.0\"))\n    !semver.Version(\"2.2.3\").isLessThan(semver.Version(\"1.2.3\"))\n    !semver.Version(\"1.3.3\").isLessThan(semver.Version(\"1.2.3\"))\n    !semver.Version(\"1.2.4\").isLessThan(semver.Version(\"1.2.3\"))\n    !semver.Version(\"1.2.3-beta\").isLessThan(semver.Version(\"1.2.3-alpha\"))\n\n    !semver.Version(\"0.0.0\").isLessThan(semver.Version(\"0.0.0\"))\n    !semver.Version(\"1.2.3\").isLessThan(semver.Version(\"1.2.3\"))\n    !semver.Version(\"1.2.3-alpha\").isLessThan(semver.Version(\"1.2.3-alpha\"))\n    !semver.Version(\"1.2.3-alpha+abc\").isLessThan(semver.Version(\"1.2.3-alpha+abc\"))\n\n    !semver.Version(\"1.2.3-alpha+def\").isLessThan(semver.Version(\"1.2.3-alpha+abc\"))\n    !semver.Version(\"1.2.3-alpha+abc\").isLessThan(semver.Version(\"1.2.3-alpha+def\"))\n\n    semver.Version(\"1.2.3\").isLessThan(semver.Version(\"2.0.100\"))\n    semver.Version(\"1.2.3\").isLessThan(semver.Version(\"2.100.0\"))\n  }\n\n  [\"Version.isLessThanOrEquals()\"] {\n    semver.Version(\"1.2.3\").isLessThanOrEquals(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.2.3\").isLessThanOrEquals(semver.Version(\"1.2.4\"))\n    semver.Version(\"1.2.3\").isLessThanOrEquals(semver.Version(\"1.3.3\"))\n    semver.Version(\"1.2.3\").isLessThanOrEquals(semver.Version(\"1.2.4\"))\n    semver.Version(\"1.2.3\").isLessThanOrEquals(semver.Version(\"2.2.3\"))\n  }\n\n  [\"Version.isGreaterThan()\"] {\n    semver.Version(\"0.0.1\").isGreaterThan(semver.Version(\"0.0.0\"))\n    semver.Version(\"0.1.0\").isGreaterThan(semver.Version(\"0.0.0\"))\n    semver.Version(\"1.0.0\").isGreaterThan(semver.Version(\"0.0.0\"))\n    semver.Version(\"2.2.3\").isGreaterThan(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.3.3\").isGreaterThan(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.2.4\").isGreaterThan(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.2.3-beta\").isGreaterThan(semver.Version(\"1.2.3-alpha\"))\n\n    semver.Version(\"2.0.100\").isGreaterThan(semver.Version(\"1.2.3\"))\n    semver.Version(\"2.100.0\").isGreaterThan(semver.Version(\"1.2.3\"))\n    semver.Version(\"2.0.100\").isGreaterThan(semver.Version(\"1.2.3\"))\n  }\n\n  [\"Version.isGreaterThanOrEquals()\"] {\n    semver.Version(\"1.2.3\").isGreaterThanOrEquals(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.2.4\").isGreaterThanOrEquals(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.3.3\").isGreaterThanOrEquals(semver.Version(\"1.2.3\"))\n    semver.Version(\"1.2.4\").isGreaterThanOrEquals(semver.Version(\"1.2.3\"))\n    semver.Version(\"2.2.3\").isGreaterThanOrEquals(semver.Version(\"1.2.3\"))\n  }\n\n  [\"Version.isNormal()\"] {\n    semver.Version(\"0.0.0\").isNormal()\n    semver.Version(\"1.2.3\").isNormal()\n\n    !semver.Version(\"1.2.3-alpha\").isNormal()\n    !semver.Version(\"1.2.3+abc\").isNormal()\n    !semver.Version(\"1.2.3-alpha+abc\").isNormal()\n  }\n\n  [\"Version.isStable()\"] {\n    semver.Version(\"1.0.0\").isStable()\n    semver.Version(\"1.2.3\").isStable()\n    semver.Version(\"1.2.3+abc\").isStable()\n\n    !semver.Version(\"0.0.0\").isStable()\n    !semver.Version(\"0.1.2\").isStable()\n    !semver.Version(\"1.2.3-rc-1\").isStable()\n    !semver.Version(\"1.2.3-rc-1+abc\").isStable()\n  }\n\n  [\"Version.toString()\"] {\n    semver.Version(\"0.0.0\").toString() == \"0.0.0\"\n    semver.Version(\"0.1.2\").toString() == \"0.1.2\"\n    semver.Version(\"1.2.3\").toString() == \"1.2.3\"\n    semver.Version(\"1.2.3-rc-1\").toString() == \"1.2.3-rc-1\"\n    semver.Version(\"1.2.3-rc-1+abc\").toString() == \"1.2.3-rc-1+abc\"\n    semver.Version(\"1.2.3+abc\").toString() == \"1.2.3+abc\"\n    semver.Version(\"777.888.999-rc-1+abc\").toString() == \"777.888.999-rc-1+abc\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/set.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal set1 = Set(1, 2, 3)\nlocal set2 = Set(1, 2, 3, 4, 5)\n\nlocal comparator = (x, y) -> x < y\nlocal deprecatedComparator = (x, y) -> if (x < y) -1 else if (x == y) 0 else 1\n\nfacts {\n  [\"isEmpty\"] {\n    Set().isEmpty\n    !set1.isEmpty\n  }\n\n  [\"isNotEmpty\"] {\n    !Set().isNotEmpty\n    set1.isNotEmpty\n  }\n\n  [\"every()\"] {\n    set1.every((x) -> x <= 3)\n    !set1.every((x) -> x > 2)\n  }\n\n  [\"any()\"] {\n    set1.any((x) -> x > 2)\n    !set1.any((x) -> x > 3)\n  }\n\n  [\"contains()\"] {\n    set1.contains(2)\n    !set1.contains(4)\n  }\n\n  [\"startsWith()\"] {\n    set1.startsWith(List())\n    set1.startsWith(List(1, 2))\n    !set1.startsWith(List(1, 3))\n  }\n\n  [\"endsWith()\"] {\n    set1.endsWith(List())\n    set1.endsWith(List(2, 3))\n    !set1.endsWith(List(1, 3))\n  }\n}\n\nexamples {\n  [\"every\"] {\n    module.catch(() -> set1.every((x) -> \"wrong type\"))\n  }\n\n  [\"any\"] {\n    module.catch(() -> set1.any((x) -> \"wrong type\"))\n  }\n\n  [\"length\"] {\n    set1.length\n  }\n\n  [\"filter()\"] {\n    set1.filter((x) -> x > 1)\n    set1. filter((x) -> x > 3)\n    module.catch(() -> set1. filter((x) -> \"wrong type\"))\n  }\n\n  [\"map()\"] {\n    set1.map((x) -> x * 2)\n    set1.map((x) -> List(x, x))\n  }\n\n  [\"flatMap()\"] {\n    set1.flatMap((x) -> List(x, x + 1))\n    module.catch(() -> set1.flatMap((x) -> \"wrong type\"))\n  }\n\n  [\"flatten()\"] {\n    Set(List(1, 2), List(2, 3), List(4, 5)).flatten()\n    Set(Set(1, 2), Set(2, 3), Set(4, 5)).flatten()\n    Set(new Listing { 1; 2 }, new Listing { 2; 3 }, new Listing { 4; 5 }).flatten()\n    Set(List(1, 2), Set(2, 3), new Listing { 4; 5 }).flatten()\n    Set(List(), Set(), new Listing {}).flatten()\n  }\n\n  [\"first\"] {\n    set1.first\n  }\n\n  [\"rest\"] {\n    set1.rest\n  }\n\n  [\"last\"] {\n    set1.last\n  }\n\n  [\"single\"] {\n    Set(1).single\n  }\n\n  [\"count()\"] {\n    set1.count((x) -> x >= 2)\n    set1.count((x) -> true)\n    set1.count((x) -> false)\n    module.catch(() -> set1.count((x) -> \"wrong type\"))\n  }\n\n  [\"find()\"] {\n    set1.find((x) -> x >= 2)\n    set1.find((x) -> true)\n    module.catch(() -> set1.find((x) -> \"wrong type\"))\n  }\n\n  [\"findLast()\"] {\n    set1.findLast((x) -> x >= 2)\n    set1.findLast((x) -> true)\n    module.catch(() -> set1.findLast((x) -> \"wrong type\"))\n  }\n\n  [\"take()\"] {\n    set1.take(0)\n    set1.take(2)\n    set1.take(4)\n  }\n\n  [\"takeWhile()\"] {\n    set1.takeWhile((x) -> true)\n    set1.takeWhile((x) -> false)\n    set1.takeWhile((x) -> x < 3)\n    module.catch(() -> set1.takeWhile((x) -> \"wrong type\"))\n  }\n\n  [\"takeLast()\"] {\n    set1.takeLast(0)\n    set1.takeLast(2)\n    set1.takeLast(4)\n  }\n\n  [\"takeLastWhile()\"] {\n    set1.takeLastWhile((x) -> true)\n    set1.takeLastWhile((x) -> false)\n    set1.takeLastWhile((x) -> x > 1)\n    module.catch(() -> set1.takeLastWhile((x) -> \"wrong type\"))\n  }\n\n  [\"drop()\"] {\n    set1.drop(0)\n    set1.drop(2)\n    set1.drop(4)\n  }\n\n  [\"dropWhile()\"] {\n    set1.dropWhile((x) -> true)\n    set1.dropWhile((x) -> false)\n    set1.dropWhile((x) -> x < 3)\n    module.catch(() -> set1.dropWhile((x) -> \"wrong type\"))\n  }\n\n  [\"dropLast()\"] {\n    set1.dropLast(0)\n    set1.dropLast(2)\n    set1.dropLast(4)\n  }\n\n  [\"dropLastWhile()\"] {\n    set1.dropLastWhile((x) -> true)\n    set1.dropLastWhile((x) -> false)\n    set1.dropLastWhile((x) -> x > 1)\n    module.catch(() -> set1.dropLastWhile((x) -> \"wrong type\"))\n  }\n\n  [\"fold()\"] {\n    set1.fold(0, (acc, x) -> acc + x)\n    set1.fold(List(), (acc, x) -> acc.add(x))\n    Set(1).fold(0, (acc, x) -> acc + x)\n    Set().fold(0, (acc, x) -> acc + x)\n  }\n\n  [\"foldBack()\"] {\n    set1.foldBack(0, (x, acc) -> x + acc)\n    set1.foldBack(List(), (x, acc) -> acc.add(x))\n    Set(1).foldBack(0, (x, acc) -> x + acc)\n    Set().foldBack(0, (x, acc) -> x + acc)\n  }\n\n  [\"reduce()\"] {\n    set1.reduce((x, y) -> x + y)\n    Set(1).reduce((x, y) -> x + y)\n    module.catch(() -> Set().reduce((x, y) -> x + y))\n  }\n\n  [\"groupBy()\"] {\n    set2.groupBy((x) -> x)\n    set2.groupBy((x) -> x.isOdd)\n    set2.groupBy((x) -> true)\n    Set().groupBy((x) -> x)\n  }\n\n  [\"sortWith()\"] {\n    Set().sortWith(comparator)\n    Set(3, 1, 1, 2, 1).sortWith(comparator)\n    Set(3, 1, 2, 5, 4).sortWith(comparator)\n  }\n\n  [\"sortWith() with deprecated 3-way comparator\"] {\n    Set().sortWith(deprecatedComparator)\n    Set(3, 1, 1, 2, 1).sortWith(deprecatedComparator)\n    Set(3, 1, 2, 5, 4).sortWith(deprecatedComparator)\n  }\n\n  [\"toList()\"] {\n    set1.toList()\n  }\n\n  [\"toSet()\"] {\n    set1.toSet()\n  }\n\n  [\"intersect()\"] {\n    set1.intersect(Set())\n    Set().intersect(set1)\n    set1.intersect(Set(2, 3, 4))\n    set1.intersect(Set(4, 5, 6))\n  }\n\n  [\"difference()\"] {\n    set1.difference(Set())\n    Set().difference(set1)\n    set1.difference(Set(2, 3, 4))\n    set1.difference(Set(4, 5, 6))\n  }\n\n  [\"toMap()\"] {\n    set1.toMap((x) -> x, (x) -> 2 * x)\n    local persons = Set(\n      new Dynamic { name = \"Pigeon\"; age = 40 },\n      new Dynamic { name = \"Parrot\"; age = 30 }\n    )\n    persons.toMap((p) -> p.name, (p) -> p)\n  }\n\n  [\"add()\"] {\n    set1.add(42)\n    Set().add(42)\n  }\n\n  [\"minWith()\"] {\n    set1.minWith(comparator)\n    List(1).minWith(comparator)\n    module.catch(() -> List().minWith(comparator))\n  }\n\n  [\"minWith() with deprecated 3-way comparator\"] {\n    set1.minWith(deprecatedComparator)\n    List(1).minWith(deprecatedComparator)\n    module.catch(() -> List().minWith(deprecatedComparator))\n  }\n\n  [\"maxWith()\"] {\n    set1.maxWith(comparator)\n    List(1).maxWith(comparator)\n    module.catch(() -> List().maxWith(comparator))\n  }\n\n  [\"maxWith() with deprecated 3-way comparator\"] {\n    set1.maxWith(deprecatedComparator)\n    List(1).maxWith(deprecatedComparator)\n    module.catch(() -> List().maxWith(deprecatedComparator))\n  }\n\n  [\"zip()\"] {\n    Set(1, 2, 3).zip(Set(4, 5, 6))\n    Set(1, 2, 3).zip(Set(4, 5, 6, 7, 8))\n  }\n\n  [\"filterIndexed()\"] {\n    Set(1, 2, 3, 3, 2, 1).filterIndexed((i, n) -> i.isOdd)\n    Set(1, 2, 3, 3, 2, 1).filterIndexed((i, n) -> i.isEven)\n    Set(1, 2, 3, 3, 2, 1).filterIndexed((i, n) -> i.isOdd && n > 2)\n    Set(1, 2, 3, 3, 2, 1).filterIndexed((i, n) -> i.isEven && n > 2)\n  }\n\n  [\"mapIndexed()\"] {\n    Set(1, 2, 3, 3, 2, 1).mapIndexed((i, n) -> n * i)\n    Set(1, 2, 3, 3, 2, 1).mapIndexed((i, n) -> i.isOdd && n.isEven)\n  }\n\n  [\"mapNonNullIndexed()\"] {\n    Set(1, 2, 3, 4, 4, 3, 2, 1).mapNonNullIndexed((i, n) -> if (n.isOdd) null else n * i)\n    Set(1, 2, 3, 4, null, 4, 3, 2, 1).mapNonNullIndexed((i, n) -> if (n?.isOdd ?? true) null else n * i)\n  }\n\n  [\"flatMapIndexed()\"] {\n    Set(1, 2, 3, 3, 2, 1).flatMapIndexed((i, n) -> Set(n * i))\n    Set(1, 2, 3, 3, 2, 1).flatMapIndexed((i, n) -> Set(i.isOdd && n.isEven))\n  }\n\n  [\"foldIndexed()\"] {\n    set1.foldIndexed(0, (idx, x, y) -> idx + x + y)\n    Set(1).foldIndexed(0, (idx, x, y) -> idx + x + y)\n    Set().foldIndexed(0, (idx, x, y) -> idx + x + y)\n  }\n\n  [\"toListing()\"] {\n    set1.toListing()\n    Set().toListing()\n  }\n\n  [\"toDynamic()\"] {\n    set1.toDynamic()\n    Set().toDynamic()\n  }\n\n  [\"filterNonNull()\"] {\n    set1.filterNonNull()\n    Set().filterNonNull()\n    Set(1, null, 2, null, 3).filterNonNull()\n    Set(null, null, null).filterNonNull()\n  }\n\n  [\"mapNonNull()\"] {\n    set1.mapNonNull((it) -> it)\n    set1.mapNonNull((it) -> null)\n    Set().mapNonNull((it) -> it)\n    Set(1, null, 2, null, 3).mapNonNull((it) -> it)\n  }\n\n  [\"filterIsInstance()\"] {\n    set1.filterIsInstance(Any)\n    set1.filterIsInstance(Int)\n    set1.filterIsInstance(Number)\n    set1.filterIsInstance(Float)\n    set1.filterIsInstance(String)\n    Set(1, \"2\", 3.0, \"4\").filterIsInstance(String)\n    Set().filterIsInstance(String)\n  }\n\n  [\"split()\"] {\n    set1.split(0)\n    set1.split(1)\n    set1.split(2)\n    set1.split(3)\n    Set().split(0)\n    module.catch(() -> set1.split(-1))\n    module.catch(() -> set1.split(4))\n  }\n\n  [\"partition()\"] {\n    set1.partition((it) -> it.isEven)\n    set1.partition((it) -> it.isOdd)\n    set1.partition((it) -> true)\n    set1.partition((it) -> false)\n    Set().partition((it) -> throw(\"unreachable\"))\n  }\n\n  [\"min\"] {\n    set1.min\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").min\n    Set(3.9, -8.4, 42, -99999).min\n    Set(42, 42.0).min\n    Set(42.0, 42).min\n    Set(11.gb, 100.mb, 12.tb).min\n    Set(11.s, 100.ms, 3.d).min\n    module.catch(() -> Set().min)\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).min)\n  }\n\n  [\"max\"] {\n    set1.max\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").max\n    Set(3.9, -8.4, 42, -99999).max\n    Set(42, 42.0).max\n    Set(42.0, 42).max\n    Set(11.gb, 100.mb, 12.tb).max\n    Set(11.s, 100.ms, 3.d).max\n    module.catch(() -> Set().max)\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).max)\n  }\n\n  [\"minBy()\"] {\n    set1.minBy((it) -> it)\n    set1.minBy((it) -> -it)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").minBy((it) -> it.length)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").minBy((it) -> it.reverse())\n    Set(11.gb, 100.mb, 12.tb).minBy((it) -> it.value)\n    Set(11.gb, 100.mb, 12.tb).minBy((it) -> it)\n    Set(11.s, 100.ms, 12.min).minBy((it) -> it.value)\n    Set(11.s, 100.ms, 12.min).minBy((it) -> it)\n    module.catch(() -> Set().minBy((it) -> it))\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).minBy((it) -> it))\n  }\n\n  [\"maxBy()\"] {\n    set1.maxBy((it) -> it)\n    set1.maxBy((it) -> -it)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxBy((it) -> it.length)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxBy((it) -> it.reverse())\n    Set(11.gb, 100.mb, 12.tb).maxBy((it) -> it.value)\n    Set(11.gb, 100.mb, 12.tb).maxBy((it) -> it)\n    Set(11.s, 100.ms, 12.min).maxBy((it) -> it.value)\n    Set(11.s, 100.ms, 12.min).maxBy((it) -> it)\n    module.catch(() -> Set().maxBy((it) -> it))\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).maxBy((it) -> it))\n  }\n\n  [\"sort()\"] {\n    set1.sort()\n    Set(3.9, -8.4, 42, -99999).sort()\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").sort()\n    Set(11.gb, 100.mb, 12.tb).sort()\n    Set(11.s, 100.ms, 3.d).sort()\n    Set().sort()\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).sort())\n  }\n\n  [\"sortBy()\"] {\n    set1.sortBy((it) -> it)\n    set1.sortBy((it) -> -it)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").sortBy((it) -> it.length)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").sortBy((it) -> it.reverse())\n    Set(11.gb, 100.mb, 12.tb).sortBy((it) -> it.value)\n    Set(11.gb, 100.mb, 12.tb).sortBy((it) -> it)\n    Set().sortBy((it) -> throw(\"unreachable\"))\n    Set(0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10).sortBy((it) -> 42)\n  }\n\n  [\"repeat()\"] {\n    set1.repeat(0)\n    set1.repeat(1)\n    set1.repeat(5)\n    Set().repeat(0)\n    Set().repeat(1)\n    Set().repeat(5)\n    module.catch(() -> set1.repeat(-1))\n  }\n\n  [\"reverse()\"] {\n    set1.reverse()\n    set1.reverse().reverse()\n    Set(1, \"Pigeon\", 3.d).reverse()\n    Set().reverse()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/setNullable.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal set1 = Set(1, 2, 3)\n\nlocal comparator = (x, y) -> if (x < y) -1 else if (x == y) 0 else 1\n\nexamples {\n  [\"firstOrNull\"] {\n    set1.firstOrNull\n    Set().firstOrNull\n  }\n\n  [\"restOrNull\"] {\n    set1.restOrNull\n    Set().restOrNull\n  }\n\n  [\"lastOrNull\"] {\n    set1.lastOrNull\n    Set().lastOrNull\n  }\n\n  [\"singleOrNull\"] {\n    Set(1).singleOrNull\n    set1.singleOrNull\n    Set().singleOrNull\n  }\n\n  [\"findOrNull()\"] {\n    set1.findOrNull((x) -> x >= 2)\n    set1.findOrNull((x) -> false)\n    module.catch(() -> set1.findOrNull((x) -> \"wrong type\"))\n  }\n\n  [\"findLastOrNull()\"] {\n    set1.findLastOrNull((x) -> x >= 2)\n    set1.findLastOrNull((x) -> false)\n    module.catch(() -> set1.findLastOrNull((x) -> \"wrong type\"))\n  }\n\n  [\"reduceOrNull()\"] {\n    set1.reduceOrNull((x, y) -> x + y)\n    Set(1).reduceOrNull((x, y) -> x + y)\n    Set().reduceOrNull((x, y) -> x + y)\n  }\n\n  [\"minWithOrNull()\"] {\n    set1.minWithOrNull(comparator)\n    Set(1).minWithOrNull(comparator)\n    Set().minWithOrNull(comparator)\n  }\n\n  [\"maxWithOrNull()\"] {\n    set1.maxWithOrNull(comparator)\n    Set(1).maxWithOrNull(comparator)\n    Set().maxWithOrNull(comparator)\n  }\n\n  [\"splitOrNull()\"] {\n    set1.splitOrNull(0)\n    set1.splitOrNull(1)\n    set1.splitOrNull(2)\n    set1.splitOrNull(3)\n    Set().split(0)\n    set1.splitOrNull(-1)\n    set1.splitOrNull(4)\n  }\n\n  [\"minOrNull\"] {\n    set1.minOrNull\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").minOrNull\n    Set(3.9, -8.4, 42, -99999).minOrNull\n    Set(42, 42.0).minOrNull\n    Set(42.0, 42).minOrNull\n    Set(11.gb, 100.mb, 12.tb).minOrNull\n    Set(11.s, 100.ms, 3.d).minOrNull\n    Set().minOrNull\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).minOrNull)\n  }\n\n  [\"maxOrNull\"] {\n    set1.maxOrNull\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxOrNull\n    Set(3.9, -8.4, 42, -99999).maxOrNull\n    Set(42, 42.0).maxOrNull\n    Set(42.0, 42).maxOrNull\n    Set(11.gb, 100.mb, 12.tb).maxOrNull\n    Set(11.s, 100.ms, 3.d).maxOrNull\n    Set().maxOrNull\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).maxOrNull)\n  }\n\n  [\"minByOrNull()\"] {\n    set1.minByOrNull((it) -> it)\n    set1.minByOrNull((it) -> -it)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").minByOrNull((it) -> it.length)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").minByOrNull((it) -> it.reverse())\n    Set(11.gb, 100.mb, 12.tb).minByOrNull((it) -> it.value)\n    Set(11.gb, 100.mb, 12.tb).minByOrNull((it) -> it)\n    Set(11.s, 100.ms, 12.min).minByOrNull((it) -> it.value)\n    Set(11.s, 100.ms, 12.min).minByOrNull((it) -> it)\n    Set().minByOrNull((it) -> it)\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).minByOrNull((it) -> it))\n  }\n\n  [\"maxByOrNull()\"] {\n    set1.maxByOrNull((it) -> it)\n    set1.maxByOrNull((it) -> -it)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxByOrNull((it) -> it.length)\n    Set(\"Pigeon\", \"Barn Owl\", \"Parrot\").maxByOrNull((it) -> it.reverse())\n    Set(11.gb, 100.mb, 12.tb).maxByOrNull((it) -> it.value)\n    Set(11.gb, 100.mb, 12.tb).maxByOrNull((it) -> it)\n    Set(11.s, 100.ms, 12.min).maxByOrNull((it) -> it.value)\n    Set(11.s, 100.ms, 12.min).maxByOrNull((it) -> it)\n    Set().maxByOrNull((it) -> it)\n    module.catch(() -> Set(1, \"Pigeon\", 3.d).maxByOrNull((it) -> it))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/shellModule.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:shell\"\n\nexamples {\n  [\"escapeWithSingleQuotes()\"] {\n    shell.escapeWithSingleQuotes(\"asdf\")\n    shell.escapeWithSingleQuotes(\"`@#$\")\n    shell.escapeWithSingleQuotes(\"abc\\\"abc\")\n    shell.escapeWithSingleQuotes(\"abc'def''ghi'''jkl\")\n    shell.escapeWithSingleQuotes(\"'abc'\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/string.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal str1 = \"abcdefg\"\nlocal str2 = \"cde\"\nlocal str3 = \"abxabyabz\"\nlocal quickBrownFox = \"The quick brown fox jumps over the lazy dog\"\n\nfacts {\n  [\"isEmpty\"] {\n    \"\".isEmpty\n    !str1.isEmpty\n  }\n\n  [\"isNotEmpty\"] {\n    !\"\".isNotEmpty\n    str1.isNotEmpty\n  }\n\n  [\"isBlank\"] {\n    \"\".isBlank\n    \"   \".isBlank\n    \"\\t\\n\\r\".isBlank\n    !str1.isBlank\n  }\n\n  [\"isNotBlank\"] {\n    !\"\".isNotBlank\n    !\"   \".isNotBlank\n    !\"\\t\\n\\r\".isNotBlank\n    str1.isNotBlank\n  }\n\n  [\"isBase64\"] {\n    \"\".isBase64\n    \"AQIDBA==\".isBase64\n    !\"hello there\".isBase64\n  }\n\n  [\"lastIndex\"] {\n    for (s in List(str1, str2, str3)) {\n      s.length == s.lastIndex + 1\n    }\n  }\n\n  [\"base64Decoded\"] {\n    \"\".base64.base64Decoded == \"\"\n    quickBrownFox.base64.base64Decoded == quickBrownFox\n  }\n  \n  [\"base64DecodedBytes\"] {\n    \"AQIDBA==\".base64DecodedBytes == Bytes(1, 2, 3, 4)\n  }\n\n  [\"contains()\"] {\n    str1.contains(str2)\n    str1.contains(str1)\n    str1.contains(Regex(\"\\\\w\"))\n    !str2.contains(str1)\n    !str1.contains(Regex(\"\\\\d\"))\n  }\n\n  [\"matches()\"] {\n    str1.matches(Regex(\"\\\\w+\"))\n    !str1.matches(Regex(\"\\\\d*\"))\n    !str1.matches(Regex(\"abc\"))\n  }\n\n  [\"startsWith()\"] {\n    str1.startsWith(\"\")\n    str1.startsWith(\"abc\")\n    str1.startsWith(Regex(#\"\\w\"#))\n    !str1.startsWith(\"abx\")\n    !str1.startsWith(Regex(#\"\\d\"#))\n  }\n\n  [\"endsWith()\"] {\n    str1.endsWith(\"\")\n    str1.endsWith(\"efg\")\n    !str1.endsWith(\"efx\")\n  }\n\n  [\"isRegex\"] {\n    str1.isRegex\n    #\"\\w*[0-9]\"#.isRegex\n    !\"(abc\".isRegex\n  }\n\n  [\"toBoolean()\"] {\n    \"true\".toBoolean()\n    \"tRuE\".toBoolean()\n    \"TRUE\".toBoolean()\n    !\"false\".toBoolean()\n    !\"fAlSe\".toBoolean()\n    !\"FALSE\".toBoolean()\n    module.catch(() -> \"other\".toBoolean()) != null\n    module.catch(() -> \"OTHER\".toBoolean()) != null\n    module.catch(() -> \"\".toBoolean()) != null\n  }\n\n  [\"capitalize()\"] {\n    \"pigeon\".capitalize() == \"Pigeon\"\n    \"Pigeon\".capitalize() == \"Pigeon\"\n    \"pigeon bird\".capitalize() == \"Pigeon bird\"\n    \"\".capitalize() == \"\"\n  }\n\n  [\"decapitalize()\"] {\n    \"pigeon\".decapitalize() == \"pigeon\"\n    \"Pigeon\".decapitalize() == \"pigeon\"\n    \"Pigeon Bird\".decapitalize() == \"pigeon Bird\"\n    \"\".capitalize() == \"\"\n  }\n}\n\nexamples {\n  [\"length\"] {\n    str1.length\n  }\n\n  [\"indexOf()\"] {\n    str1.indexOf(\"cde\")\n    str1.indexOf(\"\")\n    module.catch(() -> str1.indexOf(\"cdx\"))\n    str1.indexOf(Regex(#\"\\w\"#))\n    module.catch(() -> str1.indexOf(Regex(#\"\\d\"#)))\n  }\n\n  [\"indexOfOrNull()\"] {\n    str1.indexOfOrNull(\"cde\")\n    str1.indexOfOrNull(\"\")\n    str1.indexOfOrNull(\"cdx\")\n    str1.indexOfOrNull(Regex(#\"\\w\"#))\n    str1.indexOfOrNull(Regex(#\"\\d\"#))\n  }\n\n  [\"reverse()\"] {\n    str1.reverse()\n  }\n\n  [\"lastIndexOf()\"] {\n    str3.lastIndexOf(\"ab\")\n    str3.lastIndexOf(\"\")\n    module.catch(() -> str3.lastIndexOf(\"cdx\"))\n    str3.lastIndexOf(Regex(\"ab\"))\n    str3.lastIndexOf(Regex(\"\"))\n    module.catch(() -> str3.lastIndexOf(Regex(\"b*c\")))\n  }\n\n  [\"lastIndexOfOrNull()\"] {\n    str3.lastIndexOfOrNull(\"ab\")\n    str3.lastIndexOfOrNull(\"\")\n    str3.lastIndexOfOrNull(\"cdx\")\n  }\n\n  local str4 = \"aabbccaabbcc\"\n  local str6 = \"aabb..aabbcc\"\n\n  [\"split()\"] {\n    str4.split(Regex(\"b+c\"))\n    str4.split(\"cc\")\n  }\n\n  local str7 = \"aabbccaabbccaabbccaabbcc\"\n\n  [\"splitLimit()\"] {\n    str7.splitLimit(Regex(\"b+c\"), 1)\n    str7.splitLimit(Regex(\"b+c\"), 2)\n    str7.splitLimit(Regex(\"b+c\"), 4)\n    str7.splitLimit(\"cc\", 1)\n    str7.splitLimit(\"cc\", 2)\n    str7.splitLimit(\"cc\", 4)\n    module.catch(() -> str7.splitLimit(Regex(\"b+c\"), 0))\n    module.catch(() -> str7.splitLimit(Regex(\"b+c\"), -1))\n  }\n\n  [\"replaceAll()\"] {\n    str4.replaceAll(\"aa\", \"xx\")\n    str4.replaceAll(Regex(\"(b+)c\"), \"($0|$1)\")\n    str6.replaceAll(\".\", \"x\")\n    str6.replaceAll(Regex(\".\"), \"x\")\n    module.catch(() -> str4.replaceAll(Regex(\"cc\"), \"$4; no such group\"))\n  }\n\n  [\"replaceFirst()\"] {\n    str4.replaceFirst(\"aa\", \"xx\")\n    str4.replaceFirst(Regex(\"(b+)c\"), \"($0|$1)\")\n    str6.replaceFirst(\".\", \"x\")\n    str6.replaceFirst(Regex(\".\"), \"x\")\n    module.catch(() -> str4.replaceFirst(Regex(\"cc\"), \"$4; no such group\"))\n  }\n\n  [\"replaceLast()\"] {\n    str4.replaceLast(\"aa\", \"xx\")\n    str4.replaceLast(Regex(\"(b+)c\"), \"($0|$1)\")\n    str6.replaceLast(\".\", \"x\")\n    str6.replaceLast(Regex(\".\"), \"x\")\n    module.catch(() -> str4.replaceLast(Regex(\"cc\"), \"$4; no such group\"))\n  }\n\n  [\"replaceAllMapped()\"] {\n    str4.replaceAllMapped(\"aa\", (it) -> \">>\\(it)<<\")\n    str4.replaceAllMapped(Regex(\"(b+)c\"), (it) -> \">>\\(it)<<\")\n    str6.replaceAllMapped(\".\", (it) -> \">>\\(it)<<\")\n    str6.replaceAllMapped(Regex(\".\"), (it) -> \">>\\(it)<<\")\n  }\n\n  [\"replaceFirstMapped()\"] {\n    str4.replaceFirstMapped(\"aa\", (it) -> \">>\\(it)<<\")\n    str4.replaceFirstMapped(Regex(\"(b+)c\"), (it) -> \">>\\(it)<<\")\n    str6.replaceFirstMapped(\".\", (it) -> \">>\\(it)<<\")\n    str6.replaceFirstMapped(Regex(\".\"), (it) -> \">>\\(it)<<\")\n  }\n\n  [\"replaceLastMapped()\"] {\n    str4.replaceLastMapped(\"aa\", (it) -> \">>\\(it)<<\")\n    str4.replaceLastMapped(Regex(\"(b+)c\"), (it) -> \">>\\(it)<<\")\n    str6.replaceLastMapped(\".\", (it) -> \">>\\(it)<<\")\n    str6.replaceLastMapped(Regex(\".\"), (it) -> \">>\\(it)<<\")\n  }\n\n  [\"replaceRange()\"] {\n    str4.replaceRange(5, 10, \"XXX\")\n    str4.replaceRange(10, 12, \"extend beyond string end\")\n    module.catch(() -> str4.replaceRange(0, 100, \"_\"))\n    module.catch(() -> str4.replaceRange(-10, 5, \"_\"))\n  }\n\n  [\"toUpperCase()\"] {\n    \"abcABCabc\".toUpperCase()\n  }\n\n  [\"toLowerCase()\"] {\n    \"abcABCabc\".toLowerCase()\n  }\n\n  local str5 = \" \\t abcdefg \\t \\n\"\n\n  [\"trim\"] {\n    str5.trim()\n  }\n\n  [\"trimStart()\"] {\n    str5.trimStart()\n  }\n\n  [\"trimEnd()\"] {\n    str5.trimEnd()\n  }\n\n  [\"chars\"] {\n    \"\".chars\n    str1.chars\n  }\n\n  [\"codePoints\"] {\n    \"\".codePoints\n    str1.codePoints\n  }\n\n  [\"toInt()\"] {\n    \"123\".toInt()\n    \"-123\".toInt()\n    \"1_2__3___\".toInt()\n    \"-1_2__3___\".toInt()\n    \"0\".toInt()\n    \"-0\".toInt()\n    module.catch(() -> \"1.2\".toInt())\n    module.catch(() -> \"9223372036854775808\".toInt())\n    module.catch(() -> \"-9223372036854775809\".toInt())\n    module.catch(() -> \"abc\".toInt())\n    module.catch(() -> \"_1_000\".toInt())\n  }\n\n  [\"toIntOrNull()\"] {\n    \"123\".toIntOrNull()\n    \"-123\".toIntOrNull()\n    \"1_2__3___\".toIntOrNull()\n    \"-1_2__3___\".toIntOrNull()\n    \"0\".toIntOrNull()\n    \"-0\".toIntOrNull()\n    \"1.2\".toIntOrNull()\n    \"9223372036854775808\".toIntOrNull()\n    \"-9223372036854775809\".toIntOrNull()\n    \"abc\".toIntOrNull()\n    \"_1_2__3___\".toIntOrNull()\n  }\n\n  [\"toFloat()\"] {\n    \"0\".toFloat()\n    \"-0\".toFloat()\n    \".0\".toFloat()\n    \"-.0\".toFloat()\n    \"0.00\".toFloat()\n    \"-0.00\".toFloat()\n    \"123\".toFloat()\n    \"-123\".toFloat()\n    \"0.45\".toFloat()\n    \"-0.45\".toFloat()\n    \".45\".toFloat()\n    \"-.45\".toFloat()\n    \"123.45\".toFloat()\n    \"-123.45\".toFloat()\n    \"123e9\".toFloat()\n    \"123E9\".toFloat()\n    \"-123e9\".toFloat()\n    \"123.45e9\".toFloat()\n    \"-123.45e9\".toFloat()\n    \".45e9\".toFloat()\n    \"-.45e9\".toFloat()\n    \"123.45e+9\".toFloat()\n    \"-123.45e+9\".toFloat()\n    \"-123.45E+9\".toFloat()\n    \"-.45e+9\".toFloat()\n    \".45e+9\".toFloat()\n    \"123.45e-9\".toFloat()\n    \"-123.45e-9\".toFloat()\n    \"-123.45E-9\".toFloat()\n    \".45e-9\".toFloat()\n    \"-.45e-9\".toFloat()\n    \"9e1024\".toFloat()\n    \"-9e1024\".toFloat()\n    \"-1_2__3___.2_e+1_\".toFloat()\n    module.catch(() -> \"abc\".toFloat())\n    module.catch(() -> \"123._34\".toFloat())\n    module.catch(() -> \"123e_34\".toFloat())\n  }\n\n  [\"toFloatOrNull()\"] {\n    \"0\".toFloatOrNull()\n    \"-0\".toFloatOrNull()\n    \"abc\".toFloatOrNull()\n    \"_123_.1_\".toFloatOrNull()\n  }\n\n  [\"take()\"] {\n    \"\".take(0)\n    \"\".take(42)\n    str1.take(0)\n    str1.take(3)\n    str1.take(42)\n    module.catch(() -> str1.take(-1))\n  }\n\n  [\"takeWhile()\"] {\n    \"\".takeWhile((ch) -> true)\n    \"\".takeWhile((ch) -> false)\n    str1.takeWhile((ch) -> true)\n    str1.takeWhile((ch) -> false)\n    str1.takeWhile((ch) -> ch <= \"c\")\n    module.catch(() -> str1.takeWhile((_) -> 42))\n  }\n\n  [\"takeLast()\"] {\n    \"\".takeLast(0)\n    \"\".takeLast(42)\n    str1.takeLast(0)\n    str1.takeLast(3)\n    str1.takeLast(42)\n    module.catch(() -> str1.takeLast(-1))\n  }\n\n  [\"takeLastWhile()\"] {\n    \"\".takeLastWhile((ch) -> true)\n    \"\".takeLastWhile((ch) -> false)\n    str1.takeLastWhile((ch) -> true)\n    str1.takeLastWhile((ch) -> false)\n    str1.takeLastWhile((ch) -> ch > \"c\")\n    module.catch(() -> str1.takeLastWhile((_) -> 42))\n  }\n\n  [\"drop()\"] {\n    \"\".drop(0)\n    \"\".drop(42)\n    str1.drop(0)\n    str1.drop(3)\n    str1.drop(42)\n    module.catch(() -> str1.drop(-1))\n  }\n\n  [\"dropWhile()\"] {\n    \"\".dropWhile((ch) -> true)\n    \"\".dropWhile((ch) -> false)\n    str1.dropWhile((ch) -> true)\n    str1.dropWhile((ch) -> false)\n    str1.dropWhile((ch) -> ch <= \"c\")\n    module.catch(() -> str1.dropWhile((_) -> 42))\n  }\n\n  [\"dropLast()\"] {\n    \"\".dropLast(0)\n    \"\".dropLast(42)\n    str1.dropLast(0)\n    str1.dropLast(3)\n    str1.dropLast(42)\n    module.catch(() -> str1.dropLast(-1))\n  }\n\n  [\"dropLastWhile()\"] {\n    \"\".dropLastWhile((ch) -> true)\n    \"\".dropLastWhile((ch) -> false)\n    str1.dropLastWhile((ch) -> true)\n    str1.dropLastWhile((ch) -> false)\n    str1.dropLastWhile((ch) -> ch > \"c\")\n    module.catch(() -> str1.dropLastWhile((_) -> 42))\n  }\n\n  [\"substring()\"] {\n    str1.substring(2, 2)\n    str1.substring(2, 3)\n    str1.substring(2, 4)\n    str1.substring(0, 7)\n    module.catch(() -> str1.substring(-1, 4))\n    module.catch(() -> str1.substring(1, 8))\n    module.catch(() -> str1.substring(3, 2))\n  }\n\n  [\"substringOrNull()\"] {\n    str1.substringOrNull(2, 2)\n    str1.substringOrNull(2, 3)\n    str1.substringOrNull(2, 4)\n    str1.substringOrNull(0, 7)\n    str1.substringOrNull(-1, 4)\n    str1.substringOrNull(1, 8)\n    str1.substringOrNull(3, 2)\n  }\n\n  [\"getOrNull()\"] {\n    str1.getOrNull(-1)\n    str1.getOrNull(0)\n    str1.getOrNull(3)\n    str1.getOrNull(6)\n    str1.getOrNull(7)\n  }\n\n  [\"toCodePoints()\"] {\n    str1.codePoints\n    \"\".codePoints\n  }\n\n  [\"padStart()\"] {\n    \"\".padStart(0, \"x\")\n    \"\".padStart(1, \"x\")\n    \"\".padStart(3, \"x\")\n    str1.padStart(1, \" \")\n    str1.padStart(7, \" \")\n    str1.padStart(10, \" \")\n    module.catch(() -> str1.padStart(10, \"\"))\n    module.catch(() -> str1.padStart(10, \"aa\"))\n  }\n\n  [\"padEnd()\"] {\n    \"\".padEnd(0, \"x\")\n    \"\".padEnd(1, \"x\")\n    \"\".padEnd(3, \"x\")\n    str1.padEnd(1, \" \")\n    str1.padEnd(7, \" \")\n    str1.padEnd(10, \" \")\n    module.catch(() -> str1.padEnd(10, \"\"))\n    module.catch(() -> str1.padEnd(10, \"aa\"))\n  }\n\n  [\"toBooleanOrNull()\"] {\n    \"true\".toBooleanOrNull()\n    \"tRuE\".toBooleanOrNull()\n    \"TRUE\".toBooleanOrNull()\n    \"false\".toBooleanOrNull()\n    \"fAlSe\".toBooleanOrNull()\n    \"FALSE\".toBooleanOrNull()\n    \"other\".toBooleanOrNull()\n    \"OTHER\".toBooleanOrNull()\n    \"\".toBooleanOrNull()\n  }\n\n  [\"repeat()\"] {\n    str1.repeat(0)\n    str1.repeat(1)\n    str1.repeat(5)\n    \"\".repeat(0)\n    \"\".repeat(1)\n    \"\".repeat(5)\n    module.catch(() -> str1.repeat(-1))\n  }\n\n  [\"sha1\"] {\n    \"\".sha1\n    quickBrownFox.sha1\n  }\n\n  [\"sha256\"] {\n    \"\".sha256\n    quickBrownFox.sha256\n  }\n\n  [\"sha256Int\"] {\n    \"\".sha256Int\n    quickBrownFox.sha256Int\n  }\n\n  [\"md5\"] {\n    \"\".md5\n    quickBrownFox.md5\n  }\n\n  [\"base64\"] {\n    \"\".base64\n    quickBrownFox.base64\n  }\n\n  [\"base64Decoded\"] {\n    module.catch(() -> \"~~~\".base64Decoded)\n  }\n  \n  [\"base64DecodedBytes\"] {\n    module.catch(() -> \"~~~\".base64DecodedBytes)\n    \"AQIDBA==\".base64DecodedBytes\n  }\n  \n  [\"encodeToBytes()\"] {\n    \"~~~\".encodeToBytes(\"UTF-8\")\n    \"🏀\".encodeToBytes(\"UTF-8\")\n    \"~~~\".encodeToBytes(\"UTF-16\")\n    \"🏀\".encodeToBytes(\"UTF-16\")\n    \"~~~\".encodeToBytes(\"ISO-8859-1\")\n    \"🏀\".encodeToBytes(\"ISO-8859-1\")\n    \"Parrot\".encodeToBytes(\"UTF-8\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/stringUnicode.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal str1 = \"😀😈😍😎😡🤢🤣\"\nlocal str2 = \"😍😎😡\"\n\nfacts {\n  [\"isEmpty\"] {\n    !str1.isEmpty\n  }\n\n  [\"isBlank\"] {\n    // all 25 Unicode characters with \"White_Space\" property\n    \"\\u{0009}\\u{000A}\\u{000B}\\u{000C}\\u{000D}\\u{0020}\\u{0085}\\u{00A0}\\u{1680}\\u{2000}\\u{2001}\\u{2002}\\u{2003}\\u{2004}\\u{2005}\\u{2006}\\u{2007}\\u{2008}\\u{2009}\\u{200A}\\u{2028}\\u{2029}\\u{202F}\\u{205F}\\u{3000}\".isBlank\n    !str1.isBlank\n  }\n\n  [\"lastIndex\"] {\n    for (s in List(str1, str2)) {\n      s.length == s.lastIndex + 1\n    }\n  }\n\n  [\"base64Decoded\"] {\n    str1.base64.base64Decoded == str1\n    str2.base64.base64Decoded == str2\n  }\n\n  [\"contains()\"] {\n    str1.contains(str2)\n    str1.contains(str1)\n    !str2.contains(str1)\n    str1.contains(Regex(\"😍.+🤢\"))\n    !str1.contains(Regex(\"🤢.+😍\"))\n  }\n\n  [\"matches()\"] {\n    str1.matches(Regex(\"😀.+🤣\"))\n    str1.matches(Regex(\"😀😈😍😎😡🤢🤣\"))\n    !str1.matches(Regex(\"😀.+😎\"))\n  }\n\n  [\"startsWith()\"] {\n    str1.startsWith(\"😀😈😍\")\n    str1.startsWith(Regex(\"😀.+😍\"))\n    !str1.startsWith(\"😀😈x\")\n    !str1.startsWith(Regex(\"😍.+😀\"))\n  }\n\n  [\"endsWith()\"] {\n    str1.endsWith(\"😡🤢🤣\")\n    !str1.endsWith(\"😡🤢x\")\n  }\n\n  [\"isRegex\"] {\n    str1.isRegex\n    #\"😍*[😎😡]\"#.isRegex\n  }\n\n  [\"capitalize\"] {\n    str1.capitalize() == str1\n    \"ångström\".capitalize() == \"Ångström\"\n  }\n\n  [\"decapitalize\"] {\n    str1.decapitalize() == str1\n    \"Ångström\".decapitalize() == \"ångström\"\n  }\n}\n\nexamples {\n  [\"length\"] {\n    str1.length\n  }\n\n  [\"indexOf()\"] {\n    str1.indexOf(\"😍😎😡\")\n    module.catch(() -> str1.indexOf(\"😍😎x\"))\n    str1.indexOf(Regex(\"😍😎😡\"))\n    module.catch(() -> str1.indexOf(Regex(\".?😎x\")))\n  }\n\n  [\"indexOfNull()\"] {\n    str1.indexOfOrNull(\"😍😎😡\")\n    str1.indexOfOrNull(\"😍😎x\")\n    str1.indexOfOrNull(Regex(\".?😎😡\"))\n    str1.indexOfOrNull(Regex(\".?😎x\"))\n  }\n\n  [\"reverse()\"] {\n    str1.reverse()\n  }\n\n  local str3 = \"😀😈x😀😈y😀😈z\"\n\n  [\"lastIndexOf()\"] {\n    str3.lastIndexOf(\"😀😈\")\n    module.catch(() -> str3.lastIndexOf(\"😍😎x\"))\n    str3.lastIndexOf(Regex(\"😀😈\"))\n    module.catch(() -> str3.lastIndexOf(Regex(\"😍😎x\")))\n  }\n\n  [\"lastIndexOfOrNull()\"] {\n    str3.lastIndexOfOrNull(\"😀😈\")\n    str3.lastIndexOfOrNull(\"😍😎x\")\n  }\n\n  local str4 = \"😀😀😈😈😍😍😀😀😈😈😍😍\"\n\n  [\"split()\"] {\n    str4.split(\"😀😈\")\n    str4.split(Regex(\"[😀😈]\"))\n  }\n\n  [\"replaceAll()\"] {\n    str4.replaceAll(\"😀😀\", \"xx\")\n    str4.replaceAll(Regex(\"(😀+)😈\"), \"($0|$1)\")\n    module.catch(() -> str4.replaceAll(Regex(\"[😀😈]\"), \"$4; no such group\"))\n  }\n\n  [\"replaceFirst()\"] {\n    str4.replaceFirst(\"😀😀\", \"xx\")\n    str4.replaceFirst(Regex(\"(😀+)😈\"), \"($0|$1)\")\n    module.catch(() -> str4.replaceFirst(Regex(\"[😀😈]\"), \"$4; no such group\"))\n  }\n\n  [\"replaceLast()\"] {\n    str4.replaceLast(\"😀😀\", \"xx\")\n    str4.replaceLast(Regex(\"(😀+)😈\"), \"($0|$1)\")\n    module.catch(() -> str4.replaceLast(Regex(\"[😀😈]\"), \"$4; no such group\"))\n  }\n\n  [\"replaceAllMapped()\"] {\n    str4.replaceAllMapped(\"😀😀\", (it) -> \"├\\(it)┤\")\n    str4.replaceAllMapped(Regex(\"(😀+)😈\"), (it) -> \"├\\(it)┤\")\n  }\n\n  [\"replaceFirstMapped()\"] {\n    str4.replaceFirstMapped(\"😀😀\", (it) -> \"├\\(it)┤\")\n    str4.replaceFirstMapped(Regex(\"(😀+)😈\"), (it) -> \"├\\(it)┤\")\n  }\n\n  [\"replaceLastMapped()\"] {\n    str4.replaceLastMapped(\"😀😀\", (it) -> \"├\\(it)┤\")\n    str4.replaceLastMapped(Regex(\"(😀+)😈\"), (it) -> \"├\\(it)┤\")\n  }\n\n  [\"replaceRange()\"] {\n    str4.replaceRange(5, 10, \"├┤\")\n    str4.replaceRange(10, 12, \"extend beyond 😀 string end\")\n    module.catch(() -> str4.replaceRange(0, 100, \"_😀_\"))\n    module.catch(() -> str4.replaceRange(-10, 5, \"_😀_\"))\n  }\n\n\n  [\"toUpperCase()\"] {\n    \"😀😈😍\".toUpperCase()\n  }\n\n  [\"toLowerCase()\"] {\n    \"😀😈😍\".toLowerCase()\n  }\n\n  local str5 = \" \\t 😀😈😍😎😡🤢🤣 \\t \\n\"\n\n  [\"trim()\"] {\n    str5.trim()\n  }\n\n  [\"trimStart()\"] {\n    str5.trimStart()\n  }\n\n  [\"trimEnd()\"] {\n    str5.trimEnd()\n  }\n\n  [\"chars\"] {\n    str1.chars\n  }\n\n  [\"codePoints\"] {\n    str1.codePoints\n  }\n\n  [\"toInt()\"] {\n    module.catch(() -> \"😀😈😍\".toInt())\n  }\n\n  [\"toIntOrNull()\"] {\n    str1.toIntOrNull()\n    str2.toIntOrNull()\n    str3.toIntOrNull()\n  }\n\n  [\"toFloat()\"] {\n    module.catch(() -> \"😀😈😍\".toFloat())\n  }\n\n  [\"toFloatOrNull()\"] {\n    str1.toFloatOrNull()\n    str2.toFloatOrNull()\n    str3.toFloatOrNull()\n  }\n\n  [\"take()\"] {\n    str1.take(0)\n    str1.take(3)\n    str1.take(42)\n    module.catch(() -> str1.take(-1))\n  }\n\n  [\"takeWhile()\"] {\n    str1.takeWhile((ch) -> true)\n    str1.takeWhile((ch) -> false)\n    str1.takeWhile((ch) -> ch <= \"😍\")\n    module.catch(() -> str1.takeWhile((ch) -> 42))\n  }\n\n  [\"takeLast()\"] {\n    str1.takeLast(0)\n    str1.takeLast(3)\n    str1.takeLast(42)\n    module.catch(() -> str1.takeLast(-1))\n  }\n\n  [\"takeLastWhile()\"] {\n    str1.takeLastWhile((ch) -> true)\n    str1.takeLastWhile((ch) -> false)\n    str1.takeLastWhile((ch) -> ch > \"😍\")\n    module.catch(() -> str1.takeLastWhile((ch) -> 42))\n  }\n\n  [\"drop()\"] {\n    str1.drop(0)\n    str1.drop(3)\n    str1.drop(42)\n    module.catch(() -> str1.drop(-1))\n  }\n\n  [\"dropWhile()\"] {\n    str1.dropWhile((ch) -> true)\n    str1.dropWhile((ch) -> false)\n    str1.dropWhile((ch) -> ch <= \"😍\")\n    module.catch(() -> str1.dropWhile((ch) -> 42))\n  }\n\n  [\"dropLast()\"] {\n    str1.dropLast(0)\n    str1.dropLast(3)\n    str1.dropLast(42)\n    module.catch(() -> str1.dropLast(-1))\n  }\n\n  [\"dropLastWhile()\"] {\n    str1.dropLastWhile((ch) -> true)\n    str1.dropLastWhile((ch) -> false)\n    str1.dropLastWhile((ch) -> ch > \"😍\")\n    module.catch(() -> str1.dropLastWhile((ch) -> 42))\n  }\n\n  [\"substring()\"] {\n    str1.substring(2, 2)\n    str1.substring(2, 3)\n    str1.substring(2, 4)\n    str1.substring(0, 7)\n    module.catch(() -> str1.substring(-1, 4))\n    module.catch(() -> str1.substring(1, 8))\n    module.catch(() -> str1.substring(3, 2))\n  }\n\n  [\"substringOrNull()\"] {\n    str1.substringOrNull(2, 2)\n    str1.substringOrNull(2, 3)\n    str1.substringOrNull(2, 4)\n    str1.substringOrNull(0, 7)\n    str1.substringOrNull(-1, 4)\n    str1.substringOrNull(1, 8)\n    str1.substringOrNull(3, 2)\n  }\n\n  [\"getOrNull()\"] {\n    str1.getOrNull(-1)\n    str1.getOrNull(0)\n    str1.getOrNull(3)\n    str1.getOrNull(6)\n    str1.getOrNull(7)\n  }\n\n  [\"toBoolean()\"] {\n    module.catch(() -> \"(😍😎😡\".toBoolean())\n  }\n\n  [\"toBooleanOrNull()\"] {\n    \"(😍😎😡\".toBooleanOrNull()\n  }\n\n  [\"repeat()\"] {\n    str1.repeat(0)\n    str1.repeat(1)\n    str1.repeat(5)\n  }\n\n  [\"sha1\"] {\n    str1.sha1\n    str2.sha1\n  }\n  \n  [\"sha256\"] {\n    str1.sha256\n    str2.sha256\n  }\n  \n  [\"sha256Int\"] {\n    str1.sha256Int\n    str2.sha256Int\n  }\n\n  [\"md5\"] {\n    str1.md5\n    str2.md5\n  }\n  \n  [\"base64\"] {\n    str1.base64\n    str2.base64\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/typeAliases.pkl",
    "content": "import \"pkl:test\"\n\nres1: UInt8 = 255\nres2: Int8 = -128\n\nres3: UInt16 = 65535\nres4: Int16 = -32768\n\nres5: UInt32 = 4294967295\nres6: Int32 = -2147483648\n\nres7: UInt = 9223372036854775807\n\nres8: Uri = \"https://apple.com\"\n\nres8b: NonNull = 42\n\nclass Good {\n  res9: UInt8 = 255\n  res10: Int8 = -128\n\n  res11: UInt16 = 65535\n  res12: Int16 = -32768\n\n  res13: UInt32 = 4294967295\n  res14: Int32 = -2147483648\n\n  res15: UInt = 9223372036854775807\n\n  res16: Uri = \"https://apple.com\"\n\n  res16b: NonNull = 42\n}\n\ngood = new Good {}\n\nclass Bad {\n  res17: UInt8 = 256\n  res18: Int8 = -129\n\n  res19: UInt16 = 65536\n  res20: Int16 = -32769\n\n  res21: UInt32 = 4294967296\n  res22: Int32 = -2147483649\n\n  res23: UInt = -1\n\n  res24: Uri = 42\n\n  res24b: NonNull = null\n  res24c: NonNull = Null(new Bad {})\n}\n\nlocal bad = new Bad {}\n\nres17 = test.catch(() -> bad.res17)\nres18 = test.catch(() -> bad.res18)\n\nres19 = test.catch(() -> bad.res19)\nres20 = test.catch(() -> bad.res20)\n\nres21 = test.catch(() -> bad.res21)\nres22 = test.catch(() -> bad.res22)\n\nres23 = test.catch(() -> bad.res23)\n\nres24 = test.catch(() -> bad.res24)\n\nres24b = test.catch(() -> bad.res24b)\nres24c = test.catch(() -> bad.res24c)\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/typeConverters.pkl",
    "content": "open class Animal {\n  name: String\n}\n\nopen class Bird extends Animal {}\n\nopen class Cat extends Animal {}\n\nclass Goose extends Bird {}\n\nclass Swallow extends Bird {}\n\nclass Robin extends Bird {}\n\nanimals = new Listing {\n  new Animal {\n    name = \"Wolf\"\n  }\n  new Bird {\n    name = \"Tweet\"\n  }\n  new Cat {\n    name = \"Whiskers\"\n  }\n  new Goose {\n    name = \"Neck\"\n  }\n  new Swallow {\n    name = \"Snow\"\n  }\n  new Robin {\n    name = \"Rainbow\"\n  }\n}\n\noutput {\n  renderer = new PcfRenderer {\n    converters {\n      [Animal] = (a) -> \"\\(a.name) Animal\"\n      [Goose] = (a) -> \"Angry \\(a.name)\"\n      [Bird] = (a) -> \"Mr. \\(a.name)\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/typed.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class Empty\n\nlocal open class Animal {\n  species: String\n  age: Int\n  numberOfFeet: Int = 2\n}\n\nlocal class Dinosaur extends Animal {\n  isExtinct: Boolean = true\n}\n\nlocal dino = new Dinosaur {\n  numberOfFeet = 4\n}\n\nlocal pigeon = new Animal {\n  local n = \"Pigeon\"\n  species = n\n  age = 5\n}\n\nexamples {\n  [\"getProperty()\"] {\n    pigeon.getProperty(\"species\")\n    pigeon.getProperty(\"spe\" + \"cies\")\n    pigeon.getProperty(\"age\")\n    module.catch(() -> pigeon.getProperty(\"other\"))\n  }\n\n  [\"getPropertyOrNull()\"] {\n    pigeon.getPropertyOrNull(\"species\")\n    pigeon.getPropertyOrNull(\"speci\" + \"es\")\n    pigeon.getPropertyOrNull(\"age\")\n    pigeon.getPropertyOrNull(\"other\")\n  }\n\n  [\"hasProperty()\"] {\n    pigeon.hasProperty(\"species\")\n    pigeon.hasProperty(\"specie\" + \"s\")\n    pigeon.hasProperty(\"age\")\n    pigeon.hasProperty(\"other\")\n\n    pigeon.hasProperty(\"numberOfFeet\")\n    dino.hasProperty(\"numberOfFeet\")\n    dino.hasProperty(\"isAlive\")\n  }\n\n  [\"toDynamic()\"] {\n    local dynPigeon = pigeon.toDynamic()\n    dynPigeon\n    dynPigeon.getClass().simpleName\n    (dynPigeon) {\n      age = \"age\" // change type\n      [\"isExtinct\"] = false // add new property\n    }\n    (new Animal { species = \"Pigeon\"; age = species.length }.toDynamic()) {\n      species = \"Pigeon\" // no dynamic binding\n    }\n  }\n\n  [\"toMap()\"] {\n    local mapPigeon = pigeon.toMap()\n    mapPigeon\n    mapPigeon.getClass().simpleName\n    new Empty {}.toMap()\n    pigeon.toDynamic().toMap()\n    new Dynamic { species = \"Pigeon\"; age = species.length }.toMap() + Map(\n        \"species\", \"Pigeon\"\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer1.xml.pkl",
    "content": "import \"pkl:xml\"\n\nclass Person {\n  name: String\n  age: Int\n  address: Address\n  friend: Person?\n}\n\nclass Address {\n  street: String\n}\n\nint = 123\n\nfloat = 1.23\n\nbool = true\n\nstring = \"Pigeon\"\n\nunicodeString = \"abc😀abc😎abc\"\n\nmultiLineString = \"\"\"\n  have a\n  great\n  day\n  \"\"\"\n\ntypedObject = new Person {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  friend = null\n}\n\ndynamicObject {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  friend = null\n}\n\noutput {\n  renderer = new xml.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer2.xml.pkl",
    "content": "import \"pkl:xml\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"one\", true, \"two\", 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\" }\nres15 = null\n\noutput {\n  renderer = new xml.Renderer {\n    indent = \"    \"\n    converters {\n      [String] = (it) -> it.reverse()\n      [Boolean] = (it) -> !it\n      [Int] = (it) -> it + 1\n      [Float] = (it) -> it + 1.1\n      [Duration] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [DataSize] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [List] = (it) -> it.reverse()\n      [Set] = (it) -> it + List(4)\n      [Map] = (it) -> it + Map(\"three\", 3.s)\n      [Listing] = (it) -> (it) { 4 }\n      [Mapping] = (it) -> (it) { [\"three\"] = 3.s }\n      [Dynamic] = (it) -> (it) { other = \"other\" }\n      [Person] = (it) -> (it) { age = 40 } // fill in missing property\n      [Null] = (it) -> \"String\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer2b.pkl",
    "content": "import \"pkl:xml\"\n\nlocal renderer = new xml.Renderer {\n  converters {\n    [\"^apple\"] = (it) -> it.toUpperCase()\n    [\"^[*].apple\"] = (it) -> it.toUpperCase()\n    [\"^[apple]\"] = (it) -> it.toUpperCase()\n  }\n}\n\nlocal properties = renderer.renderDocument(\n  new Dynamic {\n    apple = \"yes\"\n    banana {\n      apple = \"no\"\n    }\n  })\n\nres1 = properties.contains(\"YES\")\nres2 = properties.contains(\"no\")\nres3 = !properties.contains(\"yes\")\nres4 = !properties.contains(\"NO\")\n\nlocal elements = renderer.renderDocument(\n  new Dynamic {\n    new {\n      apple = \"yes\"\n    }\n    new {\n      new {\n        apple = \"no\"\n      }\n    }\n  })\n\nres5 = elements.contains(\"YES\")\nres6 = elements.contains(\"no\")\nres7 = !elements.contains(\"yes\")\nres8 = !elements.contains(\"NO\")\n\nlocal entries = renderer.renderValue(\n  new Dynamic {\n    [\"apple\"] = \"yes\"\n    [\"banana\"] {\n      [\"apple\"] = \"no\"\n    }\n  })\n\nres9 = entries.contains(\"YES\")\nres10 = entries.contains(\"no\")\nres11 = !entries.contains(\"yes\")\nres12 = !entries.contains(\"NO\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer3.xml.pkl",
    "content": "import \"pkl:xml\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"string\", true, 42, 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\"; age = 30 }\nres15 = null\n\noutput {\n  renderer = new xml.Renderer {\n    converters {\n      [String] = (it) -> \"converted\"\n      [Boolean] = (it) -> \"converted\"\n      [Int] = (it) -> \"converted\"\n      [Float] = (it) -> \"converted\"\n      [Duration] = (it) -> \"converted\"\n      [DataSize] = (it) -> \"converted\"\n      [List] = (it) -> \"converted\"\n      [Set] = (it) -> \"converted\"\n      [Map] = (it) -> \"converted\"\n      [Listing] = (it) -> \"converted\"\n      [Mapping] = (it) -> \"converted\"\n      [Dynamic] = (it) -> \"converted\"\n      [Person] = (it) -> \"converted\"\n      [Null] = (it) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer4.pkl",
    "content": "import \"pkl:test\"\nimport \"pkl:xml\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new xml.Renderer {}\n\nres1 = renderer.renderValue(123)\nres2 = renderer.renderValue(1.23)\nres3 = renderer.renderValue(false)\nres4 = renderer.renderValue(\"pigeon\")\nres6 = renderer.renderValue(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderValue(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderValue(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderValue(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderValue(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderValue(new Person { name = \"pigeon\"; age = 42 })\n\nres14 = test.catch(() -> renderer.renderValue(null))\nres15 = test.catch(() -> renderer.renderValue(1.min))\nres16 = test.catch(() -> renderer.renderValue(1.mb))\nres17 = test.catch(() -> renderer.renderValue(Person))\nres18 = test.catch(() -> renderer.renderValue(Email))\nres19 = test.catch(() -> renderer.renderValue((x) -> x))\nres20 = test.catch(() -> new xml.Renderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\nres21 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))\nres22 = test.catch(() -> renderer.renderValue(Pair(1,2)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer5.pkl",
    "content": "import \"pkl:test\"\nimport \"pkl:xml\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new xml.Renderer {}\n\nres1 = renderer.renderDocument(123)\nres2 = renderer.renderDocument(1.23)\nres3 = renderer.renderDocument(false)\nres4 = renderer.renderDocument(\"pigeon\")\nres6 = renderer.renderDocument(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderDocument(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderDocument(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderDocument(new Person { name = \"pigeon\"; age = 42 })\n\nres14 = test.catch(() -> renderer.renderDocument(null))\nres15 = test.catch(() -> renderer.renderDocument(1.min))\nres16 = test.catch(() -> renderer.renderDocument(1.mb))\nres17 = test.catch(() -> renderer.renderDocument(Person))\nres18 = test.catch(() -> renderer.renderDocument(Email))\nres19 = test.catch(() -> renderer.renderDocument((x) -> x))\nres20 = test.catch(() -> new xml.Renderer { converters { [Int] = (i) -> throw(\"ouch\") } }.renderDocument(42))\nres21 = test.catch(() -> renderer.renderDocument(IntSeq(1, 4)))\nres22 = test.catch(() -> renderer.renderDocument(Pair(1, 2)))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer6.xml.pkl",
    "content": "import \"pkl:xml\"\n\nname = \"pigeon\"\nage = 42\nfriends = new Listing {\n  \"barn owl\"\n  \"parrot\"\n}\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\n\noutput {\n  renderer = new xml.Renderer {\n    converters {\n      [\"name\"] = (it) -> it.reverse()\n      [\"friends[*]\"] = (it) -> it + \"x\"\n      [\"hobbies[*]\"] = (it) -> it.skill\n      [\"address.street\"] = (it) -> \"Other St.\"\n      [\"address.*\"] = (it) -> \"changed\"\n      [\"unmatched\"] = (it) -> \"unmatched\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer8.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nimport \"pkl:xml\"\n\nm = new Mixin {}\n\noutput {\n  renderer = new xml.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRenderer9.xml.pkl",
    "content": "import \"pkl:xml\"\n\nimport \".../input-helper/api/annotationConverter.pkl\"\n\n@xml.Property { name = \"FOO\" }\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n}\n\noutput {\n  renderer = new xml.Renderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \"<!-- \"; suffix = \" -->\" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererCData.xml.pkl",
    "content": "import \"pkl:xml\"\n\nres1 = xml.CData(\"The <drumroll>Dodos</drumroll>\")\nres2 = xml.CData(\"Malicious CDATA input: ]]><script>doMaliciousThing();</script>\")\n\noutput {\n  renderer = new xml.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererElement.xml.pkl",
    "content": "import \"pkl:xml\"\n\ndiskSizes = new Listing { 1200.gb; 2.tb }\n\noutput {\n  renderer = new xml.Renderer {\n    rootElementName = \"machine\"\n    converters {\n      [\"diskSizes\"] = (dss) -> dss.toList().map((ds) -> (xml.Element(\"disk\")) { (xml.Element(ds.unit)) { ds.value } })\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererHtml.xml.pkl",
    "content": "// a glimpse into rendering markup with XmlRenderer\nimport \"pkl:xml\"\n\nfunction h1() = xml.Element(\"h1\")\nfunction ul() = xml.Element(\"ul\")\nfunction li() = xml.Element(\"li\")\nfunction strong() = (xml.Element(\"strong\")) { isBlockFormat = false }\nfunction comment(text: String) = xml.Comment(text)\n\nhobbies {\n  \"swimming\"\n  \"surfing\"\n  \"fire making\"\n}\n\nhtml {\n  body {\n    comment(\"this is a comment\")\n    (h1()) {\n      \"My \" hobbies.toList().length \" \" (strong()) { \"favorite\" } \" hobbies:\"\n    }\n    (ul()) {\n      for (hobby in hobbies) {\n        (li()) { hobby }\n      }\n    }\n  }\n}\n\noutput {\n  value = html\n  renderer = new xml.Renderer {\n    rootElementName = \"html\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererInline.xml.pkl",
    "content": "import \"pkl:xml\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ncontent {\n  xml.Inline(List(\"pigeon\", \"parrot\"))\n  xml.Inline(Set(\"pigeon\", \"parrot\"))\n  xml.Inline(new Listing { \"pigeon\"; \"parrot\" })\n  xml.Inline(Map(\"name\", \"pigeon\", \"age\", 42))\n  xml.Inline(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\n  xml.Inline(new Dynamic { name = \"pigeon\"; age = 42 })\n  xml.Inline(new Person { name = \"pigeon\"; age = 42 })\n}\n\noutput {\n  renderer = new xml.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererInline2.xml.pkl",
    "content": "import \"pkl:xml\"\n\norder {\n  items {\n    new { name = \"banana\"; quantity = 42 }\n    new { name = \"orange\"; quantity = 21 }\n  }\n}\n\noutput {\n  renderer = new xml.Renderer {\n    converters {\n      [\"order.items\"] = (it) -> xml.Inline(it) // remove `items` (repeated element)\n      [\"order.items[*]\"] = (it) -> (xml.Element(\"item\")) { xml.Inline(it) } // element + inline = rename\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererInline3.xml.pkl",
    "content": "import \"pkl:xml\"\nimport \"pkl:test\"\n\nlocal pigeon = new {\n  name = \"Pigeon\"\n  age = 42\n}\n\nres1 = (xml.Element(\"pigeon2\")) { xml.Inline(pigeon) }\n\nres2 = test.catch(() -> output.renderer.renderValue(\n  new Dynamic { x = xml.Inline((xml.Element(\"pigeon2\")) { pigeon }) }))\n\nres3 = test.catch(() -> output.renderer.renderValue(\n  new Dynamic { x = xml.Inline(xml.Inline(pigeon)) }))\n\noutput {\n  renderer = new xml.Renderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererValidation10.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:xml\"\n\nlocal function render(value: Any) = new xml.Renderer { xmlVersion = \"1.0\" }.renderValue(value)\n\nexamples {\n  [\"invalid attribute\"] {\n    module.catch(() ->\n      render((xml.Element(\"bar\")) {\n        attributes {\n          [\"bar baz\"] = \"biz\"\n        }\n      })\n    )\n  }\n  [\"colons are allowed\"] {\n    render((xml.Element(\"bar\")) {\n      attributes {\n        [\"xs:myTag\"] = \"my tag value\"\n      }\n    })\n  }\n  [\"escaping attribute values\"] {\n    render((xml.Element(\"bar\")) {\n      attributes {\n        [\"bar\"] = \"buz\\\"><script>maliciousThing();</script>\"\n      }\n    })\n  }\n  [\"invalid element name\"] {\n    module.catch(() ->\n      render(xml.Element(\"bar>\"))\n    )\n  }\n  [\"invalid empty element name\"] {\n    module.catch(() -> render((xml.Element(\"foo\")) {\n      name = \"\"\n    }))\n  }\n  [\"invalid empty attribute name\"] {\n    module.catch(() -> render((xml.Element(\"div\")) {\n      attributes {\n        [\"\"] = \"bar\"\n      }\n    }))\n  }\n  [\"Unicode element name is not allowed\"] {\n    module.catch(() ->\n      render(xml.Element(\"😍😎😡\"))\n    )\n  }\n  [\"Unicode attribute name is not allowed\"] {\n    module.catch(() -> render((xml.Element(\"div\")) {\n        attributes {\n          [\"😍😎😡\"] = \"bar\"\n        }\n      }))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/xmlRendererValidation11.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:xml\"\n\nlocal function render(value: Any) = new xml.Renderer { xmlVersion = \"1.1\" }.renderValue(value)\n\nexamples {\n  [\"invalid attribute\"] {\n    module.catch(() ->\n      render((xml.Element(\"bar\")) {\n        attributes {\n          [\"bar baz\"] = \"biz\"\n        }\n      })\n    )\n  }\n  [\"colons are allowed\"] {\n    render((xml.Element(\"bar\")) {\n      attributes {\n        [\"xs:myTag\"] = \"my tag value\"\n      }\n    })\n  }\n  [\"escaping attribute values\"] {\n    render((xml.Element(\"bar\")) {\n      attributes {\n        [\"bar\"] = \"buz\\\"><script>maliciousThing();</script>\"\n      }\n    })\n  }\n  [\"invalid element name\"] {\n    module.catch(() ->\n      render(xml.Element(\"bar>\"))\n    )\n  }\n  [\"invalid empty element name\"] {\n    module.catch(() -> render((xml.Element(\"foo\")) {\n      name = \"\"\n    }))\n  }\n  [\"invalid empty attribute name\"] {\n    module.catch(() -> render((xml.Element(\"div\")) {\n      attributes {\n        [\"\"] = \"bar\"\n      }\n    }))\n  }\n  [\"Unicode element name is allowed\"] {\n    render(xml.Element(\"😍😎😡\"))\n  }\n  [\"Unicode attribute name is allowed\"] {\n    render((xml.Element(\"div\")) {\n      attributes {\n        [\"😍😎😡\"] = \"bar\"\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser1Compat.pkl",
    "content": "extends \"../snippetTest.pkl\"\n\nimport \"pkl:yaml\"\n\nhidden parser: yaml.Parser = new { mode = \"compat\" }\n\nexamples {\n  [\"null\"] {\n    parser.parse(\"null\")\n    parser.parse(\"Null\")\n    parser.parse(\"NULL\")\n    parser.parse(\"NuLl\") // never null\n  }\n\n  [\"boolean\"] {\n    parser.parse(\"y\")\n    parser.parse(\"Y\")\n    parser.parse(\"yes\")\n    parser.parse(\"Yes\")\n    parser.parse(\"YES\")\n    parser.parse(\"YeS\")   // never boolean\n    parser.parse(\"n\")\n    parser.parse(\"N\")\n    parser.parse(\"no\")\n    parser.parse(\"No\")\n    parser.parse(\"NO\")\n    parser.parse(\"nO\")    // never boolean\n    parser.parse(\"true\")\n    parser.parse(\"True\")\n    parser.parse(\"TRUE\")\n    parser.parse(\"TrUe\")  // never boolean\n    parser.parse(\"false\")\n    parser.parse(\"False\")\n    parser.parse(\"FALSE\")\n    parser.parse(\"FaLsE\") // never boolean\n    parser.parse(\"on\")\n    parser.parse(\"On\")\n    parser.parse(\"ON\")\n    parser.parse(\"oN\")    // never boolean\n    parser.parse(\"off\")\n    parser.parse(\"Off\")\n    parser.parse(\"OFF\")\n    parser.parse(\"OfF\")   // never boolean\n  }\n\n  [\"int\"] {\n    parser.parse(\"123\")\n    parser.parse(\"-123\")\n    parser.parse(\"+123\")\n    parser.parse(\"0b1001\")   // binary (1.1)\n    parser.parse(\"-0b1001\")  // neg. binary (1.1)\n    parser.parse(\"+0b1001\")  // pos. binary (1.1)\n    parser.parse(\"0123\")     // octal (1.1), decimal (1.2)\n    parser.parse(\"-0123\")    // neg. octal (1.1), neg. decimal (1.2)\n    parser.parse(\"+0123\")    // pos. octal (1.1), pos. decimal (1.2)\n    parser.parse(\"0o123\")    // octal (1.2)\n    parser.parse(\"-0o123\")   // never int\n    parser.parse(\"+0o123\")   // never int\n    parser.parse(\"0x1A3\")    // hexadecimal\n    parser.parse(\"-0x1A3\")   // neg. hexadecimal (1.1)\n    parser.parse(\"+0x1A3\")   // pos. hexadecimal (1.1)\n    parser.parse(\"59:30:1\")  // base 60 (1.1)\n    parser.parse(\"-59:30:1\") // neg. base 60 (1.1)\n    parser.parse(\"+59:30:1\") // pos. base 60 (1.1)\n    parser.parse(\"1_2_3\")    // separator (1.1)\n  }\n  \n  [\"float\"] {\n    parser.parse(\"123.456\")\n    parser.parse(\"0123.456\")    // leading zero (1.2)\n    parser.parse(\"-123.456\")\n    parser.parse(\"+123.456\")\n    parser.parse(\"123.456e2\")\n    parser.parse(\"123.456E2\")\n    parser.parse(\"123.456e-2\")\n    parser.parse(\"123.456E+2\")\n    parser.parse(\"-123.456e+2\")\n    parser.parse(\"+123.456E+2\")\n    parser.parse(\"59:30:1.234\")  // base 60 (1.1)\n    parser.parse(\"-59:30:1.234\") // neg. base 60 (1.1)\n    parser.parse(\"+59:30:1.234\") // pos. base 60 (1.1)\n    parser.parse(\"1_2_3.456\")    // separator (1.1)\n    parser.parse(\"1_2_3.4_5_6\")  // separator (1.1 with our spec fix)\n    parser.parse(\".\")            // zero (1.1, no revision/erratum exists)\n    parser.parse(\".___\")         // zero (1.1 with our spec fix, no revision/erratum exists)\n    \n    parser.parse(\".inf\")\n    parser.parse(\".Inf\")\n    parser.parse(\".INF\")\n    parser.parse(\".InF\")  // never float\n    parser.parse(\"+.inf\")\n    parser.parse(\"+.Inf\")\n    parser.parse(\"+.INF\")\n    parser.parse(\"+.InF\") // never float\n    parser.parse(\"-.inf\")\n    parser.parse(\"-.Inf\")\n    parser.parse(\"-.INF\")\n    parser.parse(\"-.InF\") // never float\n    parser.parse(\".nan\")\n    parser.parse(\".NaN\")\n    parser.parse(\".NAN\")\n    parser.parse(\".nAn\")  // never float\n  }\n\n  // parsed as string because Pkl doesn't have a timestamp type\n  [\"timestamp\"] {\n    parser.parse(\"2001-12-15T02:59:43.1Z\")\n    parser.parse(\"2011-11-18 19:00:59\")\n    parser.parse(\"!!timestamp 2001-12-15T02:59:43.1Z\")\n  }\n\n  [\"binary\"] {\n    parser.parse(\"!!binary AQID\")\n    parser.parse(\"!!binary 'AQID'\")\n    parser.parse(\"!!binary \\\"AQID\\\"\")\n    parser.parse(\"\"\"\n      !!binary |-\n        AQID\n        AQID\n        AQID\n      \"\"\")\n  }\n\n  [\"string\"] {\n    // empty document is `null` according to YAML spec\n    parser.parse(\"\")\n    parser.parse(\"   \")\n\n    parser.parse(\"hello\")\n    parser.parse(\"hello\\nworld\")\n    parser.parse(\"\"\"\n      hello\n      world\n      \"\"\")\n\n    parser.parse(\"\"\"\n      x: |\n        hello\n        world\n      \"\"\")\n\n    parser.parse(\"\"\"\n      x: >\n        hello\n        world\n      \"\"\")\n  }\n\n  [\"sequence\"] {\n    parser.parse(\"\"\"\n      - one\n      - two\n      - three\n      \"\"\")\n\n    parser.parse(\"\"\"\n      !!set\n      ? one\n      ? two\n      ? three\n      \"\"\")\n  }\n\n  [\"mapping\"] {\n    parser.parse(\"\"\"\n      name: Pigeon\n      age: 42\n      \"\"\")\n\n    parser.parse(\"\"\"\n      ? - foo\n        - bar\n      : [one, two]\n      \"\"\")\n  }\n  \n  [\"real-world example\"] {\n    // from: https://yaml.org/start.html\n    parser.parse(\"\"\"\n      ---\n      invoice: 34843\n      date   : 2001-01-23\n      bill-to: &id001\n          given  : Chris\n          family : Dumars\n          address:\n              lines: |\n                  458 Walkman Dr.\n                  Suite #292\n              city    : Royal Oak\n              state   : MI\n              postal  : 48046\n      ship-to: *id001\n      product:\n          - sku         : BL394D\n            quantity    : 4\n            description : Basketball\n            price       : 450.00\n          - sku         : BL4438H\n            quantity    : 1\n            description : Super Hoop\n            price       : 2392.00\n      tax  : 251.42\n      total: 4443.52\n      logo: !!binary AQID\n      comments: >\n          Late afternoon is best.\n          Backup contact is Nancy\n          Billsmer @ 338-4338.\n      \"\"\")\n  }\n\n  [\"invalid syntax\"] {\n    module.catch(() -> parser.parse(\"!@#$%\"))\n  }\n\n  [\"wrong tag/node combination\"] {\n    module.catch(() -> parser.parse(\"\"\"\n        !!set\n        - one\n        - two\n        - three\n        \"\"\"))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser1Yaml11.pkl",
    "content": "amends \"yamlParser1Compat.pkl\"\n\nparser { mode = \"1.1\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser1Yaml12.pkl",
    "content": "amends \"yamlParser1Compat.pkl\"\n\nparser { mode = \"1.2\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser2.pkl",
    "content": "import \"pkl:yaml\"\nimport \"pkl:test\"\n\nlocal parser = new yaml.Parser {}\n\nres1 = parser.parse(\"\"\"\n  msg1: &one This is a message.\n  msg2: *one\n  \"\"\")\n\n// merge keys were dropped in yaml 1.2; `<<` is now a normal key\nres2 = parser.parse(\"\"\"\n  pigeon: &one\n    name: pigeon\n    age: 42\n  pigeon2:\n    <<: *one\n    age: 21\n  \"\"\")\n\nres3 = parser.parse(\"\"\"\n  # comment\n  name: pigeon\n  # comment 2\n  age: 42\n  \"\"\")\n\nres4 = parser.parse(\"\"\"\n  %YAML 1.2\n  ---\n  name: pigeon\n  age: 42\n  \"\"\")\n\nres5 = parser.parse(\"\"\"\n  ---\n  name: pigeon\n  age: 42\n  ...\n  \"\"\")\n\nres6 = parser.parse(\"\")\n\nres7 = test.catch(() -> parser.parse(\"\"\"\n  ---\n  name: pigeon\n  ---\n  age: 42\n  \"\"\"))\n\n/// \"nothing\"\nres8 = parser.parseAll(\"\")\nres9 = parser.parseAll(\"   \")\n\n// empty document\nres10 = parser.parseAll(\"\"\"\n---\n\"\"\")\n\n// empty documents\nres11 = parser.parseAll(\"\"\"\n---\n---\n---\n\"\"\")\n\n// empty document between non-empty documents\nres12 = parser.parseAll(\"\"\"\n---\n123\n---\n---\n456\n\"\"\")\n\nres13 = parser.parseAll(\"\"\"\n  name: pigeon\n  \"\"\")\n\nres14 = parser.parseAll(\"\"\"\n  ---\n  name: pigeon\n  \"\"\")\n\nres15 = parser.parseAll(\"\"\"\n  ---\n  name: pigeon\n  ---\n  age: 42\n  ---\n  hobby: surfing\n  ...\n  \"\"\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser3.pkl",
    "content": "import \"pkl:yaml\"\n\nlocal parser = new yaml.Parser {\n  converters {\n    [Boolean] = (it) -> !it\n    [String] = (it) -> it + \"x\"\n    [Int] = (it) -> it + 1\n    [Float] = (it) -> it + 1.23\n    [Dynamic] = (it) -> (it) { other = \"other\" }\n    [Listing] = (it) -> (it) { \"other\" }\n  }\n}\n\nres1 = parser.parse(\"\"\"\n  ---\n  invoice: 34843\n  date   : 2001-01-23\n  bill-to: &id001\n      given  : Chris\n      family : Dumars\n      address:\n          lines: |\n              458 Walkman Dr.\n              Suite #292\n          city    : Royal Oak\n          state   : MI\n          postal  : 48046\n  ship-to: *id001\n  product:\n      - sku         : BL394D\n        quantity    : 4\n        description : Basketball\n        price       : 450.00\n      - sku         : BL4438H\n        quantity    : 1\n        description : Super Hoop\n        price       : 2392.00\n  tax  : 251.42\n  total: 4443.52\n  comments: >\n      Late afternoon is best.\n      Backup contact is Nancy\n      Billsmer @ 338-4338.\n  \"\"\")\n\nres2 = parser.parseAll(\"\"\"\n  ---\n  invoice: 34843\n  date   : 2001-01-23\n  bill-to: &id001\n      given  : Chris\n      family : Dumars\n      address:\n          lines: |\n              458 Walkman Dr.\n              Suite #292\n          city    : Royal Oak\n          state   : MI\n          postal  : 48046\n  ship-to: *id001\n  ---\n  product:\n      - sku         : BL394D\n        quantity    : 4\n        description : Basketball\n        price       : 450.00\n      - sku         : BL4438H\n        quantity    : 1\n        description : Super Hoop\n        price       : 2392.00\n  ---\n  tax  : 251.42\n  total: 4443.52\n  comments: >\n      Late afternoon is best.\n      Backup contact is Nancy\n      Billsmer @ 338-4338.\n  \"\"\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser4.pkl",
    "content": "import \"pkl:yaml\"\n\nlocal parser = new yaml.Parser {\n  converters {\n    [\"^invoice\"] = (_) -> 99999\n    [\"given\"] = (_) -> \"Pigeon\"\n    [\"^family\"] = (_) -> \"no match\"\n    [\"bill-to.family\"] = (it) -> it.reverse()\n    [\"address.city\"] = (it) -> it.toUpperCase()\n    [\"state\"] = (_) -> \"CA\"\n    [\"product[*].quantity\"] = (it) -> it * 2\n    [\"product[*].price\"] = (it) -> it * 2\n  }\n}\n\nres1 = parser.parse(\"\"\"\n  ---\n  invoice: 34843\n  date   : 2001-01-23\n  bill-to: &id001\n      given  : Chris\n      family : Dumars\n      address:\n          lines: |\n              458 Walkman Dr.\n              Suite #292\n          city    : Royal Oak\n          state   : MI\n          postal  : 48046\n  ship-to: *id001\n  product:\n      - sku         : BL394D\n        quantity    : 4\n        description : Basketball\n        price       : 450.00\n      - sku         : BL4438H\n        quantity    : 1\n        description : Super Hoop\n        price       : 2392.00\n  tax  : 251.42\n  total: 4443.52\n  comments: >\n      Late afternoon is best.\n      Backup contact is Nancy\n      Billsmer @ 338-4338.\n  \"\"\")\n\nres2 = parser.parseAll(\"\"\"\n  ---\n  invoice: 34843\n  date   : 2001-01-23\n  bill-to: &id001\n      given  : Chris\n      family : Dumars\n      address:\n          lines: |\n              458 Walkman Dr.\n              Suite #292\n          city    : Royal Oak\n          state   : MI\n          postal  : 48046\n  ship-to: *id001\n  ---\n  product:\n      - sku         : BL394D\n        quantity    : 4\n        description : Basketball\n        price       : 450.00\n      - sku         : BL4438H\n        quantity    : 1\n        description : Super Hoop\n        price       : 2392.00\n  ---\n  tax  : 251.42\n  total: 4443.52\n  comments: >\n      Late afternoon is best.\n      Backup contact is Nancy\n      Billsmer @ 338-4338.\n  \"\"\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser5.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"pkl:yaml\"\n\nlocal parser: yaml.Parser = new {\n  maxCollectionAliases = 1\n}\n\nexamples {\n  [\"maxCollectionAliases -- happy path\"] {\n    parser.parse(\"\"\"\n      lol1: &lol1 [\"lol\"]\n      lol2: *lol1\n      \"\"\"\n    )\n  }\n  [\"maxCollectionAliases -- failing\"] {\n    module.catch(() -> parser.parse(\"\"\"\n      lol1: &lol1 [\"lol\"]\n      lol2: *lol1\n      lol3: *lol1\n      \"\"\"))\n  }\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlParser6.pkl",
    "content": "import \"pkl:yaml\"\n\nlocal parser = new yaml.Parser {\n  useMapping = true\n}\n\nlocal parsed = parser.parse(\"\"\"\n  foo: bar\n  baz:\n    -\n      biz: biz\n      buz: buz\n  \"\"\")\n\nres1 = parsed\n\nres2 = parsed is Mapping\n\nres3 = parsed[\"baz\"][0] is Mapping\n\nres4 = parser.parse(\"\"\"\n  ? baz: qux\n  : 2\n  foo: bar\n  \"\"\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer1.yml.pkl",
    "content": "pigeon {\n  name = \"pigeon\"\n  age = 30\n}\n\noutput {\n  value = pigeon\n  renderer = new YamlRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer10.yml.pkl",
    "content": "import \"pkl:yaml\"\n\nimport \".../input-helper/api/annotationConverter.pkl\"\n\nclass Tag extends ConvertProperty {\n  tag: String(startsWith(\"!\"))\n\n  render = (prop, renderer) ->\n    if (renderer is YamlRenderer)\n      Pair(prop.key, new RenderDirective {\n        text = \" \\(tag) \\(renderer.renderValue(prop.value))\"\n      })\n    else\n      prop\n}\n\n@yaml.Property { name = \"FOO\" }\nfoo: String = \"a\"\n\n@annotationConverter.LineComment { text = \"bar\" }\nbar: String = \"b\"\n\nbaz: Nested\n\nclass Nested {\n  @annotationConverter.LineComment { text = \"qux\" }\n  qux: String = \"c\"\n\n  quux: String = \"c\"\n\n  @Tag { tag = \"!!foo\" }\n  quuux: String = \"d\"\n}\n\noutput {\n  renderer = new YamlRenderer {\n    convertPropertyTransformers {\n      [annotationConverter.LineComment] { prefix = \" # \"; valuePrefix = \" \" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer2.yml.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"one\", true, \"two\", 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\" }\nres15 = null\nres16 = Pair(1, 2)\nres17 = Bytes()\nres18 = Bytes(1, 2, 3)\nres19 = IntSeq(0, 127).toList().toBytes()\n\noutput {\n  renderer = new YamlRenderer {\n    indentWidth = 4\n    converters {\n      [String] = (it) -> it.reverse()\n      [Boolean] = (it) -> !it\n      [Int] = (it) -> it + 1\n      [Float] = (it) -> it + 1.1\n      [Duration] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [DataSize] = (it) -> \"\\(it.value) \\(it.unit)\"\n      [List] = (it) -> it.reverse()\n      [Set] = (it) -> it + List(4)\n      [Map] = (it) -> it + Map(\"three\", 3.s)\n      [Listing] = (it) -> (it) { 4 }\n      [Mapping] = (it) -> (it) { [\"three\"] = 3.s }\n      [Dynamic] = (it) -> (it) { other = \"other\" }\n      [Person] = (it) -> (it) { age = 40 } // fill in missing property\n      [Null] = (_) -> \"String\"\n      [Pair] = (it) -> List(it.first, it.second)\n      [IntSeq] = (it) -> List(it.start, it.end, it.step)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer2b.pkl",
    "content": "local renderer = new YamlRenderer {\n  converters {\n    [\"^apple\"] = (it) -> it.toUpperCase()\n    [\"^[*].apple\"] = (it) -> it.toUpperCase()\n    [\"^[apple]\"] = (it) -> it.toUpperCase()\n  }\n}\n\nlocal properties = renderer.renderDocument(\n  new Dynamic {\n    apple = \"yes\"\n    banana {\n      apple = \"no\"\n    }\n  })\n\nres1 = properties.contains(\"YES\")\nres2 = properties.contains(\"no\")\nres3 = !properties.contains(\"yes\")\nres4 = !properties.contains(\"NO\")\n\nlocal elements = renderer.renderDocument(\n  new Dynamic {\n    new {\n      apple = \"yes\"\n    }\n    new {\n      new {\n        apple = \"no\"\n      }\n    }\n  })\n\nres5 = elements.contains(\"YES\")\nres6 = elements.contains(\"no\")\nres7 = !elements.contains(\"yes\")\nres8 = !elements.contains(\"NO\")\n\nlocal entries = renderer.renderValue(\n  new Dynamic {\n    [\"apple\"] = \"yes\"\n    [\"banana\"] {\n      [\"apple\"] = \"no\"\n    }\n  })\n\nres9 = entries.contains(\"YES\")\nres10 = entries.contains(\"no\")\nres11 = !entries.contains(\"yes\")\nres12 = !entries.contains(\"NO\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer3.yml.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1 = \"string\"\nres2 = true\nres3 = 42\nres4 = 1.23\nres5 = 3.s\nres6 = 4.mb\nres8 = List(\"string\", true, 42)\nres9 = Set(\"string\", true, 42)\nres10 = Map(\"string\", true, 42, 1.23)\nres11 = new Listing { \"string\"; true; 42 }\nres12 = new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 30 }\nres13 = new Dynamic { name = \"pigeon\"; age = 30 }\nres14 = new Person { name = \"pigeon\"; age = 30 }\nres15 = null\nres16 = Pair(1, 2)\nres17 = Bytes(1, 2, 3)\n\noutput {\n  renderer = new YamlRenderer {\n    converters {\n      [String] = (it) -> \"converted\"\n      [Boolean] = (it) -> \"converted\"\n      [Int] = (it) -> \"converted\"\n      [Float] = (it) -> \"converted\"\n      [Duration] = (it) -> \"converted\"\n      [DataSize] = (it) -> \"converted\"\n      [List] = (it) -> \"converted\"\n      [Set] = (it) -> \"converted\"\n      [Map] = (it) -> \"converted\"\n      [Listing] = (it) -> \"converted\"\n      [Mapping] = (it) -> \"converted\"\n      [Dynamic] = (it) -> \"converted\"\n      [Person] = (it) -> \"converted\"\n      [Null] = (it) -> \"converted\"\n      [Pair] = (it) -> \"converted\"\n      [IntSeq] = (it) -> \"converted\"\n      [Bytes] = (it) -> \"converted\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer4.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new YamlRenderer {}\n\nres1 = renderer.renderValue(123)\nres2 = renderer.renderValue(1.23)\nres3 = renderer.renderValue(false)\nres4 = renderer.renderValue(\"pigeon\")\nres6 = renderer.renderValue(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderValue(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderValue(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderValue(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderValue(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderValue(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderValue(new Person { name = \"pigeon\"; age = 42 })\nres13 = renderer.renderValue(null)\n\nres14 = test.catch(() -> renderer.renderValue(1.min))\nres15 = test.catch(() -> renderer.renderValue(Pair(1, 2)))\nres16 = test.catch(() -> renderer.renderValue(1.mb))\nres17 = test.catch(() -> renderer.renderValue(Person))\nres18 = test.catch(() -> renderer.renderValue(Email))\nres19 = test.catch(() -> renderer.renderValue((x) -> x))\nres20 = test.catch(() -> new YamlRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderValue(42))\nres21 = test.catch(() -> renderer.renderValue(IntSeq(1, 4)))\nres22 = test.catch(() -> renderer.renderDocument(new Dynamic { foo = \"foo\"; 5 }))\nres23 = test.catch(() -> renderer.renderDocument(new Dynamic { [\"foo\"] = \"foo\"; 5 }))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer5.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n  age: Int\n}\n\ntypealias Email = String\n\nlocal renderer = new YamlRenderer {}\n\nres1 = renderer.renderDocument(123)\nres2 = renderer.renderDocument(1.23)\nres3 = renderer.renderDocument(false)\nres4 = renderer.renderDocument(\"pigeon\")\nres6 = renderer.renderDocument(List(\"pigeon\", \"parrot\"))\nres7 = renderer.renderDocument(Set(\"pigeon\", \"parrot\"))\nres8 = renderer.renderDocument(Map(\"name\", \"pigeon\", \"age\", 42))\nres9 = renderer.renderDocument(new Listing { \"pigeon\"; \"parrot\" })\nres10 = renderer.renderDocument(new Mapping { [\"name\"] = \"pigeon\"; [\"age\"] = 42 })\nres11 = renderer.renderDocument(new Dynamic { name = \"pigeon\"; age = 42 })\nres12 = renderer.renderDocument(new Person { name = \"pigeon\"; age = 42 })\nres13 = renderer.renderDocument(null)\n\nres14 = test.catch(() -> renderer.renderDocument(1.min))\nres15 = test.catch(() -> renderer.renderDocument(Pair(1, 2)))\nres16 = test.catch(() -> renderer.renderDocument(1.mb))\nres17 = test.catch(() -> renderer.renderDocument(Person))\nres17b = test.catch(() -> renderer.renderDocument(Email))\nres18 = test.catch(() -> renderer.renderDocument((x) -> x))\nres19 = test.catch(() -> new YamlRenderer { converters { [Int] = (_) -> throw(\"ouch\") } }.renderDocument(42))\nres20 = test.catch(() -> renderer.renderDocument(IntSeq(1, 4)))\nres21 = test.catch(() -> renderer.renderDocument(new Dynamic { foo = \"foo\"; 5 }))\nres22 = test.catch(() -> renderer.renderDocument(new Dynamic { [\"foo\"] = \"foo\"; 5 }))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer6.yml.pkl",
    "content": "name = \"pigeon\"\nage = 42\nfriends = new Listing {\n  \"barn owl\"\n  \"parrot\"\n}\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\n\noutput {\n  renderer = new YamlRenderer {\n    converters {\n      [\"name\"] = (it) -> it.reverse()\n      [\"friends[*]\"] = (it) -> it + \"x\"\n      [\"hobbies[*]\"] = (it) -> it.skill\n      [\"address.street\"] = (it) -> \"Other St.\"\n      [\"address.*\"] = (it) -> \"changed\"\n      [\"unmatched\"] = (it) -> \"unmatched\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer7.pkl",
    "content": "// Test that unrenderable types do have an informative location in the error message.\nm = new Mixin {}\n\noutput {\n  renderer = new YamlRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer8.yml.pkl",
    "content": "// Test that non-String scalars can be rendered as YAML map keys.\nmappingInt = new Mapping {\n  [5] = \"abc\"\n  [10] = \"def\"\n  [20] = \"ghi\"\n}\n\nmapInt = mappingInt.toMap()\n\nmappingFloat = new Mapping {\n  [5.0] = \"abc\"\n  [10.5] = \"def\"\n  [20.999999990] = \"ghi\"\n}\n\nmapFloat = mappingFloat.toMap()\n\nmappingBool = new Mapping {\n  [true] = \"abc\"\n  [false] = \"def\"\n}\n\nmapBool = mappingBool.toMap()\n\nmappingNull = new Mapping {\n  [null] = \"abc\"\n}\n\nmapNull = mappingNull.toMap()\n\noutput {\n  renderer = new YamlRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRenderer9.yml.pkl",
    "content": "// test escaping in double quotes\n// every string is prefixed with `\\t` s.t. YamlRenderer will emit double-quoted strings.\n\n`null` = \"\\t\\u{00}\"\n\nbell = \"\\t\\u{7}\"\n\nbackspace = \"\\t\\u{8}\"\n\nhorizontalTab = \"\\t\"\n\nlineFeed = \"\\t\\u{a}\"\n\nverticalTab = \"\\t\\u{b}\"\n\nformFeed = \"\\t\\u{c}\"\n\ncarriageReturn = \"\\t\\r\"\n\nescape = \"\\t\\u{1b}\"\n\ndoubleQuote = \"\\t\\\"\"\n\nbackslash = \"\\t\\\\\"\n\nnextLine = \"\\t\\u{85}\"\n\nnbsp = \"\\t\\u{a0}\"\n\nlineSep = \"\\t\\u{2028}\"\n\nparagraphSep = \"\\t\\u{2029}\"\n\noutput {\n  renderer = new YamlRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererBug66849708.yml.pkl",
    "content": "object {\n  nullable = null\n  property = \"value\"\n}\n\nmapping {\n  [\"nullable\"] = null\n  [\"key\"] = \"value\"\n}\n\nmap = Map(\"nullable\", null, \"key\", \"value\")\n\noutput {\n  renderer = new YamlRenderer {\n    omitNullProperties = true\n    converters {\n      [\"object.property\"] = (it) -> \"converted\"\n      [\"mapping[key]\"] = (it) -> \"converted\"\n      [\"map[key]\"] = (it) -> \"converted\"\n    }\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererEmpty.yml.pkl",
    "content": "a1 = List()\na2 = Set()\na3 = new Listing {}\n\nb1 = new Dynamic {}\nb2 = new Person {}\nb3 = new Mapping {}\nb4 = Map()\n\nc1 {\n  List()\n  Set()\n  new Listing {}\n}\nc2 {\n  x1 = List()\n  x2 = Set()\n  x3 = new Listing {}\n}\n\nd1 {\n  new Dynamic {}\n  new Person {}\n  new Mapping {}\n  Map()\n}\nd2 {\n  x1 = new Dynamic {}\n  x2 = new Person {}\n  x3 = new Mapping {}\n  x4 = Map()\n}\n\ne1 {\n  new {\n    List()\n    Set()\n    new Listing {}\n  }\n}\ne2 {\n  new Listing {\n    List()\n    Set()\n    new Listing {}\n  }\n}\n\nf1 {\n  new {\n    new Dynamic {}\n    new Person {}\n    new Mapping {}\n    Map()\n  }\n}\nf2 {\n  new Listing {\n    new Dynamic {}\n    new Person {}\n    new Mapping {}\n    Map()\n  }\n}\n\nclass Person\n\noutput {\n  renderer = new YamlRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererIndentationWidth2.yml.pkl",
    "content": "name = \"pigeon\"\nage = 42\nfriends {\n  \"barn owl\"\n  \"parrot\"\n}\nnestedFriends {\n  new {\n    \"barn owl\"\n    \"parrot\"\n  }\n  new {\n    \"elf owl\"\n    \"albatross\"\n  }\n}\nnestedFriends2 {\n  new {\n    name = \"barn owl\"\n  }\n  new {\n    name = \"parrot\"\n  }\n}\nhobbies {\n  [\"surfing\"] {\n    skill = \"low\"\n  }\n  [\"firemaking\"] {\n    skill = \"high\"\n  }\n}\nnestedHobbies {\n  [\"surfing\"] {\n    [\"waves\"] {\n      skill = \"low\"\n    }\n  }\n  [\"firemaking\"] {\n    [\"woods\"] {\n      skill = \"high\"\n    }\n  }\n}\naddress {\n  street = \"Norton St.\"\n  zip = 12345\n}\nnestedAddress {\n  street {\n    name = \"Norton St.\"\n  }\n  zip {\n    number = 12345\n  }\n}\nmultiline = \"\"\"\n  one\n  two\n  three\n  \"\"\"\n\nmultiline2 = \"\"\"\n    one\n  two\n  three\n  \"\"\"\noutput {\n  renderer = new YamlRenderer {\n    indentWidth = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererIndentationWidth4.yml.pkl",
    "content": "amends \"yamlRendererIndentationWidth2.yml.pkl\"\n\noutput {\n  renderer = new YamlRenderer {\n    indentWidth = 4\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererIndentationWidth5.yml.pkl",
    "content": "amends \"yamlRendererIndentationWidth2.yml.pkl\"\n\noutput {\n  renderer = new YamlRenderer {\n    indentWidth = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererKeys.yml.pkl",
    "content": "// need quoting\n`one[two` = 42\n`one]two` = 42\n`one{two` = 42\n`one}two` = 42\n`one,two` = 42\n\n// need quoting\nentries {\n  [\"one[two\"] = 42\n  [\"one]two\"] = 42\n  [\"one{two\"] = 42\n  [\"one}two\"] = 42\n  [\"one,two\"] = 42\n}\n\n// don't need quoting\na1 = \"one[two\"\na2 = \"one]two\"\na3 = \"one{two\"\na4 = \"one}two\"\na5 = \"one,two\"\n\nentries2 {\n  // needs explicit key\n  [\"one\\ntwo\"] = 42\n  // needs explicit key\n  [\"a\".repeat(1025)] = 42\n  // doesn't need explicit key\n  [\"a\".repeat(1024)] = 42\n}\n\noutput {\n  renderer = new YamlRenderer {}\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererStream1.pkl",
    "content": "local renderer = new YamlRenderer { isStream = true }\n\nlocal stream = new Listing {\n  \"pigeon\"\n  42\n  new Listing {\n    \"barn owl\"\n    \"parrot\"\n  }\n  new Mapping {\n    [\"surfing\"] {\n      skill = \"low\"\n    }\n    [\"firemaking\"] {\n      skill = \"high\"\n    }\n  }\n  new Dynamic {\n    street = \"Norton St.\"\n    zip = 12345\n  }\n}\n\na = renderer.renderDocument(stream)\n\nb = renderer.renderDocument(stream.toList())\n\nc = renderer.renderDocument(stream.toSet())\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererStream2.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nlocal class Foo\n\nlocal renderer = new YamlRenderer { isStream = true }\n\nexamples {\n  [\"multiline string at end of document\"] {\n    renderer.renderDocument(new Listing {\n      new Dynamic {\n        x = \"one\\ntwo\"\n      }\n      new Dynamic {\n        x = \"other\"\n      }\n    })\n  }\n  [\"multiline string at end of stream\"] {\n    renderer.renderDocument(new Listing {\n      new Dynamic {\n        x = \"other\"\n      }\n      new Dynamic {\n        x = \"one\\ntwo\"\n      }\n    })\n  }\n  [\"invalid top level value\"] {\n    module.catch(() -> renderer.renderDocument(5))\n    module.catch(() -> renderer.renderDocument(new Foo {}))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererStrings.yml.pkl",
    "content": "// only newlines\na1 = \"\\n\"\na2 = \"\\n\\n\"\na3 = \"\\n\\n\\n\"\n\n// leading newlines\nb1 = \"\\none\"\nb2 = \"\\n\\none\"\nb3 = \"\\n\\n\\none\"\n\n// intermediate newlines\nc1 = \"one\\ntwo\"\nc2 = \"one\\n\\ntwo\"\nc3 = \"one\\n\\n\\ntwo\"\n\n// trailing newlines\nd1 = \"one\\n\"\nd2 = \"one\\n\\n\"\nd3 = \"one\\n\\n\\n\"\n\n// only spaces\ne1 = \"\"\ne2 = \" \"\ne3 = \"   \"\n\n// leading spaces\nf1 = \" one\"\nf2 = \"   one\"\n\n// trailing spaces\ng1 = \"one \"\ng2 = \"one   \"\n\n// control characters\nh1 = \"\\t\"\nh2 = \"one\\ttwo\"\nh3 = \"\\r\"\nh4 = \"one\\rtwo\"\nh5 = \"\\u{7}\"\nh6 = \"one\\u{7}two\"\n\n// control characters in multiline strings\ni1 = \"one\\ttwo\\nthree\"\ni2 = \"one\\rtwo\\nthree\"\ni3 = \"one\\u{7}two\\nthree\"\n\n// leading spaces in multiline strings\nj1 = \" one\\ntwo\"\nj2 = \"   one\\ntwo\"\nj3 = \"one\\n   two\"\n\n// trailing spaces in multiline strings\nk1 = \"one\\ntwo \"\nk2 = \"one\\ntwo   \"\nk3 = \"one   \\ntwo\"\n\n// only newlines and spaces\nl1 = \"\\n   \"\nl2 = \"   \\n\"\nl3 = \"   \\n   \"\nl4 = \"\\n   \\n\"\n\nm1 = \"foo:\"\nm2 = \"foo::\"\nm3 = \"foo:foo\"\n\nn1 {\n  a {\n    b {\n      c = \"\"\"\n          my\n        multiline\n        string\n        \"\"\"\n    }\n  }\n}\n\no1 = \"%\"\no2 = \"%hello\"\no3 = \"\"\"\n  %\n  hello there\n  \"\"\"\n\np1 = \"-\"\np2 = \"?\"\np3 = \":\"\np4 = \"? apple\"\np5 = \": banana\"\np6 = \"- orange\"\np7 = \"\"\"\n  ?\n  apple\n  \"\"\"\np8 = \"\"\"\n  :\n  banana\n  \"\"\"\np9 = \"\"\"\n  -\n  orange\n  \"\"\"\np10 = \"?apple\"\np11 = \":banana\"\np12 = \"-orange\"\n\noutput {\n  renderer = new YamlRenderer {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererStringsCompat.pkl",
    "content": "extends \"../snippetTest.pkl\"\n\nhidden renderer: YamlRenderer = new { mode = \"compat\" }\n\nlocal function render(value) = renderer.renderValue(value)\n\nexamples {\n  [\"null like strings\"] {\n    render(\"null\")\n    render(\"Null\")\n    render(\"NULL\")\n    render(\"NuLl\") // never null\n  }\n\n  [\"boolean like strings\"] {\n    render(\"y\")\n    render(\"Y\")\n    render(\"yes\")\n    render(\"Yes\")\n    render(\"YES\")\n    render(\"YeS\")   // never boolean\n    render(\"n\")\n    render(\"N\")\n    render(\"no\")\n    render(\"No\")\n    render(\"NO\")\n    render(\"nO\")    // never boolean\n    render(\"true\")\n    render(\"True\")\n    render(\"TRUE\")\n    render(\"TrUe\")  // never boolean\n    render(\"false\")\n    render(\"False\")\n    render(\"FALSE\")\n    render(\"FaLsE\") // never boolean\n    render(\"on\")\n    render(\"On\")\n    render(\"ON\")\n    render(\"oN\")    // never boolean\n    render(\"off\")\n    render(\"Off\")\n    render(\"OFF\")\n    render(\"OfF\")   // never boolean\n  }\n\n  [\"int like strings\"] {\n    render(\"0\")\n    render(\"1\")\n    render(\"2\")\n    render(\"9\")\n    render(\"A\")        // never int\n    render(\"-0\")\n    render(\"+0\")\n    render(\"123\")\n    render(\"-123\")\n    render(\"+123\")\n    render(\"0b1001\")    // binary (1.1)\n    render(\"-0b1001\")   // neg. binary (1.1)\n    render(\"+0b1001\")   // pos. binary (1.1)\n    render(\"0123\")      // octal (1.1), decimal (1.2)\n    render(\"01234567\")  // octal (1.1), decimal (1.2)\n    render(\"-0123\")     // neg. octal (1.1), neg. decimal (1.2)\n    render(\"+0123\")     // pos. octal (1.1), pos. decimal (1.2)\n    render(\"0o123\")     // octal (1.2)\n    render(\"0o1234567\") // octal (1.2)\n    render(\"-0o123\")    // never int\n    render(\"+0o123\")    // never int\n    render(\"0x1A3\")     // hexadecimal\n    render(\"0xabcdef\")  // hexadecimal\n    render(\"-0x1A3\")    // neg. hexadecimal (1.1)\n    render(\"+0x1A3\")    // pos. hexadecimal (1.1)\n    render(\"59:30:1\")   // base 60 (1.1)\n    render(\"-59:30:1\")  // neg. base 60 (1.1)\n    render(\"+59:30:1\")  // pos. base 60 (1.1)\n    render(\"1_2_3\")     // separator (1.1)\n  }\n\n  [\"float like strings\"] {\n    render(\"0.\")\n    render(\".0\")\n    render(\"0.0\")\n    render(\"123.456\")\n    render(\"0123.456\")    // leading zero (1.2)\n    render(\"-123.456\")\n    render(\"+123.456\")\n    render(\"123.456e2\")\n    render(\"123.456E2\")\n    render(\"123.456e-2\")\n    render(\"123.456E+2\")\n    render(\"-123.456e+2\")\n    render(\"+123.456E+2\")\n    render(\"59:30:1.234\")  // base 60 (1.1)\n    render(\"-59:30:1.234\") // neg. base 60 (1.1)\n    render(\"+59:30:1.234\") // pos. base 60 (1.1)\n    render(\"1_2_3.456\")    // separator (1.1)\n    render(\"1_2_3.4_5_6\")  // separator (1.1 with our spec fix)\n    render(\".\")            // zero (1.1, no revision/erratum exists)\n    render(\".___\")         // zero (1.1 with our spec fix, no revision/erratum exists)\n\n    render(\".inf\")\n    render(\".Inf\")\n    render(\".INF\")\n    render(\".InF\")  // never float\n    render(\"+.inf\")\n    render(\"+.Inf\")\n    render(\"+.INF\")\n    render(\"+.InF\") // never float\n    render(\"-.inf\")\n    render(\"-.Inf\")\n    render(\"-.INF\")\n    render(\"-.InF\") // never float\n    render(\".nan\")\n    render(\".NaN\")\n    render(\".NAN\")\n    render(\".nAn\")  // never float\n  }\n\n  [\"tag like strings\"] {\n    \"!!bool true\"\n    \"!!str my string value\"\n  }\n\n  [\"number like string keys\"] {\n    render(new Dynamic {\n      `0` = \"0\"\n      `0.123` = \"0.123\"\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererStringsYaml11.pkl",
    "content": "amends \"yamlRendererStringsCompat.pkl\"\n\nrenderer { mode = \"1.1\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/api/yamlRendererStringsYaml12.pkl",
    "content": "amends \"yamlRendererStringsCompat.pkl\"\n\nrenderer { mode = \"1.2\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/amendsChains.pkl",
    "content": "foo {\n  bar { \"Hello\" }\n} {\n  bar { \"World\" }\n}\n  \nbar {\n  baz = new Listing {}\n} {\n  baz { \"first\" } { \"second\" \"third\" } { \"forth\" }\n}\n\nbaz = new Listing<Listing<Listing<Number>>> {\n    new { new { 1 } }\n    new { new { 2 } new { 2 2 } }\n    new { new { 3 } new { 3 3 } new { 3 3 3 } }\n  } {\n    [[ length > 1 ]] {\n      [[ toList().first < 3 ]] {\n        -3\n      } {\n        -30\n      }\n    } {\n      new Listing { 1.1 }\n    }\n  }.fold(List(), (acc, middle: Listing<Listing<Number>>) ->\n    middle.fold(acc, (_acc, inner) ->\n      inner.fold(_acc, (__acc, it) -> __acc.add(it))))\n\nqux {\n  (foo.bar) { \"world\" \"!\" } { [0] = \"Goodbye \"; [1] = \"cruel \" }.toList().join(\"\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/as.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal l = List(1, 2, 3)\n\nlocal set = Set(1, 2,3)\n\nlocal map = Map(1, \"one\", 2, \"two\", 3, \"three\")\n\nlocal open class Base\nlocal class Derived extends Base\n\nlocal base = new Base {}\n\nlocal derived = new Derived {}\n\nlocal pigeon = new Mapping { [\"name\"] = \"Pigeon\"; [\"age\"] = 40 }\n\nlocal f = (x) -> x\n\nlocal class Other\n\nexamples {\n  [\"String\"] {\n    \"abc\" as String\n  }\n\n  [\"Any\"] {\n    \"abc\" as Any\n    42 as Any\n    1.23 as Any\n    true as Any\n    false as Any\n    42.s as Any\n    42.b as Any\n    l as Any\n    set as Any\n    map as Any\n    null as Any\n    Null(new Base {}) as Any\n    base as Any\n    derived as Any\n    pigeon as Any\n  }\n\n  [\"Null\"] {\n    null as Null\n    Null(new Base {}) as Null\n    module.catch(() -> \"abc\" as Null)\n    module.catch(() -> 42 as Null)\n    module.catch(() -> 1.23 as Null)\n    module.catch(() -> true as Null)\n    module.catch(() -> false as Null)\n    module.catch(() -> 42.s as Null)\n    module.catch(() -> 42.b as Null)\n    module.catch(() -> l as Null)\n    module.catch(() -> set as Null)\n    module.catch(() -> map as Null)\n    module.catch(() -> base as Null)\n    module.catch(() -> derived as Null)\n    module.catch(() -> pigeon as Null)\n    module.catch(() -> Base as Null)\n    module.catch(() -> this as Null)\n    module.catch(() -> f as Null)\n  }\n\n  [\"Number\"] {\n    42 as Number\n    1.23 as Number\n  }\n\n  [\"Int\"] {\n    42 as Int\n    module.catch(() -> \"abc\" as Int)\n    module.catch(() -> 1.23 as Int)\n    module.catch(() -> true as Int)\n    module.catch(() -> false as Int)\n    module.catch(() -> 42.s as Int)\n    module.catch(() -> 42.b as Int)\n    module.catch(() -> l as Int)\n    module.catch(() -> set as Int)\n    module.catch(() -> map as Int)\n    module.catch(() -> null as Int)\n    module.catch(() -> Null(new Base {}) as Int)\n    module.catch(() -> base as Int)\n    module.catch(() -> f as Int)\n    module.catch(() -> derived as Int)\n    module.catch(() -> pigeon as Int)\n    module.catch(() -> Base as Int)\n    module.catch(() -> this as Int)\n  }\n\n  [\"Float\"] {\n    1.23 as Float\n    module.catch(() -> 42 as Float)\n  }\n\n  [\"Other\"] {\n    module.catch(() -> \"abc\" as Other)\n    module.catch(() -> 42 as Other)\n    module.catch(() -> 1.23 as Other)\n    module.catch(() -> true as Other)\n    module.catch(() -> false as Other)\n    module.catch(() -> 42.s as Other)\n    module.catch(() -> 42.b as Other)\n    module.catch(() -> l as Other)\n    module.catch(() -> set as Other)\n    module.catch(() -> map as Other)\n    module.catch(() -> null as Other)\n    module.catch(() -> Null(new Base {}) as Other)\n    module.catch(() -> base as Other)\n    module.catch(() -> derived as Other)\n    module.catch(() -> pigeon as Other)\n    module.catch(() -> Base as Other)\n    module.catch(() -> this as Other)\n    module.catch(() -> f as Other)\n  }\n\n  [\"Boolean\"] {\n    true as Boolean\n    false as Boolean\n  }\n\n  [\"Duration\"] {\n    42.s as Duration\n    module.catch(() -> 42.b as Duration)\n  }\n\n  [\"DataSize\"] {\n    42.b as DataSize\n    module.catch(() -> 42.s as DataSize)\n  }\n\n  [\"List\"] {\n    l as List\n    module.catch(() -> set as List)\n  }\n\n  [\"Set\"] {\n    module.catch(() -> l as Set)\n    set as Set\n  }\n\n  [\"Collection\"] {\n    l as Collection\n    set as Collection\n    module.catch(() -> map as Collection)\n  }\n\n  [\"Map\"] {\n    map as Map\n  }\n\n  [\"base class\"] {\n    base as Base\n    derived as Base\n  }\n\n  [\"derived class\"] {\n    derived as Derived\n    module.catch(() -> base as Derived)\n  }\n\n  [\"Mapping\"] {\n    pigeon as Mapping\n  }\n\n  [\"Function\"] {\n    (f as Function).apply(42)\n    (f as Function1).apply(42)\n    (f as Any).apply(42)\n    module.catch(() -> f as Function2)\n  }\n\n  [\"Class\"] {\n    (Base as Class).simpleName\n    (Base as Any).simpleName\n  }\n\n  [\"Module\"] {\n    (module as Module).examples[\"String\"][0]\n    (module as Any).examples[\"String\"][0]\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/as2.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"list\"] {\n    List(1, 2, 3) as List<Int>\n    module.catch(() -> List(1, 2, 3) as List<String>)\n    module.catch(() -> Set(1, 2, 3) as List<Int>)\n  }\n  \n  [\"set\"] {\n    module.catch(() -> List(1, 2, 3) as Set<Int>)\n    Set(1, 2, 3) as Set<Int>\n    module.catch(() -> Set(1, 2, 3) as Set<String>)\n  }\n  \n  [\"map\"] {\n    Map(\"Pigeon\", 42, \"Barn Owl\", 21) as Map<String, Int>\n    module.catch(() -> Map(\"Pigeon\", 42, \"Barn Owl\", 21) as Map<Int, String>)\n  }\n  \n  [\"listing\"] {\n    new Listing { 1; 2; 3 } as Listing<Int>\n    module.catch(() -> (new Listing { 1; 2; 3 } as Listing<String>)[0])\n  }\n  \n  [\"cast Listing<UInt32> to other integer types\"] {\n    local l = new Listing<UInt32> { 9999999 }\n    (l as Listing<Int>)[0]\n    (l as Listing<UInt>)[0]\n    (l as Listing<Int32>)[0]\n    (l as Listing<UInt32>)[0]\n    module.catch(() -> (l as Listing<Int16>)[0])\n    module.catch(() -> (l as Listing<UInt16>)[0])\n    module.catch(() -> (l as Listing<Int8>)[0])\n    module.catch(() -> (l as Listing<UInt8>)[0])\n  }\n\n  [\"mapping\"] {\n    module.catch(() -> new Listing { 1; 2; 3 } as Mapping<Int, String>)\n    new Mapping { [\"Pigeon\"] = 42; [\"Barn Owl\"] = 21 } as Mapping<String, Int>\n    module.catch(() -> new Mapping { [\"Pigeon\"] = 42; [\"Barn Owl\"] = 21 } as Mapping<Int, String>)\n  }\n  \n  [\"cast Mapping<, UInt> to other integer types\"] {\n    local m = new Mapping<String, UInt> { [\"x\"] = 9999 }\n    (m as Mapping<String, Int>)[\"x\"]\n    (m as Mapping<String, UInt>)[\"x\"]\n    (m as Mapping<String, Int32>)[\"x\"]\n    (m as Mapping<String, UInt32>)[\"x\"]\n    (m as Mapping<String, Int16>)[\"x\"]\n    (m as Mapping<String, UInt16>)[\"x\"]\n    module.catch(() -> (m as Mapping<String, Int8>)[\"x\"])\n    module.catch(() -> (m as Mapping<String, UInt8>)[\"x\"])\n  }\n  \n  [\"union type\"] {\n    42 as Int|String\n    42 as String|Int\n    42 as Number|String\n    module.catch(() -> 42 as String|Duration)\n\n    List(1, 2, 3) as List<String>|List<Int>\n    List(1, 2, 3) as List<String|Int>\n    module.catch(() -> List(1, 2, 3) as List<String>|Set<Int>)\n  }\n  \n  [\"nullable type\"] {\n    null as String?\n    null as Map<String, Int>?\n    module.catch(() -> null as Map<String, Int?>)\n  }\n  \n  [\"function type\"] {\n    (((x) -> x) as (Int) -> Int).apply(42)\n    (((x) -> x) as (String) -> String).apply(42)\n    module.catch(() -> ((x, _) -> x) as (Int) -> Int)\n  }\n\n  [\"string literal type\"] {\n    \"Pigeon\" as \"Pigeon\"|\"Barn Owl\"\n    module.catch(() -> \"Pigeon\" as \"Piggy\"|\"Barn Owl\")\n  }\n  \n  [\"constrained type\"] {\n    \"abc\" as String(length == 3)\n    module.catch(() -> \"abc\" as String(length == 4))\n    List(\"a\", \"b\", \"c\") as List<String(length == 1)>\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/as3.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"set of listing\"] {\n    local s1 = Set(\n      new Listing { 1; 2; 3 }\n    ) as Set<Listing<Int>>\n    local s2 = Set(\n      new Listing { \"one\"; \"two\"; \"three\" }\n    ) as Set<Listing<Int>>\n    s1.first[0]\n    module.catchOrNull(() -> s2.first) == null\n    module.catch(() -> s2.first[0])\n  }\n  [\"listing\"] {\n    local l = new Listing { 1; 2; 3 } as Listing<String>\n    module.catchOrNull(() -> l) == null\n    module.catch(() -> l[0])\n  }\n  [\"mapping\"] {\n    local m1 = new Mapping {\n      [\"hi\"] = 1\n      [\"bye\"] = 2\n    } as Mapping<String, String>\n    module.catchOrNull(() -> m1) == null\n    module.catch(() -> m1[\"hi\"])\n    module.catch(() -> m1[\"bye\"])\n    local m2 = new Mapping {\n      [\"hi\"] = 1\n      [\"bye\"] = 2\n    } as Mapping<Int, Int>\n    module.catch(() -> m2)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/baseModule.pkl",
    "content": "foo {}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/boolean.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal x = true\nlocal y = false\n\nexamples {\n  [\"literal\"] {\n    true\n    false\n  }\n\n  [\"conjunction\"] {\n    x && y\n    false && \"short-circuited\"\n    false && throw(\"short-circuited\")\n\n    module.catch(() -> true && throw(\"not short-circuited\"))\n    module.catch(() -> (throw(\"not short-circuited\")) && false)\n    module.catch(() -> 1 && true)\n  }\n\n  [\"disjunction\"] {\n    x || y\n    true || \"short-circuited\"\n    true || throw(\"short-circuited\")\n\n    module.catch(() -> false || throw(\"not short-circuited\"))\n    module.catch(() -> (throw(\"not short-circuited\")) || true)\n    module.catch(() -> 0 || true)\n  }\n\n  [\"negation\"] {\n    !x\n    !y\n  }\n\n  [\"equality\"] {\n    true == true\n    true == false\n    false == true\n    false == false\n  }\n\n  [\"inequality\"] {\n    true != true\n    true != false\n    false != true\n    false != false\n  }\n\n  [\"xor()\"] {\n    true.xor(true)\n    true.xor(false)\n    false.xor(true)\n    false.xor(false)\n\n    List().isEmpty.xor(List().isEmpty)\n    List().isEmpty.xor(List(1).isEmpty)\n    List(1).isEmpty.xor(List().isEmpty)\n    List(1).isEmpty.xor(List(1).isEmpty)\n\n    module.catch(() -> new Dynamic {}.xor(true))\n    module.catch(() -> true.xor(new Dynamic {}))\n  }\n\n  [\"implies()\"] {\n    true.implies(true)\n    true.implies(false)\n    false.implies(true)\n    false.implies(false)\n    module.catch(() -> false.implies(throw(\"not short-circuited\")))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/bytes.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nlocal bytes1 = Bytes(1, 2, 3)\nlocal bytes2 = Bytes(1, 2, 4)\n\nexamples {\n  [\"basic\"] {\n    Bytes(0, 255)\n  }\n\n  [\"bytes from constant value nodes\"] {\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7)\n    Bytes(\n      0b000,\n      0b001,\n      0b010,\n      0b011,\n      0b100,\n      0b101,\n      0b110,\n      0b111\n    )\n    Bytes(0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)\n    Bytes(0o0, 0o1, 0o2, 0o3, 0o4, 0o5, 0o6, 0o7)\n    Bytes(0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)\n  }\n\n  [\"bytes from non-constant value nodes\"] {\n    local one = 1\n    local two = 2\n    Bytes(one, two)\n  }\n\n  [\"incorrectly sized constant values\"] {\n    module.catch(() -> Bytes(0, 1, 2, 0xffff))\n  }\n\n  [\"equality\"] {\n    bytes1 == bytes1\n    bytes1 == bytes2\n    bytes1 == bytes1.toList()\n    bytes1 == Bytes(1, 2, 3)\n  }\n\n  [\"inequality\"] {\n    bytes1 != bytes1\n    bytes1 != bytes2\n    bytes1 != bytes1.toList()\n    bytes1 != Bytes(1, 2, 3)\n  }\n\n  [\"addition\"] {\n    bytes1 + bytes2\n    Bytes() + Bytes()\n    bytes1 + Bytes()\n    Bytes() + bytes2\n    module.catch(() -> bytes1 + bytes2.toList())\n  }\n\n  [\"subscript\"] {\n    bytes1[0]\n    bytes1[1]\n    bytes1[2]\n    module.catch(() -> bytes1[3])\n  }\n\n  [\"all bytes\"] {\n    IntSeq(0, 255).toList().toBytes()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/comments.pkl",
    "content": "x = 10 // end-of-line comment\n\ny = 20 /*\nmulti\nline\ncomment\n*/ z = 30\n\n/// documentation comment\nfunction myFun() = 0\n\na = 20 // single-line comment running until EOF rather than newline\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/constModifier.pkl",
    "content": "open module constModifier\n\nimport \"pkl:test\"\n\nconst constantSimpleValue = \"constant\"\n\nlocal const constLocal = \"const-local\"\n\nnonConstantSimpleValue = \"NON-CONSTANT\"\n\nconst constantNestedValue {\n  nestedSimpleValue = constantSimpleValue\n}\n\nconst constDyn = new Dynamic {\n  [1] = \"1\"\n  prop = \"2\"\n}\n\nnonConstantNestedValue {\n  nestedSimpleValue = constantSimpleValue\n}\n\nfunction nonConstFunction() = nonConstantSimpleValue\n\nclass ConstImport {\n  const cst = 10\n  local const lcst = 11\n  //pi1 = math.pi\n  pi2 = import(\"pkl:math\").pi\n  mod = module.constantSimpleValue\n  outr = outer.constantSimpleValue\n  clocal = constLocal\n  dynconst = constDyn[1]\n  dynconst2 = constDyn.prop\n  constAccess = cst\n  constAccess2 = lcst\n}\n\nconstImport = new ConstImport {}\n\nclass ValidConstOuter {\n  name: String\n  fancyName = new { title = \"The \\(outer.name)\" }\n}\n\nvalidOuter = new ValidConstOuter { name = \"Winner\" }\n\nclass Valid {\n  nested = constantNestedValue\n  simple = constantSimpleValue\n  dereferenced = constantNestedValue.nestedSimpleValue\n}\n\nclass BrokenSimple {\n  improperDefault = nonConstantSimpleValue\n}\n\nclass BrokenNested {\n  improperNestedDefault = nonConstantNestedValue \n}\n\nclass BrokenFunction {\n  improperDefaultFromNonConstFunction = nonConstFunction()\n}\n\nres01 = new Valid {}\nres02 = test.catch(() -> \"\\(new BrokenSimple {})\")\nres03 = test.catch(() -> \"\\(new BrokenNested {})\")\nres04 = test.catch(() -> \"\\(new BrokenFunction {})\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/constModifier2.pkl",
    "content": "const foo = new {\n  bar = \"bar\"\n  baz = bar\n  local loc = bar\n  qux = loc\n  local function f() = 1\n  qix = f()\n}\n\nconst bar {\n  qux = 1\n  local function buzz() = 5\n  baz {\n    corge = 2\n    biz {\n      buz = qux\n      qup = corge\n      fuzz = buzz()\n    }\n  }\n}\n\namend = (foo) {\n  baz = \"amend\"\n}\n\nclass Thing {\n  prop1: Int = 5\n  prop2: Int\n  prop3: Thing2\n}\n\nclass Thing2 {\n  prop4: Int = 5\n}\n\nconst thing = new Thing {\n  // can reference properties from implicit `this` if within const scope\n  prop2 = prop1\n}\n\nconst thing2 = new Thing {\n  // can reference properties from explicit `this` if within const scope\n  prop2 = this.prop1\n}\n\nconst thing3 = new Thing {\n  // can reference properties with explicit `super` if within const scope\n  prop2 = super.prop1\n}\n\nconst thing4 = new Thing {\n  prop2 = 2\n  prop3 {\n    prop4 = 10\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/constModifier3.pkl",
    "content": "const function foo(num: Int(isBetween(0, 32))): Int = num\nconst function foo2(num: Int(this.isBetween(0, 32))): Int = num\nconst function foo3(str: String(length > 5)): String = str\nconst function foo4(str: String(this.length > 5)): String = str\n\n\nres = foo(25)\nres2 = foo2(26)\nres3 = foo3(\"hihihi\")\nres4 = foo4(\"hihihi\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/constModifier4.pkl",
    "content": "const baz = 15\n\nfoo {\n  const local bar = baz\n\n  const local bar2 = biz()\n\n  const local function biz() = baz\n\n  qux = bar\n\n  corge = biz()\n\n  corge2 = bar2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/constModifier5.pkl",
    "content": "// should result in only one trace per property\nclass MyClass {\n  // property body only gets executed once\n  const prop = trace(\"hello\")\n\n  // typecheck only happens once\n  const prop2: Int(let (_ = trace(\"hello again\")) true) = 1\n\n  res: Int\n}\n\na = new MyClass { res = 1 }\nb = (a) { res = 2 }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/dataSize.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"construction\"] {\n    1.b\n    2.kb\n    3.kib\n    4.mb\n    5.mib\n    6.gb\n    7.gib\n    8.tb\n    9.tib\n    10.pb\n    11.pib\n\n    1.1.b\n    2.2.kb\n    3.3.kib\n    4.4.mb\n    5.5.mib\n    6.6.gb\n    7.7.gib\n    8.8.tb\n    9.9.tib\n    10.10.pb\n    11.11.pib\n  }\n\n  [\"addition\"] {\n    2.kb + 4.kb\n    2.2.kb + 3.3.kb\n    2.kb + 3.kib\n    10.b + 11.pib\n\n    4.kb + 2.kb\n    3.3.kb + 2.2.kb\n    3.kib + 2.kb\n    11.pib + 10.b\n  }\n\n  [\"subtraction\"] {\n    2.kb - 4.kb\n    2.2.kb - 3.3.kb\n    2.kb - 3.kib\n    10.b - 11.pib\n\n    4.kb - 2.kb\n    3.3.kb - 2.2.kb\n    3.kib - 2.kb\n    11.pib - 10.b\n  }\n\n  [\"multiplication\"] {\n    2.kb * 3\n    2.kb * 3.3\n    2.2.kb * 3\n    2.2.kb * 3.3\n\n    3 * 2.kb\n    3.3 * 2.kb\n    3 * 2.2.kb\n    3.3 * 2.2.kb\n  }\n\n  [\"division\"] {\n    2.kb / 3\n    2.kb / 3.3\n    2.2.kb / 3\n    2.2.kb / 3.3\n\n    module.catch(() -> 3 / 2.kb)\n    module.catch(() -> 3.3 / 2.kb)\n    module.catch(() -> 3 / 2.2.kb)\n    module.catch(() -> 3.3 / 2.3.kb)\n  }\n\n  [\"division by data size\"] {\n    2.kb / 3.kb\n    2.kb / 3.3.kb\n    2.2.kb / 3.mb\n    2.2.mb / 3.3.b\n  }\n\n  [\"negation\"] {\n    local d = -4.mb\n    d\n    -d\n    --d\n\n    local d2 = -4.4.mb\n    d\n    -d\n    --d\n  }\n\n  [\"truncating division\"] {\n    5.kb ~/ 3\n    7.kb ~/ 3.3\n    6.2.kb ~/ 3\n    6.2.kb ~/ 3.3\n  }\n\n  [\"truncating division by data size\"] {\n    5.kb ~/ 3.kb\n    7.kb ~/ 3.3.kb\n    6.2.kb ~/ 3.mb\n    6.2.mb ~/ 3.3.b\n  }\n\n  [\"power\"] {\n    2.kb ** 3\n    2.kb ** 3.3\n    2.2.kb ** 3\n    2.2.kb ** 3.3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/duration.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"construct\"] {\n    1.ns\n    2.us\n    3.ms\n    4.s\n    5.min\n    6.h\n    7.d\n\n    1.1.ns\n    2.2.us\n     3.3.ms\n     4.4.s\n     5.5.min\n     6.6.h\n     7.7.d\n  }\n\n  [\"addition\"] {\n    2.s + 4.s\n    2.2.s + 3.3.s\n    2.s + 3.min\n    10.ns + 7.d\n\n    4.s + 2.s\n    3.3.s + 2.2.s\n    3.min + 2.s\n    7.d + 10.ns\n  }\n\n  [\"subtraction\"] {\n    2.s - 4.s\n    2.2.s - 3.3.s\n    2.s - 3.min\n    10.ns - 7.d\n\n    4.s - 2.s\n    3.3.s - 2.2.s\n    3.min - 2.s\n    7.d - 10.ns\n  }\n\n  [\"multiplication\"] {\n    2.s * 3\n    2.s * 3.3\n    2.2.s * 3\n    2.2.s * 3.3\n\n    3 * 2.s\n    3.3 * 2.s\n    3 * 2.2.s\n    3.3 * 2.2.s\n  }\n\n  [\"division\"] {\n    2.s / 3\n    2.s / 3.3\n    2.2.s / 3\n    2.2.s / 3.3\n\n    module.catch(() -> 3 / 2.s)\n    module.catch(() -> 3.3 / 2.s)\n    module.catch(() -> 3 / 2.2.s)\n    module.catch(() -> 3.3 / 2.3.s)\n  }\n\n  [\"division by duration\"] {\n    2.s / 3.s\n    2.s / 3.3.s\n    2.2.s / 3.min\n    2.2.h / 3.3.s\n  }\n\n  [\"negation\"] {\n    local d = -4.s\n    d\n    -d\n    --d\n\n    local d2 = -4.4.s\n    d2\n    -d2\n    --d2\n  }\n\n  [\"truncating division\"] {\n    5.s ~/ 3\n    7.s ~/ 3.3\n    6.2.s ~/ 3\n    6.2.s ~/ 3.3\n  }\n\n  [\"truncating division by duration\"] {\n    5.s ~/ 3.s\n    7.s ~/ 3.3.s\n    6.2.s ~/ 3.min\n    6.2.h ~/ 3.3.s\n  }\n\n  [\"power\"] {\n    2.s ** 3\n    2.s ** 3.3\n    2.2.s ** 3\n    2.2.s ** 3.3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/exceptions.pkl",
    "content": "foo {\n  bar = throw(\"Something went wrong\")\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/fixedProperty1.pkl",
    "content": "open module fixedProperty1\n\nclass Bird {\n  name: String\n}\n\nfixed res1: String = \"hi\"\nfixed res2: Boolean = true\nfixed res3: Bird = new { name = \"Swallow\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/fixedProperty2.pkl",
    "content": "class Person {\n  fixed name: String = \"The Person\"\n}\n\np: Person = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/fixedProperty3.pkl",
    "content": "extends \"fixedProperty1.pkl\"\n\nfixed res1 = \"goodbye\"\n\nfixed res4: String = \"aloha\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/fixedProperty4.pkl",
    "content": "fixed module foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/fixedProperty5.pkl",
    "content": "myObj = new {\n  fixed bar = \"bar\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/fixedProperty6.pkl",
    "content": "fixed function foo() = 5\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/float.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:math\"\n\nfacts {\n  [\"pow\"] {\n    2.0 ** 3.0 ** 4.0 == 2.0 ** (3.0 ** 4.0)\n    1.0 + 2.0 ** 3.0 == 1.0 + (2.0 ** 3.0)\n    2.0 * 2.0 ** 3.0 == 2.0 * (2.0 ** 3.0)\n    2.0 ** 3.0 + 1.0 == (2.0 ** 3.0) + 1.0\n    2.0 ** 3.0 * 2.0 == (2.0 ** 3.0) * 2.0\n  }\n\n  [\"equality\"] {\n    1.2 == 1.2\n    1.0 == 1\n    1 == 1.0\n    !(1.2 == 1.3)\n    !(1.2 == 1)\n  }\n\n  [\"inequality\"] {\n    1.2 != 1.3\n    1.2 != 1\n    !(1.0 != 1)\n    !(1.2 != 1.2)\n    !(1 != 1.0)\n  }\n\n  [\"greater than\"] {\n    1.3 > 1.2\n    !(1.2 > 1.2)\n    !(1.2 > 1.3)\n  }\n\n  [\"less than\"] {\n    1.2 < 1.3\n    !(1.2 < 1.2)\n    !(1.3 < 1.2)\n  }\n\n  [\"greater than or equal\"] {\n    1.2 >= 1.2\n    1.3 >= 1.2\n    !(1.2 >= 1.3)\n  }\n\n  [\"less than or equal\"] {\n    1.2 <= 1.2\n    1.2 <= 1.3\n    !(1.3 <= 1.2)\n  }\n\n  [\"underscores\"] {\n    123_456_789.123_456_789 == 123456789.123456789\n    1____.1____ == 1.1\n    1____1.1____1 == 11.11\n\n    123.4_56e7 == 123.456e7\n    123.4_56e-7 == 123.456e-7\n\n    123.456e1_0 == 123.456e10\n    1_23.456e-1_0 == 123.456e-10\n  }\n}\n\nexamples {\n  [\"literal\"] {\n    123456789.123456789\n    123.456e7\n    123.456e-7\n\n    -123456789.123456789\n    -123.456e7\n    -123.456e-7\n\n    4.9E-324\n    1.7976931348623157E308\n\n    123_456_789.123_456_789\n    1____.1____\n    1____1.1____1\n\n    123.4_56e7\n    123.4_56e-7\n\n    123.456e1_0\n    1_23.456e-1_0\n  }\n\n  [\"addition\"] {\n    1.1 + 2.2\n    1 + 2.2\n  }\n\n  [\"subtraction\"] {\n    2.2 - 3.3\n    2.2 - 3\n  }\n\n  [\"multiplication\"] {\n    3.3 * 4.4\n    3 * 4.4\n  }\n\n  [\"division\"] {\n    4.4 / 5.5\n    4.4 / 5\n  }\n\n  [\"integer division\"] {\n    5 ~/ 3\n    5.0 ~/ 3\n    5 ~/ 3.0\n    5.0 ~/ 3.0\n    5.1 ~/ 3.1\n  }\n\n  [\"remainder\"] {\n    5.5 % 6.5\n    5 % 6.5\n  }\n\n  [\"negation\"] {\n    // pkl, js, dart, and kotlin use #1; their grammar has no negative numeric literals\n    // ruby and scala use #2 (scala switched from #1 around 2.8)\n    //\n    // 1.\n    // local x = 1.2\n    // -1.2.abs == -(1.2.abs)\n    // -x.abs == -(x.abs)\n    //\n    // 2.\n    // local x = 1.2\n    // -1.2.abs == (-1.2).abs\n    // -x.abs == -(x.abs)\n    //\n    // #1 is more intuitive for negative numeric literals, but less consistent\n\n    local x = 1.2\n\n    -1.2.abs\n    -x.abs\n\n    // https://github.com/apple/pkl/issues/650\n    --1.0\n    -(-1.0)\n  }\n\n  [\"power\"] {\n    2.3 ** 4.0\n    2.3 ** 0.0\n    2.3 ** -4.0\n\n    0.0 ** 0.0\n    1.0 ** 0.0\n    -1.0 ** 0.0\n\n    0.0 ** 1.0\n    1.0 ** 1.0\n    -1.0 ** 1.0\n\n    0.0 ** -1.0\n    1.0 ** -1.0\n    -1.0 ** -1.0\n\n    0.0 ** 42.0\n    1.0 ** 42.0\n    -1.0 ** 42.0\n\n    0.0 ** -42.0\n    1.0 ** -42.0\n    -1.0 ** -42.0\n\n    0.0 ** math.maxFiniteFloat\n    1.0 ** math.maxFiniteFloat\n    -1.0 ** math.maxFiniteFloat\n\n    0.0 ** math.minFiniteFloat\n    1.0 ** math.minFiniteFloat\n    -1.0 ** math.minFiniteFloat\n\n    2.0 ** math.maxInt8\n    2.0 ** math.maxInt16\n    2.0 ** math.maxInt32\n    2.0 ** math.maxInt\n    2.0 ** math.maxFiniteFloat\n    -2.0 ** math.maxInt8\n    -2.0 ** math.maxInt16\n    -2.0 ** math.maxInt32\n    -2.0 ** math.maxInt\n    -2.0 ** math.maxFiniteFloat\n\n    math.maxFiniteFloat ** 0.0\n    math.maxFiniteFloat ** 1.0\n    math.maxFiniteFloat ** 2.0\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/globtest/file1.txt",
    "content": "file1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/globtest/file2.txt",
    "content": "file2\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/identifier.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal `this` = 42 // keyword\nlocal `that` = 43 // regular identifier\nlocal `quick brown fox` = 44 // irregular identifier\n\nlocal obj = new {\n  `this` = 42\n  `that` = 43\n  `quick brown fox` = 44\n}\n\nexamples {\n  [\"variable\"] {\n    `this`\n    `that`\n    `quick brown fox`\n  }\n\n  [\"property\"] {\n    obj.`this`\n    obj.`that`\n    obj.`quick brown fox`\n  }\n\n  [\"string interpolation\"] {\n    \"\\(`this`)\"\n    \"\\(`that`)\"\n    \"\\(`quick brown fox`)\"\n  }\n\n  [\"multiline string interpolation\"] {\n    \"\"\"\n    \\(`this`)\n    \"\"\"\n    \"\"\"\n    \\(`that`)\n    \"\"\"\n    \"\"\"\n    \\(`quick brown fox`)\n    \"\"\"\n  }\n}\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/if.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"basic\"] {\n    if (true) 1 else 2\n    if (false) 1 else if (false) 2 else 3\n  }\n\n  [\"non-boolean condition\"] {\n    module.catch(() -> if (\"\") true else false)\n    module.catch(() -> if (0) true else false)\n    module.catch(() -> if (null) true else false)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/import1.pkl",
    "content": "import \"imported.pkl\"\nimport \"imported.pkl\" as other\n\nbar = 1\nres1 = imported.foo\nres2 = imported.bar\n\nres3 = other.foo\nres4 = other.bar\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/import1b.pkl",
    "content": "import \"modulepath:/org/pkl/core/snippets/imported.pkl\"\nimport \"modulepath:/org/pkl/core/snippets/imported.pkl\" as other\n\nbar = 1\nres1 = imported.foo\nres2 = imported.bar\n\nres3 = other.foo\nres4 = other.bar\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/import2.pkl",
    "content": "local i = import(\"imported.pkl\")\n\nbar = 1\nlibFoo = i.foo\nlibBar = i.bar\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/import3.pkl",
    "content": "foo {\n  bar = import(\"imported.pkl\")\n  baz = import(\"imported.pkl\")\n  bak = import(\"imported.pkl\").foo\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/importGlob.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport* \"../../input-helper/globtest/*.pkl\" as globTestFiles\nimport* \"../../input-helper/globtest/*.pkl\"\n\nexamples {\n  [\"import* clause keys\"] {\n    globTestFiles.keys.toListing()\n  }\n\n  [\"import* inferred name\"] {\n    `*`.keys.toListing()\n  }\n\n  [\"globstar\"] {\n    import*(\"../../input-helper/globtest/**.pkl\").keys.toListing()\n  }\n\n  [\"amended\"] {\n    (import*(\"../../input-helper/globtest/**.pkl\")) {\n      [[true]] {\n        output {\n          renderer = new YamlRenderer {}\n        }\n      }\n    }.toMap().values.map((it) -> it.output.text).join(\"\\n---\\n\")\n  }\n\n  [\"globstar then up one level\"] {\n    import*(\"../../input-helper/globtest/**/../*.pkl\").keys.toListing()\n  }\n\n  [\"empty glob matches current directory\"] {\n    import*(\"\").keys.toListing()\n    module.catch(() -> import*(\"\").toMap())\n  }\n\n  [\"no wildcards\"] {\n    import*(\"../../input-helper/globtest/moduleA.pkl\").keys.toListing()\n  }\n\n  [\"wildcard that does match\"] {\n    import*(\"../../input-helper/globtest/{moduleA}.pkl\").keys.toListing()\n  }\n\n  [\"character classes\"] {\n    import*(\"../../input-helper/globtest/module[A-B].pkl\").keys.toListing()\n  }\n\n  [\"match directories\"] {\n    module.catch(() -> import*(\"../../input-helper/globtest\").toMap())\n  }\n\n  [\"import glob first segment is wildcard\"] {\n    import*(\"*Glob.pkl\").keys.toListing()\n  }\n\n  [\"import glob matching unsafe uri chars\"] {\n    // no percent encoding because this is just a path (same rules as `import`)\n    import*(#\"../../input-helper/globtest/module with \\[weird] ~!characters.pkl\"#)\n    import*(\"../../input-helper/globtest/module *\")\n  }\n\n  [\"package\"] {\n    import*(\"package://localhost:0/birds@0.5.0#/catalog/*.pkl\")\n    import*(\"package://localhost:0/birds@0.5.0#/**.pkl\").keys.toListing()\n  }\n\n  [\"globbing with absolute URIs and percent encoding\"] {\n    import*(\"package://localhost:0/packageContainingWildcardCharacters@1.0.0#/name%20*\")\n    import*(\"package://localhost:0/packageContainingWildcardCharacters@1.0.0#/name%20with%20%5C%5Bwildcard%5D!%20characters~~.pkl\")\n  }\n\n  [\"package glob and up one level\"] {\n    import*(\"package://localhost:0/birds@0.5.0#/catalog/../catalog/*.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/imported.pkl",
    "content": "foo = bar * 2\nbar = 3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/indexExpressions.pkl",
    "content": "local mapping1 = new Mapping {\n  [\"x\"] = \"y\"\n}\n\nlocal mapping2 = new Mapping {\n  [\"y\"] = \"z\"\n}\n\nresult = mapping2[mapping1[\"x\"]]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/int.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:math\"\n\nfacts {\n  [\"equality\"] {\n    2 == 2\n    2 == 2.0\n    !(2 == 3)\n  }\n\n  [\"inequality\"] {\n    2 != 3\n    !(2 != 2)\n    !(2 != 2.0)\n  }\n  [\"underscore - digits\"] {\n    1_000 == 1000\n    1_000__000 == 1000000\n    1___ == 1\n    1___1 == 11\n    1__000_0 == 10000\n    -10_000 == -10000\n  }\n  [\"underscore - hex\"] {\n    0x42_ab_AB_de_12 == 0x42ababde12\n    0x41__ == 0x42\n    0x59__9 == 0x599\n    -0x59__9 == -0x599\n  }\n  [\"underscore - binary\"] {\n    0b1011_0110 == 0b10110110\n    0b01__10 == 0b0110\n    0b1____0 == 0b10\n    -0b1_____ == -0b1\n  }\n  [\"underscore - octal\"] {\n    0o23 == 0o23\n    0o4_162_376_1 == 0o41623761\n    0o41__ == 0o41\n    0o56__6 == 0o566\n    -0o57__7 == -0o577\n  }\n}\n\nexamples {\n  [\"literal\"] {\n    42\n    00042\n    123456789123456789\n    \n    -42\n    -00042\n    -123456789123456789\n\n    -9223372036854775808\n    9223372036854775807\n    \n    1_000\n    1_000__000\n    1___\n    1___1\n    1__000_0\n    -10_000\n  }\n\n  [\"hex literal\"] {\n    0x42\n    0x123456789abcdef\n    0x123456789ABCDEF\n    0x123456789aBcDeF\n    0x000123456789abcdef\n    \n    0x42\n    -0x123456789abcdef\n    -0x123456789ABCDEF\n    -0x123456789aBcDeF\n    -0x000123456789abcdef\n    \n    0x42_ab_AB_de_12\n    0x41__\n    0x59__9\n    -0x59__9\n  }\n\n  [\"binary literal\"] {\n    0b101101\n    0b000101101\n    \n    -0b101101\n    -0b000101101\n    \n    0b1011_0110\n    0b01__10\n    0b1____0\n    -0b1_____\n  }\n\n  [\"octal literal\"] {\n    0o01234567\n    0o76543210\n\n    -0o01234567\n    -0o76543210\n\n    0o1234_5670\n    0o45__67\n    0o7____0\n    -0o7_____\n    \n    0o644\n    0o755\n  }\n\n  [\"addition\"] {\n    1 + 2\n    0x1 + 0b10\n  }\n  \n  [\"subtraction\"] {\n    2 - 3\n    0x2 - 0b11\n  }\n  \n  [\"multiplication\"] {\n    3 * 4\n    0x3 * 0b100\n  }\n  \n  [\"division\"] {\n    4 / 3\n    0x4 / 0b11\n  }\n  \n  [\"integer division\"] {\n    4 ~/ 3\n    0x4 ~/ 0b11\n  }\n  \n  [\"remainder\"] {\n    5 % 6\n    0x5 % 0b110\n  }\n  \n  [\"negation\"] {\n    // pkl, js, dart, and kotlin use #1; their grammar has no negative numeric literals\n    // ruby and scala use #2 (scala switched from #1 around version 2.8)\n    //\n    // 1.\n    // local x = 1\n    // -1.abs == -(1.abs)\n    // -x.abs == -(x.abs)\n    //\n    // 2.\n    // local x = 1\n    // -1.abs == (-1).abs\n    // -x.abs == -(x.abs)\n    //\n    // #2 is more intuitive for negative numeric literals, but less consistent\n\n    -1.abs\n    -0x2.abs\n    -0b11.abs\n    local x = 4\n    -x.abs\n\n    // https://github.com/apple/pkl/issues/650\n    --1\n    -(-1)\n  }\n\n  [\"power\"] {\n    2 ** 4\n    2 ** 0\n    2 ** -4\n\n    0 ** 0\n    1 ** 0\n    -1 ** 0\n\n    0 ** 1\n    1 ** 1\n    -1 ** 1\n\n    0 ** -1\n    1 ** -1\n    -1 ** -1\n\n    0 ** 42\n    1 ** 42\n    -1 ** 42\n\n    0 ** -42\n    1 ** -42\n    -1 ** -42\n\n    0 ** math.maxInt\n    1 ** math.maxInt\n    -1 ** math.maxInt\n\n    0 ** math.minInt\n    1 ** math.minInt\n    -1 ** math.minInt\n\n    module.catch(() -> 2 ** math.maxInt8)\n    module.catch(() -> 2 ** math.maxInt16)\n    module.catch(() -> 2 ** math.maxInt32)\n    module.catch(() -> 2 ** math.maxInt)\n    module.catch(() -> -2 ** math.maxInt8)\n    module.catch(() -> -2 ** math.maxInt16)\n    module.catch(() -> -2 ** math.maxInt32)\n    module.catch(() -> -2 ** math.maxInt)\n\n    math.maxInt ** 0\n    math.maxInt ** 1\n    module.catch(() -> math.maxInt ** 2)\n\n    4 ** 3 ** 2 == 4 ** (3 ** 2)\n    1 + 2 ** 3 == 1 + (2 ** 3)\n    2 * 2 ** 3 == 2 * (2 ** 3)\n    2 ** 3 + 1 == (2 ** 3) + 1\n    2 ** 3 * 2 == (2 ** 3) * 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/intseq.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nimport \"pkl:math\"\n\nlocal seq1 = IntSeq(0, -1)\nlocal seq2 = IntSeq(0, -2)\nlocal seq3 = IntSeq(10, -10)\n\nfacts {\n  [\"equality\"] {\n    seq1 == seq2\n    seq2 == seq1\n    seq2 == seq3\n    seq3 == seq2\n    seq3 == seq1\n    seq1 == seq3\n\n    IntSeq(-10, 10) == IntSeq(-10, 10)\n    !(IntSeq(-10, 10) == IntSeq(10, -10).step(-1))\n    !(IntSeq(-10, 10) == IntSeq(-10, 10).step(2))\n\n    IntSeq(-10, 10).step(2) == IntSeq(-10, 11).step(2)\n    IntSeq(-10, 10).step(5) == IntSeq(-10, 14).step(5)\n    !(IntSeq(-10, 10).step(5) == IntSeq(-10, 15).step(5))\n\n    IntSeq(10, -10).step(-2) == IntSeq(10, -11).step(-2)\n    IntSeq(10, -10).step(-5) == IntSeq(10, -14).step(-5)\n    !(IntSeq(10, -10).step(-5) == IntSeq(10, -15).step(-5))\n\n    IntSeq(math.minInt, math.maxInt) == IntSeq(math.minInt, math.maxInt)\n    !(IntSeq(math.minInt, math.maxInt) == IntSeq(math.maxInt, math.minInt))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/is.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal list = List(1, 2, 3)\n\nlocal set = Set(1, 2,3)\n\nlocal map = Map(1, \"one\", 2, \"two\", 3, \"three\")\n\nlocal base = new Base {}\n\nlocal derived = new Derived {}\n\nlocal other = new Other {}\n\nlocal listing = new Listing { \"Pigeon\"; 40 }\n\nlocal mapping = new Mapping { [\"name\"] = \"Pigeon\"; [\"age\"] = 40 }\n\nlocal f = (x) -> x\n\nlocal open class Base\nlocal class Derived extends Base\nlocal class Other\n\nfacts {\n  [\"String\"] {\n    \"abc\" is String\n    !(42 is String)\n  }\n\n  [\"Any\"] {\n    \"abc\" is Any\n    42 is Any\n    1.23 is Any\n    true is Any\n    false is Any\n    42.s is Any\n    42.b is Any\n    list is Any\n    set is Any\n    map is Any\n    null is Any\n    Null(new Base {}) is Any\n    base is Any\n    derived is Any\n    mapping is Any\n    Base is Any\n    this is Any\n    f is Any\n  }\n\n  [\"Null\"] {\n    null is Null\n    Null(new Base {}) is Null\n\n    !(\"abc\" is Null)\n    !(42 is Null)\n    !(1.23 is Null)\n    !(true is Null)\n    !(false is Null)\n    !(42.s is Null)\n    !(42.b is Null)\n    !(list is Null)\n    !(set is Null)\n    !(map is Null)\n    !(base is Null)\n    !(derived is Null)\n    !(listing is Null)\n    !(mapping is Null)\n    !(Base is Null)\n    !(this is Null)\n    !(f is Null)\n  }\n\n  [\"Int\"] {\n    42 is Int\n    !(\"abc\" is Int)\n    !(1.23 is Int)\n    !(true is Int)\n    !(false is Int)\n    !(42.s is Int)\n    !(42.b is Int)\n    !(list is Int)\n    !(set is Int)\n    !(map is Int)\n    !(derived is Int)\n    !(null is Int)\n    !(Null(new Base {}) is Int)\n    !(base is Int)\n    !(listing is Int)\n    !(mapping is Int)\n    !(Base is Int)\n    !(this is Int)\n    !(f is Int)\n  }\n\n  [\"Number\"] {\n    42 is Number\n    1.23 is Number\n    !(\"abc\" is Number)\n  }\n\n  [\"Float\"] {\n    1.23 is Float\n    !(42 is Float)\n    !(\"abc\" is Float)\n  }\n\n  [\"Boolean\"] {\n    true is Boolean\n    false is Boolean\n    !(\"abc\" is Boolean)\n  }\n\n  [\"Duration\"] {\n    42.s is Duration\n    !(42.b is Duration)\n    !(\"abc\" is Duration)\n    !(42.b is Duration)\n  }\n\n  [\"DataSize\"] {\n    42.b is DataSize\n    !(42.s is DataSize)\n    !(\"abc\" is DataSize)\n    !(42.s is DataSize)\n  }\n\n  [\"List\"] {\n    list is List\n    !(set is List)\n    !(map is List)\n  }\n\n  [\"Set\"] {\n    set is Set\n    !(list is Set)\n    !(map is Set)\n  }\n\n  [\"Collection\"] {\n    list is Collection\n    set is Collection\n    !(map is Collection)\n  }\n\n  [\"Map\"] {\n    map is Map\n    !(list is Map)\n    !(\"abc\" is Map)\n  }\n\n  [\"base class\"] {\n    base is Base\n    derived is Base\n    !(other is Base)\n  }\n\n  [\"derived class\"] {\n    derived is Derived\n    !(base is Derived)\n    !(other is Derived)\n  }\n\n  [\"other class\"] {\n    other is Other\n    !(\"abc\" is Other)\n    !(42 is Other)\n    !(1.23 is Other)\n    !(true is Other)\n    !(false is Other)\n    !(42.s is Other)\n    !(42.b is Other)\n    !(list is Other)\n    !(set is Other)\n    !(derived is Other)\n    !(map is Other)\n    !(listing is Other)\n    !(mapping is Other)\n    !(base is Other)\n    !(Base is Other)\n    !(null is Other)\n    !(Null(new Base {}) is Other)\n    !(this is Other)\n    !(f is Other)\n  }\n\n  [\"Listing\"] {\n    listing is Listing\n    !(mapping is Listing)\n    !(\"abc\" is Listing)\n  }\n\n  [\"Mapping\"] {\n    mapping is Mapping\n    !(listing is Mapping)\n    !(\"abc\" is Mapping)\n  }\n\n  [\"Module\"] {\n    module is Module\n    !(this is Module)\n    !(\"abc\" is Module)\n  }\n\n  [\"Class\"] {\n    Base is Class\n    base.getClass() is Class\n    !(base is Class)\n  }\n\n  [\"Function\"] {\n    f is Function\n    f is Function1\n    !(f is Function2)\n    !(\"abc\" is Function)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/is2.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"List\"] {\n    List(1, 2, 3) is List<Int>\n    !(List(1, 2, 3) is List<String>)\n    !(Set(1, 2, 3) is List<Int>)\n  }\n\n  [\"Set\"] {\n    Set(1, 2, 3) is Set<Int>\n    !(List(1, 2, 3) is Set<Int>)\n    !(Set(1, 2, 3) is Set<String>)\n  }\n\n  [\"Map\"] {\n    Map(\"Pigeon\", 42, \"Barn Owl\", 21) is Map<String, Int>\n    !(Map(\"Pigeon\", 42, \"Barn Owl\", 21) is Map<Int, String>)\n  }\n\n  [\"Listing\"] {\n    new Listing { 1; 2; 3 } is Listing<Int>\n    !(new Listing { 1; 2; 3 } is Listing<String>)\n  }\n\n  [\"Mapping\"] {\n    new Mapping { [\"Pigeon\"] = 42; [\"Barn Owl\"] = 21 } is Mapping<String, Int>\n    !(new Listing { 1; 2; 3 } is Mapping<Int, String>)\n    !(new Mapping { [\"Pigeon\"] = 42; [\"Barn Owl\"] = 21 } is Mapping<Int, String>)\n  }\n\n  [\"union type\"] {\n    42 is Int|String\n    42 is String|Int\n    42 is Number|String\n    !(42 is String|Duration)\n\n    List(1, 2, 3) is List<String>|List<Int>\n    List(1, 2, 3) is List<String|Int>\n    !(List(1, 2, 3) is List<String>|Set<Int>)\n  }\n\n  [\"nullable type\"] {\n    null is String?\n    null is Map<String, Int>?\n    !(null is Map<String, Int?>)\n  }\n\n  // currently only tests arity\n  [\"function type\"] {\n    ((x) -> x) is (Int) -> Int\n    ((x) -> x) is (String) -> String\n    !(((x, y) -> x) is (Int) -> Int)\n  }\n\n  [\"string literal type\"] {\n    \"Pigeon\" is \"Pigeon\"|\"Barn Owl\"\n    !(\"Pigeon\" is \"Piggy\"|\"Barn Owl\")\n  }\n\n  [\"constraint\"] {\n    \"abc\" is String(length == 3)\n    List(\"a\", \"b\", \"c\") is List<String(length == 1)>\n    \"abc\" is String(this is String(this is String(length == 3)))\n    !(\"abc\" is String(length == 4))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/let.pkl",
    "content": "import \"pkl:test\"\n\nres1 =\n  let (x = 42)\n    x + 1\n\nres2 =\n  let (res2 = 42)\n    res2 + 1\n\nres3 =\n  let (x = 1)\n    let (y = 2)\n      x + y + x\n\nres4 =\n  let (x = 1)\n    let (x = 2)\n      x + x\n\nres5 =\n  let (price = 500) new {\n    lowestPrice = price - 100\n    averagePrice = new {\n      price\n    }\n    highestPrice = new {\n      [\"price\"] = price + 100\n    }\n  }\n\nres6 =\n  let (str = \"Pigeon\".reverse())\n    str.reverse()\n\nlocal pigeon = \"Pigeon\"\n\nres7 =\n  let (str = pigeon.reverse())\n    str.reverse()\n\nfunction f(a) =\n  let (b = a * 2)\n    a + b\n\nres8 = f(3)\n\nlocal g = (a) ->\n  let (b = a * 2)\n    a + b\n\nres9 = g.apply(3)\n\nlocal h = let (b = 2)\n  (a) -> a + b\n\nres10 = h.apply(3)\n\nres11 = IntSeq(1, 5).map((n) -> let (x = n + 1) x + 1)\n\nclass Lets {\n  x = 2\n  y = let (z = 2) z + x\n  function f(x) = let (z = 2) z + x\n  z = f(x)\n}\n\nres12 = new Lets {\n  x = 4\n}\n\nres13 =\n  let (x = 1)\n    let (y = x)\n      let (z = y)\n        x + y + z\n\n// x can't access y\nres14 = test.catch(() -> let (x = y) let (y = 2) x + y)\n\nres15 = test.catch(() -> let (x = throw(\"ouch\")) x + 1)\nres16 = test.catch(() -> let (x = 1) throw(\"ouch\"))\nres17 = test.catch(() -> let (x = 1) let (y = throw(\"ouch\")) x + y)\nres18 = test.catch(() -> let (x = 1) let (y = 2) throw(\"ouch\"))\n\n// doesn't change meaning of `this`\nres19 = let (x = this) let (y = this) x == y && y == this && this == module\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/letTyped.pkl",
    "content": "import \"pkl:test\"\n\nres1 =\n  let (x: Int = 42)\n    x + 1\n\nres2 =\n  let (str: String(endsWith(\"P\")) = \"Pigeon\".reverse())\n    str.reverse()\n\nres3 =\n  let (x: Duration(unit == \"min\") = 3.min + 2.min)\n    let (y: Float(isPositive) = 1.2 + 1.3)\n      x * y\n\nres4 =\n  let (xs: List<Null|Boolean|\"Pigeon\"> = List(\"Pigeon\", true, null))\n    xs\n\nres5 = test.catch(() ->\n  let (x: String = 42)\n    x + 1)\n\nres6 = test.catch(() ->\n  let (str: String(endsWith(\"A\")) = \"Pigeon\".reverse())\n    str.reverse())\n\nres7 = test.catch(() ->\n  let (x: Duration(unit == \"min\") = 3.min + 2.min)\n    let (y: Float(!isPositive) = 1.2 + 1.3)\n      x * y)\n\nres8 = test.catch(() ->\n  let (xs: List<Null|Boolean|\"Pigeon\"> = List(\"Barn Owl\", true, null))\n    xs)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/list.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal list1 = List(1, \"two\", 3)\nlocal list2 = List(1, \"two\", 4)\n\nexamples {\n  [\"equality\"] {\n    list1 == list1\n    list1 == list2\n    list1 == list1.toSet()\n    list1 == list2.toSet()\n  }\n\n  [\"inequality\"] {\n    list1 != list1\n    list1 != list2\n    list1 != list1.toSet()\n    list1 != list2.toSet()\n  }\n\n  [\"addition\"] {\n    list1 + list2\n    List() + List()\n    list1 + List()\n    List() + list2\n    list1 + list2.toSet()\n    List() + Set()\n    list1 + Set()\n    List() + list2.toSet()\n  }\n\n  [\"subscript\"] {\n    list1[0]\n    list1[1]\n    list1[2]\n    module.catch(() -> list1[-1])\n    module.catch(() -> list1[3])\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodDynamicBinding.pkl",
    "content": "class X {\n  x = 1\n  y = compute()\n  local function compute() = x\n}\n\nres1 = new X {}\n\nres2 = (res1) {\n  x = 2\n}\n\nclass X2 {\n  x = 1\n  nested {\n    y = compute()\n    local function compute() = x\n  }\n}\n\nres3 = new X2 {}\n\nres4 = (res3) {\n  x = 2\n}\n\nres5 {\n  x = 1\n  y = compute()\n  local function compute() = x\n}\n\nres6 = (res5) {\n  x = 2\n}\n\nres7 {\n  x = 1\n  nested {\n    y = compute()\n    local function compute() = x\n  }\n}\n\nres8 = (res7) {\n  x = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodInAmendingModule.pkl",
    "content": "amends \"baseModule.pkl\"\n\nimport \"pkl:test\"\n\nlocal function f1(x: Int): Int = x + 1\n\nlocal x = f1(42)\nlocal y = test.catch(() -> f1(\"wrong type\"))\n\nfoo {\n  res1 = x\n  res2 = y\n  res3 = f1(42)\n  res4 = test.catch(() -> f1(\"wrong type\"))\n  bar {\n    local function f1(x: Int): Int = x + 2\n    res5 = f1(42)\n    res6 = test.catch(() -> f1(\"wrong type\"))\n  }\n  c = new C {}\n}\n\nlocal class C {\n  foo {\n    bar {\n      local function f1(x: Int): Int = x + 2\n      res7 = f1(42)\n      res8   = test.catch(() -> f1(\"wrong type\"))\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodOverride1.pkl",
    "content": "// try to override local function, referenced from same scope, with local function in subclass\n\nopen class Foo1 {\n  local function f() = \"original\"\n  x = f()\n}\n\nclass Foo2 extends Foo1 {\n  local function f() = \"override\"\n}\n\nres1 = new Foo2 {}.x\n\n// try to override local function, referenced from same scope, with non-local function in subclass\n\nopen class Foo3 {\n  local function f() = \"original\"\n  x = f()\n}\n\nclass Foo4 extends Foo3 {\n  function f() = \"override\"\n}\n\nres2 = new Foo4 {}.x\n\n// try to override non-local function, referenced from same scope, with local function in subclass\n\nopen class Foo5 {\n  function f() = \"original\"\n  x = f()\n}\n\nclass Foo6 extends Foo5 {\n  local function f() = \"override\"\n}\n\nres3 = new Foo6 {}.x\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodOverride2.pkl",
    "content": "// try to override local function, referenced from nested scope, with local function in subclass\n\nopen class Foo1 {\n  local function f() = \"original\"\n  foo {\n    x = f()\n  }\n}\n\nclass Foo2 extends Foo1 {\n  local function f() = \"override\"\n}\n\nres1 = new Foo2 {}.foo.x\n\n// try to override local function, referenced from nested scope, with non-local function in subclass\n\nopen class Foo3 {\n  local function f() = \"original\"\n  foo {\n    x = f()\n  }\n}\n\nclass Foo4 extends Foo3 {\n  function f() = \"override\"\n}\n\nres2 = new Foo4 {}.foo.x\n\n// try to override non-local function, referenced from nested scope, with local function in subclass\n\nopen class Foo5 {\n  function f() = \"original\"\n  foo {\n    x = f()\n  }\n}\n\nclass Foo6 extends Foo5 {\n  local function f() = \"override\"\n}\n\nres3 = new Foo6 {}.foo.x\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodTyped.pkl",
    "content": "local function f1(): Int = 1\nlocal function f2(x: Int): Int = x + 1\nlocal function f3(x: Int, y: Int): Int = x + y + 1\n\nres1 = f1()\nres2 = f2(42)\nres3 = f3(42, 21)\n\nfoo1 {\n  res4 = f1()\n  res5 = f2(42)\n  res6 = f3(42, 21)\n  bar1 {\n    res7 = f1()\n    res8 = f2(42)\n    res9 = f3(42, 21)\n    baz1 {\n      res10 = f1()\n      res11 = f2(42)\n      res12 = f3(42, 21)\n    }\n  }\n}\n\nfoo2 {\n  local function f1(): Int = 2\n  local function f2(x: Int) = x + 2\n  local function f3(x: Int, y: Int) = x + y + 2\n\n  res13 = f1()\n  res14 = f2(42)\n  res15 = f3(42, 21)\n  bar2 {\n    res16 = f1()\n    res17 = f2(42)\n    res18 = f3(42, 21)\n    baz2 {\n      res19 = f1()\n      res20 = f2(42)\n      res21 = f3(42, 21)\n    }\n  }\n}\n\nfoo3 {\n  res22 = f1()\n  res23 = f2(42)\n  res24 = f3(42, 21)\n  bar3 {\n    local function f1(): Int = 3\n    local function f2(x: Int) = x + 3\n    local function f3(x: Int, y: Int) = x + y + 3\n\n    res25 = f1()\n    res26 = f2(42)\n    res27 = f3(42, 21)\n    baz3 {\n      res28 = f1()\n      res29 = f2(42)\n      res30 = f3(42, 21)\n    }\n  }\n}\n\nfoo4 {\n  res22 = f1()\n  res23 = f2(42)\n  res24 = f3(42, 21)\n  bar4 {\n    res25 = f1()\n    res26 = f2(42)\n    res27 = f3(42, 21)\n    baz4 {\n      local function f1(): Int = 4\n      local function f2(x: Int) = x + 4\n      local function f3(x: Int, y: Int) = x + y + 4\n\n      res28 = f1()\n      res29 = f2(42)\n      res30 = f3(42, 21)\n    }\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodTyped2.pkl",
    "content": "class C {\n  local function f1(): Int = 1\n  local function f2(x: Int): Int = x + 1\n  local function f3(x: Int, y: Int): Int = x + y + 1\n\n  res1 = f1()\n  res2 = f2(42)\n  res3 = f3(42, 21)\n\n  foo1 {\n    res4 = f1()\n    res5 = f2(42)\n    res6 = f3(42, 21)\n    bar1 {\n      res7 = f1()\n      res8 = f2(42)\n      res9 = f3(42, 21)\n      baz1 {\n        res10 = f1()\n        res11 = f2(42)\n        res12 = f3(42, 21)\n      }\n    }\n  }\n\n  foo2 {\n    local function f1(): Int = 2\n    local function f2(x: Int) = x + 2\n    local function f3(x: Int, y: Int) = x + y + 2\n\n    res13 = f1()\n    res14 = f2(42)\n    res15 = f3(42, 21)\n    bar2 {\n      res16 = f1()\n      res17 = f2(42)\n      res18 = f3(42, 21)\n      baz2 {\n        res19 = f1()\n        res20 = f2(42)\n        res21 = f3(42, 21)\n      }\n    }\n  }\n\n  foo3 {\n    res22 = f1()\n    res23 = f2(42)\n    res24 = f3(42, 21)\n    bar3 {\n      local function f1(): Int = 3\n      local function f2(x: Int) = x + 3\n      local function f3(x: Int, y: Int) = x + y + 3\n\n      res25 = f1()\n      res26 = f2(42)\n      res27 = f3(42, 21)\n      baz3 {\n        res28 = f1()\n        res29 = f2(42)\n        res30 = f3(42, 21)\n      }\n    }\n  }\n\n  foo4 {\n    res22 = f1()\n    res23 = f2(42)\n    res24 = f3(42, 21)\n    bar4 {\n      res25 = f1()\n      res26 = f2(42)\n      res27 = f3(42, 21)\n      baz4 {\n        local function f1(): Int = 4\n        local function f2(x: Int) = x + 4\n        local function f3(x: Int, y: Int) = x + y + 4\n\n        res28 = f1()\n        res29 = f2(42)\n        res30 = f3(42, 21)\n      }\n    }\n  }\n}\n\nc = new C {}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodTyped3.pkl",
    "content": "import \"pkl:test\"\n\nlocal function f1(): Int = \"wrong type\"\nlocal function f2(x: Int): Int = x\nlocal function f3(x: Int, y: Int): Int = x + y\n\nfoo {\n  res1 = test.catch(() -> f1())\n  res2 = test.catch(() -> f2(\"wrong type\"))\n  res3 = test.catch(() -> f3(42, \"wrong type\"))\n  bar {\n    res4 = test.catch(() -> f1())\n    res5 = test.catch(() -> f2(\"wrong type\"))\n    res6 = test.catch(() -> f3(42, \"wrong type\"))\n    baz {\n      res7 = test.catch(() -> f1())\n      res8 = test.catch(() -> f2(\"wrong type\"))\n      res9 = test.catch(() -> f3(42, \"wrong type\"))\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodTyped4.pkl",
    "content": "import \"pkl:test\"\n\nclass C {\n  local function f1(): Int = \"wrong type\"\n  local function f2(x: Int): Int = x\n  local function f3(x: Int, y: Int): Int = x + y\n\n  foo {\n    res1 = test.catch(() -> f1())\n    res2 = test.catch(() -> f2(\"wrong type\"))\n    res3 = test.catch(() -> f3(42, \"wrong type\"))\n    bar {\n      res4 = test.catch(() -> f1())\n      res5 = test.catch(() -> f2(\"wrong type\"))\n      res6 = test.catch(() -> f3(42, \"wrong type\"))\n      baz {\n        res7 = test.catch(() -> f1())\n        res8 = test.catch(() -> f2(\"wrong type\"))\n        res9 = test.catch(() -> f3(42, \"wrong type\"))\n      }\n    }\n  }\n}\n\nc = new C {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodTyped5.pkl",
    "content": "import \"pkl:test\"\n\nfoo {\n  local function f1(): NonExistingType = 42\n  local function f2(x: NonExistingType): Int = x\n  local function f3(x: Int, y: NonExistingType): Int = x + y\n\n  res1 = test.catch(() -> f1())\n  res2 = test.catch(() -> f2(42))\n  res3 = test.catch(() -> f3(42, 21))\n  bar {\n    res4 = test.catch(() -> f1())\n    res5 = test.catch(() -> f2(42))\n    res6 = test.catch(() -> f3(42, 21))\n    baz {\n      res7 = test.catch(() -> f1())\n      res8 = test.catch(() -> f2(42))\n      res9 = test.catch(() -> f3(42, 21))\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodTyped6.pkl",
    "content": "import \"pkl:test\"\n\nclass C {\n  foo {\n    local function f1(): NonExistingType = 42\n    local function f2(x: NonExistingType): Int = x\n    local function f3(x: Int, y: NonExistingType): Int = x + y\n\n    res1 = test.catch(() -> f1())\n    res2 = test.catch(() -> f2(42))\n    res3 = test.catch(() -> f3(42, 21))\n    bar {\n      res4 = test.catch(() -> f1())\n      res5 = test.catch(() -> f2(42))\n      res6 = test.catch(() -> f3(42, 21))\n      baz {\n        res7 = test.catch(() -> f1())\n        res8 = test.catch(() -> f2(42))\n        res9 = test.catch(() -> f3(42, 21))\n      }\n    }\n  }\n}\n\nc = new C {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localMethodUntyped.pkl",
    "content": "local function f1() = 1\nlocal function f2(x) = x + 1\nlocal function f3(x, y) = x + y + 1\nres1 = f1()\nres2 = f2(42)\nres3 = f3(42, 21)\n\nfoo1 {\n  res4 = f1()\n  res5 = f2(42)\n  res6 = f3(42, 21)\n  bar1 {\n    res7 = f1()\n    res8 = f2(42)\n    res9 = f3(42, 21)\n    baz1 {\n      res10 = f1()\n      res11 = f2(42)\n      res12 = f3(42, 21)\n    }\n  }\n}\n\nfoo2 {\n  local function f1() = 2\n  local function f2(x) = x + 2\n  local function f3(x, y) = x + y + 2\n  res13 = f1()\n  res14 = f2(42)\n  res15 = f3(42, 21)\n  bar2 {\n    res16 = f1()\n    res17 = f2(42)\n    res18 = f3(42, 21)\n    baz2 {\n      res19 = f1()\n      res20 = f2(42)\n      res21 = f3(42, 21)\n    }\n  }\n}\n\nfoo3 {\n  res22 = f1()\n  res23 = f2(42)\n  res24 = f3(42, 21)\n  bar3 {\n    local function f1() = 3\n    local function f2(x) = x + 3\n    local function f3(x, y) = x + y + 3\n    res25 = f1()\n    res26 = f2(42)\n    res27 = f3(42, 21)\n    baz3 {\n      res28 = f1()\n      res29 = f2(42)\n      res30 = f3(42, 21)\n    }\n  }\n}\n\nfoo4 {\n  res22 = f1()\n  res23 = f2(42)\n  res24 = f3(42, 21)\n  bar4 {\n    res25 = f1()\n    res26 = f2(42)\n    res27 = f3(42, 21)\n    baz4 {\n      local function f1() = 4\n      local function f2(x) = x + 4\n      local function f3(x, y) = x + y + 4\n      res28 = f1()\n      res29 = f2(42)\n      res30 = f3(42, 21)\n    }\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localModuleMemberOverride1.pkl",
    "content": "open module localModuleMemberOverride1\n\nlocal class C1 {\n  x = \"original\"\n}\nlocal class C2 {\n  x = \"original\"\n}\nclass C3 {\n  x = \"original\"\n}\n\nlocal p1 = \"original\"\nlocal p2 = \"original\"\np3 = \"original\"\n\nlocal function f1() = \"original\"\nlocal function f2() = \"original\"\nfunction f3() = \"original\"\n\nc1 = new C1 {}.x\nc2 = new C2 {}.x\nc3 = new C3 {}.x\n\npp1 = p1\npp2 = p2\npp3 = p3\n\nff1 = f1()\nff2 = f2()\nff3 = f3()\n\nfoo {\n  c1 = new C1 {}.x\n  c2 = new C2 {}.x\n  c3 = new C3 {}.x\n\n  pp1 = p1\n  pp2 = p2\n  pp3 = p3\n\n  ff1 = f1()\n  ff2 = f2()\n  ff3 = f3()\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localModuleMemberOverride2.pkl",
    "content": "extends \"localModuleMemberOverride1.pkl\"\n\nlocal class C1 {\n  x = \"override\"\n}\nclass C2 {\n  x = \"override\"\n}\nlocal class C3 {\n  x = \"override\"\n}\n\nlocal p1 = \"override\"\np2 = \"override\"\nlocal p3 = \"override\"\n\nlocal function f1() = \"override\"\nfunction f2() = \"override\"\nlocal function f3() = \"override\"\n\nres1 = c1\nres2 = c2\nres3 = c3\n\nres4 = pp1\nres5 = pp2\nres6 = pp3\n\nres7 = ff1\nres8 = ff2\nres9 = ff3\n\nres10 = foo.c1\nres11 = foo.c2\nres12 = foo.c3\n\nres13 = foo.pp1\nres14 = foo.pp2\nres15 = foo.pp3\n\nres16 = foo.ff1\nres17 = foo.ff2\nres18 = foo.ff3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localProperty1.pkl",
    "content": "local l = 1\n\nfoo {\n  local l = 2\n  bar {\n    baz = l\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localProperty2.pkl",
    "content": "import \"pkl:test\"\n\nfoo {\n  local x = 2\n}\n\n// should not be accessible\nfooX = test.catch(() -> foo.x)\n\nbar {\n  local x = 3\n  y = x\n}\n\n// indirectly force eval of bar.x (although it should\n// already have been forced due to how snippet tests work)\nbarY = bar.y\n\n// should not be accessible\nbarX = test.catch(() -> bar.x)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localPropertyAmendInAmendingModule.pkl",
    "content": "amends \"baseModule.pkl\"\n\nlocal object {\n  property = \"value\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localPropertyInAmendingModule.pkl",
    "content": "amends \"baseModule.pkl\"\n\nimport \"pkl:test\"\n\nlocal x: Int = 42\nlocal y: Int = \"wrong type\"\n\nlocal a = x\nlocal b = y\n\nfoo {\n  res1 = a\n  res2 = test.catch(() -> b)\n  res3 = x\n  res4 = test.catch(() -> y)\n  bar {\n    local x: Int = 42\n    local y: Int = \"wrong type\"\n    res5 = x\n    res6 = test.catch(() -> y)\n  }\n  c = new C {}\n}\n\nlocal class C {\n  foo {\n    //res7 = x\n    res8 = test.catch(() -> y)\n    bar {\n      local x: Int = 42\n      local y: Int = \"wrong type\"\n      res9 = x\n      res10 = test.catch(() -> y)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localPropertyOverride1.pkl",
    "content": "// try to override local property, referenced from same scope, with local property on amend\n\nfoo1 {\n  local l = \"original\"\n  x = l\n}\n\nfoo2 = (foo1) {\n  local l = \"override\"\n}\n\nres1 = foo2.x\n\n// try to override local property, referenced from same scope, with non-local property on amend\n\nfoo3 {\n  local l = \"original\"\n  x = l\n}\n\nfoo4 = (foo3) {\n  l = \"override\"\n}\n\nres2 = foo4.x\n\n// try to override non-local property, referenced from same scope, with local property on amend\n\nfoo5 {\n  l = \"original\"\n  x = l\n}\n\nfoo6 = (foo5) {\n  local l = \"override\"\n}\n\nres3 = foo6.x\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localPropertyOverride2.pkl",
    "content": "// try to override local property, referenced from nested scope, with local property on amend\n\nfoo1 {\n  local l = \"original\"\n  bar {\n    x = l\n  }\n}\n\nfoo2 = (foo1) {\n  local l = \"override\"\n}\n\nres1 = foo2.bar.x\n\n// try to override local property, referenced from nested scope, with non-local property on amend\n\nfoo3 {\n  local l = \"original\"\n  bar {\n    x = l\n  }\n}\n\nfoo4 = (foo3) {\n  l = \"override\"\n}\n\nres2 = foo4.bar.x\n\n// try to override non-local property, referenced from nested scope, with local property on amend\n\nfoo5 {\n  l = \"original\"\n  bar {\n    x = l\n  }\n}\n\nfoo6 = (foo5) {\n  local l = \"override\"\n}\n\nres3 = foo6.bar.x\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localPropertyOverride3.pkl",
    "content": "// verify that foo2.y gets foo2.l even though foo1.l is already in the property cache\n\nfoo1 {\n  local l = \"origi\" + \"nal\"\n  x = l\n}\n\nfoo2 = (foo1) {\n  local l = \"over\" + \"ridden\"\n  y = l\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localTypedClassMember.pkl",
    "content": "import \"pkl:test\"\n\nclass Foo { x: Int }\n\nclass C {\n  local p1: Int = 42\n  local p2: Int = \"foo\"\n  local p3: List<String> = List(\"foo\", \"bar\")\n  local p4: List<String> = List(\"foo\", 42)\n  local p6: Foo = new { x = 10 }\n\n  res1 = p1\n  res2 = test.catch(() -> p2)\n  res3 = p3\n  res4 = test.catch(() -> p4)\n  res6 = p6\n\n  local function f1(x: Int): Int = x\n  local function f2(x: Int): String = x\n  local function f3(x: List<String>): Int = x.length\n\n  res7 = f1(42)\n  res8 = test.catch(() -> f1(\"foo\"))\n  res9 = test.catch(() -> f2(42))\n  res10 = f3(List(\"foo\", \"bar\"))\n  res11 = test.catch(() -> f3(List(\"foo\", 42)))\n}\n\nc = new C {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localTypedModuleMember.pkl",
    "content": "import \"pkl:test\"\n\nclass Foo { x: Int }\n\nlocal p1: Int = 42\nlocal p2: Int = \"foo\"\nlocal p3: List<String> = List(\"foo\", \"bar\")\nlocal p4: List<String> = List(\"foo\", 42)\nlocal p6: Foo = new { x = 10 }\n\nres1 = p1\nres2 = test.catch(() -> p2)\nres3 = p3\nres4 = test.catch(() -> p4)\nres6 = p6\n\nlocal function f1(x: Int): Int = x\nlocal function f2(x: Int): String = x\nlocal function f3(x: List<String>): Int = x.length\n\nres7 = f1(42)\nres8 = test.catch(() -> f1(\"foo\"))\nres9 = test.catch(() -> f2(42))\nres10 = f3(List(\"foo\", \"bar\"))\nres11 = test.catch(() -> f3(List(\"foo\", 42)))\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/localTypedObjectMember.pkl",
    "content": "import \"pkl:test\"\n\nclass Foo { x: Int }\n\nfoo {\n  local p1: Int = 42\n  local p2: Int = \"foo\"\n  local p3: List<String> = List(\"foo\", \"bar\")\n  local p4: List<String> = List(\"foo\", 42)\n  local p6: Foo = new { x = 10 }\n\n  res1 = p1\n  res2 = test.catch(() -> p2)\n  res3 = p3\n  res4 = test.catch(() -> p4)\n  res6 = p6\n\n  local function f1(x: Int): Int = x\n  local function f2(x: Int): String = x\n  local function f3(x: List<String>): Int = x.length\n\n  res7 = f1(42)\n  res8 = test.catch(() -> f1(\"foo\"))\n  res9 = test.catch(() -> f2(42))\n  res10 = f3(List(\"foo\", \"bar\"))\n  res11 = test.catch(() -> f3(List(\"foo\", 42)))\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/map.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal map1 = Map(1, 1, \"two\", 2, \"three\", 3)\nlocal map2 = Map(30, new Dynamic { name = \"Pigeon\" }, new Dynamic { name = \"Pigeon\" }, 30, 1, 1)\n\nfacts {\n  [\"equality\"] {\n    map1 == map1\n    map1 == Map(\"three\", 3, 1, 1, \"two\", 2)\n    !(map1 == map2)\n  }\n\n  [\"inequality\"] {\n    map1 != map2\n    !(map1 != map1)\n    !(map1 != Map(\"three\", 3, 1, 1, \"two\", 2))\n  }\n}\n\nexamples {\n  [\"construction\"] {\n    Map(1, 1, 2, 2, 1, 3, 2, 4)\n    Map(1, 1, 2, 2, 1, \"three\", 2, \"four\")\n  }\n\n  [\"addition\"] {\n    map1 + map1\n    map1 + Map(\"three\", 3, 1, 1, \"two\", 2)\n    map1 + map2\n    Map() + Map()\n    map1 + Map()\n    Map() + map1\n    Map(1, 11) + Map(1, 1, 2, 2)\n    Map(1, 1, 2, 2) + Map(1, 11)\n  }\n\n  [\"subscript\"] {\n    map1[1]\n    map1[\"two\"]\n    map1[\"three\"]\n    map2[30]\n    map2[new Dynamic { name = \"Pigeon\" }]\n    map2[1]\n\n    local map3 = Map(1111, 1, \"two\", 2, \"three\", 3, \"tree\", 4)\n    module.catch(() -> map3[\"hree\"])\n    module.catch(() -> map3[\"other\"])\n    module.catch(() -> map3[\"1111\"])\n    module.catch(() -> map3[11111])\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/minPklVersion.pkl",
    "content": "examples {\n  [\"minPklVersion check\"] {\n    Class1 {}\n    Class2 {}\n  }\n}\n\n@ModuleInfo { minPklVersion = \"0.8.0\" }\nclass Class1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/moduleRef1.pkl",
    "content": "module test\n\nconst a = 42\n\nm1 = module.a\n\nfoo {\n  b = 43\n  m2 = module.a\n  m3 = module.foo.b\n  local c = () -> module.foo.b\n  m4 = c.apply()\n}\n\nm5 = f()\n\nm6 = new Person {}\n\nfunction f() = module.a\n\nclass Person {\n  age = module.a\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/moduleRef2.pkl",
    "content": "amends \"moduleRefLibrary.pkl\"\n\nfoo {\n  m1 = module.a\n  b = 43\n  m2 = module.foo.b\n  local c = () -> module.a\n  m3 = c.apply()\n  m4 = new Person {}\n}\n\nlocal class Person {\n  age: Int = module.a\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/moduleRef3.pkl",
    "content": "extends \"moduleRefLibrary.pkl\"\n\nconst a = 44\n\nm1 = module.a\n\nconst b = 43\n\nm2 = module.b\n\nfoo {\n  m3 = module.a\n  m4 = module.b\n  local c = () -> module.a\n  m5 = c.apply()\n}\n\nm6 = f()\n\nm7 = new Person {}\n\nfunction f() = module.a\n\nclass Person {\n  age = module.a\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/moduleRefLibrary.pkl",
    "content": "open module moduleRefLibrary\n\nconst a = 42\n\naa = module.a\n\nfoo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/new.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n}\n\nres1 = new { name = \"Pigeon\" }\n\nres2: Person = new { name = \"Pigeon\" }\n\nlocal localProperty: Person = new { name = \"Pigeon\" }\nres3 = localProperty\n\ndynamic {\n  res4 = new { name = \"Pigeon\" }\n\n  local localDynamic: Person = new { name = \"Pigeon\" }\n  res5 = localDynamic\n\n  new { name = \"Pigeon\" }\n\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\n\nopen class Company {\n  ceo: Person = new { name = \"Pigeon\" }\n}\n\nclass MyCompany extends Company {\n  ceo = new { name = \"Pigeon\" }\n}\n\nres6 = new Company {}\n\nres7 = new MyCompany {}\n\nres8 = new Company {\n  ceo = new { name = \"Pigeon\" }\n}\n\nres9 = new MyCompany {\n  ceo = new { name = \"Pigeon\" }\n}\n\nres10 = new Listing {\n  new { name = \"Pigeon\" }\n}\nres11 = (res10) {\n  [0] = new { name = \"Pigeon\" }\n}\n\nres12: Listing<Person> = new {\n  new { name = \"Pigeon\" }\n}\nres13 = (res12) {\n  [0] = new { name = \"Pigeon\" }\n}\n\nlocal localListing: Listing<Person> = new {\n  new { name = \"Pigeon\" }\n}\nres14 = localListing\nres15 = (res14) {\n  [0] = new { name = \"Pigeon\" }\n}\n\nres16 = new Mapping {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\nres17 = (res16) {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\n\nres18: Mapping<String, Person> = new {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\nres19 = (res18) {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\n\nlocal localMapping: Mapping<String, Person> = new {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\nres20 = localMapping\nres21 = (res20) {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n}\n\n// not currently supported\n//res22 = let (x = new { name = \"Pigeon\" }) x\n//res23 = let (x: Person = new { name = \"Pigeon\" }) x\n\nres24 = f1(\"Pigeon\")\nres24b = res24 is Person\nres25 = f2(\"Pigeon\")\nres25b = res25 is Person\nres26 = new X {}.f1(\"Pigeon\")\nres26b = res26 is Person\nres27 = new X {}.f2\nres27b = res27 is Person\nres28 = one.two.f1\nres28b = res28 is Person\nres29 = f3(\"Pigeon\")\nres29b = res29 is Dynamic\nres30 = new Person2 {}.friend\nres30b = res30 is Dynamic\n\nfunction f1(_name): Person = new { name = _name }\nlocal function f2(_name): Person = new { name = _name }\n\nclass X {\n  function f1(_name): Person = new { name = _name }\n  local function f2(_name): Person = new { name = _name }\n  f2 = f2(\"Pigeon\")\n}\n\none {\n  two {\n    local function f1(_name): Person = new { name = _name }\n    f1 = f1(\"Pigeon\")\n  }\n}\n\nfunction f3(_name) = new { name = _name }\n\nclass Person2 {\n  friend = new { name = \"Pigeon\" }\n}\n\nlocal mixin1: Mixin = new { name = \"Other\" }\nres31 = new Person { name = \"Pigeon\" } |> mixin1\nres32 = test.catch(() -> mixin1.apply(new Person {}, new Person {}))\n\nlocal mixin2: Mixin = (mixin1) { name = \"Override\" }\nres33 = new Person { name = \"Pigeon\" } |> mixin2\nres34 = test.catch(() -> mixin2.apply(new Person {}, new Person {}))\n\nlocal mixin3: Mixin<Person> = new { name = \"Other\" }\nres35 = new Person { name = \"Pigeon\" } |> mixin3\nres36 = test.catch(() -> mixin3.apply(new Person {}, new Person {}))\nres37 = test.catch(() -> mixin3.apply(1))\n\nlocal mixin4: Mixin<Person> = (mixin3) { name = \"Override\" }\nres38 = new Person { name = \"Pigeon\" } |> mixin4\nres39 = test.catch(() -> mixin4.apply(new Person {}, new Person {}))\nres40 = test.catch(() -> mixin4.apply(1))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/newInAmendingModuleMethod.pkl",
    "content": "amends \"baseModule.pkl\"\n\nlocal class Person {\n  name: String\n  type: String\n}\n\nlocal function pigeon(): Person = new { name = \"Pigeon\"; type = getClass().simpleName }\n\nlocal function barnOwl() = new { name = \"Barn Owl\"; type = getClass().simpleName }\n\nlocal function parrot(): unknown = new { name = \"Parrot\"; type = getClass().simpleName }\n\nfoo = List(pigeon(), barnOwl(), parrot())\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/newInsideIf.pkl",
    "content": "class Person {\n  name: String\n}\n\nres1 = if (true) new { name = \"Pigeon\" } else null\n\nres2: Person = if (false) null else new { name = \"Pigeon\" }\n\nlocal localProperty: Person = if (true) new { name = \"Pigeon\" } else null\nres3 = localProperty\n\ndynamic {\n  res4 = if (false) null else new { name = \"Pigeon\" }\n\n  local localDynamic: Person = if (true) new { name = \"Pigeon\" } else null\n  res5 = localDynamic\n\n  if (false) null else new { name = \"Pigeon\" }\n\n  [\"Pigeon\"] = if (true) new { name = \"Pigeon\" } else null\n}\n\nopen class Company {\n  ceo: Person = if (false) null else new { name = \"Pigeon\" }\n}\n\nclass MyCompany extends Company {\n  ceo = if (true) new { name = \"Pigeon\" } else null\n}\n\nres6 = new Company {}\n\nres7 = new MyCompany {}\n\nres8 = new Company {\n  ceo = if (false) null else new { name = \"Pigeon\" }\n}\n\nres9 = new MyCompany {\n  ceo = if (true) new { name = \"Pigeon\" } else null\n}\n\nres10 = new Listing {\n  if (false) null else new { name = \"Pigeon\" }\n}\nres11 = (res10) {\n  [0] = if (true) new { name = \"Pigeon\" } else false\n}\n\nres12: Listing<Person> = new {\n  if (false) null else new { name = \"Pigeon\" }\n}\nres13 = (res12) {\n  [0] = if (true) new { name = \"Pigeon\" } else null\n}\n\nlocal localListing: Listing<Person> = new {\n  if (false) null else new { name = \"Pigeon\" }\n}\nres14 = localListing\nres15 = (res14) {\n  [0] = if (true) new { name = \"Pigeon\" } else false\n}\n\nres16 = new Mapping {\n  [\"Pigeon\"] = if (false) null else new { name = \"Pigeon\" }\n}\nres17 = (res16) {\n  [\"Pigeon\"] = if (true) new { name = \"Pigeon\" } else null\n}\n\nres18: Mapping<String, Person> = new {\n  [\"Pigeon\"] = if (false) null else new { name = \"Pigeon\" }\n}\nres19 = (res18) {\n  [\"Pigeon\"] = if (true) new { name = \"Pigeon\" } else null\n}\n\nlocal localMapping: Mapping<String, Person> = new {\n  [\"Pigeon\"] = if (false) null else new { name = \"Pigeon\" }\n}\nres20 = localMapping\nres21 = (res20) {\n  [\"Pigeon\"] = if (true) new { name = \"Pigeon\" } else null\n}\n\n// not yet implemented\n//res22 = let (x = if (false) null else new { name = \"Pigeon\" }) x\n//res23 = let (x: Person = if (true) new { name = \"Pigeon\" } else false) x\n\nres24 = f1(\"Pigeon\")\nres24b = res24 is Person\nres25 = f2(\"Pigeon\")\nres25b = res25 is Person\nres26 = new X {}.f1(\"Pigeon\")\nres26b = res26 is Person\nres27 = new X {}.f2\nres27b = res27 is Person\nres28 = one.two.f1\nres28b = res28 is Person\nres29 = f3(\"Pigeon\")\nres29b = res29 is Dynamic\nres30 = new Person2 {}.friend\nres30b = res30 is Dynamic\n\nfunction f1(_name): Person = if (true) new { name = _name } else null\nlocal function f2(_name): Person = if (true) new { name = _name } else null\n\nclass X {\n  function f1(_name): Person = if (true) new { name = _name } else null\n  local function f2(_name): Person = if (true) new { name = _name } else null\n  f2 = f2(\"Pigeon\")\n}\n\none {\n  two {\n    local function f1(_name): Person = new { name = _name }\n    f1 = if (true) f1(\"Pigeon\") else null\n  }\n}\n\nfunction f3(_name) = new { name = _name }\n\nclass Person2 {\n  friend = new { name = \"Pigeon\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/newInsideLet.pkl",
    "content": "class Person {\n  name: String\n}\n\nres1 = let (x = 1) new { name = \"Pigeon\" }\n\nres2: Person = let (x = 1) new { name = \"Pigeon\" }\n\nlocal localProperty: Person = let (x = 1) new { name = \"Pigeon\" }\nres3 = localProperty\n\ndynamic {\n  res4 = let (x = 1) new { name = \"Pigeon\" }\n\n  local localDynamic: Person = let (x = 1) new { name = \"Pigeon\" }\n  res5 = localDynamic\n\n  let (x = 1) new { name = \"Pigeon\" }\n\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\n\nopen class Company {\n  ceo: Person = let (x = 1) new { name = \"Pigeon\" }\n}\n\nclass MyCompany extends Company {\n  ceo = let (x = 1) new { name = \"Pigeon\" }\n}\n\nres6 = new Company {}\n\nres7 = new MyCompany {}\n\nres8 = new Company {\n  ceo = let (x = 1) new { name = \"Pigeon\" }\n}\n\nres9 = new MyCompany {\n  ceo = let (x = 1) new { name = \"Pigeon\" }\n}\n\nres10 = new Listing {\n  let (x = 1) new { name = \"Pigeon\" }\n}\nres11 = (res10) {\n  [0] = let (x = 1) new { name = \"Pigeon\" }\n}\n\nres12: Listing<Person> = new {\n  let (x = 1) new { name = \"Pigeon\" }\n}\nres13 = (res12) {\n  [0] = let (x = 1) new { name = \"Pigeon\" }\n}\n\nlocal localListing: Listing<Person> = new {\n  let (x = 1) new { name = \"Pigeon\" }\n}\nres14 = localListing\nres15 = (res14) {\n  [0] = let (x = 1) new { name = \"Pigeon\" }\n}\n\nres16 = new Mapping {\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\nres17 = (res16) {\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\n\nres18: Mapping<String, Person> = new {\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\nres19 = (res18) {\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\n\nlocal localMapping: Mapping<String, Person> = new {\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\nres20 = localMapping\nres21 = (res20) {\n  [\"Pigeon\"] = let (x = 1) new { name = \"Pigeon\" }\n}\n\n// not yet implemented\n//res22 = let (x = 1) let (x = new { name = \"Pigeon\" }) x\n//res23 = let (x = 1) let (x: Person = new { name = \"Pigeon\" }) x\n\nres24 = f1(\"Pigeon\")\nres24b = res24 is Person\nres25 = f2(\"Pigeon\")\nres25b = res25 is Person\nres26 = new X {}.f1(\"Pigeon\")\nres26b = res26 is Person\nres27 = new X {}.f2\nres27b = res27 is Person\nres28 = one.two.f1\nres28b = res28 is Person\nres29 = f3(\"Pigeon\")\nres29b = res29 is Dynamic\nres30 = new Person2 {}.friend\nres30b = res30 is Dynamic\n\nfunction f1(_name): Person = let (x = 1) new { name = _name }\nlocal function f2(_name): Person = let (x = 1) new { name = _name }\n\nclass X {\n  function f1(_name): Person = let (x = 1) new { name = _name }\n  local function f2(_name): Person = let (x = 1) new { name = _name }\n  f2 = f2(\"Pigeon\")\n}\n\none {\n  two {\n    local function f1(_name): Person = let (x = 1) new { name = _name }\n    f1 = f1(\"Pigeon\")\n  }\n}\n\nfunction f3(_name) = new { name = _name }\n\nclass Person2 {\n  friend = new { name = \"Pigeon\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/newType.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String\n}\n\nres1 = new Person { name = \"Pigeon\" }\n\nres2 {\n  prop = new Person { name = \"Pigeon\" }\n\n  new Person { name = \"Pigeon\" }\n\n  [\"Pigeon\"] = new Person { name = \"Pigeon\" }\n}\n\nres3 = new Listing {\n  new Person { name = \"Pigeon\" }\n}\nres4 = (res3) {\n  [0] = new Person { name = \"Pigeon\" }\n}\n\nres5 = new Listing<Person> {\n  new Person { name = \"Pigeon\" }\n  new { name = \"Barn Owl\" }\n}\nres6 = (res5) {\n  [0] = new { name = \"Pigeon2\" }\n  [1] { name = \"Barn Owl2\" }\n}\n\nres7 = new Mapping<String, Person> {\n  [\"Pigeon\"] = new Person { name = \"Pigeon\" }\n  [\"Barn Owl\"] = new { name = \"Barn Owl\" }\n  [\"Parrot\"] { name = \"Parrot\" }\n}\nres8 = (res7) {\n  [\"Pigeon\"] = new { name = \"Pigeon2\" }\n  [\"Barn Owl\"] { name = \"Barn Owl2\" }\n}\n\nlocal mixin1 = new Mixin { name = \"Other\" }\nres9 = new Person { name = \"Pigeon\" } |> mixin1\nres9b = test.catch(() -> mixin1.apply(new Person {}, new Person {}))\n\nlocal mixin2 = (mixin1) { name = \"Override\" }\nres9c = new Person { name = \"Pigeon\" } |> mixin2\nres9d = test.catch(() -> mixin2.apply(new Person {}, new Person {}))\n\nlocal mixin3 = new Mixin<Person> { name = \"Other\" }\nres10 = new Person { name = \"Pigeon\" } |> mixin3\nres10b = test.catch(() -> mixin3.apply(new Person {}, new Person {}))\nres10c = test.catch(() -> mixin3.apply(1))\n\nlocal mixin4 = (mixin3) { name = \"Override\" }\nres10d = new Person { name = \"Pigeon\" } |> mixin4\nres10e = test.catch(() -> mixin4.apply(new Person {}, new Person {}))\nres10f = test.catch(() -> mixin4.apply(1))\n\ntypealias Person2 = Person\nres11 = new Person2 { name = \"Pigeon\" }\n\ntypealias PersonMapping = Mapping<String, Person>\nres12 = new PersonMapping {\n  [\"Pigeon\"] = new Person { name = \"Pigeon\" }\n  [\"Barn Owl\"] = new { name = \"Barn Owl\" }\n  [\"Parrot\"] { name = \"Parrot\" }\n}\n\nres13 = new Person? { name = \"Pigeon\" }\n\nres14 = new *Person|String { name = \"Pigeon\" }\n\nres15 = test.catch(() -> new Int {})\n\nres16 = test.catch(() -> new Set {})\n\nres17 = test.catch(() -> new String|Person {})\n\nres18 = test.catch(() -> new \"foo\" {})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/nonNull.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class Person { name: String = \"Pigeon\" }\n\nfacts {\n  [\"returns its non-null operand\"] {\n    123!! == 123\n    let (x = 123) x!! == 123\n    1.23.ms!! == 1.23.ms\n    Pair(21, 42)!! == Pair(21, 42)\n    new Person {}!! == new Person {}\n  }\n}\n\nexamples {\n  [\"fails if operand is null\"] {\n    module.catch(() -> null!!)\n    module.catch(() -> let (x = null) x!!)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/nullable.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"equality\"] {\n    null == null\n    !(null == 1)\n    !(1 == null)\n  }\n\n  [\"inequality\"] {\n    null != 1\n    1 != null\n    !(null != null)\n  }\n}\n\nexamples {\n  [\"literal\"] {\n    null\n  }\n\n  [\"coalescing\"] {\n    null ?? 2\n    1 ?? 2\n    1 ?? 2 ?? 3\n    null ?? null ?? 3\n    new Person {}.age ?? 40\n  }\n\n  [\"null-safe invocation\"] {\n    null?.toUpperCase()\n    \"Pigeon\"?.toUpperCase()\n    null?.kb\n    3?.kb\n\n    module.catch(() -> null.foo)\n    module.catch(() -> null.foo())\n  }\n\n  [\"amendment\"] {\n    local p = Null(new Person {})\n    local p2 = (p) {\n      age = 20\n    }\n    p2\n    p2 is Person\n  }\n}\n\nlocal class Person {\n  age: Int?\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/objectMember.pkl",
    "content": "res1 { 1 2 3 }\nres2 { 1; 2; 3 }\nres3 {\n  1\n  2\n  3\n}\nres4 {1;2;3;}\nres5{1}\nres6{1;2}\nres7{foo = 1}\nres8{foo = 1 bar = 2}\nres9{nested{1}}\nres10{[\"foo\"] = 1; [\"bar\"] = 2}\nres11 { new {} new {} new {} }\nres12 {1.2;.3;.4;.5}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/objectMemberInvalid.pkl",
    "content": "res1 {\n  1.2.3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/objectMemberInvalid2.pkl",
    "content": "res1 {foo=1bar=2}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/objectMemberInvalid3.pkl",
    "content": "res1 {\n  new{\n  }new{\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/parens.pkl",
    "content": "res1 = 2 + 3 * 4\nres2 = (2 + 3) * 4\nres3 = 2 + (3 * 4)\nres4 = (2) + (3) * (4)\nres5 = ((((2) + (3)) * ((4))))"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/propertyDefaults.pkl",
    "content": "class Person\n\ncoll: Collection<Person>\nlist: List<Person>\nset: Set<Person>\nmap: Map<String, Person>\nlisting: Listing<Person>\nmapping: Mapping<String, Person>\nobj: Person\nnullable: Person?\nunion: *Person|String\nstringLiteral: \"Pigeon\"\nnullish: Null\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/rawString.pkl",
    "content": "res1 = #\"\\r\\n\\t\\\\\"#\nres2 = #\"$foo\"#\nres3 = #\"\\(3 * 4)\"#\n\nres4 = #\"\"\"\n\\r\\n\\t\\\\\n\"\"\"#\n\nres5 = #\"\"\"\n$foo\n\"\"\"#\n\nres6 = #\"\"\"\n\\(3 * 4)\n\"\"\"#\n\nres7 = #\"\"\"\n\\r\\n\\t\\\\\n$foo\n\\(3 * 4)\n\"\"\"#\n\nres9 = #\"\"\"\nleading and trailing newline trimmed\n\"\"\"#\n\nres10 = #\"\"\"\n\nleading newline not trimmed\n\"\"\"#\n\nres11 = #\"\"\"\n\n\n\nleading newlines not trimmed\n\"\"\"#\n\nres13 = #\"\"\"\ntrailing newline not trimmed\n\n\"\"\"#\n\nres14 = #\"\"\"\ntrailing newlines not trimmed\n\n\n\n\"\"\"#\n\nres16 = #\"\"\"\n  leading\n  whitespace\n  trimmed\n  \"\"\"#\n\nres17 = #\"\"\"\n    leading\n    whitespace\n    partially\n    trimmed\n  \"\"\"#\n\nres18 = #\"\"\"\n  leading\n    whitespace\n      partially\n        trimmed\n  \"\"\"#\n\nres19 = #\"\"\"\n\"AS IS\"\n\"\"\"#\n\nres20 = #\"\"\"\n\"\"AS IS\"\"\n\"\"\"#\n\nres21 = #\"\"\"\n\"\"\"\"\"AS IS\"\"\"\"\"\n\"\"\"#\n\nlocal body = \"AS IS\"\n\nres22 = #\"\"\"\n\"\\#(body)\"\n\"\"\"#\n\nres23 = #\"\"\"\n\"\"\\#(body)\"\"\n\"\"\"#\n\nres24 = #\"\"\"\n\"\"\"\"\"\\#(body)\"\"\"\"\"\n\"\"\"#\n\nres25 = ##\"# ## ### \" \"\" \"\"\" \\ \\#\"##\n\nres26 = ###\"# ## ### #### \" \"\" \"\"\" \"\"\"\" \\ \\# \\##\"###\n\nres27 = #####\"# ## ### #### ##### ###### \" \"\" \"\"\" \"\"\"\" \"\"\"\"\" \\ \\# \\## \\### \\####\"#####\n\nres28 = #\"one\\#(###\"two\\###(\"three\")two\"###)one\\#(##\"two\"##)\"#\n\nres29 = #\"\\#t \\#(###\"\\###t\\###t \\###(\"\\t\\t\\t\") \\###t\\###t\"###) \\#t \\#(##\"\\##t\\##t\"##)\"#\n\nres30 = #\"\\#u{61} \\#u{1F920} \\#(##\"\\##u{1dd}\"##)\"#\n\nres31 = ###\"\\###u{61} \\###u{1F920} \\###(#\"\\#u{1dd}\"#)\"###\n\nres32 = ##\"\"\"\n  # ## ### \" \"\" \"\"\" \\ \\#\n  \"\"\"##\n\nres33 = ###\"\"\"\n  # ## ### #### \" \"\" \"\"\" \"\"\"\" \\ \\# \\##\n  \"\"\"###\n\nres34 = #####\"\"\"\n  # ## ### #### ##### ###### \" \"\" \"\"\" \"\"\"\" \"\"\"\"\" \\ \\# \\## \\### \\####\n  \"\"\"#####\n\nres35 = #\"\"\"\n  one\\#(###\"two\\###(\"three\")two\"###)one\\#(##\"two\"##)\n  \"\"\"#\n\nres36 = #\"\"\"\n  \\#t \\#(###\"\\###t\\###t \\###(\"\\t\\t\\t\") \\###t\\###t\"###) \\#t \\#(##\"\\##t\\##t\"##)\n  \"\"\"#\n\nres37 = #\"\"\"\n  \\#u{61} \\#u{1F920} \\#(##\"\\##u{1dd}\"##)\n  \"\"\"#\n\nres38 = ###\"\"\"\n  \\###u{61} \\###u{1F920} \\###(#\"\\#u{1dd}\"#)\n  \"\"\"###"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/read.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"read env variable\"] {\n    read(\"env:NAME1\")\n    read(\"env:NAME2\")\n    module.catch(() -> read(\"env:OTHER\"))\n\n    read?(\"env:NAME1\")\n    read?(\"env:NAME2\")\n    read?(\"env:OTHER\")\n  }\n\n  [\"read external property\"] {\n    read(\"prop:name1\")\n    read(\"prop:name2\")\n    module.catch(() -> read(\"prop:other\"))\n\n    read?(\"prop:name1\")\n    read?(\"prop:name2\")\n    read?(\"prop:other\")\n  }\n\n  [\"read file\"] {\n    read(\"globtest/file1.txt\")\n    module.catch(() -> read(\"other.txt\"))\n    read?(\"globtest/file1.txt\")\n    read?(\"other.txt\")\n  }\n  \n  [\"read triple-dot file\"] {\n    read(\".../input-helper/basic/read/resource.txt\")\n    read?(\".../input-helper/basic/read/resource.txt\")\n  }\n\n  [\"read non-allowed resource\"] {\n    module.catch(() -> read(\"forbidden:resource\"))\n    module.catch(() -> read?(\"forbidden:resource\"))\n  }\n  \n  [\"use read expression with non-constant resource URI\"] {\n    local function doRead(uri) = read(uri)\n    doRead(\"globtest/file1.txt\")\n    doRead(\"globtest/file2.txt\")\n  }\n    \n  [\"read different resources with same relative resource URI\"] {\n    local module1 = import(\".../input-helper/basic/read/module1.pkl\")\n    local module2 = import(\".../input-helper/basic/read/child/module2.pkl\")\n    module1.normalRead\n    module2.normalRead\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/readGlob.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"file:\"] {\n    // test globbing while going up levels\n    read*(\"../../input-helper/globtest/**.pkl\")\n    // test globbing child directories\n    read*(\"globtest/*.txt\")\n  }\n\n  [\"amended\"] {\n    (read*(\"../../input-helper/globtest/**.pkl\")) {\n      [[true]] {\n        text = \"hi\"\n      }\n    }\n  }\n\n  [\"env:\"] {\n    // doesn't match names that include slashes\n    read*(\"env:*\")\n    // matches all names including slashes\n    read*(\"env:**\")\n    read*(\"env:NAME1\")\n    read*(\"env:NAME[1-2]\")\n    read*(\"env:*2\")\n    read*(\"env:/foo/*\")\n    // glob pattern should use percent-encoding if pattern is an absolute URI (same rules as `read`)\n    read*(\"env:foo%20bar\")\n    read*(\"env:foo%20*\")\n  }\n\n  [\"prop:\"] {\n    read*(\"prop:*\")\n    read*(\"prop:**\")\n  }\n\n  [\"package:\"] {\n    read*(\"package://localhost:0/birds@0.5.0#/**.pkl\")\n  }\n\n  [\"use read expression with non-constant glob pattern\"] {\n    local function doRead(pattern) = read*(pattern)\n    doRead(\"globtest/file*.txt\")\n    doRead(\"globtest/file1.txt\")\n    doRead(\"globtest/file2.txt\")\n  }\n  \n  [\"read different resources with same glob pattern\"] {\n    local module1 = import(\".../input-helper/basic/read/module1.pkl\")\n    local module2 = import(\".../input-helper/basic/read/child/module2.pkl\")\n    module1.globbedRead\n    module2.globbedRead\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/semicolon.pkl",
    "content": "res1 = new { b = 1; d = 2 }"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/set.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal set1 = Set(1, \"two\", 3)\nlocal set2 = Set(\"two\", 3, 1)\nlocal set3 = Set(1, \"two\", 4)\nlocal emptySet = Set()\n\nfacts {\n  [\"equality\"] {\n    set1 == set1\n    set1 == set2\n    !(set1 == set3)\n\n    !(set1 == set1.toList())\n    !(set1 == set2.toList())\n    !(set1 == set3.toList())\n  }\n\n  [\"inequality\"] {\n    set1 != set3\n    !(set1 != set1)\n    !(set1 != set2)\n\n    set1 != set1.toList()\n    set1 != set2.toList()\n    set1 != set3.toList()\n  }\n}\n\nexamples {\n  [\"construction\"] {\n    Set(1, 2, 3, 1, 2, 4)\n  }\n\n  [\"addition\"] {\n    set1 + set1\n    set1 + set2\n    set1 + set3\n\n    set1 + set1.toList()\n    set1 + set2.toList()\n    set1 + set3.toList()\n    set1 + List(1, \"two\", 4, 1, \"two\", 4)\n\n    emptySet + emptySet\n    set1 + emptySet\n    emptySet + set3\n\n    emptySet + emptySet.toList()\n    set1 + emptySet.toList()\n    emptySet + set3.toList()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/string.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal str1 = \"How\"\nlocal str2 = \"you\"\nlocal str3 = \"this\"\n\nexamples {\n  [\"equality\"] {\n    \"abc\" == \"abc\"\n    \"abc\" == \"abd\"\n  }\n\n  [\"inequality\"] {\n    \"abc\" != \"abc\"\n    \"abc\" != \"abd\"\n  }\n\n  [\"interpolation\"] {\n    \"\\(str1) are \\(str2) today? Are \\(str2) hungry?\"\n    \"Can \\(str2 + \" nest \\(str3)\") for me?\"\n    \"Is \\(str1 + str2) a word?\"\n    \"Is \\(\"soma\") a word?\"\n    \"Can \\(str2 + \" nest (((\") for me?\"\n    \"Can \\(str2 + \" nest )))\") for me?\"\n    \"Can you \\( new Dynamic { x = \"nest \\( new Dynamic { y = str3 }.y )\" }.x ) for me?\"\n  }\n\n  [\"interpolation of different types\"] {\n    \"\\(42)\"\n    \"\\(1.23)\"\n    \"\\(\"Pigeon\")\"\n    \"\\(false)\"\n    \"\\(1.23.ns)\"\n    \"\\(1.23.mb)\"\n    \"\\(Pair(1, 2))\"\n    \"\\(List(1, 2, 3))\"\n    \"\\(Set(1, 2, 3))\"\n    \"\\(Map(1, 2, 3, 4))\"\n    \"\\(new Listing { 1 2 3 })\"\n    \"\\(new Mapping { [\"Pigeon\"] = 42; [\"Barn Owl\"] = 21 })\"\n    \"\\(new Dynamic { name = \"Pigeon\"; age = 42 })\"\n    \"\\(new Person { name = \"Pigeon\"; age = 42 })\"\n    \"\\(new Person2 { name = \"Pigeon\"; age = 42 })\"\n    \"\\(null)\"\n    \"\\(Null(new Person { name = \"Pigeon\"; age = 42 }))\"\n    \"\\(() -> null)\"\n    \"\\((p1) -> null)\"\n    \"\\((p1, p2) -> null)\"\n    \"\\((p1, p2, p3) -> null)\"\n  }\n\n  [\"escaping\"] {\n    \"\\\\\\\"\\\\(\"\n    \"\\t\\r\\n\"\n    \"\\u{9}\\u{30}\\u{100}\\u{1000}\\u{10000}\\u{010000}\\u{0010000}\\u{00010000}\"\n  }\n\n  [\"subscript\"] {\n    str3[2]\n    module.catch(() -> str3[-1])\n    module.catch(() -> str3[4])\n  }\n\n  [\"dollar sign has no special meaning\"] {\n    \"123$\"\n    \"$123\"\n    \"$&%\"\n    \"$\"\n  }\n}\n\nlocal class Person { name: String; age: Int }\n\nlocal class Person2 {\n  name: String\n  age: Int\n  function toString() = \"My name is \\(name) and I'm \\(age) years old.\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/stringError1.pkl",
    "content": "singleLineStringCannotSpanLines = \"\nHow are you today?\nAre you hungry?\n\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/stringMultiline.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal str1 = \"How\"\nlocal str2 = \"you\"\nlocal str3 = \"this\"\n\nexamples {\n  [\"interpolation\"] {\n    \"\"\"\n    How are you today?\n    Are \\(str2) hungry?\\n\n    Can you \\( new Dynamic { x = \"nest \\( new Dynamic { y = str3 }.y )\" }.x ) for me?\n    \"\"\"\n  }\n\n  [\"escaping\"] {\n    \"\"\"\n    \\\\\\\"\\\\(\n    \"\"\"\n\n    \"\"\"\n    \\t\\r\\n\n    \"\"\"\n\n    \"\"\"\n    \\u{9}\\u{30}\\u{100}\\u{1000}\\u{10000}\\u{010000}\\u{0010000}\\u{00010000}\n    \"\"\"\n  }\n\n  [\"dollar sign has no special meaning\"] {\n    \"\"\"\n    123$ $123 $&% $\n    \"\"\"\n  }\n\n  [\"trimming of leading and trailing newlines\"] {\n    \"\"\"\n    leading and trailing newline trimmed\n    \"\"\"\n\n    \"\"\"\n\n    leading newline not trimmed\n    \"\"\"\n\n    \"\"\"\n\n\n\n    leading newlines not trimmed\n    \"\"\"\n\n    \"\"\"\n    trailing newline not trimmed\n\n    \"\"\"\n\n    \"\"\"\n    trailing newlines not trimmed\n\n\n\n    \"\"\"\n  }\n\n  [\"trimming of leading whitespace\"] {\n    \"\"\"\n    leading\n    whitespace\n    trimmed\n    \"\"\"\n\n    \"\"\"\n      leading\n      whitespace\n      partially\n      trimmed\n    \"\"\"\n\n    \"\"\"\n    leading\n      whitespace\n        partially\n          trimmed\n    \"\"\"\n  }\n\n  [\"quotes\"] {\n    \"\"\"\n    \"AS IS\"\n    \"\"\"\n\n    \"\"\"\n    \"\"AS IS\"\"\n    \"\"\"\n\n    local body = \"AS IS\"\n\n    \"\"\"\n    \"\\(body)\"\n    \"\"\"\n\n    \"\"\"\n    \"\"\\(body)\"\"\n    \"\"\"\n\n    \"\"\"\n    trailing newline not trimmed (trailing quotes)\n    \"\"\n    \"\"\"\n\n    local interpolatedString = \"interpolated string\"\n\n    \"\"\"\n    trailing newline with \\(interpolatedString) not trimmed (trailing quotes)\n    \"\"\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/stringUnicode.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal str1 = \"😈👿👾\"\nlocal str2 = \"🤑🤓😎\"\nlocal str3 = \"🙈🙉🙊🐒\"\n\nfacts {\n  [\"equality\"] {\n    \"😀😬😁\" == \"😀😬😁\"\n    !(\"😀😬😁\" == \"😀😬🐭\")\n  }\n\n  [\"inequality\"] {\n    \"😀😬😁\" != \"😀😬🐭\"\n    !(\"😀😬😁\" != \"😀😬😁\")\n  }\n}\n\nexamples {\n  [\"interpolation\"] {\n    \"\\(str1) are \\(str2) today? Are \\(str2) hungry?\"\n    \"Can \\(str2 + \" nest \\(str3)\") for me?\"\n    \"Is \\(str1 + str2) a word?\"\n    \"Is \\(\"soma\") a word?\"\n    \"Can \\(str2 + \" nest (((\") for me?\"\n    \"Can \\(str2 + \" nest )))\") for me?\"\n    \"Can you \\( new Dynamic { x = \"nest \\( new Dynamic { y = str3 }.y )\" }.x ) for me?\"\n  }\n\n  [\"multiline interpolation\"] {\n    \"\"\"\n    How are you today?\n    Are \\(str2) hungry?\\n\n    Can you \\( new Dynamic { x = \"nest \\( new Dynamic { y = str3 }.y )\" }.x ) for me?\n    \"\"\"\n  }\n\n  [\"subscript\"] {\n    str3[2]\n    module.catch(() -> str3[-1])\n    module.catch(() -> str3[4])\n  }\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/trace.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"trace different values\"] {\n    trace(1)\n    trace(true)\n    trace(\"Barn Owl\")\n    trace(\"\"\"\n      Bird\n      Barn Owl\n      \"\"\")\n    trace(List(1, 2, 3))\n    trace(Set(1, 2, 3))\n    trace(Map(1, \"one\", 2, \"two\"))\n    trace(new {\n      name = \"Barn Owl\"\n      age = 42\n    })\n    trace(new {\n      \"Parrot\"\n      \"Barn Owl\"\n      \"Pigeon\"\n    })\n    trace(new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 42\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/typeResolution1.pkl",
    "content": "open module typeResolution1\n\nclass Person1 { name = \"person1\" }\n\np1: Person1"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/typeResolution2.pkl",
    "content": "extends \"typeResolution1.pkl\"\n\nclass Person2 { name = \"person2\" }\n\npp1: Person1\npp2: Person2\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/typeResolution3.pkl",
    "content": "amends \"typeResolution2.pkl\"\n\nlocal class Person3 { name = \"person3\" }\n\nlocal ppp1: Person1 = new Person1 {}\nlocal ppp2: Person2 = new Person2 {}\nlocal ppp3: Person3 = new Person3 {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/typeResolution4.pkl",
    "content": "import \"typeResolution1.pkl\"\nimport \"typeResolution2.pkl\"\nimport \"typeResolution3.pkl\"\n\nres1: typeResolution1.Person1\nres2: typeResolution2.Person1\nres3: typeResolution2.Person2\nres4: typeResolution3.Person1\nres5: typeResolution3.Person2\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/basic/underscore.pkl",
    "content": "local lambda = (_, _, _) -> 3\n\nl1 = lambda.apply(1, 2, \"\")\n\nfunction fun(_, x: Int, _) = x + 10\n\nf1 = fun(\"foo\", 1, \"foo\")\n\nfoo = new Dynamic {\n  for (_, _ in Map(\"a\", 1, \"b\", 2)) {\n    0\n  }\n}\n\nfoo2 = new Dynamic {\n  for (_ in Map(\"a\", 1, \"b\", 2)) {\n    0\n  }\n}\n\nbar = new Dynamic {\n  for (_, v in Map(\"a\", 1, \"b\", 2)) {\n    for (k, _ in Map(\"a\", 1, \"b\", 2)) {\n      [\"\\(k)\\(v)\"] = v\n    }\n  }\n}\n\nbaz = new Dynamic {\n  for (k1, _ in Map(\"a\", 1, \"b\", 2)) {\n    for (k2, _ in Map(\"a\", 1, \"b\", 2)) {\n      [\"\\(k1)\\(k2)\"] = k1\n    }\n  }\n}\n\nqux = new Dynamic {\n  for (_, v1 in Map(\"a\", 1, \"b\", 2)) {\n    for (_, v2 in Map(\"a\", 1, \"b\", 2)) {\n      [\"\\(v1)\\(v2)\"] = v1 + v2\n    }\n  }\n}\n\nclass Bird {\n  name: String\n  age: Int\n}\n\nclass B {\n  hidden mkBird: (String, Int) -> Bird = (_name, _age) -> new Bird {\n    name = _name\n    age = _age\n  }\n  bird = mkBird.apply(\"Robin\", 2)\n}\n\nbird1 = new B {\n  mkBird { _, _age ->\n    name = \"Swallow\"\n    age = _age\n  }\n}\n\nbird2 = new B {\n  mkBird { _name, _ ->\n    name = _name\n    age = 3\n  }\n}\n\nvar = let (_ = \"foo\") 0\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/class1.pkl",
    "content": "class Person extends Typed {\n  name = \"X\"\n  age = 40\n}\n\npigeon = new Person {\n  name = \"Pigeon Who\"\n}\n\npigeonName = pigeon.name\npigeonAge = pigeon.age\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/class2.pkl",
    "content": "class Person {\n  name: String = \"X\"\n  age: Int = 40\n  friends: List<Person>\n  address: Address\n}\n\nclass Address {\n  street: String = \"Howdy St\"\n}\n\npigeon = new Person {\n  name = \"Pigeon Who\"\n  age = 30\n  friends = List(\n    new Person {\n      name = \"Emma\"\n    },\n    new Person {\n      name = \"Tony\"\n    }\n  )\n  address {\n    street = \"Pigeon St.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/class2a.pkl",
    "content": "class Person {\n  name: String = \"X\"\n  age: Int = 40\n  friends: Set\n  address: Address\n}\n\nclass Address {\n  street: String = \"Howdy St\"\n}\n\npigeon = new Person {\n  name = \"Pigeon Who\"\n  age = 30\n  friends = super.friends + List(\n    new Person {\n      name = \"Emma\"\n    }\n    // add another once we have sets with deterministic iteration order\n  )\n  address {\n    street = \"Pigeon St.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/class3.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n  friends: List<Person>\n  address: String\n}\n\nperson = new Person {\n  name = \"Pigeon\"\n  // typo\n  address_ = \"Howdy St.\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/class4.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  foo = 1\n  function bar() = 2\n}\n\n// make sure that these invocations are dispatched to the\n// class object rather than the prototype, and that they\n// generate the usual \"not found\" error\nres1 = test.catch(() -> Person.foo)\nres2 = test.catch(() -> Person.bar())\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints1.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  name: String(length.isBetween(10, 20))\n}\n\nclass Person2 {\n  alternativeNames: Listing<String>(!isEmpty)\n}\n\nres1 = new Person {\n  name = \"Linda Forth\"\n}\n\nres2 = test.catch(() ->\n  new Person {\n    name = \"Pigeon\"\n  }.name\n)\n\nres3: Person2 = new {\n  alternativeNames = new {\n    \"Parrot\"\n  }\n}\n\nres4 = test.catch(() ->\n  new Person2 {\n    alternativeNames {}\n  }.alternativeNames\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints10.pkl",
    "content": "import \"pkl:test\"\n\nconst function matches(pattern: String): (String) -> Boolean = (str) -> str.matches(Regex(pattern))\n\nclass X {\n  a: String(length >= 5, matches(\"\\\\w+\\\\.\\\\w+\")) = \"one.two\"\n}\n\nres1 = new X {}\n\nres2 = new X {\n  a = \"five.six\"\n}\n\nres3 = test.catch(() ->\n  new X {\n    a = \"n.o\"\n  }.a\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints11.pkl",
    "content": "import \"pkl:test\"\n\nabstract class Base {\n  x: Int = 1\n  y: Int(this > x) = 2\n  yy: Int(isValid1) = 2\n  yyy: Int(isValid2) = 2\n\n  local isValid1 = (n) -> n > x\n  hidden isValid2 = (n) -> n > x\n}\n\nclass Derived extends Base\n\nres1 = new Derived {}\n\nres2 = (res1) {\n  y = 3\n  yy = 3\n  yyy = 3\n}\n\nres3 = (res2) {\n  x = 2\n}\n\nres4 = test.catch(() -> (res3) { y = 0 }.y)\nres5 = test.catch(() -> (res3) { yy = 0 }.yy)\nres6 = test.catch(() -> (res3) { yyy = 0 }.yyy)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints12.pkl",
    "content": "import \"pkl:test\"\n\nabstract class Base {\n  x: Int = 1\n}\n\nclass Derived extends Base {\n  y: Int(this > super.x) = 2\n\n  yy: Int(isValid1) = 2\n  yyy: Int(isValid2) = 2\n\n  local isValid1 = (n) -> n > x\n  hidden isValid2 = (n) -> n > x\n}\n\nres1 = new Derived {}\n\nres2 = (res1) {\n  y = 3\n  yy = 3\n  yyy = 3\n}\n\nres3 = (res2) {\n  x = 2\n}\n\nres4 = test.catch(() -> (res3) { y = 0 }.y)\nres5 = test.catch(() -> (res3) { yy = 0 }.yy)\nres6 = test.catch(() -> (res3) { yyy = 0 }.yyy)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints13.pkl",
    "content": "import \"pkl:test\"\n\nconst local isOddLengthOfBirds = (it: Listing<Bird>) -> it.length.isOdd\n\nclass Bird\n\nclass MyTest {\n  // function parameter type should be checked eagerly\n  birds: Listing(isOddLengthOfBirds) = new {\n    1\n    2\n    3\n  }\n}\n\nres = test.catch(() -> new MyTest {}.birds)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints14.pkl",
    "content": "// This test executes constraint `EmailAddress` within `MyClass` from two different root nodes:\n//   - ListingOrMappingTypeCastNode\n//   - PropertyTypeNode\namends \".../input-helper/classes/MyClass.pkl\"\n\nmyClass {\n  emails {\n    \"foo@bar.com\"\n  }\n}\n\nothers {\n  import(\".../input-helper/classes/myClass1.pkl\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints2.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  age: Int(this > 0)\n}\n\nres1 = new Person {\n  age = 30\n}\n\nres2 = test.catch(() ->\n  new Person {\n    age = -30\n  }.age\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints3.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {\n  address: Address(street.endsWith(\"St.\"))\n}\n\nclass Address {\n  street: String\n}\n\nres1 = new Person {\n  address {\n    street = \"Hampton St.\"\n  }\n}\n\nres2 = test.catch(() ->\n  new Person {\n    address {\n      street = \"Garlic Blvd.\"\n    }\n  }.address\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints4.pkl",
    "content": "import \"pkl:test\"\n\nclass Gauge {\n  min: Int\n  max: Int(this >= min)\n}\n\nres1 = new Gauge {\n  min = 4\n  max = 6\n}\n\nres2 = test.catch(() ->\n  new Gauge {\n    min = 4\n    max = 3\n  }.max\n)\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints5.pkl",
    "content": "class Gauge {\n  min: Int\n  max: Int(this >= min)\n}\n\nres1 = new Gauge {\n  min = 4\n  max = 6\n}\n\n// check constraint validation during forcing rather than evaluation\nres2 = new Gauge {\n  min = 4\n  max = 3\n}\n\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints6.pkl",
    "content": "import \"pkl:test\"\n\nclass X {\n  y: Int(abs < 100)\n}\n\nres1 = new X {\n  y = 99\n}\n\nres2 = new X {\n  y = -99\n}\n\nres3 = test.catch(() ->\n  new X {\n    y = -100\n  }.y\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints7.pkl",
    "content": "import \"pkl:test\"\n\nconst function add(x, y) = x + y\n\nclass X {\n  function subtract(x, y) = x - y\n  y: Y(multiply(subtract(add(5, 4), 3), 2) == z)\n}\n\nclass Y {\n  function multiply(x, y) = x * y\n  z: Int\n}\n\nres1 = new X {\n  y {\n    z = 12\n  }\n}\n\nres2 = test.catch(() ->\n  new X {\n    y {\n      z = 13\n    }\n  }.y\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints8.pkl",
    "content": "import \"pkl:test\"\n\nconst function isGreaterThan(n) = (x) -> x > n\n\nclass X {\n  a: Int(isGreaterThan(5))\n  b: Int(isGreaterThan(10))\n}\n\nres1 = new X {\n  a = 6\n  b = 11\n}\n\nres2 = test.catch(() ->\n  new X {\n    a = 5\n  }.a\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraints9.pkl",
    "content": "import \"pkl:test\"\n\nclass X {\n  a: Int(\"not a boolean\")\n  b: Int((x) -> \"not a boolean\")\n}\n\nres1 = test.catch(() ->\n  new X {\n    a = 1\n  }.a\n)\n\nres2 = test.catch(() ->\n  new X {\n    b = 1\n  }.b\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/constraintsLambdaThis.pkl",
    "content": "// explicit this\nres1: String(List(1).map((it) -> this).single.length == 3) = \"abc\"\nres2: String(List(1).map((it) -> List(2).map((it) -> this)).single.single.length == 3) = \"abc\"\n\n// implicit property invocation\nres3: String(List(1).map((it) -> length).single == 3) = \"abc\"\nres4: String(List(1).map((it) -> List(2).map((it) -> length)).single.single == 3) = \"abc\"\n\n// implicit function invocation\nres5: String(List(1).map((it) -> getClass()).single == String) = \"abc\"\nres6: String(List(1).map((it) -> List(2).map((it) -> getClass())).single.single == String) = \"abc\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/duplicateFunction.pkl",
    "content": "class Person {\n  function foo(): Int = 42\n  foo: Int // OK\n  function bar(): String = \"bar\"\n  function foo(arg): String = \"foo\" // duplicate\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/duplicateProperty.pkl",
    "content": "class Person {\n  foo: Int\n  function foo(): Int = \"foo\" // OK\n  bar: String\n  foo: String // duplicate\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/equality.pkl",
    "content": "res1 = Int == Int\nres2 = Int == Float\nres3 = Int == 3.getClass()\nres4 = 3.getClass() == 4.getClass()\nres5 = Person == Person\nres6 = Person == Person2\n\nres7 = Int != Int\nres8 = Int != Float\nres9 = Int != 3.getClass()\nres10 = 3.getClass() != 4.getClass()\nres11 = Person != Person\nres12 = Person != Person2\n\nclass Person\nclass Person2"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/externalClass.pkl",
    "content": "external class Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/externalFunction.pkl",
    "content": "class Foo {\n  external function bar()\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/externalProperty.pkl",
    "content": "class Foo {\n  external bar: String\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions1.pkl",
    "content": "local const a = 1\nconst b = 2\n\nclass X {\n  local c = 3\n  d = 4\n  function compute() = a * b * c * d\n}\n\nres1 = new X {}.compute()\n\nres2 = new X { d = 5 }.compute()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions2.pkl",
    "content": "a = 1\n\nclass X {\n  a = 2\n  function compute() = a\n}\n\nres1 = new X {}.compute()\n\nres2 = new X { a = 3 }.compute()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions3.pkl",
    "content": "const function a(x) = 2 * x\n\nclass X {\n  function b(x) = 3 * x\n  function compute() = a(b(c))\n  c = 4\n}\n\nres1 = new X {}.compute()\n\nres2 = new X { c = 5 }.compute()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/functions4.pkl",
    "content": "function a(x) = 2 * x\n\nopen class X {\n  function a(x) = 3 * x\n  function compute() = a(c)\n  c = 3\n}\n\nclass Y extends X {\n  function a(x) = 4 * x\n  c = 5\n}\n\nres1 = new X {}.compute()\nres2 = new X { c = 4 }.compute()\nres3 = new Y {}.compute()\nres4 = new Y { c = 6 }.compute()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/inheritance1.pkl",
    "content": "abstract class Person {\n  name: String\n}\n\nclass Teacher extends Person {\n  subjects: List<String>\n}\n\nres1 = new Teacher {\n  name = \"Pigeon\"\n  subjects = List(\"Rocks\", \"Stone Age\")\n}\n\nres2 = (res1) {\n  name = \"Parrot\"\n}\n\nres3 = (res2) {\n  subjects = List(\"Fire Making\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/inheritance2.pkl",
    "content": "open class Person {\n  name: String = \"Pigeon\"\n}\n\nclass Teacher extends Person {\n  subjects: List<String> = List(\"Rocks\", \"Stone Age\")\n}\n\nres1 = new Teacher {}\n\nres2 = (res1) {\n  name = \"Parrot\"\n}\n\nres3 = (res2) {\n  subjects = List(\"Fire Making\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/inheritanceError1.pkl",
    "content": "class Base // not open or abstract\n\nclass Derived extends Base"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/invalidInstantiation1.pkl",
    "content": "res1 = new String {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/invalidInstantiation2.pkl",
    "content": "abstract class Base\n\nres1 = new Base {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/lambdaConstraints1.pkl",
    "content": "import \"pkl:test\"\n\nclass X {\n  hidden f: () -> Int\n  hidden g: (String) -> Int\n  hidden h: (String, String) -> Int\n}\n\nres1 = new X {\n  f = () -> 42\n  g = (str) -> str.length\n  h = (str1, str2) -> str1.length + str2.length\n}\n\nres2 = test.catch(() ->\n  new X {\n    f = (str) -> str.length\n  }.f\n)\n\nres3 = test.catch(() ->\n  new X {\n    g = () -> 42\n  }.g\n)\n\nres4 = test.catch(() ->\n  new X {\n    h = (str) -> str.length\n  }.h\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/listConstraints1.pkl",
    "content": "import \"pkl:test\"\n\nclass Numbers {\n  xs: List<Int>\n  ys: List<Int(this < 0)>\n  zs: List<Int(this < 0)>(length >= 5)\n}\n\nclass Numbers2 {\n  // type constraint but no type parameter\n  ys: List(every((it) -> it is Int(this < 0)))\n}\n\nres1 = new Numbers {\n  xs = List(1, 2, 3)\n  ys = List(-1, -2, -3)\n  zs = List(-1, -2, -3, -4, -5)\n}\n\nres1b = new Numbers2 {\n  ys = List(-1, -2, -3)\n}\n\nres2 = test.catch(() ->\n  new Numbers {\n    xs = \"one\"\n  }.xs\n)\n\nres3 = test.catch(() ->\n  new Numbers {\n    xs = List(\"one\")\n  }.xs\n)\n\nres4 = test.catch(() ->\n  new Numbers {\n    ys = List(1, 2, 3)\n  }.ys\n)\n\nres4b = test.catch(() ->\n  new Numbers2 {\n    ys = List(1, 2, 3)\n  }.ys\n)\n\nres5 = test.catch(() ->\n  new Numbers {\n    zs = List(-1, -2, -3)\n  }.zs\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/mapConstraints1.pkl",
    "content": "import \"pkl:test\"\n\nclass Numbers {\n  xs: Map<String, Int>\n  ys: Map<String(!isEmpty), Int(this < 0)>\n  zs: Map<String(!isEmpty), Int(this < 0)>(length >= 5)\n}\n\nclass Numbers2 {\n  // type constraint but no type parameters\n  ys: Map(every((key, value) -> key is String(!isEmpty) && value is Int(this < 0)))\n}\n\nres1 = new Numbers {\n  xs = Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  ys = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3)\n  zs = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3, \"-four\", -4, \"-five\", -5)\n}\n\nres1b = new Numbers2 {\n  ys = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3)\n}\n\nres2 = test.catch(() ->\n  new Numbers {\n    xs = \"numbers\"\n  }.xs\n)\n\nres3 = test.catch(() ->\n  new Numbers {\n    xs = Map(\"one\", \"one\")\n  }.xs\n)\n\nres4 = test.catch(() ->\n  new Numbers {\n    xs = Map(1, 1)\n  }.xs\n)\n\nres5 = test.catch(() ->\n  new Numbers {\n    ys = Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  }.ys\n)\n\nres5b = test.catch(() ->\n  new Numbers2 {\n    ys = Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  }.ys\n)\n\nres6 = test.catch(() ->\n  new Numbers {\n    ys = Map(\"\", -1, \"-two\", -2, \"-three\", -3)\n  }.ys\n)\n\nres6b = test.catch(() ->\n  new Numbers2 {\n    ys = Map(\"\", -1, \"-two\", -2, \"-three\", -3)\n  }.ys\n)\n\nres7 = test.catch(() ->\n  new Numbers {\n    zs = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3)\n  }.zs\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/nullableTypes.pkl",
    "content": "import \"pkl:test\"\n\nclass X {\n  a: String?\n  b: List<String?>\n  c: List<String>?\n  d: List<String?>?\n}\n\nres1 = new X {\n  a = \"a\"\n  b = List(\"b\")\n  c = List(\"c\")\n  d = List(\"d\")\n}\n\nres2 = new X {\n  a = null\n  b = List(null)\n  c = null\n  d = List(null)\n}\n\nres3 = test.catch(() ->\n  new X {\n    b = null\n  }.b\n)\n\nres4 = test.catch(() ->\n  new X {\n    c = List(null)\n  }.c\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/setConstraints1.pkl",
    "content": "import \"pkl:test\"\n\nclass Numbers {\n  xs: Set<Int>\n  ys: Set<Int(this < 0)>\n  zs: Set<Int(this < 0)>(length >= 5)\n}\n\nclass Numbers2 {\n  // type constraint but no type parameter\n  ys: Set(every((it) -> it is Int(this < 0)))\n}\n\nres1 = new Numbers {\n  xs = Set(1, 2, 3)\n  ys = Set(-1, -2, -3)\n  zs = Set(-1, -2, -3, -4, -5)\n}\n\nres1b = new Numbers2 {\n  ys = Set(-1, -2, -3)\n}\n\nres2 = test.catch(() ->\n  new Numbers {\n    xs = \"one\"\n  }.xs\n)\n\nres3 = test.catch(() ->\n  new Numbers {\n    xs = Set(\"one\")\n  }.xs\n)\n\nres4 = test.catch(() ->\n  new Numbers {\n    ys = Set(1, 2, 3)\n  }.ys\n)\n\nres4b = test.catch(() ->\n  new Numbers2 {\n    ys = Set(1, 2, 3)\n  }.ys\n)\n\nres5 = test.catch(() ->\n  new Numbers {\n    zs = Set(-1, -2, -3)\n  }.zs\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercalls.pkl",
    "content": "open class One {\n  prefix = \"\"\n  function say(msg) = prefix + msg\n  function sameMethod() = 1\n  sameProp = \"a\"\n}\n\nopen class Two extends One {\n  pigeon = super.say(\"Pigeon\")\n  function barnOwl() = super.say(\"Barn Owl\")\n  function say2(msg) = super.say(msg) + super.say(msg)\n  function sameMethod() = 2 + super.sameMethod()\n  sameProp = super.sameProp + \"b\"\n}\n\nclass Three extends Two {\n  pigeonBarnOwl = super.pigeon + super.barnOwl()\n  function barnOwlPigeon() = super.barnOwl() + super.pigeon\n  parrot = super.say(\"Parrot\")\n  function sameMethod() = 3 + super.sameMethod()\n  sameProp = super.sameProp + \"c\"\n}\n\nlocal two = new Two {}\nlocal three = new Three {}\n\nres1 = two.pigeon\nres2 = two.barnOwl()\nres3 = two.say2(\"Parrot\")\n\nres4 = three.pigeonBarnOwl\nres5 = three.barnOwlPigeon()\nres6 = three.parrot\n\nlocal two2 = new Two { prefix = \"Oh \" }\nlocal three2 = new Three { prefix = \"Oh \" }\n\nres7 = two2.pigeon\nres8 = two2.barnOwl()\nres9 = two2.say2(\"Parrot\")\n\nres10 = three2.pigeonBarnOwl\nres11 = three2.barnOwlPigeon()\nres12 = three2.parrot\nres13 = three2.sameMethod()\nres14 = three2.sameProp\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/supercallsInLet.pkl",
    "content": "open class A {\n  function foo() = \"a\"\n}\n\nclass B extends A {\n  function foo() =\n    let (bar = \"b\")\n      super.foo() + bar\n}\n\nlocal b = new B {}\n\nres1 = b.foo()\n\n// Also test with property access\nopen class C {\n  value = \"c\"\n}\n\nclass D extends C {\n  result =\n    let (x = \"d\")\n      super.value + x\n}\n\nlocal d = new D {}\n\nres2 = d.result\n\n// Test with nested let expressions\nopen class E {\n  function getValue() = \"e\"\n}\n\nclass F extends E {\n  function getValue() =\n    let (x = \"f\")\n      let (y = \" and \" + x)\n        super.getValue() + y\n}\n\nlocal f = new F {}\n\nres3 = f.getValue()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypes.pkl",
    "content": "class X {\n  a: Boolean|String\n  b: (Boolean|String)?\n  c: Boolean|String(length >= 3)\n  d: (Boolean|String)(this != false)\n}\n\nclass Y {\n  hidden a: (Int|Float) -> String\n  hidden b: (Int) -> Float|String\n  c: ((Int) -> Float)|String\n}\n\nclass Z {\n  a: String|List<String>\n  b: List<Int|Float>\n  c: List<Int|List<Float>>\n  d: Boolean|Map<Int|List<Int>, String|Set<String>>\n  e: Duration|Duration|Duration\n  f: DataSize|DataSize?\n  g: Pair<Int, Int>|Null\n}\n\nclass Defaults {\n  a: *Set|List|Map\n  b: *\"Pigeon\"|\"Parrot\"|\"Barn Owl\"\n}\n\nres1 = new X {\n  a = true\n  b = null\n  c = true\n  d = true\n}\n\nres2 = new X {\n  a = \"foo\"\n  b = \"foo\"\n  c = \"longer\"\n  d = \"foo\"\n}\n\nres3 = new Y {\n  a = (x) -> \"foo\"\n  b = (x) -> 3.14\n  c = \"foo\"\n}\n\nres4 = new Z {\n  a = \"foo\"\n  b = List(1, 3.14, 2)\n  c = List(1, List(3.12), 2)\n  d = true\n  e = 5.s\n  f = 3.gb\n  g = Pair(1, 2)\n}\n\nres5 = new Z {\n  a = List(\"foo\", \"bar\")\n  b = List(3.14, 1)\n  c = List()\n  d = Map(\n    1, \"foo\",\n    2, Set(\"foo\", \"bar\"),\n    List(1, 2, 3), \"foo\",\n    List(1, 2, 3), Set(\"foo\", \"bar\")\n  )\n  e = 1.s\n  f = null\n  g = null\n}\n\nres6 = new Defaults {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorAlias.pkl",
    "content": "typealias A =\n    \"aaaaaaaaaaaaaaa\"\n    | \"bbbbbbbbbbbbb\"\n    | \"ccccccccccccc\"\n    | \"ddddddddddddd\"\n    | \"eeeeeeeeeeeee\"\n    | \"fffffffffffff\"\n    | \"ggggggggggggg\"\n    | \"hhhhhhhhhhhhh\"\n    | \"iiiiiiiiiiiii\"\n    | \"jjjjjjjjjjjjj\"\n    | \"kkkkkkkkkkkkk\"\n\nclass X {\n  a: A\n}\n\nres1 = new X {\n  a = \"other\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorDifferent1.pkl",
    "content": "class X {\n  a: Boolean|List<Int>\n}\n\nres1 = new X {\n  a = List(1, 3.14, 2)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorDifferent2.pkl",
    "content": "class X {\n  a: Boolean|List<Int>(length > 3)\n}\n\nres1 = new X {\n  a = List(1, 2, 3)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorMultipleAliases.pkl",
    "content": "typealias Alias1 = String\ntypealias Alias2 = Int\nres1: Alias1|Alias2 = new Dynamic { }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorNested.pkl",
    "content": "class X {\n  a: Boolean|Map<Int|List<Int>, String|Set<String>>\n}\n\nres1 = new X {\n  a = Map(\n    1, \"foo\",\n    2, Set(\"foo\", \"bar\"),\n    List(1, 2, 3), \"foo\",\n    List(1, 2, 3), Set(\"bar\", 4)\n  )\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorSimple.pkl",
    "content": "class X {\n  a: Boolean|List<Int>\n}\n\nres1 = new X {\n  a = 42\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorString1.pkl",
    "content": "class X {\n  a: \"foo\" | \"bar\" | \"baz\"\n}\n\nres1 = new X {\n  a = \"foox\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/unionTypesErrorString2.pkl",
    "content": "class X {\n  a: \"aaaaaaaaaaaaaaa\"\n     | \"bbbbbbbbbbbbb\"\n     | \"ccccccccccccc\"\n     | \"ddddddddddddd\"\n     | \"eeeeeeeeeeeee\"\n     | \"fffffffffffff\"\n     | \"ggggggggggggg\"\n     | \"hhhhhhhhhhhhh\"\n     | \"iiiiiiiiiiiii\"\n     | \"jjjjjjjjjjjjj\"\n     | \"kkkkkkkkkkkkk\"\n}\n\nres1 = new X {\n  a = \"other\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType1.pkl",
    "content": "class Person {\n  name: String\n}\n\npigeon = new Person {\n  name = 42\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType2.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\npigeon = new Person {\n  name = \"Pigeon\"\n  age = \"42\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType3.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n  address: Address\n}\n\nclass Address {\n  street: String\n}\n\nperson = new Person {\n  name = \"Pigeon\"\n  age = 42\n  address = \"Howdy St.\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType4.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n  address: Address\n}\n\nclass Address {\n  street: String\n}\n\nperson = new Person {\n  name = \"Pigeon\"\n  age = 42\n  address {\n    street = 4.gb\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType5.pkl",
    "content": "import \"pkl:test\"\n\nopen class Person {\n  name: String\n}\n\nclass Person2 extends Person {\n  name: Int // currently allowed\n}\n\nclass Person3 extends Person {\n  name = \"Pigeon\"\n}\n\nres1 = test.catch(() -> new Person { name = 42 }.name)\n\nres2 = test.catch(() -> new Person2 { name = \"42\" }.name)\n\nres3 = test.catch(() -> new Person3 { name = 42 }.name)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/classes/wrongType6.pkl",
    "content": "import \"pkl:test\"\n\nopen class Person {\n  names: List<String>(!isEmpty)\n}\n\n// property default value fails property type check\npigeon = new Person {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/abstractOpenMember.pkl",
    "content": "abstract open class Person\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/analyzeImportsCannotFindModule.pkl",
    "content": "import \"pkl:analyze\"\nimport \"pkl:reflect\"\nimport \".../input-helper/analyze/cannotFindModule.pkl\"\n\nres = analyze.importGraph(Set(reflect.Module(cannotFindModule).uri))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/analyzeImportsInvalidGlob.pkl",
    "content": "import \"pkl:analyze\"\nimport \"pkl:reflect\"\nimport \".../input-helper/analyze/invalidGlob.pkl\"\n\nres = analyze.importGraph(Set(reflect.Module(invalidGlob).uri))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/analyzeInvalidModuleUri.pkl",
    "content": "import \"pkl:analyze\"\n\nresult = analyze.importGraph(Set(\"foo <>\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/analyzeRelativeModuleUri.pkl",
    "content": "import \"pkl:analyze\"\n\nresult = analyze.importGraph(Set(\"foo.pkl\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/anyConverterError.pkl",
    "content": "class Dog {\n  age: Int\n}\n\noutput {\n  renderer = new PcfRenderer {\n    converters {\n      [Any] = (o) -> o.getClass().toString()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/baseModule.pkl",
    "content": "open module baseModule\n\nx: Int = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/binopDifferentLine.pkl",
    "content": "binop_result: Int = 1 \n\n/*comment*/- \n  \n/*comment*/ 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAmendFixedProperty1.pkl",
    "content": "class Bird {\n  name: String\n}\n\nclass Nest {\n  fixed bird = new Bird {\n    name = \"Hawk\"\n  }\n}\n\nn: Nest = new {\n  bird {\n    name = \"Eagle\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAmendFixedProperty2.pkl",
    "content": "amends \"../basic/fixedProperty1.pkl\"\n\nres3 {\n  name = \"Osprey\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAssignFixedProperty1.pkl",
    "content": "class Bird {\n  fixed name: String = \"Hawk\"\n}\n\np: Bird = new {\n  // Using a non-constant node causes this to turn into a TypeCheckedPropertyNode\n  local _name = \"Penguin\"\n  name = _name\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAssignFixedProperty2.pkl",
    "content": "amends \"../basic/fixedProperty1.pkl\"\n\nres1 = \"bye\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAssignFixedProperty3.pkl",
    "content": "amends \"../basic/fixedProperty2.pkl\"\n\np = new {\n  ...new Dynamic { name = \"Osprey\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotAssignToNothing.pkl",
    "content": "value: nothing = \"foo\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotChangeFixed1.pkl",
    "content": "abstract class Animal {\n  fixed name: String\n}\n\nclass Dog extends Animal {\n  name = \"Spot\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotChangeFixed2.pkl",
    "content": "abstract class Animal {\n  name: String\n}\n\nclass Dog extends Animal {\n  fixed name = \"Spot\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotFindMapKey.pkl",
    "content": "local x = Map(\"xfoo\", \"xfoo\", \"foyo\", \"foyo\", \"fooz\", \"fooz\", \"other\", \"other\")\n\nres1 = x[\"foo\"]"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotFindStdLibModule.pkl",
    "content": "import \"pkl:nonExisting\"\n\nres1 = nonExisting.bar\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotInferParent2.pkl",
    "content": "foo = () -> new {}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotInferParent3.pkl",
    "content": "class Person {\n  name: String\n}\n\nres1: Mapping<Person, String> = new {\n  [new { name = \"Pigeon\" }] = \"Pigeon\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotInstantiateAbstractModule.pkl",
    "content": "abstract module cannotInstantiateAbstractModule\n\nres1 = new module {}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/cannotRenderMixin.pkl",
    "content": "m: Mixin = new {\n    mixinVal = \"anything\"\n}\n\nfoo = new Dynamic {\n    bar = \"baz\"\n} |> m\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/classExtendsSelf.pkl",
    "content": "open class Recurring extends Recurring {\n\n}\n\nf: Recurring = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constAmend.pkl",
    "content": "amends \"../../basic/constModifier.pkl\"\n\nconstDyn {\n  bar = 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constAnnotation.pkl",
    "content": "import \"pkl:reflect\"\n\nclass Ann extends Annotation {\n  foo: Int\n}\n\ntop = 5\n\nlocal aLocal = top\n\nfunction f1() = aLocal\n\n@Ann { foo = f1() }\nclass Foo {}\n\nlocal fooClass = reflect.Class(Foo)\n\nann = fooClass.annotations[0]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constAnnotation2.pkl",
    "content": "import \"pkl:reflect\"\n\nclass Ann extends Annotation {\n  foo: Int\n}\n\ntop = 5\n\n@Ann { foo = top }\nclass Foo {}\n\nann = reflect.Class(Foo).annotations[0]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constAnnotation3.pkl",
    "content": "import \"pkl:reflect\"\n\nclass Ann extends Annotation {\n  foo: Int\n}\n\n@Ann { foo = module }\nclass Foo {}\n\nann = reflect.Class(Foo).annotations[0]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constAssign.pkl",
    "content": "amends \"../../basic/constModifier.pkl\"\n\nconstantSimpleValue = \"1\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constClassBody.pkl",
    "content": "notConst = 1\n\nclass Foo {\n  foo = notConst\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constExplicitThis.pkl",
    "content": "open class A {\n  a = 1\n}\n\nclass B extends A {\n  const b = this.a\n}\n\nb: B\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constExplicitThisMethod.pkl",
    "content": "open class A {\n  function a() = 1\n}\n\nclass B extends A {\n  const b = this.a()\n}\n\nb: B\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constFunctionCallingNonConst.pkl",
    "content": "function nonConstFunction() = \"hello\"\n\nconst function constFunctionCallingNonConst(): (String) -> String = (s) -> s + nonConstFunction()\n\nres = constFunctionCallingNonConst().apply(\"prefix\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constImplicitThis.pkl",
    "content": "open class A {\n  a = 1\n}\n\nclass B extends A {\n  const b = a\n}\n\nb: B\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constImplicitThisMethod.pkl",
    "content": "open class A {\n  function a() = 1\n}\n\nclass B extends A {\n  const b = a()\n}\n\nb: B\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constLexicalScope.pkl",
    "content": "class Foo {\n  bar: String = \"bar\"\n  const foo = new {\n    _barr = bar\n  }\n}\n\nfoo: Foo = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constLocalAmendModule.pkl",
    "content": "amends \".../input-helper/modules/Birds2.pkl\"\n\nconst local myBirdName = \"Birdy\"\n\nlocal class MyBird extends Bird {\n  name: String = myBirdName\n}\n\nbird = new MyBird {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constLocalMethod.pkl",
    "content": "bar = 15\n\nobj {\n  const local function foo() = bar\n  \n  res = foo()\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constLocalProperty.pkl",
    "content": "foo {\n  res1 = 15\n  const local qux = res1\n  res2 = qux\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod.pkl",
    "content": "function fun() = 1\n\nclass Foo {\n  foo = fun()\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constMethod2.pkl",
    "content": "function bar() = \"bar\"\n\nclass Foo {\n  bar: String = module.bar()\n}\n\nfoo: Foo = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constModule.pkl",
    "content": "notConst = 10\n\nclass Foo {\n  shouldBeConst = module.notConst\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constModule2.pkl",
    "content": "class Foo {\n  foo = module\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constModule3.pkl",
    "content": "const foo = new {\n  x = module\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constObjectMember.pkl",
    "content": "foo = new Dyn {\n  const foo = 10\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constOuter.pkl",
    "content": "notConst = 10\n\nclass Foo {\n  shouldBeConst = outer.notConst\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constOuter2.pkl",
    "content": "class Person {\n  name: String\n  const fancyName = new { title = \"\\(outer.name), Esq.\" }\n}\n\nperson = new Person { name = \"Foo\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constOuter3.pkl",
    "content": "class Foo {\n  const prop = new { value = outer }\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constQualified.pkl",
    "content": "local notConstDyn = new Dynamic {\n  prop = 2\n}\n\nclass Foo {\n  foo = notConstDyn.prop\n}\n\nfoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constSubclass.pkl",
    "content": "open class Foo {\n  const x: Int\n}\n\nclass Bar extends Foo {\n  x = 2\n}\n\nbar = new Bar {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constSubclass2.pkl",
    "content": "open class Foo {\n  x: Int\n}\n\nclass Bar extends Foo {\n  const x = 2\n}\n\nbar = new Bar {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constSuper.pkl",
    "content": "open class A {\n  bar = 5\n}\n\nclass B extends A {\n  const foo = super.bar\n}\n\nb: B\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constSuperMethod.pkl",
    "content": "open class A {\n  function bar() = 5\n}\n\nclass B extends A {\n  const foo = super.bar()\n}\n\nb: B\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constThis.pkl",
    "content": "const bar = this\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/const/constTypeAliasConstraint.pkl",
    "content": "typealias MyValue = Any(isValid)\n\nisValid = true\n\nmyValue: MyValue = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/constraintDetails1.pkl",
    "content": "// Error message should include `new Bird { name = \"Bob\" }`\nbirds: Listing(firstOneIsSandy) = new {\n  new Bird { name = \"Bob\" }\n  new Bird { name = \"Bob\" }\n}\n\nhidden firstOneIsSandy = (it: Listing<Bird>) -> it[0].name == \"Sandy\"\n\nclass Bird { name: String }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/constraintDetails2.pkl",
    "content": "// Error message should include `new Bird { name = \"Bob\" }`\nbirds: Listing(\n    let (myself: Listing<Bird> = this)\n      myself[0].name == \"Sandy\"\n  ) =\n  new {\n    new Bird { name = \"Bob\" }\n    new Bird { name = \"Bob\" }\n  }\n\nclass Bird { name: String }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/constraintDetails3.pkl",
    "content": "// typechecks within child frames should also be eagerly checked\nfoo: Listing(toList().every((it: Listing<Bird>) -> it[0].name == \"Bob\")) = new {\n  new Listing {\n    new Bird { name = \"Eagle\" }\n    new Bird { name = \"Quail\" }\n  }\n}\n\nclass Bird { name: String }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/decodingException.pkl",
    "content": "res = Bytes(0xc0, 0xc1).decodeToString(\"UTF-8\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingClassDelimiter.pkl",
    "content": "class Person {\n  name: String\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingConstrainedTypeSeparator.pkl",
    "content": "x: Int(isPositive this > 10)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingContainerAmendDefDelimiter.pkl",
    "content": "foo {\n  x = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingContainerAmendExprDelimiter.pkl",
    "content": "foo = (bar) {\n  x = 1\n\nclass Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingEmptyMultiLineStringDelimiter.pkl",
    "content": "// Would like to provide the usual \"missing closing delimiter\" error message,\n// but adding EOF alternative to ML_END_QUOTE rule didn't have any effect.\nres1 = \"\"\"\nres2 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingEmptyMultiLineStringDelimiterAtEof.pkl",
    "content": "// no newline after opening quote\nres1 = \"\"\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingEmptyStringDelimiter.pkl",
    "content": "res1 = \"\nres2 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingEmptyStringDelimiterAtEof.pkl",
    "content": "// No newline after opening quote.\n// Would like to provide the usual \"missing end delimiter\" message,\n// but adding EOF alternative to END_QUOTE rule didn't have any effect.\nres1 = \""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunction0ParameterListDelimiter.pkl",
    "content": "f = ( -> 42\nres1 = 42\n\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunction1ParameterListDelimiter.pkl",
    "content": "f = (arg -> arg + 1\nres1 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionAmendParameterListSeparator.pkl",
    "content": "f { arg1, arg2 arg3 ->\n  x = arg1\n  y = arg2\n  z = arg3\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionNParameterListDelimiter.pkl",
    "content": "f = (arg1, arg2, arg3 -> arg1 + arg2 + arg3\nres1 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionParameterListSeparator.pkl",
    "content": "f = (arg1, arg2 arg3) -> arg1 + arg2 + arg3\nres1 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionType0ParameterListDelimiter.pkl",
    "content": "f: ( -> String\nres1 = 42\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionType1ParameterListDelimiter.pkl",
    "content": "f: (String -> String\nres1 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionTypeNParameterListDelimiter.pkl",
    "content": "f: (String, Int, String -> String\nres1 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingFunctionTypeParameterListSeparator.pkl",
    "content": "f: (String, Int String) -> String\nres1 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingIfExprDelimiter.pkl",
    "content": "res1 = if (cond 3 else 4\nres2 = 42\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingListDelimiter.pkl",
    "content": "l = List(\"one\", \"two\"\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingListSeparator.pkl",
    "content": "list = List(1, 2  3, 4)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMapDelimiter.pkl",
    "content": "map = Map(\"one\", 1, \"two\", 2\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMapSeparator.pkl",
    "content": "map = Map(1, 2, 3  4, 5, 6)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMethodArgumentListDelimiter.pkl",
    "content": "res1 = \"abc\".substring(0, 1 + \"def\"\nres2 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMethodArgumentListSeparator.pkl",
    "content": "res1 = foo(1, 2 3)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMethodParameterListDelimiter.pkl",
    "content": "function foo(arg1, arg2 = arg1 + arg2\nres1 = foo(1, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMethodParameterListSeparator.pkl",
    "content": "function foo(arg1 arg2) = arg1 + arg2\n\nres1 = foo(1, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingMultiLineStringDelimiter.pkl",
    "content": "res1 = \"\"\"abc\nres2 = 42\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingObjectAmendDefDelimiter.pkl",
    "content": "foo {\n  x = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingObjectAmendDefDelimiter2.pkl",
    "content": "foo {\n  bar {\n    x = 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingObjectAmendDefDelimiter3.pkl",
    "content": "foo {\n  bar {\n    baz {\n      y = 2\n    }\n  bar2 {\n    x = 1\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingObjectAmendExprDelimiter.pkl",
    "content": "foo = (bar) {\n  x = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingObjectDelimiter.pkl",
    "content": "foo = new {\n  x = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingParenthesizedExprDelimiter.pkl",
    "content": "x = 3 * (1 + 2\ny = 42\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingParenthesizedTypeDelimiter.pkl",
    "content": "res1: ((String) -> String | List<String>\nres2 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingRawMultiLineStringDelimiter.pkl",
    "content": "res1 = #\"\"\"abc\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingRawStringDelimiter.pkl",
    "content": "res1 = #\"abc\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingSetSeparator.pkl",
    "content": "set = Set(1, 2  3, 4)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingStringDelimiter.pkl",
    "content": "res1 = \"abc\nres2 = 42\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingSubscriptDelimiter.pkl",
    "content": "res1 = x[3 + 4\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingTypeConstraintListDelimiter.pkl",
    "content": "res1: String(!isEmpty, length < 5 = \"abc\"\nres2 = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingTypedMethodParameterListDelimiter.pkl",
    "content": "function foo(arg1: String, arg2: String = arg1 + arg2\nres1 = foo(1, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/missingTypedMethodParameterListSeparator.pkl",
    "content": "function foo(arg1: String arg2: String) = arg1 + arg2\nres1 = foo(1, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/unbalancedEntryBrackets1.pkl",
    "content": "res = new {\n  [[name == \"Pigeon\"] { age = 42 }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/unbalancedEntryBrackets2.pkl",
    "content": "res = new {\n  [name == \"Pigeon\"]] { age = 42 }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/unbalancedEntryBrackets3.pkl",
    "content": "res = new {\n  [[name == \"Pigeon\"] ] { age = 42 }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/delimiters/unbalancedEntryBrackets4.pkl",
    "content": "res = new {\n  [name == \"Pigeon\"] ] { age = 42 }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/duplicateTypeParameter.pkl",
    "content": "typealias MyType<Elem, Elem> = List<Elem>"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/emptyParenthesizedTypeAnnotation.pkl",
    "content": "foo: Int|()|String = \"foo\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/extendExternalClass.pkl",
    "content": "class Person extends Any"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/extendTypeAlias.pkl",
    "content": "open class Foo\ntypealias Bar = Foo(true)\nclass Baz extends Bar\nqux = new Baz {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/forGeneratorCannotGenerateMethods.pkl",
    "content": "foo {\n  for (n in List(1, 2, 3)) { local function foo() = \"foo\" }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/forGeneratorCannotGenerateProperties.pkl",
    "content": "res {\n  for (n in List(1, 2, 3)) { foo = n }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/forGeneratorCannotIterateOverThisValue.pkl",
    "content": "foo {\n  for (n in 5) { n }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/forGeneratorCannotIterateOverTyped.pkl",
    "content": "class Person\nfoo {\n  for (_ in new Person {}) { 42 }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/forGeneratorDuplicateParams1.pkl",
    "content": "a = List(1, 2, 3, 4)\n\nfoo {\n  for (i, i in a) {\n    i\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/forGeneratorWrongVariableName.pkl",
    "content": "res: Mapping<String, Int> = new {\n  for (idx, o in List(1, 2)) {\n    [\"\\(idx)_1\"] = o\n  }\n  for (idx, t in List(3, 4)) {\n    [\"\\(idx)_2\"] = o // at this point, `o` should be out of scope\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/fullStackTraces.pkl",
    "content": "const local wrong = throw(\"fail\")\n\nconst hidden v1 = wrong\n\nconst function f1() = v1\n\nconst local function f2() = f1()\n\nclass Foo {\n  foo = f2()\n}\n\naFoo: Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/fullStackTraces2.pkl",
    "content": "local const invalid: String = 1\n\nconst function f1() = invalid\n\nlocal const top = f1()\n\nclass Foo {\n  foo = top\n}\n\naFoo = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/functionNotFoundInClass.pkl",
    "content": "class Foo {\n  function bar(x) = x\n}\n\nres1 = new Foo {}.baz(42)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/functionNotFoundInModule.pkl",
    "content": "function bar(x) = x\n\nres1 = module.baz(42)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/functionNotFoundInScope.pkl",
    "content": "function fooa() = 42\nfunction foob(x) = 42\nfooc = 42\nfunction other() = 42\n\nres1 = foox()"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/functionNotFoundMaybeLambda.pkl",
    "content": "listing = (it) -> it\ncall = listing(10)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/functionNotFoundMaybeProperty.pkl",
    "content": "prop = 42\ncall = prop()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/intrinsifiedTypeAlias1.pkl",
    "content": "res1: Int16 = \"abc\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/intrinsifiedTypeAlias2.pkl",
    "content": "res1: UInt16 = -1"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/intrinsifiedTypeAlias3.pkl",
    "content": "res1: NonNull = null"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/intrinsifiedTypeAlias4.pkl",
    "content": "res1: Uri = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidBytes1.pkl",
    "content": "foo = Bytes(0, 1, 2, 3, 0xffff)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidBytes2.pkl",
    "content": "local num = 0xfff\n\nres = Bytes(0, 1, 2, 3, num)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidBytes3.pkl",
    "content": "bytes = Bytes(0, 1, 2, 3, 0xffff)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidBytes4.pkl",
    "content": "res = List(1, 2, 3, 0xffff).toBytes()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidCharacterEscape.pkl",
    "content": "res1 = \"xxx\\axxx\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassMethodModifier.pkl",
    "content": "class Foo {\n  open function foo() = 42\n}\n\nres1 = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassModifier.pkl",
    "content": "hidden class Foo"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassModifier2.pkl",
    "content": "fixed class Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidClassPropertyModifier.pkl",
    "content": "class Foo {\n  open foo: Int = 42\n}\n\nres1 = new Foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidFileUri1.pkl",
    "content": "res = read(\"file:path/to/foo.txt\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidFileUri2.pkl",
    "content": "res = read*(\"file:path/to/foo.txt\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidFileUri3.pkl",
    "content": "res = import(\"file:path/to/foo.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidFileUri4.pkl",
    "content": "// Ideally, this should have the same error message as `invalidFileUri2`; the error is that the glob\n// pattern is invalid.\n//\n// But, this is somewhat challenging to fix, because the `URISyntaxException` gets thrown before\n// `ImportGlobNode` is initialized.\n//\n// Regardless, this error is good enough (given this error message, users know what to do), and we\n// can afford to be pragmatic here.\nres = import*(\"file:path/to/foo.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport1.pkl",
    "content": "import* \"{foo{bar}}.pkl\" as invalidGlob\n\nres = invalidGlob\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport2.pkl",
    "content": "import* \"\\\\foo.pkl\" as invalidGlob\n\nres = invalidGlob\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport3.pkl",
    "content": "import* \"foo.pkl\\\\\" as invalidGlob\n\nres = invalidGlob\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport4.pkl",
    "content": "import* \".../input-helper/**.pkl\" as invalidGlob\n\nresult = invalidGlob\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport5.pkl",
    "content": "import* \"https://www.apple.com/**.pkl\" as allPklModules\n\nres = allPklModules\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport6.pkl",
    "content": "// prevention of CVE-2010-2632\nres = import*(\"../*/../*/../*/../*/../*/../*/../*.\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport7.pkl",
    "content": "import* \"../../input-helper/globtest/**.pkl\" as globbedImports\n\nres: globbedImports\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobImport8.pkl",
    "content": "import* \"../../input-helper/globtest/**.pkl\" as globbedImports\n\n// test for ResolveQualifiedDeclaredTypeNode\nres: globbedImports.Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobRead1.pkl",
    "content": "res = read*(\"{foo{bar}}.txt\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobRead2.pkl",
    "content": "res = read*(\".../foo/bar.txt\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidGlobRead3.pkl",
    "content": "res = read*(\"https://www.google.com/**.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidImportBackslashSep.pkl",
    "content": "// In all OSes, the directory separator is forward slash. \nres = import(#\"..\\basic\\baseModule.pkl\"#)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidImportUri.pkl",
    "content": "import \"file:///foo^bar.pkl\" as _foo\n\nfoo = _foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidMethodModifier.pkl",
    "content": "open function foo() = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidModuleModifier.pkl",
    "content": "abstract module foo\n\namends \"baseModule.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidObjectPropertyModifier.pkl",
    "content": "foo {\n  abstract bar = 42\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput1.pkl",
    "content": "output: String = \"abc\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput2.pkl",
    "content": "class Test {}\n\noutput: Test = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidOutput3.pkl",
    "content": "output = null\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidPropertyModifier.pkl",
    "content": "open foo: Int = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTripleDotSyntax1.pkl",
    "content": "import \".../\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTripleDotSyntax2.pkl",
    "content": "import \"...abc\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTypeAliasModifier.pkl",
    "content": "abstract typealias Foo = Int"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTypeName1.pkl",
    "content": "local base = import(\"pkl:base\")\nlisting = new base.Listing {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTypeName2.pkl",
    "content": "local x = new {\n  y = import(\"pkl:base\")\n}\nlisting = new x.y.Listing {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTypeName3.pkl",
    "content": "class Foo\nbar = new Foo.Bar {}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidTypeName4.pkl",
    "content": "class Foo\nlocal Foo2 = Foo\nfoo2 = new Foo2 {}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/invalidUnicodeEscape.pkl",
    "content": "res1 = \"\\u{12x}\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/keywordNotAllowedHere1.pkl",
    "content": "outer = 42\nres1 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/keywordNotAllowedHere2.pkl",
    "content": "function outer() = 42\nres1 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/keywordNotAllowedHere3.pkl",
    "content": "res1 = outer.outer\nres2 = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/keywordNotAllowedHere4.pkl",
    "content": "// `record` is reserved but not used right now\nrecord = 5\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/letExpressionError1.pkl",
    "content": "res1 =\n  let (x = 1)\n    let (y = 2)\n      throw(\"ouch\")"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/letExpressionError2.pkl",
    "content": "res1 =\n  let (x = 1)\n    let (y = throw(\"ouch\"))\n      y + 2"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/letExpressionErrorTyped.pkl",
    "content": "res1 =\n  let (x: Float = \"abc\")\n    x.reverse()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError1.pkl",
    "content": "res = new Listing<String> {\n  1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError2.pkl",
    "content": "one = 1\n\nres = new Listing<String> {\n  one\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError3.pkl",
    "content": "res: Listing<String(!isEmpty)> = new Listing<String> {\n  \"\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError4.pkl",
    "content": "res: Listing<String(!isEmpty)> = new Listing<String(endsWith(\"ga\"))> {\n  \"hola\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError5.pkl",
    "content": "local l = new Listing { 1; 2; 3 } as Listing<String>\n\nres = l[0]\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError6.pkl",
    "content": "local listing1: Listing<Int> = new { 1 }\nlocal listing2: Listing<String> = listing1\nlocal listing3 = (listing2) { \"2\" }\n\nfirst = listing3[0]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError7.pkl",
    "content": "foo: Listing = new { 1; 2; 3 }\nbar: Listing<String> = (foo) { \"bar\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError8.pkl",
    "content": "local a = new Listing { new Listing { 0 } }\nlocal b = a as Listing<Listing<String>> \nlocal c = (b) { new Listing { 1 } }\nlocal d = c as Listing<Listing<Int>>\n\nresult = d\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/listingTypeCheckError9.pkl",
    "content": "local a = new Listing { new Foo {} }\nlocal b = (a) { new Bar {} }\nlocal c = b as Listing<Bar>\nlocal d = (c) { new Foo {} }\nlocal e = d as Listing<Foo>\n\nresult = e\n\nopen class Foo\nclass Bar extends Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/localFixedMember.pkl",
    "content": "local fixed name: String = \"hello\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/localFunctionWithTypeParameter.pkl",
    "content": "local function x<T>() = x"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/localHiddenMember.pkl",
    "content": "local hidden name: String\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError1.pkl",
    "content": "res = new Mapping<String, String> {\n  [\"foo\"] = 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError10.pkl",
    "content": "foo: Mapping = new { [\"foo\"] = 1; [\"bar\"] = 2 }\nbar: Mapping<String, String> = (foo) { [\"baz\"] = \"three\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError11.pkl",
    "content": "local a = new Mapping { [0] = new Foo {} }\nlocal b = (a) { [1] = new Bar {} }\nlocal c = b as Mapping<Int, Bar>\nlocal d = (c) { [2] = new Foo {} }\nlocal e = d as Mapping<Int, Foo>\n\nresult = e\n\nopen class Foo\nclass Bar extends Foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError2.pkl",
    "content": "res: Mapping<String, String> = new {\n  [\"foo\"] = 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError3.pkl",
    "content": "// ConstantEntriesLiteralNode\nres: Mapping<String, String> = new {\n  [1] = \"foo\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError4.pkl",
    "content": "num = 1\n\n// EntriesLiteralNode\nres: Mapping<String, String> = new {\n  [num] = \"foo\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError5.pkl",
    "content": "// GeneratorObjectLiteralNode\nres: Mapping<String, String> = new {\n  when (false) {\n    [\"foo\"] = \"foo\"\n  }\n  [1] = \"foo\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError6.pkl",
    "content": "a = new Listing { \"hi\" }\n\nb = (a) {\n  \"hihih\"\n}\n\nbar = new Mapping {\n  [b] = \"foo\"\n}\n\nres: Mapping<Listing<String(length == 5)>, String> = bar\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError7.pkl",
    "content": "res = new Mapping<Listing<String(length == 5)>, String> {\n  [new Listing { \"hi\" }] = \"hi\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError8.pkl",
    "content": "res: Mapping<String, String> = new {\n  ...Map(\"foo\", 1)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/mappingTypeCheckError9.pkl",
    "content": "local mapping1: Mapping<String, Int> = new { [\"foo\"] = 1 }\nlocal mapping2: Mapping<String, String> = mapping1\nlocal mapping3 = (mapping2) { [\"bar\"] =  \"2\" }\n\nfirst = mapping3[\"foo\"]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/missingLocalPropertyValue1.pkl",
    "content": "local x: Int"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/missingLocalPropertyValue2.pkl",
    "content": "amends \"baseModule.pkl\"\n\nlocal x: Int\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleAmendsSelf.pkl",
    "content": "amends \"moduleAmendsSelf.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleAmendsVersionCheck.pkl",
    "content": "amends \"moduleWithHighMinPklVersion.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleAmendsVersionCheck2.pkl",
    "content": "@ModuleInfo { minPklVersion = \"99.9.9\" }\namends \"baseModule.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleExpected.pkl",
    "content": "hidden path: List<String> = import(\"moduleExpected.pkl\").relativePathTo(module)\ndummy = 42\nresult = (module) { dummy = 0 }.path\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleExtendsSelf.pkl",
    "content": "open module moduleExtendsSelf\n\nextends \"moduleExtendsSelf.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleExtendsVersionCheck.pkl",
    "content": "extends \"moduleWithHighMinPklVersion.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleExtendsVersionCheck2.pkl",
    "content": "@ModuleInfo { minPklVersion = \"99.9.9\" }\nextends \"baseModule.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleImportVersionCheck.pkl",
    "content": "import \"moduleWithHighMinPklVersion.pkl\"\n\nres1 = moduleWithHighMinPklVersion.x\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleWithHighMinPklVersion.pkl",
    "content": "@ModuleInfo { minPklVersion = \"99.9.9\" }\nopen module moduleWithHighMinPklVersion\n\nx = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/moduleWithHighMinPklVersionAndParseErrors.pkl",
    "content": "@ModuleInfo { minPklVersion = \"99.9.9\" }\nopen module moduleWithHighMinPklVersionAndParseErrors\n\nEven though this line is not valid Pkl syntax, Pkl should give a \"nice\" minPklVersion error.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/multipleDefaults.pkl",
    "content": "foo: *Int|*String|*\"foo\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/nested1.pkl",
    "content": "a {\n  b {\n    c {\n      x = outer.outer // nested syntax error\n    }\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/noDefault.pkl",
    "content": "foo: \"foo\"|\"bar\"|\"baz\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/noDefault2.pkl",
    "content": "// alias has a default\ntypealias Foo = *\"foo\"|\"bar\"\n\n// but property doesn't\nfoo: Foo|\"baz\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/notAUnionDefault.pkl",
    "content": "foo: *\"foo\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/objectCannotHaveElement.pkl",
    "content": "class Foo {\n  normalProperty: Boolean\n  nestedStructure: Bar\n}\n\nclass Bar {\n  propertyInNestedStructure: Listing<String>\n}\n\nfoo = new Foo {\n  (nestedStructure.propertyInNestedStructure) {\n    \"Hello world\"\n  }\n  normalProperty = true\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/objectCannotHaveElement2.pkl",
    "content": "class Foo {\n  normalProperty: Boolean\n  nestedStructure: Bar\n}\n\nclass Bar {\n  propertyInNestedStructure: Listing<String>\n}\n\nfoo = new Foo {\n  nestedStructure {\n    propertyInNestedStructure {\n      \"Hello world\"\n    }\n  }\n  normalProperty = true\n}\n\nfoo2 = (foo) {\n  (nestedStructure.propertyInNestedStructure) { \"Hello world!!!\" }\n  normalProperty = false\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/objectCannotHavePredicateMember.pkl",
    "content": "class Foo\n\nres1 = new Foo {\n  [[true]] = 42\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/outOfRange1.pkl",
    "content": "res1 = \"abc\"[4]"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/outOfRange2.pkl",
    "content": "res1 = \"abc\".substring(2, 1)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/outOfRange3.pkl",
    "content": "res1 = List(1, 2, 3).sublist(2, 1)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser1.pkl",
    "content": "res1 = 9#"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser10.pkl",
    "content": "res1 = new [ 42 }"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser11.pkl",
    "content": "res1 = new { foo = 42 ]"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser12.pkl",
    "content": "res1 = new { foo = 42 }}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser14.pkl",
    "content": "// note: file ends with a newline\n\nx = List(1)\n///[1,2,3]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser15.pkl",
    "content": "\nres = 100e_10\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser16.pkl",
    "content": "\nres = 0x_01\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser17.pkl",
    "content": "\nres = 0b_01\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser18.pkl",
    "content": "\nres = 100._01\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser2.pkl",
    "content": "res1 = \"some string\nres2 = 2"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser3.pkl",
    "content": "res1 = \"\"\"some string"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser4.pkl",
    "content": "res1 = \"\"\"some string\nres2 = 2"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser5.pkl",
    "content": "res1 = \"some string\"\"\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser6.pkl",
    "content": "res1 = \"\"\"some string\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser7.pkl",
    "content": "a1 = 10\nres1 = a@11"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser8.pkl",
    "content": "res1 = \"\"\"\n   mismatched indent\n     \"\"\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/parser9.pkl",
    "content": "res1 = #\"\"\"\n   mismatched indent\n     \"\"\"#"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints1.pkl",
    "content": "foo: String(this == \"foo\") = \"bar\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints10.pkl",
    "content": "local list = List(1, 2, 3)\n\nfoo: Dynamic(this == new Dynamic { ...list })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints11.pkl",
    "content": "local list = List(1)\n\nfoo: Dynamic(this == new Dynamic { for (elem in list) { elem + 1 } })\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints12.pkl",
    "content": "foo: String(true, this.length > 5) = \"bob\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints13.pkl",
    "content": "name: String = \"Bub\"\n\nfoo: String(this == \"Hello, \\(name)\") = \"Hello, Patty\" \n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints14.pkl",
    "content": "open class Foo {\n  name: String = \"Foo\"\n}\n\nclass Bar extends Foo {\n  bub: String(startsWith(super.name)) = \"Bubby\"\n}\n\nbar: Bar\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints15.pkl",
    "content": "foo: String(this == \"foo\") | String(this == \"qux\") = \"bar\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints16.pkl",
    "content": "class Bird {\n  name: String?\n}\n\n// this will create `NullPropagatingOperationNode` and `InvokeVirtualMethodNode` for\n// `name?.contains(\"Bob\")`.\n// this tests that we don't have two duplicate values in the diagram.\np: Bird(name?.contains(\"Bob\") ?? false) = new {\n  name = \"Pigeon\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints17.pkl",
    "content": "local name = \"Bob\"\nlocal function greet(name: String) = \"Hello, \\(name)\"\n\nfoo: Any(greet(name) == \"Hello, \\(name)!\") = null\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints2.pkl",
    "content": "foo: String(startsWith(bub.name)) = \"Huzzah\"\n\nbub: Person = new { name = \"Bub\" }\n\nclass Person {\n  name: String\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints3.pkl",
    "content": "foo: Int(this\n  + two\n    / three\n  == four) = 4\n\nlocal two = 2\n\nlocal three = 3\n\nlocal four = 4\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints4.pkl",
    "content": "foo: List(fold(0, (a, b) -> a + b) == 5) = myList\n\nmyList = List(1, 2, 3)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints5.pkl",
    "content": "foo: String(isCapitalized) = \"hello\"\n\nlocal isCapitalized = (it: String) -> it == it.capitalize() \n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints6.pkl",
    "content": "foo: String(isCapitalized) = \"hello\"\n\nlocal isCapitalized = (it: String) ->\n  let (first = it.take(1).toUpperCase())\n    it == \"\\(first)\\(it.drop(1))\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints7.pkl",
    "content": "foo: UInt8 = -5\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints8.pkl",
    "content": "foo: NonNull = null\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints9.pkl",
    "content": "// stdlib constructors are treated as literals\nfoo: Int(\n    IntSeq(1, 5).toList().contains(this)\n    || Map(1, 2, 3, 4).values.contains(this)\n    || List(1, 2, 3, 4).contains(this)\n    || Set(1, 2, 3, 4).contains(this)\n    || Pair(1, 2).second == this\n    || Bytes(1, 2, 3, 4).toList().contains(this)\n    || Regex(\"1234\").toString().length == this\n  ) = 10\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/power/typeConstraints9a.pkl",
    "content": "local num = 1\n\n// stdlib constructors that have a non-literal are not treated as literals\nfoo: Int(\n    IntSeq(num, 5).toList().contains(this)\n    || Map(num, 2, 3, 4).values.contains(this)\n    || List(num, 2, 3, 4).contains(this)\n    || Set(num, 2, 3, 4).contains(this)\n    || Pair(num, 2).second == this\n    || Bytes(num, 2, 3, 4).toList().contains(this)\n    || Regex(\"\\(num)234\").toString().length == this\n  ) = 10\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/propertyNotFound1.pkl",
    "content": "foo {\n  xbar = 1\n  barx = 2\n  other = 3\n}\n\nres1 = foo.bar"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/propertyNotFound2.pkl",
    "content": "res0 = Pair(1, 2).foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/refusingToLoadModule.pkl",
    "content": "import \"birds:///foo.pkl\"\n\noutput = foo\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/shebang.pkl",
    "content": "foo = 1\n#!/usr/bin/env pkl eval\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/singleBacktick.pkl",
    "content": "`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxCannotHaveElement.pkl",
    "content": "local source {\n  1\n  2\n  3\n}\n\nres: Mapping = new {\n  ...source\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxCannotHaveEntry.pkl",
    "content": "local source {\n  [\"foo\"] = 1\n}\n\nres: Listing = new {\n  ...source\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxCannotHaveProperty.pkl",
    "content": "local source {\n  foo = \"foo\"\n}\n\nres: Listing = new {\n  ...source\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxCannotIterateOverTyped.pkl",
    "content": "class Person {\n  name: String\n}\n\nperson: Person = new { name = \"Bob\" }\n\nresult {\n  ...person\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxCannotSpreadListIntoMapping.pkl",
    "content": "l: List = List(1, 2, 3, 4)\n\nm: Mapping = new {\n  ...l\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxDuplicateEntry1.pkl",
    "content": "local source {\n  [\"foo\"] = 1\n}\n\nres: Mapping = new {\n  ...source\n  [\"foo\"] = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxDuplicateEntry2.pkl",
    "content": "local source {\n  [\"foo\"] = 1\n}\n\nres: Mapping = new {\n  [\"foo\"] = 2\n  ...source\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxDuplicateProperty1.pkl",
    "content": "local source {\n  foo = 1\n}\n\nres {\n  ...source\n  foo = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxDuplicateProperty2.pkl",
    "content": "local source {\n  foo = 1\n}\n\nres {\n  foo = 2\n  ...source\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxNullValue.pkl",
    "content": "source = null\n\nres { ...source }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/spreadSyntaxUnknownTypedProperty.pkl",
    "content": "class Person { name: String }\n\nlocal personDynamic {\n  name = \"Barn Owl\"\n  age = 34\n}\n\nres1: Person = new { ...personDynamic }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/stackTraceWithQuotedMemberName.pkl",
    "content": "one {\n  `two three` {\n    four = throw(\"ouch\")\n  }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/supercalls.pkl",
    "content": "foo {\n  bar = super.bar()\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/typeMismatchHelper.pkl",
    "content": "module foo.bar\n\nclass Baz\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/typeMismatchWithSameQualifiedClassName.pkl",
    "content": "module foo.bar\n\nimport \"typeMismatchHelper.pkl\"\n\nclass Baz\n\nbaz: Baz = new typeMismatchHelper.Baz {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/typeMismatchWithSameQualifiedModuleName.pkl",
    "content": "module foo.bar\n\nimport \"typeMismatchHelper.pkl\"\n\nmod: module = typeMismatchHelper\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedOp1.pkl",
    "content": "res1 = !1"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedOp2.pkl",
    "content": "res1 = \"str\" + 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedOp3.pkl",
    "content": "l = List(1,2,3)\nres1 = l[\"idx\"]"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty1.pkl",
    "content": "class Person {\n  name: String\n}\n\nres1: Person\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty2.pkl",
    "content": "name: String\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty3.pkl",
    "content": "class D {\n  dProperty: String\n}\n\nclass A {\n  b: Mapping<D, B>\n}\n\nclass B {\n  `bar-baz`: C\n}\n\nclass C {\n  theNumber : Int\n}\n\na: A = new {\n  b {\n    [new D { dProperty = \"dProperty\" }] = new {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty4.pkl",
    "content": "class Zebra {\n  party: Party\n}\n\nclass Party {\n  time: Mapping<Any, Int>\n}\n\nclass Foo {\n  bar: Bar\n}\n\nclass Bar {\n  num: Int\n}\n\nzebra: Zebra = new {\n  party {\n    time {\n      [1] = 1\n      [2] = 2\n      [3] = 3\n      [4] = 4\n      [5] = 5\n      [6] = 6\n      [7] = 7\n      [new Foo {\n        bar {\n          num = 5\n        }\n      }] = 0\n      [new Foo {}] = 1\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty5.pkl",
    "content": "class Zebra {\n  party: Party\n}\n\nclass Party {\n  time: Mapping<Foo, Int>\n}\n\nclass Foo {\n  bar: Bar\n}\n\nclass Bar {\n  num: Mapping<Alpha, Boolean>\n}\n\nclass Alpha {\n  beta: Bravo\n}\n\nclass Bravo {\n  charlie: Charlie\n}\n\nclass Charlie {\n  delta: Int\n}\n\nzebra: Zebra = new {\n  party {\n    time {\n      [new Foo {\n        bar {\n          num {\n            [new Alpha {}] = true\n          }\n        }\n      }] = 1\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty6.pkl",
    "content": "// we don't expect a path to be shown in the error message, because we cannot tell if the error came\n// from reading the `res1` member or not.\n\nclass Person {\n  name: String\n}\n\nlocal person: Person = new {}\n\nres1 = person.name\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty7.pkl",
    "content": "// we don't expect a path to be shown in the error message, because the renderer's traverser cannot\n// tell if the thrown error came from reading \n\nclass Person {\n  name: String\n}\n\nres1 {\n  [new Person {}] = 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/undefinedProperty8.pkl",
    "content": "class Person {\n  name: String\n}\n\noutput {\n  value = new Person {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/underscore.pkl",
    "content": "_ = 0\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/underscoreLambda.pkl",
    "content": "local lambda = (_, x: Int) -> `_` + x\n\nres = lambda.apply(1, 1)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/underscoreLet.pkl",
    "content": "foo = let (_ = throw(\"oops\")) 0\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/unterminatedUnicodeEscape.pkl",
    "content": "res1 = \"foo \\u{123 bar\""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/userDefinedTypeParameter1.pkl",
    "content": "class Box<A> {\n  element: A\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/userDefinedTypeParameter2.pkl",
    "content": "class DoIt {\n  function doit<A>(a: A): A = a\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/wrongForGeneratorType1.pkl",
    "content": "res1 = new Listing {\n  for (n: Int in List(1, \"other\", 2)) { n }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/wrongForGeneratorType2.pkl",
    "content": "res1 = new Mapping {\n  for (n: Int in List(1, \"other\", 2)) { [n] = n }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/errors/wrongNumberOfMapArguments.pkl",
    "content": "res1 = Map(1, 2, 3)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/duplicateDefinition1.pkl",
    "content": "x {\n  y = 123\n  when (true) { y = 456 }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/duplicateDefinition2.pkl",
    "content": "x {\n  [\"y\"] = 123\n  for (i in List(1)) { [\"y\"] = 456 }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/duplicateDefinition3.pkl",
    "content": "x {\n  when (true) { y = 1 }\n  when (true) { y = 2 }\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/elementGenerators.pkl",
    "content": "res1 = new Listing {\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres1b = new Dynamic {\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres1c = new Listing {\n  for (i, n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres1d = new Dynamic {\n  for (i, n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres2 = new Listing {\n  for (n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres2b = new Dynamic {\n  for (n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres2c = new Listing {\n  for (i, n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres2d = new Dynamic {\n  for (i, n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres3 = new Listing {\n  for (n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres3b = new Dynamic {\n  for (n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres3c = new Listing {\n  for (i, n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres3d = new Dynamic {\n  for (i, n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres4 = new Listing {\n  for (value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      value\n    }\n  }\n}\n\nres4b = new Dynamic {\n  for (value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      value\n    }\n  }\n}\n\nres4c = new Listing {\n  for (key, value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      Pair(key, value)\n    }\n  }\n}\n\nres4d = new Dynamic {\n  for (key, value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      Pair(key, value)\n    }\n  }\n}\n\nres5 = new Listing {\n  for (n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres5b = new Dynamic {\n  for (n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres5c = new Listing {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres5d = new Dynamic {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres6 = new Listing {\n  for (value in new Mapping { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      value\n    }\n  }\n}\n\nres6b = new Dynamic {\n  for (value in new Mapping { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      value\n    }\n  }\n}\n\nres6c = new Listing {\n  for (key, value in new Mapping { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      Pair(key, value)\n    }\n  }\n}\n\nres6d = new Dynamic {\n  for (key, value in new Mapping { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      Pair(key, value)\n    }\n  }\n}\n\nres7 = new Listing {\n  for (value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      value\n    }\n  }\n}\n\nres7b = new Dynamic {\n  for (value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      value\n    }\n  }\n}\n\nres7c = new Listing {\n  for (key, value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      Pair(key, value)\n    }\n  }\n}\n\nres7d = new Dynamic {\n  for (key, value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2; }) {\n    when (value.isOdd) {\n      Pair(key, value)\n    }\n  }\n}\n\nres8 = new Listing {\n  \"one\"\n  when (1 + 1 == 2) { \"two\" }\n  when (1 + 1 == 3) { \"three\" }\n}\n\nres8b = new Dynamic {\n  \"one\"\n  when (1 + 1 == 2) { \"two\" }\n  when (1 + 1 == 3) { \"three\" }\n}\n\nres9 = new Listing {\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      x + y\n    }\n  }\n}\n\nre9b = new Dynamic {\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      x + y\n    }\n  }\n}\n\nres9c = new Listing {\n  for (i1, x in List(\"a\", \"b\", \"c\")) {\n    for (i2, y in List(\"e\", \"f\")) {\n      Pair(i1 + i2, x + y)\n    }\n  }\n}\n\nre9d = new Dynamic {\n  for (i1, x in List(\"a\", \"b\", \"c\")) {\n    for (i2, y in List(\"e\", \"f\")) {\n      Pair(i1 + i2, x + y)\n    }\n  }\n}\n\nres10 = new Listing {\n  \"one\"\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n  \"two\"\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      x + y\n    }\n  }\n  \"three\"\n}\n\nres10b = new Dynamic {\n  \"one\"\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n  \"two\"\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      x + y\n    }\n  }\n  \"three\"\n}\n\n// reuse same loop variable\nres11 = new Listing {\n  for (n in IntSeq(1, 3)) { n }\n  for (n in List(\"a\", \"b\", \"c\")) { n }\n  for (n in IntSeq(1, 3)) { n }\n}\n\n// reuse same loop variable\nres11b = new Dynamic {\n  for (n in IntSeq(1, 3)) { n }\n  for (n in List(\"a\", \"b\", \"c\")) { n }\n  for (n in IntSeq(1, 3)) { n }\n}\n\n// reuse same loop variable\nres11c = new Listing {\n  for (i, n in IntSeq(1, 3)) { Pair(i, n) }\n  for (i, n in List(\"a\", \"b\", \"c\")) { Pair(i, n) }\n  for (i, n in IntSeq(1, 3)) { Pair(i, n) }\n}\n\n// reuse same loop variable\nres11d = new Dynamic {\n  for (i, n in IntSeq(1, 3)) { Pair(i, n) }\n  for (i, n in List(\"a\", \"b\", \"c\")) { Pair(i, n) }\n  for (i, n in IntSeq(1, 3)) { Pair(i, n) }\n}\n\nres12a = new Listing {\n  for (i in Bytes(1, 2, 3, 4)) {\n    i\n  }\n}\n\nres12b = new Listing {\n  for (i in Bytes()) {\n    i\n  }\n}\n\nlocal dynamicWithOnlyProperties = new Dynamic {\n  foo = \"Foo!\"\n  bar = 42\n  baz = Pair(1337, \"zab\")\n}\nvalueForOverProperties = new Dynamic {\n  for (v in dynamicWithOnlyProperties) {\n    [v] = v\n  }\n}\nkeyValueForOverProperties = new Dynamic {\n  for (k, v in dynamicWithOnlyProperties) {\n    [k] = v\n  }\n}\n\nlocal dynamicWithAllMemberTypes = new Dynamic {\n  propFoo = \"foo\"\n  \"elementBar\"\n  propBaz = 1337\n  [\"entryKeyQux\"] = 42\n  \"elementQuux\"\n  [\"entryKeyCorge\"] = \"corge\"\n}\n\nvalueForOverAllMembers = new Dynamic {\n  for (v in dynamicWithAllMemberTypes) {\n    v\n  }\n}\n\nkeyValueForOverAllMembers = new Dynamic {\n  for (k, v in dynamicWithAllMemberTypes) {\n    \"\\(k) -> \\(v)\"\n  }\n}\n\nclass Person {\n  name: String\n  age: Int\n}\n\nlocal pigeon: Person = new { name = \"Pigeon\" age = 42 }\n\nvalueForOverTyped = new Dynamic {\n  for (v in pigeon.toDynamic()) {\n    v\n  }\n}\n\nkeyValueForOverTyped = new Dynamic {\n  for (k, v in pigeon.toDynamic()) {\n    \"\\(k) -> \\(v)\"\n  }\n}\n\nlocal overlappingPropertyNamesAndEntryKeys: Dynamic = new {\n  foo = \"property\"\n  [\"foo\"] = \"entry\"\n\n  [\"bar\"] = \"can only discern by iteration order (properties before entries)\"\n  bar = \"can only discern by iteration order (properties before entries)\"\n}\n\nvalueForOverConflictingPropertiesAndEntries = new Dynamic {\n  for (v in overlappingPropertyNamesAndEntryKeys) {\n    v\n  }\n}\n\nkeyValueForOverConflictingPropertiesAndEntries = new Dynamic {\n  for (k, v in overlappingPropertyNamesAndEntryKeys) {\n    \"\\(k) -> \\(v)\"\n  }\n}\n\nforWithMultipleMembers = new Dynamic {\n  for (ch in List(\"a\", \"b\", \"c\")) {\n    ch\n    ch + \"x\"\n    ch + \"y\"\n  }\n}\n\nforWithMultipleMembersNested = new Listing {\n  for (ch in List(\"a\", \"b\")) {\n    for (k, v in Map(\"x\", 1, \"y\", 2)) {\n      ch + k + v.toString()\n      v.toString() + k + ch\n    }\n    for (k, v in Map(\"xx\", 11, \"yy\", 22)) {\n      ch + k + v.toString()\n      v.toString() + k + ch\n    }\n  }\n}\n\nforGeneratorsWithOverlappingNamesAndWhenNestedWhen = new Listing {\n  when (false) {\n    for (c in List(1)) {\n      c\n    }\n  } else {\n    for (c in List(6)) {\n      when (c != 1) {\n        c\n      }\n    }\n  }\n}\n\nwhenWithMultipleMembers = new Dynamic {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      i * n\n      i * n * 2\n    }\n  }\n}\n\nwhenWithMultipleMembersNested = new Listing {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      when (n > 3) {\n        i * n\n        i * n * 2\n      }\n    }\n  }\n}\n\nwhenWithElse = new Dynamic {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      i * n\n      i * n * 2\n    } else {\n      (i * n).toString()\n      (i * n * 2).toString()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/elementGeneratorsTyped.pkl",
    "content": "import \"pkl:test\"\n\nres1 = new Listing {\n  for (n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres1b = test.catch(() -> new Listing {\n  for (n: String in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n})\n\nres1c = new Listing {\n  for (i: Int, n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres1d = test.catch(() -> new Listing {\n  for (i: String, n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n})\n\nres2 = new Dynamic {\n  for (n: Number in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n}\n\nres2b = test.catch(() -> new Dynamic {\n  for (n: Number in List(1, 2, \"other\", 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n})\n\nres2c = new Dynamic {\n  for (i: Number, n: Number in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      i * n\n    }\n  }\n}\n\nres2d = test.catch(() -> new Dynamic {\n  for (i: Number, n: Number in List(1, 2, \"other\", 4, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n})\n\nres6 = new Listing {\n  for (x: Any in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(\"e\", \"f\")) {\n      x + y\n    }\n  }\n}\n\nres6b = test.catch(() -> new Listing {\n  for (x: Any in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(\"e\", 42)) {\n      x + y\n    }\n  }\n})\n\nres6c = new Listing {\n  for (i1: Int, x: Any in List(\"a\", \"b\", \"c\")) {\n    for (i2: Int, y: String in List(\"e\", \"f\")) {\n      Pair(i1 + i2, x + y)\n    }\n  }\n}\n\nres6d = test.catch(() -> new Listing {\n  for (i1: Int, x: Any in List(\"a\", \"b\", \"c\")) {\n    for (i2: Int, y: String in List(\"e\", 42)) {\n      Pair(i1 + i2, x + y)\n    }\n  }\n})\n\nres7 = new Dynamic {\n  \"one\"\n  for (n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n  \"two\"\n  for (x: unknown in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(\"e\", \"f\")) {\n      x + y\n    }\n  }\n  \"three\"\n}\n\nres7b = test.catch(() -> new Dynamic {\n  \"one\"\n  for (n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      n * 2\n    }\n  }\n  \"two\"\n  for (x: unknown in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(42, \"f\")) {\n      x + y\n    }\n  }\n  \"three\"\n})\n\n// reuse same loop variable\nres8 = new Listing {\n  for (n: Int in IntSeq(1, 3)) { n }\n  for (n: String in List(\"a\", \"b\", \"c\")) { n }\n  for (n: Number in IntSeq(1, 3)) { n }\n}\n\n// reuse same loop variable\nres8b = test.catch(() -> new Listing {\n  for (n: Int in IntSeq(1, 3)) { n }\n  for (n: String in List(42.min, \"b\", \"c\")) { n }\n  for (n: Number in IntSeq(1, 3)) { n }\n})\n\n// reuse same loop variable\nres8c = new Listing {\n  for (i: Int, n: Int in IntSeq(1, 3)) { Pair(i, n) }\n  for (i: Number, n: String in List(\"a\", \"b\", \"c\")) { Pair(i, n) }\n  for (i: Int, n: Number in IntSeq(1, 3)) { Pair(i, n) }\n}\n\n// reuse same loop variable\nres8d = test.catch(() -> new Listing {\n  for (i: Int, n: Int in IntSeq(1, 3)) { Pair(i, n) }\n  for (i: Number, n: String in List(42.min, \"b\", \"c\")) { Pair(i, n) }\n  for (i: Int, n: Number in IntSeq(1, 3)) { Pair(i, n) }\n})\n\nforWithMultipleMembers = new Dynamic {\n  for (ch: String in List(\"a\", \"b\", \"c\")) {\n    ch\n    ch + \"x\"\n    ch + \"y\"\n  }\n}\n\nforWithMultipleMembersNested = new Dynamic {\n  for (ch: String in List(\"a\", \"b\")) {\n    for (k: String, v: Int in Map(\"x\", 1, \"y\", 2)) {\n      ch + k + v.toString()\n      v.toString() + k + ch\n    }\n    for (k: String, v: Number in Map(\"xx\", 11, \"yy\", 22)) {\n      ch + k + v.toString()\n      v.toString() + k + ch\n    }\n  }\n}\n\nwhenWithMultipleMembers = new Dynamic {\n  for (i: Int, n: Int in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      i * n\n      i * n * 2\n    }\n  }\n}\n\nwhenWithMultipleMembersNested = new Listing {\n  for (i: Int, n: Int in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      when (n > 3) {\n        i * n\n        i * n * 2\n      }\n    }\n  }\n}\n\nwhenWithElse = new Dynamic {\n  for (i: Int, n: Int in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      i * n\n      i * n * 2\n    } else {\n      (i * n).toString()\n      (i * n * 2).toString()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/entryGenerators.pkl",
    "content": "import \"pkl:test\"\n\nres1 = new Mapping {\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\n\nres1b = new Dynamic {\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres1c = new Mapping {\n  for (i, n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres1d = new Dynamic {\n  for (i, n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres2 = new Mapping {\n  for (n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres2b = new Dynamic {\n  for (n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres2c = new Mapping {\n  for (i, n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres2d = new Dynamic {\n  for (i, n in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres3 = new Mapping {\n  for (n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres3b = new Dynamic {\n  for (n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres3c = new Mapping {\n  for (i, n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres3d = new Dynamic {\n  for (i, n in Set(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres4 = new Mapping {\n  for (value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      [value] = value * 2\n    }\n  }\n}\n\nres4b = new Dynamic {\n  for (value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      [value] = value * 2\n    }\n  }\n}\n\nres4c = new Mapping {\n  for (key, value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      [key.reverse()] = value * 2\n    }\n  }\n}\n\nres4d = new Dynamic {\n  for (key, value in Map(\"one\", 1, \"two\", 2)) {\n    when (value.isOdd) {\n      [key.reverse()] = value * 2\n    }\n  }\n}\n\nres5 = new Mapping {\n  for (n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres5b = new Dynamic {\n  for (n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres5c = new Mapping {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres5d = new Dynamic {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres6 = new Mapping {\n  for (value in new Mapping { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [value] = value * 2\n    }\n  }\n}\n\nres6b = new Dynamic {\n  for (value in new Mapping { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [value] = value * 2\n    }\n  }\n}\n\nres6c = new Mapping {\n  for (key, value in new Mapping { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [key.reverse()] = value * 2\n    }\n  }\n}\n\nres6d = new Dynamic {\n  for (key, value in new Mapping { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [key.reverse()] = value * 2\n    }\n  }\n}\n\nres7 = new Mapping {\n  for (value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [value] = value * 2\n    }\n  }\n}\n\nres7b = new Dynamic {\n  for (value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [value] = value * 2\n    }\n  }\n}\n\nres7c = new Mapping {\n  for (key, value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [key.reverse()] = value * 2\n    }\n  }\n}\n\nres7d = new Dynamic {\n  for (key, value in new Dynamic { [\"one\"] = 1; [\"two\"] = 2 }) {\n    when (value.isOdd) {\n      [key.reverse()] = value * 2\n    }\n  }\n}\n\nres8 = new Mapping {\n  [\"one\"] = 1\n  when (1 + 1 == 2) { [\"two\"] = 2 }\n  when (1 + 1 == 3) { [\"three\"] = 3 }\n}\n\nres8b = new Dynamic {\n  [\"one\"] = 1\n  when (1 + 1 == 2) { [\"two\"] = 2 }\n  when (1 + 1 == 3) { [\"three\"] = 3 }\n}\n\nres9 = new Mapping {\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      [x + y] = x + y\n    }\n  }\n}\n\nres9b = new Dynamic {\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      [x + y] = x + y\n    }\n  }\n}\n\nres9c = new Mapping {\n  for (i1, x in List(\"a\", \"b\", \"c\")) {\n    for (i2, y in List(\"e\", \"f\")) {\n      [x + y] = Pair(i1 + i2, x + y)\n    }\n  }\n}\n\nres9d = new Dynamic {\n  for (i1, x in List(\"a\", \"b\", \"c\")) {\n    for (i2, y in List(\"e\", \"f\")) {\n      [x + y] = Pair(i1 + i2, x + y)\n    }\n  }\n}\n\nres10 = new Mapping {\n  [\"one\"] = 1\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n  [\"two\"] = 2\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      [x + y] = x + y\n    }\n  }\n  [\"three\"] = 3\n}\n\nres10b = new Dynamic {\n  [\"one\"] = 1\n  for (n in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n  [\"two\"] = 2\n  for (x in List(\"a\", \"b\", \"c\")) {\n    for (y in List(\"e\", \"f\")) {\n      [x + y] = x + y\n    }\n  }\n  [\"three\"] = 3\n}\n\n// reuse same loop variable\nres11 = new Mapping {\n  for (n in IntSeq(1, 3)) { [n] = n }\n  for (n in List(\"a\", \"b\", \"c\")) { [n] = n }\n  for (n in IntSeq(4, 6)) { [n] = n }\n}\n\n// reuse same loop variable\nres11b = new Dynamic {\n  for (n in IntSeq(1, 3)) { [n] = n }\n  for (n in List(\"a\", \"b\", \"c\")) { [n] = n }\n  for (n in IntSeq(4, 6)) { [n] = n }\n}\n\n// reuse same loop variable\nres11c = new Mapping {\n  for (i, n in IntSeq(1, 3)) { [n] = Pair(i, n) }\n  for (i, n in List(\"a\", \"b\", \"c\")) { [n] = Pair(i, n) }\n  for (i, n in IntSeq(4, 6)) { [n] = Pair(i, n) }\n}\n\n// reuse same loop variable\nres11d = new Dynamic {\n  for (i, n in IntSeq(1, 3)) { [n] = Pair(i, n) }\n  for (i, n in List(\"a\", \"b\", \"c\")) { [n] = Pair(i, n) }\n  for (i, n in IntSeq(4, 6)) { [n] = Pair(i, n) }\n}\n\nlocal dynamicWithOnlyProperties = new Dynamic {\n  foo = \"Foo!\"\n  bar = 42\n  baz = Pair(1337, \"zab\")\n}\nvalueForOverProperties = new Dynamic {\n  for (v in dynamicWithOnlyProperties) {\n    [v] = v\n  }\n}\nkeyValueForOverProperties = new Dynamic {\n  for (k, v in dynamicWithOnlyProperties) {\n    [k] = v\n  }\n}\n\nlocal dynamicWithAllMemberTypes = new Dynamic {\n  propFoo = \"foo\"\n  \"elementBar\"\n  propBaz = 1337\n  [\"entryKeyQux\"] = 42\n  \"elementQuux\"\n  [\"entryKeyCorge\"] = \"corge\"\n}\n\nvalueForOverAllMembers = new Dynamic {\n  for (v in dynamicWithAllMemberTypes) {\n    [v] = v\n  }\n}\n\nkeyValueForOverAllMembers = new Dynamic {\n  for (k, v in dynamicWithAllMemberTypes) {\n    [k] = v\n  }\n}\n\nclass Person {\n  name: String\n  age: Int\n}\n\nlocal pigeon: Person = new { name = \"Pigeon\" age = 42 }\n\nvalueForOverTyped = new Dynamic {\n  for (v in pigeon.toDynamic()) {\n    [v] = v\n  }\n}\n\nkeyValueForOverTyped = new Dynamic {\n  for (k, v in pigeon.toDynamic()) {\n    [k] = v\n  }\n}\n\nlocal overlappingPropertyNamesAndEntryKeys: Dynamic = new {\n  foo = \"property\"\n  [\"foo\"] = \"entry\"\n\n  [\"bar\"] = \"can only discern by iteration order (properties before entries)\"\n  bar = \"can only discern by iteration order (properties before entries)\"\n}\n\nvalueForOverConflictingPropertiesAndEntries = test.catch(() -> new Dynamic {\n  for (v in overlappingPropertyNamesAndEntryKeys) {\n    [v] = v\n  }\n})\n\nkeyValueForOverConflictingPropertiesAndEntries = test.catch(() -> new Dynamic {\n  for (k, v in overlappingPropertyNamesAndEntryKeys) {\n    [k] = v\n  }\n})\n\nforWithMultipleMembers = new Dynamic {\n  for (ch in List(\"a\", \"b\", \"c\")) {\n    [ch] = ch\n    [ch + \"x\"] = ch + \"x\"\n    [ch + \"y\"] = ch + \"y\"\n  }\n}\n\nforWithMultipleMembersNested = new Mapping {\n  for (ch in List(\"a\", \"b\")) {\n    for (k, v in Map(\"x\", 1, \"y\", 2)) {\n      [ch + k + v.toString()] = ch + k + v.toString()\n      [v.toString() + k + ch] = v.toString() + k + ch\n    }\n    for (k, v in Map(\"xx\", 11, \"yy\", 22)) {\n      [ch + k + v.toString()] = ch + k + v.toString()\n      [v.toString() + k + ch] = v.toString() + k + ch\n    }\n  }\n}\n\nwhenWithMultipleMembers = new Dynamic {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [(i + 1) * n] = (i + 1) * n\n      [(i + 1) * n * 2] = (i + 1) * n * 2\n    }\n  }\n}\n\nwhenWithMultipleMembersNested = new Mapping {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      when (n > 3) {\n        [(i + 1) * n] = (i + 1) * n\n        [(i + 1) * n * 2] = (i + 1) * n * 2\n      }\n    }\n  }\n}\n\nwhenWithElse = new Dynamic {\n  for (i, n in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [(i + 1) * n] = (i + 1) * n\n      [(i + 1) * n * 2] = (i + 1) * n * 2\n    } else {\n      [((i + 1) * n).toString()] = ((i + 1) * n).toString()\n      [((i + 1) * n * 2).toString()] = ((i + 1) * n * 2).toString()\n    }\n  }\n}\n\nfunction generateEntries() = new Mapping {\n  // noinspection ReplaceForGeneratorWithSpread\n  for (k, v in Map(\"a\", 1, \"b\", 2)) {\n    [k] = v\n  }\n}\n\nwithinMethod = generateEntries()\n\nwithinLetExpr =\n  let (m = Map(\"a\", 1, \"b\", 2))\n    new Mapping {\n      // noinspection ReplaceForGeneratorWithSpread\n      for (k, v in m) {\n        [k] = v\n      }\n    }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/entryGeneratorsTyped.pkl",
    "content": "import \"pkl:test\"\n\nres1 = new Mapping {\n  for (n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres1b = test.catch(() -> new Mapping {\n  for (n: String in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n})\n\nres1c = new Mapping {\n  for (i: Int, n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres1d = test.catch(() -> new Mapping {\n  for (i: Int, n: String in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n})\n\nres2 = new Dynamic {\n  for (n: Number in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n}\n\nres2b = test.catch(() -> new Dynamic {\n  for (n: Number in List(1, 2, \"other\", 4, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n})\n\nres2c = new Dynamic {\n  for (i: Number, n: Number in List(1, 2, 3, 4, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n}\n\nres2d = test.catch(() -> new Dynamic {\n  for (i: Number, n: Number in List(1, 2, \"other\", 4, 5)) {\n    when (n.isOdd) {\n      [i * n] = i * n\n    }\n  }\n})\n\nres6 = new Mapping {\n  for (x: Any in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(\"e\", \"f\")) {\n      [x + y] = x + y\n    }\n  }\n}\n\nres6b = test.catch(() -> new Mapping {\n  for (x: Any in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(\"e\", 42)) {\n      [x + y] = x + y\n    }\n  }\n})\n\nres6c = new Mapping {\n  for (i1: Int, x: Any in List(\"a\", \"b\", \"c\")) {\n    for (i2: Number, y: String in List(\"e\", \"f\")) {\n      [x + y] = Pair(i1 + i2, x + y)\n    }\n  }\n}\n\nres6d = test.catch(() -> new Mapping {\n  for (i1: Int, x: Any in List(\"a\", \"b\", \"c\")) {\n    for (i2: Number, y: String in List(\"e\", 42)) {\n      [x + y] = Pair(i1 + i2, x + y)\n    }\n  }\n})\n\nres7 = new Dynamic {\n  [\"one\"] = 1\n  for (n: Int in IntSeq(1, 5)) {\n    when (n.isOdd) {\n      [n * 2] = n * 2\n    }\n  }\n  [\"two\"] = 2\n  for (x: unknown in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(\"e\", \"f\")) {\n      [x + y] = x + y\n    }\n  }\n  [\"three\"] = 3\n}\n\nres7b = test.catch(() -> new Dynamic {\n  [\"one\"] = 1\n  for (n: Int in IntSeq(1, 5)) {\n    when (n.isOdd){\n      [n * 2] = n * 2\n    }\n  }\n  [\"two\"] = 2\n  for (x: unknown in List(\"a\", \"b\", \"c\")) {\n    for (y: String in List(42, \"f\")) {\n      [x + y] = x + y\n    }\n  }\n  [\"three\"] = 3\n})\n\n// reuse same loop variable\nres8 = new Mapping {\n  for (n: Int in IntSeq(1, 3)) { [n] = n }\n  for (n: String in List(\"a\", \"b\", \"c\")) { [n] = n }\n  for (n: Number in IntSeq(4, 6)) { [n] = n }\n}\n\n// reuse same loop variable\nres8b = test.catch(() -> new Mapping {\n  for (n: Int in IntSeq(1, 3)) { [n] = n }\n  for (n: String in List(42.min, \"b\", \"c\")) { [n] = n }\n  for (n: Number in IntSeq(4, 6)) { [n] = n }\n})\n\n// reuse same loop variable\nres8c = new Mapping {\n  for (i: Int, n: Int in IntSeq(1, 3)) { [n] = Pair(i, n) }\n  for (i: Number, n: String in List(\"a\", \"b\", \"c\")) { [n] = Pair(i, n) }\n  for (i: Int, n: Number in IntSeq(4, 6)) { [n] = Pair(i, n) }\n}\n\n// reuse same loop variable\nres8d = test.catch(() -> new Mapping {\n  for (i: Int, n: Int in IntSeq(1, 3)) { [n] = Pair(i, n) }\n  for (i: Number, n: String in List(42.min, \"b\", \"c\")) { [n] = Pair(i, n) }\n  for (i: Int, n: Number in IntSeq(4, 6)) { [n] = Pair(i, n) }\n})\nforWithMultipleMembers = new Dynamic {\n  for (ch: String in List(\"a\", \"b\", \"c\")) {\n    [ch] = ch\n    [ch + \"x\"] = ch + \"x\"\n    [ch + \"y\"] = ch + \"y\"\n  }\n}\n\nforWithMultipleMembersNested = new Dynamic {\n  for (ch: String in List(\"a\", \"b\")) {\n    for (k: String, v: Int in Map(\"x\", 1, \"y\", 2)) {\n      [ch + k + v.toString()] = ch + k + v.toString()\n      [v.toString() + k + ch] = v.toString() + k + ch\n    }\n    for (k: String, v: Number in Map(\"xx\", 11, \"yy\", 22)) {\n      [ch + k + v.toString()] = ch + k + v.toString()\n      [v.toString() + k + ch] = v.toString() + k + ch\n    }\n  }\n}\n\nwhenWithMultipleMembers = new Dynamic {\n  for (i: Int, n: Int in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [(i + 1) * n] = (i + 1) * n\n      [(i + 1) * n * 2] = (i + 1) * n * 2\n    }\n  }\n}\n\nwhenWithMultipleMembersNested = new Mapping {\n  for (i: Int, n: Int in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      when (n > 3) {\n        [(i + 1) * n] = (i + 1) * n\n        [(i + 1) * n * 2] = (i + 1) * n * 2\n      }\n    }\n  }\n}\n\nwhenWithElse = new Dynamic {\n  for (i: Int, n: Int in new Listing { 1; 2; 3; 4; 5 }) {\n    when (n.isOdd) {\n      [(i + 1) * n] = (i + 1) * n\n      [(i + 1) * n * 2] = (i + 1) * n * 2\n    } else {\n      [((i + 1) * n).toString()] = ((i + 1) * n).toString()\n      [((i + 1) * n * 2).toString()] = ((i + 1) * n * 2).toString()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorInFunctionBody.pkl",
    "content": "function myMethod(arg) = new {\n  arg = \"property\" // same name as method arg\n  for (key, value in List(\"one\", \"two\", arg)) { // `arg` resolves to method arg\n    [Pair(arg, key)] = // `arg` resolves to method arg\n      Pair(arg, value) // `arg` resolves to object property\n  }\n}\n\nlocal myLambda = (arg) -> new Dynamic {\n  arg = \"property\" // same name as lambda arg\n  for (key, value in List(\"one\", \"two\", arg)) { // `arg` resolves to lambda arg\n    [Pair(arg, key)] = // `arg` resolves to lambda arg\n      Pair(arg, value) // `arg` resolves to object property\n  }\n}\n\nres1 = myMethod(\"three\")\nres2 = myLambda.apply(\"three\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorInMixins.pkl",
    "content": "foo {\n  bar = new Listing {} |> mapEnv(new Dynamic {\n    res1Name = \"res1Value\"\n    res2Name = \"res2Value\"\n  })\n  baz = new Listing {} |> mapEnvLiteral(new Dynamic {\n    res3Name = \"res3Value\"\n    res4Name = \"res4Value\"\n  })\n}\n\nfunction mapEnv(_env: Dynamic) = new Mixin {\n  for (k, v in _env) {\n    new {\n      name = k\n      value = v\n    }\n  }\n  for (k, v in _env) {\n    new {\n      name = k + \" 2\"\n      value = v + \" 2\"\n    }\n  }\n}\n\nfunction mapEnvLiteral(_env: Dynamic) = (it) -> (it) {\n  for (k, v in _env) {\n    new {\n      name = k\n      value = v\n    }\n  }\n  for (k, v in _env) {\n    new {\n      name = k + \" 2\"\n      value = v + \" 2\"\n    }\n  }\n}\n\nfunction addElements(keys: List<String>): Mixin<Mapping<String, String>> = new {\n  for (key in keys) {\n    [key] = key\n  }\n}\n\nres = new Mapping<String, String> {\n  [\"base\"] = \"alreadyThere\"\n} |> addElements(List(\"newElement\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorLexicalScope.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"accessing for-bound variable from a lambda in a nested for\"] {\n    new {\n      for (l1 in List(\"a\", \"b\")) {\n        for (l2 in List(\"a\", \"d\").filter((i) -> i == l1)) {\n          l1 + l2\n        }\n      }\n    }\n  }\n  [\"accessing for-bound variable from a lambda in a nested when\"] {\n    new {\n      for (l1 in List(\"a\", \"b\")) {\n        when (!List(\"a\", \"d\").filter((i) -> i == l1).isEmpty) {\n          l1\n        }\n      }\n    }\n  }\n  [\"accessing for-bound variable from an expression inside a nested for\"] {\n    new {\n      for (_n in List(1, 2, 3)) {\n        for (x in new App { n = _n }.list) {\n          x\n        }\n      }\n    }\n  }\n}\n\nlocal class App {\n  n: Int\n  list = List(n, n, n)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorNestedReference.pkl",
    "content": "class Aviary {\n  birds: Listing<Bird>\n}\n\nclass Bird {\n  age: Int\n}\n\nfunction Bird(_age: Int) = new Bird { age = _age }\n\nres1 {\n  for (i in IntSeq(1, 1)) {\n    for (j in \n      new Aviary {\n        birds {\n          Bird(i)\n        }\n      }.birds\n    ) {\n      j\n    }\n  }\n}\n\nres2 {\n  for (i in IntSeq(1, 1)) {\n    ...new Aviary {\n      birds {\n        Bird(i)\n      }\n    }.birds\n  }\n}\n\nres3 {\n  for (key, _ in Map(\"hello-there\", 5)) {\n    ...myself(new Listing {\n      new Listing {\n        key\n      }\n    })\n  }\n}\n\nres4 {\n  for (key, _ in Map(\"hello-there\", 5)) {\n    ...myself2.apply(new Listing {\n      new Listing {\n        key\n      }\n    })\n  }\n}\n\nfunction myself(l: Listing<Listing<String>>) = l\n\nlocal myself2 = (l: Listing<Listing<String>>) -> l\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorNestedReference2.pkl",
    "content": "// https://github.com/apple/pkl/issues/741\n\nbar = new {}\n\nres1 {\n  for (i in List(1)) {\n    ...(bar) {\n      baz {\n        new { i }\n      }\n    }.baz\n  }\n}\n\nres2 {\n  for (i in List(1)) {\n    for (elem in (bar) {\n      baz {\n        new { i }\n      }\n    }.baz) {\n      elem\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/forGeneratorVariableShadowing.pkl",
    "content": "examples {\n  local a = List(\"1\", \"2\", \"3\", \"4\")\n  local b = List(\"a\", \"b\", \"c\", \"d\")\n  \n  [\"shadow key variable\"] {\n    new {\n      for (key, outerValue in a) {\n        for (key, innerValue in b) {\n          List(outerValue, key, innerValue)\n        }\n      }\n    }\n  }\n  [\"shadow value variable\"] {\n    new {\n      for (outerKey, value in a) {\n        for (innerKey, value in b) {\n          List(outerKey, value, innerKey)\n        }\n      }\n    }\n  }\n  [\"sibling for-generators can use same variable names\"] {\n    new {\n      for (key, value in a) {\n        List(key,  value)\n      }\n      for (key, value in b) {\n        List(key, value)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/generatorNoMembers.pkl",
    "content": "// should only result in one trace in the output; generator object literals that don't add any\n// members should be optimized away.\nres1 {\n  prop = trace(\"hello\")\n}\n\nres2 = (res1) {\n  when (false) {\n    prop2 = 2\n  }\n}\n\nres3 = (res1) {\n  for (_ in List()) {\n    \"hello\"\n  }\n}\n\nres4 = (res1) {\n  ...List()\n}\n\nres5 = (res1) {\n  when (true) {\n  } else {\n    prop3 = 3\n  }\n}\n\nres6 = (Dynamic) {\n  when (true) {}\n}\n\nres7 = (Mapping) {\n  when (true) {}\n}\n\nclass Person {}\n\nres8 = (Person) {\n  when (true) {}\n}\n\nres9 = (Listing) {\n  when (true) {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/predicateMembersDynamicListing.pkl",
    "content": "import \"pkl:test\"\n\nhidden people = new {\n  new { name = \"Pigeon\"; age = 42 }\n  new { name = \"Barn Owl\"; age = 21 }\n  new { name = \"Parrot\"; age = 33 }\n}\n\nres1 = (people) {\n  [[name == \"Barn Owl\"]] {\n    age = 99\n  }\n}\n\nres2 = (people) {\n  [[name.contains(\"w\") || name.contains(\"e\")]] {\n    age = 99\n  }\n}\n\nres3 = (people) {\n  [[true]] {\n    age = 99\n  }\n}\n\nres4 = (people) {\n  [[false]] {\n    age = 99\n  }\n}\n\nres5 = new {\n  barnOwl = \"Barn Owl\"\n  new {\n    result = (people) {\n      [[name == barnOwl]] {\n        age = 99\n      }\n    }\n  }\n}\n\n// nested predicate\nres6 = (people) {\n  [[(people) { [[name == \"Barn Owl\"]] { age = 99 } }.toList().find((it) -> it.age == 99).name == name]] {\n    age = 55\n  }\n}\n\n// member defined in same block is not affected\nres7 = (people) {\n  new { name = \"Albatross\"; age = 4 }\n  [[name == \"Albatross\"]] { age = 9 }\n}\n\nres8 = (people) {\n  [[name == \"Albatross\"]] { age = 9 }\n  new { name = \"Albatross\"; age = 4 }\n}\n\n// conflicting override\nres9 = test.catch(() -> (people) {\n  [0] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\nres10 = test.catch(() -> (people) {\n  [[name.startsWith(\"P\")]] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\n// combined with for\nres11 = (people) {\n  for (_name in List(\"Pigeon\", \"Parrot\")) {\n    [[name == _name]] { age = 99 }\n  }\n}\n\n// combined with when\nres12 = (people) {\n  when (10.isOdd) {\n    [[name == \"Pigeon\"]] { age = 99 }\n  }\n\n  when (10.isEven) {\n    [[name == \"Pigeon\"]] { age = 122 }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/predicateMembersDynamicMapping.pkl",
    "content": "import \"pkl:test\"\n\nhidden people = new Dynamic {\n  [\"Pigeon\"] { name = \"Pigeon\"; age = 42 }\n  [\"Barn Owl\"] { name = \"Barn Owl\"; age = 21 }\n  [\"Parrot\"] { name = \"Parrot\"; age = 33 }\n}\n\nres1 = (people) {\n  [[name == \"Barn Owl\"]] {\n    age = 99\n  }\n}\n\nres2 = (people) {\n  [[name.contains(\"w\") || name.contains(\"e\")]] {\n    age = 99\n  }\n}\n\nres3 = (people) {\n  [[true]] {\n    age = 99\n  }\n}\n\nres4 = (people) {\n  [[false]] {\n    age = 99\n  }\n}\n\nres5 = new {\n  barnOwl = \"Barn Owl\"\n  new {\n    result = (people) {\n      [[name == barnOwl]] {\n        age = 99\n      }\n    }\n  }\n}\n\n// nested predicate\nres6 = (people) {\n  [[(people) { [[name == \"Barn Owl\"]] { age = 99 } }.toMap().values.find((it) -> it.age == 99).name == name]] {\n    age = 55\n  }\n}\n\n// member defined in same block is not affected\nres7 = (people) {\n  [\"Albatross\"] = new { name = \"Albatross\"; age = 4 }\n  [[name == \"Albatross\"]] { age = 9 }\n}\n\nres8 = (people) {\n  [[name == \"Albatross\"]] { age = 9 }\n  [\"Albatross\"] = new { name = \"Albatross\"; age = 4 }\n}\n\n// conflicting override\nres9 = test.catch(() -> (people) {\n  [\"Pigeon\"] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\nres10 = test.catch(() -> (people) {\n  [[name.startsWith(\"P\")]] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\n// combined with for\nres11 = (people) {\n  for (_name in List(\"Pigeon\", \"Parrot\")) {\n    [[name == _name]] { age = 99 }\n  }\n}\n\n// combined with when\nres12 = (people) {\n  when (10.isOdd) {\n    [[name == \"Pigeon\"]] { age = 99 }\n  }\n  when (10.isEven) {\n    [[name == \"Pigeon\"]] { age = 122 }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/predicateMembersListing.pkl",
    "content": "import \"pkl:test\"\n\nhidden people = new Listing {\n  new { name = \"Pigeon\"; age = 42 }\n  new { name = \"Barn Owl\"; age = 21 }\n  new { name = \"Parrot\"; age = 33 }\n}\n\nres1 = (people) {\n  [[name == \"Barn Owl\"]] {\n    age = 99\n  }\n}\n\nres2 = (people) {\n  [[name.contains(\"w\") || name.contains(\"e\")]] {\n    age = 99\n  }\n}\n\nres3 = (people) {\n  [[true]] {\n    age = 99\n  }\n}\n\nres4 = (people) {\n  [[false]] {\n    age = 99\n  }\n}\n\nres5 = new {\n  barnOwl = \"Barn Owl\"\n  new {\n    result = (people) {\n      [[name == barnOwl]] {\n        age = 99\n      }\n    }\n  }\n}\n\n// nested predicate\nres6 = (people) {\n  [[(people) { [[name == \"Barn Owl\"]] { age = 99 } }.toList().find((it) -> it.age == 99).name == name]] {\n    age = 55\n  }\n}\n\n// member defined in same block is not affected\nres7 = (people) {\n  new { name = \"Albatross\"; age = 4 }\n  [[name == \"Albatross\"]] { age = 9 }\n}\n\nres8 = (people) {\n  [[name == \"Albatross\"]] { age = 9 }\n  new { name = \"Albatross\"; age = 4 }\n}\n\n// conflicting override\nres9 = test.catch(() -> (people) {\n  [0] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\nres10 = test.catch(() -> (people) {\n  [[name.startsWith(\"P\")]] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\n// combined with for\nres11 = (people) {\n  for (_name in List(\"Pigeon\", \"Parrot\")) {\n    [[name == _name]] { age = 99 }\n  }\n}\n\n// combined with when\nres12 = (people) {\n  when (10.isOdd) {\n    [[name == \"Pigeon\"]] { age = 99 }\n  }\n  when (10.isEven) {\n    [[name == \"Pigeon\"]] { age = 122 }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/predicateMembersMapping.pkl",
    "content": "import \"pkl:test\"\n\nhidden people = new Mapping {\n  [\"Pigeon\"] { name = \"Pigeon\"; age = 42 }\n  [\"Barn Owl\"] { name = \"Barn Owl\"; age = 21 }\n  [\"Parrot\"] { name = \"Parrot\"; age = 33 }\n}\n\nres1 = (people) {\n  [[name == \"Barn Owl\"]] {\n    age = 99\n  }\n}\n\nres2 = (people) {\n  [[name.contains(\"w\") || name.contains(\"e\")]] {\n    age = 99\n  }\n}\n\nres3 = (people) {\n  [[true]] {\n    age = 99\n  }\n}\n\nres4 = (people) {\n  [[false]] {\n    age = 99\n  }\n}\n\nres5 = new {\n  barnOwl = \"Barn Owl\"\n  new {\n    result = (people) {\n      [[name == barnOwl]] {\n        age = 99\n      }\n    }\n  }\n}\n\n// nested predicate\nres6 = (people) {\n  [[(people) { [[name == \"Barn Owl\"]] { age = 99 } }.toMap().values.find((it) -> it.age == 99).name == name]] {\n    age = 55\n  }\n}\n\n// member defined in same block is not affected\nres7 = (people) {\n  [\"Albatross\"] = new { name = \"Albatross\"; age = 4 }\n  [[name == \"Albatross\"]] { age = 9 }\n}\n\nres8 = (people) {\n  [[name == \"Albatross\"]] { age = 9 }\n  [\"Albatross\"] = new { name = \"Albatross\"; age = 4 }\n}\n\n// conflicting override\nres9 = test.catch(() -> (people) {\n  [\"Pigeon\"] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\nres10 = test.catch(() -> (people) {\n  [[name.startsWith(\"P\")]] { age = 4 }\n  [[name == \"Pigeon\"]] { age = 9 }\n})\n\n// combined with for\nres11 = (people) {\n  for (_name in List(\"Pigeon\", \"Parrot\")) {\n    [[name == _name]] { age = 99 }\n  }\n}\n\n// combined with when\nres12 = (people) {\n  when (10.isOdd) {\n    [[name == \"Pigeon\"]] { age = 99 }\n  }\n\n  when (10.isEven) {\n    [[name == \"Pigeon\"]] { age = 122 }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/predicateMembersThis.pkl",
    "content": "hidden pigeon = new { name = \"Pigeon\" }\nhidden barnOwl = new { name = \"Barn Owl\" }\nhidden people = new {\n  pigeon\n  barnOwl\n}\n\nres1 = (people) {\n  [[this == pigeon && (() -> this).apply() == pigeon && (let (x = this) x) == pigeon]] = 99\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/propertyGenerators.pkl",
    "content": "\nres1 {\n  x = \"x\"\n  when (1 + 1 == 2) { foo = \"foo\" }\n  when (1 + 1 == 3) { bar = \"bar\" }\n  y = \"y\"\n}\n\nclass Person {\n  name: String = \"Name\"\n  age: Int = 21\n}\n\nres2 = new Person {\n  when (1 + 1 == 2) { name = \"Pigeon\" }\n  when (1 + 1 == 3) { age = 42 }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/spreadSyntaxDynamic.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nlocal listing: Listing = new { 1; 2; 3 }\nlocal mapping: Mapping = new { [\"a\"] = 1; [\"b\"] = 2 }\nlocal dynamic: Dynamic = new {\n  1\n  2\n  3\n  [\"foo\"] = 0\n  [\"bar\"] = 1\n  foo = \"foo\"\n  bar = \"bar\"\n}\nlocal list: List<Int> = List(1, 2, 3)\nlocal map: Map<String, Int> = Map(\"zz\", 1, \"yy\", 2)\nlocal intseq: IntSeq = IntSeq(0, 5).step(2)\nlocal set: Set<Int> = Set(10, 20, 30)\nlocal bytes: Bytes = Bytes(1, 2, 3, 4)\n\nexamples {\n  [\"inferred Dynamic parent\"] {\n    new {\n      ...listing\n    }\n    new {\n      ...mapping\n      ...listing\n      ...dynamic\n      ...list\n      ...map\n      ...intseq\n      ...set\n      ...bytes\n    }\n  }\n  [\"explicit Dynamic type\"] {\n    new Dynamic {\n      ...listing\n    }\n    new Dynamic {\n      ...mapping\n      ...listing\n      ...dynamic\n      ...list\n      ...map\n      ...intseq\n      ...set\n      ...bytes\n    }\n  }\n  [\"legacy syntax\"] {\n    (Dynamic) { ...dynamic }\n    (Dynamic) { ...listing }\n    (Dynamic) { ...list }\n    (Dynamic) { ...map }\n    (Dynamic) { ...intseq }\n    (Dynamic) { ...set }\n    (Dynamic) { ...bytes }\n  }\n}\n\nfacts {\n  [\"length\"] {\n    new Dynamic {\n      ...mapping\n      ...listing\n      ...dynamic\n      ...list\n      ...map\n      ...intseq\n      ...set\n    }.length() == 15\n  }\n  [\"equality\"] {\n    new Dynamic { ...dynamic } == dynamic\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/spreadSyntaxListing.pkl",
    "content": "import \"pkl:test\"\n\nlocal listing: Listing = new { 1; 2; 3 }\nlocal mapping: Mapping = new { [\"a\"] = 1; [\"b\"] = 2 }\nlocal list: List<Int> = List(1, 2, 3)\nlocal map: Map<String, Int> = Map(\"a\", 1, \"b\", 2)\nlocal intseq: IntSeq = IntSeq(0, 5).step(2)\nlocal set: Set<Int> = Set(10, 20, 30)\nlocal bytes: Bytes = Bytes(1, 2, 3, 4)\n\nres1: Listing = new {\n  0\n  ...listing\n  4\n  5\n  6\n}\n\nres2 = res1.length == 7\n\nres3: Listing = (res1) {\n  ...listing\n}\n\nres4: Listing = (listing) {\n  for (_, _ in listing) {\n    ...listing\n  }\n}\n\nres5 = test.catch(() -> new Listing { ...d1 })\n\nlocal class Listings {\n  res1: Listing<String>\n}\n\n// spreading ints into a `Listing<String>` is an error\nres6 = test.catch(() -> new Listings { res1 { ...listing } }.res1[0])\n\nres7 = test.catch(() -> new Listing { ...mapping })\n\nlocal nested = new Listing {\n  new Listing { 1; 2; 3 }\n  new Listing { 4; 5; 6 }\n}\n\nres8: Listing = new {\n  for (elem in nested) { ...elem }\n}\n\nres9: Listing = new { ...listing; ...listing; ...listing }\n\nres10: Listing = new { ...listing; ...listing; ...listing; 10; 11; ...listing }\n\nres11: Listing = new { ...intseq }\n\nres12: Listing = new { ...list }\n\nres13 = test.catch(() -> new Listing { ...map })\n\nres14: Listing = new { ...set }\n\nres15 = new Listing {\n  ...listing\n}\n\nres16 = new Listing {\n  0\n  ...listing\n  0\n  0\n  0\n}\n\nres17 = res16.length\n\nres18 = new Listing {\n  ...bytes\n}\n\nres19 = new Listing {\n  0\n  ...bytes\n  0\n  0\n  0\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/spreadSyntaxMapping.pkl",
    "content": "import \"pkl:test\"\n\nlocal listing: Listing = new { 1; 2; 3 }\nlocal mapping: Mapping = new { [\"a\"] = 1; [\"b\"] = 2 }\nlocal dynamic: Dynamic = new {\n  1\n  2\n  3\n  [\"foo\"] = 0\n  [\"bar\"] = 1\n  foo = \"foo\"\n  bar = \"bar\"\n}\nlocal list: List<Int> = List(1, 2, 3)\nlocal map: Map<String, Int> = Map(\"a\", 1, \"b\", 2)\nlocal intseq: IntSeq = IntSeq(0, 5).step(2)\nlocal set: Set<Int> = Set(10, 20, 30)\nlocal bytes: Bytes = Bytes(1, 2, 3, 4)\n\nclass Foo {\n  names: Listing<String>\n}\n\nfunction makeFoos(names: List<String>) =\n  names.toMap((name) -> name, (name) -> new Foo {\n    names {\n      \"original-\\(name)\"\n    }\n  }).toMapping()\n\nres1: Mapping = new {\n  ...mapping\n}\n\nres2: Mapping<String, Int> = new {\n  ...mapping\n}\n\nres3: Mapping = new {\n  ...mapping\n  [\"c\"] = 1\n  [\"d\"] = 2\n}\n\nres4 = test.catch(() -> new Mapping {\n  ...mapping\n  ...mapping\n})\n\nres5 = test.catch(() -> new Mapping {\n  ...mapping\n  [\"a\"] = 4\n})\n\nres6: Mapping = new {\n  ...map\n}\n\nclass MyMappings {\n  mapping1: Mapping<Boolean, Boolean>\n}\n\nres7 = test.catch(() -> new MyMappings {\n  mapping1 {\n    ...mapping\n  }\n}.mapping1)\n\nres8 = test.catch(() -> new Mapping { ...listing })\nres9 = test.catch(() -> new Mapping { ...dynamic })\nres10 = test.catch(() -> new Mapping { ...list })\nres11 = test.catch(() -> new Mapping { ...set })\nres12 = test.catch(() -> new Mapping { ...intseq })\n\nres13: Mapping = new {\n  ...mapping\n  [\"child\"] = new Mapping {\n    ...mapping\n    [\"child\"] = new Mapping {\n      ...mapping\n    }\n  }\n}\n\nres14 = new Mapping {\n  ...mapping\n}\n\nres15 = new Mapping {\n  ...mapping\n  [\"c\"] = 1\n  [\"d\"] = 2\n}\n\n\nres16 = test.catch(() -> new Mapping {\n  ...mapping\n  [\"a\"] = 4\n})\n\nlocal foos = (makeFoos(List(\"bar\"))) {\n  [\"bar\"] {\n    names {\n      \"new one\"\n    }\n  }\n}\n\nres17 = new Mapping {\n  ...foos\n}\n\nres18 = test.catch(() -> new Mapping { ...bytes })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/spreadSyntaxNoSpace.pkl",
    "content": "foo {\n  1 2 3...IntSeq(4, 10)...IntSeq(11, 20)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/spreadSyntaxNullable.pkl",
    "content": "a = null\nb { ...?a }\n\nc { 1; 2; 3 }\nd { ...?c }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/generators/spreadSyntaxTyped.pkl",
    "content": "class Person {\n  name: String\n}\n\nlocal barnOwlDynamic { name = \"Barn Owl\" }\n\nres1: Person = new { ...barnOwlDynamic }\n\nres2 = res1 == new Person { name = \"Barn Owl\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/implementation/equality.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal function equals(left, right) = left == right\n\nfacts {\n  [\"mix EqualsNode specializations (VmValue first)\"] {\n    equals(42.s, 42.s)\n    !equals(42.s, 43.s)\n    equals(42.mb, 42.mb)\n    !equals(42.mb, 43.mb)\n    equals(new Dynamic { name = \"Pigeon\" }, new Dynamic { name = \"Pigeon\" })\n    !equals(new Dynamic { name = \"Pigeon\" }, new Dynamic { name = \"Parrot\" })\n    equals(\"Pigeon\", \"Pigeon\")\n    !equals(\"Pigeon\", \"Parrot\")\n    equals(42, 42)\n    !equals(42, 43)\n    equals(1.23, 1.23)\n    !equals(1.23, 1.24)\n    equals(true, true)\n    !equals(true, false)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/implementation/inequality.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal function notEquals(left, right) = left != right\n\nfacts {\n  [\"mix EqualsNode specializations (VmValue first)\"] {\n    !notEquals(42.s, 42.s)\n    notEquals(42.s, 43.s)\n    !notEquals(42.mb, 42.mb)\n    notEquals(42.mb, 43.mb)\n    !notEquals(new Dynamic { name = \"Pigeon\" }, new Dynamic { name = \"Pigeon\" })\n    notEquals(new Dynamic { name = \"Pigeon\" }, new Dynamic { name = \"Parrot\" })\n    !notEquals(\"Pigeon\", \"Pigeon\")\n    notEquals(\"Pigeon\", \"Parrot\")\n    !notEquals(42, 42)\n    notEquals(42, 43)\n    !notEquals(1.23, 1.23)\n    notEquals(1.23, 1.24)\n    !notEquals(true, true)\n    notEquals(true, false)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/internal/polymorphicCallSite.pkl",
    "content": "hidden foo {\n  x = List(1, 2)\n  // polymorphic stdlib property call\n  y = x.isEmpty\n}\n\nhidden bar = (foo) {\n  x = Set(1, 2)\n}\n\nres1 = foo.y\nres2 = bar.y\n\n// polymorphic stdlib method call\nfunction f(x) = x.toSet()\n\nres3 = f(List(1, 2))\nres4 = f(Set(1, 2))\n\nabstract class Animal {\n  abstract size: String\n  abstract function walk(): String\n}\n\nclass Cat extends Animal {\n  size = \"cat size\"\n  function walk() = \"cat walks\"\n}\n\nclass Dog extends Animal {\n  size = \"dog size\"\n  function walk() = \"dog walks\"\n}\n\nclass Bird extends Animal {\n  size = \"bird size\"\n  function walk() = \"bird walks\"\n}\n\nclass Lion extends Animal {\n  size = \"lion size\"\n  function walk() = \"lion walks\"\n}\n\nclass Turtle extends Animal {\n  size = \"turtle size\"\n  function walk() = \"turtle walks\"\n}\n\n// polymorphic user-defined property call\nfunction size(animal) = animal.size\n\n// polymorphic user-defined method call\nfunction walk(animal: Animal) = animal.walk()\n\nres5 = size(new Cat {})\nres6 = size(new Dog {})\nres7 = size(new Bird {})\nres8 = size(new Lion {})\nres9 = size(new Turtle {})\n\nres10 = walk(new Cat {})\nres11 = walk(new Dog {})\nres12 = walk(new Bird {})\nres13 = walk(new Lion {})\nres14 = walk(new Turtle {})\n\nopen class Foo {\n  function speak() = \"hi\"\n  one {\n    two {\n      // polymorphic enclosing method call\n      three = speak()\n    }\n  }\n}\n\nclass Bar extends Foo {\n  function speak() = \"bye\"\n}\n\nres15 = new Foo {}.one.two.three\nres16 = new Bar {}.one.two.three\n\nopen class Foo2 {\n  function speak() = \"hi\"\n  // polymorphic implicit this method call\n  x: String = speak()\n}\n\nclass Bar2 extends Foo2 {\n  function speak() = \"bye\"\n}\n\nres17 = new Foo2 {}.x\nres18 = new Bar2 {}.x\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaDef.pkl",
    "content": "class X {\n  hidden fun0 = () -> new Dynamic { zero = 0 }\n  res0 = fun0.apply()\n\n  hidden fun1 = (a) -> new Dynamic { one = a }\n  res1 = fun1.apply(1)\n\n  hidden fun2 = (a, b) -> new Dynamic { one = a; two = b }\n  res2 = fun2.apply(1, 2)\n\n  hidden fun3 = (a, b, c) -> new Dynamic { one = a; two = b; three = c }\n  res3 = fun3.apply(1, 2, 3)\n\n  hidden fun4 = (a, b, c, d) -> new Dynamic { one = a; two = b; three = c; four = d }\n  res4 = fun4.apply(1, 2, 3, 4)\n\n  hidden fun5 = (a, b, c, d, e) -> new Dynamic { one = a; two = b; three = c; four = d; five = e }\n  res5 = fun5.apply(1, 2, 3, 4, 5)\n}\n\nx = new X {\n  fun0 {\n    amended = \"amended\"\n  }\n  fun1 {\n    amended = \"amended\"\n  }\n  fun2 {\n    amended = \"amended\"\n  }\n  fun3 {\n    amended = \"amended\"\n  }\n  fun4 {\n    amended = \"amended\"\n  }\n  fun5 {\n    amended = \"amended\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaExpr.pkl",
    "content": "hidden fun0 = () -> new Dynamic { zero = 0 }\nhidden amend0 = (fun0) {\n  amended = \"amended\"\n}\nres0 = amend0.apply()\n\nhidden fun1 = (a) -> new Dynamic { one = a }\nhidden amend1 = (fun1) {\n  amended = \"amended\"\n}\nres1 = amend1.apply(1)\n\nhidden fun2 = (a, b) -> new Dynamic { one = a; two = b }\nhidden amend2 = (fun2) {\n  amended = \"amended\"\n}\nres2 = amend2.apply(1, 2)\n\nhidden fun3 = (a, b, c) -> new Dynamic { one = a; two = b; three = c }\nhidden amend3 = (fun3) {\n  amended = \"amended\"\n}\nres3 = amend3.apply(1, 2, 3)\n\nhidden fun4 = (a, b, c, d) -> new Dynamic { one = a; two = b; three = c; four = d }\nhidden amend4 = (fun4) {\n  amended = \"amended\"\n}\nres4 = amend4.apply(1, 2, 3, 4)\n\nhidden fun5 = (a, b, c, d, e) -> new Dynamic { one = a; two = b; three = c; four = d; five = e }\nhidden amend5 = (fun5) {\n  amended = \"amended\"\n}\nres5 = amend5.apply(1, 2, 3, 4, 5)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaExternalClassError.pkl",
    "content": "hidden ab = (a, b) -> List(42)\nhidden amendAb = (ab) { amended = \"amended\" }\nres1 = amendAb.apply(1, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaParameters.pkl",
    "content": "example1 {\n  local f = (x) -> new Dynamic {}\n  result = (f) { x -> prop = x + 1 }.apply(1)\n}\n\nexample2 {\n  local f = (x, y) -> new Dynamic {}\n  result = (f) { a, b -> prop = a + b }.apply(1, 2)\n}\n\nexample3 {\n  local f = (x, y) -> (z) -> new Dynamic { prop3 = z }\n  result = (f) { a, b -> prop1 = a; prop2 = b }.apply(1, 2).apply(3)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaParametersTyped.pkl",
    "content": "import \"pkl:test\"\n\nexample1 {\n  local f = (x) -> new Dynamic {}\n  result = (f) { x: Int -> prop = x + 1 }.apply(1)\n}\n\nexample2 {\n  local f = (x, y) -> new Dynamic {}\n  result = (f) { a, b: Number -> prop = a + b }.apply(1, 2)\n}\n\nexample3 {\n  local f = (x, y) -> new Dynamic {}\n  result = test.catch(() -> (f) { a, b: Number(this > 3) -> prop = a + b }.apply(1, 2))\n}\n\nexample4 {\n  local f = (x, y) -> (z) -> new Dynamic { prop3 = z }\n  result = test.catch(() -> (f) { a: String, b -> prop1 = a; prop2 = b }.apply(1, 2).apply(3))\n}\n\nclass Foo\nclass Bar\nclass Baz\n\nexample5 {\n  local f = (x, y, z) -> new Dynamic { prop3 = z }\n  result = (f) { a: Foo, b: Bar, c: Baz -> prop1 = a; prop2 = b }.apply(new Foo {}, new Bar {}, new Baz {})\n}\n\nexample6 {\n  local f = (x, y, z) -> new Dynamic { prop3 = z }\n  result = test.catch(() -> (f) { a: Baz, b: Bar, c: Foo -> prop1 = a; prop2 = b }.apply(new Foo {}, new Bar {}, new Baz {}))\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaThatReturnsAnotherLambda.pkl",
    "content": "example1 {\n  local f1 = () -> () -> () -> new Dynamic {}\n  local f2 = (f1) { name = \"Pigeon\" }\n  result = f2.apply().apply().apply()\n}\n\nexample2 {\n  local default1 = new Dynamic { name = \"Pigeon\" }\n  local default2 = (name) -> (default1) { name2 = name }\n  local default3 = (name) -> (default2) { name3 = name }\n  local default4 = (name) -> (default3) { name4 = name }\n  result = default4.apply(\"Pigeon4\").apply(\"Pigeon3\").apply(\"Pigeon2\")\n}\n\nexample3 {\n  local f1 = () -> new Dynamic { f1Args = List() }\n  local f2 = (arg1) -> (f1) { f2Args = List(arg1) }\n  local f3 = (arg1, arg2) -> (f2) { f3Args = List(arg1, arg2) }\n  result1 = f3.apply(\"f3Arg1\", \"f3Arg2\").apply(\"f2Arg1\").apply()\n  result2 = f3.apply(42, 5.gb).apply(3.min).apply()\n  result3 = f3.apply(new Dynamic { x = 42 }, new Dynamic { y = 5.gb }).apply(new Dynamic { z = 3.min }).apply()\n}\n\nexample4 {\n  local f1 = (arg1, arg2) -> new Dynamic { f1Args = List(arg1, arg2) }\n  local f2 = (arg1) -> (f1) { f2Args = List(arg1) }\n  local f3 = () -> (f2) { f3Args = List() }\n  result = f3.apply().apply(\"f2Arg1\").apply(\"f1Arg1\", \"f1Arg2\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaTooFewArgsError.pkl",
    "content": "hidden abc = (a, b, c) -> new Dynamic { one = a; two = b; three = c }\nhidden amendAbc = (abc) { amended = \"amended\" }\nres1 = amendAbc.apply(1, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/amendLambdaTooManyArgsError.pkl",
    "content": "hidden abc = (a, b, c) -> new Dynamic { one = a; two = b; three = c }\nhidden amendAbc = (abc) { amended = \"amended\" }\nres1 = amendAbc.apply(1, 2, 3, 4)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/equality.pkl",
    "content": "res1 = (() -> 1) == (() -> 1)\nres2 = (() -> 1) == (() -> 2)\nres3 = (() -> 1) == ((x) -> 1)\n\nlocal lambda = () -> 1\n\nres4 = lambda == lambda"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/inequality.pkl",
    "content": "res1 = (() -> 1) != (() -> 1)\nres2 = (() -> 1) != (() -> 2)\nres3 = (() -> 1) != ((x) -> 1)\n\nlocal lambda = () -> 1\n\nres4 = lambda != lambda"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambda1.pkl",
    "content": "local constant = () -> \"abc\"\n\nres1 = constant.apply()\n\nlocal even = (x) -> x % 2 == 0\n\nres2 = even.apply(10)\nres3 = even.apply(11)\n\nlocal mult = (x, y) -> x * y\n\nres4 = mult.apply(2, 3)\n\nres5 = even.toString()\nres6 = mult.toString()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambda2.pkl",
    "content": "x = 2\n\nlocal addX = (y) -> y + x\n\nres1 = addX.apply(3)\n\nlocal a {\n  b = 2\n  c {\n    mulB = (x) -> x * b\n  }\n}\n\nres2 = a.c.mulB.apply(3)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambda3.pkl",
    "content": "x = 4\nfunction double(n) = n * 2\npigeon {\n  name = \"Pigeon\"\n  age = 30\n}\nclass Multiplier {\n  function mult4(x) = x * 4\n  hidden mult = (x, y) -> x * y\n}\nmultiplier = new Multiplier {}\nl = List(1, 2, 3)\n\n// 1-arg lambda\nres1 = l.map((n) -> x * x)\nres2 = l.map((n) -> double(n))\nres3 = l.map((n) -> pigeon.age * n)\nres4 = l.map((n) -> multiplier.mult4(n))\nres5 = l.map((n) -> multiplier.mult.apply(n, 4))\n\n// 2-arg lambda\nres6 = l.fold(0, (m, n) -> m + n + x)\nres7 = l.fold(0, (m, n) -> double(m) + n)\nres8 = l.fold(0, (m, n) -> pigeon.age * n + m)\nres9 = l.fold(0, (m, n) -> multiplier.mult4(m) + n)\nres10 = l.fold(0, (m, n) -> multiplier.mult.apply(m, n))\n\n// 0-arg lambda\nfunction kick(fn) = fn.apply()\nres11 = kick(() -> x)\nres12 = kick(() -> double(4))\nres13 = kick(() -> pigeon.age)\nres14 = kick(() -> multiplier.mult4(4))\nres15 = kick(() -> multiplier.mult.apply(2, 3))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambda4.pkl",
    "content": "n = 999\nn2 = 999\n\nres1 = List(1, 2, 3).flatMap((n) ->\n  List(4, 5, 6).map((n2) -> n2 * n)\n)\n\nres2 = List(1, 2, 3).flatMap((n) ->\n  List(4, 5, 6).map((n) -> n * n)\n)\n\nres3 = List(1, 2, 3).flatMap((n) ->\n  List(4, 5, 6).map((n2) -> n2 * n) + List(4, 5, 6).map((n2) -> n2 * n)\n)\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambda5.pkl",
    "content": "res1 = (() -> 0).apply()\nres2 = ((a) -> a).apply(1)\nres3 = ((a, b) -> a + b).apply(1, 2)\nres4 = ((a, b, c) -> a + b + c).apply(1, 2, 3)\nres5 = ((a, b, c, d) -> a + b + c + d).apply(1, 2, 3, 4)\nres6 = ((a, b, c, d, e) -> a + b + c + d + e).apply(1, 2, 3, 4, 5)\n\nres7 = (() -> 0).applyToList(List())\nres8 = ((a) -> a).applyToList(List(1))\nres9 = ((a, b) -> a + b).applyToList(List(1, 2))\nres10 = ((a, b, c) -> a + b + c).applyToList(List(1, 2, 3))\nres11 = ((a, b, c, d) -> a + b + c + d).applyToList(List(1, 2, 3, 4))\nres12 = ((a, b, c, d, e) -> a + b + c + d + e).applyToList(List(1, 2, 3, 4, 5))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambdaStackTrace1.pkl",
    "content": "hidden f = (a, b) -> a + b\n\nres1 = f.apply(\"Pigeon\", 42)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambdaStackTrace2.pkl",
    "content": "hidden f1 = () -> (() -> (() -> throw(\"ouch\")).apply()).apply()\n\nres1 = f1.apply()"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/lambdaStackTrace3.pkl",
    "content": "hidden fs = List(() -> 42, () -> throw(\"ouch\"))\n\nres1 = fs[1].apply()"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/pipeOperator.pkl",
    "content": "import \"pkl:test\"\n\nlocal add1 = (x) -> x + 1\nlocal mul2 = (x) -> x * 2\nlocal higher1 = (x) -> (y) -> (y |> x) + 1\n\nres1 = 42 |> add1\nres2 = 42 |> add1 |> add1\nres3 = 42 |> add1 |> mul2\n\nres4 = -1.abs |> add1\nres5 = 1 + 2 + 3 |> add1\nres6 = 42 ?? 21 |> add1\nres7 = 21 |> add1 ?? 42\n\nres8 = 42.abs |> higher1.apply(add1)\nres9 = 42.abs |> (add1 |> higher1)\n\nclass Person {}\n\nres10 = test.catch(() -> 42 |> 21)\nres11 = test.catch(() -> 42 |> new Person {})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/tooManyLambdaParams.pkl",
    "content": "f = (a1, a2, a3, a4, a5, a6) -> a1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/typedLambdas.pkl",
    "content": "import \"pkl:test\"\n\nres1 = ((x: Int) -> x + 1).apply(42)\nres2 = test.catch(() -> ((x: Int) -> x + 1).apply(\"wrong type\"))\n\nres3 = ((x: Int(isPositive)) -> x + 1).apply(42)\nres4 = test.catch(() -> ((x: Int(isPositive)) -> x + 1).apply(-1))\n\nfoo {\n  n = 3\n  bar {\n    res5 = ((str: String(length > n)) -> str).apply(\"abcde\")\n    res6 = test.catch(() -> ((str: String(length > n)) -> str).apply(\"abc\"))\n  }\n}\n\nfoo2 = (foo) {\n  n = 4\n}\n\nhidden isNotEmpty = (coll: Collection) -> !coll.isEmpty\n\nres7 = ((x: List<String>(isNotEmpty), y: Set<String>(isNotEmpty)) -> x.toSet() == y).apply(List(\"a\", \"b\"), Set(\"b\", \"a\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/lambdas/wrongArgumentListLength.pkl",
    "content": "f = (a1, a2, a3) -> a1\nres = f.applyToList(List(1, 2, 3, 4, 5, 6))"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/cacheStealing.pkl",
    "content": "foo1: Listing<String> = new { \"hello\" }\nfoo2: Listing<String|Int> = foo1\n\nres1 = foo1.isDistinct\n// steals isDistinct from foo1's VmListing.cachedValues but must not\n// perform a String|Int type check because isDistinct is not an element\nres2 = foo2.isDistinct\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/cacheStealingTypeCheck.pkl",
    "content": "amends \"../../input-helper/listings/cacheStealingTypeCheck.pkl\"\n\n// this test covers a regression where the wrong receiver \n// and owner was used to typecheck a stolen value\nfoo {\n  \"abcdx\"\n  \"ax\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/default.pkl",
    "content": "class Person {\n  name: String\n  age: Int = 42\n}\n\nres1: Listing<Person> = new {\n  new {\n    name = \"Pigeon\"\n  }\n}\n\nres2 = (res1) {\n  default {\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n  }\n}\n\nres3 = (res2) {\n  default { n ->\n    age = n\n  }\n}\n\nres4 = (res3) {\n  (default.apply(5)) {\n    name = \"Barn Owl\"\n  }\n}\n\nres5 = (res4.getOrDefault(99)) {\n  name = \"Bald Eagle\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/equality.pkl",
    "content": "local x = new Listing {\n  \"one\"\n  \"two\"\n}\n\nres1 = x == x\nres2 = x == new Listing {\n  \"one\"\n  \"two\"\n}\nres3 = x == new Listing {\n  \"two\"\n}\nres4 = x == new Listing {\n  \"two\"\n  \"one\"\n}\nres5 = x == (x) {}\nres6 = x == (x) { \"one\" }\nres8 = x == (x) { default = 9 }\nres9 = (x) { default = 9 } == (x) { default = 10 }\nres10 = new Listing { \"one\" } == new Listing { \"one\"; default = 9 }\nres11 = new Listing { x; local x = \"one\" } == new Listing { \"one\" }\nres12 = new Listing { x; local x = \"one\"; local `_` = \"two\" } == new Listing { \"one\"; default = 9 }\nres13 = new Listing { x; local x = \"one\" } { y; local y = \"two\" } == new Listing { \"one\"; \"two\" }\n\nlocal class Bird { name: String }\n\nlocal l1: Listing<Bird> = new {\n  new { name = \"Pigeon\" }\n  new { name = \"Stork\" }\n}\n\nlocal l2: Listing<Bird|Int> = l1\n\nres14 = l1 == l2\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/hashCode.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class Bird {\n  name: String\n}\n\nfacts {\n  local set: Set<Int> = IntSeq(1, 100).fold(Set(), (res, n) -> res.add(n))\n  \n  [\"local members aren't included in hash code\"] {\n    local listing1 = new Listing { \"one\" }\n    local listing2 = new Listing { x; local x = \"one\" }\n    local listing3 = new Listing { x; local x = \"one\" } { [0] = y; local y = \"one\" }\n    \n    set.add(listing1).contains(listing2)\n    set.add(listing2).contains(listing3)\n    set.add(listing3).contains(listing2)\n    set.add(listing1).add(listing2).add(listing3).length == 101\n  }\n  \n  [\"hidden members aren't included in hash code\"] {\n    local listing1 = new Listing { \"one\" }\n    local listing2 = new Listing { \"one\"; default = (_) -> 42 }\n\n    set.add(listing1).contains(listing2)\n    set.add(listing2).contains(listing1)\n    set.add(listing1).add(listing2).length == 101\n  }\n}\n\nexamples {\n  [\"delegating listings compute correct hash codes\"] {\n    local l1: Listing<Bird> = new {\n      new { name = \"Pigeon\" }\n      new { name = \"Stork\" }\n    }\n\n    local l2: Listing<Bird|Int> = l1\n\n    // need to add 6 other elements here; `EconomicMap` will back shorter collections\n    // with an array and not compute hash code\n    List(1, 2, 3, 4, 5, 6, l2, l1).distinct\n  }\n\n  [\"delegating listings compute correct hash codes -- re-use hash-code\"] {\n    local l1: Listing<Bird> = new {\n      new { name = \"Pigeon\" }\n      new { name = \"Stork\" }\n    }\n\n    local l2: Listing<Bird|Int> = l1\n\n    // same as the other test but put `l1` first this time (execute code path where we re-use\n    // already computed hashcode)\n    List(1, 2, 3, 4, 5, 6, l1, l2).distinct\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/inequality.pkl",
    "content": "local x = new Listing {\n  \"one\"\n  \"two\"\n}\n\nres1 = x != x\nres2 = x != new Listing {\n  \"one\"\n  \"two\"\n}\nres3 = x != new Listing {\n  \"two\"\n}\nres4 = x != new Listing {\n  \"two\"\n  \"one\"\n}\nres5 = x != (x) {}\nres6 = x != (x) { \"one\" }\nres8 = x != (x) { default = 9 }\nres9 = (x) { default = 9 } != (x) { default = 10 }\nres10 = new Listing { \"one\" } != new Listing { \"one\"; default = 9 }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing1.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nfunction id(x) = x\n\nres1 = new Listing {}\n\nres2 = new Listing {\n  null\n  true\n  42\n  1.23\n  \"foo\"\n  Regex(\"bar\")\n  5.gb\n  3.min\n  Pair(1, 2)\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1, \"two\", 2)\n  new Dynamic { name = \"Pigeon\"; age = 42 }\n  new Person { name = \"Pigeon\"; age = 42 }\n  new Listing { 1; 2; 3 }\n  new Mapping { [\"one\"] = 1; [\"two\"] = 2 }\n}\n\nres3 = new Listing {\n  id(null)\n  id(true)\n  id(42)\n  id(1.23)\n  id(\"foo\")\n  id(Regex(\"bar\"))\n  id(5.gb)\n  id(3.min)\n  id(Pair(1, 2))\n  id(List(1, 2, 3))\n  id(Set(1, 2, 3))\n  id(Map(\"one\", 1, \"two\", 2))\n  id(new Dynamic { name = \"Pigeon\"; age = 42 })\n  id(new Person { name = \"Pigeon\"; age = 42 })\n  id(new Listing { 1; 2; 3 })\n  id(new Mapping { [\"one\"] = 1; [\"two\"] = 2 })\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing2.pkl",
    "content": "import \"pkl:test\"\n\nfunction id(x) = x\n\nlocal x = new Listing {\n  \"one\"\n  \"two\"\n  \"three\"\n}\n\nres1 = (x) {\n  [1] = \"updated two\"\n}\n\nres1a = (x) {\n  [id(1)] = id(\"updated two\")\n}\n\nres2 = (x) {\n  [0] = \"updated one\"\n  [1] = \"updated two\"\n  [2] = \"updated three\"\n}\n\nres2a = (x) {\n  [id(0)] = id(\"updated one\")\n  [1] = id(\"updated two\")\n  [id(2)] = \"updated three\"\n}\n\nres3 = (x) {\n  [2] = \"updated three\"\n  [0] = \"updated one\"\n  [1] = \"updated two\"\n}\n\nres3a = (x) {\n  [id(2)] = id(\"updated three\")\n  [0] = id(\"updated one\")\n  [id(1)] = \"updated two\"\n}\n\nres4 = (x) {\n  [0] = \"updated one\"\n  \"four\"\n  [1] = \"updated two\"\n  \"five\"\n  [2] = \"updated three\"\n  \"six\"\n}\n\nres4a = (x) {\n  [id(0)] = id(\"updated one\")\n  id(\"four\")\n  [1] = id(\"updated two\")\n  \"five\"\n  [id(2)] = \"updated three\"\n  id(\"six\")\n}\n\nres5 = test.catch(() -> (x) { [3] = \"four\" })\nres5a = test.catch(() -> (x) { [3] = id(\"four\") })\nres5b = test.catch(() -> (x) { [id(3)] = \"four\" })\nres5c = test.catch(() -> (x) { [id(3)] = id(\"four\") })\n\nres6 = test.catch(() -> (x) { \"four\"; [3] = \"updated four\" })\nres6a = test.catch(() -> (x) { id(\"four\"); [id(3)] = id(\"updated four\") })\n\nres7 = test.catch(() -> (x) { [-1] = \"value\" })\nres7a = test.catch(() -> (x) { [id(-1)] = id(\"value\") })\n\nres8 = test.catch(() -> (x) { [\"wrong type\"] = \"value\" })\nres8a = test.catch(() -> (x) { [id(\"wrong type\")] = id(\"value\") })\n\nres9 = test.catch(() -> new Listing { foo = \"bar\" })\nres10 = test.catch(() -> (x) { foo = \"foo\" })\nres11 = test.catch(() -> new Listing { \"one\"; foo = \"foo\" })\nres12 = test.catch(() -> (x) { \"four\"; foo = \"foo\" })\nres12a = test.catch(() -> (x) { id(\"four\"); foo = \"foo\" })\nres13 = test.catch(() -> (x) { [1] = \"updated two\"; foo = \"foo\" })\nres13a = test.catch(() -> (x) { [id(1)] = id(\"updated two\"); foo = \"foo\" })\nres14 = test.catch(() -> (x) { \"four\"; [1] = \"updated two\"; foo = \"foo\" })\nres14a = test.catch(() -> (x) { id(\"four\"); [id(1)] = id(\"updated two\"); foo = \"foo\" })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing3.pkl",
    "content": "// subscript, this, super, dynamic binding\n\nimport \"pkl:test\"\nimport \"pkl:math\"\n\nlocal x = new Listing {\n  \"one\"\n  \"two\"\n  \"th\" + \"ree\"\n}\n\nres1 = x[0]\nres2 = x[1]\nres3 = x[2]\nres4 = test.catch(() -> x[-1])\nres5 = test.catch(() -> x[3])\nres6 = test.catch(() -> x[math.minInt])\nres7 = test.catch(() -> x[math.maxInt])\n\nlocal y = new Listing {\n  new Listing {\n    \"one\"\n  }\n new Listing {\n    \"two\"\n    \"th\" + \"ree\"\n  }\n  new Mapping {\n    [\"four\"] = 4\n  }\n}\n\nres8 = y[0][0]\nres9 = y[1][0]\nres10 = y[1][1]\nres11 = y[2][\"four\"]\nres12 = test.catch(() -> y[3][0])\nres13 = test.catch(() -> y[1][2])\nres14 = test.catch(() -> y[2][\"other\"])\n\nres15 = new Listing {\n  \"one\"\n  this[0]\n  \"two\"\n  this[2]\n  this[1]\n}\n\nres16 = (res15) {\n  \"three\"\n  this[0]\n  this[5]\n}\n\nres17 = new Listing {\n  \"item\"\n  this[0] + \"2\"\n}\n\nres18 = (res17) {\n  [0] = \"element\"\n  this[0] + \"3\"\n}\n\nres19 = (res18) {\n  [0] = \"object\"\n  this[0] + \"4\"\n}\n\nres20 = (x) {\n  [0] = super[0] + \"2\"\n  [1] = super[0] + \"3\"\n  super[0] + \"4\"\n  this[0] + \"4\"\n}\n\nlocal err0 = new Listing {\n  \"foo\"\n  this[3]\n}\nres21 = test.catch(() -> err0[1])\n\n// currently, referencing a non-existing super element returns dynamic object\nres22 = new Listing {\n  super[0]\n  super[3]\n}\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing4.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nexamples {\n  [\"listings are lazy\"] {\n    // backed by ConstantEntriesLiteralNode\n    local listing = new Listing<String> {\n      \"foo\"\n      throw(\"uh oh\")\n    }\n    listing[0]\n    module.catch(() -> listing[1])\n  }\n  [\"listings are lazy with generator entries\"] {\n    local listing = new Listing<String> {\n      when (false) {\n        \"uh oh\"\n      }\n      \"foo\"\n      throw(\"uh oh\")\n    }\n    listing[0]\n  }\n  [\"nested listings are also lazy\"] {\n    local listing = new Listing<Listing<String>> {\n      new {\n        \"bar\"\n        throw(\"uh oh\")\n      }\n    }\n    listing[0][0]\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing5.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"equals\"] {\n    local l1 = new Listing<String(length.isOdd)> {}\n    local l2: Listing<String(this == capitalize())> = l1\n\n    l1 == l2\n  }\n}\n\nexamples {\n  [\"type check: new with explicit parent\"] {\n    local l = new Listing<String> {\n      1\n    }\n\n    module.catch(() -> l[0])\n  }\n\n  [\"type check: local new with inferred parent\"] {\n    local l: Listing<String> = new {\n      1\n    }\n\n    module.catch(() -> l[0])\n  }\n\n  [\"type check: local parameterized property type, unparameterized new with explicit parent\"] {\n    local m: Listing<String> = new Listing {\n      1\n    }\n    module.catch(() -> m[0])\n  }\n\n  [\"type check: local unparameterized property type, parameterized new with explicit parent\"] {\n    local m: Listing = new Listing<String> {\n      1\n    }\n    module.catch(() -> m[0])\n  }\n\n  [\"amending listings does not require type checks on amending object members\"] {\n    local m: Listing<String> = new {\n      \"hi\"\n    }\n    // ElementsLiteralNode\n    (m) {\n      1\n    }\n    // ElementsEntriesLiteralNode\n    (m) {\n      [0] = 1\n      2\n    }\n    // GeneratorObjectLiteralNode\n    (m) {\n      when (false) {\n        \"hi\"\n      }\n      1\n    }\n  }\n\n  [\"type check: constraints on both property type node and explicit parent type node are checked\"] {\n    local l: Listing<String(length.isOdd)> = new Listing<String(this == capitalize())> {\n      \"Ba\"\n      \"bar\"\n    }\n\n    module.catch(() -> l[0])\n    module.catch(() -> l[1])\n  }\n\n  [\"type check: nested listings: constraints on both parent type node and child type node are checked\"] {\n    local res12: Listing<Listing<String(length.isOdd)>> =\n      new Listing<Listing<String(this == capitalize())>> {\n        new {\n          \"Ba\"\n          \"bar\"\n        }\n      }\n\n    module.catch(() -> res12[0][0])\n    module.catch(() -> res12[0][1])\n  }\n\n  [\"type check: propagate from List\"] {\n    local l: List<Listing<String(length.isOdd)>> = List(\n      new Listing<String(this == capitalize())> {\n        \"Ba\"\n        \"bar\"\n      }\n    )\n    module.catch(() -> l[0][0])\n    module.catch(() -> l[0][1])\n  }\n\n  [\"type check: propagate function types\"] {\n    local l = new Listing<String(this == capitalize())> {\n      \"Ba\" // fails `length.isOdd`\n      \"bar\" // fails `this == capitalize()`\n    }\n    local l2 = new Listing {\n      \"Ba\" // fails `length.isOdd`\n      \"bar\" // fails `this == capitalize()`\n    }\n    // type check String(length.isOdd) should be propagated to the listing via a parameter type\n    // annotation\n    local function func1(listing: Listing<String(length.isOdd)>) = listing\n    // type check String(length.isOdd) should be propagated to the listing via a return type\n    // annotation\n    local function func2(listing): Listing<String(length.isOdd)> = listing\n    // type check String(length.isOdd) and String(this == capitalize()) should be propagated to the\n    // listing via both parameter type and return type annotations\n    local function func3(listing: Listing<String(length.isOdd)>): Listing<String(this == capitalize())> = listing\n\n    module.catch(() -> func1(l)[0])\n    module.catch(() -> func1(l)[1])\n    module.catch(() -> func2(l)[0])\n    module.catch(() -> func2(l)[1])\n    module.catch(() -> func3(l2)[0])\n    module.catch(() -> func3(l2)[1])\n  }\n\n  [\"type check: union type\"] {\n    local l: Listing<String(length.isOdd)>|Listing<String(length == 4)> =\n      new Listing<String(this == capitalize())> {\n        \"Ba\"   // fails length.isOdd and length == 4\n        \"bar\"  // fails this == capitalize()\n        \"Bazz\" // passes this == capitalize() and length == 4\n        \"Qux\"  // passes this == capitalize() and length.isOdd\n      }\n    module.catch(() -> l)\n  }\n\n  [\"type check: nullable type\"] {\n    local l: Listing<String(length.isOdd)>? =\n      new Listing<String(this == capitalize())> {\n        \"Ba\"   // fails length.isOdd\n        \"bar\"  // fails this == capitalize()\n      }\n    module.catch(() -> l!![0])\n    module.catch(() -> l!![1])\n  }\n\n  [\"type check: propagate lambda type\"] {\n    local func1 = (it: Listing<String(length.isOdd)>) -> it\n\n    local l = new Listing<String(this == capitalize())> {\n      \"Ba\" // fails `length.isOdd`\n      \"bar\" // fails `this == capitalize()`\n    }\n\n    module.catch(() -> func1.apply(l)[0])\n    module.catch(() -> func1.apply(l)[1])\n  }\n\n  [\"intermediary objects are not checked\"] {\n    local l = new Listing<String> {\n      // okay, because this node never gets evaluated\n      50\n    }\n    (l) {\n      [0] = \"Hello\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing6.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class TheClass {\n  local isLongString = (it) -> it.length > 10\n\n  prop: Listing<String(isLongString)>\n}\n\nlocal class TheClass2 {\n  hidden requiredLength: Int\n\n  prop: Listing<String(length > requiredLength)>\n}\n\nexamples {\n  [\"name resolution in type constraint\"] {\n    // should be able to resolve `isLongString` when checking this member\n    module.catch(() -> new TheClass {\n      prop {\n        \"too short\"\n      }\n    }.prop[0])\n\n    new TheClass {\n      prop {\n        \"this is long enough\"\n      }\n    }\n  }\n  [\"resolves the receiver\"] {\n    local base: TheClass2 = new {\n      requiredLength = 5\n    }\n    (base) {\n      prop {\n        \"long enough\"\n      }\n    }\n    module.catch(() -> (base) {\n      requiredLength = 10\n      prop {\n        \"too short\"\n      }\n    }.prop[0])\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/listing7.pkl",
    "content": "// ensure that these members are only evaluated once (trace should only be emitted once)\nlisting = new Listing { trace(1) }\n\nlisting2: Listing<Int> = listing\n\nlisting3 = new Listing {\n  new Listing { trace(2) }\n}\n\nlisting4: Listing<Listing<Int>> = listing3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/numberLiterals.pkl",
    "content": "// if a semicolon or newline occurs before a minus operator, the latter is interpreted as unary rather than binary minus.\n// in all other cases, semicolons and newlines are treated as whitespace and have no meaning.\nres1 = new Listing {\n  2\n  - 1    // unary minus\n  2; - 1 // unary minus\n  2 - 1  // binary minus\n\n  // chain of binary operators\n  2 -\n  1\n  + 2 *\n  3\n  / 4\n\n  1;; +; 2; // binary operator (semicolon is treated as whitespace and may occur anywhere)\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/typeCheck.pkl",
    "content": "import \"pkl:test\"\n\nlocal x1: Listing<String> = new {\n  \"pigeon\"\n  42\n  \"barn owl\"\n}\n\nlocal x2: Listing<String(length > 3)> = new {\n  \"pigeon\"\n  \"bob\"\n}\n\nres1 = x1[0]\nres2 = test.catchOrNull(() -> x1[1])\nres3 = x2[0]\nres4 = test.catchOrNull(() -> x2[1])\n\nlocal x4: Listing = new {\n  throw(\"element unnecessarily evaluated\")\n}\n\nlocal x5: Listing<Any> = new {\n  throw(\"element unnecessarily evaluated\")\n}\n\nlocal x6: Listing<unknown> = new {\n  throw(\"element unnecessarily evaluated\")\n}\n\nlocal x7 = new Listing {\n  throw(\"element unnecessarily evaluated\")\n  42\n  throw(\"element unnecessarily evaluated\")\n}\n\nlocal x8 = new Listing<String> {\n  throw(\"element unnecessarily evaluated\")\n}\n\nres5 = x4.length == 1\nres6 = x5.length == 1\nres7 = x6.length == 1\nres8 = x7[1] == 42\nres9 = x8.length == 1\n\nlocal x9 = new Listing {\n  \"foo\"\n  1\n}\nlocal x10 = x9 as Listing<String>\n\nres10 = x9 is Listing<String>\nres11 = x10[0]\nres12 = test.catch(() -> x10[1])\n\nlocal x11: Listing<String(!isEmpty)> = new Listing<String> {\n  \"\"\n}\n\nres13 = test.catch(() -> x11[0])\n\nlocal x12: Listing<String> = new Listing<String(!isEmpty)> {\n  \"\"\n}\n\nres14 = test.catch(() -> x12[0])\n\nlocal l = new Listing { \"foo\"; 1 }\n\nlocal x13: (Listing<String>|Listing<Int>) = l\n\nlocal x14: Listing<String>|Listing<Int>? = l\n\nlocal x15: Listing<String>|(Listing<Int>|Int) = l\n\nlocal x16: Listing<String>|Int = l\n\nres15 = test.catch(() -> x13)\nres16 = test.catch(() -> x14)\nres17 = test.catch(() -> x15)\n// just accessing x16 doesn't throw because only one Listing in the union type\nres18 = x16.length\n// noinspection TypeMismatch\nres19 = test.catch(() -> x16[1])\n\nlocal x17: Listing<Listing<String>> = new {\n  new {\n    5\n  }\n}\n\nres20 = x17.length\nres21 = x17[0].length\nres22 = test.catch(() -> x17[0][0])\n\nlocal x18 = new Listing { 1; 2; 3 } as Listing<String>\n\nres23 = x18.length\nres24 = test.catch(() -> x18[0])\n\nlocal x19 = new Listing<String> {\n  when (true) {\n    15\n  }\n}\n\nres25 = x19.length\nres26 = test.catch(() -> x19[0])\n\nlocal x20 = new Listing<String> {\n  ...List(1, 2, 3)\n}\n\nres27 = x20.length\nres28 = test.catch(() -> x20[0])\n\nlocal x21 = new Listing<String> {\n  for (elem in List(1, 2, 3)) {\n    elem\n  }\n}\n\nres29 = x21.length\nres30 = test.catch(() -> x21[0])\n\nlocal x22: Listing<String> = new {\n  \"hi\"\n}\n\n// typechecks not required when amending\n// ElementsLiteralNode\nres31 = (x22) {\n  \"hi\"\n}\n\n// ElementsEntriesLiteralNode\nres32 = (x22) {\n  [0] = 1\n  2\n}\n\n// GeneratorObjectLiteralNode\nres33 = (x22) {\n  when (false) {\n    \"hi\"\n  }\n  1\n}\n\n// GeneratorSpreadNode\nres34 = (x22) {\n  ...List(1, 2, 3)\n}\n\nlocal x23: Listing<Listing<String(length.isOdd)>> =\n  new Listing<Listing<String(this == capitalize())>> {\n    new {\n      \"Ba\"\n      \"bar\"\n    }\n  }\n\nres35 = test.catch(() -> x23[0][0])\nres36 = test.catch(() -> x23[0][1])\n\n// check listings from inside a list\nlocal x24: List<Listing<String(length.isOdd)>> = List(\n  new Listing<String(this == capitalize())> {\n    \"Ba\"\n    \"bar\"\n  }\n)\n\nres37 = test.catch(() -> x24[0][0])\nres38 = test.catch(() -> x24[0][1])\n\nlocal x25: List<String|Listing<Int>> = List(\n  \"hello\",\n  new Listing {\n    \"foo\"\n  },\n  \"goodbye\"\n)\n\nres39 = x25[0]\n// retain lazy typecheck of listing.\nres40 = x25[1].length\nres41 = test.catch(() -> x25[1][0])\nres42 = x25[2]\n\n// check listings from inside a set\nlocal x26: Set<Listing<String(length.isOdd)>> = Set(\n  new Listing<String(this == capitalize())> {\n    \"Ba\"\n    \"bar\"\n  }\n)\n\nres43 = test.catch(() -> x26[0][0])\n\nlocal x27: Set<String|Listing<Int>> = Set(\n  \"hello\",\n  new Listing {\n    \"foo\"\n  },\n  \"goodbye\"\n)\n\n// sets are eagerly checked (need to compute hash code, therefore need to deep force)\nres45 = test.catch(() -> x27)\n\nlocal x28: List<Listing<Int>>|List<Listing<String>> = List(\n  new Listing { \"hello\" }\n)\n\nres46 = x28[0][0]\n\nlocal x29: List<Listing<Int>>|List<Listing<String>> = List(\n  new Listing { 1; \"hello\" }\n)\n\nres47 = test.catch(() -> x29)\n\n// check listings from inside a map\nlocal x30: Map<String, Listing<String(length.isOdd)>> = Map(\n  \"hello\",\n  new Listing<String(this == capitalize())> {\n    \"Ba\"\n    \"bar\"\n  }\n)\n\nres48 = x30[\"hello\"].length\nres49 = test.catch(() -> x30[\"hello\"][0])\nres50 = test.catch(() -> x30[\"hello\"][1])\n\nlocal x31: Map<String, Int|Listing<String>> = Map(\n  \"hello\", 1,\n  \"thelisting\", new Listing {\n    1\n    2\n  },\n  \"goodbye\", 2\n)\n\nres51 = x31.length\nres52 = x31[\"hello\"]\nres53 = x31[\"goodbye\"]\nres54 = x31[\"thelisting\"].length\nres55 = test.catch(() -> x31[\"thelisting\"][0])\nres56 = test.catch(() -> x31[\"thelisting\"][1])\n\nlocal x32: Map<Listing<String>, Int> = Map(\n  new Listing { 1; 2 },\n  1\n)\n\nres57 = test.catch(() -> x32)\n\nlocal x33: Map<String, Listing<Int>|Int> = Map(\n  \"first\", 1,\n  \"second\", new Listing { \"hi\" }\n)\n\nres58 = x33.length\nres59 = x33[\"first\"]\nres60 = x33[\"second\"].length\nres61 = test.catch(() -> x33[\"second\"][0])\n\nlocal x34: Pair<Listing<String>, Listing<String>> = Pair(\n  new Listing { 1 },\n  new Listing { 2 }\n)\n\nres62 = x34.first.length\nres63 = x34.second.length\n\nres64 = test.catch(() -> x34.first[0])\nres65 = test.catch(() -> x34.second[0])\n\nlocal x35: Pair<Int, Listing<String>> = Pair(\n  5,\n  new Listing { 1 }\n)\n\nres66 = x35.first\nres67 = x35.second.length\nres68 = test.catch(() -> x35.second[0])\n\nlocal x36: Collection<Int|Listing<String>> = List(\n  1,\n  new Listing { \"hello\"; 1 }\n)\n\nres69 = x36.length\nres70 = x36.first\nres71 = x36[1].length\nres73 = x36[1][0]\nres74 = test.catch(() -> x36[1][1])\n\nlocal x37: Collection<Int|Listing<String>> = Set(\n  1,\n  new Listing {\n    \"hello\"\n    1\n  }\n)\n\nres75 = test.catch(() -> x37)\n\nlocal x38: Collection<Listing<String>>|Collection<Listing<Int>> =\n  List(new Listing {\n    1\n    \"hi\"\n  })\n\nres76 = test.catch(() -> x38)\n\nlocal class Person {\n  prop1 = 1\n  prop2 = 2\n  prop3 = \"hi\"\n}\n\nlocal x39: Listing<Int> = new Person {}.toMap().values.toListing()\n\nres77 = x39.length\nres78 = x39[0]\nres79 = x39[1]\nres80 = test.catch(() -> x39[2])\n\nlocal x40: Listing<Int> = new {\n  ...List(1, 2, \"hello\")\n}\n\nres81 = x40.length\nres82 = x40[0]\nres83 = x40[1]\nres84 = test.catch(() -> x40[2])\n\n// returns a new listing\nfunction myFunction(elem: Listing<Int>) = elem\n\nlocal x41 = myFunction(new Listing { \"hello\" })\n\nres85 = x41.length\nres86 = test.catch(() -> x41[0])\n\nfunction myFunction2(elem): Listing<Int> = elem\n\nlocal x42 = myFunction(new Listing { \"hello\" })\n\nres87 = x42.length\nres88 = test.catch(() -> x42[0])\n\nlocal x43 = (it: Listing<Int>) -> it\nlocal x44 = x43.apply(new Listing { \"hello\" })\n\nres89 = x44.length\nres90 = test.catch(() -> x44[0])\n\nfunction myFunction3(elem: Listing<Int>): Listing<Int> = elem\nlocal x45 = myFunction3(new Listing { \"hello\" })\n\nres91 = x45.length\nres92 = test.catch(() -> x45[0])\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/wrongIndex.pkl",
    "content": "import \"pkl:test\"\n\nlocal x = new Listing {\n  \"pigeon\"\n}\n\nres1 = test.catch(() -> (x) {\n  [3] = \"barn owl\"\n})\n\nres2 = test.catch(() -> (x) {\n  [2 + 1] = \"barn owl\"\n})\n\nres3 = test.catch(() -> (x) {\n  [-1] = \"barn owl\"\n})\n\nres4 = test.catch(() -> (x) {\n  [-1 * 1] = \"barn owl\"\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings/wrongParent.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {}\n\nres1 = test.catch(() -> (5) { \"pigeon\" })\nres2 = test.catch(() -> new List { \"pigeon\" })\nres3 = test.catch(() -> (List()) { \"pigeon\" })\nres4 = test.catch(() -> new Person { \"pigeon\" })\nres5 = test.catch(() -> new ValueRenderer { \"pigeon\" })\nres6 = test.catch(() -> new Mapping { \"pigeon\" })\n\nres7 = test.catch(() -> (5) { \"fr\" + \"ed\" })\nres8 = test.catch(() -> new List { \"fr\" + \"ed\" })\nres9 = test.catch(() -> (List()) { \"fr\" + \"ed\" })\nres10 = test.catch(() -> new Person { \"fr\" + \"ed\" })\nres11 = test.catch(() -> new ValueRenderer { \"fr\" + \"ed\" })\nres12 = test.catch(() -> new Mapping { \"fr\" + \"ed\" })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/default.pkl",
    "content": "class Person {\n  name: String\n  age: Int = 42\n}\n\nres1: Listing<Person> = new {\n  when (false) { 0 }\n  new {\n    name = \"Pigeon\"\n  }\n}\n\nres2 = (res1) {\n  when (false) { 0 }\n  default {\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n  }\n}\n\nres3 = (res2) {\n  when (false) { 0 }\n  default { n ->\n    age = n\n  }\n}\n\nres4 = (res3) {\n  when (false) { 0 }\n  (default.apply(5)) {\n    name = \"Barn Owl\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/equality.pkl",
    "content": "local x = new Listing {\n  when (false) { 0 }\n  \"one\"\n  \"two\"\n}\n\nres1 = x == x\nres2 = x == new Listing {\n  when (false) { 0 }\n  \"one\"\n  \"two\"\n}\nres3 = x == new Listing {\n  when (false) { 0 }\n  \"two\"\n}\nres4 = x == new Listing {\n  when (true) { \"two\" }\n  \"one\"\n}\nres5 = x == (x) {}\nres6 = x == (x) { when (false) { 0 }; \"one\" }\nres8 = x == (x) { when (false) { 0 }; default = 9 }\nres9 = (x) { when (false) { 0 }; default = 9 } == (x) { when (false) { 0 }; default = 10 }\nres10 = \n  new Listing { when (false) { 0 }; \"one\" } == \n    new Listing { when (false) { 0 }; \"one\"; default = 9 }\nres11 = \n  new Listing { when (false) { 0 }; x; local x = \"one\" } == \n    new Listing { when (false) { 0 }; \"one\" }\nres12 = \n  new Listing { when (false) { 0 }; x; local x = \"one\"; local `_` = \"two\" } == \n    new Listing { when (false) { 0 }; \"one\"; default = 9 }\nres13 = \n  new Listing { when (false) { 0 }; x; local x = \"one\" } { y; local y = \"two\" } == \n    new Listing { when (false) { 0 }; \"one\"; \"two\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/inequality.pkl",
    "content": "local x = new Listing {\n  when (false) { 0 }\n  \"one\"\n  \"two\"\n}\n\nres1 = x != x\nres2 = x != new Listing {\n  when (false) { 0 }\n  \"one\"\n  \"two\"\n}\nres3 = x != new Listing {\n  when (false) { 0 }\n  \"two\"\n}\nres4 = x != new Listing {\n  when (false) { 0 }\n  \"two\"\n  \"one\"\n}\nres5 = x != (x) {}\nres6 = x != (x) { when (false) { 0 }; \"one\" }\nres8 = x != (x) { when (false) { 0 }; default = 9 }\nres9 = (x) { when (false) { 0 }; default = 9 } != (x) { when (false) { 0 }; default = 10 }\nres10 = new Listing { when (false) { 0 }; \"one\" } != new Listing { when (false) { 0 }; \"one\"; default = 9 }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/listing1.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nfunction id(x) = x\n\nres1 = new Listing {}\n\nres2 = new Listing {\n  when (false) { 0 }\n  null\n  true\n  42\n  1.23\n  \"foo\"\n  Regex(\"bar\")\n  5.gb\n  3.min\n  Pair(1, 2)\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1, \"two\", 2)\n  new Dynamic { name = \"Pigeon\"; age = 42 }\n  new Person { name = \"Pigeon\"; age = 42 }\n  new Listing { 1; 2; 3 }\n  new Mapping { [\"one\"] = 1; [\"two\"] = 2 }\n}\n\nres3 = new Listing {\n  when (false) { 0 }\n  id(null)\n  id(true)\n  id(42)\n  id(1.23)\n  id(\"foo\")\n  id(Regex(\"bar\"))\n  id(5.gb)\n  id(3.min)\n  id(Pair(1, 2))\n  id(List(1, 2, 3))\n  id(Set(1, 2, 3))\n  id(Map(\"one\", 1, \"two\", 2))\n  id(new Dynamic { name = \"Pigeon\"; age = 42 })\n  id(new Person { name = \"Pigeon\"; age = 42 })\n  id(new Listing { 1; 2; 3 })\n  id(new Mapping { [\"one\"] = 1; [\"two\"] = 2 })\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/listing2.pkl",
    "content": "import \"pkl:test\"\n\nfunction id(x) = x\n\nlocal x = new Listing {\n  when (false) { 0 }\n  \"one\"\n  \"two\"\n  \"three\"\n}\n\nres1 = (x) {\n  when (false) { 0 }\n  [1] = \"updated two\"\n}\n\nres1a = (x) {\n  when (false) { 0 }\n  [id(1)] = id(\"updated two\")\n}\n\nres2 = (x) {\n  when (false) { 0 }\n  [0] = \"updated one\"\n  [1] = \"updated two\"\n  [2] = \"updated three\"\n}\n\nres2a = (x) {\n  when (false) { 0 }\n  [id(0)] = id(\"updated one\")\n  [1] = id(\"updated two\")\n  [id(2)] = \"updated three\"\n}\n\nres3 = (x) {\n  when (false) { 0 }\n  [2] = \"updated three\"\n  [0] = \"updated one\"\n  [1] = \"updated two\"\n}\n\nres3a = (x) {\n  when (false) { 0 }\n  [id(2)] = id(\"updated three\")\n  [0] = id(\"updated one\")\n  [id(1)] = \"updated two\"\n}\n\nres4 = (x) {\n  when (false) { 0 }\n  [0] = \"updated one\"\n  \"four\"\n  [1] = \"updated two\"\n  \"five\"\n  [2] = \"updated three\"\n  \"six\"\n}\n\nres4a = (x) {\n  when (false) { 0 }\n  [id(0)] = id(\"updated one\")\n  id(\"four\")\n  [1] = id(\"updated two\")\n  \"five\"\n  [id(2)] = \"updated three\"\n  id(\"six\")\n}\n\nres5 = test.catch(() -> (x) { when (false) { 0 }; [3] = \"four\" })\nres5a = test.catch(() -> (x) { when (false) { 0 }; [3] = id(\"four\") })\nres5b = test.catch(() -> (x) { when (false) { 0 }; [id(3)] = \"four\" })\nres5c = test.catch(() -> (x) { when (false) { 0 }; [id(3)] = id(\"four\") })\n\nres6 = test.catch(() -> (x) { when (false) { 0 }; \"four\"; [3] = \"updated four\" })\nres6a = test.catch(() -> (x) { when (false) { 0 }; id(\"four\"); [id(3)] = id(\"updated four\") })\n\nres7 = test.catch(() -> (x) { when (false) { 0 }; [-1] = \"value\" })\nres7a = test.catch(() -> (x) { when (false) { 0 }; [id(-1)] = id(\"value\") })\n\nres8 = test.catch(() -> (x) { when (false) { 0 }; [\"wrong type\"] = \"value\" })\nres8a = test.catch(() -> (x) { when (false) { 0 }; [id(\"wrong type\")] = id(\"value\") })\n\nres9 = test.catch(() -> new Listing { when (false) { 0 }; foo = \"bar\" })\nres10 = test.catch(() -> (x) { when (false) { 0 }; foo = \"foo\" })\nres11 = test.catch(() -> new Listing { when (false) { 0 }; \"one\"; foo = \"foo\" })\nres12 = test.catch(() -> (x) { when (false) { 0 }; \"four\"; foo = \"foo\" })\nres12a = test.catch(() -> (x) { when (false) { 0 }; id(\"four\"); foo = \"foo\" })\nres13 = test.catch(() -> (x) { when (false) { 0 }; [1] = \"updated two\"; foo = \"foo\" })\nres13a = test.catch(() -> (x) { when (false) { 0 }; [id(1)] = id(\"updated two\"); foo = \"foo\" })\nres14 = test.catch(() -> (x) { when (false) { 0 }; \"four\"; [1] = \"updated two\"; foo = \"foo\" })\nres14a = test.catch(() -> (x) { when (false) { 0 }; id(\"four\"); [id(1)] = id(\"updated two\"); foo = \"foo\" })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/listing3.pkl",
    "content": "// subscript, this, super, dynamic binding\n\nimport \"pkl:test\"\nimport \"pkl:math\"\n\nlocal x = new Listing {\n  when (false) { 0 }\n  \"one\"\n  \"two\"\n  \"th\" + \"ree\"\n}\n\nres1 = x[0]\nres2 = x[1]\nres3 = x[2]\nres4 = test.catch(() -> x[-1])\nres5 = test.catch(() -> x[3])\nres6 = test.catch(() -> x[math.minInt])\nres7 = test.catch(() -> x[math.maxInt])\n\nlocal y = new Listing {\n  when (false) { 0 }\n  new Listing {\n    when (false) { 0 }\n    \"one\"\n  }\n new Listing {\n    when (false) { 0 }\n    \"two\"\n    \"th\" + \"ree\"\n  }\n  new Mapping {\n    when (false) { 0 }\n    [\"four\"] = 4\n  }\n}\n\nres8 = y[0][0]\nres9 = y[1][0]\nres10 = y[1][1]\nres11 = y[2][\"four\"]\nres12 = test.catch(() -> y[3][0])\nres13 = test.catch(() -> y[1][2])\nres14 = test.catch(() -> y[2][\"other\"])\n\nres15 = new Listing {\n  when (false) { 0 }\n  \"one\"\n  this[0]\n  \"two\"\n  this[2]\n  this[1]\n}\n\nres16 = (res15) {\n  when (false) { 0 }\n  \"three\"\n  this[0]\n  this[5]\n}\n\nres17 = new Listing {\n  when (false) { 0 }\n  \"item\"\n  this[0] + \"2\"\n}\n\nres18 = (res17) {\n  when (false) { 0 }\n  [0] = \"element\"\n  this[0] + \"3\"\n}\n\nres19 = (res18) {\n  when (false) { 0 }\n  [0] = \"object\"\n  this[0] + \"4\"\n}\n\nres20 = (x) {\n  when (false) { 0 }\n  [0] = super[0] + \"2\"\n  [1] = super[0] + \"3\"\n  super[0] + \"4\"\n  this[0] + \"4\"\n}\n\nlocal err0 = new Listing {\n  when (false) { 0 }\n  \"foo\"\n  this[3]\n}\nres21 = test.catch(() -> err0[1])\n\n// currently, referencing a non-existing super element returns dynamic object\nres22 = new Listing {\n  when (false) { 0 }\n  super[0]\n  super[3]\n}\n\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/numberLiterals.pkl",
    "content": "// if a semicolon or newline occurs before a minus operator, the latter is interpreted as unary rather than binary minus.\n// in all other cases, semicolons and newlines are treated as whitespace and have no meaning.\nres1 = new Listing {\n  when (false) { 0 }\n  2\n  - 1    // unary minus\n  2; - 1 // unary minus\n  2 - 1  // binary minus\n\n  // chain of binary operators\n  2 -\n  1\n  + 2 *\n  3\n  / 4\n\n  1;; +; 2; // binary operator (semicolon is treated as whitespace and may occur anywhere)\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/typeCheck.pkl",
    "content": "import \"pkl:test\"\n\nhidden x1: Listing<String> = new {\n  when (false) { 0 }\n  \"pigeon\"\n  42\n  \"barn owl\"\n}\n\nhidden x2: Listing<String(length > 3)> = new {\n  when (false) { 0 }\n  \"pigeon\"\n  \"bob\"\n}\n\nhidden x3: Listing<String>(!isEmpty)\n\nres1 = test.catch(() -> x1.toList())\nres2 = test.catch(() -> x2.toList())\nres3 = test.catch(() -> x3.toList())\n\nhidden x4: Listing = new {\n  when (true) {\n    throw(\"element unnecessarily evaluated\")\n  }\n  for (n in List(1)) {\n    throw(\"element unnecessarily evaluated\")\n  }\n}\n\nhidden x5: Listing<Any> = new {\n  when (true) {\n    throw(\"element unnecessarily evaluated\")\n  }\n  for (n in List(1)) {\n    throw(\"element unnecessarily evaluated\")\n  }\n}\n\nhidden x6: Listing<unknown> = new {\n  when (true) {\n    throw(\"element unnecessarily evaluated\")\n  }\n  for (n in List(1)) {\n    throw(\"element unnecessarily evaluated\")\n  }\n}\n\nhidden x7 = new Listing {\n  when (true) {\n    throw(\"element unnecessarily evaluated\")\n  }\n  42\n  for (n in List(1)) {\n    throw(\"element unnecessarily evaluated\")\n  }\n}\n\nres4 = x4.length == 2\nres5 = x5.length == 2\nres6 = x6.length == 2\nres7 = x7[1] == 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/wrongIndex.pkl",
    "content": "import \"pkl:test\"\n\nlocal x = new Listing {\n  when (false) { 0 }\n  \"pigeon\"\n}\n\nres1 = test.catch(() -> (x) {\n  when (false) { 0 }\n  [3] = \"barn owl\"\n})\n\nres2 = test.catch(() -> (x) {\n  when (false) { 0 }\n  [2 + 1] = \"barn owl\"\n})\n\nres3 = test.catch(() -> (x) {\n  when (false) { 0 }\n  [-1] = \"barn owl\"\n})\n\nres4 = test.catch(() -> (x) {\n  when (false) { 0 }\n  [-1 * 1] = \"barn owl\"\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/listings2/wrongParent.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {}\n\nres1 = test.catch(() -> (5) { when (false) { 0 }; \"pigeon\" })\nres2 = test.catch(() -> new List { when (false) { 0 }; \"pigeon\" })\nres3 = test.catch(() -> (List()) { when (false) { 0 }; \"pigeon\" })\nres4 = test.catch(() -> new Person { when (false) { 0 }; \"pigeon\" })\nres5 = test.catch(() -> new ValueRenderer { when (false) { 0 }; \"pigeon\" })\nres6 = test.catch(() -> new Mapping { when (false) { 0 }; \"pigeon\" })\n\nres7 = test.catch(() -> (5) { when (false) { 0 }; \"fr\" + \"ed\" })\nres8 = test.catch(() -> new List { when (false) { 0 }; \"fr\" + \"ed\" })\nres9 = test.catch(() -> (List()) { when (false) { 0 }; \"fr\" + \"ed\" })\nres10 = test.catch(() -> new Person { when (false) { 0 }; \"fr\" + \"ed\" })\nres11 = test.catch(() -> new ValueRenderer { when (false) { 0 }; \"fr\" + \"ed\" })\nres12 = test.catch(() -> new Mapping { when (false) { 0 }; \"fr\" + \"ed\" })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/default.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1: Mapping<String, Person> = new {\n  default {\n    age = 42\n  }\n  [\"pigeon\"] {\n    name = \"Pigeon\"\n  }\n  [\"parrot\"] {\n    name = \"Parrot\"\n    age = 50\n  }\n}\n\nres2 = (res1) {\n  default {\n    age = 45\n  }\n}\n\nres3: Mapping<String, Person> = new {\n  default { key ->\n    name = key\n  }\n  [\"pigeon\"] {\n    age = 40\n  }\n  [\"parrot\"] {\n    name = \"PARROT\"\n    age = 50\n  }\n  [\"susan\"] {\n    name = super.name + \"!!!\"\n    age = 60\n  }\n}\n\nres4 = (res3.getOrDefault(\"Bald Eagle\")) {\n  age = 99\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/duplicateComputedKey.pkl",
    "content": "import \"pkl:test\"\n\nres1 = test.catch(() -> new Mapping {\n  [\"barn owl\"] = 1\n  [\"pigeon\"] = 2\n  [\"bar\" + \"n owl\"] = 3\n})\n\nres2 = test.catch(() -> new Mapping {\n  [\"ba\" + \"rn owl\"] = 1\n  [\"pigeon\"] = 2\n  [\"barn \" + \"owl\"] = 3\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/duplicateConstantKey.pkl",
    "content": "res1 = new Mapping {\n  [\"barn owl\"] = 1\n  [\"pigeon\"] = 2\n  [\"barn owl\"] = 3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/equality.pkl",
    "content": "local x = new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n\nres1 = x == x\nres2 = x == new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres3 = x == new Mapping {\n  [\"two\"] = 2\n}\nres4 = x == new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 3\n}\nres5 = x == (x) {}\nres6 = x == (x) { [\"one\"] = 1 }\nres7 = x == (x) { [\"one\"] = 2 }\nres8 = x == (x) { default = 9 }\nres9 = (x) { default = 9 } == (x) { default = 10 }\nres10 = new Mapping { [\"one\"] = 1 } == new Mapping { [\"one\"] = 1; default = 1 }\nres11 = new Mapping { [\"one\"] = x; local x = 1 } == new Mapping { [\"one\"] = 1 }\nres12 = new Mapping { [\"one\"] = x; local x = 1; local `_` = \"two\" } == new Mapping { [\"one\"] = 1; default = 9 }\nres13 = new Mapping { [\"one\"] = x; local x = 1 } { [\"two\"] = y; local y = 2 } == new Mapping { [\"one\"] = 1; [\"two\"] = 2 }\n\nclass Bird { name: String }\n\nlocal m1: Mapping<String, Bird> = new {\n  [\"Pigeon\"] = new { name = \"Pigeon\" }\n  [\"Stork\"] = new { name = \"Stork\" }\n}\n\nlocal m2: Mapping<String, Bird|Int> = m1\n\nres14 = m1 == m2\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/hashCode.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class Bird { name: String }\n\nfacts {\n  local set: Set<Int> = IntSeq(1, 100).fold(Set(), (res, n) -> res.add(n))\n  \n  [\"local members aren't included in hash code\"] {\n    local mapping1 = new Mapping { [\"one\"] = 1 }\n    local mapping2 = new Mapping { [\"one\"] = x; local x = 1 }\n    local mapping3 = new Mapping { [\"one\"] = x; local x = 1 } { [\"one\"] = y; local y = 1 }\n    \n    set.add(mapping1).contains(mapping2)\n    set.add(mapping2).contains(mapping3)\n    set.add(mapping3).contains(mapping2)\n    set.add(mapping1).add(mapping2).add(mapping3).length == 101\n  }\n\n  [\"hidden members aren't included in hash code\"] {\n    local mapping1 = new Mapping { [\"one\"] = 1 }\n    local mapping2 = new Mapping { [\"one\"] = 1; default = (_) -> 42 }\n\n    set.add(mapping1).contains(mapping2)\n    set.add(mapping2).contains(mapping1)\n    set.add(mapping1).add(mapping2).length == 101\n  }\n}\n\nexamples {\n  [\"delegating mappings produce correct hash codes\"] {\n    local m1: Mapping<String, Bird> = new {\n      [\"Pigeon\"] = new { name = \"Pigeon\" }\n      [\"Stork\"] = new { name = \"Stork\" }\n    }\n\n    local m2: Mapping<String, Bird|Int> = m1\n\n    // need to add 6 other elements here; `EconomicMap` will back shorter collections\n    // with an array and not compute hash code\n    List(1, 2, 3, 4, 5, 6, m2, m1).distinct\n  }\n\n  [\"delegating mappings produce correct hash codes -- re-use hash-code\"] {\n    local m1: Mapping<String, Bird> = new {\n      [\"Pigeon\"] = new { name = \"Pigeon\" }\n      [\"Stork\"] = new { name = \"Stork\" }\n    }\n\n    local m2: Mapping<String, Bird|Int> = m1\n\n    // same as the other test but put `m1` first this time (execute code path where we re-use\n    // already computed hashcode)\n    List(1, 2, 3, 4, 5, 6, m1, m2).distinct\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/inequality.pkl",
    "content": "local x = new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n\nres1 = x != x\nres2 = x != new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres3 = x != new Mapping {\n  [\"two\"] = 2\n}\nres4 = x != new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 3\n}\nres5 = x != (x) {}\nres6 = x != (x) { [\"one\"] = 1 }\nres7 = x != (x) { [\"one\"] = 2 }\nres8 = x != (x) { default = 9 }\nres9 = (x) { default = 9 } != (x) { default = 10 }\nres10 = new Mapping { [\"one\"] = 1 } != new Mapping { [\"one\"] = 1; default = 1 }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/mapping1.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nfunction id(x) = x\n\nres1 = new Mapping {}\n\nres2 = new Mapping {\n  [null] = null\n  [true] = true\n  [42] = 42\n  [1.23] = 1.23\n  [\"foo\"] = \"foo\"\n  [Regex(\"bar\")] = Regex(\"bar\")\n  [5.gb] = 5.gb\n  [3.min] = 3.min\n  [Pair(1, 2)] = Pair(1, 2)\n  [List(1, 2, 3)] = List(1, 2, 3)\n  [Set(1, 2, 3)] = Set(1, 2, 3)\n  [Map(\"one\", 1, \"two\", 2)] = Map(\"one\", 1, \"two\", 2)\n  [new Dynamic { name = \"Pigeon\"; age = 42 }] = new Dynamic { name = \"Pigeon\"; age = 42 }\n  [new Person { name = \"Pigeon\"; age = 42 }] = new Person { name = \"Pigeon\"; age = 42 }\n  [new Listing { 1; 2; 3 }] = new Listing { 1; 2; 3 }\n  [new Mapping { [\"one\"] = 1; [\"two\"] = 2 }] = new Mapping { [\"one\"] = 1; [\"two\"] = 2 }\n}\n\nres3 = new Mapping {\n  [id(null)] = id(null)\n  [id(true)] = id(true)\n  [id(42)] = id(42)\n  [id(1.23)] = id(1.23)\n  [id(\"foo\")] = id(\"foo\")\n  [id(Regex(\"bar\"))] = id(Regex(\"bar\"))\n  [id(5.gb)] = id(5.gb)\n  [id(3.min)] = id(3.min)\n  [id(Pair(1, 2))] = id(Pair(1, 2))\n  [id(List(1, 2, 3))] = id(List(1, 2, 3))\n  [id(Set(1, 2, 3))] = id(Set(1, 2, 3))\n  [id(Map(\"one\", 1, \"two\", 2))] = id(Map(\"one\", 1, \"two\", 2))\n  [id(new Dynamic { name = \"Pigeon\"; age = 42 })] = id(new Dynamic { name = \"Pigeon\"; age = 42 })\n  [id(new Person { name = \"Pigeon\"; age = 42 })] = id(new Person { name = \"Pigeon\"; age = 42 })\n  [id(new Listing { 1; 2; 3 })] = id(new Listing { 1; 2; 3 })\n  [id(new Mapping { [\"one\"] = 1; [\"two\"] = 2 })] = id(new Mapping { [\"one\"] = 1; [\"two\"] = 2 })\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/mapping2.pkl",
    "content": "import \"pkl:test\"\n\nres1 = new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n\nres2 = new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = this[\"one\"] + 1\n}\n\nres3 = new Mapping {\n  [\"item one\"] = 1\n  [\"two\"] = this[\"item one\"] + 1\n}\n\nres4 = (res2) {\n  [\"one\"] = 2\n}\n\nres5 = new Mapping {\n  [\"one\"] = new Mapping {\n    [\"a\"] = new Mapping {\n      [\"x\"] = 1\n    }\n    [\"b\"] = new Mapping {\n      [\"y\"] = 2\n    }\n  }\n  [\"two\"] = new Mapping {\n    [\"c\"] = new Mapping {\n      [\"z\"] = 3\n    }\n  }\n}\nres5a = res5[\"one\"]\nres5b = res5[\"one\"][\"a\"]\nres5c = res5[\"one\"][\"a\"][\"x\"]\nres5d = res5[\"one\"][\"b\"]\nres5e = res5[\"one\"][\"b\"][\"y\"]\nres5f = res5[\"two\"]\nres5g = res5[\"two\"][\"c\"]\nres5h = res5[\"two\"][\"c\"][\"z\"]\nres5i = test.catch(() -> res5[\"three\"])\n\nres6 = new Mapping {\n  [\"one\"] = List(1, 2, 3)\n  [\"two\"] = this[\"one\"] + List(4, 5, 6)\n  [\"three\"] = 3\n}\n\nres7 = (res6) {\n  [\"one\"] = super[\"one\"] + List(4, 5, 6)\n  [\"three\"] = super[\"three\"] * 2\n}\n\nres8 = new Mapping {\n  default = (key) -> new Dynamic {\n    name = key\n    age = 42\n  }\n\n  [\"pigeon\"] {}\n  [\"barn owl\"] {}\n  [\"parrot\"] {}\n}\n\nres9 = new Mapping {\n  default = (key) -> new Dynamic {\n    name = key\n    age = 42\n  }\n\n  [\"pigeon\"] {}\n  [\"barn owl\"] {}\n  [\"parrot\"] {\n    age = 32\n  }\n}\n\nres10 = (res9) {\n  [\"parrot\"] {}\n  [\"elf owl\"] {}\n  [\"barn owl\"] {\n    age = 22\n  }\n}\n\nres11 = (res1) {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/stringKeyNotFound.pkl",
    "content": "hidden x = new Mapping {\n  [\"xfoo\"] = \"xfoo\"\n  [\"fooy\"] = \"fooy\"\n  [\"fozo\"] = \"fozo\"\n  [\"other\"] = \"other\"\n}\n\nres1 = x[\"foo\"]"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/typeCheck.pkl",
    "content": "import \"pkl:test\"\n\nlocal x1: Mapping<String, List<Int>> = new {\n  [\"pigeon\"] = List(1, 2, 3)\n  [\"barn owl\"] = 42\n}\n\nlocal x2: Mapping<String, List<Int>> = new {\n  [\"fr\" + \"ed\"] = List(1) + List(2, 3)\n  [\"bar\" + \"ney\"] = 21 + 21\n}\n\nlocal x3: Mapping<List<Int>, String> = new {\n  [List(1, 2, 3)] = \"pigeon\"\n  [42] = \"barn owl\"\n}\n\nlocal x4: Mapping<List<Int>, String> = new {\n  [List(1) + List(2, 3)] = \"fr\" + \"ed\"\n  [21 + 21] = \"bar\" + \"ney\"\n}\n\nlocal x5: Mapping<String(!isEmpty), String> = new {\n  [\"\"] = \"pigeon\"\n}\nlocal x6: Mapping<String, String(!isEmpty)> = new {\n  [\"pigeon\"] = \"\"\n}\n\nres1 = x1.length\nres2 = test.catch(() -> x1[\"barn owl\"])\nres3 = x2.length\nres4 = x2[\"fred\"]\nres5 = test.catch(() -> x2[\"barney\"])\nres6 = test.catch(() -> x3)\nres7 = test.catch(() -> x4)\nres8 = test.catch(() -> x5)\nres9 = x6.length\nres10 = test.catch(() -> x6[\"pigeon\"])\n\nhidden x7: Mapping = new {\n  [\"first\"] = throw(\"value unnecessarily evaluated\")\n}\n\nhidden x8: Mapping<String, Any> = new {\n  [\"first\"] = throw(\"value unnecessarily evaluated\")\n}\n\nhidden x9: Mapping<String, unknown> = new {\n  [\"first\"] = throw(\"value unnecessarily evaluated\")\n}\n\nhidden x10 = new Mapping {\n  [\"first\"] = throw(\"value unnecessarily evaluated\")\n  [\"second\"] = 42\n  [\"third\"] = throw(\"value unnecessarily evaluated\")\n}\n\nres11 = x7.length\nres12 = x8.length\nres13 = x9.length\nres14 = x10.length\nres15 = x10[\"second\"]\n\nlocal x11: Mapping<String, String(!isEmpty)> = new Mapping<String, String> {\n  [\"foo\"] = \"\"\n}\n\nres16 = x11.length\nres17 = test.catch(() -> x11[\"foo\"])\n\nlocal x12: Mapping<String, String> = new Mapping<String, String(!isEmpty)> {\n  [\"foo\"] = \"\"\n}\n\nres18 = x12.length\nres19 = test.catch(() -> x12[\"foo\"])\n\nlocal m = new Mapping {\n  [\"one\"] = 1\n  [\"two\"] = \"two\"\n}\n\nlocal x13: Mapping<String, String>|Mapping<String, Int> = m\nlocal x14: Mapping<String, String>|Mapping<String, Int>? = m\nlocal x15: Mapping<String, String>|(Mapping<String, Int>|Int) = m\nlocal x16: Mapping<String, String>|Int = m\n\nres20 = test.catch(() -> x13)\nres21 = test.catch(() -> x14)\nres22 = test.catch(() -> x15)\nres23 = x16.length\nres24 = test.catch(() -> x16[\"one\"])\n\nlocal x17: Mapping<String, Mapping<String, String>> = new {\n  [\"foo\"] {\n    [\"bar\"] = 1\n  }\n}\n\nres25 = x17.length\nres26 = x17[\"foo\"].length\nres27 = test.catch(() -> x17[\"foo\"][\"bar\"])\n\nlocal x18 = new Mapping { [\"foo\"] = 1 } as Mapping<String, String>\n\nres28 = x18.length\nres29 = test.catch(() -> x18[\"foo\"])\n\nlocal x19 = new Mapping<String, String> {\n  when (true) {\n    [\"foo\"] = 1\n  }\n}\n\nres30 = x19.length\nres31 = test.catch(() -> x19[\"foo\"])\n\nlocal x20 = new Mapping<String, String> {\n  ...Map(\"foo\", 1)\n}\n\nres32 = x20.length\nres33 = test.catch(() -> x20[\"foo\"])\n\nlocal x21 = new Mapping<String, String> {\n  for (k, v in Map(\"foo\", 1)) {\n    [k] = v\n  }\n}\n\nres34 = x21.length\nres35 = test.catch(() -> x21[\"foo\"])\n\nlocal x22: Mapping<String, String> = new {\n  [\"hi\"] = \"hi\"\n}\n\n// typechecks not required when amending\n// ElementsEntriesLiteralNode\nres36 = (x22) {\n  [\"hi2\"] = 1\n}\n\n// GeneratorObjectLiteralNode\nres37 = (x22) {\n  when (true) {\n    [\"hi2\"] = 1\n  }\n}\n\n// GeneratorSpreadNode\nres38 = (x22) {\n  ...Map(\"hi2\", 1)\n}\n\nlocal x23: Mapping<String, Mapping<String, String(length.isOdd)>> = new Mapping<String, Mapping<String, String(this == capitalize())>> {\n  [\"foo\"] {\n    [\"first\"] = \"Ba\"\n    [\"second\"] = \"bar\"\n  }\n}\n\nres39 = test.catch(() -> x23[\"foo\"][\"first\"])\nres40 = test.catch(() -> x23[\"\"])\n\n// check mappings from inside a list\nlocal x24: List<Mapping<String, String(length.isOdd)>> = List(\n  new Mapping<String, String(this == capitalize())> {\n    [\"first\"] = \"Ba\"\n    [\"second\"] = \"bar\"\n  }\n)\n\nres41 = test.catch(() -> x24[0][\"first\"])\nres42 = test.catch(() -> x24[0][\"second\"])\n\nlocal x25: List<String|Mapping<String, Int>> = List(\n  \"hello\",\n  new Mapping {\n    [\"foo\"] = \"foo\"\n  },\n  \"goodbye\"\n)\n\nres43 = x25[0]\n// retain lazy typecheck of mapping.\nres44 = x25[1].length\nres45 = test.catch(() -> x25[1][\"foo\"])\nres46 = x25[2]\n\n// check mappings from inside a set\nlocal x26: Set<Mapping<String, String(length.isOdd)>> = Set(\n  new Mapping<String, String(this == capitalize())> {\n    [\"first\"] = \"Ba\"\n    [\"second\"] = \"bar\"\n  }\n)\n\n// sets are eagerly checked (need to compute hash code, therefore need to deep force)\nres47 = test.catch(() -> x26)\n\nlocal x28: List<Mapping<String, Int>>|List<Mapping<String, String>> = List(\n  new Mapping { [\"foo\"] = 1 }\n)\n\nres48 = x28[0][\"foo\"]\n\nlocal x29: List<Mapping<String, Int>>|List<Mapping<String, String>> = List(\n  new Mapping {\n    [\"foo\"] = 1\n    [\"bar\"] = \"hi\"\n  }\n)\n\nres49 = test.catch(() -> x29)\n\n// check mappings from inside a map\nlocal x30: Map<String, Mapping<String, String(length.isOdd)>> = Map(\n  \"hello\",\n  new Mapping<String, String(this == capitalize())> {\n    [\"first\"] = \"Ba\"\n    [\"second\"] = \"bar\"\n  }\n)\n\nres50 = x30[\"hello\"].length\nres51 = test.catch(() -> x30[\"hello\"][\"first\"])\nres52 = test.catch(() -> x30[\"hello\"][\"second\"])\n\nlocal x31: Map<String, Int|Mapping<String, String>> = Map(\n  \"hello\", 1,\n  \"themapping\", new Mapping {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  },\n  \"goodbye\", 2\n)\n\nres53 = x31.length\nres54 = x31[\"hello\"]\nres55 = x31[\"goodbye\"]\nres56 = x31[\"themapping\"].length\nres57 = test.catch(() -> x31[\"themapping\"][\"one\"])\nres58 = test.catch(() -> x31[\"themapping\"][\"two\"])\n\nlocal x32: Map<Mapping<String, String>, Int> = Map(\n  new Mapping { [\"one\"] = 1 },\n  1\n)\n\nres59 = test.catch(() -> x32)\n\nlocal x33: Map<String, Mapping<String, Int>|Int> = Map(\n  \"first\", 1,\n  \"second\", new Mapping { [\"hi\"] = \"hi\" }\n)\n\nres60 = x33.length\nres61 = x33[\"first\"]\nres62 = x33[\"second\"].length\nres63 = test.catch(() -> x33[\"second\"][\"hi\"])\n\nlocal x34: Pair<Mapping<String, String>, Mapping<String, String>> = Pair(\n  new Mapping { [\"one\"] = 1 },\n  new Mapping { [\"one\"] = 1 }\n)\n\nres64 = x34.first.length\nres65 = x34.second.length\n\nres66 = test.catch(() -> x34.first[\"one\"])\nres67 = test.catch(() -> x34.second[\"one\"])\n\nlocal x35: Pair<Int, Mapping<String, String>> = Pair(\n  5,\n  new Mapping { [\"one\"] = 1 }\n)\n\nres68 = x35.first\nres69 = x35.second.length\nres70 = test.catch(() -> x35.second[\"one\"])\n\nlocal x36: Collection<Int|Mapping<String, String>> = List(\n  1,\n  new Mapping {\n    [\"one\"] = \"hello\"\n    [\"two\"] = 1\n  }\n)\n\n\nres71 = x36.length\nres72 = x36.first\nres73 = x36[1].length\nres74 = x36[1][\"one\"]\nres75 = test.catch(() -> x36[1][\"two\"])\n\nlocal x37: Collection<Int|Mapping<String, String>> = Set(\n  1,\n  new Mapping {\n    [\"one\"] = \"hello\"\n    [\"two\"] = 1\n  }\n)\n\nres77 = test.catch(() -> x37)\n\nlocal x38: Collection<Mapping<String, String>>|Collection<Mapping<String, Int>> =\n  List(new Mapping {\n    [\"one\"] = \"hello\"\n    [\"two\"] = 1\n  })\n\nres78 = test.catch(() -> x38)\n\nlocal class Person {\n  prop1 = 1\n  prop2 = 2\n  prop3 = \"hi\"\n}\n\nlocal x39: Mapping<String, Int> = new Person {}\n  .toMap()\n  .toMapping()\n\n\nres79 = x39.length\nres80 = x39[\"prop1\"]\nres81 = x39[\"prop2\"]\nres82 = test.catch(() -> x39[\"prop3\"])\n\nlocal x40: Mapping<String, Int> = new {\n  ...Map(\"one\", 1, \"two\", 2, \"three\", \"hello\")\n}\n\nres83 = x40.length\nres84 = x40[\"one\"]\nres85 = x40[\"two\"]\nres86 = test.catch(() -> x40[\"three\"])\n\n// returns a new mapping\nfunction myFunction(elem: Mapping<String, Int>) = elem\n\nlocal x41 = myFunction(new Mapping { [\"hello\"] = \"hello\" })\n\nres87 = x41.length\nres88 = test.catch(() -> x41[\"hello\"])\n\nfunction myFunction2(elem): Mapping<String, Int> = elem\n\nlocal x42 = myFunction(new Mapping { [\"hello\"] = \"hello\" })\n\nres89 = x42.length\nres90 = test.catch(() -> x42[\"hello\"])\n\nlocal x43 = (it: Mapping<String, Int>) -> it\nlocal x44 = x43.apply(new Mapping { [\"hello\"] = \"hello\" })\n\nres91 = x44.length\nres92 = test.catch(() -> x44[\"hello\"])\n\nfunction myFunction3(elem: Mapping<String, Int>): Mapping<String, Int> = elem\nlocal x45 = myFunction3(new Mapping { [\"hello\"] = \"hello\" })\n\nres93 = x45.length\nres94 = test.catch(() -> x45[\"hello\"])\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings/wrongParent.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {}\n\nres1 = test.catch(() -> (5) { [\"pigeon\"] = true })\nres2 = test.catch(() -> new List { [\"pigeon\"] = true })\nres3 = test.catch(() -> (List()) { [\"pigeon\"] = true })\nres4 = test.catch(() -> new Person { [\"pigeon\"] = true })\nres5 = test.catch(() -> new ValueRenderer { [\"pigeon\"] = true })\nres6 = test.catch(() -> new Listing { [0] = true })\n\nres7 = test.catch(() -> (5) { [\"fr\" + \"ed\"] = true })\nres8 = test.catch(() -> new List { [\"fr\" + \"ed\"] = true })\nres9 = test.catch(() -> (List()) { [\"fr\" + \"ed\"] = true })\nres10 = test.catch(() -> new Person { [\"fr\" + \"ed\"] = true })\nres11 = test.catch(() -> new ValueRenderer { [\"fr\" + \"ed\"] = true })\nres12 = test.catch(() -> new Listing { [0 + 0] = true })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/default.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nres1: Mapping<String, Person> = new {\n  when (false) { [0] = 0 }\n  default {\n    age = 42\n  }\n  [\"pigeon\"] {\n    name = \"Pigeon\"\n  }\n  [\"parrot\"] {\n    name = \"Parrot\"\n    age = 50\n  }\n}\n\nres2 = (res1) {\n  when (false) { [0] = 0 }\n  default {\n    age = 45\n  }\n}\n\nres3: Mapping<String, Person> = new {\n  when (false) { [0] = 0 }\n  default { key ->\n    name = key\n  }\n  [\"pigeon\"] {\n    age = 40\n  }\n  [\"parrot\"] {\n    name = \"PARROT\"\n    age = 50\n  }\n  [\"susan\"] {\n    name = super.name + \"!!!\"\n    age = 60\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/duplicateComputedKey.pkl",
    "content": "import \"pkl:test\"\n\nres1 = test.catch(() -> new Mapping {\n  when (false) { [0] = 0 }\n  [\"barn owl\"] = 1\n  [\"pigeon\"] = 2\n  [\"barn \" + \"owl\"] = 3\n})\n\nres2 = test.catch(() -> new Mapping {\n  when (false) { [0] = 0 }\n  [\"ba\" + \"rn owl\"] = 1\n  [\"pigeon\"] = 2\n  [\"barn\" + \" owl\"] = 3\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/duplicateConstantKey.pkl",
    "content": "res1 = new Mapping {\n  when (false) { [0] = 0 }\n  [\"barn owl\"] = 1\n  [\"pigeon\"] = 2\n  [\"barn owl\"] = 3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/equality.pkl",
    "content": "local x = new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n\nres1 = x == x\nres2 = x == new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres3 = x == new Mapping {\n  when (false) { [0] = 0 }\n  [\"two\"] = 2\n}\nres4 = x == new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 3\n}\nres5 = x == (x) {}\nres6 = x == (x) { when (false) { [0] = 0 } [\"one\"] = 1 }\nres7 = x == (x) { when (false) { [0] = 0 } [\"one\"] = 2 }\nres8 = x == (x) { when (false) { [0] = 0 } default = 9 }\nres9 = (x) { when (false) { [0] = 0 } default = 9 } == (x) { when (false) { [0] = 0 } default = 10 }\nres10 = \n  new Mapping { when (false) { [0] = 0 } [\"one\"] = 1 } == \n    new Mapping { when (false) { [0] = 0 } [\"one\"] = 1 default = 1 }\nres11 = \n  new Mapping { when (false) { [0] = 0 } [\"one\"] = x; local x = 1 } == \n    new Mapping { when (false) { [0] = 0 } [\"one\"] = 1 }\nres12 = \n  new Mapping { when (false) { [0] = 0 } [\"one\"] = x; local x = 1; local `_` = \"two\" } == \n    new Mapping { when (false) { [0] = 0 } [\"one\"] = 1; default = 9 }\nres13 = \n  new Mapping { when (false) { [0] = 0 } [\"one\"] = x; local x = 1 } { [\"two\"] = y; local y = 2 } == \n    new Mapping { when (false) { [0] = 0 } [\"one\"] = 1; [\"two\"] = 2 }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/inequality.pkl",
    "content": "local x = new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n\nres1 = x != x\nres2 = x != new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres3 = x != new Mapping {\n  when (false) { [0] = 0 }\n  [\"two\"] = 2\n}\nres4 = x != new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 3\n}\nres5 = x != (x) {}\nres6 = x != (x) { when (false) { [0] = 0 }; [\"one\"] = 1 }\nres7 = x != (x) { when (false) { [0] = 0 }; [\"one\"] = 2 }\nres8 = x != (x) { when (false) { [0] = 0 }; default = 9 }\nres9 = (x) { when (false) { [0] = 0 }; default = 9 } != (x) { when (false) { [0] = 0 }; default = 10 }\nres10 = new Mapping { when (false) { [0] = 0 }; [\"one\"] = 1 } != new Mapping { when (false) { [0] = 0 }; [\"one\"] = 1; default = 1 }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/mapping1.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n}\n\nfunction id(x) = x\n\nres1 = new Mapping {}\n\nres2 = new Mapping {\n  when (false) { [0] = 0 }\n  [null] = null\n  [true] = true\n  [42] = 42\n  [1.23] = 1.23\n  [\"foo\"] = \"foo\"\n  [Regex(\"bar\")] = Regex(\"bar\")\n  [5.gb] = 5.gb\n  [3.min] = 3.min\n  [Pair(1, 2)] = Pair(1, 2)\n  [List(1, 2, 3)] = List(1, 2, 3)\n  [Set(1, 2, 3)] = Set(1, 2, 3)\n  [Map(\"one\", 1, \"two\", 2)] = Map(\"one\", 1, \"two\", 2)\n  [new Dynamic { name = \"Pigeon\"; age = 42 }] = new Dynamic { name = \"Pigeon\"; age = 42 }\n  [new Person { name = \"Pigeon\"; age = 42 }] = new Person { name = \"Pigeon\"; age = 42 }\n  [new Listing { 1; 2; 3 }] = new Listing { 1; 2; 3 }\n  [new Mapping { [\"one\"] = 1; [\"two\"] = 2 }] = new Mapping { [\"one\"] = 1; [\"two\"] = 2 }\n}\n\nres3 = new Mapping {\n  when (false) { [0] = 0 }\n  [id(null)] = id(null)\n  [id(true)] = id(true)\n  [id(42)] = id(42)\n  [id(1.23)] = id(1.23)\n  [id(\"foo\")] = id(\"foo\")\n  [id(Regex(\"bar\"))] = id(Regex(\"bar\"))\n  [id(5.gb)] = id(5.gb)\n  [id(3.min)] = id(3.min)\n  [id(Pair(1, 2))] = id(Pair(1, 2))\n  [id(List(1, 2, 3))] = id(List(1, 2, 3))\n  [id(Set(1, 2, 3))] = id(Set(1, 2, 3))\n  [id(Map(\"one\", 1, \"two\", 2))] = id(Map(\"one\", 1, \"two\", 2))\n  [id(new Dynamic { name = \"Pigeon\"; age = 42 })] = id(new Dynamic { name = \"Pigeon\"; age = 42 })\n  [id(new Person { name = \"Pigeon\"; age = 42 })] = id(new Person { name = \"Pigeon\"; age = 42 })\n  [id(new Listing { 1; 2; 3 })] = id(new Listing { 1; 2; 3 })\n  [id(new Mapping { [\"one\"] = 1; [\"two\"] = 2 })] = id(new Mapping { [\"one\"] = 1; [\"two\"] = 2 })\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/mapping2.pkl",
    "content": "import \"pkl:test\"\n\nres1 = new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n\nres2 = new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = 1\n  [\"two\"] = this[\"one\"] + 1\n}\n\nres3 = new Mapping {\n  when (false) { [0] = 0 }\n  [\"item one\"] = 1\n  [\"two\"] = this[\"item one\"] + 1\n}\n\nres4 = (res2) {\n  when (false) { [0] = 0 }\n  [\"one\"] = 2\n}\n\nres5 = new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = new Mapping {\n    [\"a\"] = new Mapping {\n      when (false) { [0] = 0 }\n      [\"x\"] = 1\n    }\n    [\"b\"] = new Mapping {\n      when (false) { [0] = 0 }\n      [\"y\"] = 2\n    }\n  }\n  [\"two\"] = new Mapping {\n    when (false) { [0] = 0 }\n    [\"c\"] = new Mapping {\n      when (false) { [0] = 0 }\n      [\"z\"] = 3\n    }\n  }\n}\nres5a = res5[\"one\"]\nres5b = res5[\"one\"][\"a\"]\nres5c = res5[\"one\"][\"a\"][\"x\"]\nres5d = res5[\"one\"][\"b\"]\nres5e = res5[\"one\"][\"b\"][\"y\"]\nres5f = res5[\"two\"]\nres5g = res5[\"two\"][\"c\"]\nres5h = res5[\"two\"][\"c\"][\"z\"]\nres5i = test.catch(() -> res5[\"three\"])\n\nres6 = new Mapping {\n  when (false) { [0] = 0 }\n  [\"one\"] = List(1, 2, 3)\n  [\"two\"] = this[\"one\"] + List(4, 5, 6)\n  [\"three\"] = 3\n}\n\nres7 = (res6) {\n  when (false) { [0] = 0 }\n  [\"one\"] = super[\"one\"] + List(4, 5, 6)\n  [\"three\"] = super[\"three\"] * 2\n}\n\nres8 = new Mapping {\n  when (false) { [0] = 0 }\n  default = (key) -> new Dynamic {\n    name = key\n    age = 42\n  }\n\n  [\"pigeon\"] {}\n  [\"barn owl\"] {}\n  [\"parrot\"] {}\n}\n\nres9 = new Mapping {\n  when (false) { [0] = 0 }\n  default = (key) -> new Dynamic {\n    name = key\n    age = 42\n  }\n\n  [\"pigeon\"] {}\n  [\"barn owl\"] {}\n  [\"parrot\"] {\n    age = 32\n  }\n}\n\nres10 = (res9) {\n  when (false) { [0] = 0 }\n  [\"parrot\"] {}\n  [\"elf owl\"] {}\n  [\"barn owl\"] {\n    age = 22\n  }\n}\n\nres11 = (res1) { when (false) { [0] = 0 } }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/stringKeyNotFound.pkl",
    "content": "hidden x = new Mapping {\n  when (false) { [0] = 0 }\n  [\"xfoo\"] = \"xfoo\"\n  [\"fooy\"] = \"fooy\"\n  [\"fozo\"] = \"fozo\"\n  [\"other\"] = \"other\"\n}\n\nres1 = x[\"foo\"]"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/typeCheck.pkl",
    "content": "import \"pkl:test\"\n\nlocal x1: Mapping<String, List<Int>> = new {\n  when (false) { [0] = 0 }\n  [\"pigeon\"] = List(1, 2, 3)\n  [\"barn owl\"] = 42\n}\n\nlocal x2: Mapping<String, List<Int>> = new {\n  when (false) { [0] = 0 }\n  [\"fr\" + \"ed\"] = List(1) + List(2, 3)\n  [\"bar\" + \"ney\"] = 21 + 21\n}\n\nlocal x3: Mapping<List<Int>, String> = new {\n  when (false) {  [0] = 0 }\n  [List(1, 2, 3)] = \"pigeon\"\n  [42] = \"barn owl\"\n}\n\nlocal x4: Mapping<List<Int>, String> = new {\n  when (false) { [0] = 0 }\n  [List(1) + List(2, 3)] = \"fr\" + \"ed\"\n  [21 + 21] = \"bar\" + \"ney\"\n}\n\nlocal x5: Mapping<String(!isEmpty), String> = new {\n  when (false) { [0] = 0 }\n  [\"\"] = \"pigeon\"\n}\nlocal x6: Mapping<String, String(!isEmpty)> = new {\n  when (false) { [0] = 0 }\n  [\"pigeon\"] = \"\"\n}\n\nres1 = test.catch(() -> x1[\"barn owl\"])\nres2 = test.catch(() -> x2[\"barney\"])\nres3 = test.catch(() -> x3)\nres4 = test.catch(() -> x4)\nres5 = test.catch(() -> x5)\nres6 = test.catch(() -> x6[\"pigeon\"])\n\nhidden x7: Mapping = new {\n  when (true) {\n    [\"first\"] = throw(\"value unnecessarily evaluated\")\n  }\n  for (n in List(1)) {\n    [\"second\"] = throw(\"value unnecessarily evaluated\")\n  }\n}\n\nhidden x8: Mapping<String, Any> = new {\n  when (true) {\n    [\"first\"] = throw(\"value unnecessarily evaluated\")\n  }\n  for (n in List(1)) {\n    [\"second\"] = throw(\"value unnecessarily evaluated\")\n  }\n}\n\nhidden x9: Mapping<String, unknown> = new {\n  when (true) {\n    [\"first\"] = throw(\"value unnecessarily evaluated\")\n  }\n  for (n in List(1)) {\n    [\"second\"] = throw(\"value unnecessarily evaluated\")\n  }\n}\n\nhidden x10 = new Mapping {\n  when (true) {\n    [\"first\"] = throw(\"value unnecessarily evaluated\")\n  }\n  [\"second\"] = 42\n  for (n in List(1)) {\n    [\"third\"] = throw(\"value unnecessarily evaluated\")\n  }\n}\n\nres7 = !x7.isEmpty\nres8 = !x8.isEmpty\nres9 = !x9.isEmpty\nres10 = x10[\"second\"] == 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/mappings2/wrongParent.pkl",
    "content": "import \"pkl:test\"\n\nclass Person {}\n\nres1 = test.catch(() -> (5) { when (false) { [0] = 0 }; [\"pigeon\"] = true })\nres2 = test.catch(() -> new List { when (false) { [0] = 0 }; [\"pigeon\"] = true })\nres3 = test.catch(() -> (List()) { when (false) { [0] = 0 }; [\"pigeon\"] = true })\nres4 = test.catch(() -> new Person { when (false) { [0] = 0 }; [\"pigeon\"] = true })\nres5 = test.catch(() -> new ValueRenderer { when (false) { [0] = 0 }; [\"pigeon\"] = true })\nres6 = test.catch(() -> new Listing { when (false) { [0] = 0 }; [0] = true })\n\nres7 = test.catch(() -> (5) { when (false) { [0] = 0 }; [\"fr\" + \"ed\"] = true })\nres8 = test.catch(() -> new List { when (false) { [0] = 0 }; [\"fr\" + \"ed\"] = true })\nres9 = test.catch(() -> (List()) { when (false) { [0] = 0 }; [\"fr\" + \"ed\"] = true })\nres10 = test.catch(() -> new Person { when (false) { [0] = 0 }; [\"fr\" + \"ed\"] = true })\nres11 = test.catch(() -> new ValueRenderer { when (false) { [0] = 0 }; [\"fr\" + \"ed\"] = true })\nres12 = test.catch(() -> new Listing { when (false) { [0] = 0 }; [0 + 0] = true })\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/methods/methodParameterConstraints1.pkl",
    "content": "class X {\n  function int(int: Int(isPositive)): Int(isPositive) = int\n  function l(l: List<String(!isEmpty)>): List<String(!isEmpty)> = l\n  function map(map: Map<String(!isEmpty), Int(isPositive)>(!isEmpty)): Map<String(!isEmpty), Int(isPositive)>(!isEmpty) = map\n  function nullable(nullable: String(!isEmpty)?): String(!isEmpty)? = nullable\n}\n\nlocal x = new X {}\n\nres0 = x.int(3)\nres1 = x.l(List(\"1\", \"2\"))\nres2 = x.map(Map(\"1\", 1, \"2\", 2))\nres3 = x.nullable(\"1\")\nres4 = x.nullable(null)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/methods/methodParameterConstraints2.pkl",
    "content": "import \"pkl:test\"\n\nclass X {\n  function int(int: Int(isPositive)) = int\n  function l(l: List<String(!isEmpty)>(!isEmpty)) = l\n  function map(map: Map<String(!isEmpty), Int(isPositive)>(!isEmpty)) = map\n  function optional(optional: String(!isEmpty)?) = optional\n}\n\nclass Y {\n  function int(int): Int(isPositive) = int\n  function l(l): List<String(!isEmpty)>(!isEmpty) = l\n  function map(map): Map<String(!isEmpty), Int(isPositive)>(!isEmpty) = map\n  function optional(optional): String(!isEmpty)? = optional\n}\n\nlocal x = new X {}\nres1 = test.catch(() -> x.int(-3))\nres2 = test.catch(() -> x.l(List(\"1\", \"\")))\nres3 = test.catch(() -> x.map(Map(\"1\", 1, \"2\", -2)))\nres4 = test.catch(() -> x.optional(\"\"))\n\nlocal y = new Y {}\nres5 = test.catch(() -> y.int(-3))\nres6 = test.catch(() -> y.l(List(\"1\", \"\")))\nres7 = test.catch(() -> y.map(Map(\"1\", 1, \"2\", -2)))\nres8 = test.catch(() -> y.optional(\"\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/methods/methodParameterTypes1.pkl",
    "content": "import \"pkl:test\"\n\nclass X {\n  function sum(a: Int, b: Int): Int = a + b\n  function sum2(a: Number, b: Number): Number = a + b\n  function sum3(a: Int, b: Int): Int = 1.1 // wrong return type\n}\n\nlocal x = new X {}\n\nres1 = x.sum(1, 2)\nres2 = x.sum2(1, 2)\nres3 = x.sum2(1.1, 2.2)\nres4 = test.catch(() -> x.sum(1.1, 2))\nres5 = test.catch(() -> x.sum2(1.1, \"2\"))\nres6 = test.catch(() -> x.sum3(1, 1))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/methods/methodParameterTypes2.pkl",
    "content": "open class Base\nclass Derived extends Base\nclass Other\n\nclass X {\n  function o(o: Any): Any = o\n\n  function s(s: String, ss: String): String = s + ss\n\n  function b(b: Boolean, c: Boolean): Boolean = b.xor(c)\n\n  function n(n: Number, nn: Number): Number = n + nn\n  function i(i: Int, ii: Int): Int = i + ii\n  function f(e: Float, ee: Float): Float = e + ee\n\n  function duration(d: Duration, dd: Duration): Duration = d + dd\n  function dataSize(d: DataSize, dd: DataSize): DataSize = d + dd\n\n  function collection(c: Collection, cc: Collection): Collection = c + cc\n  function l(l: List, ll: List): List = l + ll\n  function set(s: Set, ss: Set): Set = s + ss\n  function map(m: Map, mm: Map): Map = m + mm\n\n  function base(b: Base, bb: Base): Base = b\n  function derived(d: Derived, dd: Derived): Derived = d\n  function other(o: Other, oo: Other): Other = o\n}\n\nlocal x = new X {}\n\nres1 = x.o(\"hello\")\nres3 = x.s(\"hello\", \"hello\")\n\nres4 = x.o(1)\nres5 = x.n(1, 2)\nres6 = x.i(1, 2)\n\nres7 = x.o(1.2)\nres8 = x.n(1.0, 1.2)\nres9 = x.f(1.0, 1.2)\n\nres10 = x.o(1.s)\nres11 = x.duration(1.s, 3.s)\n\nres12 = x.o(1.mb)\nres13 = x.dataSize(1.mb, 2.mb)\n\nres17 = x.o(List(1, 2))\nres18 = x.collection(List(1, 2), List(3))\nres19 = x.l(List(1, 2), List(3))\n\nres20 = x.o(Set(1, 2))\nres21 = x.collection(Set(1, 2), Set(3))\nres22 = x.set(Set(1, 2), Set(3))\n\nres23 = x.o(Map(1, 2))\nres24 = x.map(Map(1, 2), Map(3, 4))\n\nres25 = x.base(new Base {}, new Base {})\nres26 = x.base(new Derived {}, new Derived {})\nres27 = x.derived(new Derived {}, new Derived {})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/methods/methodParameterTypes3.pkl",
    "content": "class X {\n  function l(l: List<String>): List<String> = l\n  function map(map: Map<String, Int>): Map<String, Int> = map\n  function nullable(nullable: String?): String? = nullable\n  function lambda(lambda: (String) -> Int): (String) -> Int = lambda\n}\n\nlocal x = new X {}\n\nres1 = x.l(List(\"1\", \"2\"))\nres2 = x.map(Map(\"1\", 1, \"2\", 2))\nres3 = x.nullable(\"1\")\nres4 = x.nullable(null)\nres5 = x.lambda((str) -> str.length).apply(\"hello\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule1.pkl",
    "content": "module amendModule1\n\n// basic usage\namends \"library.pkl\"\n\npigeon {\n  name = \"pigeon1\"\n}\n\nname = \"pigeon1\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule2.pkl",
    "content": "amends \"library.pkl\"\n\n// use inherited type\npigeon = new Person {\n  name = \"pigeon2\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule3.pkl",
    "content": "// amend an amended module\namends \"amendModule1.pkl\"\n\npigeon {\n  name = \"pigeon3\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule4.pkl",
    "content": "// amend an extended module\namends \"extendModule1.pkl\"\n\npigeon {\n  name = \"pigeon4\"\n}\n\nparrot {\n  name = \"parrot4\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule5.pkl",
    "content": "// define local members\namends \"library.pkl\"\n\npigeon {\n  name = pigeon5\n}\n\nname = id(new Foo {}.name)\n\nlocal pigeon5 = \"pigeon5\"\n\nlocal function id(arg) = arg\n\nlocal class Foo {\n  name = \"pigeon5\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/amendModule6.pkl",
    "content": "amends \".../input-helper/modules/Birds.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/duplicateFunction.pkl",
    "content": "function foo() = \"foo\"\n\nfoo = \"foo\" // OK\n\nfunction bar() = \"bar\"\n\nfunction foo(arg) = \"other\" // duplicate"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/duplicateProperty1.pkl",
    "content": "import \"pkl:test\"\n\ntest = \"test\" // duplicate\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/duplicateProperty2.pkl",
    "content": "import \"pkl:test\"\n\nclass test // duplicate\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/duplicateProperty3.pkl",
    "content": "test = \"test\" // this is considered the duplicate as ASTGenerator doesn't maintain order between props and classes\n\nclass test"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/equality.pkl",
    "content": "import \"pkl:base\"\nimport \"pkl:base\" as base2\n\nres1 = this == this\nres2 = base == base\nres3 = this == base\nres4 = base == this\nres5 = base == base2\n\nres6 = this != this\nres7 = base != base\nres8 = this != base\nres9 = base != this\nres10 = base != base2\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/extendModule1.pkl",
    "content": "extends \"library.pkl\"\n\nclass Teacher extends Person {\n  subjects: List<String(!isEmpty)>\n}\n\npigeon = (super.pigeon) {\n  name = \"PIGEON\"\n}\n\nparrot: Teacher = new Teacher {\n  name = \"Parrot\"\n  subjects = List(\"Fire making\", \"Stone age\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/externalFunction.pkl",
    "content": "external function foo()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/externalProperty.pkl",
    "content": "external foo: String\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/filename with spaces 2.pkl",
    "content": "otherFile = import(\"filename with spaces.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/filename with spaces.pkl",
    "content": "foo = \"bar\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/functions.pkl",
    "content": "function constant() = 42\n\nfunction square(x) = x * x\n\nfunction charAt(str, idx) = str[idx]\n\nmoduleVar = 3\nfunction plusModuleVar(x) = x + moduleVar\nfunction plusModuleVar2(x) = \"x: \\(x) moduleVar: \\(moduleVar)\"\nfunction nameShadowing(moduleVar) = moduleVar\n\nlocal localVar = 4\nfunction timesLocalVar(x) = x * localVar\n\nfunction thisFn() = this.moduleVar\n\nfunction argCapture(x, y) = new Dynamic { value = x + y + x }\n\nfunction nestedCapture(a) = new Dynamic {\n  b = 3\n  c {\n    d = a\n    x {\n      a = 5\n      y {\n        z = a\n      }\n    }\n  }\n}\n\nres1 = constant()\nres2 = square(3)\nres3 = charAt(\"abcdef\", 4)\nres4 = plusModuleVar(8)\nres5 = plusModuleVar2(5)\nres6 = nameShadowing(7)\nres7 = timesLocalVar(2)\nres8 = thisFn()\nres9 = this.thisFn()\nres10 = argCapture(4, 5).value\nres11 = nestedCapture(99)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidAmend1.pkl",
    "content": "amends \"library.pkl\"\n\n// wrong type\nname = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidAmend2.pkl",
    "content": "amends \"library.pkl\"\n\n// non-existing property\nother = \"parrot\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidAmend3.pkl",
    "content": "amends \"library.pkl\"\n\n// non-local property definition\nname: String = \"parrot\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidAmend4.pkl",
    "content": "amends \"library.pkl\"\n\n// non-local function definition\nfunction foo() = \"parrot\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidAmend5.pkl",
    "content": "amends \"library.pkl\"\n\n// non-local class definition\nclass Other\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidAmend6.pkl",
    "content": "resource = new Resource {\n  // No property foo on Resource\n  foo = \"bar\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidExtend1.pkl",
    "content": "extends \"library.pkl\"\n\n// wrong type\nname = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidExtend2.pkl",
    "content": "// non-open module\nextends \"extendModule1.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidExtend3.pkl",
    "content": "// extend an amended module\nextends \"amendModule1.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/invalidModule1.pkl",
    "content": "module \"DoNotQuote\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/library.pkl",
    "content": "open module my.library\n\nname: String = \"Pigeon\"\n\npigeon: Person = new Person {\n  name = \"Pigeon\"\n}\n\nfunction say(msg: String) = msg\n\nopen class Person {\n  name: String(!isEmpty)\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/lists.pkl",
    "content": "x = List(\n  List(1, 2),\n  List(3, 4)\n)"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/objects.pkl",
    "content": "x {\n  y {\n    z = 1\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/recursiveModule1.pkl",
    "content": "import \"recursiveModule2.pkl\"\n\nclass Foo {\n  bar: recursiveModule2.Bar?\n}\n\nfoo: Foo = new {\n  bar {\n    foo = new Foo {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/recursiveModule2.pkl",
    "content": "import \"recursiveModule1.pkl\"\n\nclass Bar {\n  foo: recursiveModule1.Foo\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls1.pkl",
    "content": "open module supercalls1\n\nprefix = \"\"\nfunction say(msg) = prefix + msg\nfunction sameMethod() = 1\nsameProp = \"a\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls2.pkl",
    "content": "open module supercalls2\n\nextends \"supercalls1.pkl\"\n\nhidden pigeon = super.say(\"Pigeon\")\nfunction barnOwl() = super.say(\"Barn Owl\")\nfunction say2(msg) = super.say(msg) + super.say(msg)\nfunction sameMethod() = 2 + super.sameMethod()\nsameProp = super.sameProp + \"b\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/supercalls3.pkl",
    "content": "module supercalls3\n\nextends \"supercalls2.pkl\"\n\nimport \"pkl:test\"\n\nhidden pigeonBarnOwl = super.pigeon + super.barnOwl()\nfunction barnOwlPigeon() = super.barnOwl() + super.pigeon\nhidden parrot = super.say(\"Parrot\")\nfunction other() = super.other()\nfunction sameMethod() = 3 + super.sameMethod()\nsameProp = super.sameProp + \"c\"\n\nprefix = \"Oh \"\n\nres1 = pigeon\nres2 = barnOwl()\nres3 = say2(\"Parrot\")\nres4 = pigeonBarnOwl\nres5 = barnOwlPigeon()\nres6 = parrot\nres7 = test.catch(() -> other())\nres8 = sameMethod()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/typedModuleMethods1.pkl",
    "content": "import \"pkl:test\"\n\nimport \"library.pkl\"\n\nfunction zeroArgs(): String(!isEmpty) = \"Pigeon\"\n\nfunction oneArg(a: String(!isEmpty)): String(!isEmpty) = a\n\nfunction twoArgs(a: String(!isEmpty), b: String(!isEmpty)): String(!isEmpty) = a + b\n\nfunction mixed(a: String(!isEmpty), b) = a + b\n\nres1 = zeroArgs()\nres2 = oneArg(\"Pigeon\")\nres3 = twoArgs(\"Pigeon\", \"Parrot\")\nres4 = mixed(\"Pigeon\", \"Parrot\")\nres5 = library.say(\"Pigeon\")\n\nres6 = test.catch(() -> oneArg(42))\nres7 = test.catch(() -> twoArgs(\"Pigeon\", 42))\nres8 = test.catch(() -> mixed(42, \"Pigeon\"))\nres9 = test.catch(() -> library.say(42))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/typedModuleProperties1.pkl",
    "content": "import \"library.pkl\"\n\nres1: String = \"str\"\nres2: String(!isEmpty) = \"str\"\nres3: library.Person = new library.Person {\n  name = \"Pigeon\"\n}\nres4: library.Person = new Teacher {\n  name = \"Parrot\"\n  subjects = List(\"Fire making, Stone age\")\n}\n\nclass Teacher extends library.Person {\n  subjects: List<String(!isEmpty)>\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/typedModuleProperties2.pkl",
    "content": "res1: String = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/typedModuleProperties3.pkl",
    "content": "res1: String(!isEmpty) = \"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/日本語.pkl",
    "content": "// covers https://github.com/apple/pkl/issues/653\n日本語 = \"Japanese language\"\nreadOne = read(\"日本語.pkl\").text\nreadGlob = read*(\"./日*.pkl\").keys\nimportOne = import(\"日本語.pkl\").readOne\nimportGlob = import*(\"./日*.pkl\").keys\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/modules/日本語_error.pkl",
    "content": "// covers https://github.com/apple/pkl/issues/653\n日本語 = throw(\"Error reporting should also handle unicode filenames!\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/closure.pkl",
    "content": "function closeOverFunctionArg(x) = new Dynamic { value = x }\n\nres1 = closeOverFunctionArg(4).value\n\nhidden closeOverLambdaArg = (x) -> new Dynamic { value = x }\n\nres2 = closeOverLambdaArg.apply(4).value\n\nfunction closeOverFunctionAndLambdaArg(x) = (y) -> new Dynamic { value = y + x }\n\nres3 = closeOverFunctionAndLambdaArg(4).apply(5).value\n\nhidden closeOverTwoLambdaArgs = (x) -> (y) -> new Dynamic { value = y + x }\n\nres4 = closeOverTwoLambdaArgs.apply(4).apply(5).value\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/configureObjectAssign.pkl",
    "content": "x {\n  foo {\n    bar {\n      num1 = 1\n      num2 = 2\n    }\n    baz {\n      num3 = 3\n    }\n  }\n}\n\ny = (x) {\n  foo {\n    bar {\n      num1 = 11\n      str = \"str\"\n    }\n    baz2 {\n      num4 = 4\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/duplicateProperty.pkl",
    "content": "obj {\n  prop1 = \"prop1\"\n  prop2 = \"prop2\"\n  prop1 = \"other\" // duplicate\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/equality.pkl",
    "content": "a1 = new Dynamic {} == new Dynamic {}\na2 = new Dynamic { foo = 1 } == new Dynamic { foo = 1 }\na3 = new Dynamic { foo = 1; bar = \"two\" } == new Dynamic { foo = 1; bar = \"two\" }\na4 = new Dynamic { foo = 1; bar = \"two\" } == new Dynamic { bar = \"two\"; foo = 1 }\na5 = new Dynamic { foo = 1; bar = \"two\" } == new Dynamic { foo = 1; bar = \"one\" }\na6 = new Dynamic { foo = 1; bar = \"two\" } == new Dynamic { foo = 1; bar = \"two\"; baz = \"two\" }\na7 = new Dynamic { foo = 1 } == new Dynamic { bar = \"two\" }\na8 = new Dynamic { foo = x; local x = 1 } == new Dynamic { foo = 1 }\na9 = new Dynamic { foo = x; local x = 1 } == new Dynamic { foo = y; local y = 1 }\na10 = new Dynamic { foo = x; local x = 1; local `_` = 2 } == new Dynamic { foo = 1 }\na11 = new Dynamic { foo = x; local x = 1 } { bar = y; local y = 2 } == new Dynamic { foo = 1; bar = 2 }\n\nlocal obj1 {\n  foo = 1\n}\nlocal obj2 {\n  foo = 1\n  bar = \"two\"\n}\nlocal obj3 {\n  bar = \"two\"\n  foo = 1\n}\n\nb1 = (obj1) {} == new Dynamic { foo = 1 }\nb2 = (obj1) { bar = \"two\" } == obj2\nb3 = (obj1) { bar = \"two\" } == (obj2) {}\nb4 = (obj1) { bar = \"two\" } == (obj2) { bar = \"two\" }\nb5 = (obj1) { bar = \"two\" } == (obj2) { foo = 1 }\nb6 = (obj1) { bar = \"two\" } == obj3\nb7 = (obj1) { baz = \"two\" } == obj3\nb8 = (obj1) { bar = \"three\" } == obj3\n\nclass Person {\n  name = \"Pigeon\"\n  age: Int?\n  street: String\n}\n\nclass Person2 {\n  name = \"Pigeon\"\n  age: Int?\n  street: String\n}\n\nc1 = new Person {} == Person\nc2 = new Person {} == new Person2 {}\nc3 = new Person { street = \"Fulton St.\" } == new Person { street = \"Fulton St.\" }\nc4 = new Person { street = \"Fulton St.\" } == new Person2 { street = \"Fulton St.\" }\nc5 = new Person { age = 40; street = \"Fulton St.\" } == new Person { street = \"Fulton St.\"; age = 40 }\nc6 = new Person { age = 80; street = \"Fulton St.\" } == new Person { street = \"Fulton St.\"; age = 40 }\nc7 = \n  new Person { age = x; local x = 40; street = y; local y = \"Fulton St.\" } ==\n    new Person { street = \"Fulton St.\"; age = 40 }\nc8 =\n  new Person { age = x; local x = 40; street = y; local y = \"Fulton St.\" } ==\n    new Person { age = x2; local x2 = 40; street = y2; local y2 = \"Fulton St.\" }\n\nclass Person3 {\n  name: String\n  age: Int\n  hidden street: String\n}\n\n// equal by definition\nlocal person3_1 = new Person3 { name = \"Pigeon\"; age = 42 }\nlocal person3_2 = new Person3 { name = \"Pigeon\"; age = 42; street = \"Fox St.\" }\nlocal person3_3 = new Person3 { name = street; age = 42; street = \"Pigeon\" }\n\nd1 = person3_1 == person3_2\nd2 = person3_2 == person3_1\nd3 = person3_1 == person3_3\nd4 = person3_3 == person3_1\n\nclass Person4 {\n  name: String\n  age: Int\n  hidden street: String\n  hidden hobby: String\n}\n\n// equal by definition\nlocal person4_1 = new Person4 { name = \"Pigeon\"; age = 42 }\nlocal person4_2 = new Person4 { name = \"Pigeon\"; age = 42; street = \"Fox St.\" }\nlocal person4_3 = new Person4 { name = \"Pigeon\"; age = 42; street = \"Fox St.\"; hobby = \"swimming\" }\n\ne1 = person4_1 == person4_2\ne2 = person4_2 == person4_3\ne3 = person4_3 == person4_1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/hashCode.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nlocal class Person { name: String }\n\nlocal open class Person2 { name: String; hidden age: Int }\n\nlocal class Teenager extends Person2 { age = 15 }\n\nfacts {\n  local set: Set<Int> = IntSeq(1, 100).fold(Set(), (res, n) -> res.add(n))\n  \n  [\"local members aren't included in hash code - Dynamic\"] {\n    local obj1 = new Dynamic { name = \"Pigeon\" }\n    local obj2 = new Dynamic { name = x; local x = \"Pigeon\" }\n    local obj3 = new Dynamic { name = x; local x = \"Pigeon\" } { name = y; local y = \"Pigeon\" }\n    \n    set.add(obj1).contains(obj2)\n    set.add(obj2).contains(obj3)\n    set.add(obj3).contains(obj2)\n    set.add(obj1).add(obj2).add(obj3).length == 101\n  }\n\n  [\"local members aren't included in hash code - Typed\"] {\n    local obj1 = new Person { name = \"Pigeon\" }\n    local obj2 = new Person { name = x; local x = \"Pigeon\" }\n    local obj3 = new Person { name = x; local x = \"Pigeon\" } { name = y; local y = \"Pigeon\" }\n\n    set.add(obj1).contains(obj2)\n    set.add(obj2).contains(obj3)\n    set.add(obj3).contains(obj2)\n    set.add(obj1).add(obj2).add(obj3).length == 101\n  }\n\n  [\"hidden members aren't included in hash code - Dynamic\"] {\n    local obj1 = new Dynamic { name = \"Pigeon\" }\n    local obj2 = new Dynamic { name = \"Pigeon\"; default = (_) -> 42 }\n\n    set.add(obj1).contains(obj2)\n    set.add(obj2).contains(obj1)\n    set.add(obj1).add(obj2).length == 101\n  }\n\n  [\"hidden members aren't included in hash code - Typed\"] {\n    local obj1 = new Person2 { name = \"Pigeon\" }\n    local obj2 = new Person2 { name = \"Pigeon\"; age = 42 }\n\n    set.add(obj1).contains(obj2)\n    set.add(obj2).contains(obj1)\n    set.add(obj1).add(obj2).length == 101\n  }\n\n  [\"hidden members of superclass aren't included in hash code - Typed\"] {\n    local obj = new Teenager { name = \"Jojo\" }\n    set.add(obj).length == 101\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/implicitReceiver1.pkl",
    "content": "x = 0\nfoo {\n  x = 1\n  bar {\n    x = 2\n    y = x + 3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/implicitReceiver2.pkl",
    "content": "x = 0\nfoo {\n  x = 1\n  bar {\n    y = x + 3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/implicitReceiver3.pkl",
    "content": "x = 0\nfoo {\n  bar {\n    y = x + 3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/implicitReceiver4.pkl",
    "content": "foo {\n  bar {\n    y = x + 3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/inequality.pkl",
    "content": "res1 = new Dynamic {} != new Dynamic {}\nres2 = new Dynamic { foo = 1 } != new Dynamic { foo = 1 }\nres3 = new Dynamic { foo = 1; bar = \"two\" } != new Dynamic { foo = 1; bar = \"two\" }\nres4 = new Dynamic { foo = 1; bar = \"two\" } != new Dynamic { bar = \"two\"; foo = 1 }\nres5 = new Dynamic { foo = 1; bar = \"two\" } != new Dynamic { foo = 1; bar = \"one\" }\nres6 = new Dynamic { foo = 1; bar = \"two\" } != new Dynamic { foo = 1; bar = \"two\"; baz = \"two\" }\nres7 = new Dynamic { foo = 1 } != new Dynamic { bar = \"two\" }\n\nlocal obj1 {\n  foo = 1\n}\nlocal obj2 {\n  foo = 1\n  bar = \"two\"\n}\nlocal obj3 {\n  bar = \"two\"\n  foo = 1\n}\n\nres8 = (obj1) {} != new Dynamic { foo = 1 }\nres9 = (obj1) { bar = \"two\" } != obj2\nres10 = (obj1) { bar = \"two\" } != (obj2) {}\nres11 = (obj1) { bar = \"two\" } != (obj2) { bar = \"two\" }\nres12 = (obj1) { bar = \"two\" } != (obj2) { foo = 1 }\nres13 = (obj1) { bar = \"two\" } != obj3\nres14 = (obj1) { baz = \"two\" } != obj3\nres15 = (obj1) { bar = \"three\" } != obj3\n\nclass Person {\n  name = \"Pigeon\"\n  age: Int?\n  street: String\n}\n\nclass Person2 {\n  name = \"Pigeon\"\n  age: Int?\n  street: String\n}\n\nres16 = new Person {} != Person\nres17 = new Person {} != new Person2 {}\nres18 = new Person { street = \"Fulton St.\" } != new Person { street = \"Fulton St.\" }\nres19 = new Person { street = \"Fulton St.\" } != new Person2 { street = \"Fulton St.\" }\nres20 = new Person { age = 40; street = \"Fulton St.\" } != new Person { street = \"Fulton St.\"; age = 40 }\nres21 = new Person { age = 80; street = \"Fulton St.\" } != new Person { street = \"Fulton St.\"; age = 40 }\n\nclass Person3 {\n  name: String\n  age: Int\n  hidden street: String\n}\n\n// equal by definition\nlocal person3_1 = new Person3 { name = \"Pigeon\"; age = 42 }\nlocal person3_2 = new Person3 { name = \"Pigeon\"; age = 42; street = \"Fox St.\" }\nlocal person3_3 = new Person3 { name = street; age = 42; street = \"Pigeon\" }\n\nres22 = person3_1 != person3_2\nres23 = person3_2 != person3_1\nres24 = person3_1 != person3_3\nres25 = person3_3 != person3_1\n\nclass Person4 {\n  name: String\n  age: Int\n  hidden street: String\n  hidden hobby: String\n}\n\n// equal by definition\nlocal person4_1 = new Person4 { name = \"Pigeon\"; age = 42 }\nlocal person4_2 = new Person4 { name = \"Pigeon\"; age = 42; street = \"Fox St.\" }\nlocal person4_3 = new Person4 { name = \"Pigeon\"; age = 42; street = \"Fox St.\"; hobby = \"swimming\" }\n\nres26 = person4_1 != person4_2\nres27 = person4_2 != person4_3\nres28 = person4_3 != person4_1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/lateBinding1.pkl",
    "content": "v1 {\n  foo {\n    x = y\n    y = 3\n  }\n}\n\nv2 = (v1) {\n  foo {\n    y = 4\n  }\n}\n\nv3 = (v1) {\n  y = 5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/lateBinding2.pkl",
    "content": "v1 {\n  foo {\n    x = y\n  }\n  y = 3\n}\n\nv2 = (v1) {\n  y = 4\n}\n\nv3 = (v1) {\n  foo {\n    y = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/lateBinding3.pkl",
    "content": "class Foo {\n  x: Int\n  y = 1\n}\n\nv1 {\n  foo = new Foo {\n    x = y\n  }\n  y = 3\n}\n\nv2 = (v1) {\n  y = 4\n}\n\nv3 = (v1) {\n  foo {\n    y = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/lateBinding4.pkl",
    "content": "class Foo {\n  x: Int\n  y = 1\n}\n\nv1 {\n  foo = new Foo {\n    x = y\n  }\n}\n\nv2 = (v1) {\n  y = 4\n}\n\nv3 = (v1) {\n  foo {\n    y = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/outer.pkl",
    "content": "res1 {\n  x = 1\n  y {\n    z = outer.x\n  }\n}\n\nres2 = (res1) {\n  x = 2\n}\n\nres3 {\n  x = 1\n  y {\n    x = 3\n    z = outer.x\n  }\n}\n\nres4 = (res3) {\n  x = 2\n  y {\n    x = 4\n  }\n}\n\n// chaining of outer (e.g. outer.outer) isn't currently supported,\n// and would need to be represented as a single GetEnclosingReceiverNode\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/outer2.pkl",
    "content": "res1 {\n  x {\n    y = 1\n    z = outer.y\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/super1.pkl",
    "content": "parent {\n  x = 1\n  y = 2\n}\n\nchild = (parent) {\n  x = super.x + super.y + super.x\n  y = 3\n}\n\ngrandChild = (child) {\n  x = 5\n  y = super.x * 3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/super2.pkl",
    "content": "parent {\n x = 1 + y\n y = 2\n}\n\nchild = (parent) {\n  x = super.x + 100\n  y = 3\n}\n\ngrandChild = (child) {\n  y = 4\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/super3.pkl",
    "content": "parent {\n x = 1 + y\n y = 2\n}\n\nchild = (parent) {\n  y = 3\n}\n\ngrandChild = (child) {\n  x = super.x + 100\n  y = 4\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/super4.pkl",
    "content": "parent {\n x = 1 + y\n y = 2\n}\n\nchild = (parent) {\n  x = super.x + 100\n  y = 3\n}\n\ngrandChild = (child) {\n  x = super.x + 200\n  y = 4\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/super5.pkl",
    "content": "res1 {\n  x = 42\n}\n\nres2 = (res1) {\n  x = (() -> super.x).apply() + 1\n}\n\nres3 = (res2) {\n  x = (() -> (() -> super.x).apply()).apply() + 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/this1.pkl",
    "content": "foo {\n  bar = this.baz + 1\n  baz = 3\n}"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/objects/this2.pkl",
    "content": "res1 {\n  x = 42\n}\n\nres2 = (res1) {\n  y = (() -> this.x).apply() + 1\n}\n\nres3 = (res2) {\n  z = (() -> (() -> this.y).apply()).apply() + 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport1.error.pkl",
    "content": "// no semver\nres = import(\"package://localhost:0/foo#/bar.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport10.error.pkl",
    "content": "res = import(\"package://localhost:0/birds@0.5.0::invalidalgo:abc123#/catalog/Bird.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport11.error.pkl",
    "content": "res = import(\"package://localhost:0/birds@0.5.0::boguschecksumpart#/catalog/Bird.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport2.error.pkl",
    "content": "// invalid semver\nres = import(\"package://localhost:0/foo@notAVersion#/bar.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport3.error.pkl",
    "content": "// no fragment\nres = import(\"package://localhost:0/bar/baz@1.0.0\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport4.error.pkl",
    "content": "// fragment path must be absolute\nres = import(\"package://localhost:0/birds@0.5.0#catalog/Swallow.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport6.error.pkl",
    "content": "import \"package://localhost:0/badPackageZipUrl@1.0.0#/Bug.pkl\"\n\nres: Bug\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport7.error.pkl",
    "content": "res = import(\"package://localhost:0/badMetadataJson@1.0.0#/Bug.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport8.error.pkl",
    "content": "res = import(\"package://localhost:0/badImportsWithinPackage@1.0.0#/unknownDependency.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badImport9.error.pkl",
    "content": "res = import(\"package://localhost:0/badImportsWithinPackage@1.0.0#/invalidPath.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badRead1.error.pkl",
    "content": "// no semver\nres = read(\"package://localhost:0/foo#/bar.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badRead2.error.pkl",
    "content": "// invalid semver\nres = read(\"package://localhost:0/foo@notAVersion#/bar.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badRead3.error.pkl",
    "content": "// no fragment\nres = read(\"package://localhost:0/bar/baz@1.0.0\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badRead4.error.pkl",
    "content": "// fragment path must be absolute\nres = read(\"package://localhost:0/birds@0.5.0#catalog/Swallow.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badRead8.error.pkl",
    "content": "res = import(\"package://localhost:0/badImportsWithinPackage@1.0.0#/unknownDependencyRead.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/badRead9.error.pkl",
    "content": "res = import(\"package://localhost:0/badImportsWithinPackage@1.0.0#/invalidPathRead.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/packages1.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\nimport \"package://localhost:0/fruit@1.0.5#/Fruit.pkl\"\n\nexamples {\n  [\"basic imports\"] {\n    new Bird { \n      name = \"Pigeon\"\n      // purposefully instantiate a Fruit to verify that the types match up.\n      favoriteFruit = new Fruit {\n        name = \"Banana\"\n      }\n    }\n    import(\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\")\n    import(\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\")\n  }\n  [\"importing while specifying checksum\"] {\n    import(\"package://localhost:0/birds@0.5.0::sha256:b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de#/catalog/Swallow.pkl\")\n  }\n  [\"reads\"] {\n    read(\"package://localhost:0/birds@0.5.0#/Bird.pkl\")\n    read(\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\")\n    read(\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/packages2.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"glob import\"] {\n    import*(\"package://localhost:0/birds@0.5.0#/catalog/*.pkl\")\n  }\n  [\"glob import within package\"] {\n    import(\"package://localhost:0/birds@0.5.0#/catalog.pkl\").catalog\n  }\n  [\"glob import transitive dep within package\"] {\n    import(\"package://localhost:0/birds@0.5.0#/allFruit.pkl\").fruit\n  }\n  [\"glob read\"] {\n    read*(\"package://localhost:0/birds@0.5.0#/catalog/*.pkl\")\n  }\n  [\"glob read within package\"] {\n    import(\"package://localhost:0/birds@0.5.0#/catalog.pkl\").catalogFiles\n  }\n  [\"glob read transitive dep within package\"] {\n    import(\"package://localhost:0/birds@0.5.0#/allFruit.pkl\").fruitFiles\n  }\n  [\"glob import while specifying checksum\"] {\n    import*(\"package://localhost:0/birds@0.5.0::sha256:b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de#/catalog/*.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/packages/redirects.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"permanent redirect is followed\"] {\n    import(\"package://localhost:0/HTTP301/birds@0.5.0#/catalog/Swallow.pkl\")\n  }\n\n  [\"temporary redirect is followed\"] {\n    import(\"package://localhost:0/HTTP307/birds@0.5.0#/catalog/Swallow.pkl\")\n  }\n  \n  [\"double redirect is followed\"] {\n    import(\"package://localhost:0/HTTP301/HTTP307/birds@0.5.0#/catalog/Swallow.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/amendsRequiresParens.pkl",
    "content": "foo {\n  (bar { \"baz\" })\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/constantStringInterpolation.pkl",
    "content": "import \"\\(name).pkl\"\n\nname = \"Bird\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/constraintsTrailingComma.pkl",
    "content": "res1: Int(isEven, isNonZero, isBetween(-10, 10), ) = 6\nres2: Int(\n    isEven, isNonZero, isBetween(-10, 10),\n) = 6\nres3: Int(\n    isEven,\n    isNonZero,\n    isBetween(-10, 10),\n) = 6\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/invalidCharacter.pkl",
    "content": "foo = 1 ^ 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/lambdaTrailingCommas.pkl",
    "content": "local lA1 = (a, b, c,) -> true\nlocal lA2 = (\n  a, b, c,\n) -> true\nlocal lA3 = (\n  a,\n  b,\n  c,\n) -> true\n\nlocal lB1 = (a: Int, b: Int, c: Int,) -> true\nlocal lB2 = (\n  a: Int, b: Int, c: Int,\n) -> true\nlocal lB3 = (\n  a: Int,\n  b: Int,\n  c: Int,\n) -> true\n\nlocal lC1: (Dynamic,) -> Dynamic = new Mixin { a, -> x = true }\nlocal lC2: (Dynamic,) -> Dynamic = new Mixin { a, ->\n  x = true\n}\nlocal lC3: (Dynamic,) -> Dynamic = new Mixin {\n  a, -> x = true\n}\nlocal lC4: (Dynamic,) -> Dynamic = new Mixin {\n  a, ->\n  x = true\n}\n\nlocal lD1: (Dynamic,) -> Dynamic = new Mixin { a: Dynamic, -> x = true }\nlocal lD2: (Dynamic,) -> Dynamic = new Mixin { a: Dynamic, ->\n  x = true\n}\nlocal lD3: (Dynamic,) -> Dynamic = new Mixin {\n  a: Dynamic, -> x = true\n}\nlocal lD4: (Dynamic,) -> Dynamic = new Mixin {\n  a: Dynamic, ->\n  x = true\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/lineCommentBetween.pkl",
    "content": "import \"pkl:reflect\"\n\n/// doc comment\n// line comments can appear between doc comments\n/*\n block comments also\n*/\n/// doc continuation\nfoo = 1\n\ntheComment = reflect.Class(module.getClass()).properties[\"foo\"].docComment\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/methodTrailingCommas.pkl",
    "content": "function moduleMethodA1(a, b, c, ) = true\nfunction moduleMethodA2(\n  a, b, c,\n) = true\nfunction moduleMethodA3(\n  a,\n  b,\n  c,\n) = true\nfunction moduleMethodB1(a: Int, b: Int, c: Int, ) = true\nfunction moduleMethodB2(\n  a: Int, b: Int, c: Int,\n) = true\nfunction moduleMethodB3(\n  a: Int,\n  b: Int,\n  c: Int,\n) = true\n\nclass A {\n  function classMethodA1(a, b, c, ) = true\n  function classMethodA2(\n    a, b, c,\n  ) = true\n  function classMethodA3(\n    a,\n    b,\n    c,\n  ) = true\n  function classMethodB1(a: Int, b: Int, c: Int, ) = true\n  function classMethodB2(\n    a: Int, b: Int, c: Int,\n  ) = true\n  function classMethodB3(\n    a: Int,\n    b: Int,\n    c: Int,\n  ) = true\n}\n\nmoduleMethodA1Call1 = moduleMethodA1(1, 2, 3, )\nmoduleMethodA1Call2 = moduleMethodA1(\n  1, 2, 3,\n)\nmoduleMethodA1Call3 = moduleMethodA1(\n  1,\n  2,\n  3,\n)\nmoduleMethodA2Call1 = moduleMethodA2(1, 2, 3, )\nmoduleMethodA2Call2 = moduleMethodA2(\n  1, 2, 3,\n)\nmoduleMethodA2Call3 = moduleMethodA2(\n  1,\n  2,\n  3,\n)\n\nmoduleMethodA3Call1 = moduleMethodA3(1, 2, 3, )\nmoduleMethodA3Call2 = moduleMethodA3(\n  1, 2, 3,\n)\nmoduleMethodA3Call3 = moduleMethodA3(\n  1,\n  2,\n  3,\n)\n\nmoduleMethodB1Call1 = moduleMethodB1(1, 2, 3, )\nmoduleMethodB1Call2 = moduleMethodB1(\n  1, 2, 3,\n)\nmoduleMethodB1Call3 = moduleMethodB1(\n  1,\n  2,\n  3,\n)\nmoduleMethodB2Call1 = moduleMethodB2(1, 2, 3, )\nmoduleMethodB2Call2 = moduleMethodB2(\n  1, 2, 3,\n)\nmoduleMethodB2Call3 = moduleMethodB2(\n  1,\n  2,\n  3,\n)\n\nmoduleMethodB3Call1 = moduleMethodB3(1, 2, 3, )\nmoduleMethodB3Call2 = moduleMethodB3(\n  1, 2, 3,\n)\nmoduleMethodB3Call3 = moduleMethodB3(\n  1,\n  2,\n  3,\n)\n\nlocal a: A = new {}\n\nclassMethodA1Call1 = a.classMethodA1(1, 2, 3, )\nclassMethodA1Call2 = a.classMethodA1(\n  1, 2, 3,\n)\nclassMethodA1Call3 = a.classMethodA1(\n  1,\n  2,\n  3,\n)\nclassMethodA2Call1 = a.classMethodA2(1, 2, 3, )\nclassMethodA2Call2 = a.classMethodA2(\n  1, 2, 3,\n)\nclassMethodA2Call3 = a.classMethodA2(\n  1,\n  2,\n  3,\n)\n\nclassMethodA3Call1 = a.classMethodA3(1, 2, 3, )\nclassMethodA3Call2 = a.classMethodA3(\n  1, 2, 3,\n)\nclassMethodA3Call3 = a.classMethodA3(\n  1,\n  2,\n  3,\n)\n\nclassMethodB1Call1 = a.classMethodB1(1, 2, 3, )\nclassMethodB1Call2 = a.classMethodB1(\n  1, 2, 3,\n)\nclassMethodB1Call3 = a.classMethodB1(\n  1,\n  2,\n  3,\n)\nclassMethodB2Call1 = a.classMethodB2(1, 2, 3, )\nclassMethodB2Call2 = a.classMethodB2(\n  1, 2, 3,\n)\nclassMethodB2Call3 = a.classMethodB2(\n  1,\n  2,\n  3,\n)\n\nclassMethodB3Call1 = a.classMethodB3(1, 2, 3, )\nclassMethodB3Call2 = a.classMethodB3(\n  1, 2, 3,\n)\nclassMethodB3Call3 = a.classMethodB3(\n  1,\n  2,\n  3,\n)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/newline.pkl",
    "content": "amends \"../snippetTest.pkl\"\n\nfacts {\n  [\"parsed as two expressions because `String<newline>(foo)` is not a syntactically valid constrained type\"] {\n    local foo = 42\n    new Listing {\n      foo is (String) -> String\n      (foo) is (String) -> String\n    }.length == 2 // used to return 1\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/spacesBetweenDocComments.pkl",
    "content": "/// doc comment start\n\n/// doc comment continuation\nfoo = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/spread.pkl",
    "content": "\nlocal baz = new Dynamic {}\n\nlocal foo = new Dynamic {\n  bar = 1\n}\n\nqux {\n  (foo) {\n    ...super.bar\n    (baz) {\n      qux = 1\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/trailingCommas.pkl",
    "content": "res1: Mapping<String, String,>(!isEmpty) = new Mapping<String, String,> {\n  [\"hello\"] = \"world\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/typeAnnotationInAmends.pkl",
    "content": "bird: Listing<String> {\n  \"Crow\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/parser/wrongDocComment.pkl",
    "content": "/// not a valid doc comment\nimport \"../../input-helper/basic/read/module1.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/basic.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1 = \"bar\"\nres2 = \"\"\nres3 = 1\nres4 = 2.3\nres5 = true\nres6 = false\nres7 = null \n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/classes.msgpack.yaml.pkl",
    "content": "module com.foo.bar.MyModule\n\nextends \".../pklbinaryTest.pkl\"\n\nclass Person {\n  firstName: String\n  lastName: String\n  age: Int\n}\n\nbarnOwl: Person = new {\n  firstName = \"Barn Owl\"\n  lastName = \"Bird\"\n  age = 38\n}\n\npigeon: Person = new {\n  firstName = \"Pigeon\"\n  lastName = \"Bird\"\n  age = 41\n}\n\ntypealias MyPerson = Person\n\npersonClass = Person\n\npersonTypeAlias = MyPerson\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/datasize.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1: DataSize = 1.b\nres2: DataSize = 2.kb\nres3: DataSize = 3.kib\nres4: DataSize = 4.mb\nres5: DataSize = 5.mib\nres6: DataSize = 6.gb\nres7: DataSize = 7.gib\nres8: DataSize = 8.tb\nres9: DataSize = 9.tib\nres10: DataSize = 10.pb\nres11: DataSize = 11.pib\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/duration.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1 = 1.ns\nres2 = 2.us\nres3 = 3.ms\nres4 = 4.s\nres5 = 5.min\nres6 = 6.h\nres7 = 7.d\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/intseq.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1 = IntSeq(1, 3)\nres2 = IntSeq(1, 4).step(5)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/list.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1: List<Int> = List(1, 3, 5, 7)\nres2: Listing<Int> = new { 2; 4; 6; 8 }\nres3: List<Int> = List()\nres4: Listing<Int> = new {}\nres5: List<List<Int>> = List(List(1, 2))\nres6: Listing<Listing<Int>> = new { new { 1; 2 } }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/map.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1: Map = Map(\"foo\", 1, \"bar\", 2)\nres2: Mapping = new {\n  [\"foo\"] = 1\n  [\"bar\"] = 2\n}\nres3: Mapping = new {\n  [\"childMap\"] = new Mapping {\n    [\"childFoo\"] = 3\n  }\n}\nres4: Mapping = new {\n  [Map(\"foo\", 1)] = new Mapping {\n    [\"bar\"] = 2\n  }\n}\n// https://github.com/apple/pkl/issues/1151\nres5: Mapping = new {\n  local self = this\n  [\"foo\"] = new Dynamic { name = \"foo\" }\n  [\"bar\"] = new Dynamic { name = self[\"foo\"].name + \"bar\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/pair.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1 = Pair(1, 2)\nres2 = Pair(\"foo\", \"bar\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/regex.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1 = Regex(\"abc\")\nres2 = Regex(\"\")\nres3 = Regex(\"(?m)^abc$\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinary/set.msgpack.yaml.pkl",
    "content": "extends \".../pklbinaryTest.pkl\"\n\nres1: Set<Int> = Set(1, 3, 5, 7)\nres2: Set<Int> = Set()\nres3: Set<Any> = Set(1, true, \"\", null)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/pklbinaryTest.pkl",
    "content": "open module pklbinaryTest\n\nimport \"pkl:pklbinary\"\n\noutput {\n  // ensure no output file written for this specific module, only children that add properties\n  when (module.toMap().isEmpty) {\n    text = \"\"\n  } else {\n    value = if (module.toMap().isEmpty) \"\" else module\n    renderer = new pklbinary.Renderer {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badLocalProject/PklProject",
    "content": "// valid PklProject, but not valid as a local dependency because it is missing a `package` section.\namends \"pkl:Project\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badLocalProject/dog.pkl",
    "content": "name = \"Dog\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badPklProject1/PklProject",
    "content": "/// This is a thing!!!\nmodule invalid.project.Module\n\nfoo: String = \"hello\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badPklProject1/bug.pkl",
    "content": "res = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badPklProject2/PklProject",
    "content": "output {\n  value = 5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badPklProject2/bug.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badPklProject3/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage = new Mapping {\n  [\"foo\"] = \"bar\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badPklProject3/bug.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps1/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps1/PklProject.deps.json",
    "content": "this is not json\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps1/bug.pkl",
    "content": "import \"@bird/Bird.pkl\"\n\nres: Bird = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps2/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps2/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"invalidPackageUri\": {\n      \"type\": \"remote\",\n      \"uri\": \"package:/invalidPackageUri\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps2/bug.pkl",
    "content": "import \"@bird/Bird.pkl\"\n\nres: Bird = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps3/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps3/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps3/bug.pkl",
    "content": "import \"@bird/Bird.pkl\"\n\nbird: Bird\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps4/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"badLocalProject\"] = import(\"PklProject\")\n}\n\n// hack: override the project file URI so that our tests render the same error message\n// across different machines (it will truncate at 100 chars, and otherwise would be influenced by\n// where the pkl project is placed within the file tree).\nprojectFileUri = \"file:///$snippetsDir/projects/badProjectDeps4/PklProject\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps4/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"badLocalProject\": {\n      \"type\": \"local\",\n      \"path\": \"../badLocalProject\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps4/bug.pkl",
    "content": "import \"@badLocalProject/dog.pkl\"\n\nres = dog\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps5/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    // Should fail because dependency is out of date (PklProject.deps.json version is older)\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps5/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/birds@0\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.0.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps5/bug.pkl",
    "content": "// Should fail because dependency is out of date (PklProject.deps.json version is older)\nimport \"@birds/Bird.pkl\"\n\nbird: Bird\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps6/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    // out of date because PklProject declares version 0.5.0\n    uri = \"package://localhost:0/birds@0.8.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps6/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/birds@0\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/badProjectDeps6/bug.pkl",
    "content": "import \"@birds/Bird.pkl\"\n\nbird: Bird\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/compactTraceMode/PklProject",
    "content": "amends \"pkl:Project\"\n\nevaluatorSettings {\n  traceMode = \"compact\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/compactTraceMode/compactTraceMode.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"traceMode = 'default' results in single-line trace() values\"] {\n    trace(new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/evaluatorSettings/PklProject",
    "content": "amends \"pkl:Project\"\n\nevaluatorSettings {\n  env {\n    [\"one\"] = \"1\" \n  }\n  externalProperties {\n    [\"two\"] = \"2\"\n  }\n  allowedModules {\n    \"pkl:\"\n    \"repl:\"\n    \"file:\"\n  }\n  allowedResources {\n    \"prop:\"\n    \"env:\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/evaluatorSettings/basic.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"all env vars come from settings\"] {\n    read*(\"env:**\")\n  }\n  [\"all props come from settings\"] {\n    read*(\"prop:**\")\n  }\n  [\"cannot import modulepath because it is not allowed\"] {\n    module.catch(() -> import(\"modulepath:/org/pkl/core/stdlib/release.pkl\"))\n    module.catch(() -> read(\"modulepath:/org/pkl/core/brokenModule1.pkl\"))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/evaluatorSettings/nullTraceMode.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"traceMode = null results in single-line trace() values\"] {\n    trace(new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/missingProjectDeps/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/missingProjectDeps/bug.pkl",
    "content": "import \"@birds/Bird.pkl\"\n\nres = new Bird {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/notAProject/@child/theChild.pkl",
    "content": "res = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/notAProject/badImport.error.pkl",
    "content": "res = import(\"@child/theChild.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/notAProject/goodImport.pkl",
    "content": "res = import(\"./@child/theChild.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/prettyTraceMode/PklProject",
    "content": "amends \"pkl:Project\"\n\nevaluatorSettings {\n  traceMode = \"pretty\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/prettyTraceMode/prettyTraceMode.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"single-line lhs, single-line rhs\"] {\n    let (val = new Dynamic {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    })\n      trace(val[\"Parrot\"].name)\n  }\n  [\"single-line lhs, multi-line rhs\"] {\n    let (val = new Dynamic {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    })\n      trace(val)\n  }\n  [\"multi-line lhs, single-line rhs\"] {\n    trace((new Dynamic {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    })[\"Parrot\"].name)\n  }\n  [\"multi-line lhs, multi-line rhs\"] {\n    trace(new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n  [\"fruits\"] {\n    uri = \"package://localhost:0/fruit@1.1.0\"\n  }\n  [\"badImportsWithinPackage\"] {\n    uri = \"package://localhost:0/badImportsWithinPackage@1.0.0\"\n  }\n  [\"project2\"] = import(\"../project2/PklProject\")\n  [\"project6\"] = import(\"../project6/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/birds@0\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/project2@1\": {\n      \"type\": \"local\",\n      \"uri\": \"projectpackage://localhost:0/project2@1.0.0\",\n      \"path\": \"../project2/\"\n    },\n    \"package://localhost:12110/project6@1\": {\n      \"type\": \"local\",\n      \"uri\": \"projectpackage://localhost:12110/project6@1.0.0\",\n      \"path\": \"../project6/\"\n    },\n    \"package://localhost:0/badImportsWithinPackage@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/badImportsWithinPackage@1.0.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/badImport1.error.pkl",
    "content": "import \"@doesnotexist/bar/baz.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/badImport2.error.pkl",
    "content": "// Name shadowing check; package `birds` names this dependency \"fruities\" but this project\n// calls it `fruits`.\nimport \"@fruities/Fruit.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/badImport3.error.pkl",
    "content": "// Name `fruits` is visible in this project but it should not be visible within package `@birds`.\nres = import(\"@badImportsWithinPackage/unknownDependency.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/badRead1.error.pkl",
    "content": "res = read(\"@doesnotexist/bar/baz.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/basic.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nimport \"@birds/catalog/Ostrich.pkl\"\nimport \"@birds/catalog/Swallow.pkl\"\n\nexamples {\n  [\"import package\"] {\n    Ostrich\n    Swallow\n  }\n\n  [\"import module that uses triple-dot import\"] {\n    import(\"@birds/some/dir/Bird.pkl\")\n  }\n\n  [\"reading directories\"] {\n    read(\"@birds/catalog\")\n    // Omitting a slash is the package root\n    read(\"@birds\")\n  }\n}\n\nfacts {\n  [\"package-relative dependency is not same import as absolute URI dependency\"] {\n    import(\"@birds/Bird.pkl\") != import(\"package://localhost:0/birds@0.5.0#/Bird.pkl\")\n  }\n  [\"package-relative dependency has scheme projectpackage\"] {\n    import(\"@birds/Bird.pkl\") == import(\"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\")\n  }\n  [\"transitive import resolves to same dependency as direct dependency import\"] {\n    Swallow.favoriteFruit == import(\"@fruits/catalog/apple.pkl\")\n  }\n  [\"transitive import resolves to same dependency as projectpackage import\"] {\n    Swallow.favoriteFruit == import(\"projectpackage://localhost:0/fruit@1.1.0#/catalog/apple.pkl\")\n    Swallow.favoriteFruit != import(\"projectpackage://localhost:0/fruit@1.0.5#/catalog/apple.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/directPackageImport.error.pkl",
    "content": "res = import(\"@birds\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/globbing.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"glob-import within package\"] {\n    // catalog is the result of a glob import within the @birds/catalog.pkl module\n    import(\"@birds/catalog.pkl\").catalog\n  }\n\n  [\"glob-import absolute package uri\"] {\n    import*(\"package://localhost:0/birds@0.5.0#/catalog/*.pkl\")\n  }\n\n  [\"glob-import local project\"] {\n    import*(\"@project2/**.pkl\")\n  }\n\n  [\"glob-import using dependency notation\"] {\n    import*(\"@birds/catalog/*.pkl\").keys\n    import*(\"@birds/*.pkl\").keys\n    import*(\"@birds/**.pkl\").keys\n  }\n\n  [\"glob-read using dependency notation\"] {\n    read*(\"@birds/catalog/*.pkl\")\n    read*(\"@birds/*.pkl\")\n    read*(\"@birds/**.pkl\")\n  }\n\n  [\"glob-read within package\"] {\n    // catalog is the result of a glob import within the @birds/catalog.pkl module\n    import(\"@birds/catalog.pkl\").catalogFiles\n  }\n\n  [\"glob-read absolute package uri\"] {\n    read*(\"package://localhost:0/birds@0.5.0#/catalog/*.pkl\")\n  }\n  \n  [\"glob-import behind local project import\"] {\n    import(\"@project6/children.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/localProject.pkl",
    "content": "import \"@project2/penguin.pkl\"\n\nres = penguin\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project1/localProjectRead.pkl",
    "content": "res = read(\"@project2/penguin.pkl\").text\nres2 = read*(\"@project2/*\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project2/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"project2\"\n  baseUri = \"package://localhost:0/project2\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://localhost:0/project2/project2-\\(version).zip\"\n}\n\ndependencies {\n  [\"burds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project2/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/birds@0\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project2/penguin.pkl",
    "content": "import \"@burds/Bird.pkl\"\n\nbird: Bird = new {\n  name = \"Penguin\"\n  favoriteFruit {\n    name = \"Ice Fruit\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project3/PklProject",
    "content": "amends \"../project1/PklProject\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project3/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/birds@0\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/project2@1\": {\n      \"type\": \"local\",\n      \"uri\": \"projectpackage://localhost:0/project2@1.0.0\",\n      \"path\": \"../project2/\"\n    },\n    \"package://localhost:12110/project6@1\": {\n      \"type\": \"local\",\n      \"uri\": \"projectpackage://localhost:12110/project6@1.0.0\",\n      \"path\": \"../project6/\"\n    },\n    \"package://localhost:0/badImportsWithinPackage@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/badImportsWithinPackage@1.0.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project3/basic.pkl",
    "content": "amends \".../snippetTest.pkl\"\n\nexamples {\n  [\"inherits all the imports of project1\"] {\n    import(\"@birds/catalog/Swallow.pkl\")\n    import(\"@fruits/catalog/apple.pkl\")\n    import(\"@project2/penguin.pkl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"fruit\"] {\n    // need to manually keep the checksum in `PklProject.deps.json` in sync\n    uri = \"package://localhost:0/fruit@1.0.5\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n      \"checksums\": {\n        \"sha256\": \"8ff80e5ac882650e817f261c8af024bf0db9b07888c9d18c20017457e04ffe06\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project4/main.pkl",
    "content": "import \"@fruit/Fruit.pkl\"\n\norange = new Fruit {\n  name = \"Orange\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project5/PklProject",
    "content": "// Test embedding a project definition\nimport \"pkl:Project\"\nimport \"pkl:reflect\"\n\nmyProject: Project = (Project.newInstance(module)) {\n  dependencies {\n    [\"birds\"] {\n      uri = \"package://localhost:0/birds@0.5.0\"\n    }\n  }\n}\n\noutput {\n  value = myProject\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project5/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/birds@0\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project5/main.pkl",
    "content": "import \"@birds/Bird.pkl\"\n\nbird: Bird = new {\n  name = \"Finch\"\n  favoriteFruit {\n    name = \"Nuts\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project6/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"project6\"\n  baseUri = \"package://localhost:12110/project6\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://localhost:12110/project6/project6-\\(version).zip\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project6/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project6/children/a.pkl",
    "content": "name = \"a\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project6/children/b.pkl",
    "content": "name = \"b\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project6/children/c.pkl",
    "content": "name = \"c\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/projects/project6/children.pkl",
    "content": "children = import*(\"children/*.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/snippetTest.pkl",
    "content": "open module snippetTest\n\nextends \"pkl:test\"\n\noutput {\n  renderer = new PcfRenderer {\n    omitNullProperties = true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/syntax/shebang.pkl",
    "content": "#!/usr/bin/env pkl eval\nfoo = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/ThisInTypeConstraint.pkl",
    "content": "res1: List<String(this == \"one\")>(this is List) = List(\"one\")\n\nres2: Mapping<String(this == \"one\"), String(this == \"one\")>(this is Mapping) = new Mapping { [\"one\"] = \"one\" }\n\nres3: List<Set<String(this == \"one\")>(this is Set)>(this is List) = List(Set(\"one\"), Set(\"one\"))\n\nres4: List<String(this == \"one\", (() -> this).apply() == \"one\", (let (x = this) x) == \"one\")> = List(\"one\")\n\nres5 = new Clazz {}\n\nres6 = fun(res3)\n\nclass Clazz {\n  res1: List<String(this == \"one\")>(this is List) = List(\"one\")\n\n  res2: Mapping<String(this == \"one\"), String(this == \"one\")>(this is Mapping) = new Mapping { [\"one\"] = \"one\" }\n\n  res3: List<List<String(this == \"one\")>(this is List)>(this is List) = List(List(\"one\"), List(\"one\"))\n}\n\nfunction fun(x: List<Set<String(this == \"one\")>(this is Set)>(this is List)) = x\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/currentModuleType1.pkl",
    "content": "import \"pkl:test\"\n\nx: Int = 1\n\nres1: module = module\n\nres2: module = this\n\nres3: module = (this) { x = 2 }\n\nres4: module? = null\n\nres5: List<module> = List(module, (module) { x = 2 })\n\nres6: List<module> = fun(this)\n\nres6a: module = res6[0]\n\nfunction fun(m: module): List<module> = List((m) { x = 2 })\n\nclass Bad {\n  res7: module = \"abc\"\n\n  res8: module = new Person {}\n\n  res9: module? = new Person {}\n\n  res10: List<module> = List(new Person {})\n}\n\nclass Person\n\nres7 = test.catch(() -> new Bad {}.res7)\n\nres8 = test.catch(() -> new Bad {}.res8)\n\nres9 = test.catch(() -> new Bad {}.res9)\n\nres10 = test.catch(() -> new Bad {}.res10)\n\noutput {\n  // force eval but don't render to prevent recursion\n  value =\n    let (r1 = res1)\n      let (r2 = res2)\n        let (r3 = res3)\n          let (r4 = res4)\n            let (r5 = res5)\n              let (r6 = res6)\n                let (r6a = res6a)\n                  let (r7 = res7)\n                    let (r8 = res8)\n                      let (r9 = res9)\n                        let (r10 = res10)\n                          new Dynamic { result = \"ok\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/currentModuleType2.pkl",
    "content": "open module currentModuleType2\n\nimport \"pkl:test\"\n\nx: Int = 1\n\nres1: module = module\n\nres2: module = this\n\nres3: module = (this) { x = 2 }\n\nres4: module? = null\n\nres5: List<module> = List(module, (module) { x = 2 })\n\nres6: List<module> = fun(this)\n\nres6a: module = res6[0]\n\nfunction fun(m: module): List<module> = List((m) { x = 2 })\n\nclass Bad {\n  res7: module = \"abc\"\n\n  res8: module = new Person {}\n\n  res9: module? = new Person {}\n\n  res10: List<module> = List(new Person {})\n}\n\nclass Person\n\nres7 = test.catch(() -> new Bad {}.res7)\n\nres8 = test.catch(() -> new Bad {}.res8)\n\nres9 = test.catch(() -> new Bad {}.res9)\n\nres10 = test.catch(() -> new Bad {}.res10)\n\noutput {\n  // force eval but don't render to prevent recursion\n  value =\n    let (r1 = res1)\n      let (r2 = res2)\n        let (r3 = res3)\n          let (r4 = res4)\n            let (r5 = res5)\n              let (r6 = res6)\n                let (r6a = res6a)\n                  let (r7 = res7)\n                    let (r8 = res8)\n                      let (r9 = res9)\n                        let (r10 = res10)\n                          new Dynamic { result = \"ok\" }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/currentModuleType3.pkl",
    "content": "extends \"currentModuleType2.pkl\"\n\nres1 = module\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/cyclicTypeAlias1.pkl",
    "content": "typealias Foo = List<Foo>"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/cyclicTypeAlias2.pkl",
    "content": "typealias Foo = List<Bar>\n\ntypealias Bar = Set<Baz>\n\ntypealias Baz = Map<String, Foo>"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/helpers/originalTypealias.pkl",
    "content": "const local lastName = \"Birdo\"\n\ntypealias Birds = Listing<String(endsWith(lastName))>\n\ntypealias Birds2 = Pair<Listing<String(endsWith(lastName))>, Int>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/helpers/someModule.pkl",
    "content": "foo: String = \"foo\"\nbar: Int = 42"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/modifiersForTypes.pkl",
    "content": "import \"pkl:reflect\"\n\nclass Foo {}\n\ntypealias Bar = Foo\n\nconst res1 = Foo.simpleName\nconst res2 = Bar.toString()\nconst res3 = reflect.Class(Foo).modifiers\nconst res4 = reflect.TypeAlias(Bar).modifiers\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/moduleType.pkl",
    "content": "import \"helpers/someModule.pkl\"\n\nres1: someModule = new {\n  foo = \"foo2\"\n}\n\nres2 = res1 is someModule\n\nres3: Listing<someModule> = new {\n  res1\n}\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/moduleType2.pkl",
    "content": "open module Foo\n\nprop: String\n\nmyself: module?\n\nclass Bar extends module {\n  prop2: Int\n}\n\noutput {\n  value = new Bar {\n    prop = \"hi\"\n    prop2 = 15\n    myself {\n      prop = \"hi again\"\n      prop2 = 15\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/moduleType3.pkl",
    "content": "open module Foo\n\nprop: String\n\nmyself: module?\n\nclass Bar extends module {\n  prop2: Int\n}\n\nclass Baz extends module {\n  prop2: String\n}\n\noutput {\n  value = new Dynamic {\n    bar = new Bar {\n      prop = \"hi\"\n      prop2 = 15\n      myself {\n        prop = \"hi again\"\n        prop2 = 15\n      }\n    }\n    baz = new Baz {\n      prop = \"hi\"\n      prop2 = \"hihi\"\n      myself {\n        prop = \"hihihi\"\n        prop2 = \"hihihihi\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/moduleType4.pkl",
    "content": "open module TheModule\n\nmod: module? = Null(new module {})\n\nclass Bar extends module {\n  num: Int\n}\n\noutput {\n  value = new Dynamic {\n    bar = new Bar {\n      num = 5\n      mod {\n        num = 6\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/moduleType5.pkl",
    "content": "open module TheModule\n\nmod: module? = Null(new module {})\n\nopen class Bar extends module {\n  num: Int\n}\n\nopen class Baz extends module {\n  num2: Int\n}\n\noutput {\n  value = new Dynamic {\n    bar = new Bar {\n      num = 5\n      mod {\n        num = 5\n      }\n    }\n    baz = new Baz {\n      num2 = 5\n      mod {\n        num2 = 5\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/nothingType.pkl",
    "content": "function throws(): nothing = throw(\"throwing a message\")\n\nmyValue: String = throws()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/nothingWithUnions.pkl",
    "content": "x: \"foo\"|nothing = \"foo\"\n\ny: nothing|\"foo\" = \"foo\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/typeAlias1.pkl",
    "content": "import \"pkl:test\"\n\nimport \"helpers/originalTypealias.pkl\"\n\ntypealias Simple = String\nconst function simple(arg: Simple): Simple = arg\n\nres1: Simple = \"abc\"\nres1b = simple(\"abc\")\n\ntypealias Parameterized = List<String>\nconst function parameterized(arg: Parameterized): Parameterized = arg\n\nres2: Parameterized = List(\"abc\")\nres2b: Parameterized = parameterized(List(\"abc\"))\n\ntypealias Constrained = String(length >= 3)\nconst function constrained(arg: Constrained): Constrained = arg\n\nres3: Constrained = \"abc\"\nres3b: Constrained = constrained(\"abc\")\n\ntypealias Composite = Map<String, Parameterized>\nconst function composite(arg: Composite): Composite = arg\n\nres4: Composite = Map(\"abc\", List(\"def\"))\nres4b: Composite = composite(Map(\"abc\", List(\"def\")))\n\ntypealias Union = Int|Boolean\nconst function union(arg: Union): Union = arg\n\nres5: Union = false\nres5b: Union = union(false)\n\ntypealias Nullable = Duration?\nconst function nullable(arg: Nullable): Nullable = arg\n\nres6: Nullable = null\nres6b: Nullable = nullable(null)\n\nclass Good {\n  res7: Simple = \"abc\"\n  res7b = simple(\"abc\")\n\n  res8: Parameterized = List(\"abc\")\n  res8b: Parameterized = parameterized(List(\"abc\"))\n\n  res9: Constrained = \"abc\"\n  res9b: Constrained = constrained(\"abc\")\n\n  res10: Composite = Map(\"abc\", List(\"def\"))\n  res10b: Composite = composite(Map(\"abc\", List(\"def\")))\n\n  res11: Union = false\n  res11b: Union = union(false)\n\n  res12: Nullable = null\n  res12b: Nullable = nullable(null)\n}\n\ngood = new Good {}\n\nclass Bad {\n  res13: Simple = 42\n  res13b = simple(42)\n\n  res14: Parameterized = List(42)\n  res14b: Parameterized = parameterized(List(42))\n\n  res15: Constrained = 42\n  res15b: Constrained = constrained(42)\n\n  res16: Composite = Map(\"abc\", List(42))\n  res16b: Composite = composite(Map(\"abc\", List(42)))\n\n  res17: Union = \"foo\"\n  res17b: Union = union(\"foo\")\n\n  res18: Nullable = 5.mb\n  res18b: Nullable = nullable(5.mb)\n}\n\nlocal bad = new Bad {}\n\nres13 = test.catch(() -> bad.res13)\nres13b = test.catch(() -> bad.res13b)\n\nres14 = test.catch(() -> bad.res14)\nres14b = test.catch(() -> bad.res14b)\n\nres15 = test.catch(() -> bad.res15)\nres15b = test.catch(() -> bad.res15b)\n\nres16 = test.catch(() -> bad.res16)\nres16b = test.catch(() -> bad.res16b)\n\nres17 = test.catch(() -> bad.res17)\nres17b = test.catch(() -> bad.res17b)\n\nres18 = test.catch(() -> bad.res18)\nres18b = test.catch(() -> bad.res18b)\n\nlocal typealias LocalTypeAlias = String\n\nres19: LocalTypeAlias = \"abc\"\n\ntypealias VeryComposite = Pair<Composite, Composite>\n\nres20: VeryComposite = Pair(Map(\"abc\", List(\"def\")), Map(\"abc\", List(\"def\")))\n\n// typealiases should be executed in their original context\nres21: originalTypealias.Birds = new { \"John Birdo\" }\n\nres22: originalTypealias.Birds2 = Pair(new Listing { \"John Birdo\" }, 0)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/typeAlias2.pkl",
    "content": "import \"pkl:test\"\n\ntypealias List2<E> = List<E>\n\nres1: List2<Int> = List(1, 2, 3)\n\nres2: List2<List2<String>> = List(List(\"Pigeon\"), List(\"Barn Owl\"))\n\ntypealias Map2<V, K> = Map<K, V>\n\nres3: Map2<String, Int> = Map(42, \"Pigeon\", 21, \"Barn Owl\")\n\ntypealias StringMap<V> = Map<String, V>\n\nres4: StringMap<Duration> = Map(\"Pigeon\", 3.min, \"Barn Owl\", 5.s)\n\ntypealias MMap<X> = Map<X, X>\n\nclass Person { name: String }\n\nres5: MMap<Person?> = Map(null, new Person { name = \"Pigeon\" }, new Person { name = \"Barn Owl\" }, null)\n\ntypealias Mixin<Object> = (Object) -> Object\n\nlocal mixin: Mixin<Person> = (p: Person) -> (p) { name = \"Other\" }\n\nres6 = mixin.apply(new Person { name = \"Pigeon\" })\n\nopen class Foo {\n  value: Int = 42\n}\n\ntypealias Bar = Foo\n\nclass Baz extends Bar {}\n\nres7 = (new Baz {}).value\n\ntypealias MappingOrListing = Mapping|Listing\n\nres8 = new {\n  foo = 5\n  bar = if (foo is MappingOrListing) \"bar\" else foo\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/typeAliasConstraint1.pkl",
    "content": "// length should bind to `String#length` instead of `ClassWithLengthProperty#length`\nlocal typealias OneCharacterString = String(length == 1)\n\nlocal class ClassWithLengthProperty {\n  length: Int = 99\n  \n  // length constraint binds to ClassWithLengthProperty.length here\n  characters: List<OneCharacterString> = List(\"a\", \"b\")\n}\n\nres1: OneCharacterString = \"a\"\nres2 = let (c = new ClassWithLengthProperty {}) c.characters\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/typeAliasConstraint2.pkl",
    "content": "import \".../input-helper/types/typeAliasConstraint2.pkl\" as helper\n\nfoo: Int = 1\nbar: helper.MyTypeAlias(foo == 1) = new helper.MyClass {}\n\nfunction qux(bar: helper.MyTypeAlias(foo == 1)) = (bar) {}\n\nqux = qux(new helper.MyTypeAlias {})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/typeAliasContext.pkl",
    "content": "import \"helpers/originalTypealias.pkl\"\n\nres: originalTypealias.Birds = new { \"Jimmy Bird\" }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input/types/typeAliasUnion.pkl",
    "content": "typealias Bar = \"foo\"|*\"bar\"\n\nbar: Bar\n\nbar2: *Bar|\"baz\"\n\nbaz: Bar|*\"baz\"\n\nb: *(\"a\"|*\"b\")|\"c\"\n\nc: (\"a\"|*\"b\")|*\"c\"\n\nclass Foo { name: String = \"foo\" }\nclass Baz { name: String = \"baz\" }\n\nd: *Foo | Baz\ne: *Foo | Baz = new {}\nf: Foo | *Baz\ng: Foo | *Baz = new {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/a.pkl",
    "content": "import \"b.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/b.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/cannotFindModule.pkl",
    "content": "import \"bogusModule.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/cyclicalA.pkl",
    "content": "import \"cyclicalB.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/cyclicalB.pkl",
    "content": "import \"cyclicalA.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/globImport.pkl",
    "content": "import* \"[ab].pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/analyze/invalidGlob.pkl",
    "content": "import* \".../**.pkl\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/api/annotationConverter.pkl",
    "content": "class LineComment extends ConvertProperty {\n  text: String\n\n  valuePrefix: String = \"\"\n  prefix: String\n  suffix: String = \"\"\n\n  render = (prop, renderer) ->\n    Pair(prop.key, new RenderDirective {\n      text =\n        List(\n          valuePrefix,\n          (renderer as ValueRenderer).renderValue(prop.value),\n          prefix,\n          outer.text,\n          suffix,\n        ).join(\"\")\n    })\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/api/benchmark/moduleToBenchmark.pkl",
    "content": "result = IntSeq(1, 10).fold(0, (result, next) -> result + next)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/api/reflect/BaseModule.pkl",
    "content": "/// module doc comment\n@MyAnn { text = \"module annotation\" }\nopen module api.reflect.BaseModule\n\n/// module property doc comment\n@MyAnn { text = \"module property annotation\" }\nint = 42\nfloat = 12.3\nstring = \"hello\"\nboolean = true\nduration = 42.h\ndataSize = 12.3.gb\npair = Pair(42, \"hello\")\nlist = List(1, 2, 3)\nset = Set(1, 2, 3)\nmap = Map(1, \"one\", 2, \"two\", 3, \"three\")\nlisting = new Listing { 1; 2; 3 }\nmapping = new Mapping { [1] = \"one\"; [2] = \"two\"; [3] = \"three\" }\ndynamic = new Dynamic { name = \"Pigeon\"; age = 42 }\ntyped = new Person { age = 42 }\n\n/// module method doc comment\n@MyAnn { text = \"module method annotation\" }\nfunction sing(person, songs) = \"\\(person.name) sings \\(songs[0])\"\n\nint2: Int = 42\nfloat2: Float = 12.3\nstring2: String = \"hello\"\nboolean2: Boolean = true\nduration2: Duration = 42.h\ndataSize2: DataSize = 12.3.gb\npair2: Pair<Int, String> = Pair(42, \"hello\")\nlist2: List<Int> = List(1, 2, 3)\nset2: Set<Int> = Set(1, 2, 3)\nmap2: Map<Int, String> = Map(1, \"one\", 2, \"two\", 3, \"three\")\nlisting2: Listing<Int> = new Listing { 1; 2; 3 }\nmapping2: Mapping<Int, String> = new Mapping { [1] = \"one\"; [2] = \"two\"; [3] = \"three\" }\ndynamic2: Dynamic = new Dynamic { name = \"Pigeon\"; age = 42 }\ntyped2: Person = new Person { age = 42 }\n\nfunction sing2(person: Person, songs: List<String>): String = \"\\(person.name) sings \\(songs[0])\"\n\nany: Any\nnoth: nothing\nunkn: unknown\nunion: Int|List<String>|Person\nnullable: Person?\nstringLiteral: \"yes\"\nconstrained: String(length.isBetween(3, 10))\naliased: MyMap<Person>\n\nhidden hiddenProp: String\nconst constProp: String = \"the const prop\"\nfixed fixedProp: String = \"the fixed prop\"\n\n/// class doc comment\n@MyAnn { text = \"class annotation\" }\nopen class Person {\n  name: String = \"Pigeon\"\n\n  /// class property doc comment\n  @MyAnn { text = \"class property annotation\"}\n  age: Int = 42\n\n  /// class method doc comment\n  @MyAnn { text = \"class method annotation\" }\n  function sing(songs: List<String>): String = \"\\(name) sings \\(songs[0])\"\n}\n\nclass MyAnn extends Annotation {\n  text: String\n}\n\n/// type alias doc comment\n@MyAnn { text = \"type alias annotation\" }\ntypealias MyMap<V> = Map<String, V>(isEmpty)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/api/reflect/ExtendingModule.pkl",
    "content": "/// extending module doc comment\n@MyAnn { text = \"extending module annotation\" }\nextends \"BaseModule.pkl\"\n\nproperty: Person2\n\nfunction method(): Person = new {}\n\nclass Person2 extends Person\n\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/api/reflect/amendingModule.pkl",
    "content": "/// amending module doc comment\n@MyAnn { text = \"amending module annotation\" }\namends \"BaseModule.pkl\"\n\nint = 22\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/api/reflect/testHelpers.pkl",
    "content": "import \"pkl:reflect\"\nimport \"BaseModule.pkl\"\n\nreferenceModule = \"BaseModule.pkl\"\n\nfunction MyAnn(message: String): List<BaseModule.MyAnn> = List(new BaseModule.MyAnn {\n  text = message\n})\n\nfunction method(m: reflect.Method, paramTypes: List<reflect.Type>, returnType: reflect.Type): Dynamic = new {\n  hasExpectedLocation = m.location.displayUri.contains(referenceModule)\n  docComment = m.docComment\n  annotations = m.annotations\n  modifiers = m.modifiers\n  name = m.name\n  typeParameters = m.typeParameters\n  parameterNames = m.parameters.keys\n  hasExpectedParameterTypes = m.parameters.values.map((it) -> it.type) == paramTypes\n  hasExpectedReturnType = m.returnType == returnType\n}\n\nfunction property(p: reflect.Property, expectedType: reflect.Type): Dynamic = new {\n  hasExpectedLocation = p.location.displayUri.contains(referenceModule)\n  docComment = p.docComment\n  annotations = p.annotations\n  modifiers = p.modifiers\n  name = p.name\n  defaultValue = p.defaultValue\n  hasExpectedType = p.type == expectedType\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/basic/read/child/module2.pkl",
    "content": "normalRead = read(\"resource.txt\")\nglobbedRead = read*(\"*.txt\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/basic/read/child/resource.txt",
    "content": "child resource\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/basic/read/module1.pkl",
    "content": "normalRead = read(\"resource.txt\")\nglobbedRead = read*(\"*.txt\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/basic/read/resource.txt",
    "content": "resource\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/classes/MyClass.pkl",
    "content": "typealias EmailAddress = String(matches(Regex(#\".+@\\S+|.+<\\S+@\\S+>\"#)))\n\nclass MyClass {\n  emails: Listing<EmailAddress>\n}\n\nmyClass: MyClass\n\nothers: Listing<module(this != module)>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/classes/myClass1.pkl",
    "content": "amends \".../input-helper/classes/MyClass.pkl\"\n\nmyClass {\n  emails {\n    \"baz@bar.com\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/globtest/child/moduleC.pkl",
    "content": "name = \"child/moduleC\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/globtest/module with [weird] ~!characters.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/globtest/moduleA.pkl",
    "content": "name = \"moduleA\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/globtest/moduleB.pkl",
    "content": "name = \"moduleB\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/listings/cacheStealingTypeCheck.pkl",
    "content": "function isValid(str): Boolean = str.startsWith(\"a\")\n\nfoo: Listing<String(isValid(this))>(isDistinct)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/modules/Birds.pkl",
    "content": "module Birds\n\nabstract class Bird {\n  name: String\n}\n\nclass Pigeon extends Bird {\n  name = \"Pigeon\"\n  passenger: Boolean\n}\n\npidgy: Pigeon?\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/modules/Birds2.pkl",
    "content": "module Birds2\n\nabstract class Bird\n\nbird: Bird\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/input-helper/types/typeAliasConstraint2.pkl",
    "content": "class MyClass\n\ntypealias MyTypeAlias = MyClass(getClass() == MyClass)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotation1.pcf",
    "content": "someProperty = \"hi\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotation2.err",
    "content": "–– Pkl Error ––\nExpected an annotation class.\n\nx | @NoAnn\n     ^^^^^\nat annotation2 (file:///$snippetsDir/input/annotation/annotation2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotation3.err",
    "content": "–– Pkl Error ––\nExpected an annotation class.\n\nx | @NoAnn\n     ^^^^^\nat annotation3 (file:///$snippetsDir/input/annotation/annotation3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotation4.err",
    "content": "–– Pkl Error ––\nExpected an annotation class.\n\nx | @Mapping {\n     ^^^^^^^\nat annotation4 (file:///$snippetsDir/input/annotation/annotation4.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotation5.err",
    "content": "–– Pkl Error ––\nExpected `integer` to be a type, but it is not.\n\nx | @integer someProperty: String = \"hi\"\n     ^^^^^^^\nat annotation5 (file:///$snippetsDir/input/annotation/annotation5.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotation6.err",
    "content": "–– Pkl Error ––\nExpected an annotation class.\n\nx | @Int someProperty: String = \"hi\"\n     ^^^\nat annotation6 (file:///$snippetsDir/input/annotation/annotation6.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotationIsNotExpression.err",
    "content": "–– Pkl Error ––\nExpected `myAnn` to be a type, but it is not.\n\nx | @myAnn\n     ^^^^^\nat annotationIsNotExpression (file:///$snippetsDir/input/annotation/annotationIsNotExpression.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/annotationIsNotExpression2.err",
    "content": "–– Pkl Error ––\nExpected an annotation class.\n\nx | @Ann1|Ann2\n     ^^^^^^^^^\nat annotationIsNotExpression2 (file:///$snippetsDir/input/annotation/annotationIsNotExpression2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecated1.err",
    "content": "res1 = 100001\nres1b = List(1001, 2001, 3001)\nres2 = 200002\nres2b = List(4002, 5002, 6002)\nres3 = 300101\nres3b = List(7101, 8101, 9101)\nres4 = 400201\nres4b = List(10201, 11201, 12201)\nres5 = 500202\nres5b = List(13202, 14202, 15202)\nres6 = 600301\nres6b = List(16301, 17301, 18301)\nres7 = 700202\nres7b = List(19202, 20202, 21202)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#A.f` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#A.f` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#C.f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#C.f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecated2.err",
    "content": "res1 = -800001\nres1b = List(-22001, -23001, -24001)\nres2 = 900002\nres2b = List(25002, 26002, 27002)\nres3 = 300101\nres3b = List(7101, 8101, 9101)\nres4 = 400201\nres4b = List(10201, 11201, 12201)\nres5 = 500202\nres5b = List(13202, 14202, 15202)\nres6 = 600301\nres6b = List(16301, 17301, 18301)\nres7 = 700202\nres7b = List(19202, 20202, 21202)\npkl: WARN: Method `deprecated2#f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated2.pkl)\npkl: WARN: Method `deprecated2#f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated2.pkl)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated2.pkl)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated2.pkl)\npkl: WARN: Method `deprecated1#A.f` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#A.f` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#C.f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#C.f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\npkl: WARN: Method `deprecated1#B.f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecated3.err",
    "content": "res1 = 1000001\nres1b = List(28001, 29001, 30001)\nres2 = 1100002\nres2b = List(31002, 32002, 33002)\nres3 = -1200001\nres3b = List(-34001, -35001, -36001)\nres4 = 1300002\nres4b = List(37002, 38002, 39002)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated3.pkl)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated3.pkl)\npkl: WARN: Method `deprecated2#f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated3.pkl)\npkl: WARN: Method `deprecated2#f1` is deprecated (file:///$snippetsDir/input/annotation/deprecated3.pkl)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated3.pkl)\npkl: WARN: Method `deprecated1#f2` is deprecated (file:///$snippetsDir/input/annotation/deprecated3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecatedNoRepeatedWarnings.err",
    "content": "shouldWarnForFirstCallToFooFromBar = 0\nshouldNotWarnForRepeatedCallToFooFromBar1 = 0\nshouldNotWarnForRepeatedCallToFooFromBar2 = 0\nshouldWarnForDirectCallToFoo = 0\nshouldWarnForRepeatedDirectCallToFoo = 0\npkl: WARN: Method `deprecatedNoRepeatedWarnings#foo` is deprecated (file:///$snippetsDir/input/annotation/deprecatedNoRepeatedWarnings.pkl)\npkl: WARN: Method `deprecatedNoRepeatedWarnings#foo` is deprecated (file:///$snippetsDir/input/annotation/deprecatedNoRepeatedWarnings.pkl)\npkl: WARN: Method `deprecatedNoRepeatedWarnings#foo` is deprecated (file:///$snippetsDir/input/annotation/deprecatedNoRepeatedWarnings.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecatedWithMessage1.err",
    "content": "res1 = 100001\nres1b = List(1001, 2001, 3001)\nres2 = 200002\nres2b = List(4002, 5002, 6002)\nres3 = 300101\nres3b = List(7101, 8101, 9101)\nres4 = 400201\nres4b = List(10201, 11201, 12201)\nres5 = 500202\nres5b = List(13202, 14202, 15202)\nres6 = 600301\nres6b = List(16301, 17301, 18301)\nres7 = 700202\nres7b = List(19202, 20202, 21202)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#A.f` is deprecated: use B.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#A.f` is deprecated: use B.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#C.f1` is deprecated: avoid using C.f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#C.f1` is deprecated: avoid using C.f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecatedWithMessage2.err",
    "content": "res1 = -800001\nres1b = List(-22001, -23001, -24001)\nres2 = 900002\nres2b = List(25002, 26002, 27002)\nres3 = 300101\nres3b = List(7101, 8101, 9101)\nres4 = 400201\nres4b = List(10201, 11201, 12201)\nres5 = 500202\nres5b = List(13202, 14202, 15202)\nres6 = 600301\nres6b = List(16301, 17301, 18301)\nres7 = 700202\nres7b = List(19202, 20202, 21202)\npkl: WARN: Method `deprecatedWithMessage2#f1` is deprecated: avoid using f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage2.pkl)\npkl: WARN: Method `deprecatedWithMessage2#f1` is deprecated: avoid using f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage2.pkl)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage2.pkl)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage2.pkl)\npkl: WARN: Method `deprecatedWithMessage1#A.f` is deprecated: use B.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#A.f` is deprecated: use B.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#C.f1` is deprecated: avoid using C.f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#C.f1` is deprecated: avoid using C.f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\npkl: WARN: Method `deprecatedWithMessage1#B.f2` is deprecated: use this.f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecatedWithMessage3.err",
    "content": "res1 = 1000001\nres1b = List(28001, 29001, 30001)\nres2 = 1100002\nres2b = List(31002, 32002, 33002)\nres3 = -1200001\nres3b = List(-34001, -35001, -36001)\nres4 = 1300002\nres4b = List(37002, 38002, 39002)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage3.pkl)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage3.pkl)\npkl: WARN: Method `deprecatedWithMessage2#f1` is deprecated: avoid using f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage3.pkl)\npkl: WARN: Method `deprecatedWithMessage2#f1` is deprecated: avoid using f1 (file:///$snippetsDir/input/annotation/deprecatedWithMessage3.pkl)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage3.pkl)\npkl: WARN: Method `deprecatedWithMessage1#f2` is deprecated: use f1 instead (file:///$snippetsDir/input/annotation/deprecatedWithMessage3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/annotation/deprecationSuperMethod.err",
    "content": "barCall = 42\nbazCall = \"baz was called\"\nquxCall = -1\nbarCall2ShouldNotWarn = 42\nbazCall2ShouldNotWarn = \"baz was called\"\npkl: WARN: Method `deprecationSuperMethod#Foo.bar` is deprecated (file:///$snippetsDir/input/annotation/deprecationSuperMethod.pkl)\npkl: WARN: Method `deprecationSuperMethod#Foo.baz` is deprecated: Use only Foo#qux (file:///$snippetsDir/input/annotation/deprecationSuperMethod.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/Resource.pcf",
    "content": "examples {\n  [\"text\"] {\n    \"\"\n    \"The quick brown fox jumps over the lazy dog.\"\n  }\n  [\"md5\"] {\n    \"d41d8cd98f00b204e9800998ecf8427e\"\n    \"e4d909c290d0fb1ca068ffaddf22cbd0\"\n  }\n  [\"sha1\"] {\n    \"da39a3ee5e6b4b0d3255bfef95601890afd80709\"\n    \"da39a3ee5e6b4b0d3255bfef95601890afd80709\"\n    \"408d94384216f890ff7a0c3528e8bed1e0b01621\"\n    \"408d94384216f890ff7a0c3528e8bed1e0b01621\"\n  }\n  [\"sha256\"] {\n    \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n    \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n    \"ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c\"\n    \"ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c\"\n  }\n  [\"sha256Int\"] {\n    1449310910991872227\n    1449310910991872227\n    -6359199461968751633\n    -6359199461968751633\n  }\n  [\"in-language\"] {\n    \"9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a\"\n    new {\n      uri = \"foo:foo\"\n      text = \"foo bar\"\n      base64 = \"Zm9vIGJhcg==\"\n    }\n    \"9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a\"\n    \"AQIDBA==\"\n    Bytes(1, 2, 3, 4)\n  }\n  [\"absolute URI scheme with plus\"] {\n    \"Cannot find resource `foo+bar///?baz=buz`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/analyze1.pcf",
    "content": "examples {\n  [\"basic\"] {\n    new {\n      imports {\n        [\"file:///$snippetsDir/input-helper/analyze/a.pkl\"] {\n          new {\n            uri = \"file:///$snippetsDir/input-helper/analyze/b.pkl\"\n          }\n        }\n        [\"file:///$snippetsDir/input-helper/analyze/b.pkl\"] {}\n      }\n      resolvedImports {\n        [\"file:///$snippetsDir/input-helper/analyze/a.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/a.pkl\"\n        [\"file:///$snippetsDir/input-helper/analyze/b.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/b.pkl\"\n      }\n    }\n  }\n  [\"cycles\"] {\n    new {\n      imports {\n        [\"file:///$snippetsDir/input-helper/analyze/cyclicalA.pkl\"] {\n          new {\n            uri = \"file:///$snippetsDir/input-helper/analyze/cyclicalB.pkl\"\n          }\n        }\n        [\"file:///$snippetsDir/input-helper/analyze/cyclicalB.pkl\"] {\n          new {\n            uri = \"file:///$snippetsDir/input-helper/analyze/cyclicalA.pkl\"\n          }\n        }\n      }\n      resolvedImports {\n        [\"file:///$snippetsDir/input-helper/analyze/cyclicalA.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/cyclicalA.pkl\"\n        [\"file:///$snippetsDir/input-helper/analyze/cyclicalB.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/cyclicalB.pkl\"\n      }\n    }\n  }\n  [\"globs\"] {\n    new {\n      imports {\n        [\"file:///$snippetsDir/input-helper/analyze/a.pkl\"] {\n          new {\n            uri = \"file:///$snippetsDir/input-helper/analyze/b.pkl\"\n          }\n        }\n        [\"file:///$snippetsDir/input-helper/analyze/b.pkl\"] {}\n        [\"file:///$snippetsDir/input-helper/analyze/globImport.pkl\"] {\n          new {\n            uri = \"file:///$snippetsDir/input-helper/analyze/a.pkl\"\n          }\n          new {\n            uri = \"file:///$snippetsDir/input-helper/analyze/b.pkl\"\n          }\n        }\n      }\n      resolvedImports {\n        [\"file:///$snippetsDir/input-helper/analyze/a.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/a.pkl\"\n        [\"file:///$snippetsDir/input-helper/analyze/b.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/b.pkl\"\n        [\"file:///$snippetsDir/input-helper/analyze/globImport.pkl\"] = \"file:///$snippetsDir/input-helper/analyze/globImport.pkl\"\n      }\n    }\n  }\n  [\"packages\"] {\n    new {\n      imports {\n        [\"package://localhost:0/birds@0.5.0#/Bird.pkl\"] {\n          new {\n            uri = \"package://localhost:0/fruit@1.0.5#/Fruit.pkl\"\n          }\n        }\n        [\"package://localhost:0/fruit@1.0.5#/Fruit.pkl\"] {}\n      }\n      resolvedImports {\n        [\"package://localhost:0/birds@0.5.0#/Bird.pkl\"] = \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\n        [\"package://localhost:0/fruit@1.0.5#/Fruit.pkl\"] = \"package://localhost:0/fruit@1.0.5#/Fruit.pkl\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/annotationConverters.pcf",
    "content": "no_converter = 1\nfoo_prefixed_with_foo = 2\nfooBaseClassFirst = 3\ntransform_value = 8\nin_order = 28\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/any.pcf",
    "content": "examples {\n  [\"getClass()\"] {\n    \"Int\"\n    \"Float\"\n    \"Boolean\"\n    \"String\"\n    \"Duration\"\n    \"DataSize\"\n    \"List\"\n    \"Map\"\n    \"Listing\"\n    \"Mapping\"\n    \"Dynamic\"\n    \"Person\"\n    \"Class\"\n    \"Null\"\n    \"Pair\"\n    \"ModuleClass\"\n  }\n  [\"ifNonNull\"] {\n    10\n    \"foo\"\n    null\n    null\n    null\n    null\n  }\n  [\"toString()\"] {\n    \"Pigeon\"\n    \"42\"\n    \"1.23\"\n    \"true\"\n    \"1.23.ns\"\n    \"1.23.mb\"\n    \"Pair(1, 2)\"\n    \"List(1, 2, 3)\"\n    \"Set(1, 2, 3)\"\n    \"Map(1, 2, 3, 4)\"\n    \"new Listing { 1; 2; 3 }\"\n    \"new Mapping { [\\\"Pigeon\\\"] = 42; [\\\"Barn Owl\\\"] = 21 }\"\n    \"new Dynamic { name = \\\"Pigeon\\\"; age = 42 }\"\n    \"new Person2 { name = \\\"Pigeon\\\"; age = 42 }\"\n    \"null\"\n    \"null\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/anyConverter.pcf",
    "content": "foo {\n  \"Unconverted class: anyConverter#User\"\n  \"Dog(5)\"\n  \"Unconverted class: anyConverter#Env\"\n  \"42\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/baseModule.pcf",
    "content": "examples {\n  [\"TODO()\"] {\n    \"TODO\"\n  }\n  [\"Undefined()\"] {\n    \"Undefined value.\"\n    \"Undefined value.\"\n  }\n  [\"Regex\"] {\n    Regex(\"\")\n    Regex(#\"[ab]\\s+\"#)\n    \"Syntax error in regex `(`: Unclosed group near index 1 (\"\n  }\n  [\"Pair()\"] {\n    Pair(1, \"two\")\n  }\n  [\"NaN\"] {\n    NaN\n  }\n  [\"Infinity\"] {\n    Infinity\n    -Infinity\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/benchmarkModule.pcf",
    "content": "facts {\n  [\"run microbenchmark\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"run output benchmark (in verbose mode)\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"run parser benchmark\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"evaluate entire benchmark module\"] {\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/bytes.pcf",
    "content": "examples {\n  [\"md5\"] {\n    \"08d6c05a21512a79a1dfeb9d2a8f262f\"\n    \"d41d8cd98f00b204e9800998ecf8427e\"\n  }\n  [\"sha256\"] {\n    \"9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a\"\n    \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n  }\n  [\"sha1\"] {\n    \"12dada1fff4d4787ade3333147202c3b443e376f\"\n    \"da39a3ee5e6b4b0d3255bfef95601890afd80709\"\n  }\n  [\"toString\"] {\n    \"Bytes(1, 2, 3, 4)\"\n    \"Bytes()\"\n  }\n  [\"base64\"] {\n    \"AQIDBA==\"\n    \"\"\n    \"AQIDBA==\"\n  }\n  [\"hex\"] {\n    \"01020304\"\n    \"\"\n  }\n  [\"length\"] {\n    0\n    4\n    1000\n  }\n  [\"size\"] {\n    0.b\n    4.b\n    1.kb\n  }\n  [\"decodeToString()\"] {\n    \"foo bar\"\n    \"foo bar\"\n  }\n  [\"getOrNull()\"] {\n    1\n    2\n    3\n    null\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/dataSize.pcf",
    "content": "facts {\n  [\"isPositive\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isBinaryUnit\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isDecimalUnit\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isBetween\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"value\"] {\n    1\n    2.2\n    3\n    4.4\n    5\n    6.6\n    7\n    8.8\n    9\n    10.1\n    11\n    List(1, 2.2, 3)\n  }\n  [\"unit\"] {\n    \"b\"\n    \"kb\"\n    \"kib\"\n    \"mb\"\n    \"mib\"\n    \"gb\"\n    \"gib\"\n    \"tb\"\n    \"tib\"\n    \"pb\"\n    \"pib\"\n  }\n  [\"toUnit()\"] {\n    1.pb\n    1000.tb\n    1000000.gb\n    1000000000.mb\n    1000000000000.kb\n    1000000000000000.b\n    1.pb\n    1000.tb\n    1000000.gb\n    1000000000.mb\n    1000000000000.kb\n    1000000000000000.b\n    1.pib\n    1024.tib\n    1048576.gib\n    1073741824.mib\n    1099511627776.kib\n    1125899906842624.b\n    1.pib\n    1024.tib\n    1048576.gib\n    1073741824.mib\n    1099511627776.kib\n    1125899906842624.b\n    \"Expected value of type `\\\"b\\\"|\\\"kb\\\"|\\\"kib\\\"|\\\"mb\\\"|\\\"mib\\\"|\\\"gb\\\"|\\\"gib\\\"|\\\"tb\\\"|\\\"tib\\\"|\\\"pb\\\"|\\\"pib\\\"`, but got `\\\"foo\\\"`.\"\n    500000.kb\n    0.46566128730773926.gib\n  }\n  [\"toBinaryUnit()\"] {\n    0.9094947017729282.pib\n    0.9313225746154785.tib\n    0.95367431640625.gib\n    0.9765625.mib\n    1.kib\n    1.024.b\n    1.024.pib\n    1.024.tib\n    1.024.gib\n    1.024.mib\n    1.024.kib\n  }\n  [\"toDecimalUnit()\"] {\n    1.pb\n    1.tb\n    1.gb\n    1.mb\n    1.kb\n    1.b\n    1.125899906842624.pb\n    1.099511627776.tb\n    1.073741824.gb\n    1.048576.mb\n    1.024.kb\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/dir1/dir2/relativePathTo.pcf",
    "content": "res1 = \"No descendent path exists between modules `file:///$snippetsDir/input/api/dir1/dir2/relativePathTo.pkl` and `file:///$snippetsDir/input/api/module.pkl`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/duration.pcf",
    "content": "facts {\n  [\"isPositive\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isBetween\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"value\"] {\n    1\n    2.2\n    3\n    4.4\n    5\n    6.6\n    7\n    List(1, 2.2, 3)\n  }\n  [\"unit\"] {\n    \"ns\"\n    \"us\"\n    \"ms\"\n    \"s\"\n    \"min\"\n    \"h\"\n    \"d\"\n  }\n  [\"isoString\"] {\n    \"PT0.000000001S\"\n    \"PT0.0000022S\"\n    \"PT0.003S\"\n    \"PT4.4S\"\n    \"PT5M\"\n    \"PT6H36M\"\n    \"PT168H\"\n    \"PT2.0005S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT0S\"\n    \"PT2400H\"\n    \"-PT10.001S\"\n    \"-PT3H6M\"\n    \"PT9223372036854775807H7M8S\"\n    \"Cannot convert duration `NaN.s` to ISO 8601 duration.\"\n    \"Cannot convert duration `Infinity.s` to ISO 8601 duration.\"\n    \"Cannot convert duration `-Infinity.s` to ISO 8601 duration.\"\n    \"Cannot convert duration `Infinity.s` to ISO 8601 duration.\"\n  }\n  [\"toUnit()\"] {\n    1.d\n    24.h\n    1440.min\n    86400.s\n    86400000.ms\n    86400000000.us\n    86400000000000.ns\n    1.d\n    24.h\n    1440.min\n    86400.s\n    86400000000.us\n    86400000000000.ns\n    1800.s\n    0.5.h\n    \"Expected value of type `\\\"ns\\\"|\\\"us\\\"|\\\"ms\\\"|\\\"s\\\"|\\\"min\\\"|\\\"h\\\"|\\\"d\\\"`, but got `\\\"foo\\\"`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/dynamic.pcf",
    "content": "facts {\n  [\"length()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"getProperty()\"] {\n    \"Pigeon\"\n    \"Pigeon\"\n    42\n    \"Cannot find property `other` in object of type `Dynamic`.\"\n  }\n  [\"getPropertyOrNull()\"] {\n    \"Pigeon\"\n    \"Pigeon\"\n    42\n    null\n  }\n  [\"hasProperty()\"] {\n    true\n    true\n    true\n    false\n    true\n    false\n    true\n  }\n  [\"toMap()\"] {\n    Map(\"name\", \"Pigeon\", \"age\", 42)\n    Map(\"prop1\", \"prop1\", \"prop2\", \"prop2\", \"name\", \"Pigeon\", \"age\", 42)\n    Map(\"prop1\", \"prop1\", \"prop2\", \"prop2\", \"name\", \"Pigeon\", \"age\", 42)\n  }\n  [\"toList()\"] {\n    List()\n    List(\"one\", \"two\")\n    List(\"one one\", \"two two\")\n  }\n  [\"toTyped()\"] {\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    new {\n      name = \"Pigeon\"\n      age = 43\n    }\n    new {\n      name = \"Default\"\n      age = 42\n    }\n    \"Pigeon\"\n    \"Tried to read property `age` but its value is undefined.\"\n    \"Class `Pair` is not a subtype of `Typed`.\"\n    \"Cannot instantiate abstract class `ValueRenderer`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/float.pcf",
    "content": "facts {\n  [\"isNaN\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isFinite\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isInfinite\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isPositive\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isBetween()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isNonZero\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"toDuration()\"] {\n    true\n    true\n  }\n  [\"toDataSize()\"] {\n    true\n    true\n  }\n}\nexamples {\n  [\"sign\"] {\n    1.0\n    -1.0\n    0.0\n    -0.0\n    NaN\n    1.0\n    -1.0\n  }\n  [\"abs\"] {\n    2.34\n    2.34\n    0.0\n    0.0\n    NaN\n    Infinity\n    Infinity\n  }\n  [\"ceil\"] {\n    3.0\n    3.0\n    -2.0\n    -2.0\n    0.0\n    -0.0\n    NaN\n    Infinity\n    -Infinity\n  }\n  [\"floor\"] {\n    2.0\n    2.0\n    -3.0\n    -3.0\n    0.0\n    -0.0\n    NaN\n    Infinity\n    -Infinity\n  }\n  [\"round()\"] {\n    2.0\n    3.0\n    -2.0\n    -3.0\n    0.0\n    -0.0\n    NaN\n    Infinity\n    -Infinity\n  }\n  [\"truncate()\"] {\n    2.0\n    2.0\n    -2.0\n    -2.0\n    0.0\n    -0.0\n    NaN\n    Infinity\n    -Infinity\n  }\n  [\"toInt()\"] {\n    2\n    2\n    -2\n    -2\n    0\n    0\n    \"Cannot convert non-finite Float `Infinity` to Int.\"\n    \"Cannot convert non-finite Float `-Infinity` to Int.\"\n    \"Cannot convert non-finite Float `NaN` to Int.\"\n    \"Cannot convert Float `9.223372036854776E18` to Int because it is too large.\"\n  }\n  [\"toFloat()\"] {\n    2.34\n    2.9\n    -2.34\n    -2.9\n    0.0\n    -0.0\n    NaN\n    Infinity\n    -Infinity\n  }\n  [\"toString()\"] {\n    \"2.34\"\n    \"2.9\"\n    \"-2.34\"\n    \"-2.9\"\n    \"0.0\"\n    \"-0.0\"\n    \"NaN\"\n    \"Infinity\"\n    \"-Infinity\"\n  }\n  [\"toFixed()\"] {\n    \"2\"\n    \"3\"\n    \"-2\"\n    \"-3\"\n    \"0\"\n    \"-0\"\n    \"NaN\"\n    \"Infinity\"\n    \"-Infinity\"\n    \"2.3\"\n    \"2.90\"\n    \"-2.340\"\n    \"-2.9000\"\n    \"0.00000\"\n    \"-0.000000\"\n    \"NaN\"\n    \"Infinity\"\n    \"-Infinity\"\n    \"1.2\"\n    \"-1.23\"\n    \"1.235\"\n    \"-1.2346\"\n    \"1.23457\"\n    \"-1.234568\"\n    \"1.2345679\"\n    \"-1.23456789\"\n    \"1.234567890\"\n    \"123456789.1\"\n    \"123456789.12\"\n    \"123456789.123\"\n    \"123456789.1235\"\n    \"123456789.12346\"\n    \"123456789.123457\"\n    \"123456789.1234568\"\n    \"123456789.12345679\"\n    \"123456789.123456790\"\n    \"Type constraint `this.isBetween(0, 20)` violated. Value: -1\"\n    \"Type constraint `this.isBetween(0, 20)` violated. Value: 21\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/int.pcf",
    "content": "facts {\n  [\"isEven\"] {\n    true\n    true\n    true\n  }\n  [\"isOdd\"] {\n    true\n    true\n    true\n  }\n  [\"isNaN\"] {\n    true\n    true\n  }\n  [\"isFinite\"] {\n    true\n    true\n  }\n  [\"isInfinite\"] {\n    true\n    true\n  }\n  [\"isPositive\"] {\n    true\n    true\n    true\n  }\n  [\"isBetween()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isNonZero\"] {\n    true\n    true\n    true\n  }\n  [\"toDuration()\"] {\n    true\n    true\n  }\n  [\"toDataSize()\"] {\n    true\n    true\n  }\n}\nexamples {\n  [\"sign\"] {\n    1\n    -1\n    0\n    0\n  }\n  [\"abs\"] {\n    123\n    123\n    0\n    0\n  }\n  [\"ceil\"] {\n    123\n    -123\n    0\n    0\n  }\n  [\"floor\"] {\n    123\n    -123\n    0\n    0\n  }\n  [\"toRadixString()\"] {\n    \"7b\"\n    \"1111011\"\n    \"3o\"\n    \"-7b\"\n    \"-1111011\"\n    \"-3o\"\n    \"0\"\n    \"0\"\n    \"0\"\n    \"0\"\n    \"0\"\n    \"0\"\n    \"Type constraint `this.isBetween(2, 36)` violated. Value: -1\"\n    \"Type constraint `this.isBetween(2, 36)` violated. Value: 64\"\n  }\n  [\"round()\"] {\n    123\n    -123\n    0\n    0\n  }\n  [\"truncate()\"] {\n    123\n    -123\n    0\n    0\n  }\n  [\"toInt()\"] {\n    123\n    -123\n    0\n    0\n  }\n  [\"toFloat()\"] {\n    123.0\n    -123.0\n    0.0\n    0.0\n  }\n  [\"toString()\"] {\n    \"123\"\n    \"-123\"\n    \"0\"\n    \"0\"\n  }\n  [\"toFixed()\"] {\n    \"123\"\n    \"-123\"\n    \"0\"\n    \"0\"\n    \"123.0\"\n    \"-123.00\"\n    \"0.000\"\n    \"0.0000\"\n    \"123456789.0\"\n    \"123456789.00\"\n    \"123456789.000\"\n    \"123456789.0000\"\n    \"Type constraint `this.isBetween(0, 20)` violated. Value: 21\"\n    \"Type constraint `this.isBetween(0, 20)` violated. Value: -1\"\n  }\n  [\"shl()\"] {\n    492\n    -492\n    0\n  }\n  [\"shr()\"] {\n    30\n    -31\n    0\n  }\n  [\"ushr()\"] {\n    30\n    4611686018427387873\n    0\n  }\n  [\"and()\"] {\n    72\n    384\n  }\n  [\"or()\"] {\n    507\n    -51\n  }\n  [\"xor()\"] {\n    435\n    -435\n  }\n  [\"inv\"] {\n    -124\n    122\n  }\n  [\"toChar()\"] {\n    \"a\"\n    \"😊\"\n    \"Decimal `-1` is not a valid Unicode code point.\"\n    \"Decimal `1,114,112` is not a valid Unicode code point.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/intseq.pcf",
    "content": "examples {\n  [\"construction\"] {\n    IntSeq(-3, 2)\n    IntSeq(5, 5)\n    IntSeq(5, 0)\n    IntSeq(0, 0)\n    IntSeq(0, 10)\n    IntSeq(-10, 0)\n  }\n  [\"construction with step\"] {\n    IntSeq(-3, 2).step(2)\n    IntSeq(2, -3).step(-2)\n    IntSeq(2, -3).step(-5)\n    IntSeq(2, -3).step(-7)\n    IntSeq(0, 1).step(-9223372036854775808)\n    IntSeq(9223372036854775807, -9223372036854775808).step(-9223372036854775808)\n    IntSeq(-9223372036854775808, 9223372036854775807).step(9223372036854775807)\n    \"Type constraint `isNonZero` violated. Value: 0\"\n  }\n  [\"start\"] {\n    -3\n    2\n  }\n  [\"end\"] {\n    2\n    -3\n  }\n  [\"step\"] {\n    1\n    2\n    1\n    -2\n  }\n  [\"fold\"] {\n    List(-3, -2, -1, 0, 1, 2)\n    List(5)\n    List()\n    List(0)\n    List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n    List(-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0)\n    List(-3, -1, 1)\n    List(2, 0, -2)\n    List(2, -3)\n    List(2)\n  }\n  [\"map\"] {\n    List(-3, -2, -1, 0, 1, 2)\n    List(5)\n    List()\n    List(0)\n    List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n    List(-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0)\n    List(-3, -1, 1)\n    List(2, 0, -2)\n    List(2, -3)\n    List(2)\n    List()\n    List(9223372036854775807, -1)\n    List(-9223372036854775808, -1, 9223372036854775806)\n  }\n  [\"cannot instantiate\"] {\n    \"Cannot instantiate, or amend an instance of, external class `IntSeq`.\"\n  }\n  [\"toList\"] {\n    true\n    true\n    true\n  }\n  [\"toListing\"] {\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser1.pcf",
    "content": "res1 = null\nres2 = true\nres3 = false\nres4 = 123\nres5 = \"Error parsing JSON document.\"\nres6 = \"Error parsing JSON document.\"\nres7 = \"Error parsing JSON document.\"\nres8 = 123.456\nres9 = 12345.6\nres10 = \"Error parsing JSON document.\"\nres11 = \"Error parsing JSON document.\"\nres12 = \"hello\"\nres13 = \"\"\"\n  hello\n  world\n  \"\"\"\nres14 {\n  \"one\"\n  \"two\"\n  \"three\"\n}\nres15 {\n  name = \"Pigeon\"\n  age = 42\n}\nres16 {\n  firstName = \"John\"\n  lastName = \"Smith\"\n  age = 25\n  address {\n    streetAddress = \"21 2nd Street\"\n    city = \"New York\"\n    state = \"NY\"\n    postalCode = \"10021\"\n  }\n  phoneNumber {\n    new {\n      type = \"home\"\n      number = \"212 555-1234\"\n    }\n    new {\n      type = \"fax\"\n      number = \"646 555-4567\"\n    }\n  }\n  gender {\n    type = \"male\"\n  }\n}\nres17 = \"Error parsing JSON document.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser2.pcf",
    "content": "res1 = null\nres2 = false\nres3 = true\nres4 = 124\nres8 = 124.686\nres9 = 12346.83\nres10 = \"Error parsing JSON document.\"\nres11 = \"Error parsing JSON document.\"\nres12 = \"hellox\"\nres13 = \"\"\"\n  hello\n  worldx\n  \"\"\"\nres14 {\n  \"onex\"\n  \"twox\"\n  \"threex\"\n  \"other\"\n}\nres15 {\n  name = \"Pigeonx\"\n  age = 43\n  other = \"other\"\n}\nres16 {\n  firstName = \"Johnx\"\n  lastName = \"Smithx\"\n  age = 26\n  address {\n    streetAddress = \"21 2nd Streetx\"\n    city = \"New Yorkx\"\n    state = \"NYx\"\n    postalCode = \"10021x\"\n    other = \"other\"\n  }\n  phoneNumber {\n    new {\n      type = \"homex\"\n      number = \"212 555-1234x\"\n      other = \"other\"\n    }\n    new {\n      type = \"faxx\"\n      number = \"646 555-4567x\"\n      other = \"other\"\n    }\n    \"other\"\n  }\n  gender {\n    type = \"malex\"\n    other = \"other\"\n  }\n  other = \"other\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser3.pcf",
    "content": "res1 {\n  firstName = \"changed\"\n  lastName = \"Smith\"\n  age = 42\n  address {\n    streetAddress = \"21 2nd Street\"\n    city = \"kroY weN\"\n    state = \"CA\"\n    postalCode = \"10021\"\n  }\n  phoneNumber {\n    \"mobile\"\n    \"mobile\"\n  }\n  gender {\n    type = \"female\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser4.pcf",
    "content": "res1 {\n  \"one\"\n  \"two\"\n  \"three\"\n}\nres2 {\n  [\"name\"] = \"Pigeon\"\n  [\"age\"] = 42\n}\nres3 {\n  [\"firstName\"] = \"John\"\n  [\"lastName\"] = \"Smith\"\n  [\"age\"] = 25\n  [\"address\"] {\n    [\"streetAddress\"] = \"21 2nd Street\"\n    [\"city\"] = \"New York\"\n    [\"state\"] = \"NY\"\n    [\"postalCode\"] = \"10021\"\n  }\n  [\"phoneNumber\"] {\n    new {\n      [\"type\"] = \"home\"\n      [\"number\"] = \"212 555-1234\"\n    }\n    new {\n      [\"type\"] = \"fax\"\n      [\"number\"] = \"646 555-4567\"\n    }\n  }\n  [\"gender\"] {\n    [\"type\"] = \"male\"\n  }\n}\nres4 = true\nres5 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonParser5.pcf",
    "content": "res1 {\n  [\"firstName\"] = \"changed\"\n  [\"lastName\"] = \"Smith\"\n  [\"age\"] = 42\n  [\"address\"] {\n    [\"streetAddress\"] = \"21 2nd Street\"\n    [\"city\"] = \"kroY weN\"\n    [\"state\"] = \"CA\"\n    [\"postalCode\"] = \"10021\"\n  }\n  [\"phoneNumber\"] {\n    \"mobile\"\n    \"mobile\"\n  }\n  [\"gender\"] {\n    [\"type\"] = \"female\"\n  }\n}\nres2 = true\nres3 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer1.json",
    "content": "{\n  \"name\": \"pigeon\",\n  \"age\": 30\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer2.json",
    "content": "{\n    \"res1\": \"gnirts\",\n    \"res2\": false,\n    \"res3\": 43,\n    \"res4\": 2.33,\n    \"res5\": \"3 s\",\n    \"res6\": \"4 mb\",\n    \"res8\": [\n        43,\n        false,\n        \"gnirts\"\n    ],\n    \"res9\": [\n        \"gnirts\",\n        false,\n        43,\n        5\n    ],\n    \"res10\": {\n        \"eno\": false,\n        \"owt\": 2.33,\n        \"eerht\": \"3 s\"\n    },\n    \"res11\": [\n        \"gnirts\",\n        false,\n        43,\n        5\n    ],\n    \"res12\": {\n        \"eman\": \"noegip\",\n        \"ega\": 31,\n        \"eerht\": \"3 s\"\n    },\n    \"res13\": {\n        \"name\": \"noegip\",\n        \"age\": 31,\n        \"other\": \"rehto\"\n    },\n    \"res14\": {\n        \"name\": \"noegip\",\n        \"age\": 41\n    },\n    \"res15\": \"String\",\n    \"res16\": [\n        2,\n        3\n    ],\n    \"res17\": [\n        2,\n        5,\n        2\n    ]\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer2b.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = true\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer3.json",
    "content": "{\n  \"res1\": \"converted\",\n  \"res2\": \"converted\",\n  \"res3\": \"converted\",\n  \"res4\": \"converted\",\n  \"res5\": \"converted\",\n  \"res6\": \"converted\",\n  \"res8\": \"converted\",\n  \"res9\": \"converted\",\n  \"res10\": \"converted\",\n  \"res11\": \"converted\",\n  \"res12\": \"converted\",\n  \"res13\": \"converted\",\n  \"res14\": \"converted\",\n  \"res15\": \"converted\",\n  \"res16\": \"converted\",\n  \"res17\": \"converted\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer4.pcf",
    "content": "res1 = \"123\"\nres2 = \"1.23\"\nres3 = \"false\"\nres4 = \"\\\"pigeon\\\"\"\nres6 = \"\"\"\n  [\n    \"pigeon\",\n    \"parrot\"\n  ]\n  \"\"\"\nres7 = \"\"\"\n  [\n    \"pigeon\",\n    \"parrot\"\n  ]\n  \"\"\"\nres8 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \"\"\"\nres9 = \"\"\"\n  [\n    \"pigeon\",\n    \"parrot\"\n  ]\n  \"\"\"\nres10 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \"\"\"\nres11 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \"\"\"\nres12 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \"\"\"\nres13 = \"null\"\nres14 = \"Cannot render value of type `Duration` as JSON. Value: 1.min\"\nres15 = \"Cannot render value of type `Pair` as JSON. Value: Pair(1, 2)\"\nres16 = \"Cannot render value of type `DataSize` as JSON. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as JSON. Value: jsonRenderer4#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as JSON. Value: jsonRenderer4#Email\"\nres19 = \"Cannot render value of type `Function1` as JSON. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as JSON. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer5.pcf",
    "content": "res1 = \"\"\"\n  123\n  \n  \"\"\"\nres2 = \"\"\"\n  1.23\n  \n  \"\"\"\nres3 = \"\"\"\n  false\n  \n  \"\"\"\nres4 = \"\"\"\n  \"pigeon\"\n  \n  \"\"\"\nres6 = \"\"\"\n  [\n    \"pigeon\",\n    \"parrot\"\n  ]\n  \n  \"\"\"\nres7 = \"\"\"\n  [\n    \"pigeon\",\n    \"parrot\"\n  ]\n  \n  \"\"\"\nres8 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \n  \"\"\"\nres9 = \"\"\"\n  [\n    \"pigeon\",\n    \"parrot\"\n  ]\n  \n  \"\"\"\nres10 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \n  \"\"\"\nres11 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \n  \"\"\"\nres12 = \"\"\"\n  {\n    \"name\": \"pigeon\",\n    \"age\": 42\n  }\n  \n  \"\"\"\nres13 = \"\"\"\n  null\n  \n  \"\"\"\nres14 = \"Cannot render value of type `Duration` as JSON. Value: 1.min\"\nres15 = \"Cannot render value of type `Pair` as JSON. Value: Pair(1, 2)\"\nres16 = \"Cannot render value of type `DataSize` as JSON. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as JSON. Value: jsonRenderer5#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as JSON. Value: jsonRenderer5#Email\"\nres19 = \"Cannot render value of type `Function1` as JSON. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as JSON. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer6.json",
    "content": "{\n  \"name\": \"noegip\",\n  \"age\": 42,\n  \"friends\": [\n    \"barn owlx\",\n    \"parrotx\"\n  ],\n  \"hobbies\": {\n    \"surfing\": \"low\",\n    \"firemaking\": \"high\"\n  },\n  \"address\": {\n    \"street\": \"Other St.\",\n    \"zip\": \"changed\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer7.pcf",
    "content": "{\n  \"res2\": 1,\n  \"res3\": \"Hello\",\n  \"res4\": {\n    \"foo\": 1\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer8.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as JSON.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.base#JsonRenderer.renderDocument (file:///$snippetsDir/input/api/jsonRenderer8.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRenderer9.json5",
    "content": "{\n  \"FOO\": \"a\",\n  \"bar\": \"b\", // bar,\n  \"baz\": {\n    \"qux\": \"c\", // qux,\n    \"quux\": \"c\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonRendererEmptyComposites.pcf",
    "content": "{\n  \"a1\": [],\n  \"a2\": [],\n  \"a3\": [],\n  \"b1\": {},\n  \"b2\": {},\n  \"b3\": {},\n  \"nested\": {\n    \"a1\": [],\n    \"a2\": [],\n    \"a3\": [],\n    \"b1\": {},\n    \"b2\": {},\n    \"b3\": {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer1.jsonnet",
    "content": "{\n  int: 123,\n  float: 1.23,\n  bool: true,\n  string: 'Pigeon',\n  unicodeString: 'abc😀abc😎abc',\n  multiLineString: |||\n    have a\n    great\n    day\n  |||,\n  typedObject: {\n    name: 'Bob',\n    age: 42,\n    address: {\n      street: 'Abby Rd.',\n    },\n  },\n  dynamicObject: {\n    name: 'Pigeon',\n    age: 30,\n    address: {\n      street: 'Folsom St.',\n    },\n  },\n  annoyingNames: {\n    '5hello': 123,\n    'local': 'remote',\n    'foo.bar': 'baz',\n    \"single'quote\": 'double\"quote',\n  },\n  list: [\n    1,\n    2,\n    3,\n    null,\n  ],\n  someExternalVariable: std.extVar('MY_VARIABLE'),\n  someImportStr: importstr 'my/private/key.pem',\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer2.jsonnet",
    "content": "{ hello: { world: [1, 'foo\\nbar'] }, emptyArray: [], emptyObject: {} }\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer3.jsonnet",
    "content": "{\n  res1: 'converted',\n  res2: 'converted',\n  res3: 'converted',\n  res4: 'converted',\n  res5: 'converted',\n  res6: 'converted',\n  res8: 'converted',\n  res9: 'converted',\n  res10: 'converted',\n  res11: 'converted',\n  res12: 'converted',\n  res13: 'converted',\n  res14: 'converted',\n  res15: 'converted',\n  res16: 'converted',\n  res17: 'converted',\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer4.pcf",
    "content": "res1 = \"123\"\nres2 = \"1.23\"\nres3 = \"false\"\nres4 = \"'pigeon'\"\nres6 = \"\"\"\n  [\n    'pigeon',\n    'parrot',\n  ]\n  \"\"\"\nres7 = \"\"\"\n  [\n    'pigeon',\n    'parrot',\n  ]\n  \"\"\"\nres8 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \"\"\"\nres9 = \"\"\"\n  [\n    'pigeon',\n    'parrot',\n  ]\n  \"\"\"\nres10 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \"\"\"\nres11 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \"\"\"\nres12 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \"\"\"\nres13 = \"null\"\nres14 = \"Cannot render value of type `Pair` as Jsonnet. Value: Pair(1, 2)\"\nres15 = \"Cannot render value of type `Duration` as Jsonnet. Value: 1.min\"\nres16 = \"Cannot render value of type `DataSize` as Jsonnet. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as Jsonnet. Value: jsonnetRenderer4#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as Jsonnet. Value: jsonnetRenderer4#Email\"\nres19 = \"Cannot render value of type `Function1` as Jsonnet. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as Jsonnet. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer5.pcf",
    "content": "res1 = \"\"\"\n  123\n  \n  \"\"\"\nres2 = \"\"\"\n  1.23\n  \n  \"\"\"\nres3 = \"\"\"\n  false\n  \n  \"\"\"\nres4 = \"\"\"\n  'pigeon'\n  \n  \"\"\"\nres6 = \"\"\"\n  [\n    'pigeon',\n    'parrot',\n  ]\n  \n  \"\"\"\nres7 = \"\"\"\n  [\n    'pigeon',\n    'parrot',\n  ]\n  \n  \"\"\"\nres8 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \n  \"\"\"\nres9 = \"\"\"\n  [\n    'pigeon',\n    'parrot',\n  ]\n  \n  \"\"\"\nres10 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \n  \"\"\"\nres11 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \n  \"\"\"\nres12 = \"\"\"\n  {\n    name: 'pigeon',\n    age: 42,\n  }\n  \n  \"\"\"\nres13 = \"\"\"\n  null\n  \n  \"\"\"\nres14 = \"Cannot render value of type `Pair` as Jsonnet. Value: Pair(1, 2)\"\nres15 = \"Cannot render value of type `Duration` as Jsonnet. Value: 1.min\"\nres16 = \"Cannot render value of type `DataSize` as Jsonnet. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as Jsonnet. Value: jsonnetRenderer5#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as Jsonnet. Value: jsonnetRenderer5#Email\"\nres19 = \"Cannot render value of type `Function1` as Jsonnet. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as Jsonnet. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer6.jsonnet",
    "content": "{\n  name: 'noegip',\n  age: 42,\n  friends: [\n    'barn owlx',\n    'parrotx',\n  ],\n  hobbies: {\n    surfing: 'low',\n    firemaking: 'high',\n  },\n  address: {\n    street: 'Other St.',\n    zip: 'changed',\n  },\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer7.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as Jsonnet.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.jsonnet#Renderer.renderDocument (file:///$snippetsDir/input/api/jsonnetRenderer7.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/jsonnetRenderer8.jsonnet",
    "content": "{\n  FOO: 'a',\n  bar: 'b', // bar,\n  baz: {\n    qux: 'c', // qux,\n    quux: 'c',\n  },\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/list.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n    true\n  }\n  [\"isNotEmpty\"] {\n    true\n    true\n  }\n  [\"every()\"] {\n    true\n    true\n  }\n  [\"any()\"] {\n    true\n    true\n  }\n  [\"contains()\"] {\n    true\n    true\n  }\n  [\"startsWith()\"] {\n    true\n    true\n    true\n  }\n  [\"endsWith()\"] {\n    true\n    true\n    true\n  }\n  [\"isDistinct\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isDistinctBy()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"every\"] {\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"any\"] {\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"length\"] {\n    3\n  }\n  [\"filter()\"] {\n    List(2, 3)\n    List()\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"map()\"] {\n    List(2, 4, 6)\n    List(List(1, 1), List(2, 2), List(3, 3))\n  }\n  [\"flatMap()\"] {\n    List(1, 2, 2, 3, 3, 4)\n    \"Expected value of type `Collection`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"flatten()\"] {\n    List(1, 2, 2, 3, 4, 5)\n    List(1, 2, 2, 3, 4, 5)\n    List(1, 2, 2, 3, 4, 5)\n    List(1, 2, 2, 3, 4, 5)\n    List()\n  }\n  [\"first\"] {\n    1\n  }\n  [\"rest\"] {\n    List(2, 3)\n  }\n  [\"last\"] {\n    3\n  }\n  [\"single\"] {\n    1\n  }\n  [\"count()\"] {\n    2\n    3\n    0\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"find()\"] {\n    2\n    1\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"findLast()\"] {\n    3\n    3\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"indexOf()\"] {\n    1\n    1\n  }\n  [\"lastIndexOf()\"] {\n    1\n    3\n  }\n  [\"findIndex()\"] {\n    1\n    1\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"findLastIndex()\"] {\n    2\n    3\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"take()\"] {\n    List()\n    List(1, 2)\n    List(1, 2, 3)\n  }\n  [\"takeWhile()\"] {\n    List(1, 2, 3)\n    List()\n    List(1, 2)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"takeLast()\"] {\n    List()\n    List(2, 3)\n    List(1, 2, 3)\n  }\n  [\"takeLastWhile()\"] {\n    List(1, 2, 3)\n    List()\n    List(2, 3)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"drop()\"] {\n    List(1, 2, 3)\n    List(3)\n    List()\n  }\n  [\"dropWhile()\"] {\n    List()\n    List(1, 2, 3)\n    List(3)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"dropLast()\"] {\n    List(1, 2, 3)\n    List(1)\n    List()\n  }\n  [\"dropLastWhile()\"] {\n    List()\n    List(1, 2, 3)\n    List(1)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"fold()\"] {\n    6\n    List(1, 2, 3)\n    1\n    0\n  }\n  [\"foldBack()\"] {\n    6\n    List(3, 2, 1)\n    1\n    0\n  }\n  [\"reduce()\"] {\n    6\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"groupBy()\"] {\n    Map(1, List(1), 2, List(2), 3, List(3), 4, List(4), 5, List(5))\n    Map(1, List(1, 1), 2, List(2, 2), 3, List(3))\n    Map(true, List(1, 3, 5), false, List(2, 4))\n    Map(true, List(1, 2, 3, 2, 1))\n    Map()\n  }\n  [\"repeat()\"] {\n    List()\n    List(1, 2, 3)\n    List(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)\n    List()\n    List()\n    List()\n    \"Expected a positive number, but got `-1`.\"\n    118866785\n  }\n  [\"sortWith()\"] {\n    List()\n    List(1, 1, 1, 2, 3)\n    List(1, 2, 3, 4, 5)\n    List(0, 0, 1, 1, 2, 3, 3, 4, 4, 5)\n  }\n  [\"replaceRange()\"] {\n    List(1, 9, 8, 5)\n    List(1, 9, 5)\n    List(1, 5)\n    List(1, 9, 8, 2, 3, 4, 5)\n    List(1, 9, 2, 3, 4, 5)\n    List(1, 2, 3, 4, 5)\n    \"Element index `-1` is out of range `0`..`5`. Collection: List(1, 2, 3, 4, 5)\"\n    \"Element index `6` is out of range `3`..`5`. Collection: List(1, 2, 3, 4, 5)\"\n  }\n  [\"toList()\"] {\n    List(1, 2, 3)\n    List(1, 2, 3, 4, 5)\n    List(1, 2, 3, 2, 1)\n  }\n  [\"toSet()\"] {\n    Set(1, 2, 3)\n    Set(1, 2, 3, 4, 5)\n    Set(1, 2, 3)\n    Set(new {\n      a = 1\n    }, new {\n      b = 2\n    })\n  }\n  [\"toMap()\"] {\n    Map(1, 2, 2, 4, 3, 6)\n    Map(\"Pigeon\", new {\n      name = \"Pigeon\"\n      age = 40\n    }, \"Parrot\", new {\n      name = \"Parrot\"\n      age = 30\n    })\n  }\n  [\"lastIndex\"] {\n    2\n    -1\n  }\n  [\"add()\"] {\n    List(42)\n    List(1, 2, 3, 42)\n  }\n  [\"replace()\"] {\n    List(42, 2, 3)\n    List(1, 42, 3)\n    List(1, 2, 42)\n    \"Element index `-1` is out of range `0`..`2`. Collection: List(1, 2, 3)\"\n    \"Element index `3` is out of range `0`..`2`. Collection: List(1, 2, 3)\"\n    \"Element index `0` is out of range `0`..`-1`. Collection: List()\"\n  }\n  [\"minWith()\"] {\n    1\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"maxWith()\"] {\n    3\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"zip()\"] {\n    List(Pair(1, 4), Pair(2, 5), Pair(3, 6))\n    List(Pair(1, 4), Pair(2, 5), Pair(3, 6))\n  }\n  [\"filterIndexed()\"] {\n    List(2)\n    List(1, 3)\n    List()\n    List(3)\n  }\n  [\"mapIndexed()\"] {\n    List(0, 2, 6)\n    List(false, true, false)\n  }\n  [\"mapNonNullIndexed()\"] {\n    List(2, 12)\n    List(2, 12)\n  }\n  [\"flatMapIndexed()\"] {\n    List(0, 2, 6)\n    List(false, true, false)\n  }\n  [\"foldIndexed()\"] {\n    9\n    1\n    0\n  }\n  [\"toListing()\"] {\n    new {\n      1\n      2\n      3\n    }\n    new {}\n  }\n  [\"toDynamic()\"] {\n    new {\n      1\n      2\n      3\n    }\n    new {}\n  }\n  [\"toBytes()\"] {\n    Bytes(1, 2, 3)\n    Bytes()\n    \"Expected value of type `Int`, but got `null`.\"\n    \"Type constraint `isBetween(0, 255)` violated. Value: -1\"\n  }\n  [\"filterNonNull()\"] {\n    List(1, 2, 3)\n    List()\n    List(1, 2, 3)\n    List()\n  }\n  [\"mapNonNull()\"] {\n    List(1, 2, 3)\n    List()\n    List()\n    List(1, 2, 3)\n  }\n  [\"filterIsInstance()\"] {\n    List(1, 2, 3)\n    List(1, 2, 3)\n    List(1, 2, 3)\n    List()\n    List()\n    List(\"2\", \"4\")\n    List()\n  }\n  [\"distinct\"] {\n    List(1, 2, 3)\n    List(1, 2)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\")\n    List(1, \"1\")\n    List()\n  }\n  [\"distinctBy()\"] {\n    List(1, 2, 3)\n    List(1, 2)\n    List(\"Pigeon\", \"Barn Owl\", \"Parrot\")\n    List(1)\n    List()\n  }\n  [\"split()\"] {\n    Pair(List(), List(1, 2, 3))\n    Pair(List(1), List(2, 3))\n    Pair(List(1, 2), List(3))\n    Pair(List(1, 2, 3), List())\n    Pair(List(), List())\n    \"Element index `-1` is out of range `0`..`3`. Collection: List(1, 2, 3)\"\n    \"Element index `4` is out of range `0`..`3`. Collection: List(1, 2, 3)\"\n  }\n  [\"partition()\"] {\n    Pair(List(2), List(1, 3))\n    Pair(List(1, 3), List(2))\n    Pair(List(1, 2, 3), List())\n    Pair(List(), List(1, 2, 3))\n    Pair(List(), List())\n  }\n  [\"min\"] {\n    1\n    \"Barn Owl\"\n    -99999\n    42\n    42\n    42.0\n    100.mb\n    100.ms\n    \"Expected a non-empty collection. Collection: List()\"\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"max\"] {\n    3\n    \"Pigeon\"\n    42\n    42\n    42\n    42.0\n    12.tb\n    3.d\n    \"Expected a non-empty collection. Collection: List()\"\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"minBy()\"] {\n    1\n    3\n    \"Pigeon\"\n    \"Barn Owl\"\n    11.gb\n    100.mb\n    11.s\n    100.ms\n    \"Expected a non-empty collection. Collection: List()\"\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"maxBy()\"] {\n    3\n    1\n    \"Barn Owl\"\n    \"Parrot\"\n    100.mb\n    12.tb\n    100.ms\n    12.min\n    \"Expected a non-empty collection. Collection: List()\"\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"sort()\"] {\n    List(1, 2, 3)\n    List(-99999, -8.4, 3.9, 42)\n    List(\"Barn Owl\", \"Parrot\", \"Pigeon\")\n    List(100.mb, 11.gb, 12.tb)\n    List(100.ms, 11.s, 3.d)\n    List()\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"sortBy()\"] {\n    List(1, 2, 3)\n    List(3, 2, 1)\n    List(\"Pigeon\", \"Parrot\", \"Barn Owl\")\n    List(\"Barn Owl\", \"Pigeon\", \"Parrot\")\n    List(11.gb, 12.tb, 100.mb)\n    List(100.mb, 11.gb, 12.tb)\n    List()\n    List(0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10)\n  }\n  [\"reverse()\"] {\n    List(3, 2, 1)\n    List(1, 2, 3)\n    List(3.d, \"Pigeon\", 1)\n    List()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/listNullable.pcf",
    "content": "examples {\n  [\"getOrNull()\"] {\n    2\n    null\n    null\n  }\n  [\"sublistOrNull()\"] {\n    List(2, 3)\n    null\n  }\n  [\"firstOrNull\"] {\n    1\n    null\n  }\n  [\"restOrNull\"] {\n    List(2, 3)\n    null\n  }\n  [\"lastOrNull\"] {\n    3\n    null\n  }\n  [\"singleOrNull\"] {\n    1\n    null\n    null\n  }\n  [\"findOrNull()\"] {\n    2\n    null\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"findLastOrNull()\"] {\n    3\n    null\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"indexOfOrNull()\"] {\n    1\n    null\n  }\n  [\"lastIndexOfOrNull()\"] {\n    1\n    null\n  }\n  [\"findIndexOrNull()\"] {\n    1\n    null\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"findLastIndexOrNull()\"] {\n    2\n    null\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"reduceOrNull()\"] {\n    6\n    1\n    null\n  }\n  [\"replaceRangeOrNull()\"] {\n    List(1, 9, 8, 5)\n    List(1, 9, 5)\n    List(1, 5)\n    List(1, 9, 8, 2, 3, 4, 5)\n    List(1, 9, 2, 3, 4, 5)\n    List(1, 2, 3, 4, 5)\n    null\n    null\n  }\n  [\"replaceOrNull()\"] {\n    List(42, 2, 3)\n    List(1, 42, 3)\n    List(1, 2, 42)\n    null\n    null\n    null\n  }\n  [\"minWithOrNull()\"] {\n    1\n    1\n    null\n    3\n    1\n    null\n  }\n  [\"splitOrNull()\"] {\n    Pair(List(), List(1, 2, 3))\n    Pair(List(1), List(2, 3))\n    Pair(List(1, 2), List(3))\n    Pair(List(1, 2, 3), List())\n    Pair(List(), List())\n    null\n    null\n  }\n  [\"minOrNull\"] {\n    1\n    \"Barn Owl\"\n    -99999\n    42\n    42\n    42.0\n    100.mb\n    100.ms\n    null\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"maxOrNull\"] {\n    3\n    \"Pigeon\"\n    42\n    42\n    42\n    42.0\n    12.tb\n    3.d\n    null\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"minByOrNull()\"] {\n    1\n    3\n    \"Pigeon\"\n    \"Barn Owl\"\n    11.gb\n    100.mb\n    11.s\n    100.ms\n    null\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"maxByOrNull()\"] {\n    3\n    1\n    \"Barn Owl\"\n    \"Parrot\"\n    100.mb\n    12.tb\n    100.ms\n    12.min\n    null\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/listing.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isNotEmpty\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"lastIndex\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isDistinct\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"isDistinctBy()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"getOrNull\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"first\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"firstOrNull\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"last\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"lastOrNull\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"single\"] {\n    true\n    true\n    true\n  }\n  [\"singleOrNull\"] {\n    true\n    true\n    true\n  }\n  [\"every\"] {\n    true\n    true\n    true\n  }\n  [\"any\"] {\n    true\n    true\n    true\n  }\n  [\"contains\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"length\"] {\n    0\n    0\n    3\n    5\n    3\n    3\n    5\n  }\n  [\"toList()\"] {\n    List()\n    List()\n    List(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n    List(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    }, new {\n      name = \"Albatross\"\n    }, new {\n      name = \"Elf Owl\"\n    })\n    List(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    }, new {\n      name = \"Albatross\"\n    }, new {\n      name = \"Parrot\"\n    }, new {\n      name = \"Elf Owl\"\n    })\n    List(new {\n      name = \"Wood Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n    List(new {\n      name = \"Wood Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n  }\n  [\"toSet()\"] {\n    Set()\n    Set()\n    Set(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n    Set(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    }, new {\n      name = \"Albatross\"\n    }, new {\n      name = \"Elf Owl\"\n    })\n    Set(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    }, new {\n      name = \"Albatross\"\n    }, new {\n      name = \"Elf Owl\"\n    })\n    Set(new {\n      name = \"Wood Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n    Set(new {\n      name = \"Wood Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n  }\n  [\"distinct\"] {\n    new {}\n    new {}\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n      new {\n        name = \"Albatross\"\n      }\n      new {\n        name = \"Elf Owl\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n      new {\n        name = \"Albatross\"\n      }\n      new {\n        name = \"Elf Owl\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n  }\n  [\"distinctBy()\"] {\n    new {}\n    new {}\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n      new {\n        name = \"Albatross\"\n      }\n      new {\n        name = \"Elf Owl\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n      new {\n        name = \"Albatross\"\n      }\n      new {\n        name = \"Elf Owl\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {}\n    new {}\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n      new {\n        name = \"Albatross\"\n      }\n      new {\n        name = \"Elf Owl\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n      new {\n        name = \"Albatross\"\n      }\n      new {\n        name = \"Elf Owl\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n      new {\n        name = \"Barn Owl\"\n      }\n      new {\n        name = \"Parrot\"\n      }\n    }\n    new {}\n    new {}\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n    }\n    new {\n      new {\n        name = \"Pigeon\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n    }\n    new {\n      new {\n        name = \"Wood Pigeon\"\n      }\n    }\n  }\n  [\"fold\"] {\n    List()\n    List(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n    List(new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    }, new {\n      name = \"Albatross\"\n    }, new {\n      name = \"Elf Owl\"\n    })\n    List(new {\n      name = \"Wood Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n    List(new {\n      name = \"Wood Pigeon\"\n    }, new {\n      name = \"Barn Owl\"\n    }, new {\n      name = \"Parrot\"\n    })\n  }\n  [\"foldIndexed\"] {\n    List()\n    List(Pair(0, new {\n      name = \"Pigeon\"\n    }), Pair(1, new {\n      name = \"Barn Owl\"\n    }), Pair(2, new {\n      name = \"Parrot\"\n    }))\n    List(Pair(0, new {\n      name = \"Pigeon\"\n    }), Pair(1, new {\n      name = \"Barn Owl\"\n    }), Pair(2, new {\n      name = \"Parrot\"\n    }), Pair(3, new {\n      name = \"Albatross\"\n    }), Pair(4, new {\n      name = \"Elf Owl\"\n    }))\n    List(Pair(0, new {\n      name = \"Wood Pigeon\"\n    }), Pair(1, new {\n      name = \"Barn Owl\"\n    }), Pair(2, new {\n      name = \"Parrot\"\n    }))\n    List(Pair(0, new {\n      name = \"Wood Pigeon\"\n    }), Pair(1, new {\n      name = \"Barn Owl\"\n    }), Pair(2, new {\n      name = \"Parrot\"\n    }))\n  }\n  [\"join\"] {\n    \"\"\n    \"123\"\n    \"1, 2, 3\"\n    \"PigeonBarn OwlParrot\"\n    \"Pigeon---Barn Owl---Parrot\"\n    \"PigeonBarn OwlParrotAlbatrossElf Owl\"\n    \"\"\"\n    Pigeon\n    Barn Owl\n    Parrot\n    Albatross\n    Elf Owl\n    \"\"\"\n    \"Wood PigeonBarn OwlParrot\"\n    \"\"\"\n    Wood Pigeon\n    Barn Owl\n    Parrot\n    \"\"\"\n    \"Wood PigeonBarn OwlParrot\"\n    \"\"\"\n    Wood Pigeon\n    Barn Owl\n    Parrot\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/map.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n    true\n  }\n  [\"isNotEmpty\"] {\n    true\n    true\n  }\n  [\"containsKey()\"] {\n    true\n    true\n    true\n  }\n  [\"containsValue()\"] {\n    true\n    true\n    true\n  }\n  [\"every()\"] {\n    true\n    true\n    true\n  }\n  [\"any()\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"length\"] {\n    0\n    3\n  }\n  [\"getOrNull()\"] {\n    1\n    null\n  }\n  [\"keys\"] {\n    Set()\n    Set(\"one\", \"two\", \"three\")\n    Set(\"one\", \"two\", \"three\", \"four\")\n  }\n  [\"values\"] {\n    List()\n    List(1, 2, 3)\n    List(1, 2, 3, 4)\n  }\n  [\"remove()\"] {\n    Map()\n    Map(\"one\", 1, \"three\", 3)\n    Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  }\n  [\"filter()\"] {\n    Map()\n    Map(\"one\", 1, \"two\", 2)\n    Map(\"two\", 2)\n  }\n  [\"mapKeys()\"] {\n    Map()\n    Map(\"ONE1\", 1, \"TWO2\", 2, \"THREE3\", 3)\n    Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  }\n  [\"mapValues()\"] {\n    Map()\n    Map(\"one\", 6, \"two\", 9, \"three\", 14)\n    Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  }\n  [\"map()\"] {\n    Map()\n    Map(\"one\", 3, \"two\", 6, \"three\", 9)\n    Map(1, \"one\", 2, \"two\", 3, \"three\")\n    \"Expected value of type `Pair`, but got type `Int`. Value: 42\"\n  }\n  [\"flatMap()\"] {\n    Map()\n    Map(1, 3, 2, 6, 3, 9)\n    Map(\"one\", \"eno\", \"two\", \"owt\", \"three\", \"eerht\")\n    \"Expected value of type `Map`, but got type `Int`. Value: 42\"\n  }\n  [\"entries\"] {\n    List()\n    List(Pair(\"one\", 1), Pair(\"two\", 2), Pair(\"three\", 3))\n    List(Pair(\"one\", 1), Pair(\"two\", 2), Pair(\"three\", 3), Pair(\"four\", 4))\n  }\n  [\"toMap()\"] {\n    Map()\n    Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  }\n  [\"toDynamic()\"] {\n    new {}\n    new {\n      one = 1\n      two = 2\n      three = 3\n    }\n  }\n  [\"toMapping()\"] {\n    new {}\n    new {\n      [\"one\"] = 1\n      [\"two\"] = 2\n      [\"three\"] = 3\n    }\n  }\n  [\"put()\"] {\n    Map(\"one\", 1)\n    Map(\"one\", 1, \"two\", 2, \"three\", 3)\n    Map(\"one\", 1, \"two\", 2, \"three\", 3, \"four\", 4)\n    Map(\"one\", 4, \"two\", 2, \"three\", 3)\n  }\n  [\"toTyped()\"] {\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    \"Default\"\n    true\n    true\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    \"Tried to read property `age` but its value is undefined.\"\n    \"Class `Int` is not a subtype of `Typed`.\"\n    \"Cannot instantiate abstract class `map#Abstract`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/mapping.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"isNotEmpty\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"containsKey()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"containsValue()\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"length\"] {\n    true\n    true\n    true\n  }\n  [\"keys (of type string)\"] {\n    true\n    true\n    true\n  }\n  [\"keys (of type object)\"] {\n    true\n    true\n  }\n  [\"every()\"] {\n    true\n    true\n    true\n  }\n  [\"any()\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"getOrNull()\"] {\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    new {\n      name = \"Parrot\"\n      age = 24\n    }\n    null\n    null\n    new {\n      name = \"Piggy\"\n      age = 42\n    }\n    new {\n      name = \"Parrot\"\n      age = 24\n    }\n    new {\n      name = \"Barn Owl\"\n      age = 84\n    }\n    null\n    null\n    null\n  }\n  [\"fold()\"] {\n    List(Pair(\"Pigeon\", new {\n      name = \"Pigeon\"\n      age = 42\n    }), Pair(\"Parrot\", new {\n      name = \"Parrot\"\n      age = 24\n    }))\n    List(Pair(\"Pigeon\", new {\n      name = \"Piggy\"\n      age = 42\n    }), Pair(\"Parrot\", new {\n      name = \"Parrot\"\n      age = 24\n    }), Pair(\"Barn Owl\", new {\n      name = \"Barn Owl\"\n      age = 84\n    }))\n    List()\n    List()\n  }\n  [\"toMap()\"] {\n    Map(\"Pigeon\", new {\n      name = \"Pigeon\"\n      age = 42\n    }, \"Parrot\", new {\n      name = \"Parrot\"\n      age = 24\n    })\n    Map(\"Pigeon\", new {\n      name = \"Piggy\"\n      age = 42\n    }, \"Parrot\", new {\n      name = \"Parrot\"\n      age = 24\n    }, \"Barn Owl\", new {\n      name = \"Barn Owl\"\n      age = 84\n    })\n    Map()\n    Map()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/mathModule.pcf",
    "content": "facts {\n  [\"atan2\"] {\n    true\n    true\n  }\n}\nexamples {\n  [\"minInt\"] {\n    -9223372036854775808\n    -128\n    -32768\n    -2147483648\n  }\n  [\"maxInt\"] {\n    9223372036854775807\n    127\n    32767\n    2147483647\n  }\n  [\"maxUInt\"] {\n    9223372036854775807\n    255\n    65535\n    4294967295\n  }\n  [\"e\"] {\n    2.718281828459045\n  }\n  [\"pi\"] {\n    3.141592653589793\n  }\n  [\"exp\"] {\n    7.38905609893065\n    10.381236562731843\n    0.1353352832366127\n    0.09632763823049303\n  }\n  [\"sqrt\"] {\n    3.0\n    1.4142135623730951\n    1.5297058540778354\n    NaN\n    NaN\n  }\n  [\"cbrt\"] {\n    3.0\n    1.2599210498948732\n    1.3276143942617729\n    -1.2599210498948732\n    -1.3276143942617729\n  }\n  [\"log\"] {\n    0.6931471805599453\n    0.85015092936961\n    NaN\n    NaN\n  }\n  [\"log2\"] {\n    1.0\n    1.2265085298086797\n    NaN\n    NaN\n  }\n  [\"log10\"] {\n    0.3010299956639812\n    0.36921585741014284\n    NaN\n    NaN\n  }\n  [\"sin\"] {\n    0.0\n    1.2246467991473532E-16\n    0.9092974268256817\n    0.7184647930691261\n    -0.9092974268256817\n    -0.7184647930691261\n  }\n  [\"cos\"] {\n    1.0\n    -1.0\n    -0.4161468365471424\n    -0.695563326462902\n    -0.4161468365471424\n    -0.695563326462902\n  }\n  [\"tan\"] {\n    0.0\n    -1.2246467991473532E-16\n    -2.185039863261519\n    -1.032925063376592\n    2.185039863261519\n    1.032925063376592\n  }\n  [\"asin\"] {\n    0.0\n    1.2246467991473532E-16\n    1.1415926535897933\n    0.8015926535897933\n    -1.1415926535897933\n    -0.8015926535897933\n  }\n  [\"acos\"] {\n    0.0\n    3.141592653589793\n    2.0\n    2.34\n    2.0\n    2.34\n  }\n  [\"atan\"] {\n    0.0\n    -1.2246467991473532E-16\n    -1.1415926535897931\n    -0.8015926535897934\n    1.1415926535897931\n    0.8015926535897934\n  }\n  [\"atan2\"] {\n    2.214297435588181\n    2.2318394956455836\n    2.1587989303424644\n    0.851966327173272\n  }\n  [\"gcd\"] {\n    0\n    2\n    \"Expected a positive number, but got `-4`.\"\n    \"Expected a positive number, but got `-6`.\"\n    99\n    \"Expected value of type `Int`, but got type `Float`. Value: 6.1\"\n  }\n  [\"lcm\"] {\n    0\n    12\n    \"Expected a positive number, but got `-4`.\"\n    \"Expected a positive number, but got `-6`.\"\n    \"Integer overflow.\"\n    \"Expected value of type `Int`, but got type `Float`. Value: 6.1\"\n  }\n  [\"isPowerOfTwo\"] {\n    false\n    false\n    true\n    true\n    true\n    true\n    true\n    true\n    false\n    false\n    false\n    false\n  }\n  [\"max\"] {\n    0\n    0.0\n    0.0\n    4\n    4\n    123.456\n    123.456\n    NaN\n    NaN\n    Infinity\n  }\n  [\"min\"] {\n    0\n    0.0\n    -0.0\n    2\n    -2\n    123.0\n    123.455\n    NaN\n    NaN\n    -Infinity\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/module.pcf",
    "content": "examples {\n  [\"relativePathTo()\"] {\n    List(\"dir1\", \"dir2\")\n    List()\n    List()\n    List()\n    \"No descendent path exists between modules `file:///$snippetsDir/input/api/dir1/dir2/relativePathTo.pkl` and `file:///$snippetsDir/input/api/module.pkl`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/moduleOutput.pcf",
    "content": "some string"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/moduleOutput2.pcf",
    "content": "{\n  \"res1\": 42\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer1.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>name</key>\n  <string>pigeon</string>\n  <key>age</key>\n  <integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer2.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>res1</key>\n    <string>gnirts</string>\n    <key>res2</key>\n    <false/>\n    <key>res3</key>\n    <integer>43</integer>\n    <key>res4</key>\n    <real>2.33</real>\n    <key>res5</key>\n    <string>3 s</string>\n    <key>res6</key>\n    <string>4 mb</string>\n    <key>res8</key>\n    <array>\n        <integer>43</integer>\n        <false/>\n        <string>gnirts</string>\n    </array>\n    <key>res9</key>\n    <array>\n        <string>gnirts</string>\n        <false/>\n        <integer>43</integer>\n        <integer>5</integer>\n    </array>\n    <key>res10</key>\n    <dict>\n        <key>eno</key>\n        <false/>\n        <key>owt</key>\n        <real>2.33</real>\n        <key>eerht</key>\n        <string>3 s</string>\n    </dict>\n    <key>res11</key>\n    <array>\n        <string>gnirts</string>\n        <false/>\n        <integer>43</integer>\n        <integer>5</integer>\n    </array>\n    <key>res12</key>\n    <dict>\n        <key>eman</key>\n        <string>noegip</string>\n        <key>ega</key>\n        <integer>31</integer>\n        <key>eerht</key>\n        <string>3 s</string>\n    </dict>\n    <key>res13</key>\n    <dict>\n        <key>name</key>\n        <string>noegip</string>\n        <key>age</key>\n        <integer>31</integer>\n        <key>other</key>\n        <string>rehto</string>\n    </dict>\n    <key>res14</key>\n    <dict>\n        <key>name</key>\n        <string>noegip</string>\n        <key>age</key>\n        <integer>41</integer>\n    </dict>\n    <key>res15</key>\n    <string>String</string>\n    <key>res16</key>\n    <array>\n        <integer>2</integer>\n        <integer>5</integer>\n        <integer>2</integer>\n    </array>\n</dict>\n</plist>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer3.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>res1</key>\n  <string>converted</string>\n  <key>res2</key>\n  <string>converted</string>\n  <key>res3</key>\n  <string>converted</string>\n  <key>res4</key>\n  <string>converted</string>\n  <key>res5</key>\n  <string>converted</string>\n  <key>res6</key>\n  <string>converted</string>\n  <key>res7</key>\n  <string>converted</string>\n  <key>res8</key>\n  <string>converted</string>\n  <key>res9</key>\n  <string>converted</string>\n  <key>res10</key>\n  <string>converted</string>\n  <key>res11</key>\n  <string>converted</string>\n  <key>res12</key>\n  <string>converted</string>\n  <key>res13</key>\n  <string>converted</string>\n  <key>res14</key>\n  <string>converted</string>\n  <key>res15</key>\n  <string>converted</string>\n  <key>res16</key>\n  <string>converted</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer4.pcf",
    "content": "res1 = \"<integer>123</integer>\"\nres2 = \"<real>1.23</real>\"\nres3 = \"<false/>\"\nres4 = \"<string>pigeon</string>\"\nres6 = \"\"\"\n  <array>\n    <string>pigeon</string>\n    <string>parrot</string>\n  </array>\n  \"\"\"\nres7 = \"\"\"\n  <array>\n    <string>pigeon</string>\n    <string>parrot</string>\n  </array>\n  \"\"\"\nres8 = \"\"\"\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  \"\"\"\nres9 = \"\"\"\n  <array>\n    <string>pigeon</string>\n    <string>parrot</string>\n  </array>\n  \"\"\"\nres10 = \"\"\"\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  \"\"\"\nres11 = \"\"\"\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  \"\"\"\nres12 = \"\"\"\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  \"\"\"\nres13 = \"Cannot render value of type `Null` as XML property list. Value: null\"\nres14 = \"Cannot render value of type `Duration` as XML property list. Value: 1.min\"\nres15 = \"Cannot render value of type `DataSize` as XML property list. Value: 1.mb\"\nres16 = \"Cannot render value of type `Class` as XML property list. Value: pListRenderer4#Person\"\nres17 = \"Cannot render value of type `TypeAlias` as XML property list. Value: pListRenderer4#Email\"\nres18 = \"Cannot render value of type `Function1` as XML property list. Value: new Function1 {}\"\nres19 = \"ouch\"\nres20 = \"Cannot render value of type `IntSeq` as XML property list. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer5.pcf",
    "content": "res1 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Int`. Value: 123\"\nres2 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Float`. Value: 1.23\"\nres3 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Boolean`. Value: false\"\nres4 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `String`. Value: \\\"pigeon\\\"\"\nres6 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <array>\n    <string>pigeon</string>\n    <string>parrot</string>\n  </array>\n  </plist>\n  \n  \"\"\"\nres7 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <array>\n    <string>pigeon</string>\n    <string>parrot</string>\n  </array>\n  </plist>\n  \n  \"\"\"\nres8 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  </plist>\n  \n  \"\"\"\nres9 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <array>\n    <string>pigeon</string>\n    <string>parrot</string>\n  </array>\n  </plist>\n  \n  \"\"\"\nres10 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  </plist>\n  \n  \"\"\"\nres11 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  </plist>\n  \n  \"\"\"\nres12 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n  <plist version=\"1.0\">\n  <dict>\n    <key>name</key>\n    <string>pigeon</string>\n    <key>age</key>\n    <integer>42</integer>\n  </dict>\n  </plist>\n  \n  \"\"\"\nres13 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Duration`. Value: 1.min\"\nres14 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `DataSize`. Value: 1.mb\"\nres15 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Class`. Value: pListRenderer5#Person\"\nres16 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `TypeAlias`. Value: pListRenderer5#Email\"\nres17 = \"Cannot render value of type `Function1` as XML property list. Value: new Function1 {}\"\nres18 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Null`. Value: null\"\nres19 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `Pair`. Value: Pair(1, 2)\"\nres20 = \"ouch\"\nres21 = \"The top-level value of an XML property list must have type `Typed`, `Dynamic`, `Listing`, `Mapping`, `List`, `Set`, or `Map`, but got type `IntSeq`. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer6.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>name</key>\n  <string>noegip</string>\n  <key>age</key>\n  <integer>42</integer>\n  <key>friends</key>\n  <array>\n    <string>barn owlx</string>\n    <string>parrotx</string>\n  </array>\n  <key>hobbies</key>\n  <dict>\n    <key>surfing</key>\n    <string>low</string>\n    <key>firemaking</key>\n    <string>high</string>\n  </dict>\n  <key>address</key>\n  <dict>\n    <key>street</key>\n    <string>Other St.</string>\n    <key>zip</key>\n    <string>changed</string>\n  </dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer7.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as XML property list.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.base#PListRenderer.renderDocument (file:///$snippetsDir/input/api/pListRenderer7.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pListRenderer8.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>foo</key>\n  <string>a</string>\n  <key>bar</key>\n  <string>b</string><!-- bar -->\n  <key>baz</key>\n  <dict>\n    <key>qux</key>\n    <string>c</string><!-- qux -->\n    <key>quux</key>\n    <string>c</string>\n  </dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pair.pcf",
    "content": "examples {\n  [\"first\"] {\n    \"Pigeon\"\n    new {\n      name = \"Pigeon\"\n    }\n    null\n  }\n  [\"second\"] {\n    42\n    List(1, 2, 3)\n    Pair(Regex(\"Pigeon\"), 42.ms)\n  }\n  [\"key\"] {\n    \"Pigeon\"\n    new {\n      name = \"Pigeon\"\n    }\n    null\n  }\n  [\"value\"] {\n    42\n    List(1, 2, 3)\n    Pair(Regex(\"Pigeon\"), 42.ms)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer1.pcf",
    "content": "pigeon {\n  name = \"pigeon\"\n  age = 30\n}\nbarnOwl {\n  name = \"barn owl\"\n  age = 42\n  \"surfing\"\n  \"fire making\"\n}\nparrot {\n  new {\n    lastName = \"\"\"\n      Flintstone\n      \n      Flintstone\n      \"\"\"\n    \"\"\"\n    Flintstone\n    \n    Flintstone\n    \"\"\"\n  }\n  \"\"\"\n  Flintstone\n  \n  Flintstone\n  \"\"\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer2.pcf",
    "content": "res1 = \"gnirts\"\nres2 = false\nres3 = 43\nres4 = 2.33\nres5 = 5.s\nres6 = 6.mb\nres8 = List(43, false, \"gnirts\")\nres9 = Set(\"gnirts\", false, 43, 5)\nres10 = Map(\"eno\", false, \"owt\", 2.33, \"eerht\", 5.s)\nres11 {\n    \"gnirts\"\n    false\n    43\n    5\n}\nres12 {\n    [\"eman\"] = \"noegip\"\n    [\"ega\"] = 31\n    [\"eerht\"] = 5.s\n}\nres13 {\n    name = \"noegip\"\n    age = 31\n    other = \"rehto\"\n}\nres14 {\n    name = \"noegip\"\n    age = 41\n}\nres15 = \"String\"\nres16 = Pair(2, 1)\nres17 = List(2, 5, 2)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer2b.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = true\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer3.pcf",
    "content": "res1 = \"converted\"\nres2 = \"converted\"\nres3 = \"converted\"\nres4 = \"converted\"\nres5 = \"converted\"\nres6 = \"converted\"\nres8 = \"converted\"\nres9 = \"converted\"\nres10 = \"converted\"\nres11 = \"converted\"\nres12 = \"converted\"\nres13 = \"converted\"\nres14 = \"converted\"\nres15 = \"converted\"\nres16 = \"converted\"\nres17 = \"converted\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer4.pcf",
    "content": "res1 = \"123\"\nres2 = \"1.23\"\nres3 = \"false\"\nres4 = \"\\\"pigeon\\\"\"\nres5 = \"List(\\\"pigeon\\\", \\\"parrot\\\")\"\nres6 = \"Set(\\\"pigeon\\\", \\\"parrot\\\")\"\nres7 = \"Map(\\\"name\\\", \\\"pigeon\\\", \\\"age\\\", 42)\"\nres8 = \"\"\"\n  {\n    \"pigeon\"\n    \"parrot\"\n  }\n  \"\"\"\nres9 = \"\"\"\n  {\n    [\"name\"] = \"pigeon\"\n    [\"age\"] = 42\n  }\n  \"\"\"\nres10 = \"\"\"\n  {\n    name = \"pigeon\"\n    age = 42\n  }\n  \"\"\"\nres11 = \"\"\"\n  {\n    name = \"pigeon\"\n    age = 42\n  }\n  \"\"\"\nres12 = \"1.min\"\nres13 = \"1.mb\"\nres14 = \"null\"\nres15 = \"Pair(1, 2)\"\nres16 = \"IntSeq(1, 4)\"\nres17 = \"IntSeq(1, 4).step(-2)\"\nres18 = \"Regex(\\\"a.*b\\\")\"\nres19 = \"Cannot render value of type `Class` as Pcf. Value: pcfRenderer4#Person\"\nres20 = \"Cannot render value of type `TypeAlias` as Pcf. Value: pcfRenderer4#Email\"\nres21 = \"Cannot render value of type `Function1` as Pcf. Value: new Function1 {}\"\nres22 = \"ouch\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer5.pcf",
    "content": "res1 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Int`. Value: 123\"\nres2 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Float`. Value: 1.23\"\nres3 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Boolean`. Value: false\"\nres4 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `String`. Value: \\\"pigeon\\\"\"\nres5 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `List`. Value: List(\\\"pigeon\\\", \\\"parrot\\\")\"\nres6 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Set`. Value: Set(\\\"pigeon\\\", \\\"parrot\\\")\"\nres7 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Map`. Value: Map(\\\"name\\\", \\\"pigeon\\\", \\\"age\\\", 42)\"\nres8 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Listing`. Value: new Listing { ?; ? }\"\nres9 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Mapping`. Value: new Mapping { [\\\"name\\\"] = ?; [\\\"age\\\"] = ? }\"\nres10 = \"\"\"\n  name = \"pigeon\"\n  age = 42\n  \n  \"\"\"\nres11 = \"\"\"\n  name = \"pigeon\"\n  age = 42\n  \n  \"\"\"\nres12 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Duration`. Value: 1.min\"\nres13 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `DataSize`. Value: 1.mb\"\nres14 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Null`. Value: null\"\nres15 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Pair`. Value: Pair(1, 2)\"\nres16 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Class`. Value: pcfRenderer5#Person\"\nres17 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `TypeAlias`. Value: pcfRenderer5#Email\"\nres18 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `Function1`. Value: new Function1 {}\"\nres19 = \"ouch\"\nres20 = \"The top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `IntSeq`. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer6.pcf",
    "content": "baz {\n  qux = 42\n  corge {\n    null\n    1337\n    null\n    \"Hello World\"\n  }\n  grault {\n    [\"garply\"] = null\n    [\"waldo\"] = 42\n    [new {\n      \"pigeon\"\n    }] = null\n  }\n  thud = Pair(new {}, new {})\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer7.pcf",
    "content": "rawString {\n  res1 = #\"\\r\\n\\t\\\\\"#\n  res2 = \"$foo\"\n  res3 = #\"\\(3 * 4)\"#\n  res4 = #\"\\r\\n\\t\\\\\"#\n  res5 = \"$foo\"\n  res6 = #\"\\(3 * 4)\"#\n  res7 = #\"\"\"\n    \\r\\n\\t\\\\\n    $foo\n    \\(3 * 4)\n    \"\"\"#\n  res9 = \"leading and trailing newline trimmed\"\n  res10 = \"\"\"\n    \n    leading newline not trimmed\n    \"\"\"\n  res11 = \"\"\"\n    \n    \n    \n    leading newlines not trimmed\n    \"\"\"\n  res13 = \"\"\"\n    trailing newline not trimmed\n    \n    \"\"\"\n  res14 = \"\"\"\n    trailing newlines not trimmed\n    \n    \n    \n    \"\"\"\n  res16 = \"\"\"\n    leading\n    whitespace\n    trimmed\n    \"\"\"\n  res17 = \"\"\"\n      leading\n      whitespace\n      partially\n      trimmed\n    \"\"\"\n  res18 = \"\"\"\n    leading\n      whitespace\n        partially\n          trimmed\n    \"\"\"\n  res19 = #\"\"AS IS\"\"#\n  res20 = #\"\"\\#\"AS IS\"\"\"#\n  res21 = #\"\"\\#\"\"\"\"AS IS\"\"\"\"\"\"#\n  res22 = #\"\"AS IS\"\"#\n  res23 = #\"\"\\#\"AS IS\"\"\"#\n  res24 = #\"\"\\#\"\"\"\"AS IS\"\"\"\"\"\"#\n  res25 = ##\"# ## ### \" \"\" \"\"\" \\ \\#\"##\n  res26 = ###\"# ## ### #### \" \"\" \"\"\" \"\"\"\" \\ \\# \\##\"###\n  res27 = #####\"# ## ### #### ##### ###### \" \"\" \"\"\" \"\"\"\" \"\"\"\"\" \\ \\# \\## \\### \\####\"#####\n  res28 = \"onetwothreetwoonetwo\"\n  res29 = \"\\t \\t\\t \\t\\t\\t \\t\\t \\t \\t\\t\"\n  res30 = \"a 🤠 ǝ\"\n  res31 = \"a 🤠 ǝ\"\n  res32 = ##\"# ## ### \" \"\" \"\"\" \\ \\#\"##\n  res33 = ###\"# ## ### #### \" \"\" \"\"\" \"\"\"\" \\ \\# \\##\"###\n  res34 = #####\"# ## ### #### ##### ###### \" \"\" \"\"\" \"\"\"\" \"\"\"\"\" \\ \\# \\## \\### \\####\"#####\n  res35 = \"onetwothreetwoonetwo\"\n  res36 = \"\\t \\t\\t \\t\\t\\t \\t\\t \\t \\t\\t\"\n  res37 = \"a 🤠 ǝ\"\n  res38 = \"a 🤠 ǝ\"\n}\nres39 = ######\"\"\"\n  \"\"\"#####\n  \n  delimiters for multiline string\n  \"\"\"######\nres40 = \"\"\"\n  \"#####\n  \n  no delimiters for multiline string\n  \"\"\"\nres41 = ##\"\\#\"##\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer8.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as Pcf.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.base#PcfRenderer.renderDocument (file:///$snippetsDir/input/api/pcfRenderer8.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pcfRenderer9.pcf",
    "content": "foo = \"a\"\nbar = \"b\" // bar\nbaz {\n  qux = \"c\" // qux\n  quux = \"c\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/pklbinary1.msgpack.yaml",
    "content": "- 1\n- 'encoding1#Foo'\n- 'file:///$snippetsDir/input/api/pklbinary1.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'dynamic'\n    - \n      - 1\n      - 'Dynamic'\n      - 'pkl:base'\n      - \n        - \n          - 16\n          - 'hello'\n          - 'world'\n        - \n          - 17\n          - 'hello'\n          - 'world'\n        - \n          - 18\n          - 0\n          - 'hello world'\n  - \n    - 16\n    - 'string'\n    - 'foo'\n  - \n    - 16\n    - 'map'\n    - \n      - 2\n      - \n        'foo': 'bar'\n  - \n    - 16\n    - 'mapping'\n    - \n      - 3\n      - \n        'foo': 'bar'\n  - \n    - 16\n    - 'list'\n    - \n      - 4\n      - \n        - 'foo'\n        - 'bar'\n  - \n    - 16\n    - 'listing'\n    - \n      - 5\n      - \n        - 'foo'\n        - 0\n  - \n    - 16\n    - 'set'\n    - \n      - 6\n      - \n        - 'foo'\n        - 'bar'\n  - \n    - 16\n    - 'duration'\n    - \n      - 7\n      - 123.0\n      - 'h'\n  - \n    - 16\n    - 'dataSize'\n    - \n      - 8\n      - 123.0\n      - 'gib'\n  - \n    - 16\n    - 'pair'\n    - \n      - 9\n      - 'foo'\n      - 'bar'\n  - \n    - 16\n    - 'intSeq'\n    - \n      - 10\n      - 123\n      - 456\n      - 1\n  - \n    - 16\n    - 'regex'\n    - \n      - 11\n      - 'foo.*'\n  - \n    - 16\n    - 'func'\n    - null\n  - \n    - 16\n    - 'bytes'\n    - \n      - 15\n      - !!binary 'AQID'\n  - \n    - 16\n    - 'moduleClass'\n    - \n      - 12\n      - 'encoding1'\n      - 'file:///$snippetsDir/input/api/pklbinary1.msgpack.yaml.pkl'\n  - \n    - 16\n    - 'baseModuleClass'\n    - \n      - 12\n      - 'ModuleClass'\n      - 'pkl:base'\n  - \n    - 16\n    - 'pklbinaryModuleClass'\n    - \n      - 12\n      - 'pkl.pklbinary'\n      - 'pkl:pklbinary'\n  - \n    - 16\n    - 'stdlibClass'\n    - \n      - 12\n      - 'PcfRenderer'\n      - 'pkl:base'\n  - \n    - 16\n    - 'someClass'\n    - \n      - 12\n      - 'encoding1#Foo'\n      - 'file:///$snippetsDir/input/api/pklbinary1.msgpack.yaml.pkl'\n  - \n    - 16\n    - 'stdlibTypealias'\n    - \n      - 13\n      - 'UInt'\n      - 'pkl:base'\n  - \n    - 16\n    - 'someTypealias'\n    - \n      - 13\n      - 'encoding1#Bar'\n      - 'file:///$snippetsDir/input/api/pklbinary1.msgpack.yaml.pkl'\n  - \n    - 16\n    - 'something'\n    - \n      - 1\n      - 'PcfRenderer'\n      - 'pkl:base'\n      - \n        - \n          - 16\n          - 'converters'\n          - \n            - 3\n            - {}\n        - \n          - 16\n          - 'convertPropertyTransformers'\n          - \n            - 3\n            - {}\n        - \n          - 16\n          - 'extension'\n          - 'pcf'\n        - \n          - 16\n          - 'indent'\n          - '  '\n        - \n          - 16\n          - 'omitNullProperties'\n          - false\n        - \n          - 16\n          - 'useCustomStringDelimiters'\n          - false"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/platformModule.pcf",
    "content": "facts {\n  [\"language\"] {\n    true\n  }\n  [\"runtime\"] {\n    true\n    true\n  }\n  [\"virtualMachine\"] {\n    true\n    true\n  }\n  [\"operatingSystem\"] {\n    true\n    true\n  }\n  [\"processor\"] {\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/plistRenderer2b.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = true\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer1.properties",
    "content": "name = pigeon\nage = 30\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer10.err",
    "content": "–– Pkl Error ––\nCannot render value of type `List` as Properties.\nValue: List(\"bar\")\n\nx | foo = new PropertiesRenderer {}.renderValue(List(\"bar\"))\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat propertiesRenderer10.properties#foo (file:///$snippetsDir/input/api/propertiesRenderer10.properties.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer11.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as Properties.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.base#PropertiesRenderer.renderDocument (file:///$snippetsDir/input/api/propertiesRenderer11.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer12.properties",
    "content": "foo = a\nbar = b\n# bar\nbaz.qux = c\n# qux\nbaz.quux = c\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer2.properties",
    "content": "res1 = gnirts\nres2 = false\nres3 = 43\nres4 = 2.33\nres5 = 3 s\nres6 = 4 mb\nres8 = [\\n  43,\\n  false,\\n  \"gnirts\"\\n]\nres9 = [\\n  \"gnirts\",\\n  false,\\n  43,\\n  5\\n]\nres10 = {\\n  \"eno\"\\: false,\\n  \"owt\"\\: 2.33,\\n  \"eerht\"\\: \"3 s\"\\n}\nres11 = [\\n  \"gnirts\",\\n  false,\\n  43,\\n  5\\n]\nres12 = {\\n  \"eman\"\\: \"noegip\",\\n  \"ega\"\\: 31,\\n  \"eerht\"\\: \"3 s\"\\n}\nres13 = {\\n  \"name\"\\: \"noegip\",\\n  \"age\"\\: 31,\\n  \"other\"\\: \"rehto\"\\n}\nres14 = {\\n  \"name\"\\: \"noegip\",\\n  \"age\"\\: 41\\n}\nres15 = String\nres16 = [\\n  3,\\n  2\\n]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer2b.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = true\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer3.properties",
    "content": "res1 = converted\nres2 = converted\nres3 = converted\nres4 = converted\nres5 = converted\nres6 = converted\nres8 = converted\nres9 = converted\nres10 = converted\nres11 = converted\nres12 = converted\nres13 = converted\nres14 = converted\nres15 = converted\nres16 = converted\nres18 = converted\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer4.pcf",
    "content": "res1 = \"123\"\nres2 = \"1.23\"\nres3 = \"false\"\nres4 = \"pigeon\"\nres5 = \"\"\nres6 = \"Cannot render value of type `Duration` as Properties. Value: 1.min\"\nres7 = \"Cannot render value of type `DataSize` as Properties. Value: 1.mb\"\nres8 = \"Cannot render value of type `List` as Properties. Value: List(\\\"pigeon\\\", \\\"parrot\\\")\"\nres9 = \"Cannot render value of type `Set` as Properties. Value: Set(\\\"pigeon\\\", \\\"parrot\\\")\"\nres10 = \"Cannot render value of type `Map` as Properties. Value: Map(\\\"name\\\", \\\"pigeon\\\", \\\"age\\\", 42)\"\nres11 = \"Cannot render value of type `Listing` as Properties. Value: new Listing { \\\"pigeon\\\"; \\\"parrot\\\" }\"\nres12 = \"Cannot render value of type `Mapping` as Properties. Value: new Mapping { [\\\"name\\\"] = ?; [\\\"age\\\"] = ? }\"\nres13 = \"Cannot render value of type `Dynamic` as Properties. Value: new Dynamic { name = ?; age = ? }\"\nres14 = \"Cannot render value of type `propertiesRenderer4#Person` as Properties. Value: new Person { name = ?; age = ? }\"\nres15 = \"Cannot render value of type `Pair` as Properties. Value: Pair(1, 2)\"\nres16 = \"Cannot render value of type `Class` as Properties. Value: propertiesRenderer4#Person\"\nres17 = \"Cannot render value of type `TypeAlias` as Properties. Value: propertiesRenderer4#Email\"\nres18 = \"Cannot render value of type `Function1` as Properties. Value: new Function1 {}\"\nres19 = \"ouch\"\nres20 = \"Cannot render value of type `IntSeq` as Properties. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer5.pcf",
    "content": "res1 = \"\"\"\n  name = pigeon\n  age = 42\n  \n  \"\"\"\nres2 = \"\"\"\n  name = pigeon\n  age = 42\n  \n  \"\"\"\nres3 = \"\"\"\n  name = pigeon\n  age = 42\n  \n  \"\"\"\nres4 = \"\"\"\n  name = pigeon\n  age = 42\n  \n  \"\"\"\nres5 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Pair`. Value: Pair(1, 2)\"\nres6 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Null`. Value: null\"\nres7 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Int`. Value: 123\"\nres8 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Float`. Value: 1.23\"\nres9 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Boolean`. Value: false\"\nres10 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `String`. Value: \\\"pigeon\\\"\"\nres11 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `List`. Value: List(\\\"pigeon\\\", \\\"parrot\\\")\"\nres12 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Set`. Value: Set(\\\"pigeon\\\", \\\"parrot\\\")\"\nres13 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Listing`. Value: new Listing { ?; ? }\"\nres14 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Duration`. Value: 1.min\"\nres15 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `DataSize`. Value: 1.mb\"\nres16 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Class`. Value: propertiesRenderer5#Person\"\nres17 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `TypeAlias`. Value: propertiesRenderer5#Email\"\nres18 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `Function1`. Value: new Function1 {}\"\nres19 = \"ouch\"\nres20 = \"The top-level value of a Java properties file must have type `Typed`, `Dynamic`, `Mapping`, or `Map`, but got type `IntSeq`. Value: IntSeq(1, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer7.properties",
    "content": "res01 = \\t\\n\\f\\r\nres02 = \\!\\#\\:\\=\\\\\\t\\n\\f\\r\nres03 = \\ \\!\\#\\:\\=\\\\\\t\\n\\f\\r\nres04 = true\nres05 = true\nres06 = true\nres07 = true\nres08 = \\!\\#\\: \\=\\\\\nres09 = \\!\\#\\:\\=\\\\ \nres10 = \\ \\!\\#\\:\\=\\\\\n\\!\\#\\:\\ \\=\\\\\\\\ = res11\n\\!\\#\\:\\=\\\\\\\\\\  = res12\n\\ \\!\\#\\:\\=\\\\\\\\ = res13\nres14 = \\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\t\\n\\u000B\\f\\r\\u000E\\u000F\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001A\\u001B\\u001C\\u001D\\u001E\\u001F \\!\"\\#$%&'()*+,-./0123456789\\:;<\\=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\u007F\nres15 = true\nres16 = true\nres17 = true\nres18 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer8.properties",
    "content": "int = 123\nfloat = 1.23\nbool = true\nstring = Pigeon\nunicodeString = abc😀abc😎abc\nmultiLineString = have a\\ngreat\\nday\nlist = [123,1.23,true,\"Pigeon\",\"abc😀abc😎abc\",\"have a\\\\ngreat\\\\nday\",[1,2,3],[1,2,3],{\"one\"\\:1},{\"name\"\\:\"Pigeon\"}]\nset = [123,1.23,true,\"Pigeon\",\"abc😀abc😎abc\",\"have a\\\\ngreat\\\\nday\",[1,2,3],[1,2,3],{\"one\"\\:1},{\"name\"\\:\"Pigeon\"}]\nmap.one = 123\nmap.two = 1.23\nmap.three = true\nmap.four = Pigeon\nmap.five = abc😀abc😎abc\nmap.six = have a\\ngreat\\nday\nmap.seven = [1,2,3]\nmap.eight = [1,2,3]\nmap.nine.one = 1\nmap.ten.name = Pigeon\nlisting = [123,1.23,true,\"Pigeon\",\"abc😀abc😎abc\",\"have a\\\\ngreat\\\\nday\",[1,2,3],[1,2,3],{\"one\"\\:1},{\"name\"\\:\"Pigeon\"}]\nmapping.one = 123\nmapping.two = 1.23\nmapping.three = true\nmapping.four = Pigeon\nmapping.five = abc😀abc😎abc\nmapping.six = have a\\ngreat\\nday\nmapping.seven = [1,2,3]\nmapping.eight = [1,2,3]\nmapping.nine.one = 1\nmapping.ten.name = Pigeon\ntypedObject.name = Pigeon\ntypedObject.age = 30\ntypedObject.address.street = Folsom St.\ntypedObject.hobbies = [\"swimming\",\"gardening\",\"reading\"]\ncontainer.name = Pigeon\ncontainer.age = 30\ncontainer.address.street = Folsom St.\ncontainer.address.hobbies = [\"swimming\",\"gardening\",\"reading\"]\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRenderer9.properties",
    "content": "name = noegip\nage = 42\nfriends = [\"barn owlx\",\"parrotx\"]\nmoreFriends = [\"elf owlx\",\"eaglex\"]\ncouple = [\"pigeonx\",\"parrotx\"]\nhobbies.surfing = low\nhobbies.firemaking = high\nclassification.red\\ wolf = confidential\nclassification.pink\\ panther = official\naddress.street = Other St.\naddress.zip = changed\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/propertiesRendererBug66849708.properties",
    "content": "object.property = converted\nmapping.key = converted\nmap.key = converted\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/protobuf.pcf",
    "content": "examples {\n  [\"Rendering primitive values\"] {\n    \"true\"\n    \"false\"\n    \"-42\"\n    \"-42\"\n    \"-42\"\n    \"-42\"\n    \"42\"\n    \"42\"\n    \"42\"\n    \"42\"\n    \"-13.37\"\n    \"-13.37\"\n    \"13.37\"\n    \"-42\"\n    \"42\"\n    \"\\\"Hello world\\\"\"\n    \"\"\"\n    {\n      seconds: 600\n      nanos: 0\n    }\n    \"\"\"\n    \"\"\"\n    {\n      seconds: 0\n      nanos: 2000000\n    }\n    \"\"\"\n    \"\"\"\n    {\n      seconds: 0\n      nanos: 120\n    }\n    \"\"\"\n    \"\"\"\n    {\n      seconds: 5\n      nanos: 120\n    }\n    \"\"\"\n  }\n  [\"Collection types\"] {\n    \"\"\"\n    list: {\n      foo: \"Bar\"\n    }\n    list: {\n      foo: \"test foo\"\n    }\n    listing: {\n      foo: \"listing bar\"\n    }\n    listing: {\n      foo: \"listing foo\"\n    }\n    map: {\n      key: 1\n      value: {\n        foo: \"first\"\n      }\n    }\n    map: {\n      key: 2\n      value: {\n        foo: \"second\"\n      }\n    }\n    mapping: \"Cannot call method `renderValue` from here because it is not `const`.\"\n    set: {\n      foo: \"setOne\"\n    }\n    set: {\n      foo: \"setTwo\"\n    }\n    mappingWithUnannotatedValueType: {\n      key: \"some\"\n      value: {\n        it: {\n          foo: \"Bar\"\n        }\n        it: {\n          foo: \"Bar\"\n        }\n      }\n    }\n    \"\"\"\n  }\n  [\"Typed objects rendered as protobuf.ProtoMessage\"] {\n    \"foo: \\\"new\\\"\"\n    \"foo: \\\"Bar\\\"\"\n    \"foo: \\\"Baz\\\"\"\n    \"\"\"\n    foo: {\n      foo: \"FOO\"\n    }\n    bar: {\n      foo: \"Bar\"\n    }\n    foos: {\n      foo: \"FOO\"\n    }\n    foos: {\n      foo: \"Bar\"\n    }\n    bars: {\n      key: \"default\"\n      value: {\n        foo: \"Bar\"\n      }\n    }\n    bars: {\n      key: \"amended\"\n      value: {\n        foo: \"Bars\"\n      }\n    }\n    \"\"\"\n    \"\"\"\n    myDuration: {\n      seconds: 0\n      nanos: 42\n    }\n    \"\"\"\n  }\n  [\"Unsupported types\"] {\n    \"Cannot render value of type `Dynamic` as Protobuf. Value: new Dynamic {}\"\n    \"Cannot render value of type `DataSize` as Protobuf. Value: 10.kb\"\n  }\n  [\"Types not supported at top-level\"] {\n    \"The top-level value of a protobuf file must have type `Typed`, but got type `Map`.\"\n    \"The top-level value of a protobuf file must have type `Typed`, but got type `Mapping`.\"\n  }\n  [\"Keys in maps\"] {\n    \"\"\"\n    string: {\n      key: \"Hello world\"\n      value: {\n        foo: \"Bar\"\n      }\n    }\n    long: {\n      key: 1337\n      value: {\n        foo: \"Bar\"\n      }\n    }\n    int: {\n      key: 42\n      value: {\n        foo: \"Bar\"\n      }\n    }\n    short: {\n      key: 1\n      value: {\n        foo: \"Bar\"\n      }\n    }\n    boolean: {\n      key: false\n      value: {\n        foo: \"Bar\"\n      }\n    }\n    \"\"\"\n    \"Cannot render map with a non-scalar, floating point or byte array key type.\"\n  }\n  [\"typealiases\"] {\n    \"doubleAlias: \\\"Qux\\\"\"\n  }\n  [\"unions\"] {\n    \"theProperty: \\\"Qux\\\"\"\n    \"theProperty: \\\"corge\\\"\"\n    \"\"\"\n    theHeterogeneousUnion: {\n      it_String: \"Grault\"\n    }\n    \"\"\"\n    \"\"\"\n    theHeterogeneousUnion: {\n      it_String: \"Grault\"\n    }\n    theHeterogeneousUnion: {\n      it_Int: 0\n    }\n    theHeterogeneousUnion: {\n      it_Foo: {\n        foo: \"Bar\"\n      }\n    }\n    \"\"\"\n    \"Cannot render map with a non-scalar, floating point or byte array key type.\"\n  }\n  [\"subtypes\"] {\n    \"\"\"\n    myFoo: {\n      foo: \"renders\"\n    }\n    \"\"\"\n    \"Cannot render subtype protobuf#Foo of specified type protobuf#Bar in protobuf.\"\n    \"\"\"\n    myFoo: {\n      foo: \"renders\"\n    }\n    myFooOrBar: {\n      it_Bar: {\n        foo: \"also renders\"\n      }\n    }\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/protobuf2.pcf",
    "content": "examples {\n  [\"some\"] {\n    \"\"\"\n    plainString: \"plain string\"\n    nestedListing: {\n      it: \"foo\"\n      it: \"bar\"\n    }\n    nestedListing: {\n      it: \"baz\"\n      it: \"qux\"\n    }\n    nestedListing2: {\n      it: {\n        it: {\n          it: \"foo\"\n          it: \"bar\"\n          it: \"baz\"\n        }\n      }\n    }\n    nestedMapping: {\n      key: \"quux\"\n      value: {\n        it: {\n          key: 42\n          value: true\n        }\n        it: {\n          key: 1337\n          value: false\n        }\n      }\n    }\n    nestedMapping: {\n      key: \"corge\"\n      value: {\n        it: {\n          key: 0\n          value: false\n        }\n      }\n    }\n    listingInMapping: {\n      key: \"grault\"\n      value: {\n        it: \"grault1\"\n        it: \"grault2\"\n      }\n    }\n    listingInMapping: {\n      key: \"garply\"\n      value: {\n        it: \"garply1\"\n      }\n    }\n    listingInMapping: {\n      key: \"waldo\"\n      value: {}\n    }\n    mappingInListing: {\n      it: {\n        key: -1\n        value: false\n      }\n      it: {\n        key: 1\n        value: true\n      }\n    }\n    mappingInListing: {\n      it: {\n        key: -2\n        value: true\n      }\n      it: {\n        key: 2\n        value: false\n      }\n    }\n    nestedList: {\n      it: \"pigeon\"\n      it: \"plugh\"\n    }\n    nestedList: {}\n    nestedList: {\n      it: \"xyzzy\"\n    }\n    nestedMap: {\n      key: \"thud\"\n      value: {}\n    }\n    nestedMap: {\n      key: \"wibble\"\n      value: {\n        it: {\n          key: 1\n          value: false\n        }\n        it: {\n          key: 2\n          value: true\n        }\n      }\n    }\n    nestedMap: {\n      key: \"wobble\"\n      value: {\n        it: {\n          key: 0\n          value: false\n        }\n      }\n    }\n    \n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/protobuf3.txtpb",
    "content": "FOO: \"a\"\nbar: \"b\" # bar\nbaz: {\n  qux: \"c\" # qux\n  quux: \"c\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect1.pcf",
    "content": "facts {\n  [\"Reflecting a module\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Reflecting a module class\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Reflecting properties\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Reflecting a class\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Reflecting an annotation class\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Reflecting an alias\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Enclosing declarations\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"Reflected module properties of unknown type metadata\"] {\n    Set(\"int\", \"float\", \"string\", \"boolean\", \"duration\", \"dataSize\", \"pair\", \"list\", \"set\", \"map\", \"listing\", \"mapping\", \"dynamic\", \"typed\", \"int2\", \"float2\", \"string2\", \"boolean2\", \"duration2\", \"dataSize2\", \"pair2\", \"list2\", \"set2\", \"map2\", \"listing2\", \"mapping2\", \"dynamic2\", \"typed2\", \"any\", \"noth\", \"unkn\", \"union\", \"nullable\", \"stringLiteral\", \"constrained\", \"aliased\", \"hiddenProp\", \"constProp\", \"fixedProp\")\n    new {\n      hasExpectedLocation = true\n      docComment = \"module property doc comment\"\n      annotations = List(new {\n        text = \"module property annotation\"\n      })\n      modifiers = Set()\n      name = \"int\"\n      defaultValue = 42\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"float\"\n      defaultValue = 12.3\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"string\"\n      defaultValue = \"hello\"\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"boolean\"\n      defaultValue = true\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"duration\"\n      defaultValue = 42.h\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"dataSize\"\n      defaultValue = 12.3.gb\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"pair\"\n      defaultValue = Pair(42, \"hello\")\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"list\"\n      defaultValue = List(1, 2, 3)\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"set\"\n      defaultValue = Set(1, 2, 3)\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"map\"\n      defaultValue = Map(1, \"one\", 2, \"two\", 3, \"three\")\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"listing\"\n      defaultValue {\n        1\n        2\n        3\n      }\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"mapping\"\n      defaultValue {\n        [1] = \"one\"\n        [2] = \"two\"\n        [3] = \"three\"\n      }\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"dynamic\"\n      defaultValue {\n        name = \"Pigeon\"\n        age = 42\n      }\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"typed\"\n      defaultValue {\n        name = \"Pigeon\"\n        age = 42\n      }\n      hasExpectedType = true\n    }\n  }\n  [\"Reflected module properties of known type metadata\"] {\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"int2\"\n      defaultValue = 42\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"float2\"\n      defaultValue = 12.3\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"string2\"\n      defaultValue = \"hello\"\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"boolean2\"\n      defaultValue = true\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"duration2\"\n      defaultValue = 42.h\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"dataSize2\"\n      defaultValue = 12.3.gb\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"pair2\"\n      defaultValue = Pair(42, \"hello\")\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"list2\"\n      defaultValue = List(1, 2, 3)\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"set2\"\n      defaultValue = Set(1, 2, 3)\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"map2\"\n      defaultValue = Map(1, \"one\", 2, \"two\", 3, \"three\")\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"listing2\"\n      defaultValue {\n        1\n        2\n        3\n      }\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"mapping2\"\n      defaultValue {\n        [1] = \"one\"\n        [2] = \"two\"\n        [3] = \"three\"\n      }\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"dynamic2\"\n      defaultValue {\n        name = \"Pigeon\"\n        age = 42\n      }\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"typed2\"\n      defaultValue {\n        name = \"Pigeon\"\n        age = 42\n      }\n      hasExpectedType = true\n    }\n  }\n  [\"Reflected module methods metadata\"] {\n    Set(\"sing\", \"sing2\")\n    new {\n      hasExpectedLocation = true\n      docComment = \"module method doc comment\"\n      annotations = List(new {\n        text = \"module method annotation\"\n      })\n      modifiers = Set()\n      name = \"sing\"\n      typeParameters = List()\n      parameterNames = Set(\"person\", \"songs\")\n      hasExpectedParameterTypes = true\n      hasExpectedReturnType = true\n    }\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"sing2\"\n      typeParameters = List()\n      parameterNames = Set(\"person\", \"songs\")\n      hasExpectedParameterTypes = true\n      hasExpectedReturnType = true\n    }\n  }\n  [\"Reflected class properties metadata\"] {\n    Set(\"name\", \"age\")\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"name\"\n      defaultValue = \"Pigeon\"\n      hasExpectedType = true\n    }\n    new {\n      hasExpectedLocation = true\n      docComment = \"class property doc comment\"\n      annotations = List(new {\n        text = \"class property annotation\"\n      })\n      modifiers = Set()\n      name = \"age\"\n      defaultValue = 42\n      hasExpectedType = true\n    }\n    Set(\"hidden\")\n    Set(\"const\")\n    Set(\"fixed\")\n  }\n  [\"Reflected class methods metadata\"] {\n    Set(\"sing\")\n    new {\n      hasExpectedLocation = true\n      docComment = \"class method doc comment\"\n      annotations = List(new {\n        text = \"class method annotation\"\n      })\n      modifiers = Set()\n      name = \"sing\"\n      typeParameters = List()\n      parameterNames = Set(\"songs\")\n      hasExpectedParameterTypes = true\n      hasExpectedReturnType = true\n    }\n  }\n  [\"Reflected annotation class properties metadata\"] {\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"text\"\n      hasExpectedType = true\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect2.pcf",
    "content": "facts {\n  [\"Reflecting an extending module\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Reflecting an extending module class\"] {\n    true\n    true\n    true\n  }\n  [\"Reflecting properties\"] {\n    true\n  }\n  [\"Reflecting methods\"] {\n    true\n  }\n  [\"Reflecting an extended class\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"Reflected module properties of known extending type metadata\"] {\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"property\"\n      defaultValue {\n        name = \"Pigeon\"\n        age = 42\n      }\n      hasExpectedType = true\n    }\n  }\n  [\"Reflecting a method from an extending module\"] {\n    new {\n      hasExpectedLocation = true\n      annotations = List()\n      modifiers = Set()\n      name = \"method\"\n      typeParameters = List()\n      parameterNames = Set()\n      hasExpectedParameterTypes = true\n      hasExpectedReturnType = true\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect3.pcf",
    "content": "facts {\n  [\"Reflecting an amended module\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/reflect4.pcf",
    "content": "examples {\n  [\"C\"] {\n    new {\n      [\"inheritedFromA\"] {\n        name = \"inheritedFromA\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"overriddenInBFromA\"] {\n        name = \"overriddenInBFromA\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"Int\"\n      }\n      [\"overriddenInCFromA\"] {\n        name = \"overriddenInCFromA\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"Int\"\n      }\n      [\"overriddenInBCFromA\"] {\n        name = \"overriddenInBCFromA\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"Boolean\"\n      }\n      [\"modA\"] {\n        name = \"modA\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"fixed\"\n        }\n        allModifiers {\n          \"fixed\"\n        }\n        type = \"String\"\n      }\n      [\"modAOverrideB\"] {\n        name = \"modAOverrideB\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        allModifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        type = \"Int\"\n      }\n      [\"modAOverrideC\"] {\n        name = \"modAOverrideC\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        allModifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        type = \"Int\"\n      }\n      [\"modAOverrideBC\"] {\n        name = \"modAOverrideBC\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"fixed\"\n        }\n        allModifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        type = \"Boolean\"\n      }\n      [\"modAOverrideCB\"] {\n        name = \"modAOverrideCB\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        allModifiers {\n          \"hidden\"\n          \"fixed\"\n        }\n        type = \"Boolean\"\n      }\n      [\"annA\"] {\n        name = \"annA\"\n        annotations {\n          \"new Unlisted {}\"\n        }\n        allAnnotations {\n          \"new Unlisted {}\"\n        }\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"annAOverrideB\"] {\n        name = \"annAOverrideB\"\n        annotations {\n          \"new MyAnn {}\"\n        }\n        allAnnotations {\n          \"new MyAnn {}\"\n          \"new Unlisted {}\"\n        }\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"annAOverrideC\"] {\n        name = \"annAOverrideC\"\n        annotations {\n          \"new MyAnn {}\"\n        }\n        allAnnotations {\n          \"new MyAnn {}\"\n          \"new Unlisted {}\"\n        }\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"annAOverrideBC\"] {\n        name = \"annAOverrideBC\"\n        annotations {\n          \"new AlsoKnownAs { names { \\\"mergedAnnotations\\\" } }\"\n        }\n        allAnnotations {\n          \"new AlsoKnownAs { names { \\\"mergedAnnotations\\\" } }\"\n          \"new MyAnn {}\"\n          \"new Unlisted {}\"\n        }\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"inheritedFromB\"] {\n        name = \"inheritedFromB\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"overriddenInCFromB\"] {\n        name = \"overriddenInCFromB\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"Int\"\n      }\n      [\"modB\"] {\n        name = \"modB\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"fixed\"\n        }\n        allModifiers {\n          \"fixed\"\n        }\n        type = \"String\"\n      }\n      [\"annB\"] {\n        name = \"annB\"\n        annotations {\n          \"new Unlisted {}\"\n        }\n        allAnnotations {\n          \"new Unlisted {}\"\n        }\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"fromC\"] {\n        name = \"fromC\"\n        annotations {}\n        allAnnotations {}\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n      [\"modC\"] {\n        name = \"modC\"\n        annotations {}\n        allAnnotations {}\n        modifiers {\n          \"fixed\"\n        }\n        allModifiers {\n          \"fixed\"\n        }\n        type = \"String\"\n      }\n      [\"annC\"] {\n        name = \"annC\"\n        annotations {\n          \"new Unlisted {}\"\n        }\n        allAnnotations {\n          \"new Unlisted {}\"\n        }\n        modifiers {}\n        allModifiers {}\n        type = \"String\"\n      }\n    }\n  }\n  [\"module\"] {\n    new {\n      name = \"output\"\n      annotations {}\n      allAnnotations {}\n      modifiers {}\n      allModifiers {\n        \"hidden\"\n      }\n      type = \"unknown\"\n    }\n  }\n}\n\n// hello world"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/reflectedDeclaration.pcf",
    "content": "alias {\n  location {\n    line = X\n    column = 1\n    displayUri = \"file:///$snippetsDir/input/api/reflectedDeclaration.pkl\"\n  }\n  docComment = null\n  annotations = List()\n  modifiers = Set()\n  name = \"MyAlias\"\n  typeParameters = List()\n  referent {\n    members = List(new {\n      referent {\n        location {\n          line = XXXX\n          column = 1\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          A boolean value, either [true] or [false].\n          \n          The following operators are supported for booleans:\n          ```\n          !bool          // logical negation\n          bool1 && bool2 // logical conjunction\n          bool1 || bool2 // logical disjunction\n          ```\n          \"\"\"\n        annotations = List()\n        modifiers = Set(\"external\")\n        name = \"Boolean\"\n        typeParameters = List()\n        superclass {\n          location {\n            line = XX\n            column = 1\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            The top type of the type hierarchy.\n            \n            Every type is a subtype of [Any].\n            \n            The following operators are supported for all values:\n            \n            ```\n            value1 == value2 // equality\n            value1 != value2 // inequality\n            value.member     // member access\n            value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n            value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n            value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n            value is String  // type test\n            value as String  // type cast; throws an error unless `value is String`\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set(\"abstract\", \"external\")\n          name = \"Any\"\n          typeParameters = List()\n          superclass = null\n          supertype = null\n          properties = Map()\n          allProperties = Map()\n          methods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n          allMethods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n        }\n        supertype {\n          referent {\n            location {\n              line = XX\n              column = 1\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              The top type of the type hierarchy.\n              \n              Every type is a subtype of [Any].\n              \n              The following operators are supported for all values:\n              \n              ```\n              value1 == value2 // equality\n              value1 != value2 // inequality\n              value.member     // member access\n              value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n              value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n              value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n              value is String  // type test\n              value as String  // type cast; throws an error unless `value is String`\n              ```\n              \"\"\"\n            annotations = List()\n            modifiers = Set(\"abstract\", \"external\")\n            name = \"Any\"\n            typeParameters = List()\n            superclass = null\n            supertype = null\n            properties = Map()\n            allProperties = Map()\n            methods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n            allMethods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n          }\n          typeArguments = List()\n        }\n        properties = Map()\n        allProperties = Map()\n        methods = Map(\"xor\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if exactly one of [this] and [other] is [true] (exclusive or).\n            \n            Facts:\n            ```\n            !true.xor(true)\n            true.xor(false)\n            false.xor(true)\n            !false.xor(false)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"xor\"\n          typeParameters = List()\n          parameters = Map(\"other\", new {\n            name = \"other\"\n          })\n        }, \"implies\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if [this] implies [other] (logical consequence).\n            \n            *Note*: This function does not short-circuit; [other] is always evaluated.\n            \n            Facts:\n            ```\n            true.implies(true)\n            !true.implies(false)\n            false.implies(true)\n            false.implies(false)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"implies\"\n          typeParameters = List()\n          parameters = Map(\"other\", new {\n            name = \"other\"\n          })\n        })\n        allMethods = Map(\"getClass\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"Returns the class of [this].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getClass\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toString\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns a string representation of [this].\n            \n            This method is used to convert the values of string interpolation expressions to strings.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toString\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"ifNonNull\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n            \n            This method is the complement of the `??` operator and the equivalent of an `Option` type's\n            `map` and `flatMap` methods.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"ifNonNull\"\n          typeParameters = List(new {\n            name = \"Result\"\n            variance = null\n          })\n          parameters = Map(\"transform\", new {\n            name = \"transform\"\n          })\n        }, \"xor\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if exactly one of [this] and [other] is [true] (exclusive or).\n            \n            Facts:\n            ```\n            !true.xor(true)\n            true.xor(false)\n            false.xor(true)\n            !false.xor(false)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"xor\"\n          typeParameters = List()\n          parameters = Map(\"other\", new {\n            name = \"other\"\n          })\n        }, \"implies\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if [this] implies [other] (logical consequence).\n            \n            *Note*: This function does not short-circuit; [other] is always evaluated.\n            \n            Facts:\n            ```\n            true.implies(true)\n            !true.implies(false)\n            false.implies(true)\n            false.implies(false)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"implies\"\n          typeParameters = List()\n          parameters = Map(\"other\", new {\n            name = \"other\"\n          })\n        })\n      }\n      typeArguments = List()\n    }, new {\n      referent {\n        location {\n          line = XXXX\n          column = 1\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          A sequence of Unicode characters (code points).\n          \n          The following operators are supported for strings:\n          ```\n          str[3]      // subscript\n          str1 + str2 // concatenation\n          ```\n          \"\"\"\n        annotations = List()\n        modifiers = Set(\"external\")\n        name = \"String\"\n        typeParameters = List()\n        superclass {\n          location {\n            line = XX\n            column = 1\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            The top type of the type hierarchy.\n            \n            Every type is a subtype of [Any].\n            \n            The following operators are supported for all values:\n            \n            ```\n            value1 == value2 // equality\n            value1 != value2 // inequality\n            value.member     // member access\n            value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n            value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n            value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n            value is String  // type test\n            value as String  // type cast; throws an error unless `value is String`\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set(\"abstract\", \"external\")\n          name = \"Any\"\n          typeParameters = List()\n          superclass = null\n          supertype = null\n          properties = Map()\n          allProperties = Map()\n          methods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n          allMethods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n        }\n        supertype {\n          referent {\n            location {\n              line = XX\n              column = 1\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              The top type of the type hierarchy.\n              \n              Every type is a subtype of [Any].\n              \n              The following operators are supported for all values:\n              \n              ```\n              value1 == value2 // equality\n              value1 != value2 // inequality\n              value.member     // member access\n              value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n              value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n              value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n              value is String  // type test\n              value as String  // type cast; throws an error unless `value is String`\n              ```\n              \"\"\"\n            annotations = List()\n            modifiers = Set(\"abstract\", \"external\")\n            name = \"Any\"\n            typeParameters = List()\n            superclass = null\n            supertype = null\n            properties = Map()\n            allProperties = Map()\n            methods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n            allMethods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n          }\n          typeArguments = List()\n        }\n        properties = Map(\"length\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The number of characters in this string.\n            \n            *Note*: The runtime complexity of this operation is `O(n)`.\n            \n            Facts:\n            ```\n            \"\".length == 0\n            \"abc\".length == 3\n            ```\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"size\"\n              \"count\"\n            }\n          })\n          modifiers = Set()\n          name = \"length\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            names {\n              \"size\"\n              \"count\"\n            }\n          })\n        }, \"lastIndex\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The index of the last character in this string (same as `length - 1`).\n            \n            Returns `-1` for an empty string.\n            \n            *Note*: The runtime complexity of this operation is `O(n)`.\n            \n            Facts:\n            ```\n            \"\".lastIndex == -1\n            \"abc\".lastIndex == 2\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"lastIndex\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isEmpty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells whether this string is empty.\n            \n            Facts:\n            ```\n            \"\".isEmpty\n            !(\"   \".isEmpty)\n            !(\"abc\".isEmpty)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"isEmpty\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isNotEmpty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells whether this string is not empty.\n            \n            Facts:\n            ```\n            !\"\".isNotEmpty\n            \"abc\".isNotEmpty\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.31.0\"\n          })\n          modifiers = Set()\n          name = \"isNotEmpty\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.31.0\"\n          })\n        }, \"isBlank\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if all characters in this string have Unicode property \"White_Space\".\n            \n            Facts:\n            ```\n            \"\".isBlank\n            \"   \".isBlank\n            \"\\\\t\\\\n\\\\r\".isBlank\n            !(\"abc\".isBlank)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"isBlank\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isNotBlank\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if at least one character is not Unicode \"White_Space\".\n            \n            Facts:\n            ```\n            !\"\".isNotBlank\n            !\"   \".isNotBlank\n            \"\\\\t\\\\n\\\\r\".isNotBlank\n            \"abc\".isNotBlank\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.31.0\"\n          })\n          modifiers = Set()\n          name = \"isNotBlank\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.31.0\"\n          })\n        }, \"isRegex\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells if this string is a valid regular expression according to [Regex].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"isRegex\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isBase64\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if this is a valid base64-encoded string.\n            \n            Facts:\n            ```\n            \"AQIDBA==\".isBase64\n            !\"hello there\".isBase64\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.29.0\"\n          })\n          modifiers = Set()\n          name = \"isBase64\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.29.0\"\n          })\n        }, \"md5\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The [MD5](https://en.wikipedia.org/wiki/MD5)\n            hash of this string's UTF-8 byte sequence\n            as hexadecimal string.\n            \n            MD5 is cryptographically broken and should not be used for secure applications.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"md5\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"sha1\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The [SHA-1](https://en.wikipedia.org/wiki/SHA-1)\n            hash of this string's UTF-8 byte sequence.\n            \n            SHA-1 is cryptographically broken and should not be used for secure applications.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"sha1\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"sha256\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n            cryptographic hash of this string's UTF-8 byte sequence\n            as hexadecimal string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"sha256\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"sha256Int\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The first 64 bits of the [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n            cryptographic hash of this string's UTF-8 byte sequence.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"sha256Int\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"base64\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"The Base64 encoding of this string's UTF-8 byte sequence.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"base64\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"base64Decoded\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The inverse of [base64].\n            \n            Facts:\n            ```\n            \"abc\".base64.base64Decoded == \"abc\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"base64Decoded\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"base64DecodedBytes\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Converts this base64-format string into [Bytes].\n            \n            Facts:\n            ```\n            \"AQIDBA==\".base64DecodedBytes = Bytes(1, 2, 3, 4)\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.29.0\"\n          })\n          modifiers = Set()\n          name = \"base64DecodedBytes\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.29.0\"\n          })\n        }, \"chars\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The Unicode characters in this string.\n            \n            Facts:\n            ```\n            \"abc\".chars == List(\"a\", \"b\", \"c\")\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"chars\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"codePoints\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The Unicode code points in this string.\n            \n            Facts:\n            ```\n            \"abc\".codePoints == List(0x61, 0x62, 0x63)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"codePoints\"\n          allModifiers = Set()\n          allAnnotations = List()\n        })\n        allProperties = Map(\"length\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The number of characters in this string.\n            \n            *Note*: The runtime complexity of this operation is `O(n)`.\n            \n            Facts:\n            ```\n            \"\".length == 0\n            \"abc\".length == 3\n            ```\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"size\"\n              \"count\"\n            }\n          })\n          modifiers = Set()\n          name = \"length\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            names {\n              \"size\"\n              \"count\"\n            }\n          })\n        }, \"lastIndex\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The index of the last character in this string (same as `length - 1`).\n            \n            Returns `-1` for an empty string.\n            \n            *Note*: The runtime complexity of this operation is `O(n)`.\n            \n            Facts:\n            ```\n            \"\".lastIndex == -1\n            \"abc\".lastIndex == 2\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"lastIndex\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isEmpty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells whether this string is empty.\n            \n            Facts:\n            ```\n            \"\".isEmpty\n            !(\"   \".isEmpty)\n            !(\"abc\".isEmpty)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"isEmpty\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isNotEmpty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells whether this string is not empty.\n            \n            Facts:\n            ```\n            !\"\".isNotEmpty\n            \"abc\".isNotEmpty\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.31.0\"\n          })\n          modifiers = Set()\n          name = \"isNotEmpty\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.31.0\"\n          })\n        }, \"isBlank\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if all characters in this string have Unicode property \"White_Space\".\n            \n            Facts:\n            ```\n            \"\".isBlank\n            \"   \".isBlank\n            \"\\\\t\\\\n\\\\r\".isBlank\n            !(\"abc\".isBlank)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"isBlank\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isNotBlank\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if at least one character is not Unicode \"White_Space\".\n            \n            Facts:\n            ```\n            !\"\".isNotBlank\n            !\"   \".isNotBlank\n            \"\\\\t\\\\n\\\\r\".isNotBlank\n            \"abc\".isNotBlank\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.31.0\"\n          })\n          modifiers = Set()\n          name = \"isNotBlank\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.31.0\"\n          })\n        }, \"isRegex\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells if this string is a valid regular expression according to [Regex].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"isRegex\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"isBase64\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Tells if this is a valid base64-encoded string.\n            \n            Facts:\n            ```\n            \"AQIDBA==\".isBase64\n            !\"hello there\".isBase64\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.29.0\"\n          })\n          modifiers = Set()\n          name = \"isBase64\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.29.0\"\n          })\n        }, \"md5\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The [MD5](https://en.wikipedia.org/wiki/MD5)\n            hash of this string's UTF-8 byte sequence\n            as hexadecimal string.\n            \n            MD5 is cryptographically broken and should not be used for secure applications.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"md5\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"sha1\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The [SHA-1](https://en.wikipedia.org/wiki/SHA-1)\n            hash of this string's UTF-8 byte sequence.\n            \n            SHA-1 is cryptographically broken and should not be used for secure applications.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"sha1\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"sha256\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n            cryptographic hash of this string's UTF-8 byte sequence\n            as hexadecimal string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"sha256\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"sha256Int\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The first 64 bits of the [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n            cryptographic hash of this string's UTF-8 byte sequence.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"sha256Int\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"base64\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"The Base64 encoding of this string's UTF-8 byte sequence.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"base64\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"base64Decoded\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The inverse of [base64].\n            \n            Facts:\n            ```\n            \"abc\".base64.base64Decoded == \"abc\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"base64Decoded\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"base64DecodedBytes\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Converts this base64-format string into [Bytes].\n            \n            Facts:\n            ```\n            \"AQIDBA==\".base64DecodedBytes = Bytes(1, 2, 3, 4)\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.29.0\"\n          })\n          modifiers = Set()\n          name = \"base64DecodedBytes\"\n          allModifiers = Set()\n          allAnnotations = List(new {\n            version = \"0.29.0\"\n          })\n        }, \"chars\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The Unicode characters in this string.\n            \n            Facts:\n            ```\n            \"abc\".chars == List(\"a\", \"b\", \"c\")\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"chars\"\n          allModifiers = Set()\n          allAnnotations = List()\n        }, \"codePoints\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            The Unicode code points in this string.\n            \n            Facts:\n            ```\n            \"abc\".codePoints == List(0x61, 0x62, 0x63)\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"codePoints\"\n          allModifiers = Set()\n          allAnnotations = List()\n        })\n        methods = Map(\"getOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the character at [index], or [null] if [index] is out of range.\n            \n            Facts:\n            ```\n            \"abcde\".getOrNull(-1) == null\n            \"abcde\".getOrNull(0) == \"a\"\n            \"abcde\".getOrNull(2) == \"c\"\n            \"abcde\".getOrNull(4) == \"e\"\n            \"abcde\".getOrNull(5) == null\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getOrNull\"\n          typeParameters = List()\n          parameters = Map(\"index\", new {\n            name = \"index\"\n          })\n        }, \"substring\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the substring from [start] until [exclusiveEnd].\n            \n            Throws if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n            [start]..[length].\n            \n            Facts:\n            ```\n            \"abcde\".substring(0, 0) == \"\"\n            \"abcde\".substring(0, 1) == \"a\"\n            \"abcde\".substring(1, 4) == \"bcd\"\n            \"abcde\".substring(4, 5) == \"e\"\n            \"abcde\".substring(5, 5) == \"\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"substring\"\n          typeParameters = List()\n          parameters = Map(\"start\", new {\n            name = \"start\"\n          }, \"exclusiveEnd\", new {\n            name = \"exclusiveEnd\"\n          })\n        }, \"substringOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the substring from [start] until [exclusiveEnd].\n            \n            Returns [null] if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n            [start]..[length].\n            \n            Facts:\n            ```\n            \"abcde\".substringOrNull(0, 0) == \"\"\n            \"abcde\".substringOrNull(0, 1) == \"a\"\n            \"abcde\".substringOrNull(1, 4) == \"bcd\"\n            \"abcde\".substringOrNull(4, 5) == \"e\"\n            \"abcde\".substringOrNull(5, 5) == \"\"\n            \n            \"abcde\".substringOrNull(-1, 3) == null\n            \"abcde\".substringOrNull(0, 6) == null\n            \"abcde\".substringOrNull(3, 2) == null\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"substringOrNull\"\n          typeParameters = List()\n          parameters = Map(\"start\", new {\n            name = \"start\"\n          }, \"exclusiveEnd\", new {\n            name = \"exclusiveEnd\"\n          })\n        }, \"repeat\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Concatenates [count] copies of this string.\n            \n            Facts:\n            ```\n            \"abc\".repeat(0) == \"\"\n            \"abc\".repeat(1) == \"abc\"\n            \"abc\".repeat(3) == \"abcabcabc\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"repeat\"\n          typeParameters = List()\n          parameters = Map(\"count\", new {\n            name = \"count\"\n          })\n        }, \"contains\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string contains [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"contains\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"matches\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string matches [regex] in its entirety.\"\n          annotations = List(new {\n            names {\n              \"test\"\n            }\n          })\n          modifiers = Set()\n          name = \"matches\"\n          typeParameters = List()\n          parameters = Map(\"regex\", new {\n            name = \"regex\"\n          })\n        }, \"startsWith\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string starts with [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"startsWith\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"endsWith\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string ends with [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"endsWith\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"indexOf\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the first occurrence of [pattern]\n            in this string.\n            \n            Throws if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"indexOf\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"indexOfOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the first occurrence of [pattern]\n            in this string, or [null] if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"indexOfOrNull\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"lastIndexOf\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the last occurrence of [pattern]\n            in this string.\n            \n            Throws if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"lastIndexOf\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"lastIndexOfOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the last occurrence of [pattern]\n            in this string, or [null] if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"lastIndexOfOrNull\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"take\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the first [n] characters of this string.\n            \n            Returns [this] if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"limit\"\n            }\n          })\n          modifiers = Set()\n          name = \"take\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"takeWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Returns the longest prefix of this string that satisfies [predicate].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"takeWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"takeLast\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the last [n] characters of this string.\n            \n            Returns [this] if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"takeLast\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"takeLastWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Returns the longest suffix of this string that satisfies [predicate].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"takeLastWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"drop\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Removes the first [n] characters of this string.\n            \n            Returns the empty string if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"skip\"\n            }\n          })\n          modifiers = Set()\n          name = \"drop\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"dropWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes the longest prefix of this string that satisfies [predicate].\"\n          annotations = List(new {\n            names {\n              \"skipWhile\"\n            }\n          })\n          modifiers = Set()\n          name = \"dropWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"dropLast\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Removes the last [n] characters of this string.\n            \n            Returns the empty string if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"skipLast\"\n            }\n          })\n          modifiers = Set()\n          name = \"dropLast\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"dropLastWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes the longest suffix of this string that satisfies [predicate].\"\n          annotations = List(new {\n            names {\n              \"skipLastWhile\"\n            }\n          })\n          modifiers = Set()\n          name = \"dropLastWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"replaceFirst\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the first occurrence of [pattern] in this string with [replacement].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceFirst\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"replaceLast\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the last occurrence of [pattern] in this string with [replacement].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceLast\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"replaceAll\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces all occurrences of [pattern] in this string with [replacement].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceAll\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"replaceFirstMapped\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the first occurrence of [pattern] in this string with the return value of [mapper].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceFirstMapped\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"mapper\", new {\n            name = \"mapper\"\n          })\n        }, \"replaceLastMapped\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the last occurrence of [pattern] in this string with the return value of [mapper].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceLastMapped\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"mapper\", new {\n            name = \"mapper\"\n          })\n        }, \"replaceAllMapped\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces all occurrences of [pattern] in this string with the return value of [mapper].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceAllMapped\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"mapper\", new {\n            name = \"mapper\"\n          })\n        }, \"replaceRange\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the characters between [start] and [exclusiveEnd] with [replacement].\n            \n            Inserts [replacement] at index [start] if `start == exclusiveEnd`.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceRange\"\n          typeParameters = List()\n          parameters = Map(\"start\", new {\n            name = \"start\"\n          }, \"exclusiveEnd\", new {\n            name = \"exclusiveEnd\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"toUpperCase\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Performs a locale-independent character-by-character conversion of this string to uppercase.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toUpperCase\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toLowerCase\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Performs a locale-independent character-by-character conversion of this string to lowercase.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toLowerCase\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"reverse\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Reverses the order of characters in this string.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"reverse\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"trim\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Removes any leading and trailing characters with Unicode property \"White_Space\" from this\n            string.\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"strip\"\n            }\n          })\n          modifiers = Set()\n          name = \"trim\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"trimStart\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes any leading characters with Unicode property \\\"White_Space\\\" from this string.\"\n          annotations = List(new {\n            names {\n              \"stripLeft\"\n              \"stripStart\"\n              \"stripLeading\"\n              \"trimLeft\"\n              \"trimLeading\"\n            }\n          })\n          modifiers = Set()\n          name = \"trimStart\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"trimEnd\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes any trailing characters with Unicode property \\\"White_Space\\\" from this string.\"\n          annotations = List(new {\n            names {\n              \"stripRight\"\n              \"stripEnd\"\n              \"stripTrailing\"\n              \"trimRight\"\n              \"trimTrailin\"\n            }\n          })\n          modifiers = Set()\n          name = \"trimEnd\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"padStart\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Increases the length of this string to [width] by adding leading [char]s.\n            \n            Returns this string unchanged if its length is already equal to or greater than [width].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"padLeft\"\n            }\n          })\n          modifiers = Set()\n          name = \"padStart\"\n          typeParameters = List()\n          parameters = Map(\"width\", new {\n            name = \"width\"\n          }, \"char\", new {\n            name = \"char\"\n          })\n        }, \"padEnd\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Increases the length of this string to [width] by adding trailing [char]s.\n            \n            Returns this string unchanged if its length is already equal to or greater than [width].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"padRight\"\n            }\n          })\n          modifiers = Set()\n          name = \"padEnd\"\n          typeParameters = List()\n          parameters = Map(\"width\", new {\n            name = \"width\"\n          }, \"char\", new {\n            name = \"char\"\n          })\n        }, \"split\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Splits this string around matches of [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"split\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"splitLimit\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Splits this string matches of [pattern], up to [limit] substrings.\n            \n            Returns a [List] with at most [limit] elements.\n            If the limit has been reached, the last entry will contain the un-split remainder of this\n            string.\n            \n            Facts:\n            ```\n            \"a.b.c\".splitLimit(\".\", 2) == List(\"a\", \"b.c\")\n            \"a.b.c\".splitLimit(\".\", 1) == List(\"a.b.c\")\n            \"a.b.c\".splitLimit(\".\", 50) == List(\"a\", \"b\", \"c\")\n            \"a.b:c\".splitLimit(Regex(\"[.:]\"), 3) == List(\"a\", \"b\", \"c\")\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.27.0\"\n          })\n          modifiers = Set()\n          name = \"splitLimit\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"limit\", new {\n            name = \"limit\"\n          })\n        }, \"capitalize\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Converts the first character of this string to title case.\n            \n            Facts:\n            ```\n            \"pigeon\".capitalize() == \"Pigeon\"\n            \"pigeon bird\".capitalize() == \"Pigeon bird\"\n            \"\".capitalize() == \"\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"capitalize\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"decapitalize\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Converts the first character of this string to lower case.\n            \n            Facts:\n            ```\n            \"Pigeon\".decapitalize() == \"pigeon\"\n            \"Pigeon Bird\".decapitalize() == \"pigeon Bird\"\n            \"\".decapitalize() == \"\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"decapitalize\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toInt\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a signed decimal (base 10) integer.\n            \n            Throws if this string cannot be parsed as a signed decimal integer,\n            or if the integer is too large to fit into [Int].\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toInt\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toIntOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a signed decimal (base 10) integer.\n            \n            Returns [null] if this string cannot be parsed as a signed decimal integer,\n            or if the integer is too large to fit into [Int].\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toIntOrNull\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toFloat\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a floating point number.\n            \n            Throws if this string cannot be parsed as a floating point number.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toFloat\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toFloatOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a floating point number.\n            \n            Returns [null] if this string cannot be parsed as a floating point number.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toFloatOrNull\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toBoolean\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses `\"true\"` to [true] and `\"false\"` to [false] (case-insensitive).\n            \n            Throws if this string is neither `\"true\"` nor `\"false\"` (case-insensitive).\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toBoolean\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toBooleanOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses `\"true\"` to [true] and `\"false\"` to [false] (case-insensitive).\n            \n            Returns [null] if this string is neither `\"true\"` nor `\"false\"` (case-insensitive).\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toBooleanOrNull\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"encodeToBytes\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the bytes of this string, encoded using [charset]. \n            \n            Facts:\n            ```\n            \"Parrot\".encodeToBytes(\"UTF-8\") == Bytes(80, 97, 114, 114, 111, 116)\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.29.0\"\n          })\n          modifiers = Set()\n          name = \"encodeToBytes\"\n          typeParameters = List()\n          parameters = Map(\"charset\", new {\n            name = \"charset\"\n          })\n        })\n        allMethods = Map(\"getClass\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"Returns the class of [this].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getClass\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toString\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns a string representation of [this].\n            \n            This method is used to convert the values of string interpolation expressions to strings.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toString\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"ifNonNull\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n            \n            This method is the complement of the `??` operator and the equivalent of an `Option` type's\n            `map` and `flatMap` methods.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"ifNonNull\"\n          typeParameters = List(new {\n            name = \"Result\"\n            variance = null\n          })\n          parameters = Map(\"transform\", new {\n            name = \"transform\"\n          })\n        }, \"getOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the character at [index], or [null] if [index] is out of range.\n            \n            Facts:\n            ```\n            \"abcde\".getOrNull(-1) == null\n            \"abcde\".getOrNull(0) == \"a\"\n            \"abcde\".getOrNull(2) == \"c\"\n            \"abcde\".getOrNull(4) == \"e\"\n            \"abcde\".getOrNull(5) == null\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getOrNull\"\n          typeParameters = List()\n          parameters = Map(\"index\", new {\n            name = \"index\"\n          })\n        }, \"substring\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the substring from [start] until [exclusiveEnd].\n            \n            Throws if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n            [start]..[length].\n            \n            Facts:\n            ```\n            \"abcde\".substring(0, 0) == \"\"\n            \"abcde\".substring(0, 1) == \"a\"\n            \"abcde\".substring(1, 4) == \"bcd\"\n            \"abcde\".substring(4, 5) == \"e\"\n            \"abcde\".substring(5, 5) == \"\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"substring\"\n          typeParameters = List()\n          parameters = Map(\"start\", new {\n            name = \"start\"\n          }, \"exclusiveEnd\", new {\n            name = \"exclusiveEnd\"\n          })\n        }, \"substringOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the substring from [start] until [exclusiveEnd].\n            \n            Returns [null] if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n            [start]..[length].\n            \n            Facts:\n            ```\n            \"abcde\".substringOrNull(0, 0) == \"\"\n            \"abcde\".substringOrNull(0, 1) == \"a\"\n            \"abcde\".substringOrNull(1, 4) == \"bcd\"\n            \"abcde\".substringOrNull(4, 5) == \"e\"\n            \"abcde\".substringOrNull(5, 5) == \"\"\n            \n            \"abcde\".substringOrNull(-1, 3) == null\n            \"abcde\".substringOrNull(0, 6) == null\n            \"abcde\".substringOrNull(3, 2) == null\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"substringOrNull\"\n          typeParameters = List()\n          parameters = Map(\"start\", new {\n            name = \"start\"\n          }, \"exclusiveEnd\", new {\n            name = \"exclusiveEnd\"\n          })\n        }, \"repeat\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Concatenates [count] copies of this string.\n            \n            Facts:\n            ```\n            \"abc\".repeat(0) == \"\"\n            \"abc\".repeat(1) == \"abc\"\n            \"abc\".repeat(3) == \"abcabcabc\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"repeat\"\n          typeParameters = List()\n          parameters = Map(\"count\", new {\n            name = \"count\"\n          })\n        }, \"contains\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string contains [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"contains\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"matches\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string matches [regex] in its entirety.\"\n          annotations = List(new {\n            names {\n              \"test\"\n            }\n          })\n          modifiers = Set()\n          name = \"matches\"\n          typeParameters = List()\n          parameters = Map(\"regex\", new {\n            name = \"regex\"\n          })\n        }, \"startsWith\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string starts with [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"startsWith\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"endsWith\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells whether this string ends with [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"endsWith\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"indexOf\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the first occurrence of [pattern]\n            in this string.\n            \n            Throws if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"indexOf\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"indexOfOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the first occurrence of [pattern]\n            in this string, or [null] if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"indexOfOrNull\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"lastIndexOf\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the last occurrence of [pattern]\n            in this string.\n            \n            Throws if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"lastIndexOf\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"lastIndexOfOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the zero-based index of the last occurrence of [pattern]\n            in this string, or [null] if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"lastIndexOfOrNull\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"take\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the first [n] characters of this string.\n            \n            Returns [this] if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"limit\"\n            }\n          })\n          modifiers = Set()\n          name = \"take\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"takeWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Returns the longest prefix of this string that satisfies [predicate].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"takeWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"takeLast\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the last [n] characters of this string.\n            \n            Returns [this] if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"takeLast\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"takeLastWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Returns the longest suffix of this string that satisfies [predicate].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"takeLastWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"drop\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Removes the first [n] characters of this string.\n            \n            Returns the empty string if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"skip\"\n            }\n          })\n          modifiers = Set()\n          name = \"drop\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"dropWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes the longest prefix of this string that satisfies [predicate].\"\n          annotations = List(new {\n            names {\n              \"skipWhile\"\n            }\n          })\n          modifiers = Set()\n          name = \"dropWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"dropLast\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Removes the last [n] characters of this string.\n            \n            Returns the empty string if [n] is greater than or equal to [length].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"skipLast\"\n            }\n          })\n          modifiers = Set()\n          name = \"dropLast\"\n          typeParameters = List()\n          parameters = Map(\"n\", new {\n            name = \"n\"\n          })\n        }, \"dropLastWhile\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes the longest suffix of this string that satisfies [predicate].\"\n          annotations = List(new {\n            names {\n              \"skipLastWhile\"\n            }\n          })\n          modifiers = Set()\n          name = \"dropLastWhile\"\n          typeParameters = List()\n          parameters = Map(\"predicate\", new {\n            name = \"predicate\"\n          })\n        }, \"replaceFirst\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the first occurrence of [pattern] in this string with [replacement].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceFirst\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"replaceLast\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the last occurrence of [pattern] in this string with [replacement].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceLast\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"replaceAll\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces all occurrences of [pattern] in this string with [replacement].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceAll\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"replaceFirstMapped\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the first occurrence of [pattern] in this string with the return value of [mapper].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceFirstMapped\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"mapper\", new {\n            name = \"mapper\"\n          })\n        }, \"replaceLastMapped\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the last occurrence of [pattern] in this string with the return value of [mapper].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceLastMapped\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"mapper\", new {\n            name = \"mapper\"\n          })\n        }, \"replaceAllMapped\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces all occurrences of [pattern] in this string with the return value of [mapper].\n            \n            Returns this string unchanged if [pattern] does not occur in this string.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceAllMapped\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"mapper\", new {\n            name = \"mapper\"\n          })\n        }, \"replaceRange\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Replaces the characters between [start] and [exclusiveEnd] with [replacement].\n            \n            Inserts [replacement] at index [start] if `start == exclusiveEnd`.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"replaceRange\"\n          typeParameters = List()\n          parameters = Map(\"start\", new {\n            name = \"start\"\n          }, \"exclusiveEnd\", new {\n            name = \"exclusiveEnd\"\n          }, \"replacement\", new {\n            name = \"replacement\"\n          })\n        }, \"toUpperCase\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Performs a locale-independent character-by-character conversion of this string to uppercase.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toUpperCase\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toLowerCase\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Performs a locale-independent character-by-character conversion of this string to lowercase.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toLowerCase\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"reverse\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Reverses the order of characters in this string.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"reverse\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"trim\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Removes any leading and trailing characters with Unicode property \"White_Space\" from this\n            string.\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"strip\"\n            }\n          })\n          modifiers = Set()\n          name = \"trim\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"trimStart\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes any leading characters with Unicode property \\\"White_Space\\\" from this string.\"\n          annotations = List(new {\n            names {\n              \"stripLeft\"\n              \"stripStart\"\n              \"stripLeading\"\n              \"trimLeft\"\n              \"trimLeading\"\n            }\n          })\n          modifiers = Set()\n          name = \"trimStart\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"trimEnd\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Removes any trailing characters with Unicode property \\\"White_Space\\\" from this string.\"\n          annotations = List(new {\n            names {\n              \"stripRight\"\n              \"stripEnd\"\n              \"stripTrailing\"\n              \"trimRight\"\n              \"trimTrailin\"\n            }\n          })\n          modifiers = Set()\n          name = \"trimEnd\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"padStart\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Increases the length of this string to [width] by adding leading [char]s.\n            \n            Returns this string unchanged if its length is already equal to or greater than [width].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"padLeft\"\n            }\n          })\n          modifiers = Set()\n          name = \"padStart\"\n          typeParameters = List()\n          parameters = Map(\"width\", new {\n            name = \"width\"\n          }, \"char\", new {\n            name = \"char\"\n          })\n        }, \"padEnd\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Increases the length of this string to [width] by adding trailing [char]s.\n            \n            Returns this string unchanged if its length is already equal to or greater than [width].\n            \"\"\"\n          annotations = List(new {\n            names {\n              \"padRight\"\n            }\n          })\n          modifiers = Set()\n          name = \"padEnd\"\n          typeParameters = List()\n          parameters = Map(\"width\", new {\n            name = \"width\"\n          }, \"char\", new {\n            name = \"char\"\n          })\n        }, \"split\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Splits this string around matches of [pattern].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"split\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          })\n        }, \"splitLimit\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Splits this string matches of [pattern], up to [limit] substrings.\n            \n            Returns a [List] with at most [limit] elements.\n            If the limit has been reached, the last entry will contain the un-split remainder of this\n            string.\n            \n            Facts:\n            ```\n            \"a.b.c\".splitLimit(\".\", 2) == List(\"a\", \"b.c\")\n            \"a.b.c\".splitLimit(\".\", 1) == List(\"a.b.c\")\n            \"a.b.c\".splitLimit(\".\", 50) == List(\"a\", \"b\", \"c\")\n            \"a.b:c\".splitLimit(Regex(\"[.:]\"), 3) == List(\"a\", \"b\", \"c\")\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.27.0\"\n          })\n          modifiers = Set()\n          name = \"splitLimit\"\n          typeParameters = List()\n          parameters = Map(\"pattern\", new {\n            name = \"pattern\"\n          }, \"limit\", new {\n            name = \"limit\"\n          })\n        }, \"capitalize\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Converts the first character of this string to title case.\n            \n            Facts:\n            ```\n            \"pigeon\".capitalize() == \"Pigeon\"\n            \"pigeon bird\".capitalize() == \"Pigeon bird\"\n            \"\".capitalize() == \"\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"capitalize\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"decapitalize\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Converts the first character of this string to lower case.\n            \n            Facts:\n            ```\n            \"Pigeon\".decapitalize() == \"pigeon\"\n            \"Pigeon Bird\".decapitalize() == \"pigeon Bird\"\n            \"\".decapitalize() == \"\"\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"decapitalize\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toInt\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a signed decimal (base 10) integer.\n            \n            Throws if this string cannot be parsed as a signed decimal integer,\n            or if the integer is too large to fit into [Int].\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toInt\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toIntOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a signed decimal (base 10) integer.\n            \n            Returns [null] if this string cannot be parsed as a signed decimal integer,\n            or if the integer is too large to fit into [Int].\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toIntOrNull\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toFloat\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a floating point number.\n            \n            Throws if this string cannot be parsed as a floating point number.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toFloat\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toFloatOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses this string as a floating point number.\n            \n            Returns [null] if this string cannot be parsed as a floating point number.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toFloatOrNull\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toBoolean\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses `\"true\"` to [true] and `\"false\"` to [false] (case-insensitive).\n            \n            Throws if this string is neither `\"true\"` nor `\"false\"` (case-insensitive).\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toBoolean\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toBooleanOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Parses `\"true\"` to [true] and `\"false\"` to [false] (case-insensitive).\n            \n            Returns [null] if this string is neither `\"true\"` nor `\"false\"` (case-insensitive).\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toBooleanOrNull\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"encodeToBytes\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the bytes of this string, encoded using [charset]. \n            \n            Facts:\n            ```\n            \"Parrot\".encodeToBytes(\"UTF-8\") == Bytes(80, 97, 114, 114, 111, 116)\n            ```\n            \"\"\"\n          annotations = List(new {\n            version = \"0.29.0\"\n          })\n          modifiers = Set()\n          name = \"encodeToBytes\"\n          typeParameters = List()\n          parameters = Map(\"charset\", new {\n            name = \"charset\"\n          })\n        })\n      }\n      typeArguments = List()\n    })\n  }\n}\nrec {\n  referent {\n    location {\n      line = X\n      column = 1\n      displayUri = \"file:///$snippetsDir/input/api/reflectedDeclaration.pkl\"\n    }\n    docComment = null\n    annotations = List()\n    modifiers = Set()\n    name = \"Rec\"\n    typeParameters = List()\n    superclass {\n      location {\n        line = XXXX\n        column = 1\n        displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n      }\n      docComment = \"\"\"\n        Base class for objects whose members are described by a class definition.\n        \n        User-defined classes (that is, classes without `external` modifier) implicitly extend this\n        class.\n        \"\"\"\n      annotations = List()\n      modifiers = Set(\"abstract\")\n      name = \"Typed\"\n      typeParameters = List()\n      superclass {\n        location {\n          line = XXXX\n          column = 1\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          A composite value containing members (properties, elements, entries).\n          \n          ```\n          obj = new {\n            name = \"Pigeon\" // property\n            \"Hello\"       // element\n            [\"two\"] = 2   // entry\n          }\n          \n          obj.name   // \"Pigeon\"\n          obj[0]     // \"Hello\"\n          obj[\"two\"] // 2\n          ```\n          \n          An object can be *amended* to create variants of itself.\n          This is similar to inheritance in prototype-oriented programming.\n          \n          ```\n          pigeon = new { name = \"Pigeon\"; age = 42 }\n          barnOwl = (pigeon) { name = \"Barn Owl\" } // override property `name`\n          oldPigeon = (pigeon) { age = 84 } // override property `age`\n          ```\n          \n          Object members may reference other members:\n          \n          ```\n          thresholds = new { lower = 10; upper = lower + 5 }\n          ```\n          \n          Object members are dynamically bound.\n          This is similar to how computed cells in a spreadsheet work.\n          \n          ```\n          thresholds = new { lower = 10; upper = lower + 5 }\n          thresholds2 = new { lower = 7 } // thresholds2.upper == 12\n          ```\n          \n          Objects have memberwise equality and hash code.\n          \n          To arbitrarily manipulate an object, convert it to a [Collection].\n          If necessary, the manipulated [Collection] can be converted back to an [Object].\n          \n          ```\n          pigeon = new { name = \"Pigeon\"; age = 42 }\n          manipulated = pigeon.toMap().mapKeys((key, value) -> key.reverse())\n          manipulated.toDynamic() // new { eman = \"Pigeon\"; ega = 42 }\n          ```\n          \"\"\"\n        annotations = List()\n        modifiers = Set(\"abstract\", \"external\")\n        name = \"Object\"\n        typeParameters = List()\n        superclass {\n          location {\n            line = XX\n            column = 1\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            The top type of the type hierarchy.\n            \n            Every type is a subtype of [Any].\n            \n            The following operators are supported for all values:\n            \n            ```\n            value1 == value2 // equality\n            value1 != value2 // inequality\n            value.member     // member access\n            value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n            value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n            value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n            value is String  // type test\n            value as String  // type cast; throws an error unless `value is String`\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set(\"abstract\", \"external\")\n          name = \"Any\"\n          typeParameters = List()\n          superclass = null\n          supertype = null\n          properties = Map()\n          allProperties = Map()\n          methods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n          allMethods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n        }\n        supertype {\n          referent {\n            location {\n              line = XX\n              column = 1\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              The top type of the type hierarchy.\n              \n              Every type is a subtype of [Any].\n              \n              The following operators are supported for all values:\n              \n              ```\n              value1 == value2 // equality\n              value1 != value2 // inequality\n              value.member     // member access\n              value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n              value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n              value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n              value is String  // type test\n              value as String  // type cast; throws an error unless `value is String`\n              ```\n              \"\"\"\n            annotations = List()\n            modifiers = Set(\"abstract\", \"external\")\n            name = \"Any\"\n            typeParameters = List()\n            superclass = null\n            supertype = null\n            properties = Map()\n            allProperties = Map()\n            methods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n            allMethods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n          }\n          typeArguments = List()\n        }\n        properties = Map()\n        allProperties = Map()\n        methods = Map()\n        allMethods = Map(\"getClass\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"Returns the class of [this].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getClass\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toString\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns a string representation of [this].\n            \n            This method is used to convert the values of string interpolation expressions to strings.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toString\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"ifNonNull\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n            \n            This method is the complement of the `??` operator and the equivalent of an `Option` type's\n            `map` and `flatMap` methods.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"ifNonNull\"\n          typeParameters = List(new {\n            name = \"Result\"\n            variance = null\n          })\n          parameters = Map(\"transform\", new {\n            name = \"transform\"\n          })\n        })\n      }\n      supertype {\n        referent {\n          location {\n            line = XXXX\n            column = 1\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            A composite value containing members (properties, elements, entries).\n            \n            ```\n            obj = new {\n              name = \"Pigeon\" // property\n              \"Hello\"       // element\n              [\"two\"] = 2   // entry\n            }\n            \n            obj.name   // \"Pigeon\"\n            obj[0]     // \"Hello\"\n            obj[\"two\"] // 2\n            ```\n            \n            An object can be *amended* to create variants of itself.\n            This is similar to inheritance in prototype-oriented programming.\n            \n            ```\n            pigeon = new { name = \"Pigeon\"; age = 42 }\n            barnOwl = (pigeon) { name = \"Barn Owl\" } // override property `name`\n            oldPigeon = (pigeon) { age = 84 } // override property `age`\n            ```\n            \n            Object members may reference other members:\n            \n            ```\n            thresholds = new { lower = 10; upper = lower + 5 }\n            ```\n            \n            Object members are dynamically bound.\n            This is similar to how computed cells in a spreadsheet work.\n            \n            ```\n            thresholds = new { lower = 10; upper = lower + 5 }\n            thresholds2 = new { lower = 7 } // thresholds2.upper == 12\n            ```\n            \n            Objects have memberwise equality and hash code.\n            \n            To arbitrarily manipulate an object, convert it to a [Collection].\n            If necessary, the manipulated [Collection] can be converted back to an [Object].\n            \n            ```\n            pigeon = new { name = \"Pigeon\"; age = 42 }\n            manipulated = pigeon.toMap().mapKeys((key, value) -> key.reverse())\n            manipulated.toDynamic() // new { eman = \"Pigeon\"; ega = 42 }\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set(\"abstract\", \"external\")\n          name = \"Object\"\n          typeParameters = List()\n          superclass {\n            location {\n              line = XX\n              column = 1\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              The top type of the type hierarchy.\n              \n              Every type is a subtype of [Any].\n              \n              The following operators are supported for all values:\n              \n              ```\n              value1 == value2 // equality\n              value1 != value2 // inequality\n              value.member     // member access\n              value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n              value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n              value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n              value is String  // type test\n              value as String  // type cast; throws an error unless `value is String`\n              ```\n              \"\"\"\n            annotations = List()\n            modifiers = Set(\"abstract\", \"external\")\n            name = \"Any\"\n            typeParameters = List()\n            superclass = null\n            supertype = null\n            properties = Map()\n            allProperties = Map()\n            methods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n            allMethods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n          }\n          supertype {\n            referent {\n              location {\n                line = XX\n                column = 1\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                The top type of the type hierarchy.\n                \n                Every type is a subtype of [Any].\n                \n                The following operators are supported for all values:\n                \n                ```\n                value1 == value2 // equality\n                value1 != value2 // inequality\n                value.member     // member access\n                value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n                value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n                value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n                value is String  // type test\n                value as String  // type cast; throws an error unless `value is String`\n                ```\n                \"\"\"\n              annotations = List()\n              modifiers = Set(\"abstract\", \"external\")\n              name = \"Any\"\n              typeParameters = List()\n              superclass = null\n              supertype = null\n              properties = Map()\n              allProperties = Map()\n              methods = Map(\"getClass\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"Returns the class of [this].\"\n                annotations = List()\n                modifiers = Set()\n                name = \"getClass\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"toString\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns a string representation of [this].\n                  \n                  This method is used to convert the values of string interpolation expressions to strings.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"toString\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"ifNonNull\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                  \n                  This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                  `map` and `flatMap` methods.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"ifNonNull\"\n                typeParameters = List(new {\n                  name = \"Result\"\n                  variance = null\n                })\n                parameters = Map(\"transform\", new {\n                  name = \"transform\"\n                })\n              })\n              allMethods = Map(\"getClass\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"Returns the class of [this].\"\n                annotations = List()\n                modifiers = Set()\n                name = \"getClass\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"toString\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns a string representation of [this].\n                  \n                  This method is used to convert the values of string interpolation expressions to strings.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"toString\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"ifNonNull\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                  \n                  This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                  `map` and `flatMap` methods.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"ifNonNull\"\n                typeParameters = List(new {\n                  name = \"Result\"\n                  variance = null\n                })\n                parameters = Map(\"transform\", new {\n                  name = \"transform\"\n                })\n              })\n            }\n            typeArguments = List()\n          }\n          properties = Map()\n          allProperties = Map()\n          methods = Map()\n          allMethods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n        }\n        typeArguments = List()\n      }\n      properties = Map()\n      allProperties = Map()\n      methods = Map(\"hasProperty\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"Tells if this object has a property with the given [name].\"\n        annotations = List()\n        modifiers = Set()\n        name = \"hasProperty\"\n        typeParameters = List()\n        parameters = Map(\"name\", new {\n          name = \"name\"\n        })\n      }, \"getProperty\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          Returns the value of the property with the given [name].\n          \n          Throws if a property with this name does not exist.\n          \"\"\"\n        annotations = List()\n        modifiers = Set()\n        name = \"getProperty\"\n        typeParameters = List()\n        parameters = Map(\"name\", new {\n          name = \"name\"\n        })\n      }, \"getPropertyOrNull\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          Returns the value of the property with the given [name].\n          \n          Returns [null] if a property with this name does not exist.\n          \"\"\"\n        annotations = List()\n        modifiers = Set()\n        name = \"getPropertyOrNull\"\n        typeParameters = List()\n        parameters = Map(\"name\", new {\n          name = \"name\"\n        })\n      }, \"toDynamic\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"Converts this object to a [Dynamic] object.\"\n        annotations = List()\n        modifiers = Set()\n        name = \"toDynamic\"\n        typeParameters = List()\n        parameters = Map()\n      }, \"toMap\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"Converts this object to a [Map].\"\n        annotations = List()\n        modifiers = Set()\n        name = \"toMap\"\n        typeParameters = List()\n        parameters = Map()\n      })\n      allMethods = Map(\"getClass\", new {\n        location {\n          line = XX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n        }\n        docComment = \"Returns the class of [this].\"\n        annotations = List()\n        modifiers = Set()\n        name = \"getClass\"\n        typeParameters = List()\n        parameters = Map()\n      }, \"toString\", new {\n        location {\n          line = XX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n        }\n        docComment = \"\"\"\n          Returns a string representation of [this].\n          \n          This method is used to convert the values of string interpolation expressions to strings.\n          \"\"\"\n        annotations = List()\n        modifiers = Set()\n        name = \"toString\"\n        typeParameters = List()\n        parameters = Map()\n      }, \"ifNonNull\", new {\n        location {\n          line = XX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n        }\n        docComment = \"\"\"\n          Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n          \n          This method is the complement of the `??` operator and the equivalent of an `Option` type's\n          `map` and `flatMap` methods.\n          \"\"\"\n        annotations = List()\n        modifiers = Set()\n        name = \"ifNonNull\"\n        typeParameters = List(new {\n          name = \"Result\"\n          variance = null\n        })\n        parameters = Map(\"transform\", new {\n          name = \"transform\"\n        })\n      }, \"hasProperty\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"Tells if this object has a property with the given [name].\"\n        annotations = List()\n        modifiers = Set()\n        name = \"hasProperty\"\n        typeParameters = List()\n        parameters = Map(\"name\", new {\n          name = \"name\"\n        })\n      }, \"getProperty\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          Returns the value of the property with the given [name].\n          \n          Throws if a property with this name does not exist.\n          \"\"\"\n        annotations = List()\n        modifiers = Set()\n        name = \"getProperty\"\n        typeParameters = List()\n        parameters = Map(\"name\", new {\n          name = \"name\"\n        })\n      }, \"getPropertyOrNull\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          Returns the value of the property with the given [name].\n          \n          Returns [null] if a property with this name does not exist.\n          \"\"\"\n        annotations = List()\n        modifiers = Set()\n        name = \"getPropertyOrNull\"\n        typeParameters = List()\n        parameters = Map(\"name\", new {\n          name = \"name\"\n        })\n      }, \"toDynamic\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"Converts this object to a [Dynamic] object.\"\n        annotations = List()\n        modifiers = Set()\n        name = \"toDynamic\"\n        typeParameters = List()\n        parameters = Map()\n      }, \"toMap\", new {\n        location {\n          line = XXXX\n          column = 3\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"Converts this object to a [Map].\"\n        annotations = List()\n        modifiers = Set()\n        name = \"toMap\"\n        typeParameters = List()\n        parameters = Map()\n      })\n    }\n    supertype {\n      referent {\n        location {\n          line = XXXX\n          column = 1\n          displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n        }\n        docComment = \"\"\"\n          Base class for objects whose members are described by a class definition.\n          \n          User-defined classes (that is, classes without `external` modifier) implicitly extend this\n          class.\n          \"\"\"\n        annotations = List()\n        modifiers = Set(\"abstract\")\n        name = \"Typed\"\n        typeParameters = List()\n        superclass {\n          location {\n            line = XXXX\n            column = 1\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            A composite value containing members (properties, elements, entries).\n            \n            ```\n            obj = new {\n              name = \"Pigeon\" // property\n              \"Hello\"       // element\n              [\"two\"] = 2   // entry\n            }\n            \n            obj.name   // \"Pigeon\"\n            obj[0]     // \"Hello\"\n            obj[\"two\"] // 2\n            ```\n            \n            An object can be *amended* to create variants of itself.\n            This is similar to inheritance in prototype-oriented programming.\n            \n            ```\n            pigeon = new { name = \"Pigeon\"; age = 42 }\n            barnOwl = (pigeon) { name = \"Barn Owl\" } // override property `name`\n            oldPigeon = (pigeon) { age = 84 } // override property `age`\n            ```\n            \n            Object members may reference other members:\n            \n            ```\n            thresholds = new { lower = 10; upper = lower + 5 }\n            ```\n            \n            Object members are dynamically bound.\n            This is similar to how computed cells in a spreadsheet work.\n            \n            ```\n            thresholds = new { lower = 10; upper = lower + 5 }\n            thresholds2 = new { lower = 7 } // thresholds2.upper == 12\n            ```\n            \n            Objects have memberwise equality and hash code.\n            \n            To arbitrarily manipulate an object, convert it to a [Collection].\n            If necessary, the manipulated [Collection] can be converted back to an [Object].\n            \n            ```\n            pigeon = new { name = \"Pigeon\"; age = 42 }\n            manipulated = pigeon.toMap().mapKeys((key, value) -> key.reverse())\n            manipulated.toDynamic() // new { eman = \"Pigeon\"; ega = 42 }\n            ```\n            \"\"\"\n          annotations = List()\n          modifiers = Set(\"abstract\", \"external\")\n          name = \"Object\"\n          typeParameters = List()\n          superclass {\n            location {\n              line = XX\n              column = 1\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              The top type of the type hierarchy.\n              \n              Every type is a subtype of [Any].\n              \n              The following operators are supported for all values:\n              \n              ```\n              value1 == value2 // equality\n              value1 != value2 // inequality\n              value.member     // member access\n              value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n              value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n              value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n              value is String  // type test\n              value as String  // type cast; throws an error unless `value is String`\n              ```\n              \"\"\"\n            annotations = List()\n            modifiers = Set(\"abstract\", \"external\")\n            name = \"Any\"\n            typeParameters = List()\n            superclass = null\n            supertype = null\n            properties = Map()\n            allProperties = Map()\n            methods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n            allMethods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n          }\n          supertype {\n            referent {\n              location {\n                line = XX\n                column = 1\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                The top type of the type hierarchy.\n                \n                Every type is a subtype of [Any].\n                \n                The following operators are supported for all values:\n                \n                ```\n                value1 == value2 // equality\n                value1 != value2 // inequality\n                value.member     // member access\n                value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n                value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n                value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n                value is String  // type test\n                value as String  // type cast; throws an error unless `value is String`\n                ```\n                \"\"\"\n              annotations = List()\n              modifiers = Set(\"abstract\", \"external\")\n              name = \"Any\"\n              typeParameters = List()\n              superclass = null\n              supertype = null\n              properties = Map()\n              allProperties = Map()\n              methods = Map(\"getClass\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"Returns the class of [this].\"\n                annotations = List()\n                modifiers = Set()\n                name = \"getClass\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"toString\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns a string representation of [this].\n                  \n                  This method is used to convert the values of string interpolation expressions to strings.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"toString\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"ifNonNull\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                  \n                  This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                  `map` and `flatMap` methods.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"ifNonNull\"\n                typeParameters = List(new {\n                  name = \"Result\"\n                  variance = null\n                })\n                parameters = Map(\"transform\", new {\n                  name = \"transform\"\n                })\n              })\n              allMethods = Map(\"getClass\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"Returns the class of [this].\"\n                annotations = List()\n                modifiers = Set()\n                name = \"getClass\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"toString\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns a string representation of [this].\n                  \n                  This method is used to convert the values of string interpolation expressions to strings.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"toString\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"ifNonNull\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                  \n                  This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                  `map` and `flatMap` methods.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"ifNonNull\"\n                typeParameters = List(new {\n                  name = \"Result\"\n                  variance = null\n                })\n                parameters = Map(\"transform\", new {\n                  name = \"transform\"\n                })\n              })\n            }\n            typeArguments = List()\n          }\n          properties = Map()\n          allProperties = Map()\n          methods = Map()\n          allMethods = Map(\"getClass\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"Returns the class of [this].\"\n            annotations = List()\n            modifiers = Set()\n            name = \"getClass\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"toString\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns a string representation of [this].\n              \n              This method is used to convert the values of string interpolation expressions to strings.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"toString\"\n            typeParameters = List()\n            parameters = Map()\n          }, \"ifNonNull\", new {\n            location {\n              line = XX\n              column = 3\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n            }\n            docComment = \"\"\"\n              Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n              \n              This method is the complement of the `??` operator and the equivalent of an `Option` type's\n              `map` and `flatMap` methods.\n              \"\"\"\n            annotations = List()\n            modifiers = Set()\n            name = \"ifNonNull\"\n            typeParameters = List(new {\n              name = \"Result\"\n              variance = null\n            })\n            parameters = Map(\"transform\", new {\n              name = \"transform\"\n            })\n          })\n        }\n        supertype {\n          referent {\n            location {\n              line = XXXX\n              column = 1\n              displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n            }\n            docComment = \"\"\"\n              A composite value containing members (properties, elements, entries).\n              \n              ```\n              obj = new {\n                name = \"Pigeon\" // property\n                \"Hello\"       // element\n                [\"two\"] = 2   // entry\n              }\n              \n              obj.name   // \"Pigeon\"\n              obj[0]     // \"Hello\"\n              obj[\"two\"] // 2\n              ```\n              \n              An object can be *amended* to create variants of itself.\n              This is similar to inheritance in prototype-oriented programming.\n              \n              ```\n              pigeon = new { name = \"Pigeon\"; age = 42 }\n              barnOwl = (pigeon) { name = \"Barn Owl\" } // override property `name`\n              oldPigeon = (pigeon) { age = 84 } // override property `age`\n              ```\n              \n              Object members may reference other members:\n              \n              ```\n              thresholds = new { lower = 10; upper = lower + 5 }\n              ```\n              \n              Object members are dynamically bound.\n              This is similar to how computed cells in a spreadsheet work.\n              \n              ```\n              thresholds = new { lower = 10; upper = lower + 5 }\n              thresholds2 = new { lower = 7 } // thresholds2.upper == 12\n              ```\n              \n              Objects have memberwise equality and hash code.\n              \n              To arbitrarily manipulate an object, convert it to a [Collection].\n              If necessary, the manipulated [Collection] can be converted back to an [Object].\n              \n              ```\n              pigeon = new { name = \"Pigeon\"; age = 42 }\n              manipulated = pigeon.toMap().mapKeys((key, value) -> key.reverse())\n              manipulated.toDynamic() // new { eman = \"Pigeon\"; ega = 42 }\n              ```\n              \"\"\"\n            annotations = List()\n            modifiers = Set(\"abstract\", \"external\")\n            name = \"Object\"\n            typeParameters = List()\n            superclass {\n              location {\n                line = XX\n                column = 1\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                The top type of the type hierarchy.\n                \n                Every type is a subtype of [Any].\n                \n                The following operators are supported for all values:\n                \n                ```\n                value1 == value2 // equality\n                value1 != value2 // inequality\n                value.member     // member access\n                value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n                value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n                value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n                value is String  // type test\n                value as String  // type cast; throws an error unless `value is String`\n                ```\n                \"\"\"\n              annotations = List()\n              modifiers = Set(\"abstract\", \"external\")\n              name = \"Any\"\n              typeParameters = List()\n              superclass = null\n              supertype = null\n              properties = Map()\n              allProperties = Map()\n              methods = Map(\"getClass\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"Returns the class of [this].\"\n                annotations = List()\n                modifiers = Set()\n                name = \"getClass\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"toString\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns a string representation of [this].\n                  \n                  This method is used to convert the values of string interpolation expressions to strings.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"toString\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"ifNonNull\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                  \n                  This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                  `map` and `flatMap` methods.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"ifNonNull\"\n                typeParameters = List(new {\n                  name = \"Result\"\n                  variance = null\n                })\n                parameters = Map(\"transform\", new {\n                  name = \"transform\"\n                })\n              })\n              allMethods = Map(\"getClass\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"Returns the class of [this].\"\n                annotations = List()\n                modifiers = Set()\n                name = \"getClass\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"toString\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns a string representation of [this].\n                  \n                  This method is used to convert the values of string interpolation expressions to strings.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"toString\"\n                typeParameters = List()\n                parameters = Map()\n              }, \"ifNonNull\", new {\n                location {\n                  line = XX\n                  column = 3\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                  \n                  This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                  `map` and `flatMap` methods.\n                  \"\"\"\n                annotations = List()\n                modifiers = Set()\n                name = \"ifNonNull\"\n                typeParameters = List(new {\n                  name = \"Result\"\n                  variance = null\n                })\n                parameters = Map(\"transform\", new {\n                  name = \"transform\"\n                })\n              })\n            }\n            supertype {\n              referent {\n                location {\n                  line = XX\n                  column = 1\n                  displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                }\n                docComment = \"\"\"\n                  The top type of the type hierarchy.\n                  \n                  Every type is a subtype of [Any].\n                  \n                  The following operators are supported for all values:\n                  \n                  ```\n                  value1 == value2 // equality\n                  value1 != value2 // inequality\n                  value.member     // member access\n                  value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n                  value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n                  value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n                  value is String  // type test\n                  value as String  // type cast; throws an error unless `value is String`\n                  ```\n                  \"\"\"\n                annotations = List()\n                modifiers = Set(\"abstract\", \"external\")\n                name = \"Any\"\n                typeParameters = List()\n                superclass = null\n                supertype = null\n                properties = Map()\n                allProperties = Map()\n                methods = Map(\"getClass\", new {\n                  location {\n                    line = XX\n                    column = 3\n                    displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                  }\n                  docComment = \"Returns the class of [this].\"\n                  annotations = List()\n                  modifiers = Set()\n                  name = \"getClass\"\n                  typeParameters = List()\n                  parameters = Map()\n                }, \"toString\", new {\n                  location {\n                    line = XX\n                    column = 3\n                    displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                  }\n                  docComment = \"\"\"\n                    Returns a string representation of [this].\n                    \n                    This method is used to convert the values of string interpolation expressions to strings.\n                    \"\"\"\n                  annotations = List()\n                  modifiers = Set()\n                  name = \"toString\"\n                  typeParameters = List()\n                  parameters = Map()\n                }, \"ifNonNull\", new {\n                  location {\n                    line = XX\n                    column = 3\n                    displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                  }\n                  docComment = \"\"\"\n                    Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                    \n                    This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                    `map` and `flatMap` methods.\n                    \"\"\"\n                  annotations = List()\n                  modifiers = Set()\n                  name = \"ifNonNull\"\n                  typeParameters = List(new {\n                    name = \"Result\"\n                    variance = null\n                  })\n                  parameters = Map(\"transform\", new {\n                    name = \"transform\"\n                  })\n                })\n                allMethods = Map(\"getClass\", new {\n                  location {\n                    line = XX\n                    column = 3\n                    displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                  }\n                  docComment = \"Returns the class of [this].\"\n                  annotations = List()\n                  modifiers = Set()\n                  name = \"getClass\"\n                  typeParameters = List()\n                  parameters = Map()\n                }, \"toString\", new {\n                  location {\n                    line = XX\n                    column = 3\n                    displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                  }\n                  docComment = \"\"\"\n                    Returns a string representation of [this].\n                    \n                    This method is used to convert the values of string interpolation expressions to strings.\n                    \"\"\"\n                  annotations = List()\n                  modifiers = Set()\n                  name = \"toString\"\n                  typeParameters = List()\n                  parameters = Map()\n                }, \"ifNonNull\", new {\n                  location {\n                    line = XX\n                    column = 3\n                    displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n                  }\n                  docComment = \"\"\"\n                    Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                    \n                    This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                    `map` and `flatMap` methods.\n                    \"\"\"\n                  annotations = List()\n                  modifiers = Set()\n                  name = \"ifNonNull\"\n                  typeParameters = List(new {\n                    name = \"Result\"\n                    variance = null\n                  })\n                  parameters = Map(\"transform\", new {\n                    name = \"transform\"\n                  })\n                })\n              }\n              typeArguments = List()\n            }\n            properties = Map()\n            allProperties = Map()\n            methods = Map()\n            allMethods = Map(\"getClass\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"Returns the class of [this].\"\n              annotations = List()\n              modifiers = Set()\n              name = \"getClass\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"toString\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns a string representation of [this].\n                \n                This method is used to convert the values of string interpolation expressions to strings.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"toString\"\n              typeParameters = List()\n              parameters = Map()\n            }, \"ifNonNull\", new {\n              location {\n                line = XX\n                column = 3\n                displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n              }\n              docComment = \"\"\"\n                Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n                \n                This method is the complement of the `??` operator and the equivalent of an `Option` type's\n                `map` and `flatMap` methods.\n                \"\"\"\n              annotations = List()\n              modifiers = Set()\n              name = \"ifNonNull\"\n              typeParameters = List(new {\n                name = \"Result\"\n                variance = null\n              })\n              parameters = Map(\"transform\", new {\n                name = \"transform\"\n              })\n            })\n          }\n          typeArguments = List()\n        }\n        properties = Map()\n        allProperties = Map()\n        methods = Map(\"hasProperty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells if this object has a property with the given [name].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"hasProperty\"\n          typeParameters = List()\n          parameters = Map(\"name\", new {\n            name = \"name\"\n          })\n        }, \"getProperty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the value of the property with the given [name].\n            \n            Throws if a property with this name does not exist.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getProperty\"\n          typeParameters = List()\n          parameters = Map(\"name\", new {\n            name = \"name\"\n          })\n        }, \"getPropertyOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the value of the property with the given [name].\n            \n            Returns [null] if a property with this name does not exist.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getPropertyOrNull\"\n          typeParameters = List()\n          parameters = Map(\"name\", new {\n            name = \"name\"\n          })\n        }, \"toDynamic\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Converts this object to a [Dynamic] object.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toDynamic\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toMap\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Converts this object to a [Map].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toMap\"\n          typeParameters = List()\n          parameters = Map()\n        })\n        allMethods = Map(\"getClass\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"Returns the class of [this].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getClass\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toString\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns a string representation of [this].\n            \n            This method is used to convert the values of string interpolation expressions to strings.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toString\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"ifNonNull\", new {\n          location {\n            line = XX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXX\"\n          }\n          docComment = \"\"\"\n            Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n            \n            This method is the complement of the `??` operator and the equivalent of an `Option` type's\n            `map` and `flatMap` methods.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"ifNonNull\"\n          typeParameters = List(new {\n            name = \"Result\"\n            variance = null\n          })\n          parameters = Map(\"transform\", new {\n            name = \"transform\"\n          })\n        }, \"hasProperty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Tells if this object has a property with the given [name].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"hasProperty\"\n          typeParameters = List()\n          parameters = Map(\"name\", new {\n            name = \"name\"\n          })\n        }, \"getProperty\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the value of the property with the given [name].\n            \n            Throws if a property with this name does not exist.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getProperty\"\n          typeParameters = List()\n          parameters = Map(\"name\", new {\n            name = \"name\"\n          })\n        }, \"getPropertyOrNull\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"\"\"\n            Returns the value of the property with the given [name].\n            \n            Returns [null] if a property with this name does not exist.\n            \"\"\"\n          annotations = List()\n          modifiers = Set()\n          name = \"getPropertyOrNull\"\n          typeParameters = List()\n          parameters = Map(\"name\", new {\n            name = \"name\"\n          })\n        }, \"toDynamic\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Converts this object to a [Dynamic] object.\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toDynamic\"\n          typeParameters = List()\n          parameters = Map()\n        }, \"toMap\", new {\n          location {\n            line = XXXX\n            column = 3\n            displayUri = \"https://github.com/apple/pkl/blob/$commitId/stdlib/base.pkl#LXXXX\"\n          }\n          docComment = \"Converts this object to a [Map].\"\n          annotations = List()\n          modifiers = Set()\n          name = \"toMap\"\n          typeParameters = List()\n          parameters = Map()\n        })\n      }\n      typeArguments = List()\n    }\n    properties = Map(\"rec\", new {\n      location {\n        line = X\n        column = 3\n        displayUri = \"file:///$snippetsDir/input/api/reflectedDeclaration.pkl\"\n      }\n      docComment = null\n      annotations = List()\n      modifiers = Set()\n      name = \"rec\"\n      allModifiers = Set()\n      allAnnotations = List()\n    })\n    allProperties = Map(\"rec\", new {\n      location {\n        line = X\n        column = 3\n        displayUri = \"file:///$snippetsDir/input/api/reflectedDeclaration.pkl\"\n      }\n      docComment = null\n      annotations = List()\n      modifiers = Set()\n      name = \"rec\"\n      allModifiers = Set()\n      allAnnotations = List()\n    })\n    methods = Map()\n    allMethods = Map(\"getClass\", new {\n      location {\n        line = XX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"Returns the class of [this].\"\n      annotations = List()\n      modifiers = Set()\n      name = \"getClass\"\n      typeParameters = List()\n      parameters = Map()\n    }, \"toString\", new {\n      location {\n        line = XX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"\"\"\n        Returns a string representation of [this].\n        \n        This method is used to convert the values of string interpolation expressions to strings.\n        \"\"\"\n      annotations = List()\n      modifiers = Set()\n      name = \"toString\"\n      typeParameters = List()\n      parameters = Map()\n    }, \"ifNonNull\", new {\n      location {\n        line = XX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"\"\"\n        Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n        \n        This method is the complement of the `??` operator and the equivalent of an `Option` type's\n        `map` and `flatMap` methods.\n        \"\"\"\n      annotations = List()\n      modifiers = Set()\n      name = \"ifNonNull\"\n      typeParameters = List(new {\n        name = \"Result\"\n        variance = null\n      })\n      parameters = Map(\"transform\", new {\n        name = \"transform\"\n      })\n    }, \"hasProperty\", new {\n      location {\n        line = XXXX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"Tells if this object has a property with the given [name].\"\n      annotations = List()\n      modifiers = Set()\n      name = \"hasProperty\"\n      typeParameters = List()\n      parameters = Map(\"name\", new {\n        name = \"name\"\n      })\n    }, \"getProperty\", new {\n      location {\n        line = XXXX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"\"\"\n        Returns the value of the property with the given [name].\n        \n        Throws if a property with this name does not exist.\n        \"\"\"\n      annotations = List()\n      modifiers = Set()\n      name = \"getProperty\"\n      typeParameters = List()\n      parameters = Map(\"name\", new {\n        name = \"name\"\n      })\n    }, \"getPropertyOrNull\", new {\n      location {\n        line = XXXX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"\"\"\n        Returns the value of the property with the given [name].\n        \n        Returns [null] if a property with this name does not exist.\n        \"\"\"\n      annotations = List()\n      modifiers = Set()\n      name = \"getPropertyOrNull\"\n      typeParameters = List()\n      parameters = Map(\"name\", new {\n        name = \"name\"\n      })\n    }, \"toDynamic\", new {\n      location {\n        line = XXXX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"Converts this object to a [Dynamic] object.\"\n      annotations = List()\n      modifiers = Set()\n      name = \"toDynamic\"\n      typeParameters = List()\n      parameters = Map()\n    }, \"toMap\", new {\n      location {\n        line = XXXX\n        column = 3\n        displayUri = \"pkl:base\"\n      }\n      docComment = \"Converts this object to a [Map].\"\n      annotations = List()\n      modifiers = Set()\n      name = \"toMap\"\n      typeParameters = List()\n      parameters = Map()\n    })\n  }\n  typeArguments = List()\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/regex.pcf",
    "content": "examples {\n  [\"construction\"] {\n    Regex(\"abc\")\n    true\n  }\n  [\"pattern\"] {\n    \"\"\n    \"(?i)abc\"\n    \"a(\\\\s*)b(\\\\s*)c\"\n    \"a(?:\\\\s*)b\\\\(c\\\\)\"\n  }\n  [\"groupCount\"] {\n    0\n    0\n    2\n    0\n  }\n  [\"findMatchesIn()\"] {\n    List()\n    List(new {\n      value = \"[*]\"\n      start = 0\n      end = 3\n      groups = List(new {\n        value = \"[*]\"\n        start = 0\n        end = 3\n        groups = List()\n      })\n    }, new {\n      value = \"[*]\"\n      start = 8\n      end = 11\n      groups = List(new {\n        value = \"[*]\"\n        start = 8\n        end = 11\n        groups = List()\n      })\n    })\n    List(new {\n      value = \"\"\n      start = 0\n      end = 0\n      groups = List(new {\n        value = \"\"\n        start = 0\n        end = 0\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 1\n      end = 1\n      groups = List(new {\n        value = \"\"\n        start = 1\n        end = 1\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 2\n      end = 2\n      groups = List(new {\n        value = \"\"\n        start = 2\n        end = 2\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 3\n      end = 3\n      groups = List(new {\n        value = \"\"\n        start = 3\n        end = 3\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 4\n      end = 4\n      groups = List(new {\n        value = \"\"\n        start = 4\n        end = 4\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 5\n      end = 5\n      groups = List(new {\n        value = \"\"\n        start = 5\n        end = 5\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 6\n      end = 6\n      groups = List(new {\n        value = \"\"\n        start = 6\n        end = 6\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 7\n      end = 7\n      groups = List(new {\n        value = \"\"\n        start = 7\n        end = 7\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 8\n      end = 8\n      groups = List(new {\n        value = \"\"\n        start = 8\n        end = 8\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 9\n      end = 9\n      groups = List(new {\n        value = \"\"\n        start = 9\n        end = 9\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 10\n      end = 10\n      groups = List(new {\n        value = \"\"\n        start = 10\n        end = 10\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 11\n      end = 11\n      groups = List(new {\n        value = \"\"\n        start = 11\n        end = 11\n        groups = List()\n      })\n    })\n    List(new {\n      value = \"[*] ... [*]\"\n      start = 0\n      end = 11\n      groups = List(new {\n        value = \"[*] ... [*]\"\n        start = 0\n        end = 11\n        groups = List()\n      })\n    }, new {\n      value = \"\"\n      start = 11\n      end = 11\n      groups = List(new {\n        value = \"\"\n        start = 11\n        end = 11\n        groups = List()\n      })\n    })\n    \"Syntax error in regex `*`: Dangling meta character '*' near index 0 * ^\"\n    List(new {\n      value = \"fooPigeonbarBarnOwl\"\n      start = 0\n      end = 19\n      groups = List(new {\n        value = \"fooPigeonbarBarnOwl\"\n        start = 0\n        end = 19\n        groups = List()\n      }, new {\n        value = \"Pigeon\"\n        start = 3\n        end = 9\n        groups = List()\n      }, new {\n        value = \"BarnOwl\"\n        start = 12\n        end = 19\n        groups = List()\n      })\n    })\n    List(new {\n      value = \"fooPigeonbarBarnOwl\"\n      start = 6\n      end = 25\n      groups = List(new {\n        value = \"fooPigeonbarBarnOwl\"\n        start = 6\n        end = 25\n        groups = List()\n      }, new {\n        value = \"Pigeon\"\n        start = 9\n        end = 15\n        groups = List()\n      }, new {\n        value = \"BarnOwl\"\n        start = 18\n        end = 25\n        groups = List()\n      })\n    }, new {\n      value = \"fooParrotbarElfOwl\"\n      start = 32\n      end = 50\n      groups = List(new {\n        value = \"fooParrotbarElfOwl\"\n        start = 32\n        end = 50\n        groups = List()\n      }, new {\n        value = \"Parrot\"\n        start = 35\n        end = 41\n        groups = List()\n      }, new {\n        value = \"ElfOwl\"\n        start = 44\n        end = 50\n        groups = List()\n      })\n    })\n    List(new {\n      value = \"abc\"\n      start = 3\n      end = 6\n      groups = List(new {\n        value = \"abc\"\n        start = 3\n        end = 6\n        groups = List()\n      }, new {\n        value = \"abc\"\n        start = 3\n        end = 6\n        groups = List()\n      }, null)\n    }, new {\n      value = \"def\"\n      start = 9\n      end = 12\n      groups = List(new {\n        value = \"def\"\n        start = 9\n        end = 12\n        groups = List()\n      }, null, new {\n        value = \"def\"\n        start = 9\n        end = 12\n        groups = List()\n      })\n    }, new {\n      value = \"abc\"\n      start = 15\n      end = 18\n      groups = List(new {\n        value = \"abc\"\n        start = 15\n        end = 18\n        groups = List()\n      }, new {\n        value = \"abc\"\n        start = 15\n        end = 18\n        groups = List()\n      }, null)\n    })\n    List(\"abc\", \"def\")\n    List(\"abc\", \"a\", \"bc\")\n  }\n  [\"matchEntire()\"] {\n    new {\n      value = \"123abc\"\n      start = 0\n      end = 6\n      groups = List(new {\n        value = \"123abc\"\n        start = 0\n        end = 6\n        groups = List()\n      }, new {\n        value = \"123\"\n        start = 0\n        end = 3\n        groups = List()\n      })\n    }\n    null\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/releaseModule.pcf",
    "content": "facts {\n  [\"version\"] {\n    true\n    true\n    true\n  }\n  [\"versionInfo\"] {\n    true\n  }\n  [\"commitId\"] {\n    true\n  }\n  [\"sourceCode\"] {\n    true\n    true\n  }\n  [\"documentation\"] {\n    true\n    true\n  }\n  [\"standardLibrary\"] {\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/renderDirective.pcf",
    "content": "examples {\n  [\"pcf\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    directiveProperty ✅/&\\\\;)*❌\n    normalProperty = 42\n    dynamic {\n      foo {\n        bar {\n          baz +#✅<;)❌* /\\\\->\n        }\n        qux +\\\\✅)❌#-;<* />\n      }\n    }\n    listing {\n      \"foo\"\n      💰\n      \"baz\"\n    }\n    mapping {\n      [\"key\"] = \"value\"\n      [🔑] = 42\n      [\"other\"] 💰\n    }\n    \n    \"\"\"\n    \"\"\"\n    ✅\\\\❌ /-#;)<>\n    \n    \"\"\"\n  }\n  [\"json\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    {\n      \"directiveProperty\": ✅/&\\\\;)*❌,\n      \"normalProperty\": 42,\n      \"dynamic\": {\n        \"foo\": {\n          \"bar\": {\n            \"baz\": +#✅<;)❌* /\\\\->\n          },\n          \"qux\": +\\\\✅)❌#-;<* />\n        }\n      },\n      \"listing\": [\n        \"foo\",\n        💰,\n        \"baz\"\n      ],\n      \"mapping\": {\n        \"key\": \"value\",\n        🔑: 42,\n        \"other\": 💰\n      }\n    }\n    \n    \"\"\"\n    \"\"\"\n    ✅\\\\❌ /-#;)<>\n    \n    \"\"\"\n  }\n  [\"jsonnet\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    {\n      directiveProperty: ✅/&\\\\;)*❌,\n      normalProperty: 42,\n      dynamic: {\n        foo: {\n          bar: {\n            baz: +#✅<;)❌* /\\\\->,\n          },\n          qux: +\\\\✅)❌#-;<* />,\n        },\n      },\n      listing: [\n        'foo',\n        💰,\n        'baz',\n      ],\n      mapping: {\n        key: 'value',\n        🔑: 42,\n        other: 💰,\n      },\n    }\n    \n    \"\"\"\n    \"\"\"\n    ✅\\\\❌ /-#;)<>\n    \n    \"\"\"\n  }\n  [\"plist\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n    <plist version=\"1.0\">\n    <dict>\n      <key>directiveProperty</key>\n      ✅/&\\\\;)*❌\n      <key>normalProperty</key>\n      <integer>42</integer>\n      <key>dynamic</key>\n      <dict>\n        <key>foo</key>\n        <dict>\n          <key>bar</key>\n          <dict>\n            <key>baz</key>\n            +#✅<;)❌* /\\\\->\n          </dict>\n          <key>qux</key>\n          +\\\\✅)❌#-;<* />\n        </dict>\n      </dict>\n      <key>listing</key>\n      <array>\n        <string>foo</string>\n        💰\n        <string>baz</string>\n      </array>\n      <key>mapping</key>\n      <dict>\n        <key>key</key>\n        <string>value</string>\n        <key>🔑</key>\n        <integer>42</integer>\n        <key>other</key>\n        💰\n      </dict>\n    </dict>\n    </plist>\n    \n    \"\"\"\n    \"\"\"\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n    <plist version=\"1.0\">\n    ✅\\\\❌ /-#;)<>\n    </plist>\n    \n    \"\"\"\n  }\n  [\"properties\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    directiveProperty = ✅/&\\\\;)*❌\n    normalProperty = 42\n    dynamic.foo.bar.baz = +#✅<;)❌* /\\\\->\n    dynamic.foo.qux = +\\\\✅)❌#-;<* />\n    \n    \"\"\"\n    \"✅\\\\❌ /-#;)<>\"\n  }\n  [\"textproto\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    directiveProperty: ✅/&\\\\;)*❌\n    normalProperty: 42\n    listing: \"foo\"\n    listing: 💰\n    listing: \"baz\"\n    mapping: {\n      key: \"key\"\n      value: \"value\"\n    }\n    mapping: {\n      key: 🔑\n      value: 42\n    }\n    mapping: {\n      key: \"other\"\n      value: 💰\n    }\n    \n    \"\"\"\n    \"\"\"\n    ✅\\\\❌ /-#;)<>\n    \n    \"\"\"\n  }\n  [\"xml\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <root>\n      <directiveProperty>✅/&\\\\;)*❌</directiveProperty>\n      <normalProperty>42</normalProperty>\n      <dynamic>\n        <foo>\n          <bar>\n            <baz>+#✅<;)❌* /\\\\-></baz>\n          </bar>\n          <qux>+\\\\✅)❌#-;<* /></qux>\n        </foo>\n      </dynamic>\n      <listing>foo💰baz</listing>\n      <mapping>\n        <key>value</key>\n        <🔑>42</🔑>\n        <other>💰</other>\n      </mapping>\n    </root>\n    \n    \"\"\"\n    \"\"\"\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <root>✅\\\\❌ /-#;)<></root>\n    \n    \"\"\"\n  }\n  [\"yaml\"] {\n    \"\"\"\n    1\"2\n    3\\t4'\n    \"\"\"\n    \"+* /\\\\-;)❌#✅<>\"\n    \"\"\"\n    directiveProperty:✅/&\\\\;)*❌\n    normalProperty: 42\n    dynamic:\n      foo:\n        bar:\n          baz:+#✅<;)❌* /\\\\->\n        qux:+\\\\✅)❌#-;<* />\n    listing:\n    - foo\n    -💰\n    - baz\n    mapping:\n      key: value\n      🔑: 42\n      other:💰\n    \n    \"\"\"\n    \"\"\"\n    ✅\\\\❌ /-#;)<>\n    \n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/renderDirective2.pcf",
    "content": "examples {\n  [\"pcf\"] {\n    \"\"\"\n    property (value)\n    elements {\n      (element1)\n      (element2)\n    }\n    entries {\n      [(key1)] (value1)\n      [(key2)] (value2)\n    }\n    \n    \"\"\"\n  }\n  [\"json\"] {\n    \"\"\"\n    {\n      \"property\": (value),\n      \"elements\": [\n        (element1),\n        (element2)\n      ],\n      \"entries\": {\n        (key1): (value1),\n        (key2): (value2)\n      }\n    }\n    \n    \"\"\"\n  }\n  [\"jsonnet\"] {\n    \"\"\"\n    {\n      property: (value),\n      elements: [\n        (element1),\n        (element2),\n      ],\n      entries: {\n        (key1): (value1),\n        (key2): (value2),\n      },\n    }\n    \n    \"\"\"\n  }\n  [\"plist\"] {\n    \"\"\"\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n    <plist version=\"1.0\">\n    <dict>\n      <key>property</key>\n      (value)\n      <key>elements</key>\n      <array>\n        (element1)\n        (element2)\n      </array>\n      <key>entries</key>\n      <dict>\n        <key>(key1)</key>\n        (value1)\n        <key>(key2)</key>\n        (value2)\n      </dict>\n    </dict>\n    </plist>\n    \n    \"\"\"\n  }\n  [\"properties\"] {\n    \"\"\"\n    property = (value)\n    elements = element1,element2\n    entries.(key1) = (value1)\n    entries.(key2) = (value2)\n    \n    \"\"\"\n  }\n  [\"textproto\"] {\n    \"\"\"\n    property: (value)\n    elements: (element1)\n    elements: (element2)\n    entries: {\n      key: (key1)\n      value: (value1)\n    }\n    entries: {\n      key: (key2)\n      value: (value2)\n    }\n    \n    \"\"\"\n  }\n  [\"xml\"] {\n    \"\"\"\n    <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <root>\n      <property>(value)</property>\n      <elements>(element1)(element2)</elements>\n      <entries>\n        <(key1)>(value1)</(key1)>\n        <(key2)>(value2)</(key2)>\n      </entries>\n    </root>\n    \n    \"\"\"\n  }\n  [\"yaml\"] {\n    \"\"\"\n    property:(value)\n    elements:\n    -(element1)\n    -(element2)\n    entries:\n      (key1):(value1)\n      (key2):(value2)\n    \n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/semverModule.pcf",
    "content": "facts {\n  [\"parseOrNull()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.major\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.minor\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.patch\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.preRelease\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.build\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.equals()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.isLessThan()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.isLessThanOrEquals()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.isGreaterThan()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.isGreaterThanOrEquals()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.isNormal()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.isStable()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Version.toString()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"Version\"] {\n    new {\n      major = 0\n      minor = 0\n      patch = 0\n    }\n    new {\n      major = 1\n      minor = 2\n      patch = 3\n    }\n    new {\n      major = 1\n      minor = 2\n      patch = 3\n      preRelease = \"beta-1\"\n    }\n    new {\n      major = 1\n      minor = 2\n      patch = 3\n      preRelease = \"beta-1\"\n      build = \"340249\"\n    }\n    \"`1` is not a valid semantic version number.\"\n    \"`1.2` is not a valid semantic version number.\"\n    \"`1.02.3` is not a valid semantic version number.\"\n    \"`aaa` is not a valid semantic version number.\"\n  }\n  [\"List.sortWith()\"] {\n    List(new {\n      major = 0\n      minor = 0\n      patch = 100\n    }, new {\n      major = 0\n      minor = 100\n      patch = 0\n    }, new {\n      major = 100\n      minor = 0\n      patch = 0\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/set.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n    true\n  }\n  [\"isNotEmpty\"] {\n    true\n    true\n  }\n  [\"every()\"] {\n    true\n    true\n  }\n  [\"any()\"] {\n    true\n    true\n  }\n  [\"contains()\"] {\n    true\n    true\n  }\n  [\"startsWith()\"] {\n    true\n    true\n    true\n  }\n  [\"endsWith()\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"every\"] {\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"any\"] {\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"length\"] {\n    3\n  }\n  [\"filter()\"] {\n    Set(2, 3)\n    Set()\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"map()\"] {\n    Set(2, 4, 6)\n    Set(List(1, 1), List(2, 2), List(3, 3))\n  }\n  [\"flatMap()\"] {\n    Set(1, 2, 3, 4)\n    \"Expected value of type `Collection`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"flatten()\"] {\n    Set(1, 2, 3, 4, 5)\n    Set(1, 2, 3, 4, 5)\n    Set(1, 2, 3, 4, 5)\n    Set(1, 2, 3, 4, 5)\n    Set()\n  }\n  [\"first\"] {\n    1\n  }\n  [\"rest\"] {\n    Set(2, 3)\n  }\n  [\"last\"] {\n    3\n  }\n  [\"single\"] {\n    1\n  }\n  [\"count()\"] {\n    2\n    3\n    0\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"find()\"] {\n    2\n    1\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"findLast()\"] {\n    3\n    3\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"take()\"] {\n    Set()\n    Set(1, 2)\n    Set(1, 2, 3)\n  }\n  [\"takeWhile()\"] {\n    Set(1, 2, 3)\n    Set()\n    Set(1, 2)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"takeLast()\"] {\n    Set()\n    Set(2, 3)\n    Set(1, 2, 3)\n  }\n  [\"takeLastWhile()\"] {\n    Set(1, 2, 3)\n    Set()\n    Set(2, 3)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"drop()\"] {\n    Set(1, 2, 3)\n    Set(3)\n    Set()\n  }\n  [\"dropWhile()\"] {\n    Set()\n    Set(1, 2, 3)\n    Set(3)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"dropLast()\"] {\n    Set(1, 2, 3)\n    Set(1)\n    Set()\n  }\n  [\"dropLastWhile()\"] {\n    Set()\n    Set(1, 2, 3)\n    Set(1)\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"fold()\"] {\n    6\n    List(1, 2, 3)\n    1\n    0\n  }\n  [\"foldBack()\"] {\n    6\n    List(3, 2, 1)\n    1\n    0\n  }\n  [\"reduce()\"] {\n    6\n    1\n    \"Expected a non-empty collection. Collection: Set()\"\n  }\n  [\"groupBy()\"] {\n    Map(1, Set(1), 2, Set(2), 3, Set(3), 4, Set(4), 5, Set(5))\n    Map(true, Set(1, 3, 5), false, Set(2, 4))\n    Map(true, Set(1, 2, 3, 4, 5))\n    Map()\n  }\n  [\"sortWith()\"] {\n    List()\n    List(1, 2, 3)\n    List(1, 2, 3, 4, 5)\n  }\n  [\"sortWith() with deprecated 3-way comparator\"] {\n    List()\n    List(1, 2, 3)\n    List(1, 2, 3, 4, 5)\n  }\n  [\"toList()\"] {\n    List(1, 2, 3)\n  }\n  [\"toSet()\"] {\n    Set(1, 2, 3)\n  }\n  [\"intersect()\"] {\n    Set()\n    Set()\n    Set(2, 3)\n    Set()\n  }\n  [\"difference()\"] {\n    Set(1, 2, 3)\n    Set()\n    Set(1)\n    Set(1, 2, 3)\n  }\n  [\"toMap()\"] {\n    Map(1, 2, 2, 4, 3, 6)\n    Map(\"Pigeon\", new {\n      name = \"Pigeon\"\n      age = 40\n    }, \"Parrot\", new {\n      name = \"Parrot\"\n      age = 30\n    })\n  }\n  [\"add()\"] {\n    Set(1, 2, 3, 42)\n    Set(42)\n  }\n  [\"minWith()\"] {\n    1\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"minWith() with deprecated 3-way comparator\"] {\n    1\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"maxWith()\"] {\n    1\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"maxWith() with deprecated 3-way comparator\"] {\n    1\n    1\n    \"Expected a non-empty collection. Collection: List()\"\n  }\n  [\"zip()\"] {\n    Set(Pair(1, 4), Pair(2, 5), Pair(3, 6))\n    Set(Pair(1, 4), Pair(2, 5), Pair(3, 6))\n  }\n  [\"filterIndexed()\"] {\n    Set(2)\n    Set(1, 3)\n    Set()\n    Set(3)\n  }\n  [\"mapIndexed()\"] {\n    Set(0, 2, 6)\n    Set(false, true)\n  }\n  [\"mapNonNullIndexed()\"] {\n    Set(2, 12)\n    Set(2, 12)\n  }\n  [\"flatMapIndexed()\"] {\n    Set(0, 2, 6)\n    Set(false, true)\n  }\n  [\"foldIndexed()\"] {\n    9\n    1\n    0\n  }\n  [\"toListing()\"] {\n    new {\n      1\n      2\n      3\n    }\n    new {}\n  }\n  [\"toDynamic()\"] {\n    new {\n      1\n      2\n      3\n    }\n    new {}\n  }\n  [\"filterNonNull()\"] {\n    Set(1, 2, 3)\n    Set()\n    Set(1, 2, 3)\n    Set()\n  }\n  [\"mapNonNull()\"] {\n    Set(1, 2, 3)\n    Set()\n    Set()\n    Set(1, 2, 3)\n  }\n  [\"filterIsInstance()\"] {\n    Set(1, 2, 3)\n    Set(1, 2, 3)\n    Set(1, 2, 3)\n    Set()\n    Set()\n    Set(\"2\", \"4\")\n    Set()\n  }\n  [\"split()\"] {\n    Pair(Set(), Set(1, 2, 3))\n    Pair(Set(1), Set(2, 3))\n    Pair(Set(1, 2), Set(3))\n    Pair(Set(1, 2, 3), Set())\n    Pair(Set(), Set())\n    \"Element index `-1` is out of range `0`..`3`. Collection: Set(1, 2, 3)\"\n    \"Element index `4` is out of range `0`..`3`. Collection: Set(1, 2, 3)\"\n  }\n  [\"partition()\"] {\n    Pair(Set(2), Set(1, 3))\n    Pair(Set(1, 3), Set(2))\n    Pair(Set(1, 2, 3), Set())\n    Pair(Set(), Set(1, 2, 3))\n    Pair(Set(), Set())\n  }\n  [\"min\"] {\n    1\n    \"Barn Owl\"\n    -99999\n    42\n    42.0\n    100.mb\n    100.ms\n    \"Expected a non-empty collection. Collection: Set()\"\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"max\"] {\n    3\n    \"Pigeon\"\n    42\n    42\n    42.0\n    12.tb\n    3.d\n    \"Expected a non-empty collection. Collection: Set()\"\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"minBy()\"] {\n    1\n    3\n    \"Pigeon\"\n    \"Barn Owl\"\n    11.gb\n    100.mb\n    11.s\n    100.ms\n    \"Expected a non-empty collection. Collection: Set()\"\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"maxBy()\"] {\n    3\n    1\n    \"Barn Owl\"\n    \"Parrot\"\n    100.mb\n    12.tb\n    100.ms\n    12.min\n    \"Expected a non-empty collection. Collection: Set()\"\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"sort()\"] {\n    List(1, 2, 3)\n    List(-99999, -8.4, 3.9, 42)\n    List(\"Barn Owl\", \"Parrot\", \"Pigeon\")\n    List(100.mb, 11.gb, 12.tb)\n    List(100.ms, 11.s, 3.d)\n    List()\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"sortBy()\"] {\n    List(1, 2, 3)\n    List(3, 2, 1)\n    List(\"Pigeon\", \"Parrot\", \"Barn Owl\")\n    List(\"Barn Owl\", \"Pigeon\", \"Parrot\")\n    List(11.gb, 12.tb, 100.mb)\n    List(100.mb, 11.gb, 12.tb)\n    List()\n    List(0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10)\n  }\n  [\"repeat()\"] {\n    List()\n    List(1, 2, 3)\n    List(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)\n    List()\n    List()\n    List()\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"reverse()\"] {\n    List(3, 2, 1)\n    List(1, 2, 3)\n    List(3.d, \"Pigeon\", 1)\n    List()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/setNullable.pcf",
    "content": "examples {\n  [\"firstOrNull\"] {\n    1\n    null\n  }\n  [\"restOrNull\"] {\n    Set(2, 3)\n    null\n  }\n  [\"lastOrNull\"] {\n    3\n    null\n  }\n  [\"singleOrNull\"] {\n    1\n    null\n    null\n  }\n  [\"findOrNull()\"] {\n    2\n    null\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"findLastOrNull()\"] {\n    3\n    null\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  [\"reduceOrNull()\"] {\n    6\n    1\n    null\n  }\n  [\"minWithOrNull()\"] {\n    1\n    1\n    null\n  }\n  [\"maxWithOrNull()\"] {\n    3\n    1\n    null\n  }\n  [\"splitOrNull()\"] {\n    Pair(Set(), Set(1, 2, 3))\n    Pair(Set(1), Set(2, 3))\n    Pair(Set(1, 2), Set(3))\n    Pair(Set(1, 2, 3), Set())\n    Pair(Set(), Set())\n    null\n    null\n  }\n  [\"minOrNull\"] {\n    1\n    \"Barn Owl\"\n    -99999\n    42\n    42.0\n    100.mb\n    100.ms\n    null\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"maxOrNull\"] {\n    3\n    \"Pigeon\"\n    42\n    42\n    42.0\n    12.tb\n    3.d\n    null\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"minByOrNull()\"] {\n    1\n    3\n    \"Pigeon\"\n    \"Barn Owl\"\n    11.gb\n    100.mb\n    11.s\n    100.ms\n    null\n    \"Operator `<` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n  [\"maxByOrNull()\"] {\n    3\n    1\n    \"Barn Owl\"\n    \"Parrot\"\n    100.mb\n    12.tb\n    100.ms\n    12.min\n    null\n    \"Operator `>` is not defined for operand types `String` and `Int`. Left operand : \\\"Pigeon\\\" Right operand: 1\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/shellModule.pcf",
    "content": "examples {\n  [\"escapeWithSingleQuotes()\"] {\n    \"'asdf'\"\n    \"'`@#$'\"\n    \"'abc\\\"abc'\"\n    \"'abc'\\\\''def'\\\\'\\\\''ghi'\\\\'\\\\'\\\\''jkl'\"\n    \"\\\\''abc'\\\\'\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/string.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n    true\n  }\n  [\"isNotEmpty\"] {\n    true\n    true\n  }\n  [\"isBlank\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"isNotBlank\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"isBase64\"] {\n    true\n    true\n    true\n  }\n  [\"lastIndex\"] {\n    true\n    true\n    true\n  }\n  [\"base64Decoded\"] {\n    true\n    true\n  }\n  [\"base64DecodedBytes\"] {\n    true\n  }\n  [\"contains()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"matches()\"] {\n    true\n    true\n    true\n  }\n  [\"startsWith()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"endsWith()\"] {\n    true\n    true\n    true\n  }\n  [\"isRegex\"] {\n    true\n    true\n    true\n  }\n  [\"toBoolean()\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"capitalize()\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"decapitalize()\"] {\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"length\"] {\n    7\n  }\n  [\"indexOf()\"] {\n    2\n    0\n    \"String does not contain a match for literal pattern. String : \\\"abcdefg\\\" Pattern: \\\"cdx\\\"\"\n    0\n    \"String does not contain a match for regex pattern. String : \\\"abcdefg\\\" Pattern: Regex(#\\\"\\\\d\\\"#)\"\n  }\n  [\"indexOfOrNull()\"] {\n    2\n    0\n    null\n    0\n    null\n  }\n  [\"reverse()\"] {\n    \"gfedcba\"\n  }\n  [\"lastIndexOf()\"] {\n    6\n    9\n    \"String does not contain a match for literal pattern. String : \\\"abxabyabz\\\" Pattern: \\\"cdx\\\"\"\n    6\n    9\n    \"String does not contain a match for regex pattern. String : \\\"abxabyabz\\\" Pattern: Regex(\\\"b*c\\\")\"\n  }\n  [\"lastIndexOfOrNull()\"] {\n    6\n    9\n    null\n  }\n  [\"split()\"] {\n    List(\"aa\", \"caa\", \"c\")\n    List(\"aabb\", \"aabb\")\n  }\n  [\"splitLimit()\"] {\n    List(\"aabbccaabbccaabbccaabbcc\")\n    List(\"aa\", \"caabbccaabbccaabbcc\")\n    List(\"aa\", \"caa\", \"caa\", \"caabbcc\")\n    List(\"aabbccaabbccaabbccaabbcc\")\n    List(\"aabb\", \"aabbccaabbccaabbcc\")\n    List(\"aabb\", \"aabb\", \"aabb\", \"aabbcc\")\n    \"Type constraint `this > 0` violated. Value: 0\"\n    \"Type constraint `this > 0` violated. Value: -1\"\n  }\n  [\"replaceAll()\"] {\n    \"xxbbccxxbbcc\"\n    \"aa(bbc|bb)caa(bbc|bb)c\"\n    \"aabbxxaabbcc\"\n    \"xxxxxxxxxxxx\"\n    \"Error replacing matches for regex `cc` with `$4; no such group`: `No group 4`\"\n  }\n  [\"replaceFirst()\"] {\n    \"xxbbccaabbcc\"\n    \"aa(bbc|bb)caabbcc\"\n    \"aabbx.aabbcc\"\n    \"xabb..aabbcc\"\n    \"Error replacing matches for regex `cc` with `$4; no such group`: `No group 4`\"\n  }\n  [\"replaceLast()\"] {\n    \"aabbccxxbbcc\"\n    \"aabbccaa(bbc|bb)c\"\n    \"aabb.xaabbcc\"\n    \"aabb..aabbcx\"\n    \"Error replacing matches for regex `cc` with `$4; no such group`: `No group 4`\"\n  }\n  [\"replaceAllMapped()\"] {\n    \">>aa<<bbcc>>aa<<bbcc\"\n    \"aa>>bbc<<caa>>bbc<<c\"\n    \"aabb>>.<<>>.<<aabbcc\"\n    \">>a<<>>a<<>>b<<>>b<<>>.<<>>.<<>>a<<>>a<<>>b<<>>b<<>>c<<>>c<<\"\n  }\n  [\"replaceFirstMapped()\"] {\n    \">>aa<<bbccaabbcc\"\n    \"aa>>bbc<<caabbcc\"\n    \"aabb>>.<<.aabbcc\"\n    \">>a<<abb..aabbcc\"\n  }\n  [\"replaceLastMapped()\"] {\n    \"aabbcc>>aa<<bbcc\"\n    \"aabbccaa>>bbc<<c\"\n    \"aabb.>>.<<aabbcc\"\n    \"aabb..aabbc>>c<<\"\n  }\n  [\"replaceRange()\"] {\n    \"aabbcXXXcc\"\n    \"aabbccaabbextend beyond string end\"\n    \"Character index `100` is out of range `0`..`12`. String: \\\"aabbccaabbcc\\\"\"\n    \"Character index `-10` is out of range `0`..`12`. String: \\\"aabbccaabbcc\\\"\"\n  }\n  [\"toUpperCase()\"] {\n    \"ABCABCABC\"\n  }\n  [\"toLowerCase()\"] {\n    \"abcabcabc\"\n  }\n  [\"trim\"] {\n    \"abcdefg\"\n  }\n  [\"trimStart()\"] {\n    \"\"\"\n    abcdefg \\t \n    \n    \"\"\"\n  }\n  [\"trimEnd()\"] {\n    \" \\t abcdefg\"\n  }\n  [\"chars\"] {\n    List()\n    List(\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\")\n  }\n  [\"codePoints\"] {\n    List()\n    List(97, 98, 99, 100, 101, 102, 103)\n  }\n  [\"toInt()\"] {\n    123\n    -123\n    123\n    -123\n    0\n    0\n    \"Cannot parse string as `Int`. String: \\\"1.2\\\"\"\n    \"Cannot parse string as `Int`. String: \\\"9223372036854775808\\\"\"\n    \"Cannot parse string as `Int`. String: \\\"-9223372036854775809\\\"\"\n    \"Cannot parse string as `Int`. String: \\\"abc\\\"\"\n    \"Cannot parse string as `Int`. String: \\\"_1_000\\\"\"\n  }\n  [\"toIntOrNull()\"] {\n    123\n    -123\n    123\n    -123\n    0\n    0\n    null\n    null\n    null\n    null\n    null\n  }\n  [\"toFloat()\"] {\n    0.0\n    -0.0\n    0.0\n    -0.0\n    0.0\n    -0.0\n    123.0\n    -123.0\n    0.45\n    -0.45\n    0.45\n    -0.45\n    123.45\n    -123.45\n    1.23E11\n    1.23E11\n    -1.23E11\n    1.2345E11\n    -1.2345E11\n    4.5E8\n    -4.5E8\n    1.2345E11\n    -1.2345E11\n    -1.2345E11\n    -4.5E8\n    4.5E8\n    1.2345E-7\n    -1.2345E-7\n    -1.2345E-7\n    4.5E-10\n    -4.5E-10\n    Infinity\n    -Infinity\n    -1232.0\n    \"Cannot parse string as `Float`. String: \\\"abc\\\"\"\n    \"Cannot parse string as `Float`. String: \\\"123._34\\\"\"\n    \"Cannot parse string as `Float`. String: \\\"123e_34\\\"\"\n  }\n  [\"toFloatOrNull()\"] {\n    0.0\n    -0.0\n    null\n    null\n  }\n  [\"take()\"] {\n    \"\"\n    \"\"\n    \"\"\n    \"abc\"\n    \"abcdefg\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"takeWhile()\"] {\n    \"\"\n    \"\"\n    \"abcdefg\"\n    \"\"\n    \"abc\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"takeLast()\"] {\n    \"\"\n    \"\"\n    \"\"\n    \"efg\"\n    \"abcdefg\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"takeLastWhile()\"] {\n    \"\"\n    \"\"\n    \"abcdefg\"\n    \"\"\n    \"defg\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"drop()\"] {\n    \"\"\n    \"\"\n    \"abcdefg\"\n    \"defg\"\n    \"\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"dropWhile()\"] {\n    \"\"\n    \"\"\n    \"\"\n    \"abcdefg\"\n    \"defg\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"dropLast()\"] {\n    \"\"\n    \"\"\n    \"abcdefg\"\n    \"abcd\"\n    \"\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"dropLastWhile()\"] {\n    \"\"\n    \"\"\n    \"\"\n    \"abcdefg\"\n    \"abc\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"substring()\"] {\n    \"\"\n    \"c\"\n    \"cd\"\n    \"abcdefg\"\n    \"Character index `-1` is out of range `0`..`7`. String: \\\"abcdefg\\\"\"\n    \"Character index `8` is out of range `1`..`7`. String: \\\"abcdefg\\\"\"\n    \"Character index `2` is out of range `3`..`7`. String: \\\"abcdefg\\\"\"\n  }\n  [\"substringOrNull()\"] {\n    \"\"\n    \"c\"\n    \"cd\"\n    \"abcdefg\"\n    null\n    null\n    null\n  }\n  [\"getOrNull()\"] {\n    null\n    \"a\"\n    \"d\"\n    \"g\"\n    null\n  }\n  [\"toCodePoints()\"] {\n    List(97, 98, 99, 100, 101, 102, 103)\n    List()\n  }\n  [\"padStart()\"] {\n    \"\"\n    \"x\"\n    \"xxx\"\n    \"abcdefg\"\n    \"abcdefg\"\n    \"   abcdefg\"\n    \"Type constraint `length == 1` violated. Value: \\\"\\\"\"\n    \"Type constraint `length == 1` violated. Value: \\\"aa\\\"\"\n  }\n  [\"padEnd()\"] {\n    \"\"\n    \"x\"\n    \"xxx\"\n    \"abcdefg\"\n    \"abcdefg\"\n    \"abcdefg   \"\n    \"Type constraint `length == 1` violated. Value: \\\"\\\"\"\n    \"Type constraint `length == 1` violated. Value: \\\"aa\\\"\"\n  }\n  [\"toBooleanOrNull()\"] {\n    true\n    true\n    true\n    false\n    false\n    false\n    null\n    null\n    null\n  }\n  [\"repeat()\"] {\n    \"\"\n    \"abcdefg\"\n    \"abcdefgabcdefgabcdefgabcdefgabcdefg\"\n    \"\"\n    \"\"\n    \"\"\n    \"Type constraint `isPositive` violated. Value: -1\"\n  }\n  [\"sha1\"] {\n    \"da39a3ee5e6b4b0d3255bfef95601890afd80709\"\n    \"2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\"\n  }\n  [\"sha256\"] {\n    \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n    \"d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592\"\n  }\n  [\"sha256Int\"] {\n    1449310910991872227\n    -7745954930992895785\n  }\n  [\"md5\"] {\n    \"d41d8cd98f00b204e9800998ecf8427e\"\n    \"9e107d9d372bb6826bd81d3542a419d6\"\n  }\n  [\"base64\"] {\n    \"\"\n    \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n  }\n  [\"base64Decoded\"] {\n    \"Illegal base64 character 7e String: \\\"~~~\\\"\"\n  }\n  [\"base64DecodedBytes\"] {\n    \"Illegal base64 character 7e String: \\\"~~~\\\"\"\n    Bytes(1, 2, 3, 4)\n  }\n  [\"encodeToBytes()\"] {\n    Bytes(126, 126, 126)\n    Bytes(240, 159, 143, 128)\n    Bytes(254, 255, 0, 126, 0, 126, 0, 126)\n    Bytes(254, 255, 216, 60, 223, 192)\n    Bytes(126, 126, 126)\n    Bytes(63)\n    Bytes(80, 97, 114, 114, 111, 116)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/stringUnicode.pcf",
    "content": "facts {\n  [\"isEmpty\"] {\n    true\n  }\n  [\"isBlank\"] {\n    true\n    true\n  }\n  [\"lastIndex\"] {\n    true\n    true\n  }\n  [\"base64Decoded\"] {\n    true\n    true\n  }\n  [\"contains()\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"matches()\"] {\n    true\n    true\n    true\n  }\n  [\"startsWith()\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"endsWith()\"] {\n    true\n    true\n  }\n  [\"isRegex\"] {\n    true\n    true\n  }\n  [\"capitalize\"] {\n    true\n    true\n  }\n  [\"decapitalize\"] {\n    true\n    true\n  }\n}\nexamples {\n  [\"length\"] {\n    7\n  }\n  [\"indexOf()\"] {\n    2\n    \"String does not contain a match for literal pattern. String : \\\"😀😈😍😎😡🤢🤣\\\" Pattern: \\\"😍😎x\\\"\"\n    2\n    \"String does not contain a match for regex pattern. String : \\\"😀😈😍😎😡🤢🤣\\\" Pattern: Regex(\\\".?😎x\\\")\"\n  }\n  [\"indexOfNull()\"] {\n    2\n    null\n    2\n    null\n  }\n  [\"reverse()\"] {\n    \"🤣🤢😡😎😍😈😀\"\n  }\n  [\"lastIndexOf()\"] {\n    6\n    \"String does not contain a match for literal pattern. String : \\\"😀😈x😀😈y😀😈z\\\" Pattern: \\\"😍😎x\\\"\"\n    6\n    \"String does not contain a match for regex pattern. String : \\\"😀😈x😀😈y😀😈z\\\" Pattern: Regex(\\\"😍😎x\\\")\"\n  }\n  [\"lastIndexOfOrNull()\"] {\n    6\n    null\n  }\n  [\"split()\"] {\n    List(\"😀\", \"😈😍😍😀\", \"😈😍😍\")\n    List(\"\", \"\", \"\", \"\", \"😍😍\", \"\", \"\", \"\", \"😍😍\")\n  }\n  [\"replaceAll()\"] {\n    \"xx😈😈😍😍xx😈😈😍😍\"\n    \"(😀😀😈|😀😀)😈😍😍(😀😀😈|😀😀)😈😍😍\"\n    \"Error replacing matches for regex `[😀😈]` with `$4; no such group`: `No group 4`\"\n  }\n  [\"replaceFirst()\"] {\n    \"xx😈😈😍😍😀😀😈😈😍😍\"\n    \"(😀😀😈|😀😀)😈😍😍😀😀😈😈😍😍\"\n    \"Error replacing matches for regex `[😀😈]` with `$4; no such group`: `No group 4`\"\n  }\n  [\"replaceLast()\"] {\n    \"😀😀😈😈😍😍xx😈😈😍😍\"\n    \"😀😀😈😈😍😍(😀😀😈|😀😀)😈😍😍\"\n    \"Error replacing matches for regex `[😀😈]` with `$4; no such group`: `No group 4`\"\n  }\n  [\"replaceAllMapped()\"] {\n    \"├😀😀┤😈😈😍😍├😀😀┤😈😈😍😍\"\n    \"├😀😀😈┤😈😍😍├😀😀😈┤😈😍😍\"\n  }\n  [\"replaceFirstMapped()\"] {\n    \"├😀😀┤😈😈😍😍😀😀😈😈😍😍\"\n    \"├😀😀😈┤😈😍😍😀😀😈😈😍😍\"\n  }\n  [\"replaceLastMapped()\"] {\n    \"😀😀😈😈😍😍├😀😀┤😈😈😍😍\"\n    \"😀😀😈😈😍😍├😀😀😈┤😈😍😍\"\n  }\n  [\"replaceRange()\"] {\n    \"😀😀😈😈😍├┤😍😍\"\n    \"😀😀😈😈😍😍😀😀😈😈extend beyond 😀 string end\"\n    \"Character index `100` is out of range `0`..`12`. String: \\\"😀😀😈😈😍😍😀😀😈😈😍😍\\\"\"\n    \"Character index `-10` is out of range `0`..`12`. String: \\\"😀😀😈😈😍😍😀😀😈😈😍😍\\\"\"\n  }\n  [\"toUpperCase()\"] {\n    \"😀😈😍\"\n  }\n  [\"toLowerCase()\"] {\n    \"😀😈😍\"\n  }\n  [\"trim()\"] {\n    \"😀😈😍😎😡🤢🤣\"\n  }\n  [\"trimStart()\"] {\n    \"\"\"\n    😀😈😍😎😡🤢🤣 \\t \n    \n    \"\"\"\n  }\n  [\"trimEnd()\"] {\n    \" \\t 😀😈😍😎😡🤢🤣\"\n  }\n  [\"chars\"] {\n    List(\"😀\", \"😈\", \"😍\", \"😎\", \"😡\", \"🤢\", \"🤣\")\n  }\n  [\"codePoints\"] {\n    List(128512, 128520, 128525, 128526, 128545, 129314, 129315)\n  }\n  [\"toInt()\"] {\n    \"Cannot parse string as `Int`. String: \\\"😀😈😍\\\"\"\n  }\n  [\"toIntOrNull()\"] {\n    null\n    null\n    null\n  }\n  [\"toFloat()\"] {\n    \"Cannot parse string as `Float`. String: \\\"😀😈😍\\\"\"\n  }\n  [\"toFloatOrNull()\"] {\n    null\n    null\n    null\n  }\n  [\"take()\"] {\n    \"\"\n    \"😀😈😍\"\n    \"😀😈😍😎😡🤢🤣\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"takeWhile()\"] {\n    \"😀😈😍😎😡🤢🤣\"\n    \"\"\n    \"😀😈😍\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"takeLast()\"] {\n    \"\"\n    \"😡🤢🤣\"\n    \"😀😈😍😎😡🤢🤣\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"takeLastWhile()\"] {\n    \"😀😈😍😎😡🤢🤣\"\n    \"\"\n    \"😎😡🤢🤣\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"drop()\"] {\n    \"😀😈😍😎😡🤢🤣\"\n    \"😎😡🤢🤣\"\n    \"\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"dropWhile()\"] {\n    \"\"\n    \"😀😈😍😎😡🤢🤣\"\n    \"😎😡🤢🤣\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"dropLast()\"] {\n    \"😀😈😍😎😡🤢🤣\"\n    \"😀😈😍😎\"\n    \"\"\n    \"Expected a positive number, but got `-1`.\"\n  }\n  [\"dropLastWhile()\"] {\n    \"\"\n    \"😀😈😍😎😡🤢🤣\"\n    \"😀😈😍\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 42\"\n  }\n  [\"substring()\"] {\n    \"\"\n    \"😍\"\n    \"😍😎\"\n    \"😀😈😍😎😡🤢🤣\"\n    \"Character index `-1` is out of range `0`..`7`. String: \\\"😀😈😍😎😡🤢🤣\\\"\"\n    \"Character index `8` is out of range `1`..`7`. String: \\\"😀😈😍😎😡🤢🤣\\\"\"\n    \"Character index `2` is out of range `3`..`7`. String: \\\"😀😈😍😎😡🤢🤣\\\"\"\n  }\n  [\"substringOrNull()\"] {\n    \"\"\n    \"😍\"\n    \"😍😎\"\n    \"😀😈😍😎😡🤢🤣\"\n    null\n    null\n    null\n  }\n  [\"getOrNull()\"] {\n    null\n    \"😀\"\n    \"😎\"\n    \"🤣\"\n    null\n  }\n  [\"toBoolean()\"] {\n    \"Cannot parse string as `Boolean`. String: \\\"(😍😎😡\\\"\"\n  }\n  [\"toBooleanOrNull()\"] {\n    null\n  }\n  [\"repeat()\"] {\n    \"\"\n    \"😀😈😍😎😡🤢🤣\"\n    \"😀😈😍😎😡🤢🤣😀😈😍😎😡🤢🤣😀😈😍😎😡🤢🤣😀😈😍😎😡🤢🤣😀😈😍😎😡🤢🤣\"\n  }\n  [\"sha1\"] {\n    \"fe64c1726719d6304b22f0ac854a04cb7b373832\"\n    \"3987530da5821ff2aa1068e129e7ee3e69dd5bb3\"\n  }\n  [\"sha256\"] {\n    \"9bd74059a744bddbf99f9650ffb5eb5c0755651d33b376632373d2df924a1e05\"\n    \"7e9d3b9f419d6ff2612363c435ad18a42ddf31fd79b86fc2d4a6efc7409829f6\"\n  }\n  [\"sha256Int\"] {\n    -2612856723257370725\n    -977389688946188930\n  }\n  [\"md5\"] {\n    \"122538b378a210d6c8c6495aeb2ec242\"\n    \"c243df28293aff5b792c244e0b998513\"\n  }\n  [\"base64\"] {\n    \"8J+YgPCfmIjwn5iN8J+YjvCfmKHwn6Si8J+kow==\"\n    \"8J+YjfCfmI7wn5ih\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/typeAliases.pcf",
    "content": "res1 = 255\nres2 = -128\nres3 = 65535\nres4 = -32768\nres5 = 4294967295\nres6 = -2147483648\nres7 = 9223372036854775807\nres8 = \"https://apple.com\"\nres8b = 42\ngood {\n  res9 = 255\n  res10 = -128\n  res11 = 65535\n  res12 = -32768\n  res13 = 4294967295\n  res14 = -2147483648\n  res15 = 9223372036854775807\n  res16 = \"https://apple.com\"\n  res16b = 42\n}\nres17 = \"Type constraint `isBetween(0, 255)` violated. Value: 256\"\nres18 = \"Type constraint `isBetween(-128, 127)` violated. Value: -129\"\nres19 = \"Type constraint `isBetween(0, 65535)` violated. Value: 65536\"\nres20 = \"Type constraint `isBetween(-32768, 32767)` violated. Value: -32769\"\nres21 = \"Type constraint `isBetween(0, 4294967295)` violated. Value: 4294967296\"\nres22 = \"Type constraint `isBetween(-2147483648, 2147483647)` violated. Value: -2147483649\"\nres23 = \"Type constraint `isPositive` violated. Value: -1\"\nres24 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres24b = \"Type constraint `!(this is Null)` violated. Value: null\"\nres24c = \"Type constraint `!(this is Null)` violated. Value: null\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/typeConverters.pcf",
    "content": "animals {\n  \"Wolf Animal\"\n  \"Mr. Tweet\"\n  \"Whiskers Animal\"\n  \"Angry Neck\"\n  \"Mr. Snow\"\n  \"Mr. Rainbow\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/typed.pcf",
    "content": "examples {\n  [\"getProperty()\"] {\n    \"Pigeon\"\n    \"Pigeon\"\n    5\n    \"Cannot find property `other` in object of type `typed#Animal`.\"\n  }\n  [\"getPropertyOrNull()\"] {\n    \"Pigeon\"\n    \"Pigeon\"\n    5\n    null\n  }\n  [\"hasProperty()\"] {\n    true\n    true\n    true\n    false\n    true\n    true\n    false\n  }\n  [\"toDynamic()\"] {\n    new {\n      species = \"Pigeon\"\n      age = 5\n      numberOfFeet = 2\n    }\n    \"Dynamic\"\n    new {\n      species = \"Pigeon\"\n      age = \"age\"\n      numberOfFeet = 2\n      [\"isExtinct\"] = false\n    }\n    new {\n      species = \"Pigeon\"\n      age = 6\n      numberOfFeet = 2\n    }\n  }\n  [\"toMap()\"] {\n    Map(\"species\", \"Pigeon\", \"age\", 5, \"numberOfFeet\", 2)\n    \"Map\"\n    Map()\n    Map(\"species\", \"Pigeon\", \"age\", 5, \"numberOfFeet\", 2)\n    Map(\"species\", \"Pigeon\", \"age\", 6)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <int>123</int>\n  <float>1.23</float>\n  <bool>true</bool>\n  <string>Pigeon</string>\n  <unicodeString>abc😀abc😎abc</unicodeString>\n  <multiLineString>have a\ngreat\nday</multiLineString>\n  <typedObject>\n    <name>Pigeon</name>\n    <age>30</age>\n    <address>\n      <street>Folsom St.</street>\n    </address>\n  </typedObject>\n  <dynamicObject>\n    <name>Pigeon</name>\n    <age>30</age>\n    <address>\n      <street>Folsom St.</street>\n    </address>\n  </dynamicObject>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n    <res1>gnirts</res1>\n    <res2>false</res2>\n    <res3>43</res3>\n    <res4>2.33</res4>\n    <res5>3 s</res5>\n    <res6>4 mb</res6>\n    <res8>43falsegnirts</res8>\n    <res9>gnirtsfalse435</res9>\n    <res10>\n        <eno>false</eno>\n        <owt>2.33</owt>\n        <eerht>3 s</eerht>\n    </res10>\n    <res11>gnirtsfalse435</res11>\n    <res12>\n        <eman>noegip</eman>\n        <ega>31</ega>\n        <eerht>3 s</eerht>\n    </res12>\n    <res13>\n        <name>noegip</name>\n        <age>31</age>\n        <other>rehto</other>\n    </res13>\n    <res14>\n        <name>noegip</name>\n        <age>41</age>\n    </res14>\n    <res15>String</res15>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer2b.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = true\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer3.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <res1>converted</res1>\n  <res2>converted</res2>\n  <res3>converted</res3>\n  <res4>converted</res4>\n  <res5>converted</res5>\n  <res6>converted</res6>\n  <res8>converted</res8>\n  <res9>converted</res9>\n  <res10>converted</res10>\n  <res11>converted</res11>\n  <res12>converted</res12>\n  <res13>converted</res13>\n  <res14>converted</res14>\n  <res15>converted</res15>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer4.pcf",
    "content": "res1 = \"123\"\nres2 = \"1.23\"\nres3 = \"false\"\nres4 = \"pigeon\"\nres6 = \"pigeonparrot\"\nres7 = \"pigeonparrot\"\nres8 = \"\"\"\n  <name>pigeon</name>\n  <age>42</age>\n  \"\"\"\nres9 = \"pigeonparrot\"\nres10 = \"\"\"\n  <name>pigeon</name>\n  <age>42</age>\n  \"\"\"\nres11 = \"\"\"\n  <name>pigeon</name>\n  <age>42</age>\n  \"\"\"\nres12 = \"\"\"\n  <name>pigeon</name>\n  <age>42</age>\n  \"\"\"\nres14 = \"Cannot render value of type `Null` as XML. Value: null\"\nres15 = \"Cannot render value of type `Duration` as XML. Value: 1.min\"\nres16 = \"Cannot render value of type `DataSize` as XML. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as XML. Value: xmlRenderer4#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as XML. Value: xmlRenderer4#Email\"\nres19 = \"Cannot render value of type `Function1` as XML. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as XML. Value: IntSeq(1, 4)\"\nres22 = \"Cannot render value of type `Pair` as XML. Value: Pair(1, 2)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer5.pcf",
    "content": "res1 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>123</root>\n  \n  \"\"\"\nres2 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>1.23</root>\n  \n  \"\"\"\nres3 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>false</root>\n  \n  \"\"\"\nres4 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>pigeon</root>\n  \n  \"\"\"\nres6 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>pigeonparrot</root>\n  \n  \"\"\"\nres7 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>pigeonparrot</root>\n  \n  \"\"\"\nres8 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>\n    <name>pigeon</name>\n    <age>42</age>\n  </root>\n  \n  \"\"\"\nres9 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>pigeonparrot</root>\n  \n  \"\"\"\nres10 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>\n    <name>pigeon</name>\n    <age>42</age>\n  </root>\n  \n  \"\"\"\nres11 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>\n    <name>pigeon</name>\n    <age>42</age>\n  </root>\n  \n  \"\"\"\nres12 = \"\"\"\n  <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <root>\n    <name>pigeon</name>\n    <age>42</age>\n  </root>\n  \n  \"\"\"\nres14 = \"Cannot render value of type `Null` as XML. Value: null\"\nres15 = \"Cannot render value of type `Duration` as XML. Value: 1.min\"\nres16 = \"Cannot render value of type `DataSize` as XML. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as XML. Value: xmlRenderer5#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as XML. Value: xmlRenderer5#Email\"\nres19 = \"Cannot render value of type `Function1` as XML. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as XML. Value: IntSeq(1, 4)\"\nres22 = \"Cannot render value of type `Pair` as XML. Value: Pair(1, 2)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer6.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <name>noegip</name>\n  <age>42</age>\n  <friends>barn owlxparrotx</friends>\n  <hobbies>\n    <surfing>low</surfing>\n    <firemaking>high</firemaking>\n  </hobbies>\n  <address>\n    <street>Other St.</street>\n    <zip>changed</zip>\n  </address>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer8.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as XML.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.xml#Renderer.renderDocument (file:///$snippetsDir/input/api/xmlRenderer8.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRenderer9.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <FOO>a</FOO>\n  <bar>b<!-- bar --></bar>\n  <baz>\n    <qux>c<!-- qux --></qux>\n    <quux>c</quux>\n  </baz>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererCData.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <res1><![CDATA[The <drumroll>Dodos</drumroll>]]></res1>\n  <res2><![CDATA[Malicious CDATA input: ]]]]><![CDATA[><script>doMaliciousThing();</script>]]></res2>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererElement.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<machine>\n  <diskSizes>\n    <disk>\n      <gb>1200</gb>\n    </disk>\n    <disk>\n      <tb>2</tb>\n    </disk>\n  </diskSizes>\n</machine>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererHtml.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<html>\n  <body>\n    <!--this is a comment-->\n    <h1>My 3 <strong>favorite</strong> hobbies:</h1>\n    <ul>\n      <li>swimming</li>\n      <li>surfing</li>\n      <li>fire making</li>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererInline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <content>pigeonparrotpigeonparrotpigeonparrot\n    <name>pigeon</name>\n    <age>42</age>\n    <name>pigeon</name>\n    <age>42</age>\n    <name>pigeon</name>\n    <age>42</age>\n    <name>pigeon</name>\n    <age>42</age>\n  </content>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererInline2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <order>\n    <item>\n      <name>banana</name>\n      <quantity>42</quantity>\n    </item>\n    <item>\n      <name>orange</name>\n      <quantity>21</quantity>\n    </item>\n  </order>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererInline3.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n  <pigeon2>\n    <name>Pigeon</name>\n    <age>42</age>\n  </pigeon2>\n  <res2>`xml.Element` is not supported here. Value: new Dynamic { _isXmlElement = true; name = &quot;pigeon2&quot;; attributes {}; isBlockF...</res2>\n  <res3>`xml.Inline` is not supported here. Value: new Inline { value { name = ?; age = ? } }</res3>\n</root>\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererValidation10.pcf",
    "content": "examples {\n  [\"invalid attribute\"] {\n    \"Invalid XML 1.0 attribute name: `bar baz`\"\n  }\n  [\"colons are allowed\"] {\n    \"<bar xs:myTag=\\\"my tag value\\\"></bar>\"\n  }\n  [\"escaping attribute values\"] {\n    \"<bar bar=\\\"buz&quot;&gt;&lt;script&gt;maliciousThing();&lt;/script&gt;\\\"></bar>\"\n  }\n  [\"invalid element name\"] {\n    \"Invalid XML 1.0 element name: `bar>`\"\n  }\n  [\"invalid empty element name\"] {\n    \"Invalid XML 1.0 element name: ``\"\n  }\n  [\"invalid empty attribute name\"] {\n    \"Invalid XML 1.0 attribute name: ``\"\n  }\n  [\"Unicode element name is not allowed\"] {\n    \"Invalid XML 1.0 element name: `😍😎😡`\"\n  }\n  [\"Unicode attribute name is not allowed\"] {\n    \"Invalid XML 1.0 attribute name: `😍😎😡`\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/xmlRendererValidation11.pcf",
    "content": "examples {\n  [\"invalid attribute\"] {\n    \"Invalid XML 1.1 attribute name: `bar baz`\"\n  }\n  [\"colons are allowed\"] {\n    \"<bar xs:myTag=\\\"my tag value\\\"></bar>\"\n  }\n  [\"escaping attribute values\"] {\n    \"<bar bar=\\\"buz&quot;&gt;&lt;script&gt;maliciousThing();&lt;/script&gt;\\\"></bar>\"\n  }\n  [\"invalid element name\"] {\n    \"Invalid XML 1.1 element name: `bar>`\"\n  }\n  [\"invalid empty element name\"] {\n    \"Invalid XML 1.1 element name: ``\"\n  }\n  [\"invalid empty attribute name\"] {\n    \"Invalid XML 1.1 attribute name: ``\"\n  }\n  [\"Unicode element name is allowed\"] {\n    \"<😍😎😡></😍😎😡>\"\n  }\n  [\"Unicode attribute name is allowed\"] {\n    \"<div 😍😎😡=\\\"bar\\\"></div>\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser1Compat.pcf",
    "content": "examples {\n  [\"null\"] {\n    null\n    null\n    null\n    \"NuLl\"\n  }\n  [\"boolean\"] {\n    true\n    true\n    true\n    true\n    true\n    \"YeS\"\n    false\n    false\n    false\n    false\n    false\n    \"nO\"\n    true\n    true\n    true\n    \"TrUe\"\n    false\n    false\n    false\n    \"FaLsE\"\n    true\n    true\n    true\n    \"oN\"\n    false\n    false\n    false\n    \"OfF\"\n  }\n  [\"int\"] {\n    123\n    -123\n    123\n    9\n    -9\n    9\n    83\n    -83\n    83\n    83\n    -83\n    83\n    419\n    -419\n    419\n    \"59:30:1\"\n    \"-59:30:1\"\n    \"+59:30:1\"\n    123\n  }\n  [\"float\"] {\n    123.456\n    123.456\n    -123.456\n    123.456\n    12345.6\n    12345.6\n    1.23456\n    12345.6\n    -12345.6\n    12345.6\n    \"59:30:1.234\"\n    \"-59:30:1.234\"\n    \"+59:30:1.234\"\n    123.456\n    123.456\n    \".\"\n    0.0\n    Infinity\n    Infinity\n    Infinity\n    \".InF\"\n    Infinity\n    Infinity\n    Infinity\n    \"+.InF\"\n    -Infinity\n    -Infinity\n    -Infinity\n    \"-.InF\"\n    NaN\n    NaN\n    NaN\n    \".nAn\"\n  }\n  [\"timestamp\"] {\n    \"2001-12-15T02:59:43.1Z\"\n    \"2011-11-18 19:00:59\"\n    \"2001-12-15T02:59:43.1Z\"\n  }\n  [\"binary\"] {\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3, 1, 2, 3, 1, 2, 3)\n  }\n  [\"string\"] {\n    null\n    null\n    \"hello\"\n    \"hello world\"\n    \"hello world\"\n    new {\n      x = \"\"\"\n        hello\n        world\n        \"\"\"\n    }\n    new {\n      x = \"hello world\"\n    }\n  }\n  [\"sequence\"] {\n    new {\n      \"one\"\n      \"two\"\n      \"three\"\n    }\n    new {\n      \"one\"\n      \"two\"\n      \"three\"\n    }\n  }\n  [\"mapping\"] {\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    new {\n      [new {\n        \"foo\"\n        \"bar\"\n      }] {\n        \"one\"\n        \"two\"\n      }\n    }\n  }\n  [\"real-world example\"] {\n    new {\n      invoice = 34843\n      date = \"2001-01-23\"\n      `bill-to` {\n        given = \"Chris\"\n        family = \"Dumars\"\n        address {\n          lines = \"\"\"\n            458 Walkman Dr.\n            Suite #292\n            \n            \"\"\"\n          city = \"Royal Oak\"\n          state = \"MI\"\n          postal = 48046\n        }\n      }\n      `ship-to` {\n        given = \"Chris\"\n        family = \"Dumars\"\n        address {\n          lines = \"\"\"\n            458 Walkman Dr.\n            Suite #292\n            \n            \"\"\"\n          city = \"Royal Oak\"\n          state = \"MI\"\n          postal = 48046\n        }\n      }\n      product {\n        new {\n          sku = \"BL394D\"\n          quantity = 4\n          description = \"Basketball\"\n          price = 450.0\n        }\n        new {\n          sku = \"BL4438H\"\n          quantity = 1\n          description = \"Super Hoop\"\n          price = 2392.0\n        }\n      }\n      tax = 251.42\n      total = 4443.52\n      logo = Bytes(1, 2, 3)\n      comments = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\"\n    }\n  }\n  [\"invalid syntax\"] {\n    \"Error parsing YAML document.\"\n  }\n  [\"wrong tag/node combination\"] {\n    \"Error parsing YAML document.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser1Yaml11.pcf",
    "content": "examples {\n  [\"null\"] {\n    null\n    null\n    null\n    \"NuLl\"\n  }\n  [\"boolean\"] {\n    true\n    true\n    true\n    true\n    true\n    \"YeS\"\n    false\n    false\n    false\n    false\n    false\n    \"nO\"\n    true\n    true\n    true\n    \"TrUe\"\n    false\n    false\n    false\n    \"FaLsE\"\n    true\n    true\n    true\n    \"oN\"\n    false\n    false\n    false\n    \"OfF\"\n  }\n  [\"int\"] {\n    123\n    -123\n    123\n    9\n    -9\n    9\n    83\n    -83\n    83\n    \"0o123\"\n    \"-0o123\"\n    \"+0o123\"\n    419\n    -419\n    419\n    214201\n    -214201\n    214201\n    123\n  }\n  [\"float\"] {\n    123.456\n    123.456\n    -123.456\n    123.456\n    \"123.456e2\"\n    \"123.456E2\"\n    1.23456\n    12345.6\n    -12345.6\n    12345.6\n    214201.234\n    -214201.234\n    214201.234\n    123.456\n    123.456\n    0.0\n    0.0\n    Infinity\n    Infinity\n    Infinity\n    \".InF\"\n    Infinity\n    Infinity\n    Infinity\n    \"+.InF\"\n    -Infinity\n    -Infinity\n    -Infinity\n    \"-.InF\"\n    NaN\n    NaN\n    NaN\n    \".nAn\"\n  }\n  [\"timestamp\"] {\n    \"2001-12-15T02:59:43.1Z\"\n    \"2011-11-18 19:00:59\"\n    \"2001-12-15T02:59:43.1Z\"\n  }\n  [\"binary\"] {\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3, 1, 2, 3, 1, 2, 3)\n  }\n  [\"string\"] {\n    null\n    null\n    \"hello\"\n    \"hello world\"\n    \"hello world\"\n    new {\n      x = \"\"\"\n        hello\n        world\n        \"\"\"\n    }\n    new {\n      x = \"hello world\"\n    }\n  }\n  [\"sequence\"] {\n    new {\n      \"one\"\n      \"two\"\n      \"three\"\n    }\n    new {\n      \"one\"\n      \"two\"\n      \"three\"\n    }\n  }\n  [\"mapping\"] {\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    new {\n      [new {\n        \"foo\"\n        \"bar\"\n      }] {\n        \"one\"\n        \"two\"\n      }\n    }\n  }\n  [\"real-world example\"] {\n    new {\n      invoice = 34843\n      date = \"2001-01-23\"\n      `bill-to` {\n        given = \"Chris\"\n        family = \"Dumars\"\n        address {\n          lines = \"\"\"\n            458 Walkman Dr.\n            Suite #292\n            \n            \"\"\"\n          city = \"Royal Oak\"\n          state = \"MI\"\n          postal = 48046\n        }\n      }\n      `ship-to` {\n        given = \"Chris\"\n        family = \"Dumars\"\n        address {\n          lines = \"\"\"\n            458 Walkman Dr.\n            Suite #292\n            \n            \"\"\"\n          city = \"Royal Oak\"\n          state = \"MI\"\n          postal = 48046\n        }\n      }\n      product {\n        new {\n          sku = \"BL394D\"\n          quantity = 4\n          description = \"Basketball\"\n          price = 450.0\n        }\n        new {\n          sku = \"BL4438H\"\n          quantity = 1\n          description = \"Super Hoop\"\n          price = 2392.0\n        }\n      }\n      tax = 251.42\n      total = 4443.52\n      logo = Bytes(1, 2, 3)\n      comments = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\"\n    }\n  }\n  [\"invalid syntax\"] {\n    \"Error parsing YAML document.\"\n  }\n  [\"wrong tag/node combination\"] {\n    \"Error parsing YAML document.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser1Yaml12.pcf",
    "content": "examples {\n  [\"null\"] {\n    null\n    null\n    null\n    \"NuLl\"\n  }\n  [\"boolean\"] {\n    \"y\"\n    \"Y\"\n    \"yes\"\n    \"Yes\"\n    \"YES\"\n    \"YeS\"\n    \"n\"\n    \"N\"\n    \"no\"\n    \"No\"\n    \"NO\"\n    \"nO\"\n    true\n    true\n    true\n    \"TrUe\"\n    false\n    false\n    false\n    \"FaLsE\"\n    \"on\"\n    \"On\"\n    \"ON\"\n    \"oN\"\n    \"off\"\n    \"Off\"\n    \"OFF\"\n    \"OfF\"\n  }\n  [\"int\"] {\n    123\n    -123\n    123\n    \"0b1001\"\n    \"-0b1001\"\n    \"+0b1001\"\n    123\n    -123\n    123\n    83\n    \"-0o123\"\n    \"+0o123\"\n    419\n    \"-0x1A3\"\n    \"+0x1A3\"\n    \"59:30:1\"\n    \"-59:30:1\"\n    \"+59:30:1\"\n    \"1_2_3\"\n  }\n  [\"float\"] {\n    123.456\n    123.456\n    -123.456\n    123.456\n    12345.6\n    12345.6\n    1.23456\n    12345.6\n    -12345.6\n    12345.6\n    \"59:30:1.234\"\n    \"-59:30:1.234\"\n    \"+59:30:1.234\"\n    \"1_2_3.456\"\n    \"1_2_3.4_5_6\"\n    \".\"\n    \".___\"\n    Infinity\n    Infinity\n    Infinity\n    \".InF\"\n    Infinity\n    Infinity\n    Infinity\n    \"+.InF\"\n    -Infinity\n    -Infinity\n    -Infinity\n    \"-.InF\"\n    NaN\n    NaN\n    NaN\n    \".nAn\"\n  }\n  [\"timestamp\"] {\n    \"2001-12-15T02:59:43.1Z\"\n    \"2011-11-18 19:00:59\"\n    \"2001-12-15T02:59:43.1Z\"\n  }\n  [\"binary\"] {\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 3, 1, 2, 3, 1, 2, 3)\n  }\n  [\"string\"] {\n    null\n    null\n    \"hello\"\n    \"hello world\"\n    \"hello world\"\n    new {\n      x = \"\"\"\n        hello\n        world\n        \"\"\"\n    }\n    new {\n      x = \"hello world\"\n    }\n  }\n  [\"sequence\"] {\n    new {\n      \"one\"\n      \"two\"\n      \"three\"\n    }\n    new {\n      \"one\"\n      \"two\"\n      \"three\"\n    }\n  }\n  [\"mapping\"] {\n    new {\n      name = \"Pigeon\"\n      age = 42\n    }\n    new {\n      [new {\n        \"foo\"\n        \"bar\"\n      }] {\n        \"one\"\n        \"two\"\n      }\n    }\n  }\n  [\"real-world example\"] {\n    new {\n      invoice = 34843\n      date = \"2001-01-23\"\n      `bill-to` {\n        given = \"Chris\"\n        family = \"Dumars\"\n        address {\n          lines = \"\"\"\n            458 Walkman Dr.\n            Suite #292\n            \n            \"\"\"\n          city = \"Royal Oak\"\n          state = \"MI\"\n          postal = 48046\n        }\n      }\n      `ship-to` {\n        given = \"Chris\"\n        family = \"Dumars\"\n        address {\n          lines = \"\"\"\n            458 Walkman Dr.\n            Suite #292\n            \n            \"\"\"\n          city = \"Royal Oak\"\n          state = \"MI\"\n          postal = 48046\n        }\n      }\n      product {\n        new {\n          sku = \"BL394D\"\n          quantity = 4\n          description = \"Basketball\"\n          price = 450.0\n        }\n        new {\n          sku = \"BL4438H\"\n          quantity = 1\n          description = \"Super Hoop\"\n          price = 2392.0\n        }\n      }\n      tax = 251.42\n      total = 4443.52\n      logo = Bytes(1, 2, 3)\n      comments = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\"\n    }\n  }\n  [\"invalid syntax\"] {\n    \"Error parsing YAML document.\"\n  }\n  [\"wrong tag/node combination\"] {\n    \"Error parsing YAML document.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser2.pcf",
    "content": "res1 {\n  msg1 = \"This is a message.\"\n  msg2 = \"This is a message.\"\n}\nres2 {\n  pigeon {\n    name = \"pigeon\"\n    age = 42\n  }\n  pigeon2 {\n    `<<` {\n      name = \"pigeon\"\n      age = 42\n    }\n    age = 21\n  }\n}\nres3 {\n  name = \"pigeon\"\n  age = 42\n}\nres4 {\n  name = \"pigeon\"\n  age = 42\n}\nres5 {\n  name = \"pigeon\"\n  age = 42\n}\nres6 = null\nres7 = \"Error parsing YAML document.\"\nres8 = List()\nres9 = List()\nres10 = List(null)\nres11 = List(null, null, null)\nres12 = List(123, null, 456)\nres13 = List(new {\n  name = \"pigeon\"\n})\nres14 = List(new {\n  name = \"pigeon\"\n})\nres15 = List(new {\n  name = \"pigeon\"\n}, new {\n  age = 42\n}, new {\n  hobby = \"surfing\"\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser3.pcf",
    "content": "res1 {\n  invoicex = 34844\n  datex = \"2001-01-23x\"\n  `bill-tox` {\n    givenx = \"Chrisx\"\n    familyx = \"Dumarsx\"\n    addressx {\n      linesx = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        x\n        \"\"\"\n      cityx = \"Royal Oakx\"\n      statex = \"MIx\"\n      postalx = 48047\n      other = \"other\"\n    }\n    other = \"other\"\n  }\n  `ship-tox` {\n    givenx = \"Chrisx\"\n    familyx = \"Dumarsx\"\n    addressx {\n      linesx = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        x\n        \"\"\"\n      cityx = \"Royal Oakx\"\n      statex = \"MIx\"\n      postalx = 48047\n      other = \"other\"\n    }\n    other = \"other\"\n  }\n  productx {\n    new {\n      skux = \"BL394Dx\"\n      quantityx = 5\n      descriptionx = \"Basketballx\"\n      pricex = 451.23\n      other = \"other\"\n    }\n    new {\n      skux = \"BL4438Hx\"\n      quantityx = 2\n      descriptionx = \"Super Hoopx\"\n      pricex = 2393.23\n      other = \"other\"\n    }\n    \"other\"\n  }\n  taxx = 252.64999999999998\n  totalx = 4444.75\n  commentsx = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.x\"\n  other = \"other\"\n}\nres2 = List(new {\n  invoicex = 34844\n  datex = \"2001-01-23x\"\n  `bill-tox` {\n    givenx = \"Chrisx\"\n    familyx = \"Dumarsx\"\n    addressx {\n      linesx = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        x\n        \"\"\"\n      cityx = \"Royal Oakx\"\n      statex = \"MIx\"\n      postalx = 48047\n      other = \"other\"\n    }\n    other = \"other\"\n  }\n  `ship-tox` {\n    givenx = \"Chrisx\"\n    familyx = \"Dumarsx\"\n    addressx {\n      linesx = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        x\n        \"\"\"\n      cityx = \"Royal Oakx\"\n      statex = \"MIx\"\n      postalx = 48047\n      other = \"other\"\n    }\n    other = \"other\"\n  }\n  other = \"other\"\n}, new {\n  productx {\n    new {\n      skux = \"BL394Dx\"\n      quantityx = 5\n      descriptionx = \"Basketballx\"\n      pricex = 451.23\n      other = \"other\"\n    }\n    new {\n      skux = \"BL4438Hx\"\n      quantityx = 2\n      descriptionx = \"Super Hoopx\"\n      pricex = 2393.23\n      other = \"other\"\n    }\n    \"other\"\n  }\n  other = \"other\"\n}, new {\n  taxx = 252.64999999999998\n  totalx = 4444.75\n  commentsx = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.x\"\n  other = \"other\"\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser4.pcf",
    "content": "res1 {\n  invoice = 99999\n  date = \"2001-01-23\"\n  `bill-to` {\n    given = \"Pigeon\"\n    family = \"sramuD\"\n    address {\n      lines = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        \n        \"\"\"\n      city = \"ROYAL OAK\"\n      state = \"CA\"\n      postal = 48046\n    }\n  }\n  `ship-to` {\n    given = \"Pigeon\"\n    family = \"sramuD\"\n    address {\n      lines = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        \n        \"\"\"\n      city = \"ROYAL OAK\"\n      state = \"CA\"\n      postal = 48046\n    }\n  }\n  product {\n    new {\n      sku = \"BL394D\"\n      quantity = 8\n      description = \"Basketball\"\n      price = 900.0\n    }\n    new {\n      sku = \"BL4438H\"\n      quantity = 2\n      description = \"Super Hoop\"\n      price = 4784.0\n    }\n  }\n  tax = 251.42\n  total = 4443.52\n  comments = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\"\n}\nres2 = List(new {\n  invoice = 99999\n  date = \"2001-01-23\"\n  `bill-to` {\n    given = \"Pigeon\"\n    family = \"sramuD\"\n    address {\n      lines = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        \n        \"\"\"\n      city = \"ROYAL OAK\"\n      state = \"CA\"\n      postal = 48046\n    }\n  }\n  `ship-to` {\n    given = \"Pigeon\"\n    family = \"sramuD\"\n    address {\n      lines = \"\"\"\n        458 Walkman Dr.\n        Suite #292\n        \n        \"\"\"\n      city = \"ROYAL OAK\"\n      state = \"CA\"\n      postal = 48046\n    }\n  }\n}, new {\n  product {\n    new {\n      sku = \"BL394D\"\n      quantity = 8\n      description = \"Basketball\"\n      price = 900.0\n    }\n    new {\n      sku = \"BL4438H\"\n      quantity = 2\n      description = \"Super Hoop\"\n      price = 4784.0\n    }\n  }\n}, new {\n  tax = 251.42\n  total = 4443.52\n  comments = \"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\"\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser5.pcf",
    "content": "examples {\n  [\"maxCollectionAliases -- happy path\"] {\n    new {\n      lol1 {\n        \"lol\"\n      }\n      lol2 {\n        \"lol\"\n      }\n    }\n  }\n  [\"maxCollectionAliases -- failing\"] {\n    \"Error parsing YAML document: The number of aliases for collection nodes exceeds the allowed maximum of 1.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlParser6.pcf",
    "content": "res1 {\n  [\"foo\"] = \"bar\"\n  [\"baz\"] {\n    new {\n      [\"biz\"] = \"biz\"\n      [\"buz\"] = \"buz\"\n    }\n  }\n}\nres2 = true\nres3 = true\nres4 {\n  [new {\n    [\"baz\"] = \"qux\"\n  }] = 2\n  [\"foo\"] = \"bar\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer1.yml",
    "content": "name: pigeon\nage: 30\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer10.yml",
    "content": "FOO: a\nbar: b # bar\nbaz:\n  qux: c # qux\n  quux: c\n  quuux: !!foo d\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer2.yml",
    "content": "res1: gnirts\nres2: false\nres3: 43\nres4: 2.33\nres5: 3 s\nres6: 4 mb\nres8:\n- 43\n- false\n- gnirts\nres9:\n- gnirts\n- false\n- 43\n- 5\nres10:\n    eno: false\n    owt: 2.33\n    eerht: 3 s\nres11:\n- gnirts\n- false\n- 43\n- 5\nres12:\n    eman: noegip\n    ega: 31\n    eerht: 3 s\nres13:\n    name: noegip\n    age: 31\n    other: rehto\nres14:\n    name: noegip\n    age: 41\nres15: String\nres16:\n- 2\n- 3\nres17: !!binary ''\nres18: !!binary AQID\nres19: !!binary AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8=\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer2b.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = true\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer3.yml",
    "content": "res1: converted\nres2: converted\nres3: converted\nres4: converted\nres5: converted\nres6: converted\nres8: converted\nres9: converted\nres10: converted\nres11: converted\nres12: converted\nres13: converted\nres14: converted\nres15: converted\nres16: converted\nres17: converted\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer4.pcf",
    "content": "res1 = \"123\"\nres2 = \"1.23\"\nres3 = \"false\"\nres4 = \"pigeon\"\nres6 = \"\"\"\n  - pigeon\n  - parrot\n  \"\"\"\nres7 = \"\"\"\n  - pigeon\n  - parrot\n  \"\"\"\nres8 = \"\"\"\n  name: pigeon\n  age: 42\n  \"\"\"\nres9 = \"\"\"\n  - pigeon\n  - parrot\n  \"\"\"\nres10 = \"\"\"\n  name: pigeon\n  age: 42\n  \"\"\"\nres11 = \"\"\"\n  name: pigeon\n  age: 42\n  \"\"\"\nres12 = \"\"\"\n  name: pigeon\n  age: 42\n  \"\"\"\nres13 = \"null\"\nres14 = \"Cannot render value of type `Duration` as YAML. Value: 1.min\"\nres15 = \"Cannot render value of type `Pair` as YAML. Value: Pair(1, 2)\"\nres16 = \"Cannot render value of type `DataSize` as YAML. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as YAML. Value: yamlRenderer4#Person\"\nres18 = \"Cannot render value of type `TypeAlias` as YAML. Value: yamlRenderer4#Email\"\nres19 = \"Cannot render value of type `Function1` as YAML. Value: new Function1 {}\"\nres20 = \"ouch\"\nres21 = \"Cannot render value of type `IntSeq` as YAML. Value: IntSeq(1, 4)\"\nres22 = \"Cannot render object with both elements and properties/entries as YAML. Object: new Dynamic { foo = \\\"foo\\\"; 5 }\"\nres23 = \"Cannot render object with both elements and properties/entries as YAML. Object: new Dynamic { [\\\"foo\\\"] = \\\"foo\\\"; 5 }\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer5.pcf",
    "content": "res1 = \"\"\"\n  123\n  \n  \"\"\"\nres2 = \"\"\"\n  1.23\n  \n  \"\"\"\nres3 = \"\"\"\n  false\n  \n  \"\"\"\nres4 = \"\"\"\n  pigeon\n  \n  \"\"\"\nres6 = \"\"\"\n  - pigeon\n  - parrot\n  \n  \"\"\"\nres7 = \"\"\"\n  - pigeon\n  - parrot\n  \n  \"\"\"\nres8 = \"\"\"\n  name: pigeon\n  age: 42\n  \n  \"\"\"\nres9 = \"\"\"\n  - pigeon\n  - parrot\n  \n  \"\"\"\nres10 = \"\"\"\n  name: pigeon\n  age: 42\n  \n  \"\"\"\nres11 = \"\"\"\n  name: pigeon\n  age: 42\n  \n  \"\"\"\nres12 = \"\"\"\n  name: pigeon\n  age: 42\n  \n  \"\"\"\nres13 = \"\"\"\n  null\n  \n  \"\"\"\nres14 = \"Cannot render value of type `Duration` as YAML. Value: 1.min\"\nres15 = \"Cannot render value of type `Pair` as YAML. Value: Pair(1, 2)\"\nres16 = \"Cannot render value of type `DataSize` as YAML. Value: 1.mb\"\nres17 = \"Cannot render value of type `Class` as YAML. Value: yamlRenderer5#Person\"\nres17b = \"Cannot render value of type `TypeAlias` as YAML. Value: yamlRenderer5#Email\"\nres18 = \"Cannot render value of type `Function1` as YAML. Value: new Function1 {}\"\nres19 = \"ouch\"\nres20 = \"Cannot render value of type `IntSeq` as YAML. Value: IntSeq(1, 4)\"\nres21 = \"Cannot render object with both elements and properties/entries as YAML. Object: new Dynamic { foo = \\\"foo\\\"; 5 }\"\nres22 = \"Cannot render object with both elements and properties/entries as YAML. Object: new Dynamic { [\\\"foo\\\"] = \\\"foo\\\"; 5 }\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer6.yml",
    "content": "name: noegip\nage: 42\nfriends:\n- barn owlx\n- parrotx\nhobbies:\n  surfing: low\n  firemaking: high\naddress:\n  street: Other St.\n  zip: changed\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer7.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as YAML.\nValue: new Function1 {}\n\nx | m = new Mixin {}\n    ^^^^^^^^^^^^^^^^\nat pkl.base#YamlRenderer.renderDocument (file:///$snippetsDir/input/api/yamlRenderer7.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer8.yml",
    "content": "mappingInt:\n  5: abc\n  10: def\n  20: ghi\nmapInt:\n  5: abc\n  10: def\n  20: ghi\nmappingFloat:\n  5.0: abc\n  10.5: def\n  20.99999999: ghi\nmapFloat:\n  5.0: abc\n  10.5: def\n  20.99999999: ghi\nmappingBool:\n  true: abc\n  false: def\nmapBool:\n  true: abc\n  false: def\nmappingNull:\n  null: abc\nmapNull:\n  null: abc\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRenderer9.yml",
    "content": "'null': \"\\t\\0\"\nbell: \"\\t\\a\"\nbackspace: \"\\t\\b\"\nhorizontalTab: \"\\t\"\nlineFeed: \"\\t\\n\"\nverticalTab: \"\\t\\v\"\nformFeed: \"\\t\\f\"\ncarriageReturn: \"\\t\\r\"\nescape: \"\\t\\e\"\ndoubleQuote: \"\\t\\\"\"\nbackslash: \"\\t\\\\\"\nnextLine: \"\\t\\N\"\nnbsp: \"\\t\\_\"\nlineSep: \"\\t\\L\"\nparagraphSep: \"\\t\\P\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererBug66849708.yml",
    "content": "object:\n  property: converted\nmapping:\n  key: converted\nmap:\n  key: converted\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererEmpty.yml",
    "content": "a1: []\na2: []\na3: []\nb1: {}\nb2: {}\nb3: {}\nb4: {}\nc1:\n- []\n- []\n- []\nc2:\n  x1: []\n  x2: []\n  x3: []\nd1:\n- {}\n- {}\n- {}\n- {}\nd2:\n  x1: {}\n  x2: {}\n  x3: {}\n  x4: {}\ne1:\n- - []\n  - []\n  - []\ne2:\n- - []\n  - []\n  - []\nf1:\n- - {}\n  - {}\n  - {}\n  - {}\nf2:\n- - {}\n  - {}\n  - {}\n  - {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererIndentationWidth2.yml",
    "content": "name: pigeon\nage: 42\nfriends:\n- barn owl\n- parrot\nnestedFriends:\n- - barn owl\n  - parrot\n- - elf owl\n  - albatross\nnestedFriends2:\n- name: barn owl\n- name: parrot\nhobbies:\n  surfing:\n    skill: low\n  firemaking:\n    skill: high\nnestedHobbies:\n  surfing:\n    waves:\n      skill: low\n  firemaking:\n    woods:\n      skill: high\naddress:\n  street: Norton St.\n  zip: 12345\nnestedAddress:\n  street:\n    name: Norton St.\n  zip:\n    number: 12345\nmultiline: |-\n  one\n  two\n  three\nmultiline2: |2-\n    one\n  two\n  three\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererIndentationWidth4.yml",
    "content": "name: pigeon\nage: 42\nfriends:\n- barn owl\n- parrot\nnestedFriends:\n-   - barn owl\n    - parrot\n-   - elf owl\n    - albatross\nnestedFriends2:\n-   name: barn owl\n-   name: parrot\nhobbies:\n    surfing:\n        skill: low\n    firemaking:\n        skill: high\nnestedHobbies:\n    surfing:\n        waves:\n            skill: low\n    firemaking:\n        woods:\n            skill: high\naddress:\n    street: Norton St.\n    zip: 12345\nnestedAddress:\n    street:\n        name: Norton St.\n    zip:\n        number: 12345\nmultiline: |-\n    one\n    two\n    three\nmultiline2: |4-\n      one\n    two\n    three\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererIndentationWidth5.yml",
    "content": "name: pigeon\nage: 42\nfriends:\n- barn owl\n- parrot\nnestedFriends:\n-    - barn owl\n     - parrot\n-    - elf owl\n     - albatross\nnestedFriends2:\n-    name: barn owl\n-    name: parrot\nhobbies:\n     surfing:\n          skill: low\n     firemaking:\n          skill: high\nnestedHobbies:\n     surfing:\n          waves:\n               skill: low\n     firemaking:\n          woods:\n               skill: high\naddress:\n     street: Norton St.\n     zip: 12345\nnestedAddress:\n     street:\n          name: Norton St.\n     zip:\n          number: 12345\nmultiline: |-\n     one\n     two\n     three\nmultiline2: |5-\n       one\n     two\n     three\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererKeys.yml",
    "content": "'one[two': 42\n'one]two': 42\n'one{two': 42\n'one}two': 42\n'one,two': 42\nentries:\n  'one[two': 42\n  'one]two': 42\n  'one{two': 42\n  'one}two': 42\n  'one,two': 42\na1: one[two\na2: one]two\na3: one{two\na4: one}two\na5: one,two\nentries2:\n  ? |-\n    one\n    two\n  : 42\n  ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  : 42\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererStream1.pcf",
    "content": "a = \"\"\"\n  pigeon\n  --- 42\n  ---\n  - barn owl\n  - parrot\n  ---\n  surfing:\n    skill: low\n  firemaking:\n    skill: high\n  ---\n  street: Norton St.\n  zip: 12345\n  \n  \"\"\"\nb = \"\"\"\n  pigeon\n  --- 42\n  ---\n  - barn owl\n  - parrot\n  ---\n  surfing:\n    skill: low\n  firemaking:\n    skill: high\n  ---\n  street: Norton St.\n  zip: 12345\n  \n  \"\"\"\nc = \"\"\"\n  pigeon\n  --- 42\n  ---\n  - barn owl\n  - parrot\n  ---\n  surfing:\n    skill: low\n  firemaking:\n    skill: high\n  ---\n  street: Norton St.\n  zip: 12345\n  \n  \"\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererStream2.pcf",
    "content": "examples {\n  [\"multiline string at end of document\"] {\n    \"\"\"\n    x: |-\n      one\n      two\n    ---\n    x: other\n    \n    \"\"\"\n  }\n  [\"multiline string at end of stream\"] {\n    \"\"\"\n    x: other\n    ---\n    x: |-\n      one\n      two\n    \n    \"\"\"\n  }\n  [\"invalid top level value\"] {\n    \"The top-level value of a YAML stream must have type `Listing`, `List`, or `Set`, but got type `Int`. Value: 5\"\n    \"The top-level value of a YAML stream must have type `Listing`, `List`, or `Set`, but got type `yamlRendererStream2#Foo`. Value: new Foo {}\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererStrings.yml",
    "content": "a1: |+\n\na2: |+\n\n\na3: |+\n\n\n\nb1: |-\n\n  one\nb2: |-\n\n\n  one\nb3: |-\n\n\n\n  one\nc1: |-\n  one\n  two\nc2: |-\n  one\n\n  two\nc3: |-\n  one\n\n\n  two\nd1: |\n  one\nd2: |+\n  one\n\nd3: |+\n  one\n\n\ne1: ''\ne2: ' '\ne3: '   '\nf1: ' one'\nf2: '   one'\ng1: 'one '\ng2: 'one   '\nh1: \"\\t\"\nh2: \"one\\ttwo\"\nh3: \"\\r\"\nh4: \"one\\rtwo\"\nh5: \"\\a\"\nh6: \"one\\atwo\"\ni1: \"one\\ttwo\\nthree\"\ni2: \"one\\rtwo\\nthree\"\ni3: \"one\\atwo\\nthree\"\nj1: |2-\n   one\n  two\nj2: |2-\n     one\n  two\nj3: |-\n  one\n     two\nk1: |-\n  one\n  two \nk2: |-\n  one\n  two   \nk3: |-\n  one   \n  two\nl1: |-\n\n     \nl2: |2\n     \nl3: |2-\n     \n     \nl4: |\n\n     \nm1: 'foo:'\nm2: 'foo::'\nm3: foo:foo\nn1:\n  a:\n    b:\n      c: |2-\n          my\n        multiline\n        string\n'o1': '%'\n'o2': '%hello'\n'o3': |-\n  %\n  hello there\np1: '-'\np2: '?'\np3: ':'\np4: '? apple'\np5: ': banana'\np6: '- orange'\np7: |-\n  ?\n  apple\np8: |-\n  :\n  banana\np9: |-\n  -\n  orange\np10: ?apple\np11: :banana\np12: -orange\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererStringsCompat.pcf",
    "content": "examples {\n  [\"null like strings\"] {\n    \"'null'\"\n    \"'Null'\"\n    \"'NULL'\"\n    \"NuLl\"\n  }\n  [\"boolean like strings\"] {\n    \"'y'\"\n    \"'Y'\"\n    \"'yes'\"\n    \"'Yes'\"\n    \"'YES'\"\n    \"YeS\"\n    \"'n'\"\n    \"'N'\"\n    \"'no'\"\n    \"'No'\"\n    \"'NO'\"\n    \"nO\"\n    \"'true'\"\n    \"'True'\"\n    \"'TRUE'\"\n    \"TrUe\"\n    \"'false'\"\n    \"'False'\"\n    \"'FALSE'\"\n    \"FaLsE\"\n    \"'on'\"\n    \"'On'\"\n    \"'ON'\"\n    \"oN\"\n    \"'off'\"\n    \"'Off'\"\n    \"'OFF'\"\n    \"OfF\"\n  }\n  [\"int like strings\"] {\n    \"'0'\"\n    \"'1'\"\n    \"'2'\"\n    \"'9'\"\n    \"A\"\n    \"'-0'\"\n    \"'+0'\"\n    \"'123'\"\n    \"'-123'\"\n    \"'+123'\"\n    \"'0b1001'\"\n    \"'-0b1001'\"\n    \"'+0b1001'\"\n    \"'0123'\"\n    \"'01234567'\"\n    \"'-0123'\"\n    \"'+0123'\"\n    \"'0o123'\"\n    \"'0o1234567'\"\n    \"'-0o123'\"\n    \"'+0o123'\"\n    \"'0x1A3'\"\n    \"'0xabcdef'\"\n    \"'-0x1A3'\"\n    \"'+0x1A3'\"\n    \"'59:30:1'\"\n    \"'-59:30:1'\"\n    \"'+59:30:1'\"\n    \"'1_2_3'\"\n  }\n  [\"float like strings\"] {\n    \"'0.'\"\n    \"'.0'\"\n    \"'0.0'\"\n    \"'123.456'\"\n    \"'0123.456'\"\n    \"'-123.456'\"\n    \"'+123.456'\"\n    \"'123.456e2'\"\n    \"'123.456E2'\"\n    \"'123.456e-2'\"\n    \"'123.456E+2'\"\n    \"'-123.456e+2'\"\n    \"'+123.456E+2'\"\n    \"'59:30:1.234'\"\n    \"'-59:30:1.234'\"\n    \"'+59:30:1.234'\"\n    \"'1_2_3.456'\"\n    \"'1_2_3.4_5_6'\"\n    \"'.'\"\n    \"'.___'\"\n    \"'.inf'\"\n    \"'.Inf'\"\n    \"'.INF'\"\n    \".InF\"\n    \"'+.inf'\"\n    \"'+.Inf'\"\n    \"'+.INF'\"\n    \"+.InF\"\n    \"'-.inf'\"\n    \"'-.Inf'\"\n    \"'-.INF'\"\n    \"-.InF\"\n    \"'.nan'\"\n    \"'.NaN'\"\n    \"'.NAN'\"\n    \".nAn\"\n  }\n  [\"tag like strings\"] {\n    \"!!bool true\"\n    \"!!str my string value\"\n  }\n  [\"number like string keys\"] {\n    \"\"\"\n    '0': '0'\n    '0.123': '0.123'\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererStringsYaml11.pcf",
    "content": "examples {\n  [\"null like strings\"] {\n    \"'null'\"\n    \"'Null'\"\n    \"'NULL'\"\n    \"NuLl\"\n  }\n  [\"boolean like strings\"] {\n    \"'y'\"\n    \"'Y'\"\n    \"'yes'\"\n    \"'Yes'\"\n    \"'YES'\"\n    \"YeS\"\n    \"'n'\"\n    \"'N'\"\n    \"'no'\"\n    \"'No'\"\n    \"'NO'\"\n    \"nO\"\n    \"'true'\"\n    \"'True'\"\n    \"'TRUE'\"\n    \"TrUe\"\n    \"'false'\"\n    \"'False'\"\n    \"'FALSE'\"\n    \"FaLsE\"\n    \"'on'\"\n    \"'On'\"\n    \"'ON'\"\n    \"oN\"\n    \"'off'\"\n    \"'Off'\"\n    \"'OFF'\"\n    \"OfF\"\n  }\n  [\"int like strings\"] {\n    \"'0'\"\n    \"'1'\"\n    \"'2'\"\n    \"'9'\"\n    \"A\"\n    \"'-0'\"\n    \"'+0'\"\n    \"'123'\"\n    \"'-123'\"\n    \"'+123'\"\n    \"'0b1001'\"\n    \"'-0b1001'\"\n    \"'+0b1001'\"\n    \"'0123'\"\n    \"'01234567'\"\n    \"'-0123'\"\n    \"'+0123'\"\n    \"0o123\"\n    \"0o1234567\"\n    \"-0o123\"\n    \"+0o123\"\n    \"'0x1A3'\"\n    \"'0xabcdef'\"\n    \"'-0x1A3'\"\n    \"'+0x1A3'\"\n    \"'59:30:1'\"\n    \"'-59:30:1'\"\n    \"'+59:30:1'\"\n    \"'1_2_3'\"\n  }\n  [\"float like strings\"] {\n    \"'0.'\"\n    \"'.0'\"\n    \"'0.0'\"\n    \"'123.456'\"\n    \"'0123.456'\"\n    \"'-123.456'\"\n    \"'+123.456'\"\n    \"123.456e2\"\n    \"123.456E2\"\n    \"'123.456e-2'\"\n    \"'123.456E+2'\"\n    \"'-123.456e+2'\"\n    \"'+123.456E+2'\"\n    \"'59:30:1.234'\"\n    \"'-59:30:1.234'\"\n    \"'+59:30:1.234'\"\n    \"'1_2_3.456'\"\n    \"'1_2_3.4_5_6'\"\n    \"'.'\"\n    \"'.___'\"\n    \"'.inf'\"\n    \"'.Inf'\"\n    \"'.INF'\"\n    \".InF\"\n    \"'+.inf'\"\n    \"'+.Inf'\"\n    \"'+.INF'\"\n    \"+.InF\"\n    \"'-.inf'\"\n    \"'-.Inf'\"\n    \"'-.INF'\"\n    \"-.InF\"\n    \"'.nan'\"\n    \"'.NaN'\"\n    \"'.NAN'\"\n    \".nAn\"\n  }\n  [\"tag like strings\"] {\n    \"!!bool true\"\n    \"!!str my string value\"\n  }\n  [\"number like string keys\"] {\n    \"\"\"\n    '0': '0'\n    '0.123': '0.123'\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/api/yamlRendererStringsYaml12.pcf",
    "content": "examples {\n  [\"null like strings\"] {\n    \"'null'\"\n    \"'Null'\"\n    \"'NULL'\"\n    \"NuLl\"\n  }\n  [\"boolean like strings\"] {\n    \"y\"\n    \"Y\"\n    \"yes\"\n    \"Yes\"\n    \"YES\"\n    \"YeS\"\n    \"n\"\n    \"N\"\n    \"no\"\n    \"No\"\n    \"NO\"\n    \"nO\"\n    \"'true'\"\n    \"'True'\"\n    \"'TRUE'\"\n    \"TrUe\"\n    \"'false'\"\n    \"'False'\"\n    \"'FALSE'\"\n    \"FaLsE\"\n    \"on\"\n    \"On\"\n    \"ON\"\n    \"oN\"\n    \"off\"\n    \"Off\"\n    \"OFF\"\n    \"OfF\"\n  }\n  [\"int like strings\"] {\n    \"'0'\"\n    \"'1'\"\n    \"'2'\"\n    \"'9'\"\n    \"A\"\n    \"'-0'\"\n    \"'+0'\"\n    \"'123'\"\n    \"'-123'\"\n    \"'+123'\"\n    \"0b1001\"\n    \"-0b1001\"\n    \"+0b1001\"\n    \"'0123'\"\n    \"'01234567'\"\n    \"'-0123'\"\n    \"'+0123'\"\n    \"'0o123'\"\n    \"'0o1234567'\"\n    \"-0o123\"\n    \"+0o123\"\n    \"'0x1A3'\"\n    \"'0xabcdef'\"\n    \"-0x1A3\"\n    \"+0x1A3\"\n    \"59:30:1\"\n    \"-59:30:1\"\n    \"+59:30:1\"\n    \"1_2_3\"\n  }\n  [\"float like strings\"] {\n    \"'0.'\"\n    \"'.0'\"\n    \"'0.0'\"\n    \"'123.456'\"\n    \"'0123.456'\"\n    \"'-123.456'\"\n    \"'+123.456'\"\n    \"'123.456e2'\"\n    \"'123.456E2'\"\n    \"'123.456e-2'\"\n    \"'123.456E+2'\"\n    \"'-123.456e+2'\"\n    \"'+123.456E+2'\"\n    \"59:30:1.234\"\n    \"-59:30:1.234\"\n    \"+59:30:1.234\"\n    \"1_2_3.456\"\n    \"1_2_3.4_5_6\"\n    \".\"\n    \".___\"\n    \"'.inf'\"\n    \"'.Inf'\"\n    \"'.INF'\"\n    \".InF\"\n    \"'+.inf'\"\n    \"'+.Inf'\"\n    \"'+.INF'\"\n    \"+.InF\"\n    \"'-.inf'\"\n    \"'-.Inf'\"\n    \"'-.INF'\"\n    \"-.InF\"\n    \"'.nan'\"\n    \"'.NaN'\"\n    \"'.NAN'\"\n    \".nAn\"\n  }\n  [\"tag like strings\"] {\n    \"!!bool true\"\n    \"!!str my string value\"\n  }\n  [\"number like string keys\"] {\n    \"\"\"\n    '0': '0'\n    '0.123': '0.123'\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/amendsChains.pcf",
    "content": "foo {\n  bar {\n    \"Hello\"\n    \"World\"\n  }\n}\nbar {\n  baz {\n    \"first\"\n    \"second\"\n    \"third\"\n    \"forth\"\n  }\n}\nbaz = List(1, 2, -3, -30, 2, 2, -3, -30, 1.1, 3, 3, 3, 3, 3, 3, 1.1)\nqux {\n  \"Goodbye cruel world!\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/as.pcf",
    "content": "examples {\n  [\"String\"] {\n    \"abc\"\n  }\n  [\"Any\"] {\n    \"abc\"\n    42\n    1.23\n    true\n    false\n    42.s\n    42.b\n    List(1, 2, 3)\n    Set(1, 2, 3)\n    Map(1, \"one\", 2, \"two\", 3, \"three\")\n    null\n    null\n    new {}\n    new {}\n    new {\n      [\"name\"] = \"Pigeon\"\n      [\"age\"] = 40\n    }\n  }\n  [\"Null\"] {\n    null\n    null\n    \"Expected value of type `Null`, but got type `String`. Value: \\\"abc\\\"\"\n    \"Expected value of type `Null`, but got type `Int`. Value: 42\"\n    \"Expected value of type `Null`, but got type `Float`. Value: 1.23\"\n    \"Expected value of type `Null`, but got type `Boolean`. Value: true\"\n    \"Expected value of type `Null`, but got type `Boolean`. Value: false\"\n    \"Expected value of type `Null`, but got type `Duration`. Value: 42.s\"\n    \"Expected value of type `Null`, but got type `DataSize`. Value: 42.b\"\n    \"Expected value of type `Null`, but got type `List`. Value: List(1, 2, 3)\"\n    \"Expected value of type `Null`, but got type `Set`. Value: Set(1, 2, 3)\"\n    \"Expected value of type `Null`, but got type `Map`. Value: Map(1, \\\"one\\\", 2, \\\"two\\\", 3, \\\"three\\\")\"\n    \"Expected value of type `Null`, but got type `as#Base`. Value: new Base {}\"\n    \"Expected value of type `Null`, but got type `as#Derived`. Value: new Derived {}\"\n    \"Expected value of type `Null`, but got type `Mapping`. Value: new Mapping { [\\\"name\\\"] = \\\"Pigeon\\\"; [\\\"age\\\"] = 40 }\"\n    \"Expected value of type `Null`, but got type `Class`. Value: as#Base\"\n    \"Expected value of type `Null`, but got type `Listing`. Value: new Listing { null; null; \\\"Expected value of type `Null`, but got type `Strin...\"\n    \"Expected value of type `Null`, but got type `Function1`. Value: new Function1 {}\"\n  }\n  [\"Number\"] {\n    42\n    1.23\n  }\n  [\"Int\"] {\n    42\n    \"Expected value of type `Int`, but got type `String`. Value: \\\"abc\\\"\"\n    \"Expected value of type `Int`, but got type `Float`. Value: 1.23\"\n    \"Expected value of type `Int`, but got type `Boolean`. Value: true\"\n    \"Expected value of type `Int`, but got type `Boolean`. Value: false\"\n    \"Expected value of type `Int`, but got type `Duration`. Value: 42.s\"\n    \"Expected value of type `Int`, but got type `DataSize`. Value: 42.b\"\n    \"Expected value of type `Int`, but got type `List`. Value: List(1, 2, 3)\"\n    \"Expected value of type `Int`, but got type `Set`. Value: Set(1, 2, 3)\"\n    \"Expected value of type `Int`, but got type `Map`. Value: Map(1, \\\"one\\\", 2, \\\"two\\\", 3, \\\"three\\\")\"\n    \"Expected value of type `Int`, but got `null`.\"\n    \"Expected value of type `Int`, but got `null`.\"\n    \"Expected value of type `Int`, but got type `as#Base`. Value: new Base {}\"\n    \"Expected value of type `Int`, but got type `Function1`. Value: new Function1 {}\"\n    \"Expected value of type `Int`, but got type `as#Derived`. Value: new Derived {}\"\n    \"Expected value of type `Int`, but got type `Mapping`. Value: new Mapping { [\\\"name\\\"] = \\\"Pigeon\\\"; [\\\"age\\\"] = 40 }\"\n    \"Expected value of type `Int`, but got type `Class`. Value: as#Base\"\n    \"Expected value of type `Int`, but got type `Listing`. Value: new Listing { 42; \\\"Expected value of type `Int`, but got type `String`. Value...\"\n  }\n  [\"Float\"] {\n    1.23\n    \"Expected value of type `Float`, but got type `Int`. Value: 42\"\n  }\n  [\"Other\"] {\n    \"Expected value of type `as#Other`, but got type `String`. Value: \\\"abc\\\"\"\n    \"Expected value of type `as#Other`, but got type `Int`. Value: 42\"\n    \"Expected value of type `as#Other`, but got type `Float`. Value: 1.23\"\n    \"Expected value of type `as#Other`, but got type `Boolean`. Value: true\"\n    \"Expected value of type `as#Other`, but got type `Boolean`. Value: false\"\n    \"Expected value of type `as#Other`, but got type `Duration`. Value: 42.s\"\n    \"Expected value of type `as#Other`, but got type `DataSize`. Value: 42.b\"\n    \"Expected value of type `as#Other`, but got type `List`. Value: List(1, 2, 3)\"\n    \"Expected value of type `as#Other`, but got type `Set`. Value: Set(1, 2, 3)\"\n    \"Expected value of type `as#Other`, but got type `Map`. Value: Map(1, \\\"one\\\", 2, \\\"two\\\", 3, \\\"three\\\")\"\n    \"Expected value of type `as#Other`, but got `null`.\"\n    \"Expected value of type `as#Other`, but got `null`.\"\n    \"Expected value of type `as#Other`, but got type `as#Base`. Value: new Base {}\"\n    \"Expected value of type `as#Other`, but got type `as#Derived`. Value: new Derived {}\"\n    \"Expected value of type `as#Other`, but got type `Mapping`. Value: new Mapping { [\\\"name\\\"] = \\\"Pigeon\\\"; [\\\"age\\\"] = 40 }\"\n    \"Expected value of type `as#Other`, but got type `Class`. Value: as#Base\"\n    \"Expected value of type `as#Other`, but got type `Listing`. Value: new Listing { \\\"Expected value of type `as#Other`, but got type `String`. Valu...\"\n    \"Expected value of type `as#Other`, but got type `Function1`. Value: new Function1 {}\"\n  }\n  [\"Boolean\"] {\n    true\n    false\n  }\n  [\"Duration\"] {\n    42.s\n    \"Expected value of type `Duration`, but got type `DataSize`. Value: 42.b\"\n  }\n  [\"DataSize\"] {\n    42.b\n    \"Expected value of type `DataSize`, but got type `Duration`. Value: 42.s\"\n  }\n  [\"List\"] {\n    List(1, 2, 3)\n    \"Expected value of type `List`, but got type `Set`. Value: Set(1, 2, 3)\"\n  }\n  [\"Set\"] {\n    \"Expected value of type `Set`, but got type `List`. Value: List(1, 2, 3)\"\n    Set(1, 2, 3)\n  }\n  [\"Collection\"] {\n    List(1, 2, 3)\n    Set(1, 2, 3)\n    \"Expected value of type `Collection`, but got type `Map`. Value: Map(1, \\\"one\\\", 2, \\\"two\\\", 3, \\\"three\\\")\"\n  }\n  [\"Map\"] {\n    Map(1, \"one\", 2, \"two\", 3, \"three\")\n  }\n  [\"base class\"] {\n    new {}\n    new {}\n  }\n  [\"derived class\"] {\n    new {}\n    \"Expected value of type `as#Derived`, but got type `as#Base`. Value: new Base {}\"\n  }\n  [\"Mapping\"] {\n    new {\n      [\"name\"] = \"Pigeon\"\n      [\"age\"] = 40\n    }\n  }\n  [\"Function\"] {\n    42\n    42\n    42\n    \"Expected value of type `Function2`, but got type `Function1`. Value: new Function1 {}\"\n  }\n  [\"Class\"] {\n    \"Base\"\n    \"Base\"\n  }\n  [\"Module\"] {\n    \"abc\"\n    \"abc\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/as2.pcf",
    "content": "examples {\n  [\"list\"] {\n    List(1, 2, 3)\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n    \"Expected value of type `List`, but got type `Set`. Value: Set(1, 2, 3)\"\n  }\n  [\"set\"] {\n    \"Expected value of type `Set`, but got type `List`. Value: List(1, 2, 3)\"\n    Set(1, 2, 3)\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"map\"] {\n    Map(\"Pigeon\", 42, \"Barn Owl\", 21)\n    \"Expected value of type `Int`, but got type `String`. Value: \\\"Pigeon\\\"\"\n  }\n  [\"listing\"] {\n    new {\n      1\n      2\n      3\n    }\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"cast Listing<UInt32> to other integer types\"] {\n    9999999\n    9999999\n    9999999\n    9999999\n    \"Type constraint `isBetween(-32768, 32767)` violated. Value: 9999999\"\n    \"Type constraint `isBetween(0, 65535)` violated. Value: 9999999\"\n    \"Type constraint `isBetween(-128, 127)` violated. Value: 9999999\"\n    \"Type constraint `isBetween(0, 255)` violated. Value: 9999999\"\n  }\n  [\"mapping\"] {\n    \"Expected value of type `Mapping`, but got type `Listing`. Value: new Listing { ?; ?; ? }\"\n    new {\n      [\"Pigeon\"] = 42\n      [\"Barn Owl\"] = 21\n    }\n    \"Expected value of type `Int`, but got type `String`. Value: \\\"Pigeon\\\"\"\n  }\n  [\"cast Mapping<, UInt> to other integer types\"] {\n    9999\n    9999\n    9999\n    9999\n    9999\n    9999\n    \"Type constraint `isBetween(-128, 127)` violated. Value: 9999\"\n    \"Type constraint `isBetween(0, 255)` violated. Value: 9999\"\n  }\n  [\"union type\"] {\n    42\n    42\n    42\n    \"Expected value of type `String|Duration`, but got type `Int`. Value: 42\"\n    List(1, 2, 3)\n    List(1, 2, 3)\n    \"Expected value of type `List<String>|Set<Int>`, but got a different `List`. Value: List(1, 2, 3)\"\n  }\n  [\"nullable type\"] {\n    null\n    null\n    \"Expected value of type `Map`, but got `null`.\"\n  }\n  [\"function type\"] {\n    42\n    42\n    \"Expected value of type `Function1`, but got type `Function2`. Value: new Function2 {}\"\n  }\n  [\"string literal type\"] {\n    \"Pigeon\"\n    \"Expected value of type `\\\"Piggy\\\"|\\\"Barn Owl\\\"`, but got `\\\"Pigeon\\\"`.\"\n  }\n  [\"constrained type\"] {\n    \"abc\"\n    \"Type constraint `length == 4` violated. Value: \\\"abc\\\"\"\n    List(\"a\", \"b\", \"c\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/as3.pcf",
    "content": "examples {\n  [\"set of listing\"] {\n    1\n    false\n    \"Expected value of type `Int`, but got type `String`. Value: \\\"one\\\"\"\n  }\n  [\"listing\"] {\n    true\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"mapping\"] {\n    true\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n    \"Expected value of type `String`, but got type `Int`. Value: 2\"\n    \"Expected value of type `Int`, but got type `String`. Value: \\\"hi\\\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/baseModule.pcf",
    "content": "foo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/boolean.pcf",
    "content": "examples {\n  [\"literal\"] {\n    true\n    false\n  }\n  [\"conjunction\"] {\n    false\n    false\n    false\n    \"not short-circuited\"\n    \"not short-circuited\"\n    \"Operator `&&` is not defined for left operand type `Int`. Left operand: 1\"\n  }\n  [\"disjunction\"] {\n    true\n    true\n    true\n    \"not short-circuited\"\n    \"not short-circuited\"\n    \"Operator `||` is not defined for left operand type `Int`. Left operand: 0\"\n  }\n  [\"negation\"] {\n    false\n    true\n  }\n  [\"equality\"] {\n    true\n    false\n    false\n    true\n  }\n  [\"inequality\"] {\n    false\n    true\n    true\n    false\n  }\n  [\"xor()\"] {\n    false\n    true\n    true\n    false\n    false\n    true\n    true\n    false\n    \"Cannot find method `xor` in class `Dynamic`.\"\n    \"Expected value of type `Boolean`, but got type `Dynamic`. Value: new Dynamic {}\"\n  }\n  [\"implies()\"] {\n    true\n    false\n    true\n    true\n    \"not short-circuited\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/bytes.pcf",
    "content": "examples {\n  [\"basic\"] {\n    Bytes(0, 255)\n  }\n  [\"bytes from constant value nodes\"] {\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7)\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7)\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7)\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7)\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7)\n  }\n  [\"bytes from non-constant value nodes\"] {\n    Bytes(1, 2)\n  }\n  [\"incorrectly sized constant values\"] {\n    \"Type constraint `isBetween(0, 255)` violated. Value: 65535\"\n  }\n  [\"equality\"] {\n    true\n    false\n    false\n    true\n  }\n  [\"inequality\"] {\n    false\n    true\n    true\n    false\n  }\n  [\"addition\"] {\n    Bytes(1, 2, 3, 1, 2, 4)\n    Bytes()\n    Bytes(1, 2, 3)\n    Bytes(1, 2, 4)\n    \"Operator `+` is not defined for operand types `Bytes` and `List`. Left operand : Bytes(1, 2, 3) Right operand: List(1, 2, 4)\"\n  }\n  [\"subscript\"] {\n    1\n    2\n    3\n    \"Element index `3` is out of range `0`..`2`. Value: Bytes(1, 2, 3)\"\n  }\n  [\"all bytes\"] {\n    Bytes(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/comments.pcf",
    "content": "x = 10\ny = 20\nz = 30\na = 20\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/constModifier.pcf",
    "content": "constantSimpleValue = \"constant\"\nnonConstantSimpleValue = \"NON-CONSTANT\"\nconstantNestedValue {\n  nestedSimpleValue = \"constant\"\n}\nconstDyn {\n  prop = \"2\"\n  [1] = \"1\"\n}\nnonConstantNestedValue {\n  nestedSimpleValue = \"constant\"\n}\nconstImport {\n  cst = 10\n  pi2 = 3.141592653589793\n  mod = \"constant\"\n  outr = \"constant\"\n  clocal = \"const-local\"\n  dynconst = \"1\"\n  dynconst2 = \"2\"\n  constAccess = 10\n  constAccess2 = 11\n}\nvalidOuter {\n  name = \"Winner\"\n  fancyName {\n    title = \"The Winner\"\n  }\n}\nres01 {\n  nested {\n    nestedSimpleValue = \"constant\"\n  }\n  simple = \"constant\"\n  dereferenced = \"constant\"\n}\nres02 = \"Cannot reference property `nonConstantSimpleValue` from here because it is not `const`.\"\nres03 = \"Cannot reference property `nonConstantNestedValue` from here because it is not `const`.\"\nres04 = \"Cannot call method `nonConstFunction` from here because it is not `const`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/constModifier2.pcf",
    "content": "foo {\n  bar = \"bar\"\n  baz = \"bar\"\n  qux = \"bar\"\n  qix = 1\n}\nbar {\n  qux = 1\n  baz {\n    corge = 2\n    biz {\n      buz = 1\n      qup = 2\n      fuzz = 5\n    }\n  }\n}\namend {\n  bar = \"bar\"\n  baz = \"amend\"\n  qux = \"bar\"\n  qix = 1\n}\nthing {\n  prop1 = 5\n  prop2 = 5\n  prop3 {\n    prop4 = 5\n  }\n}\nthing2 {\n  prop1 = 5\n  prop2 = 5\n  prop3 {\n    prop4 = 5\n  }\n}\nthing3 {\n  prop1 = 5\n  prop2 = 5\n  prop3 {\n    prop4 = 5\n  }\n}\nthing4 {\n  prop1 = 5\n  prop2 = 2\n  prop3 {\n    prop4 = 10\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/constModifier3.pcf",
    "content": "res = 25\nres2 = 26\nres3 = \"hihihi\"\nres4 = \"hihihi\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/constModifier4.pcf",
    "content": "baz = 15\nfoo {\n  qux = 15\n  corge = 15\n  corge2 = 15\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/constModifier5.err",
    "content": "a {\n  prop = \"hello\"\n  prop2 = 1\n  res = 1\n}\nb {\n  prop = \"hello\"\n  prop2 = 1\n  res = 2\n}\npkl: TRACE: \"hello\" = \"hello\" (file:///$snippetsDir/input/basic/constModifier5.pkl)\npkl: TRACE: \"hello again\" = \"hello again\" (file:///$snippetsDir/input/basic/constModifier5.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/dataSize.pcf",
    "content": "examples {\n  [\"construction\"] {\n    1.b\n    2.kb\n    3.kib\n    4.mb\n    5.mib\n    6.gb\n    7.gib\n    8.tb\n    9.tib\n    10.pb\n    11.pib\n    1.1.b\n    2.2.kb\n    3.3.kib\n    4.4.mb\n    5.5.mib\n    6.6.gb\n    7.7.gib\n    8.8.tb\n    9.9.tib\n    10.1.pb\n    11.11.pib\n  }\n  [\"addition\"] {\n    6.kb\n    5.5.kb\n    4.953125.kib\n    11.000000000000009.pib\n    6.kb\n    5.5.kb\n    4.953125.kib\n    11.000000000000009.pib\n  }\n  [\"subtraction\"] {\n    -2.kb\n    -1.0999999999999996.kb\n    -1.046875.kib\n    -10.999999999999991.pib\n    2.kb\n    1.0999999999999996.kb\n    1.046875.kib\n    10.999999999999991.pib\n  }\n  [\"multiplication\"] {\n    6.kb\n    6.6.kb\n    6.6000000000000005.kb\n    7.26.kb\n    6.kb\n    6.6.kb\n    6.6000000000000005.kb\n    7.26.kb\n  }\n  [\"division\"] {\n    0.6666666666666666.kb\n    0.6060606060606061.kb\n    0.7333333333333334.kb\n    0.6666666666666667.kb\n    \"Operator `/` is not defined for operand types `Int` and `DataSize`. Left operand : 3 Right operand: 2.kb\"\n    \"Operator `/` is not defined for operand types `Float` and `DataSize`. Left operand : 3.3 Right operand: 2.kb\"\n    \"Operator `/` is not defined for operand types `Int` and `DataSize`. Left operand : 3 Right operand: 2.2.kb\"\n    \"Operator `/` is not defined for operand types `Float` and `DataSize`. Left operand : 3.3 Right operand: 2.3.kb\"\n  }\n  [\"division by data size\"] {\n    0.6666666666666666\n    0.6060606060606061\n    7.333333333333333E-4\n    666666.6666666667\n  }\n  [\"negation\"] {\n    -4.mb\n    4.mb\n    -4.mb\n    -4.mb\n    4.mb\n    -4.mb\n  }\n  [\"truncating division\"] {\n    1.kb\n    2.kb\n    2.kb\n    1.kb\n  }\n  [\"truncating division by data size\"] {\n    1\n    2\n    0\n    1878787\n  }\n  [\"power\"] {\n    8.kb\n    9.849155306759329.kb\n    10.648000000000003.kb\n    13.489468760533386.kb\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/duration.pcf",
    "content": "examples {\n  [\"construct\"] {\n    1.ns\n    2.us\n    3.ms\n    4.s\n    5.min\n    6.h\n    7.d\n    1.1.ns\n    2.2.us\n    3.3.ms\n    4.4.s\n    5.5.min\n    6.6.h\n    7.7.d\n  }\n  [\"addition\"] {\n    6.s\n    5.5.s\n    3.033333333333333.min\n    7.0000000000001155.d\n    6.s\n    5.5.s\n    3.033333333333333.min\n    7.0000000000001155.d\n  }\n  [\"subtraction\"] {\n    -2.s\n    -1.0999999999999996.s\n    -2.966666666666667.min\n    -6.9999999999998845.d\n    2.s\n    1.0999999999999996.s\n    2.966666666666667.min\n    6.9999999999998845.d\n  }\n  [\"multiplication\"] {\n    6.s\n    6.6.s\n    6.6000000000000005.s\n    7.26.s\n    6.s\n    6.6.s\n    6.6000000000000005.s\n    7.26.s\n  }\n  [\"division\"] {\n    0.6666666666666666.s\n    0.6060606060606061.s\n    0.7333333333333334.s\n    0.6666666666666667.s\n    \"Operator `/` is not defined for operand types `Int` and `Duration`. Left operand : 3 Right operand: 2.s\"\n    \"Operator `/` is not defined for operand types `Float` and `Duration`. Left operand : 3.3 Right operand: 2.s\"\n    \"Operator `/` is not defined for operand types `Int` and `Duration`. Left operand : 3 Right operand: 2.2.s\"\n    \"Operator `/` is not defined for operand types `Float` and `Duration`. Left operand : 3.3 Right operand: 2.3.s\"\n  }\n  [\"division by duration\"] {\n    0.6666666666666666\n    0.6060606060606061\n    0.012222222222222223\n    2400.0000000000005\n  }\n  [\"negation\"] {\n    -4.s\n    4.s\n    -4.s\n    -4.4.s\n    4.4.s\n    -4.4.s\n  }\n  [\"truncating division\"] {\n    1.s\n    2.s\n    2.s\n    1.s\n  }\n  [\"truncating division by duration\"] {\n    1\n    2\n    0\n    6763\n  }\n  [\"power\"] {\n    8.s\n    9.849155306759329.s\n    10.648000000000003.s\n    13.489468760533386.s\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/exceptions.err",
    "content": "–– Pkl Error ––\nSomething went wrong\n\nx | bar = throw(\"Something went wrong\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat exceptions#foo.bar (file:///$snippetsDir/input/basic/exceptions.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/fixedProperty1.pcf",
    "content": "res1 = \"hi\"\nres2 = true\nres3 {\n  name = \"Swallow\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/fixedProperty2.pcf",
    "content": "p {\n  name = \"The Person\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/fixedProperty3.pcf",
    "content": "res1 = \"goodbye\"\nres2 = true\nres3 {\n  name = \"Swallow\"\n}\nres4 = \"aloha\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/fixedProperty4.err",
    "content": "–– Pkl Error ––\nModifier `fixed` is not applicable to modules.\n\nx | fixed module foo\n    ^^^^^\nat foo (file:///$snippetsDir/input/basic/fixedProperty4.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/fixedProperty5.err",
    "content": "–– Pkl Error ––\nModifier `fixed` is not applicable to object members.\n\nx | fixed bar = \"bar\"\n    ^^^^^\nat fixedProperty5#myObj (file:///$snippetsDir/input/basic/fixedProperty5.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/fixedProperty6.err",
    "content": "–– Pkl Error ––\nModifier `fixed` is not applicable to methods.\n\nx | fixed function foo() = 5\n    ^^^^^\nat fixedProperty6 (file:///$snippetsDir/input/basic/fixedProperty6.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/float.pcf",
    "content": "facts {\n  [\"pow\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"equality\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"inequality\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"greater than\"] {\n    true\n    true\n    true\n  }\n  [\"less than\"] {\n    true\n    true\n    true\n  }\n  [\"greater than or equal\"] {\n    true\n    true\n    true\n  }\n  [\"less than or equal\"] {\n    true\n    true\n    true\n  }\n  [\"underscores\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"literal\"] {\n    1.2345678912345679E8\n    1.23456E9\n    1.23456E-5\n    -1.2345678912345679E8\n    -1.23456E9\n    -1.23456E-5\n    4.9E-324\n    1.7976931348623157E308\n    1.2345678912345679E8\n    1.1\n    11.11\n    1.23456E9\n    1.23456E-5\n    1.23456E12\n    1.23456E-8\n  }\n  [\"addition\"] {\n    3.3000000000000003\n    3.2\n  }\n  [\"subtraction\"] {\n    -1.0999999999999996\n    -0.7999999999999998\n  }\n  [\"multiplication\"] {\n    14.52\n    13.200000000000001\n  }\n  [\"division\"] {\n    0.8\n    0.8800000000000001\n  }\n  [\"integer division\"] {\n    1\n    1\n    1\n    1\n    1\n  }\n  [\"remainder\"] {\n    5.5\n    5.0\n  }\n  [\"negation\"] {\n    -1.2\n    -1.2\n    1.0\n    1.0\n  }\n  [\"power\"] {\n    27.98409999999999\n    1.0\n    0.03573457784956459\n    1.0\n    1.0\n    1.0\n    0.0\n    1.0\n    -1.0\n    Infinity\n    1.0\n    -1.0\n    0.0\n    1.0\n    1.0\n    Infinity\n    1.0\n    1.0\n    0.0\n    1.0\n    1.0\n    Infinity\n    1.0\n    1.0\n    1.7014118346046923E38\n    Infinity\n    Infinity\n    Infinity\n    Infinity\n    -1.7014118346046923E38\n    -Infinity\n    -Infinity\n    Infinity\n    Infinity\n    1.0\n    1.7976931348623157E308\n    Infinity\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/identifier.pcf",
    "content": "examples {\n  [\"variable\"] {\n    42\n    43\n    44\n  }\n  [\"property\"] {\n    42\n    43\n    44\n  }\n  [\"string interpolation\"] {\n    \"42\"\n    \"43\"\n    \"44\"\n  }\n  [\"multiline string interpolation\"] {\n    \"42\"\n    \"43\"\n    \"44\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/if.pcf",
    "content": "examples {\n  [\"basic\"] {\n    1\n    3\n  }\n  [\"non-boolean condition\"] {\n    \"Expected value of type `Boolean`, but got type `String`. Value: \\\"\\\"\"\n    \"Expected value of type `Boolean`, but got type `Int`. Value: 0\"\n    \"Expected value of type `Boolean`, but got `null`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/import1.pcf",
    "content": "bar = 1\nres1 = 6\nres2 = 3\nres3 = 6\nres4 = 3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/import1b.pcf",
    "content": "bar = 1\nres1 = 6\nres2 = 3\nres3 = 6\nres4 = 3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/import2.pcf",
    "content": "bar = 1\nlibFoo = 6\nlibBar = 3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/import3.pcf",
    "content": "foo {\n  bar {\n    foo = 6\n    bar = 3\n  }\n  baz {\n    foo = 6\n    bar = 3\n  }\n  bak = 6\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/importGlob.pcf",
    "content": "examples {\n  [\"import* clause keys\"] {\n    new {\n      \"../../input-helper/globtest/module with [weird] ~!characters.pkl\"\n      \"../../input-helper/globtest/moduleA.pkl\"\n      \"../../input-helper/globtest/moduleB.pkl\"\n    }\n  }\n  [\"import* inferred name\"] {\n    new {\n      \"../../input-helper/globtest/module with [weird] ~!characters.pkl\"\n      \"../../input-helper/globtest/moduleA.pkl\"\n      \"../../input-helper/globtest/moduleB.pkl\"\n    }\n  }\n  [\"globstar\"] {\n    new {\n      \"../../input-helper/globtest/module with [weird] ~!characters.pkl\"\n      \"../../input-helper/globtest/moduleA.pkl\"\n      \"../../input-helper/globtest/moduleB.pkl\"\n      \"../../input-helper/globtest/child/moduleC.pkl\"\n    }\n  }\n  [\"amended\"] {\n    \"\"\"\n     {}\n    \n    ---\n    name: moduleA\n    \n    ---\n    name: moduleB\n    \n    ---\n    name: child/moduleC\n    \n    \"\"\"\n  }\n  [\"globstar then up one level\"] {\n    new {\n      \"../../input-helper/globtest/child/../module with [weird] ~!characters.pkl\"\n      \"../../input-helper/globtest/child/../moduleA.pkl\"\n      \"../../input-helper/globtest/child/../moduleB.pkl\"\n    }\n  }\n  [\"empty glob matches current directory\"] {\n    new {\n      \"\"\n    }\n    \"I/O error loading module `file:///$snippetsDir/input/basic/`. IOException: Is a directory\"\n  }\n  [\"no wildcards\"] {\n    new {\n      \"../../input-helper/globtest/moduleA.pkl\"\n    }\n  }\n  [\"wildcard that does match\"] {\n    new {\n      \"../../input-helper/globtest/moduleA.pkl\"\n    }\n  }\n  [\"character classes\"] {\n    new {\n      \"../../input-helper/globtest/moduleA.pkl\"\n      \"../../input-helper/globtest/moduleB.pkl\"\n    }\n  }\n  [\"match directories\"] {\n    \"I/O error loading module `file:///$snippetsDir/input-helper/globtest`. IOException: Is a directory\"\n  }\n  [\"import glob first segment is wildcard\"] {\n    new {\n      \"importGlob.pkl\"\n      \"readGlob.pkl\"\n    }\n  }\n  [\"import glob matching unsafe uri chars\"] {\n    new {\n      [\"../../input-helper/globtest/module with [weird] ~!characters.pkl\"] {}\n    }\n    new {\n      [\"../../input-helper/globtest/module with [weird] ~!characters.pkl\"] {}\n    }\n  }\n  [\"package\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n    }\n    new {\n      \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\n      \"package://localhost:0/birds@0.5.0#/allFruit.pkl\"\n      \"package://localhost:0/birds@0.5.0#/catalog.pkl\"\n      \"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n      \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n      \"package://localhost:0/birds@0.5.0#/some/dir/Bird.pkl\"\n    }\n  }\n  [\"globbing with absolute URIs and percent encoding\"] {\n    new {\n      [\"package://localhost:0/packageContainingWildcardCharacters@1.0.0#/name%20with%20%5Bwildcard%5D!%20characters~~.pkl\"] {}\n    }\n    new {\n      [\"package://localhost:0/packageContainingWildcardCharacters@1.0.0#/name%20with%20%5Bwildcard%5D!%20characters~~.pkl\"] {}\n    }\n  }\n  [\"package glob and up one level\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/catalog/../catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/../catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/imported.pcf",
    "content": "foo = 6\nbar = 3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/indexExpressions.pcf",
    "content": "result = \"z\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/int.pcf",
    "content": "facts {\n  [\"equality\"] {\n    true\n    true\n    true\n  }\n  [\"inequality\"] {\n    true\n    true\n    true\n  }\n  [\"underscore - digits\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"underscore - hex\"] {\n    true\n    false\n    true\n    true\n  }\n  [\"underscore - binary\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"underscore - octal\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"literal\"] {\n    42\n    42\n    123456789123456789\n    -42\n    -42\n    -123456789123456789\n    -9223372036854775808\n    9223372036854775807\n    1000\n    1000000\n    1\n    11\n    10000\n    -10000\n  }\n  [\"hex literal\"] {\n    66\n    81985529216486895\n    81985529216486895\n    81985529216486895\n    81985529216486895\n    66\n    -81985529216486895\n    -81985529216486895\n    -81985529216486895\n    -81985529216486895\n    286348008978\n    65\n    1433\n    -1433\n  }\n  [\"binary literal\"] {\n    45\n    45\n    -45\n    -45\n    182\n    6\n    2\n    -1\n  }\n  [\"octal literal\"] {\n    342391\n    16434824\n    -342391\n    -16434824\n    2739128\n    2423\n    56\n    -7\n    420\n    493\n  }\n  [\"addition\"] {\n    3\n    3\n  }\n  [\"subtraction\"] {\n    -1\n    -1\n  }\n  [\"multiplication\"] {\n    12\n    12\n  }\n  [\"division\"] {\n    1.3333333333333333\n    1.3333333333333333\n  }\n  [\"integer division\"] {\n    1\n    1\n  }\n  [\"remainder\"] {\n    5\n    5\n  }\n  [\"negation\"] {\n    -1\n    -2\n    -3\n    -4\n    1\n    1\n  }\n  [\"power\"] {\n    16\n    1\n    0.0625\n    1\n    1\n    1\n    0\n    1\n    -1\n    Infinity\n    1.0\n    -1.0\n    0\n    1\n    1\n    Infinity\n    1.0\n    1.0\n    0\n    1\n    -1\n    Infinity\n    1.0\n    1.0\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    \"Integer overflow.\"\n    1\n    9223372036854775807\n    \"Integer overflow.\"\n    true\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/intseq.pcf",
    "content": "facts {\n  [\"equality\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/is.pcf",
    "content": "facts {\n  [\"String\"] {\n    true\n    true\n  }\n  [\"Any\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Null\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Int\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Number\"] {\n    true\n    true\n    true\n  }\n  [\"Float\"] {\n    true\n    true\n    true\n  }\n  [\"Boolean\"] {\n    true\n    true\n    true\n  }\n  [\"Duration\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"DataSize\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"List\"] {\n    true\n    true\n    true\n  }\n  [\"Set\"] {\n    true\n    true\n    true\n  }\n  [\"Collection\"] {\n    true\n    true\n    true\n  }\n  [\"Map\"] {\n    true\n    true\n    true\n  }\n  [\"base class\"] {\n    true\n    true\n    true\n  }\n  [\"derived class\"] {\n    true\n    true\n    true\n  }\n  [\"other class\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"Listing\"] {\n    true\n    true\n    true\n  }\n  [\"Mapping\"] {\n    true\n    true\n    true\n  }\n  [\"Module\"] {\n    true\n    true\n    true\n  }\n  [\"Class\"] {\n    true\n    true\n    true\n  }\n  [\"Function\"] {\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/is2.pcf",
    "content": "facts {\n  [\"List\"] {\n    true\n    true\n    true\n  }\n  [\"Set\"] {\n    true\n    true\n    true\n  }\n  [\"Map\"] {\n    true\n    true\n  }\n  [\"Listing\"] {\n    true\n    true\n  }\n  [\"Mapping\"] {\n    true\n    true\n    true\n  }\n  [\"union type\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"nullable type\"] {\n    true\n    true\n    true\n  }\n  [\"function type\"] {\n    true\n    true\n    true\n  }\n  [\"string literal type\"] {\n    true\n    true\n  }\n  [\"constraint\"] {\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/let.pcf",
    "content": "res1 = 43\nres2 = 43\nres3 = 4\nres4 = 4\nres5 {\n  lowestPrice = 400\n  averagePrice {\n    500\n  }\n  highestPrice {\n    [\"price\"] = 600\n  }\n}\nres6 = \"Pigeon\"\nres7 = \"Pigeon\"\nres8 = 9\nres9 = 9\nres10 = 5\nres11 = List(3, 4, 5, 6, 7)\nres12 {\n  x = 4\n  y = 6\n  z = 6\n}\nres13 = 3\nres14 = \"Cannot find property `y`.\"\nres15 = \"ouch\"\nres16 = \"ouch\"\nres17 = \"ouch\"\nres18 = \"ouch\"\nres19 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/letTyped.pcf",
    "content": "res1 = 43\nres2 = \"Pigeon\"\nres3 = 12.5.min\nres4 = List(\"Pigeon\", true, null)\nres5 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres6 = \"Type constraint `endsWith(\\\"A\\\")` violated. Value: \\\"noegiP\\\"\"\nres7 = \"Type constraint `!isPositive` violated. Value: 2.5\"\nres8 = \"Expected value of type `Null|Boolean|\\\"Pigeon\\\"`, but got type `String`. Value: \\\"Barn Owl\\\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/list.pcf",
    "content": "examples {\n  [\"equality\"] {\n    true\n    false\n    false\n    false\n  }\n  [\"inequality\"] {\n    false\n    true\n    true\n    true\n  }\n  [\"addition\"] {\n    List(1, \"two\", 3, 1, \"two\", 4)\n    List()\n    List(1, \"two\", 3)\n    List(1, \"two\", 4)\n    List(1, \"two\", 3, 1, \"two\", 4)\n    List()\n    List(1, \"two\", 3)\n    List(1, \"two\", 4)\n  }\n  [\"subscript\"] {\n    1\n    \"two\"\n    3\n    \"Element index `-1` is out of range `0`..`2`. Collection: List(1, \\\"two\\\", 3)\"\n    \"Element index `3` is out of range `0`..`2`. Collection: List(1, \\\"two\\\", 3)\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodDynamicBinding.pcf",
    "content": "res1 {\n  x = 1\n  y = 1\n}\nres2 {\n  x = 2\n  y = 2\n}\nres3 {\n  x = 1\n  nested {\n    y = 1\n  }\n}\nres4 {\n  x = 2\n  nested {\n    y = 2\n  }\n}\nres5 {\n  x = 1\n  y = 1\n}\nres6 {\n  x = 2\n  y = 2\n}\nres7 {\n  x = 1\n  nested {\n    y = 1\n  }\n}\nres8 {\n  x = 2\n  nested {\n    y = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodInAmendingModule.pcf",
    "content": "foo {\n  res1 = 43\n  res2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  res3 = 43\n  res4 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  bar {\n    res5 = 44\n    res6 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  c {\n    foo {\n      bar {\n        res7 = 44\n        res8 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodOverride1.pcf",
    "content": "res1 = \"original\"\nres2 = \"original\"\nres3 = \"original\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodOverride2.pcf",
    "content": "res1 = \"original\"\nres2 = \"original\"\nres3 = \"original\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodTyped.pcf",
    "content": "res1 = 1\nres2 = 43\nres3 = 64\nfoo1 {\n  res4 = 1\n  res5 = 43\n  res6 = 64\n  bar1 {\n    res7 = 1\n    res8 = 43\n    res9 = 64\n    baz1 {\n      res10 = 1\n      res11 = 43\n      res12 = 64\n    }\n  }\n}\nfoo2 {\n  res13 = 2\n  res14 = 44\n  res15 = 65\n  bar2 {\n    res16 = 2\n    res17 = 44\n    res18 = 65\n    baz2 {\n      res19 = 2\n      res20 = 44\n      res21 = 65\n    }\n  }\n}\nfoo3 {\n  res22 = 1\n  res23 = 43\n  res24 = 64\n  bar3 {\n    res25 = 3\n    res26 = 45\n    res27 = 66\n    baz3 {\n      res28 = 3\n      res29 = 45\n      res30 = 66\n    }\n  }\n}\nfoo4 {\n  res22 = 1\n  res23 = 43\n  res24 = 64\n  bar4 {\n    res25 = 1\n    res26 = 43\n    res27 = 64\n    baz4 {\n      res28 = 4\n      res29 = 46\n      res30 = 67\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodTyped2.pcf",
    "content": "c {\n  res1 = 1\n  res2 = 43\n  res3 = 64\n  foo1 {\n    res4 = 1\n    res5 = 43\n    res6 = 64\n    bar1 {\n      res7 = 1\n      res8 = 43\n      res9 = 64\n      baz1 {\n        res10 = 1\n        res11 = 43\n        res12 = 64\n      }\n    }\n  }\n  foo2 {\n    res13 = 2\n    res14 = 44\n    res15 = 65\n    bar2 {\n      res16 = 2\n      res17 = 44\n      res18 = 65\n      baz2 {\n        res19 = 2\n        res20 = 44\n        res21 = 65\n      }\n    }\n  }\n  foo3 {\n    res22 = 1\n    res23 = 43\n    res24 = 64\n    bar3 {\n      res25 = 3\n      res26 = 45\n      res27 = 66\n      baz3 {\n        res28 = 3\n        res29 = 45\n        res30 = 66\n      }\n    }\n  }\n  foo4 {\n    res22 = 1\n    res23 = 43\n    res24 = 64\n    bar4 {\n      res25 = 1\n      res26 = 43\n      res27 = 64\n      baz4 {\n        res28 = 4\n        res29 = 46\n        res30 = 67\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodTyped3.pcf",
    "content": "foo {\n  res1 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  res2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  res3 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  bar {\n    res4 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    res5 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    res6 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    baz {\n      res7 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      res8 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      res9 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodTyped4.pcf",
    "content": "c {\n  foo {\n    res1 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    res2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    res3 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n    bar {\n      res4 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      res5 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      res6 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      baz {\n        res7 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n        res8 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n        res9 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodTyped5.pcf",
    "content": "foo {\n  res1 = \"Cannot find type `NonExistingType`.\"\n  res2 = \"Cannot find type `NonExistingType`.\"\n  res3 = \"Cannot find type `NonExistingType`.\"\n  bar {\n    res4 = \"Cannot find type `NonExistingType`.\"\n    res5 = \"Cannot find type `NonExistingType`.\"\n    res6 = \"Cannot find type `NonExistingType`.\"\n    baz {\n      res7 = \"Cannot find type `NonExistingType`.\"\n      res8 = \"Cannot find type `NonExistingType`.\"\n      res9 = \"Cannot find type `NonExistingType`.\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodTyped6.pcf",
    "content": "c {\n  foo {\n    res1 = \"Cannot find type `NonExistingType`.\"\n    res2 = \"Cannot find type `NonExistingType`.\"\n    res3 = \"Cannot find type `NonExistingType`.\"\n    bar {\n      res4 = \"Cannot find type `NonExistingType`.\"\n      res5 = \"Cannot find type `NonExistingType`.\"\n      res6 = \"Cannot find type `NonExistingType`.\"\n      baz {\n        res7 = \"Cannot find type `NonExistingType`.\"\n        res8 = \"Cannot find type `NonExistingType`.\"\n        res9 = \"Cannot find type `NonExistingType`.\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localMethodUntyped.pcf",
    "content": "res1 = 1\nres2 = 43\nres3 = 64\nfoo1 {\n  res4 = 1\n  res5 = 43\n  res6 = 64\n  bar1 {\n    res7 = 1\n    res8 = 43\n    res9 = 64\n    baz1 {\n      res10 = 1\n      res11 = 43\n      res12 = 64\n    }\n  }\n}\nfoo2 {\n  res13 = 2\n  res14 = 44\n  res15 = 65\n  bar2 {\n    res16 = 2\n    res17 = 44\n    res18 = 65\n    baz2 {\n      res19 = 2\n      res20 = 44\n      res21 = 65\n    }\n  }\n}\nfoo3 {\n  res22 = 1\n  res23 = 43\n  res24 = 64\n  bar3 {\n    res25 = 3\n    res26 = 45\n    res27 = 66\n    baz3 {\n      res28 = 3\n      res29 = 45\n      res30 = 66\n    }\n  }\n}\nfoo4 {\n  res22 = 1\n  res23 = 43\n  res24 = 64\n  bar4 {\n    res25 = 1\n    res26 = 43\n    res27 = 64\n    baz4 {\n      res28 = 4\n      res29 = 46\n      res30 = 67\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localModuleMemberOverride1.pcf",
    "content": "p3 = \"original\"\nc1 = \"original\"\nc2 = \"original\"\nc3 = \"original\"\npp1 = \"original\"\npp2 = \"original\"\npp3 = \"original\"\nff1 = \"original\"\nff2 = \"original\"\nff3 = \"original\"\nfoo {\n  c1 = \"original\"\n  c2 = \"original\"\n  c3 = \"original\"\n  pp1 = \"original\"\n  pp2 = \"original\"\n  pp3 = \"original\"\n  ff1 = \"original\"\n  ff2 = \"original\"\n  ff3 = \"original\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localModuleMemberOverride2.pcf",
    "content": "p3 = \"original\"\nc1 = \"original\"\nc2 = \"original\"\nc3 = \"original\"\npp1 = \"original\"\npp2 = \"original\"\npp3 = \"original\"\nff1 = \"original\"\nff2 = \"original\"\nff3 = \"original\"\nfoo {\n  c1 = \"original\"\n  c2 = \"original\"\n  c3 = \"original\"\n  pp1 = \"original\"\n  pp2 = \"original\"\n  pp3 = \"original\"\n  ff1 = \"original\"\n  ff2 = \"original\"\n  ff3 = \"original\"\n}\np2 = \"override\"\nres1 = \"original\"\nres2 = \"original\"\nres3 = \"original\"\nres4 = \"original\"\nres5 = \"original\"\nres6 = \"original\"\nres7 = \"original\"\nres8 = \"original\"\nres9 = \"original\"\nres10 = \"original\"\nres11 = \"original\"\nres12 = \"original\"\nres13 = \"original\"\nres14 = \"original\"\nres15 = \"original\"\nres16 = \"original\"\nres17 = \"original\"\nres18 = \"original\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localProperty1.pcf",
    "content": "foo {\n  bar {\n    baz = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localProperty2.pcf",
    "content": "foo {}\nfooX = \"Cannot find property `x` in object of type `Dynamic`.\"\nbar {\n  y = 3\n}\nbarY = 3\nbarX = \"Cannot find property `x` in object of type `Dynamic`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localPropertyAmendInAmendingModule.err",
    "content": "–– Pkl Error ––\nA local property definition cannot be amended.\n\nx | local object {\n                 ^\nat localPropertyAmendInAmendingModule#object (file:///$snippetsDir/input/basic/localPropertyAmendInAmendingModule.pkl)\n\nUse definition syntax instead, for example `local person = new { ... }` instead of `local person { ... }`.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localPropertyInAmendingModule.pcf",
    "content": "foo {\n  res1 = 42\n  res2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  res3 = 42\n  res4 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  bar {\n    res5 = 42\n    res6 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n  }\n  c {\n    foo {\n      res8 = \"Cannot reference property `y` from here because it is not `const`.\"\n      bar {\n        res9 = 42\n        res10 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localPropertyOverride1.pcf",
    "content": "foo1 {\n  x = \"original\"\n}\nfoo2 {\n  x = \"original\"\n}\nres1 = \"original\"\nfoo3 {\n  x = \"original\"\n}\nfoo4 {\n  x = \"original\"\n  l = \"override\"\n}\nres2 = \"original\"\nfoo5 {\n  l = \"original\"\n  x = \"original\"\n}\nfoo6 {\n  l = \"original\"\n  x = \"original\"\n}\nres3 = \"original\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localPropertyOverride2.pcf",
    "content": "foo1 {\n  bar {\n    x = \"original\"\n  }\n}\nfoo2 {\n  bar {\n    x = \"original\"\n  }\n}\nres1 = \"original\"\nfoo3 {\n  bar {\n    x = \"original\"\n  }\n}\nfoo4 {\n  bar {\n    x = \"original\"\n  }\n  l = \"override\"\n}\nres2 = \"original\"\nfoo5 {\n  l = \"original\"\n  bar {\n    x = \"original\"\n  }\n}\nfoo6 {\n  l = \"original\"\n  bar {\n    x = \"original\"\n  }\n}\nres3 = \"original\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localPropertyOverride3.pcf",
    "content": "foo1 {\n  x = \"original\"\n}\nfoo2 {\n  x = \"original\"\n  y = \"overridden\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localTypedClassMember.pcf",
    "content": "c {\n  res1 = 42\n  res2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\n  res3 = List(\"foo\", \"bar\")\n  res4 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n  res6 {\n    x = 10\n  }\n  res7 = 42\n  res8 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\n  res9 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n  res10 = 2\n  res11 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localTypedModuleMember.pcf",
    "content": "res1 = 42\nres2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\nres3 = List(\"foo\", \"bar\")\nres4 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres6 {\n  x = 10\n}\nres7 = 42\nres8 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\nres9 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres10 = 2\nres11 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/localTypedObjectMember.pcf",
    "content": "foo {\n  res1 = 42\n  res2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\n  res3 = List(\"foo\", \"bar\")\n  res4 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n  res6 {\n    x = 10\n  }\n  res7 = 42\n  res8 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\n  res9 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n  res10 = 2\n  res11 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/map.pcf",
    "content": "facts {\n  [\"equality\"] {\n    true\n    true\n    true\n  }\n  [\"inequality\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"construction\"] {\n    Map(1, 3, 2, 4)\n    Map(1, \"three\", 2, \"four\")\n  }\n  [\"addition\"] {\n    Map(1, 1, \"two\", 2, \"three\", 3)\n    Map(1, 1, \"two\", 2, \"three\", 3)\n    Map(1, 1, \"two\", 2, \"three\", 3, 30, new {\n      name = \"Pigeon\"\n    }, new {\n      name = \"Pigeon\"\n    }, 30)\n    Map()\n    Map(1, 1, \"two\", 2, \"three\", 3)\n    Map(1, 1, \"two\", 2, \"three\", 3)\n    Map(1, 1, 2, 2)\n    Map(1, 11, 2, 2)\n  }\n  [\"subscript\"] {\n    1\n    2\n    3\n    new {\n      name = \"Pigeon\"\n    }\n    30\n    1\n    \"Cannot find key `\\\"hree\\\"`.\"\n    \"Cannot find key `\\\"other\\\"`.\"\n    \"Cannot find key `\\\"1111\\\"`.\"\n    \"Cannot find key `11111`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/minPklVersion.pcf",
    "content": "examples {\n  [\"minPklVersion check\"] {\n    Class1 {}\n    Class2 {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/moduleRef1.pcf",
    "content": "a = 42\nm1 = 42\nfoo {\n  b = 43\n  m2 = 42\n  m3 = 43\n  m4 = 43\n}\nm5 = 42\nm6 {\n  age = 42\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/moduleRef2.pcf",
    "content": "a = 42\naa = 42\nfoo {\n  m1 = 42\n  b = 43\n  m2 = 43\n  m3 = 42\n  m4 {\n    age = 42\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/moduleRef3.pcf",
    "content": "a = 44\naa = 44\nfoo {\n  m3 = 44\n  m4 = 43\n  m5 = 44\n}\nm1 = 44\nb = 43\nm2 = 43\nm6 = 44\nm7 {\n  age = 44\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/moduleRefLibrary.pcf",
    "content": "a = 42\naa = 42\nfoo {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/new.pcf",
    "content": "res1 {\n  name = \"Pigeon\"\n}\nres2 {\n  name = \"Pigeon\"\n}\nres3 {\n  name = \"Pigeon\"\n}\ndynamic {\n  res4 {\n    name = \"Pigeon\"\n  }\n  res5 {\n    name = \"Pigeon\"\n  }\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  new {\n    name = \"Pigeon\"\n  }\n}\nres6 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres7 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres8 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres9 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres10 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres11 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres12 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres13 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres14 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres15 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres16 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres17 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres18 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres19 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres20 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres21 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres24 {\n  name = \"Pigeon\"\n}\nres24b = true\nres25 {\n  name = \"Pigeon\"\n}\nres25b = true\nres26 {\n  name = \"Pigeon\"\n}\nres26b = true\nres27 {\n  name = \"Pigeon\"\n}\nres27b = true\nres28 {\n  name = \"Pigeon\"\n}\nres28b = true\nres29 {\n  name = \"Pigeon\"\n}\nres29b = true\nres30 {\n  name = \"Pigeon\"\n}\nres30b = true\none {\n  two {\n    f1 {\n      name = \"Pigeon\"\n    }\n  }\n}\nres31 {\n  name = \"Other\"\n}\nres32 = \"Expected 1 function arguments but got 2.\"\nres33 {\n  name = \"Override\"\n}\nres34 = \"Expected 1 function arguments but got 2.\"\nres35 {\n  name = \"Other\"\n}\nres36 = \"Expected 1 function arguments but got 2.\"\nres37 = \"Expected value of type `new#Person`, but got type `Int`. Value: 1\"\nres38 {\n  name = \"Override\"\n}\nres39 = \"Expected 1 function arguments but got 2.\"\nres40 = \"Expected value of type `new#Person`, but got type `Int`. Value: 1\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/newInAmendingModuleMethod.pcf",
    "content": "foo = List(new {\n  name = \"Pigeon\"\n  type = \"Person\"\n}, new {\n  name = \"Barn Owl\"\n  type = \"Dynamic\"\n}, new {\n  name = \"Parrot\"\n  type = \"Dynamic\"\n})\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/newInsideIf.pcf",
    "content": "res1 {\n  name = \"Pigeon\"\n}\nres2 {\n  name = \"Pigeon\"\n}\nres3 {\n  name = \"Pigeon\"\n}\ndynamic {\n  res4 {\n    name = \"Pigeon\"\n  }\n  res5 {\n    name = \"Pigeon\"\n  }\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  new {\n    name = \"Pigeon\"\n  }\n}\nres6 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres7 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres8 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres9 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres10 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres11 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres12 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres13 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres14 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres15 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres16 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres17 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres18 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres19 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres20 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres21 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres24 {\n  name = \"Pigeon\"\n}\nres24b = true\nres25 {\n  name = \"Pigeon\"\n}\nres25b = true\nres26 {\n  name = \"Pigeon\"\n}\nres26b = true\nres27 {\n  name = \"Pigeon\"\n}\nres27b = true\nres28 {\n  name = \"Pigeon\"\n}\nres28b = true\nres29 {\n  name = \"Pigeon\"\n}\nres29b = true\nres30 {\n  name = \"Pigeon\"\n}\nres30b = true\none {\n  two {\n    f1 {\n      name = \"Pigeon\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/newInsideLet.pcf",
    "content": "res1 {\n  name = \"Pigeon\"\n}\nres2 {\n  name = \"Pigeon\"\n}\nres3 {\n  name = \"Pigeon\"\n}\ndynamic {\n  res4 {\n    name = \"Pigeon\"\n  }\n  res5 {\n    name = \"Pigeon\"\n  }\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  new {\n    name = \"Pigeon\"\n  }\n}\nres6 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres7 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres8 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres9 {\n  ceo {\n    name = \"Pigeon\"\n  }\n}\nres10 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres11 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres12 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres13 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres14 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres15 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres16 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres17 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres18 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres19 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres20 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres21 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n}\nres24 {\n  name = \"Pigeon\"\n}\nres24b = true\nres25 {\n  name = \"Pigeon\"\n}\nres25b = true\nres26 {\n  name = \"Pigeon\"\n}\nres26b = true\nres27 {\n  name = \"Pigeon\"\n}\nres27b = true\nres28 {\n  name = \"Pigeon\"\n}\nres28b = true\nres29 {\n  name = \"Pigeon\"\n}\nres29b = true\nres30 {\n  name = \"Pigeon\"\n}\nres30b = true\none {\n  two {\n    f1 {\n      name = \"Pigeon\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/newType.pcf",
    "content": "res1 {\n  name = \"Pigeon\"\n}\nres2 {\n  prop {\n    name = \"Pigeon\"\n  }\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  new {\n    name = \"Pigeon\"\n  }\n}\nres3 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres4 {\n  new {\n    name = \"Pigeon\"\n  }\n}\nres5 {\n  new {\n    name = \"Pigeon\"\n  }\n  new {\n    name = \"Barn Owl\"\n  }\n}\nres6 {\n  new {\n    name = \"Pigeon2\"\n  }\n  new {\n    name = \"Barn Owl2\"\n  }\n}\nres7 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n  }\n}\nres8 {\n  [\"Pigeon\"] {\n    name = \"Pigeon2\"\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl2\"\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n  }\n}\nres9 {\n  name = \"Other\"\n}\nres9b = \"Expected 1 function arguments but got 2.\"\nres9c {\n  name = \"Override\"\n}\nres9d = \"Expected 1 function arguments but got 2.\"\nres10 {\n  name = \"Other\"\n}\nres10b = \"Expected 1 function arguments but got 2.\"\nres10c = \"Expected value of type `newType#Person`, but got type `Int`. Value: 1\"\nres10d {\n  name = \"Override\"\n}\nres10e = \"Expected 1 function arguments but got 2.\"\nres10f = \"Expected value of type `newType#Person`, but got type `Int`. Value: 1\"\nres11 {\n  name = \"Pigeon\"\n}\nres12 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n  }\n}\nres13 {\n  name = \"Pigeon\"\n}\nres14 {\n  name = \"Pigeon\"\n}\nres15 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres16 = \"Cannot instantiate, or amend an instance of, external class `Set`.\"\nres17 = \"Cannot instantiate type `String|Person`.\"\nres18 = \"Cannot instantiate, or amend an instance of, external class `String`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/nonNull.pcf",
    "content": "facts {\n  [\"returns its non-null operand\"] {\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"fails if operand is null\"] {\n    \"Expected a non-null value, but got `null`.\"\n    \"Expected a non-null value, but got `null`.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/nullable.pcf",
    "content": "facts {\n  [\"equality\"] {\n    true\n    true\n    true\n  }\n  [\"inequality\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"literal\"] {\n    null\n  }\n  [\"coalescing\"] {\n    2\n    1\n    1\n    3\n    40\n  }\n  [\"null-safe invocation\"] {\n    null\n    \"PIGEON\"\n    null\n    3.kb\n    \"Cannot find property `foo` in object of type `Null`.\"\n    \"Cannot find method `foo` in class `Null`.\"\n  }\n  [\"amendment\"] {\n    new {\n      age = 20\n    }\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/objectMember.pcf",
    "content": "res1 {\n  1\n  2\n  3\n}\nres2 {\n  1\n  2\n  3\n}\nres3 {\n  1\n  2\n  3\n}\nres4 {\n  1\n  2\n  3\n}\nres5 {\n  1\n}\nres6 {\n  1\n  2\n}\nres7 {\n  foo = 1\n}\nres8 {\n  foo = 1\n  bar = 2\n}\nres9 {\n  nested {\n    1\n  }\n}\nres10 {\n  [\"foo\"] = 1\n  [\"bar\"] = 2\n}\nres11 {\n  new {}\n  new {}\n  new {}\n}\nres12 {\n  1.2\n  0.3\n  0.4\n  0.5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/objectMemberInvalid.err",
    "content": "–– Pkl Error ––\nObject members must be separated by whitespace, newline, or semicolon.\nObject entries must be separated by newline or semicolon.\n\nx | 1.2.3\n       ^^\nat objectMemberInvalid#res1 (file:///$snippetsDir/input/basic/objectMemberInvalid.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/objectMemberInvalid2.err",
    "content": "–– Pkl Error ––\nObject members must be separated by whitespace, newline, or semicolon.\nObject entries must be separated by newline or semicolon.\n\nx | res1 {foo=1bar=2}\n               ^^^^^\nat objectMemberInvalid2#res1 (file:///$snippetsDir/input/basic/objectMemberInvalid2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/objectMemberInvalid3.err",
    "content": "–– Pkl Error ––\nObject members must be separated by whitespace, newline, or semicolon.\nObject entries must be separated by newline or semicolon.\n\nx | }new{\n     ^^^^\nat objectMemberInvalid3#res1 (file:///$snippetsDir/input/basic/objectMemberInvalid3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/parens.pcf",
    "content": "res1 = 14\nres2 = 20\nres3 = 14\nres4 = 14\nres5 = 20\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/propertyDefaults.pcf",
    "content": "coll = List()\nlist = List()\nset = Set()\nmap = Map()\nlisting {}\nmapping {}\nobj {}\nnullable = null\nunion {}\nstringLiteral = \"Pigeon\"\nnullish = null\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/rawString.pcf",
    "content": "res1 = \"\\\\r\\\\n\\\\t\\\\\\\\\"\nres2 = \"$foo\"\nres3 = \"\\\\(3 * 4)\"\nres4 = \"\\\\r\\\\n\\\\t\\\\\\\\\"\nres5 = \"$foo\"\nres6 = \"\\\\(3 * 4)\"\nres7 = \"\"\"\n  \\\\r\\\\n\\\\t\\\\\\\\\n  $foo\n  \\\\(3 * 4)\n  \"\"\"\nres9 = \"leading and trailing newline trimmed\"\nres10 = \"\"\"\n  \n  leading newline not trimmed\n  \"\"\"\nres11 = \"\"\"\n  \n  \n  \n  leading newlines not trimmed\n  \"\"\"\nres13 = \"\"\"\n  trailing newline not trimmed\n  \n  \"\"\"\nres14 = \"\"\"\n  trailing newlines not trimmed\n  \n  \n  \n  \"\"\"\nres16 = \"\"\"\n  leading\n  whitespace\n  trimmed\n  \"\"\"\nres17 = \"\"\"\n    leading\n    whitespace\n    partially\n    trimmed\n  \"\"\"\nres18 = \"\"\"\n  leading\n    whitespace\n      partially\n        trimmed\n  \"\"\"\nres19 = \"\\\"AS IS\\\"\"\nres20 = \"\\\"\\\"AS IS\\\"\\\"\"\nres21 = \"\\\"\\\"\\\"\\\"\\\"AS IS\\\"\\\"\\\"\\\"\\\"\"\nres22 = \"\\\"AS IS\\\"\"\nres23 = \"\\\"\\\"AS IS\\\"\\\"\"\nres24 = \"\\\"\\\"\\\"\\\"\\\"AS IS\\\"\\\"\\\"\\\"\\\"\"\nres25 = \"# ## ### \\\" \\\"\\\" \\\"\\\"\\\" \\\\ \\\\#\"\nres26 = \"# ## ### #### \\\" \\\"\\\" \\\"\\\"\\\" \\\"\\\"\\\"\\\" \\\\ \\\\# \\\\##\"\nres27 = \"# ## ### #### ##### ###### \\\" \\\"\\\" \\\"\\\"\\\" \\\"\\\"\\\"\\\" \\\"\\\"\\\"\\\"\\\" \\\\ \\\\# \\\\## \\\\### \\\\####\"\nres28 = \"onetwothreetwoonetwo\"\nres29 = \"\\t \\t\\t \\t\\t\\t \\t\\t \\t \\t\\t\"\nres30 = \"a 🤠 ǝ\"\nres31 = \"a 🤠 ǝ\"\nres32 = \"# ## ### \\\" \\\"\\\" \\\"\\\"\\\" \\\\ \\\\#\"\nres33 = \"# ## ### #### \\\" \\\"\\\" \\\"\\\"\\\" \\\"\\\"\\\"\\\" \\\\ \\\\# \\\\##\"\nres34 = \"# ## ### #### ##### ###### \\\" \\\"\\\" \\\"\\\"\\\" \\\"\\\"\\\"\\\" \\\"\\\"\\\"\\\"\\\" \\\\ \\\\# \\\\## \\\\### \\\\####\"\nres35 = \"onetwothreetwoonetwo\"\nres36 = \"\\t \\t\\t \\t\\t\\t \\t\\t \\t \\t\\t\"\nres37 = \"a 🤠 ǝ\"\nres38 = \"a 🤠 ǝ\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/read.pcf",
    "content": "examples {\n  [\"read env variable\"] {\n    \"value1\"\n    \"value2\"\n    \"Cannot find resource `env:OTHER`.\"\n    \"value1\"\n    \"value2\"\n    null\n  }\n  [\"read external property\"] {\n    \"value1\"\n    \"value2\"\n    \"Cannot find resource `prop:other`.\"\n    \"value1\"\n    \"value2\"\n    null\n  }\n  [\"read file\"] {\n    new {\n      uri = \"file:///$snippetsDir/input/basic/globtest/file1.txt\"\n      text = \"\"\"\n        file1\n        \n        \"\"\"\n      base64 = \"ZmlsZTEK\"\n    }\n    \"Cannot find resource `other.txt`.\"\n    new {\n      uri = \"file:///$snippetsDir/input/basic/globtest/file1.txt\"\n      text = \"\"\"\n        file1\n        \n        \"\"\"\n      base64 = \"ZmlsZTEK\"\n    }\n    null\n  }\n  [\"read triple-dot file\"] {\n    new {\n      uri = \"file:///$snippetsDir/input-helper/basic/read/resource.txt\"\n      text = \"\"\"\n        resource\n        \n        \"\"\"\n      base64 = \"cmVzb3VyY2UK\"\n    }\n    new {\n      uri = \"file:///$snippetsDir/input-helper/basic/read/resource.txt\"\n      text = \"\"\"\n        resource\n        \n        \"\"\"\n      base64 = \"cmVzb3VyY2UK\"\n    }\n  }\n  [\"read non-allowed resource\"] {\n    \"Refusing to read resource `forbidden:resource` because it does not match any entry in the resource allowlist (`--allowed-resources`).\"\n    \"Refusing to read resource `forbidden:resource` because it does not match any entry in the resource allowlist (`--allowed-resources`).\"\n  }\n  [\"use read expression with non-constant resource URI\"] {\n    new {\n      uri = \"file:///$snippetsDir/input/basic/globtest/file1.txt\"\n      text = \"\"\"\n        file1\n        \n        \"\"\"\n      base64 = \"ZmlsZTEK\"\n    }\n    new {\n      uri = \"file:///$snippetsDir/input/basic/globtest/file2.txt\"\n      text = \"\"\"\n        file2\n        \n        \"\"\"\n      base64 = \"ZmlsZTIK\"\n    }\n  }\n  [\"read different resources with same relative resource URI\"] {\n    new {\n      uri = \"file:///$snippetsDir/input-helper/basic/read/resource.txt\"\n      text = \"\"\"\n        resource\n        \n        \"\"\"\n      base64 = \"cmVzb3VyY2UK\"\n    }\n    new {\n      uri = \"file:///$snippetsDir/input-helper/basic/read/child/resource.txt\"\n      text = \"\"\"\n        child resource\n        \n        \"\"\"\n      base64 = \"Y2hpbGQgcmVzb3VyY2UK\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/readGlob.pcf",
    "content": "examples {\n  [\"file:\"] {\n    new {\n      [\"../../input-helper/globtest/module with [weird] ~!characters.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/module%20with%20%5Bweird%5D%20~!characters.pkl\"\n        text = \"\"\n        base64 = \"\"\n      }\n      [\"../../input-helper/globtest/moduleA.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/moduleA.pkl\"\n        text = \"\"\"\n          name = \"moduleA\"\n          \n          \"\"\"\n        base64 = \"bmFtZSA9ICJtb2R1bGVBIgo=\"\n      }\n      [\"../../input-helper/globtest/moduleB.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/moduleB.pkl\"\n        text = \"\"\"\n          name = \"moduleB\"\n          \n          \"\"\"\n        base64 = \"bmFtZSA9ICJtb2R1bGVCIgo=\"\n      }\n      [\"../../input-helper/globtest/child/moduleC.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/child/moduleC.pkl\"\n        text = \"\"\"\n          name = \"child/moduleC\"\n          \n          \"\"\"\n        base64 = \"bmFtZSA9ICJjaGlsZC9tb2R1bGVDIgo=\"\n      }\n    }\n    new {\n      [\"globtest/file1.txt\"] {\n        uri = \"file:///$snippetsDir/input/basic/globtest/file1.txt\"\n        text = \"\"\"\n          file1\n          \n          \"\"\"\n        base64 = \"ZmlsZTEK\"\n      }\n      [\"globtest/file2.txt\"] {\n        uri = \"file:///$snippetsDir/input/basic/globtest/file2.txt\"\n        text = \"\"\"\n          file2\n          \n          \"\"\"\n        base64 = \"ZmlsZTIK\"\n      }\n    }\n  }\n  [\"amended\"] {\n    new {\n      [\"../../input-helper/globtest/module with [weird] ~!characters.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/module%20with%20%5Bweird%5D%20~!characters.pkl\"\n        text = \"hi\"\n        base64 = \"\"\n      }\n      [\"../../input-helper/globtest/moduleA.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/moduleA.pkl\"\n        text = \"hi\"\n        base64 = \"bmFtZSA9ICJtb2R1bGVBIgo=\"\n      }\n      [\"../../input-helper/globtest/moduleB.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/moduleB.pkl\"\n        text = \"hi\"\n        base64 = \"bmFtZSA9ICJtb2R1bGVCIgo=\"\n      }\n      [\"../../input-helper/globtest/child/moduleC.pkl\"] {\n        uri = \"file:///$snippetsDir/input-helper/globtest/child/moduleC.pkl\"\n        text = \"hi\"\n        base64 = \"bmFtZSA9ICJjaGlsZC9tb2R1bGVDIgo=\"\n      }\n    }\n  }\n  [\"env:\"] {\n    new {\n      [\"env:NAME1\"] = \"value1\"\n      [\"env:NAME2\"] = \"value2\"\n      [\"env:foo%20bar\"] = \"foo bar\"\n    }\n    new {\n      [\"env:/foo/bar\"] = \"foobar\"\n      [\"env:NAME1\"] = \"value1\"\n      [\"env:NAME2\"] = \"value2\"\n      [\"env:file:///foo/bar\"] = \"file:///foo/bar\"\n      [\"env:foo%20bar\"] = \"foo bar\"\n    }\n    new {\n      [\"env:NAME1\"] = \"value1\"\n    }\n    new {\n      [\"env:NAME1\"] = \"value1\"\n      [\"env:NAME2\"] = \"value2\"\n    }\n    new {\n      [\"env:NAME2\"] = \"value2\"\n    }\n    new {\n      [\"env:/foo/bar\"] = \"foobar\"\n    }\n    new {\n      [\"env:foo%20bar\"] = \"foo bar\"\n    }\n    new {\n      [\"env:foo%20bar\"] = \"foo bar\"\n    }\n  }\n  [\"prop:\"] {\n    new {\n      [\"prop:name1\"] = \"value1\"\n      [\"prop:name2\"] = \"value2\"\n    }\n    new {\n      [\"prop:/foo/bar\"] = \"foobar\"\n      [\"prop:name1\"] = \"value1\"\n      [\"prop:name2\"] = \"value2\"\n    }\n  }\n  [\"package:\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/Bird.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\n        text = \"\"\"\n          open module birds.Bird\n          \n          import \"@fruities/Fruit.pkl\"\n          \n          name: String\n          \n          favoriteFruit: Fruit\n          \n          \"\"\"\n        base64 = \"b3BlbiBtb2R1bGUgYmlyZHMuQmlyZAoKaW1wb3J0ICJAZnJ1aXRpZXMvRnJ1aXQucGtsIgoKbmFtZTogU3RyaW5nCgpmYXZvcml0ZUZydWl0OiBGcnVpdAo=\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/allFruit.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/allFruit.pkl\"\n        text = \"\"\"\n          module birds.allFruit\n          \n          fruit = import*(\"@fruities/catalog/*.pkl\")\n          fruitFiles = read*(\"@fruities/catalog/*.pkl\")\n          \n          \"\"\"\n        base64 = \"bW9kdWxlIGJpcmRzLmFsbEZydWl0CgpmcnVpdCA9IGltcG9ydCooIkBmcnVpdGllcy9jYXRhbG9nLyoucGtsIikKZnJ1aXRGaWxlcyA9IHJlYWQqKCJAZnJ1aXRpZXMvY2F0YWxvZy8qLnBrbCIpCg==\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog.pkl\"\n        text = \"\"\"\n          module birds.catalog\n          \n          catalog = import*(\"catalog/*.pkl\")\n          catalogFiles = read*(\"catalog/*.pkl\")\n          \n          \"\"\"\n        base64 = \"bW9kdWxlIGJpcmRzLmNhdGFsb2cKCmNhdGFsb2cgPSBpbXBvcnQqKCJjYXRhbG9nLyoucGtsIikKY2F0YWxvZ0ZpbGVzID0gcmVhZCooImNhdGFsb2cvKi5wa2wiKQo=\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/some/dir/Bird.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/some/dir/Bird.pkl\"\n        text = \"\"\"\n          amends \"...\"\n          \n          name = \"Bird\"\n          \n          favoriteFruit {\n            name = \"Fruit\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi4iCgpuYW1lID0gIkJpcmQiCgpmYXZvcml0ZUZydWl0IHsKICBuYW1lID0gIkZydWl0Igp9Cg==\"\n      }\n    }\n  }\n  [\"use read expression with non-constant glob pattern\"] {\n    new {\n      [\"globtest/file1.txt\"] {\n        uri = \"file:///$snippetsDir/input/basic/globtest/file1.txt\"\n        text = \"\"\"\n          file1\n          \n          \"\"\"\n        base64 = \"ZmlsZTEK\"\n      }\n      [\"globtest/file2.txt\"] {\n        uri = \"file:///$snippetsDir/input/basic/globtest/file2.txt\"\n        text = \"\"\"\n          file2\n          \n          \"\"\"\n        base64 = \"ZmlsZTIK\"\n      }\n    }\n    new {\n      [\"globtest/file1.txt\"] {\n        uri = \"file:///$snippetsDir/input/basic/globtest/file1.txt\"\n        text = \"\"\"\n          file1\n          \n          \"\"\"\n        base64 = \"ZmlsZTEK\"\n      }\n    }\n    new {\n      [\"globtest/file2.txt\"] {\n        uri = \"file:///$snippetsDir/input/basic/globtest/file2.txt\"\n        text = \"\"\"\n          file2\n          \n          \"\"\"\n        base64 = \"ZmlsZTIK\"\n      }\n    }\n  }\n  [\"read different resources with same glob pattern\"] {\n    new {\n      [\"resource.txt\"] {\n        uri = \"file:///$snippetsDir/input-helper/basic/read/resource.txt\"\n        text = \"\"\"\n          resource\n          \n          \"\"\"\n        base64 = \"cmVzb3VyY2UK\"\n      }\n    }\n    new {\n      [\"resource.txt\"] {\n        uri = \"file:///$snippetsDir/input-helper/basic/read/child/resource.txt\"\n        text = \"\"\"\n          child resource\n          \n          \"\"\"\n        base64 = \"Y2hpbGQgcmVzb3VyY2UK\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/semicolon.pcf",
    "content": "res1 {\n  b = 1\n  d = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/set.pcf",
    "content": "facts {\n  [\"equality\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n  [\"inequality\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"construction\"] {\n    Set(1, 2, 3, 4)\n  }\n  [\"addition\"] {\n    Set(1, \"two\", 3)\n    Set(1, \"two\", 3)\n    Set(1, \"two\", 3, 4)\n    Set(1, \"two\", 3)\n    Set(1, \"two\", 3)\n    Set(1, \"two\", 3, 4)\n    Set(1, \"two\", 3, 4)\n    Set()\n    Set(1, \"two\", 3)\n    Set(1, \"two\", 4)\n    Set()\n    Set(1, \"two\", 3)\n    Set(1, \"two\", 4)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/string.pcf",
    "content": "examples {\n  [\"equality\"] {\n    true\n    false\n  }\n  [\"inequality\"] {\n    false\n    true\n  }\n  [\"interpolation\"] {\n    \"How are you today? Are you hungry?\"\n    \"Can you nest this for me?\"\n    \"Is Howyou a word?\"\n    \"Is soma a word?\"\n    \"Can you nest ((( for me?\"\n    \"Can you nest ))) for me?\"\n    \"Can you nest this for me?\"\n  }\n  [\"interpolation of different types\"] {\n    \"42\"\n    \"1.23\"\n    \"Pigeon\"\n    \"false\"\n    \"1.23.ns\"\n    \"1.23.mb\"\n    \"Pair(1, 2)\"\n    \"List(1, 2, 3)\"\n    \"Set(1, 2, 3)\"\n    \"Map(1, 2, 3, 4)\"\n    \"new Listing { 1; 2; 3 }\"\n    \"new Mapping { [\\\"Pigeon\\\"] = 42; [\\\"Barn Owl\\\"] = 21 }\"\n    \"new Dynamic { name = \\\"Pigeon\\\"; age = 42 }\"\n    \"new Person { name = \\\"Pigeon\\\"; age = 42 }\"\n    \"My name is Pigeon and I'm 42 years old.\"\n    \"null\"\n    \"null\"\n    \"new Function0 {}\"\n    \"new Function1 {}\"\n    \"new Function2 {}\"\n    \"new Function3 {}\"\n  }\n  [\"escaping\"] {\n    \"\\\\\\\"\\\\(\"\n    \"\"\"\n    \\t\\r\n    \n    \"\"\"\n    \"\\t0Āက𐀀𐀀𐀀𐀀\"\n  }\n  [\"subscript\"] {\n    \"i\"\n    \"Character index `-1` is out of range `0`..`3`. String: \\\"this\\\"\"\n    \"Character index `4` is out of range `0`..`3`. String: \\\"this\\\"\"\n  }\n  [\"dollar sign has no special meaning\"] {\n    \"123$\"\n    \"$123\"\n    \"$&%\"\n    \"$\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/stringError1.err",
    "content": "–– Pkl Error ––\nMissing `\"` delimiter.\n\nx | singleLineStringCannotSpanLines = \"\n                                       ^\nat stringError1 (file:///$snippetsDir/input/basic/stringError1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/stringMultiline.pcf",
    "content": "examples {\n  [\"interpolation\"] {\n    \"\"\"\n    How are you today?\n    Are you hungry?\n    \n    Can you nest this for me?\n    \"\"\"\n  }\n  [\"escaping\"] {\n    \"\\\\\\\"\\\\(\"\n    \"\"\"\n    \\t\\r\n    \n    \"\"\"\n    \"\\t0Āက𐀀𐀀𐀀𐀀\"\n  }\n  [\"dollar sign has no special meaning\"] {\n    \"123$ $123 $&% $\"\n  }\n  [\"trimming of leading and trailing newlines\"] {\n    \"leading and trailing newline trimmed\"\n    \"\"\"\n    \n    leading newline not trimmed\n    \"\"\"\n    \"\"\"\n    \n    \n    \n    leading newlines not trimmed\n    \"\"\"\n    \"\"\"\n    trailing newline not trimmed\n    \n    \"\"\"\n    \"\"\"\n    trailing newlines not trimmed\n    \n    \n    \n    \"\"\"\n  }\n  [\"trimming of leading whitespace\"] {\n    \"\"\"\n    leading\n    whitespace\n    trimmed\n    \"\"\"\n    \"\"\"\n      leading\n      whitespace\n      partially\n      trimmed\n    \"\"\"\n    \"\"\"\n    leading\n      whitespace\n        partially\n          trimmed\n    \"\"\"\n  }\n  [\"quotes\"] {\n    \"\\\"AS IS\\\"\"\n    \"\\\"\\\"AS IS\\\"\\\"\"\n    \"\\\"AS IS\\\"\"\n    \"\\\"\\\"AS IS\\\"\\\"\"\n    \"\"\"\n    trailing newline not trimmed (trailing quotes)\n    \"\"\n    \"\"\"\n    \"\"\"\n    trailing newline with interpolated string not trimmed (trailing quotes)\n    \"\"\n    \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/stringUnicode.pcf",
    "content": "facts {\n  [\"equality\"] {\n    true\n    true\n  }\n  [\"inequality\"] {\n    true\n    true\n  }\n}\nexamples {\n  [\"interpolation\"] {\n    \"😈👿👾 are 🤑🤓😎 today? Are 🤑🤓😎 hungry?\"\n    \"Can 🤑🤓😎 nest 🙈🙉🙊🐒 for me?\"\n    \"Is 😈👿👾🤑🤓😎 a word?\"\n    \"Is soma a word?\"\n    \"Can 🤑🤓😎 nest ((( for me?\"\n    \"Can 🤑🤓😎 nest ))) for me?\"\n    \"Can you nest 🙈🙉🙊🐒 for me?\"\n  }\n  [\"multiline interpolation\"] {\n    \"\"\"\n    How are you today?\n    Are 🤑🤓😎 hungry?\n    \n    Can you nest 🙈🙉🙊🐒 for me?\n    \"\"\"\n  }\n  [\"subscript\"] {\n    \"🙊\"\n    \"Character index `-1` is out of range `0`..`3`. String: \\\"🙈🙉🙊🐒\\\"\"\n    \"Character index `4` is out of range `0`..`3`. String: \\\"🙈🙉🙊🐒\\\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/trace.err",
    "content": "examples {\n  [\"trace different values\"] {\n    1\n    true\n    \"Barn Owl\"\n    \"\"\"\n    Bird\n    Barn Owl\n    \"\"\"\n    List(1, 2, 3)\n    Set(1, 2, 3)\n    Map(1, \"one\", 2, \"two\")\n    new {\n      name = \"Barn Owl\"\n      age = 42\n    }\n    new {\n      \"Parrot\"\n      \"Barn Owl\"\n      \"Pigeon\"\n    }\n    new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 42\n      }\n    }\n  }\n}\npkl: TRACE: 1 = 1 (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: true = true (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: \"Barn Owl\" = \"Barn Owl\" (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: \"\"\"\n      Bird\n      Barn Owl\n      \"\"\" = \"Bird\\nBarn Owl\" (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: List(1, 2, 3) = List(1, 2, 3) (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: Set(1, 2, 3) = Set(1, 2, 3) (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: Map(1, \"one\", 2, \"two\") = Map(1, \"one\", 2, \"two\") (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: new {\n      name = \"Barn Owl\"\n      age = 42\n    } = new Dynamic { name = \"Barn Owl\"; age = 42 } (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: new {\n      \"Parrot\"\n      \"Barn Owl\"\n      \"Pigeon\"\n    } = new Dynamic { \"Parrot\"; \"Barn Owl\"; \"Pigeon\" } (file:///$snippetsDir/input/basic/trace.pkl)\npkl: TRACE: new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 42\n      }\n    } = new Dynamic { [\"Parrot\"] { name = \"Parrot\"; age = 42 } } (file:///$snippetsDir/input/basic/trace.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/typeResolution1.pcf",
    "content": "p1 {\n  name = \"person1\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/typeResolution2.pcf",
    "content": "p1 {\n  name = \"person1\"\n}\npp1 {\n  name = \"person1\"\n}\npp2 {\n  name = \"person2\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/typeResolution3.pcf",
    "content": "p1 {\n  name = \"person1\"\n}\npp1 {\n  name = \"person1\"\n}\npp2 {\n  name = \"person2\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/typeResolution4.pcf",
    "content": "res1 {\n  name = \"person1\"\n}\nres2 {\n  name = \"person1\"\n}\nres3 {\n  name = \"person2\"\n}\nres4 {\n  name = \"person1\"\n}\nres5 {\n  name = \"person2\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/basic/underscore.pcf",
    "content": "l1 = 3\nf1 = 11\nfoo {\n  0\n  0\n}\nfoo2 {\n  0\n  0\n}\nbar {\n  [\"a1\"] = 1\n  [\"b1\"] = 1\n  [\"a2\"] = 2\n  [\"b2\"] = 2\n}\nbaz {\n  [\"aa\"] = \"a\"\n  [\"ab\"] = \"a\"\n  [\"ba\"] = \"b\"\n  [\"bb\"] = \"b\"\n}\nqux {\n  [\"11\"] = 2\n  [\"12\"] = 3\n  [\"21\"] = 3\n  [\"22\"] = 4\n}\nbird1 {\n  bird {\n    name = \"Swallow\"\n    age = 2\n  }\n}\nbird2 {\n  bird {\n    name = \"Robin\"\n    age = 3\n  }\n}\nvar = 0\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/class1.pcf",
    "content": "pigeon {\n  name = \"Pigeon Who\"\n  age = 40\n}\npigeonName = \"Pigeon Who\"\npigeonAge = 40\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/class2.pcf",
    "content": "pigeon {\n  name = \"Pigeon Who\"\n  age = 30\n  friends = List(new {\n    name = \"Emma\"\n    age = 40\n    friends = List()\n    address {\n      street = \"Howdy St\"\n    }\n  }, new {\n    name = \"Tony\"\n    age = 40\n    friends = List()\n    address {\n      street = \"Howdy St\"\n    }\n  })\n  address {\n    street = \"Pigeon St.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/class2a.pcf",
    "content": "pigeon {\n  name = \"Pigeon Who\"\n  age = 30\n  friends = Set(new {\n    name = \"Emma\"\n    age = 40\n    friends = Set()\n    address {\n      street = \"Howdy St\"\n    }\n  })\n  address {\n    street = \"Pigeon St.\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/class3.err",
    "content": "–– Pkl Error ––\nCannot find property `address_` in object of type `class3#Person`.\n\nxx | address_ = \"Howdy St.\"\n     ^^^^^^^^\nat class3#person (file:///$snippetsDir/input/classes/class3.pkl)\n\nDid you mean any of the following?\naddress\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/class4.pcf",
    "content": "res1 = \"Cannot find property `foo` in object of type `Class`.\"\nres2 = \"Cannot find method `bar` in class `Class`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints1.pcf",
    "content": "res1 {\n  name = \"Linda Forth\"\n}\nres2 = \"Type constraint `length.isBetween(10, 20)` violated. Value: \\\"Pigeon\\\"\"\nres3 {\n  alternativeNames {\n    \"Parrot\"\n  }\n}\nres4 = \"Type constraint `!isEmpty` violated. Value: new Listing {}\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints10.pcf",
    "content": "res1 {\n  a = \"one.two\"\n}\nres2 {\n  a = \"five.six\"\n}\nres3 = \"Type constraint `length >= 5` violated. Value: \\\"n.o\\\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints11.pcf",
    "content": "res1 {\n  x = 1\n  y = 2\n  yy = 2\n  yyy = 2\n}\nres2 {\n  x = 1\n  y = 3\n  yy = 3\n  yyy = 3\n}\nres3 {\n  x = 2\n  y = 3\n  yy = 3\n  yyy = 3\n}\nres4 = \"Type constraint `this > x` violated. Value: 0\"\nres5 = \"Type constraint `isValid1` violated. Value: 0\"\nres6 = \"Type constraint `isValid2` violated. Value: 0\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints12.pcf",
    "content": "res1 {\n  x = 1\n  y = 2\n  yy = 2\n  yyy = 2\n}\nres2 {\n  x = 1\n  y = 3\n  yy = 3\n  yyy = 3\n}\nres3 {\n  x = 2\n  y = 3\n  yy = 3\n  yyy = 3\n}\nres4 = \"Type constraint `this > super.x` violated. Value: 0\"\nres5 = \"Type constraint `isValid1` violated. Value: 0\"\nres6 = \"Type constraint `isValid2` violated. Value: 0\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints13.pcf",
    "content": "res = \"Expected value of type `constraints13#Bird`, but got type `Int`. Value: 1\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints14.pcf",
    "content": "myClass {\n  emails {\n    \"foo@bar.com\"\n  }\n}\nothers {\n  new {\n    myClass {\n      emails {\n        \"baz@bar.com\"\n      }\n    }\n    others {}\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints2.pcf",
    "content": "res1 {\n  age = 30\n}\nres2 = \"Type constraint `this > 0` violated. Value: -30\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints3.pcf",
    "content": "res1 {\n  address {\n    street = \"Hampton St.\"\n  }\n}\nres2 = \"Type constraint `street.endsWith(\\\"St.\\\")` violated. Value: new Address { street = \\\"Garlic Blvd.\\\" }\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints4.pcf",
    "content": "res1 {\n  min = 4\n  max = 6\n}\nres2 = \"Type constraint `this >= min` violated. Value: 3\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints5.err",
    "content": "–– Pkl Error ––\nType constraint `this >= min` violated.\nValue: 3\n\n    this >= min\n    │    │  │\n    3    │  4\n         false\n\nx | max: Int(this >= min)\n             ^^^^^^^^^^^\nat constraints5#Gauge.max (file:///$snippetsDir/input/classes/constraints5.pkl)\n\nxx | max = 3\n           ^\nat constraints5#res2.max (file:///$snippetsDir/input/classes/constraints5.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints6.pcf",
    "content": "res1 {\n  y = 99\n}\nres2 {\n  y = -99\n}\nres3 = \"Type constraint `abs < 100` violated. Value: -100\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints7.pcf",
    "content": "res1 {\n  y {\n    z = 12\n  }\n}\nres2 = \"Type constraint `multiply(subtract(add(5, 4), 3), 2) == z` violated. Value: new Y { z = 13 }\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints8.pcf",
    "content": "res1 {\n  a = 6\n  b = 11\n}\nres2 = \"Type constraint `isGreaterThan(5)` violated. Value: 5\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraints9.pcf",
    "content": "res1 = \"Expected value of type `Boolean` or `Function`, but got type `String`. Value: \\\"not a boolean\\\"\"\nres2 = \"Expected value of type `Boolean`, but got type `String`. Value: \\\"not a boolean\\\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/constraintsLambdaThis.pcf",
    "content": "res1 = \"abc\"\nres2 = \"abc\"\nres3 = \"abc\"\nres4 = \"abc\"\nres5 = \"abc\"\nres6 = \"abc\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/duplicateFunction.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `foo`.\n\nx | function foo(arg): String = \"foo\" // duplicate\n    ^^^^^^^^^^^^^^^^^^^^^^^^^\nat duplicateFunction#Person (file:///$snippetsDir/input/classes/duplicateFunction.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/duplicateProperty.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `foo`.\n\nx | foo: String // duplicate\n    ^^^^^^^^^^^\nat duplicateProperty#Person (file:///$snippetsDir/input/classes/duplicateProperty.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/equality.pcf",
    "content": "res1 = true\nres2 = false\nres3 = true\nres4 = true\nres5 = true\nres6 = false\nres7 = false\nres8 = true\nres9 = false\nres10 = false\nres11 = false\nres12 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/externalClass.err",
    "content": "–– Pkl Error ––\nExternal members can only be defined by standard library modules.\n\nx | external class Foo\n    ^^^^^^^^\nat externalClass (file:///$snippetsDir/input/classes/externalClass.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/externalFunction.err",
    "content": "–– Pkl Error ––\nExternal members can only be defined by standard library modules.\n\nx | external function bar()\n    ^^^^^^^^\nat externalFunction#Foo (file:///$snippetsDir/input/classes/externalFunction.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/externalProperty.err",
    "content": "–– Pkl Error ––\nExternal members can only be defined by standard library modules.\n\nx | external bar: String\n    ^^^^^^^^\nat externalProperty#Foo (file:///$snippetsDir/input/classes/externalProperty.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/functions1.pcf",
    "content": "b = 2\nres1 = 24\nres2 = 30\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/functions2.pcf",
    "content": "a = 1\nres1 = 2\nres2 = 3\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/functions3.pcf",
    "content": "res1 = 24\nres2 = 30\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/functions4.pcf",
    "content": "res1 = 9\nres2 = 12\nres3 = 20\nres4 = 24\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/inheritance1.pcf",
    "content": "res1 {\n  name = \"Pigeon\"\n  subjects = List(\"Rocks\", \"Stone Age\")\n}\nres2 {\n  name = \"Parrot\"\n  subjects = List(\"Rocks\", \"Stone Age\")\n}\nres3 {\n  name = \"Parrot\"\n  subjects = List(\"Fire Making\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/inheritance2.pcf",
    "content": "res1 {\n  name = \"Pigeon\"\n  subjects = List(\"Rocks\", \"Stone Age\")\n}\nres2 {\n  name = \"Parrot\"\n  subjects = List(\"Rocks\", \"Stone Age\")\n}\nres3 {\n  name = \"Parrot\"\n  subjects = List(\"Fire Making\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/inheritanceError1.err",
    "content": "–– Pkl Error ––\nCannot extend non-open class `inheritanceError1#Base`.\n\nx | class Derived extends Base\n                          ^^^^\nat inheritanceError1#Derived (file:///$snippetsDir/input/classes/inheritanceError1.pkl)\n\nBy default, classes are closed for extension.\nTo make a class extensible, add an `open` modifier: `open class MyClass { ... }`\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/invalidInstantiation1.err",
    "content": "–– Pkl Error ––\nCannot instantiate, or amend an instance of, external class `String`.\n\nx | res1 = new String {}\n               ^^^^^^\nat invalidInstantiation1#res1 (file:///$snippetsDir/input/classes/invalidInstantiation1.pkl)\n\nTo create an instance of an external class, use its literal syntax or constructor method.\nExamples:\n* `123` uses literal syntax to create an instance of class `Int`.\n* `Pair(1, 2)` uses the `Pair()` constructor method to create an instance of class `Pair`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/invalidInstantiation2.err",
    "content": "–– Pkl Error ––\nCannot instantiate abstract class `invalidInstantiation2#Base`.\n\nx | res1 = new Base {}\n               ^^^^\nat invalidInstantiation2#res1 (file:///$snippetsDir/input/classes/invalidInstantiation2.pkl)\n\nAbstract classes cannot be instantiated.\nInstead, instantiate a concrete subclass.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/lambdaConstraints1.pcf",
    "content": "res1 {}\nres2 = \"Expected value of type `Function0`, but got type `Function1`. Value: new Function1 {}\"\nres3 = \"Expected value of type `Function1`, but got type `Function0`. Value: new Function0 {}\"\nres4 = \"Expected value of type `Function2`, but got type `Function1`. Value: new Function1 {}\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/listConstraints1.pcf",
    "content": "res1 {\n  xs = List(1, 2, 3)\n  ys = List(-1, -2, -3)\n  zs = List(-1, -2, -3, -4, -5)\n}\nres1b {\n  ys = List(-1, -2, -3)\n}\nres2 = \"Expected value of type `List`, but got type `String`. Value: \\\"one\\\"\"\nres3 = \"Expected value of type `Int`, but got type `String`. Value: \\\"one\\\"\"\nres4 = \"Type constraint `this < 0` violated. Value: 1\"\nres4b = \"Type constraint `every((it) -> it is Int(this < 0))` violated. Value: List(1, 2, 3)\"\nres5 = \"Type constraint `length >= 5` violated. Value: List(-1, -2, -3)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/mapConstraints1.pcf",
    "content": "res1 {\n  xs = Map(\"one\", 1, \"two\", 2, \"three\", 3)\n  ys = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3)\n  zs = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3, \"-four\", -4, \"-five\", -5)\n}\nres1b {\n  ys = Map(\"-one\", -1, \"-two\", -2, \"-three\", -3)\n}\nres2 = \"Expected value of type `Map`, but got type `String`. Value: \\\"numbers\\\"\"\nres3 = \"Expected value of type `Int`, but got type `String`. Value: \\\"one\\\"\"\nres4 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres5 = \"Type constraint `this < 0` violated. Value: 1\"\nres5b = \"Type constraint `every((key, value) -> key is String(!isEmpty) && value is Int(this < 0))` violated. Value: Map(\\\"one\\\", 1, \\\"two\\\", 2, \\\"three\\\", 3)\"\nres6 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres6b = \"Type constraint `every((key, value) -> key is String(!isEmpty) && value is Int(this < 0))` violated. Value: Map(\\\"\\\", -1, \\\"-two\\\", -2, \\\"-three\\\", -3)\"\nres7 = \"Type constraint `length >= 5` violated. Value: Map(\\\"-one\\\", -1, \\\"-two\\\", -2, \\\"-three\\\", -3)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/nullableTypes.pcf",
    "content": "res1 {\n  a = \"a\"\n  b = List(\"b\")\n  c = List(\"c\")\n  d = List(\"d\")\n}\nres2 {\n  a = null\n  b = List(null)\n  c = null\n  d = List(null)\n}\nres3 = \"Expected value of type `List`, but got `null`.\"\nres4 = \"Expected value of type `String`, but got `null`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/setConstraints1.pcf",
    "content": "res1 {\n  xs = Set(1, 2, 3)\n  ys = Set(-1, -2, -3)\n  zs = Set(-1, -2, -3, -4, -5)\n}\nres1b {\n  ys = Set(-1, -2, -3)\n}\nres2 = \"Expected value of type `Set`, but got type `String`. Value: \\\"one\\\"\"\nres3 = \"Expected value of type `Int`, but got type `String`. Value: \\\"one\\\"\"\nres4 = \"Type constraint `this < 0` violated. Value: 1\"\nres4b = \"Type constraint `every((it) -> it is Int(this < 0))` violated. Value: Set(1, 2, 3)\"\nres5 = \"Type constraint `length >= 5` violated. Value: Set(-1, -2, -3)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/supercalls.pcf",
    "content": "res1 = \"Pigeon\"\nres2 = \"Barn Owl\"\nres3 = \"ParrotParrot\"\nres4 = \"PigeonBarn Owl\"\nres5 = \"Barn OwlPigeon\"\nres6 = \"Parrot\"\nres7 = \"Oh Pigeon\"\nres8 = \"Oh Barn Owl\"\nres9 = \"Oh ParrotOh Parrot\"\nres10 = \"Oh PigeonOh Barn Owl\"\nres11 = \"Oh Barn OwlOh Pigeon\"\nres12 = \"Oh Parrot\"\nres13 = 6\nres14 = \"abc\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/supercallsInLet.pcf",
    "content": "res1 = \"ab\"\nres2 = \"cd\"\nres3 = \"e and f\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypes.pcf",
    "content": "res1 {\n  a = true\n  b = null\n  c = true\n  d = true\n}\nres2 {\n  a = \"foo\"\n  b = \"foo\"\n  c = \"longer\"\n  d = \"foo\"\n}\nres3 {\n  c = \"foo\"\n}\nres4 {\n  a = \"foo\"\n  b = List(1, 3.14, 2)\n  c = List(1, List(3.12), 2)\n  d = true\n  e = 5.s\n  f = 3.gb\n  g = Pair(1, 2)\n}\nres5 {\n  a = List(\"foo\", \"bar\")\n  b = List(3.14, 1)\n  c = List()\n  d = Map(1, \"foo\", 2, Set(\"foo\", \"bar\"), List(1, 2, 3), Set(\"foo\", \"bar\"))\n  e = 1.s\n  f = null\n  g = null\n}\nres6 {\n  a = Set()\n  b = \"Pigeon\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorAlias.err",
    "content": "–– Pkl Error ––\nExpected value of type `\"aaaaaaaaaaaaaaa\"|\"bbbbbbbbbbbbb\"|\"ccccccccccccc\"|\"ddddddddddddd\"|\"eeeeeeeeeeeee\"|\"fffffffffffff\"|\"ggggggggggggg\"|\"hhhhhhhhhhhhh\"|\"iiiiiiiiiiiii\"|\"jjjjjjjjjjjjj\"|\"kkkkkkkkkkkkk\"`, but got `\"other\"`.\n\nx | \"aaaaaaaaaaaaaaa\"\n    ^^^^^^^^^^^^^^^^^\nat unionTypesErrorAlias#X.a (file:///$snippetsDir/input/classes/unionTypesErrorAlias.pkl)\n\nxx | a = \"other\"\n         ^^^^^^^\nat unionTypesErrorAlias#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorAlias.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorDifferent1.err",
    "content": "–– Pkl Error ––\nExpected value of type `Boolean|List<Int>`, but got a different `List`.\nValue: List(1, 3.14, 2)\n\nx | a: Boolean|List<Int>\n       ^^^^^^^^^^^^^^^^^\nat unionTypesErrorDifferent1#X.a (file:///$snippetsDir/input/classes/unionTypesErrorDifferent1.pkl)\n\n* Value is not of type `List<Int>` because:\n  Expected value of type `Int`, but got type `Float`.\n  Value: 3.14\n\nx | a = List(1, 3.14, 2)\n        ^^^^^^^^^^^^^^^^\nat unionTypesErrorDifferent1#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorDifferent1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorDifferent2.err",
    "content": "–– Pkl Error ––\nExpected value of type `Boolean|List<Int>(length > 3)`, but got a different `List`.\nValue: List(1, 2, 3)\n\nx | a: Boolean|List<Int>(length > 3)\n       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat unionTypesErrorDifferent2#X.a (file:///$snippetsDir/input/classes/unionTypesErrorDifferent2.pkl)\n\n* Value is not of type `List<Int>(length > 3)` because:\n  Type constraint `length > 3` violated.\n  Value: List(1, 2, 3)\n\n      length > 3\n      │      │\n      3      false\n\nx | a = List(1, 2, 3)\n        ^^^^^^^^^^^^^\nat unionTypesErrorDifferent2#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorDifferent2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorMultipleAliases.err",
    "content": "–– Pkl Error ––\nExpected value of type `Alias1|Alias2`, but got a different `Dynamic`.\nValue: new Dynamic {}\n\nx | res1: Alias1|Alias2 = new Dynamic { }\n          ^^^^^^^^^^^^^\nat unionTypesErrorMultipleAliases#res1 (file:///$snippetsDir/input/classes/unionTypesErrorMultipleAliases.pkl)\n\n* Value is not of type `Alias1` because:\n  Expected value of type `String`, but got type `Dynamic`.\n  Value: new Dynamic {}\n\n* Value is not of type `Alias2` because:\n  Expected value of type `Int`, but got type `Dynamic`.\n  Value: new Dynamic {}\n\nx | res1: Alias1|Alias2 = new Dynamic { }\n                          ^^^^^^^^^^^^^^^\nat unionTypesErrorMultipleAliases#res1 (file:///$snippetsDir/input/classes/unionTypesErrorMultipleAliases.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorNested.err",
    "content": "–– Pkl Error ––\nExpected value of type `Boolean|Map<Int|List<Int>, String|Set<String>>`, but got a different `Map`.\nValue: Map(1, \"foo\", 2, Set(\"foo\", \"bar\"), List(1, 2, 3), Set(\"bar\", 4))\n\nx | a: Boolean|Map<Int|List<Int>, String|Set<String>>\n       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat unionTypesErrorNested#X.a (file:///$snippetsDir/input/classes/unionTypesErrorNested.pkl)\n\n* Value is not of type `Map<Int|List<Int>, String|Set<String>>` because:\n  Expected value of type `String|Set<String>`, but got a different `Set`.\n  Value: Set(\"bar\", 4)\n\n  * Value is not of type `Set<String>` because:\n    Expected value of type `String`, but got type `Int`.\n    Value: 4\n\nx | a = Map(\n        ^^^^\nat unionTypesErrorNested#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorNested.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorSimple.err",
    "content": "–– Pkl Error ––\nExpected value of type `Boolean|List<Int>`, but got type `Int`.\nValue: 42\n\nx | a: Boolean|List<Int>\n       ^^^^^^^^^^^^^^^^^\nat unionTypesErrorSimple#X.a (file:///$snippetsDir/input/classes/unionTypesErrorSimple.pkl)\n\nx | a = 42\n        ^^\nat unionTypesErrorSimple#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorSimple.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorString1.err",
    "content": "–– Pkl Error ––\nExpected value of type `\"foo\"|\"bar\"|\"baz\"`, but got `\"foox\"`.\n\nx | a: \"foo\" | \"bar\" | \"baz\"\n       ^^^^^^^^^^^^^^^^^^^^^\nat unionTypesErrorString1#X.a (file:///$snippetsDir/input/classes/unionTypesErrorString1.pkl)\n\nx | a = \"foox\"\n        ^^^^^^\nat unionTypesErrorString1#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorString1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/unionTypesErrorString2.err",
    "content": "–– Pkl Error ––\nExpected value of type `\"aaaaaaaaaaaaaaa\"|\"bbbbbbbbbbbbb\"|\"ccccccccccccc\"|\"ddddddddddddd\"|\"eeeeeeeeeeeee\"|\"fffffffffffff\"|\"ggggggggggggg\"|\"hhhhhhhhhhhhh\"|\"iiiiiiiiiiiii\"|\"jjjjjjjjjjjjj\"|\"kkkkkkkkkkkkk\"`, but got `\"other\"`.\n\nx | a: \"aaaaaaaaaaaaaaa\"\n       ^^^^^^^^^^^^^^^^^\nat unionTypesErrorString2#X.a (file:///$snippetsDir/input/classes/unionTypesErrorString2.pkl)\n\nxx | a = \"other\"\n         ^^^^^^^\nat unionTypesErrorString2#res1.a (file:///$snippetsDir/input/classes/unionTypesErrorString2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/wrongType1.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 42\n\nx | name: String\n          ^^^^^^\nat wrongType1#Person.name (file:///$snippetsDir/input/classes/wrongType1.pkl)\n\nx | name = 42\n           ^^\nat wrongType1#pigeon.name (file:///$snippetsDir/input/classes/wrongType1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/wrongType2.err",
    "content": "–– Pkl Error ––\nExpected value of type `Int`, but got type `String`.\nValue: \"42\"\n\nx | age: Int\n         ^^^\nat wrongType2#Person.age (file:///$snippetsDir/input/classes/wrongType2.pkl)\n\nx | age = \"42\"\n          ^^^^\nat wrongType2#pigeon.age (file:///$snippetsDir/input/classes/wrongType2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/wrongType3.err",
    "content": "–– Pkl Error ––\nExpected value of type `wrongType3#Address`, but got type `String`.\nValue: \"Howdy St.\"\n\nx | address: Address\n             ^^^^^^^\nat wrongType3#Person.address (file:///$snippetsDir/input/classes/wrongType3.pkl)\n\nxx | address = \"Howdy St.\"\n               ^^^^^^^^^^^\nat wrongType3#person.address (file:///$snippetsDir/input/classes/wrongType3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/wrongType4.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `DataSize`.\nValue: 4.gb\n\nx | street: String\n            ^^^^^^\nat wrongType4#Address.street (file:///$snippetsDir/input/classes/wrongType4.pkl)\n\nxx | street = 4.gb\n              ^^^^\nat wrongType4#person.address.street (file:///$snippetsDir/input/classes/wrongType4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/wrongType5.pcf",
    "content": "res1 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"42\\\"\"\nres3 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/classes/wrongType6.err",
    "content": "–– Pkl Error ––\nType constraint `!isEmpty` violated.\nValue: List()\n\n    !isEmpty\n    ││\n    │true\n    false\n\nx | names: List<String>(!isEmpty)\n                        ^^^^^^^^\nat wrongType6#Person.names (file:///$snippetsDir/input/classes/wrongType6.pkl)\n\nx | names: List<String>(!isEmpty)\n    ^^^^^\nat wrongType6#Person.names (file:///$snippetsDir/input/classes/wrongType6.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/abstractOpenMember.err",
    "content": "–– Pkl Error ––\nModifier `open` is redundant here; just use `abstract`.\n\nx | abstract open class Person\n             ^^^^\nat abstractOpenMember (file:///$snippetsDir/input/errors/abstractOpenMember.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeImportsCannotFindModule.err",
    "content": "–– Pkl Error ––\nCannot find module `bogusModule.pkl`.\n\nx | import \"bogusModule.pkl\"\n           ^^^^^^^^^^^^^^^^^\nat pkl.analyze#importGraph (file:///$snippetsDir/input-helper/analyze/cannotFindModule.pkl)\n\nx | res = analyze.importGraph(Set(reflect.Module(cannotFindModule).uri))\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat analyzeImportsCannotFindModule#res (file:///$snippetsDir/input/errors/analyzeImportsCannotFindModule.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeImportsInvalidGlob.err",
    "content": "–– Pkl Error ––\nCannot combine glob imports with triple-dot module URIs.\n\nx | import* \".../**.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^\nat analyzeImportsInvalidGlob#invalidGlob (file:///$snippetsDir/input-helper/analyze/invalidGlob.pkl)\n\nx | res = analyze.importGraph(Set(reflect.Module(invalidGlob).uri))\n                                                 ^^^^^^^^^^^\nat analyzeImportsInvalidGlob#res (file:///$snippetsDir/input/errors/analyzeImportsInvalidGlob.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeInvalidModuleUri.err",
    "content": "–– Pkl Error ––\nModule URI `foo <>` has invalid syntax.\n\nx | result = analyze.importGraph(Set(\"foo <>\"))\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat analyzeInvalidModuleUri#result (file:///$snippetsDir/input/errors/analyzeInvalidModuleUri.pkl)\n\nIllegal character in path at index 3: foo <>\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/analyzeRelativeModuleUri.err",
    "content": "–– Pkl Error ––\nCannot analyze relative module URI `foo.pkl`.\n\nx | result = analyze.importGraph(Set(\"foo.pkl\"))\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat analyzeRelativeModuleUri#result (file:///$snippetsDir/input/errors/analyzeRelativeModuleUri.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/anyConverterError.err",
    "content": "–– Pkl Error ––\nThe top-level value of a Pcf document must have type `Typed` or `Dynamic`, but got type `String`.\nValue: \"anyConverterError\"\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nThis value was converted during rendering. Previous: new ModuleClass {}. After: \"anyConverterError\".\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/baseModule.pcf",
    "content": "x = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/binopDifferentLine.err",
    "content": "–– Pkl Error ––\nInvalid token at position. Expected a class, typealias, method, or property.\n\nx | /*comment*/-\n               ^\nat binopDifferentLine (file:///$snippetsDir/input/errors/binopDifferentLine.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAmendFixedProperty1.err",
    "content": "–– Pkl Error ––\nCannot amend fixed property `bird`.\n\nxx | bird {\n     ^^^^\nat cannotAmendFixedProperty1#n (file:///$snippetsDir/input/errors/cannotAmendFixedProperty1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAmendFixedProperty2.err",
    "content": "–– Pkl Error ––\nCannot amend fixed property `res3`.\n\nx | res3 {\n    ^^^^\nat cannotAmendFixedProperty2 (file:///$snippetsDir/input/errors/cannotAmendFixedProperty2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAssignFixedProperty1.err",
    "content": "–– Pkl Error ––\nCannot assign to fixed property `name`.\n\nx | name = _name\n    ^^^^\nat cannotAssignFixedProperty1#p (file:///$snippetsDir/input/errors/cannotAssignFixedProperty1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAssignFixedProperty2.err",
    "content": "–– Pkl Error ––\nCannot assign to fixed property `res1`.\n\nx | res1 = \"bye\"\n    ^^^^\nat cannotAssignFixedProperty2 (file:///$snippetsDir/input/errors/cannotAssignFixedProperty2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAssignFixedProperty3.err",
    "content": "–– Pkl Error ––\nCannot assign to fixed property `name`.\n\nx | ...new Dynamic { name = \"Osprey\" }\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat cannotAssignFixedProperty3#p (file:///$snippetsDir/input/errors/cannotAssignFixedProperty3.pkl)\n\nx | ...new Dynamic { name = \"Osprey\" }\n                     ^^^^\nat cannotAssignFixedProperty3#p.name (file:///$snippetsDir/input/errors/cannotAssignFixedProperty3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotAssignToNothing.err",
    "content": "–– Pkl Error ––\nExpected `nothing`, but got type `String`.\n\n`nothing` is typically used as the return type of functions that throw errors.\nValue: \"foo\"\n\nx | value: nothing = \"foo\"\n           ^^^^^^^\nat cannotAssignToNothing#value (file:///$snippetsDir/input/errors/cannotAssignToNothing.pkl)\n\nx | value: nothing = \"foo\"\n                     ^^^^^\nat cannotAssignToNothing#value (file:///$snippetsDir/input/errors/cannotAssignToNothing.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotChangeFixed1.err",
    "content": "–– Pkl Error ––\nMissing modifier `fixed`.\n\nx | name = \"Spot\"\n    ^^^^\nat cannotChangeFixed1#Dog (file:///$snippetsDir/input/errors/cannotChangeFixed1.pkl)\n\nProperty `name` must be declared fixed, because it overrides a fixed property on parent class `cannotChangeFixed1#Animal`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotChangeFixed2.err",
    "content": "–– Pkl Error ––\nModifier `fixed` cannot be applied to property `name`.\n\nx | fixed name = \"Spot\"\n    ^^^^^\nat cannotChangeFixed2#Dog (file:///$snippetsDir/input/errors/cannotChangeFixed2.pkl)\n\nProperty `name` cannot be declared fixed, because it overrides a non-fixed property on parent class `cannotChangeFixed2#Animal`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotFindMapKey.err",
    "content": "–– Pkl Error ––\nCannot find key `\"foo\"`.\n\nx | res1 = x[\"foo\"]\n           ^^^^^^^^\nat cannotFindMapKey#res1 (file:///$snippetsDir/input/errors/cannotFindMapKey.pkl)\n\nDid you mean any of the following?\n\"fooz\"\n\"foyo\"\n\"xfoo\"\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotFindStdLibModule.err",
    "content": "–– Pkl Error ––\nCannot find standard library module `pkl:nonExisting`.\n\nx | import \"pkl:nonExisting\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^\nat cannotFindStdLibModule#nonExisting (file:///$snippetsDir/input/errors/cannotFindStdLibModule.pkl)\n\nAvailable standard library modules:\npkl:analyze\npkl:base\npkl:Benchmark\npkl:Command\npkl:DocPackageInfo\npkl:DocsiteInfo\npkl:EvaluatorSettings\npkl:json\npkl:jsonnet\npkl:math\npkl:pklbinary\npkl:platform\npkl:Project\npkl:protobuf\npkl:reflect\npkl:release\npkl:semver\npkl:settings\npkl:shell\npkl:test\npkl:xml\npkl:yaml\n\nx | res1 = nonExisting.bar\n           ^^^^^^^^^^^\nat cannotFindStdLibModule#res1 (file:///$snippetsDir/input/errors/cannotFindStdLibModule.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotInferParent2.err",
    "content": "–– Pkl Error ––\nCannot tell which parent to amend.\n\nx | foo = () -> new {}\n                ^^^\nat cannotInferParent2#foo.<function#1> (file:///$snippetsDir/input/errors/cannotInferParent2.pkl)\n\nPlease specify a parent explicitly, for example `new Person { ... }` instead of `new { ... }`.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotInferParent3.err",
    "content": "–– Pkl Error ––\nCannot tell which parent to amend.\n\nx | [new { name = \"Pigeon\" }] = \"Pigeon\"\n     ^^^\nat cannotInferParent3#res1 (file:///$snippetsDir/input/errors/cannotInferParent3.pkl)\n\nPlease specify a parent explicitly, for example `new Person { ... }` instead of `new { ... }`.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotInstantiateAbstractModule.err",
    "content": "–– Pkl Error ––\nCannot instantiate abstract class `cannotInstantiateAbstractModule`.\n\nx | res1 = new module {}\n               ^^^^^^\nat cannotInstantiateAbstractModule#res1 (file:///$snippetsDir/input/errors/cannotInstantiateAbstractModule.pkl)\n\nAbstract classes cannot be instantiated.\nInstead, instantiate a concrete subclass.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/cannotRenderMixin.err",
    "content": "–– Pkl Error ––\nCannot render value of type `Function1` as Pcf.\nValue: new Function1 {}\n\nx | m: Mixin = new {\n    ^^^^^^^^^^^^^^^^\nat pkl.base#PcfRenderer.renderDocument (file:///$snippetsDir/input/errors/cannotRenderMixin.pkl)\n\nConsider adding a converter to `output.converters`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/classExtendsSelf.err",
    "content": "–– Pkl Error ––\nClass `classExtendsSelf#Recurring` cannot extend itself.\n\nx | open class Recurring extends Recurring {\n                                 ^^^^^^^^^\nat classExtendsSelf#Recurring (file:///$snippetsDir/input/errors/classExtendsSelf.pkl)\n\nx | f: Recurring = new {}\n       ^^^^^^^^^\nat classExtendsSelf (file:///$snippetsDir/input/errors/classExtendsSelf.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constAmend.err",
    "content": "–– Pkl Error ––\nCannot amend const property `constDyn`.\n\nx | constDyn {\n    ^^^^^^^^\nat constAmend (file:///$snippetsDir/input/errors/const/constAmend.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constAnnotation.err",
    "content": "–– Pkl Error ––\nCannot call method `f1` from here because it is not `const`.\n\nxx | @Ann { foo = f1() }\n                  ^^^^\nat constAnnotation#Foo.foo (file:///$snippetsDir/input/errors/const/constAnnotation.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `f1`\n2. Self-import this module, and reference this method from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constAnnotation2.err",
    "content": "–– Pkl Error ––\nCannot reference property `top` from here because it is not `const`.\n\nx | @Ann { foo = top }\n                 ^^^\nat constAnnotation2#Foo.foo (file:///$snippetsDir/input/errors/const/constAnnotation2.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `top`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constAnnotation3.err",
    "content": "–– Pkl Error ––\nCannot reference `module` within an annotation body.\n\nx | @Ann { foo = module }\n                 ^^^^^^\nat constAnnotation3#Foo.foo (file:///$snippetsDir/input/errors/const/constAnnotation3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constAssign.err",
    "content": "–– Pkl Error ––\nCannot assign to const property `constantSimpleValue`.\n\nx | constantSimpleValue = \"1\"\n    ^^^^^^^^^^^^^^^^^^^\nat constAssign (file:///$snippetsDir/input/errors/const/constAssign.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constClassBody.err",
    "content": "–– Pkl Error ––\nCannot reference property `notConst` from here because it is not `const`.\n\nx | foo = notConst\n          ^^^^^^^^\nat constClassBody#Foo.foo (file:///$snippetsDir/input/errors/const/constClassBody.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `notConst`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constExplicitThis.err",
    "content": "–– Pkl Error ––\nCannot reference property `a` from here because it is not `const`.\n\nx | const b = this.a\n              ^^^^^^\nat constExplicitThis#B.b (file:///$snippetsDir/input/errors/const/constExplicitThis.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `a`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constExplicitThisMethod.err",
    "content": "–– Pkl Error ––\nCannot call method `a` from here because it is not `const`.\n\nx | const b = this.a()\n              ^^^^^^^^\nat constExplicitThisMethod#B.b (file:///$snippetsDir/input/errors/const/constExplicitThisMethod.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `a`\n2. Self-import this module, and reference this method from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constFunctionCallingNonConst.err",
    "content": "–– Pkl Error ––\nCannot call method `nonConstFunction` from here because it is not `const`.\n\nx | const function constFunctionCallingNonConst(): (String) -> String = (s) -> s + nonConstFunction()\n                                                                                   ^^^^^^^^^^^^^^^^^^\nat constFunctionCallingNonConst#constFunctionCallingNonConst.<function#1> (file:///$snippetsDir/input/errors/const/constFunctionCallingNonConst.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `nonConstFunction`\n2. Self-import this module, and reference this method from the import.\n\nx | res = constFunctionCallingNonConst().apply(\"prefix\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat constFunctionCallingNonConst#res (file:///$snippetsDir/input/errors/const/constFunctionCallingNonConst.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constImplicitThis.err",
    "content": "–– Pkl Error ––\nCannot reference property `a` from here because it is not `const`.\n\nx | const b = a\n              ^\nat constImplicitThis#B.b (file:///$snippetsDir/input/errors/const/constImplicitThis.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `a`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constImplicitThisMethod.err",
    "content": "–– Pkl Error ––\nCannot call method `a` from here because it is not `const`.\n\nx | const b = a()\n              ^^^\nat constImplicitThisMethod#B.b (file:///$snippetsDir/input/errors/const/constImplicitThisMethod.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `a`\n2. Self-import this module, and reference this method from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constLexicalScope.err",
    "content": "–– Pkl Error ––\nCannot reference property `bar` from here because it is not `const`.\n\nx | _barr = bar\n            ^^^\nat constLexicalScope#Foo.foo._barr (file:///$snippetsDir/input/errors/const/constLexicalScope.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `bar`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constLocalAmendModule.pcf",
    "content": "bird {\n  name = \"Birdy\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constLocalMethod.err",
    "content": "–– Pkl Error ––\nCannot reference property `bar` from here because it is not `const`.\n\nx | const local function foo() = bar\n                                 ^^^\nat constLocalMethod#obj.foo (file:///$snippetsDir/input/errors/const/constLocalMethod.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `bar`\n2. Self-import this module, and reference this property from the import.\n\nx | res = foo()\n          ^^^^^\nat constLocalMethod#obj.res (file:///$snippetsDir/input/errors/const/constLocalMethod.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constLocalProperty.err",
    "content": "–– Pkl Error ––\nCannot reference property `res1` from here because it is not `const`.\n\nx | const local qux = res1\n                      ^^^^\nat constLocalProperty#foo.qux (file:///$snippetsDir/input/errors/const/constLocalProperty.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `res1`\n2. Self-import this module, and reference this property from the import.\n\nx | res2 = qux\n           ^^^\nat constLocalProperty#foo.res2 (file:///$snippetsDir/input/errors/const/constLocalProperty.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod.err",
    "content": "–– Pkl Error ––\nCannot call method `fun` from here because it is not `const`.\n\nx | foo = fun()\n          ^^^^^\nat constMethod#Foo.foo (file:///$snippetsDir/input/errors/const/constMethod.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `fun`\n2. Self-import this module, and reference this method from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constMethod2.err",
    "content": "–– Pkl Error ––\nCannot call method `bar` from here because it is not `const`.\n\nx | bar: String = module.bar()\n                  ^^^^^^^^^^^^\nat constMethod2#Foo.bar (file:///$snippetsDir/input/errors/const/constMethod2.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `bar`\n2. Self-import this module, and reference this method from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constModule.err",
    "content": "–– Pkl Error ––\nCannot reference property `notConst` from here because it is not `const`.\n\nx | shouldBeConst = module.notConst\n                    ^^^^^^^^^^^^^^^\nat constModule#Foo.shouldBeConst (file:///$snippetsDir/input/errors/const/constModule.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `notConst`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constModule2.err",
    "content": "–– Pkl Error ––\nCannot reference `module` within a class body.\n\nx | foo = module\n          ^^^^^^\nat constModule2#Foo.foo (file:///$snippetsDir/input/errors/const/constModule2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constModule3.err",
    "content": "–– Pkl Error ––\nCannot reference `module` from const property `x`.\n\nx | x = module\n        ^^^^^^\nat constModule3#foo.x (file:///$snippetsDir/input/errors/const/constModule3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constObjectMember.err",
    "content": "–– Pkl Error ––\nModifier `const` can only be applied to object members that are also `local`.\n\nx | const foo = 10\n    ^^^^^\nat constObjectMember#foo (file:///$snippetsDir/input/errors/const/constObjectMember.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constOuter.err",
    "content": "–– Pkl Error ––\nCannot reference property `notConst` from here because it is not `const`.\n\nx | shouldBeConst = outer.notConst\n                    ^^^^^^^^^^^^^^\nat constOuter#Foo.shouldBeConst (file:///$snippetsDir/input/errors/const/constOuter.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `notConst`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constOuter2.err",
    "content": "–– Pkl Error ––\nCannot reference property `name` from here because it is not `const`.\n\nx | const fancyName = new { title = \"\\(outer.name), Esq.\" }\n                                       ^^^^^^^^^^\nat constOuter2#Person.fancyName.title (file:///$snippetsDir/input/errors/const/constOuter2.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `name`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constOuter3.err",
    "content": "–– Pkl Error ––\nCannot reference `outer` from here because it's not `const`.\n\nx | const prop = new { value = outer }\n                               ^^^^^\nat constOuter3#Foo.prop.value (file:///$snippetsDir/input/errors/const/constOuter3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constQualified.err",
    "content": "–– Pkl Error ––\nCannot reference property `notConstDyn` from here because it is not `const`.\n\nx | foo = notConstDyn.prop\n          ^^^^^^^^^^^\nat constQualified#Foo.foo (file:///$snippetsDir/input/errors/const/constQualified.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `notConstDyn`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constSubclass.err",
    "content": "–– Pkl Error ––\nMissing modifier `const`.\n\nx | x = 2\n    ^\nat constSubclass#Bar (file:///$snippetsDir/input/errors/const/constSubclass.pkl)\n\nProperty `x` must be declared const, because it overrides a const property on parent class `constSubclass#Foo`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constSubclass2.err",
    "content": "–– Pkl Error ––\nModifier `const` cannot be applied to property `x`.\n\nx | const x = 2\n    ^^^^^\nat constSubclass2#Bar (file:///$snippetsDir/input/errors/const/constSubclass2.pkl)\n\nProperty `x` cannot be declared const, because it overrides a non-const property on parent class `constSubclass2#Foo`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constSuper.err",
    "content": "–– Pkl Error ––\nCannot reference property `bar` from here because it is not `const`.\n\nx | const foo = super.bar\n                ^^^^^^^^^\nat constSuper#B.foo (file:///$snippetsDir/input/errors/const/constSuper.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `bar`\n2. Self-import this module, and reference this property from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constSuperMethod.err",
    "content": "–– Pkl Error ––\nCannot call method `bar` from here because it is not `const`.\n\nx | const foo = super.bar()\n                ^^^^^^^^^^^\nat constSuperMethod#B.foo (file:///$snippetsDir/input/errors/const/constSuperMethod.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to method `bar`\n2. Self-import this module, and reference this method from the import.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constThis.err",
    "content": "–– Pkl Error ––\nCannot reference `this` from here because it is not `const`.\n\nx | const bar = this\n                ^^^^\nat constThis#bar (file:///$snippetsDir/input/errors/const/constThis.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/const/constTypeAliasConstraint.err",
    "content": "–– Pkl Error ––\nCannot reference property `isValid` from here because it is not `const`.\n\nx | typealias MyValue = Any(isValid)\n                            ^^^^^^^\nat constTypeAliasConstraint#myValue (file:///$snippetsDir/input/errors/const/constTypeAliasConstraint.pkl)\n\nTo fix, do either of:\n1. Add modifier `const` to property `isValid`\n2. Self-import this module, and reference this property from the import.\n\nx | myValue: MyValue = 1\n                       ^\nat constTypeAliasConstraint#myValue (file:///$snippetsDir/input/errors/const/constTypeAliasConstraint.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/constraintDetails1.err",
    "content": "–– Pkl Error ––\nType constraint `firstOneIsSandy` violated.\nValue: new Listing { new Bird { name = \"Bob\" }; new Bird { name = ? } }\n\n    (it: Listing<Bird>) -> it[0].name == \"Sandy\"\n                           │ │   │    │\n                           │ │   │    false\n                           │ │   \"Bob\"\n                           │ new Bird { name = \"Bob\" }\n                           new Listing { new Bird { name = \"Bob\" }; new Bird { name = ? } }\n\nx | birds: Listing(firstOneIsSandy) = new {\n                   ^^^^^^^^^^^^^^^\nat constraintDetails1#birds (file:///$snippetsDir/input/errors/constraintDetails1.pkl)\n\nx | birds: Listing(firstOneIsSandy) = new {\n                                      ^^^^^\nat constraintDetails1#birds (file:///$snippetsDir/input/errors/constraintDetails1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/constraintDetails2.err",
    "content": "–– Pkl Error ––\nType constraint `let (myself: Listing<Bird> = this)\n      myself[0].name == \"Sandy\"` violated.\nValue: new Listing { new Bird { name = \"Bob\" }; new Bird { name = ? } }\n\n    let (myself: Listing<Bird> = this)\n                                 │\n                                 new Listing { new Bird { name = \"Bob\" }; new Bird { name = ? } }\n\n    myself[0].name == \"Sandy\"\n    │     │   │    │\n    │     │   │    false\n    │     │   \"Bob\"\n    │     new Bird { name = \"Bob\" }\n    new Listing { new Bird { name = \"Bob\" }; new Bird { name = ? } }\n\nx | let (myself: Listing<Bird> = this)\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat constraintDetails2#birds (file:///$snippetsDir/input/errors/constraintDetails2.pkl)\n\nx | new {\n    ^^^^^\nat constraintDetails2#birds (file:///$snippetsDir/input/errors/constraintDetails2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/constraintDetails3.err",
    "content": "–– Pkl Error ––\nType constraint `toList().every((it: Listing<Bird>) -> it[0].name == \"Bob\")` violated.\nValue: new Listing { new Listing { new Bird { name = \"Eagle\" }; new Bird { name = ? ...\n\n    toList().every((it: Listing<Bird>) -> it[0].name == \"Bob\")\n    │        │\n    │        false\n    List(new Listing { new Bird { name = \"Eagle\" }; new Bird { name = ? } })\n\nx | foo: Listing(toList().every((it: Listing<Bird>) -> it[0].name == \"Bob\")) = new {\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat constraintDetails3#foo (file:///$snippetsDir/input/errors/constraintDetails3.pkl)\n\nx | foo: Listing(toList().every((it: Listing<Bird>) -> it[0].name == \"Bob\")) = new {\n                                                                               ^^^^^\nat constraintDetails3#foo (file:///$snippetsDir/input/errors/constraintDetails3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/decodingException.err",
    "content": "–– Pkl Error ––\nInvalid bytes for charset \"UTF-8\".\n\nx | res = Bytes(0xc0, 0xc1).decodeToString(\"UTF-8\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat decodingException#res (file:///$snippetsDir/input/errors/decodingException.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingClassDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | name: String\n                ^\nat missingClassDelimiter (file:///$snippetsDir/input/errors/delimiters/missingClassDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingConstrainedTypeSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `this`. Expected `,` or `)`.\n\nx | x: Int(isPositive this > 10)\n                      ^^^^\nat missingConstrainedTypeSeparator (file:///$snippetsDir/input/errors/delimiters/missingConstrainedTypeSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingContainerAmendDefDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | x = 1\n         ^\nat missingContainerAmendDefDelimiter (file:///$snippetsDir/input/errors/delimiters/missingContainerAmendDefDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingContainerAmendExprDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | x = 1\n         ^\nat missingContainerAmendExprDelimiter (file:///$snippetsDir/input/errors/delimiters/missingContainerAmendExprDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingEmptyMultiLineStringDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"` delimiter.\n\nx | res2 = 42\n             ^\nat missingEmptyMultiLineStringDelimiter (file:///$snippetsDir/input/errors/delimiters/missingEmptyMultiLineStringDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingEmptyMultiLineStringDelimiterAtEof.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"` delimiter.\n\nx | res1 = \"\"\"\n              ^\nat missingEmptyMultiLineStringDelimiterAtEof (file:///$snippetsDir/input/errors/delimiters/missingEmptyMultiLineStringDelimiterAtEof.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingEmptyStringDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `\"` delimiter.\n\nx | res1 = \"\n            ^\nat missingEmptyStringDelimiter (file:///$snippetsDir/input/errors/delimiters/missingEmptyStringDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingEmptyStringDelimiterAtEof.err",
    "content": "–– Pkl Error ––\nMissing `\"` delimiter.\n\nx | res1 = \"\n            ^\nat missingEmptyStringDelimiterAtEof (file:///$snippetsDir/input/errors/delimiters/missingEmptyStringDelimiterAtEof.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunction0ParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `->`. Expected `)`.\n\nx | f = ( -> 42\n          ^^\nat missingFunction0ParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingFunction0ParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunction1ParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `->`. Expected `)`.\n\nx | f = (arg -> arg + 1\n             ^^\nat missingFunction1ParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingFunction1ParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionAmendParameterListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `arg3`. Expected `,` or `->`.\n\nx | f { arg1, arg2 arg3 ->\n                   ^^^^\nat missingFunctionAmendParameterListSeparator (file:///$snippetsDir/input/errors/delimiters/missingFunctionAmendParameterListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionNParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `->`. Expected `,` or `)`.\n\nx | f = (arg1, arg2, arg3 -> arg1 + arg2 + arg3\n                          ^^\nat missingFunctionNParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingFunctionNParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionParameterListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `arg3`. Expected `,` or `)`.\n\nx | f = (arg1, arg2 arg3) -> arg1 + arg2 + arg3\n                    ^^^^\nat missingFunctionParameterListSeparator (file:///$snippetsDir/input/errors/delimiters/missingFunctionParameterListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionType0ParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `->`. Expected a type or `)`.\n\nx | f: ( -> String\n         ^^\nat missingFunctionType0ParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingFunctionType0ParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionType1ParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `->`. Expected `,` or `)`.\n\nx | f: (String -> String\n               ^^\nat missingFunctionType1ParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingFunctionType1ParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionTypeNParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `->`. Expected `,` or `)`.\n\nx | f: (String, Int, String -> String\n                            ^^\nat missingFunctionTypeNParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingFunctionTypeNParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingFunctionTypeParameterListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `String`. Expected `,` or `)`.\n\nx | f: (String, Int String) -> String\n                    ^^^^^^\nat missingFunctionTypeParameterListSeparator (file:///$snippetsDir/input/errors/delimiters/missingFunctionTypeParameterListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingIfExprDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `3`. Expected `)`.\n\nx | res1 = if (cond 3 else 4\n                    ^\nat missingIfExprDelimiter (file:///$snippetsDir/input/errors/delimiters/missingIfExprDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `EOF`. Expected `,` or `)`.\n\nx | l = List(\"one\", \"two\"\n                         ^\nat missingListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `3`. Expected `,` or `)`.\n\nx | list = List(1, 2  3, 4)\n                      ^\nat missingListSeparator (file:///$snippetsDir/input/errors/delimiters/missingListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMapDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `EOF`. Expected `,` or `)`.\n\nx | map = Map(\"one\", 1, \"two\", 2\n                                ^\nat missingMapDelimiter (file:///$snippetsDir/input/errors/delimiters/missingMapDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMapSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `4`. Expected `,` or `)`.\n\nx | map = Map(1, 2, 3  4, 5, 6)\n                       ^\nat missingMapSeparator (file:///$snippetsDir/input/errors/delimiters/missingMapSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMethodArgumentListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `res2`. Expected `,` or `)`.\n\nx | res1 = \"abc\".substring(0, 1 + \"def\"\n                                       ^\nat missingMethodArgumentListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingMethodArgumentListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMethodArgumentListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `3`. Expected `,` or `)`.\n\nx | res1 = foo(1, 2 3)\n                    ^\nat missingMethodArgumentListSeparator (file:///$snippetsDir/input/errors/delimiters/missingMethodArgumentListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMethodParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `=`. Expected `,` or `)`.\n\nx | function foo(arg1, arg2 = arg1 + arg2\n                            ^\nat missingMethodParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingMethodParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMethodParameterListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `arg2`. Expected `,` or `)`.\n\nx | function foo(arg1 arg2) = arg1 + arg2\n                      ^^^^\nat missingMethodParameterListSeparator (file:///$snippetsDir/input/errors/delimiters/missingMethodParameterListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingMultiLineStringDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"` delimiter.\n\nx | \n    ^\nat missingMultiLineStringDelimiter (file:///$snippetsDir/input/errors/delimiters/missingMultiLineStringDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingObjectAmendDefDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | x = 1\n         ^\nat missingObjectAmendDefDelimiter (file:///$snippetsDir/input/errors/delimiters/missingObjectAmendDefDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingObjectAmendDefDelimiter2.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | }\n     ^\nat missingObjectAmendDefDelimiter2 (file:///$snippetsDir/input/errors/delimiters/missingObjectAmendDefDelimiter2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingObjectAmendDefDelimiter3.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | }\n     ^\nat missingObjectAmendDefDelimiter3 (file:///$snippetsDir/input/errors/delimiters/missingObjectAmendDefDelimiter3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingObjectAmendExprDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | x = 1\n         ^\nat missingObjectAmendExprDelimiter (file:///$snippetsDir/input/errors/delimiters/missingObjectAmendExprDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingObjectDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `}` delimiter.\n\nx | x = 1\n         ^\nat missingObjectDelimiter (file:///$snippetsDir/input/errors/delimiters/missingObjectDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingParenthesizedExprDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `y`. Expected `)`.\n\nx | x = 3 * (1 + 2\n                  ^\nat missingParenthesizedExprDelimiter (file:///$snippetsDir/input/errors/delimiters/missingParenthesizedExprDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingParenthesizedTypeDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `res2`. Expected `,` or `)`.\n\nx | res1: ((String) -> String | List<String>\n                                            ^\nat missingParenthesizedTypeDelimiter (file:///$snippetsDir/input/errors/delimiters/missingParenthesizedTypeDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingRawMultiLineStringDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"#` delimiter.\n\nx | \n    ^\nat missingRawMultiLineStringDelimiter (file:///$snippetsDir/input/errors/delimiters/missingRawMultiLineStringDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingRawStringDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `\"#` delimiter.\n\nx | res1 = #\"abc\n                ^\nat missingRawStringDelimiter (file:///$snippetsDir/input/errors/delimiters/missingRawStringDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingSetSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `3`. Expected `,` or `)`.\n\nx | set = Set(1, 2  3, 4)\n                    ^\nat missingSetSeparator (file:///$snippetsDir/input/errors/delimiters/missingSetSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingStringDelimiter.err",
    "content": "–– Pkl Error ––\nMissing `\"` delimiter.\n\nx | res1 = \"abc\n               ^\nat missingStringDelimiter (file:///$snippetsDir/input/errors/delimiters/missingStringDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingSubscriptDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `EOF`. Expected `]`.\n\nx | res1 = x[3 + 4\n                  ^\nat missingSubscriptDelimiter (file:///$snippetsDir/input/errors/delimiters/missingSubscriptDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingTypeConstraintListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `=`. Expected `,` or `)`.\n\nx | res1: String(!isEmpty, length < 5 = \"abc\"\n                                      ^\nat missingTypeConstraintListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingTypeConstraintListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingTypedMethodParameterListDelimiter.err",
    "content": "–– Pkl Error ––\nUnexpected token `=`. Expected `,` or `)`.\n\nx | function foo(arg1: String, arg2: String = arg1 + arg2\n                                            ^\nat missingTypedMethodParameterListDelimiter (file:///$snippetsDir/input/errors/delimiters/missingTypedMethodParameterListDelimiter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/missingTypedMethodParameterListSeparator.err",
    "content": "–– Pkl Error ––\nUnexpected token `arg2`. Expected `,` or `)`.\n\nx | function foo(arg1: String arg2: String) = arg1 + arg2\n                              ^^^^\nat missingTypedMethodParameterListSeparator (file:///$snippetsDir/input/errors/delimiters/missingTypedMethodParameterListSeparator.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/unbalancedEntryBrackets1.err",
    "content": "–– Pkl Error ––\nUnexpected token `{`. Expected `]]`.\n\nx | [[name == \"Pigeon\"] { age = 42 }\n                      ^\nat unbalancedEntryBrackets1 (file:///$snippetsDir/input/errors/delimiters/unbalancedEntryBrackets1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/unbalancedEntryBrackets2.err",
    "content": "–– Pkl Error ––\nUnexpected token `]`. Expected `{` or `=`.\n\nx | [name == \"Pigeon\"]] { age = 42 }\n                      ^\nat unbalancedEntryBrackets2 (file:///$snippetsDir/input/errors/delimiters/unbalancedEntryBrackets2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/unbalancedEntryBrackets3.err",
    "content": "–– Pkl Error ––\nUnexpected token `] ]`. Expected `]]`.\n\nx | [[name == \"Pigeon\"] ] { age = 42 }\n                      ^\nat unbalancedEntryBrackets3 (file:///$snippetsDir/input/errors/delimiters/unbalancedEntryBrackets3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/delimiters/unbalancedEntryBrackets4.err",
    "content": "–– Pkl Error ––\nUnexpected token `]`. Expected `{` or `=`.\n\nx | [name == \"Pigeon\"] ] { age = 42 }\n                       ^\nat unbalancedEntryBrackets4 (file:///$snippetsDir/input/errors/delimiters/unbalancedEntryBrackets4.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/duplicateTypeParameter.err",
    "content": "–– Pkl Error ––\nDuplicate type parameter `Elem`.\n\nx | typealias MyType<Elem, Elem> = List<Elem>\n                           ^^^^\nat duplicateTypeParameter (file:///$snippetsDir/input/errors/duplicateTypeParameter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/emptyParenthesizedTypeAnnotation.err",
    "content": "–– Pkl Error ––\nUnexpected token `)`. Expected a type.\n\nx | foo: Int|()|String = \"foo\"\n              ^\nat emptyParenthesizedTypeAnnotation (file:///$snippetsDir/input/errors/emptyParenthesizedTypeAnnotation.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/extendExternalClass.err",
    "content": "–– Pkl Error ––\nCannot extend external class `Any`.\n\nx | class Person extends Any\n                         ^^^\nat extendExternalClass#Person (file:///$snippetsDir/input/errors/extendExternalClass.pkl)\n\nExternal classes can only be extended by standard library classes.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/extendTypeAlias.err",
    "content": "–– Pkl Error ––\n`Bar` is not a valid supertype.\n\nx | class Baz extends Bar\n                      ^^^\nat extendTypeAlias#Baz (file:///$snippetsDir/input/errors/extendTypeAlias.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/forGeneratorCannotGenerateMethods.err",
    "content": "–– Pkl Error ––\nA for-generator cannot generate object methods (only entries and elements).\n\nx | for (n in List(1, 2, 3)) { local function foo() = \"foo\" }\n    ^^^\nat forGeneratorCannotGenerateMethods#foo (file:///$snippetsDir/input/errors/forGeneratorCannotGenerateMethods.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/forGeneratorCannotGenerateProperties.err",
    "content": "–– Pkl Error ––\nA for-generator cannot generate object properties (only entries and elements).\n\nx | for (n in List(1, 2, 3)) { foo = n }\n    ^^^\nat forGeneratorCannotGenerateProperties#res (file:///$snippetsDir/input/errors/forGeneratorCannotGenerateProperties.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/forGeneratorCannotIterateOverThisValue.err",
    "content": "–– Pkl Error ––\nCannot iterate over value of type `Int`.\nValue: 5\n\nx | for (n in 5) { n }\n              ^\nat forGeneratorCannotIterateOverThisValue#foo (file:///$snippetsDir/input/errors/forGeneratorCannotIterateOverThisValue.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/forGeneratorCannotIterateOverTyped.err",
    "content": "–– Pkl Error ––\nCannot iterate over value of type `forGeneratorCannotIterateOverTyped#Person`.\nValue: new Person {}\n\nx | for (_ in new Person {}) { 42 }\n              ^^^^^^^^^^^^^\nat forGeneratorCannotIterateOverTyped#foo (file:///$snippetsDir/input/errors/forGeneratorCannotIterateOverTyped.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/forGeneratorDuplicateParams1.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `i`.\n\nx | for (i, i in a) {\n            ^\nat forGeneratorDuplicateParams1#foo (file:///$snippetsDir/input/errors/forGeneratorDuplicateParams1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/forGeneratorWrongVariableName.err",
    "content": "–– Pkl Error ––\nCannot find property `o`.\n\nx | [\"\\(idx)_2\"] = o // at this point, `o` should be out of scope\n                   ^\nat forGeneratorWrongVariableName#res[#2] (file:///$snippetsDir/input/errors/forGeneratorWrongVariableName.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/fullStackTraces.err",
    "content": "–– Pkl Error ––\nfail\n\nx | const local wrong = throw(\"fail\")\n                        ^^^^^^^^^^^^^\nat fullStackTraces#wrong (file:///$snippetsDir/input/errors/fullStackTraces.pkl)\n\nx | const hidden v1 = wrong\n                      ^^^^^\nat fullStackTraces#v1 (file:///$snippetsDir/input/errors/fullStackTraces.pkl)\n\nx | const function f1() = v1\n                          ^^\nat fullStackTraces#f1 (file:///$snippetsDir/input/errors/fullStackTraces.pkl)\n\nx | const local function f2() = f1()\n                                ^^^^\nat fullStackTraces#f2 (file:///$snippetsDir/input/errors/fullStackTraces.pkl)\n\nxx | foo = f2()\n           ^^^^\nat fullStackTraces#Foo.foo (file:///$snippetsDir/input/errors/fullStackTraces.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/fullStackTraces2.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | local const invalid: String = 1\n                         ^^^^^^\nat fullStackTraces2#invalid (file:///$snippetsDir/input/errors/fullStackTraces2.pkl)\n\nx | local const invalid: String = 1\n                                  ^\nat fullStackTraces2#invalid (file:///$snippetsDir/input/errors/fullStackTraces2.pkl)\n\nx | const function f1() = invalid\n                          ^^^^^^^\nat fullStackTraces2#f1 (file:///$snippetsDir/input/errors/fullStackTraces2.pkl)\n\nx | local const top = f1()\n                      ^^^^\nat fullStackTraces2#top (file:///$snippetsDir/input/errors/fullStackTraces2.pkl)\n\nx | foo = top\n          ^^^\nat fullStackTraces2#Foo.foo (file:///$snippetsDir/input/errors/fullStackTraces2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/functionNotFoundInClass.err",
    "content": "–– Pkl Error ––\nCannot find method `baz` in class `functionNotFoundInClass#Foo`.\n\nx | res1 = new Foo {}.baz(42)\n           ^^^^^^^^^^^^^^^^^^\nat functionNotFoundInClass#res1 (file:///$snippetsDir/input/errors/functionNotFoundInClass.pkl)\n\nDid you mean any of the following?\nbar(x)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/functionNotFoundInModule.err",
    "content": "–– Pkl Error ––\nCannot find method `baz` in module `functionNotFoundInModule`.\n\nx | res1 = module.baz(42)\n           ^^^^^^^^^^^^^^\nat functionNotFoundInModule#res1 (file:///$snippetsDir/input/errors/functionNotFoundInModule.pkl)\n\nDid you mean any of the following?\nbar(x)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/functionNotFoundInScope.err",
    "content": "–– Pkl Error ––\nCannot find method `foox`.\n\nx | res1 = foox()\n           ^^^^^^\nat functionNotFoundInScope#res1 (file:///$snippetsDir/input/errors/functionNotFoundInScope.pkl)\n\nDid you mean any of the following?\nfooa()\nfooc\nfoob(x)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/functionNotFoundMaybeLambda.err",
    "content": "–– Pkl Error ––\nCannot find method `listing`.\n\nx | call = listing(10)\n           ^^^^^^^^^^^\nat functionNotFoundMaybeLambda#call (file:///$snippetsDir/input/errors/functionNotFoundMaybeLambda.pkl)\n\nDid you mean any of the following?\nlisting.apply(...)\nListing\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/functionNotFoundMaybeProperty.err",
    "content": "–– Pkl Error ––\nCannot find method `prop`.\n\nx | call = prop()\n           ^^^^^^\nat functionNotFoundMaybeProperty#call (file:///$snippetsDir/input/errors/functionNotFoundMaybeProperty.pkl)\n\nDid you mean any of the following?\nprop\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/intrinsifiedTypeAlias1.err",
    "content": "–– Pkl Error ––\nExpected value of type `Int`, but got type `String`.\nValue: \"abc\"\n\nxxxx | typealias Int16 = Int(isBetween(-32768, 32767))\n                         ^^^\nat intrinsifiedTypeAlias1#res1 (pkl:base)\n\nx | res1: Int16 = \"abc\"\n                  ^^^^^\nat intrinsifiedTypeAlias1#res1 (file:///$snippetsDir/input/errors/intrinsifiedTypeAlias1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/intrinsifiedTypeAlias2.err",
    "content": "–– Pkl Error ––\nType constraint `isBetween(0, 65535)` violated.\nValue: -1\n\n    isBetween(0, 65535)\n    │\n    false\n\nxxxx | typealias UInt16 = Int(isBetween(0, 65535))\n                              ^^^^^^^^^^^^^^^^^^^\nat intrinsifiedTypeAlias2#res1 (pkl:base)\n\nx | res1: UInt16 = -1\n                   ^^\nat intrinsifiedTypeAlias2#res1 (file:///$snippetsDir/input/errors/intrinsifiedTypeAlias2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/intrinsifiedTypeAlias3.err",
    "content": "–– Pkl Error ––\nType constraint `!(this is Null)` violated.\nValue: null\n\n    !(this is Null)\n    │\n    false\n\nxx | typealias NonNull = Any(!(this is Null))\n                             ^^^^^^^^^^^^^^^\nat intrinsifiedTypeAlias3#res1 (pkl:base)\n\nx | res1: NonNull = null\n                    ^^^^\nat intrinsifiedTypeAlias3#res1 (file:///$snippetsDir/input/errors/intrinsifiedTypeAlias3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/intrinsifiedTypeAlias4.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 42\n\nxxxx | typealias Uri = String\n                       ^^^^^^\nat intrinsifiedTypeAlias4#res1 (pkl:base)\n\nx | res1: Uri = 42\n                ^^\nat intrinsifiedTypeAlias4#res1 (file:///$snippetsDir/input/errors/intrinsifiedTypeAlias4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidBytes1.err",
    "content": "–– Pkl Error ––\nType constraint `isBetween(0, 255)` violated.\nValue: 65535\n\n    isBetween(0, 255)\n    │\n    false\n\nxxxx | typealias UInt8 = Int(isBetween(0, 255))\n                             ^^^^^^^^^^^^^^^^^\nat invalidBytes1#foo (pkl:base)\n\nx | foo = Bytes(0, 1, 2, 3, 0xffff)\n                            ^^^^^^\nat invalidBytes1#foo (file:///$snippetsDir/input/errors/invalidBytes1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidBytes2.err",
    "content": "–– Pkl Error ––\nType constraint `isBetween(0, 255)` violated.\nValue: 4095\n\n    isBetween(0, 255)\n    │\n    false\n\nxxxx | typealias UInt8 = Int(isBetween(0, 255))\n                             ^^^^^^^^^^^^^^^^^\nat invalidBytes2#res (pkl:base)\n\nx | res = Bytes(0, 1, 2, 3, num)\n                            ^^^\nat invalidBytes2#res (file:///$snippetsDir/input/errors/invalidBytes2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidBytes3.err",
    "content": "–– Pkl Error ––\nType constraint `isBetween(0, 255)` violated.\nValue: 65535\n\n    isBetween(0, 255)\n    │\n    false\n\nxxxx | typealias UInt8 = Int(isBetween(0, 255))\n                             ^^^^^^^^^^^^^^^^^\nat invalidBytes3#bytes (pkl:base)\n\nx | bytes = Bytes(0, 1, 2, 3, 0xffff)\n                              ^^^^^^\nat invalidBytes3#bytes (file:///$snippetsDir/input/errors/invalidBytes3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidBytes4.err",
    "content": "–– Pkl Error ––\nType constraint `isBetween(0, 255)` violated.\nValue: 65535\n\n    isBetween(0, 255)\n    │\n    false\n\nxxxx | typealias UInt8 = Int(isBetween(0, 255))\n                             ^^^^^^^^^^^^^^^^^\nat pkl.base#List.toBytes (pkl:base)\n\nx | res = List(1, 2, 3, 0xffff).toBytes()\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidBytes4#res (file:///$snippetsDir/input/errors/invalidBytes4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidCharacterEscape.err",
    "content": "–– Pkl Error ––\nInvalid character escape sequence `\\a`.\n\nValid character escape sequences are:  \\n  \\r  \\t  \\\"  \\\\\n\nx | res1 = \"xxx\\axxx\"\n               ^^\nat invalidCharacterEscape (file:///$snippetsDir/input/errors/invalidCharacterEscape.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassMethodModifier.err",
    "content": "–– Pkl Error ––\nModifier `open` is not applicable to methods.\n\nx | open function foo() = 42\n    ^^^^\nat invalidClassMethodModifier#Foo (file:///$snippetsDir/input/errors/invalidClassMethodModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassModifier.err",
    "content": "–– Pkl Error ––\nModifier `hidden` is not applicable to classes.\n\nx | hidden class Foo\n    ^^^^^^\nat invalidClassModifier (file:///$snippetsDir/input/errors/invalidClassModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassModifier2.err",
    "content": "–– Pkl Error ––\nModifier `fixed` is not applicable to classes.\n\nx | fixed class Foo\n    ^^^^^\nat invalidClassModifier2 (file:///$snippetsDir/input/errors/invalidClassModifier2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidClassPropertyModifier.err",
    "content": "–– Pkl Error ––\nModifier `open` is not applicable to properties.\n\nx | open foo: Int = 42\n    ^^^^\nat invalidClassPropertyModifier#Foo (file:///$snippetsDir/input/errors/invalidClassPropertyModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidFileUri1.err",
    "content": "–– Pkl Error ––\nResource URI `file:path/to/foo.txt` has invalid syntax.\n\nx | res = read(\"file:path/to/foo.txt\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidFileUri1#res (file:///$snippetsDir/input/errors/invalidFileUri1.pkl)\n\nFile URIs must have a path that starts with `/` (e.g. file:/path/to/my_module.pkl).\nTo resolve relative paths, remove the scheme prefix (remove \"file:\").\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidFileUri2.err",
    "content": "–– Pkl Error ––\nInvalid glob pattern `file:path/to/foo.txt`.\n\nx | res = read*(\"file:path/to/foo.txt\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidFileUri2#res (file:///$snippetsDir/input/errors/invalidFileUri2.pkl)\n\nScheme `file` requires a hierarchical path (there must be a `/` after the first colon).\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidFileUri3.err",
    "content": "–– Pkl Error ––\nModule URI `file:path/to/foo.pkl` has invalid syntax.\n\nx | res = import(\"file:path/to/foo.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidFileUri3#res (file:///$snippetsDir/input/errors/invalidFileUri3.pkl)\n\nFile URIs must have a path that starts with `/` (e.g. file:/path/to/my_module.pkl).\nTo resolve relative paths, remove the scheme prefix (remove \"file:\").\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidFileUri4.err",
    "content": "–– Pkl Error ––\nModule URI `file:path/to/foo.pkl` has invalid syntax.\n\nx | res = import*(\"file:path/to/foo.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidFileUri4#res (file:///$snippetsDir/input/errors/invalidFileUri4.pkl)\n\nFile URIs must have a path that starts with `/` (e.g. file:/path/to/my_module.pkl).\nTo resolve relative paths, remove the scheme prefix (remove \"file:\").\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport1.err",
    "content": "–– Pkl Error ––\nInvalid glob pattern `{foo{bar}}.pkl`.\n\nx | import* \"{foo{bar}}.pkl\" as invalidGlob\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobImport1#invalidGlob (file:///$snippetsDir/input/errors/invalidGlobImport1.pkl)\n\nSub-patterns cannot be nested. To fix, remove or escape the inner `{` character.\n\nx | res = invalidGlob\n          ^^^^^^^^^^^\nat invalidGlobImport1#res (file:///$snippetsDir/input/errors/invalidGlobImport1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport2.err",
    "content": "–– Pkl Error ––\nInvalid glob pattern `\\foo.pkl`.\n\nx | import* \"\\\\foo.pkl\" as invalidGlob\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobImport2#invalidGlob (file:///$snippetsDir/input/errors/invalidGlobImport2.pkl)\n\nInvalid escape character `\\f`.\n\nx | res = invalidGlob\n          ^^^^^^^^^^^\nat invalidGlobImport2#res (file:///$snippetsDir/input/errors/invalidGlobImport2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport3.err",
    "content": "–– Pkl Error ––\nInvalid glob pattern `foo.pkl\\`.\n\nx | import* \"foo.pkl\\\\\" as invalidGlob\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobImport3#invalidGlob (file:///$snippetsDir/input/errors/invalidGlobImport3.pkl)\n\nThe backslash (`\\`) is the escape character, and cannot terminate a glob pattern.\n\nx | res = invalidGlob\n          ^^^^^^^^^^^\nat invalidGlobImport3#res (file:///$snippetsDir/input/errors/invalidGlobImport3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport4.err",
    "content": "–– Pkl Error ––\nCannot combine glob imports with triple-dot module URIs.\n\nx | import* \".../input-helper/**.pkl\" as invalidGlob\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobImport4 (file:///$snippetsDir/input/errors/invalidGlobImport4.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport5.err",
    "content": "–– Pkl Error ––\nCannot expand glob pattern `https://www.apple.com/**.pkl` because scheme `https` is not globbable.\n\nx | import* \"https://www.apple.com/**.pkl\" as allPklModules\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobImport5#allPklModules (file:///$snippetsDir/input/errors/invalidGlobImport5.pkl)\n\nx | res = allPklModules\n          ^^^^^^^^^^^^^\nat invalidGlobImport5#res (file:///$snippetsDir/input/errors/invalidGlobImport5.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport6.err",
    "content": "–– Pkl Error ––\nInvalid glob pattern `../*/../*/../*/../*/../*/../*/../*.`.\n\nx | res = import*(\"../*/../*/../*/../*/../*/../*/../*.\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobImport6#res (file:///$snippetsDir/input/errors/invalidGlobImport6.pkl)\n\nThe glob pattern is too complex.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport7.err",
    "content": "–– Pkl Error ––\nExpected `globbedImports` to be a type, but it is not.\n\nx | res: globbedImports\n         ^^^^^^^^^^^^^^\nat invalidGlobImport7 (file:///$snippetsDir/input/errors/invalidGlobImport7.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobImport8.err",
    "content": "–– Pkl Error ––\nExpected `globbedImports` to be a type, but it is not.\n\nx | res: globbedImports.Foo\n         ^^^^^^^^^^^^^^\nat invalidGlobImport8 (file:///$snippetsDir/input/errors/invalidGlobImport8.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobRead1.err",
    "content": "–– Pkl Error ––\nInvalid glob pattern `{foo{bar}}.txt`.\n\nx | res = read*(\"{foo{bar}}.txt\")\n          ^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobRead1#res (file:///$snippetsDir/input/errors/invalidGlobRead1.pkl)\n\nSub-patterns cannot be nested. To fix, remove or escape the inner `{` character.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobRead2.err",
    "content": "–– Pkl Error ––\nCannot combine glob imports with triple-dot module URIs.\n\nx | res = read*(\".../foo/bar.txt\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobRead2#res (file:///$snippetsDir/input/errors/invalidGlobRead2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidGlobRead3.err",
    "content": "–– Pkl Error ––\nCannot expand glob pattern `https://www.google.com/**.pkl` because scheme `https` is not globbable.\n\nx | res = read*(\"https://www.google.com/**.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidGlobRead3#res (file:///$snippetsDir/input/errors/invalidGlobRead3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidImportBackslashSep.err",
    "content": "–– Pkl Error ––\nCannot find module `file:///$snippetsDir/input/errors/..%5Cbasic%5CbaseModule.pkl`.\n\nx | res = import(#\"..\\basic\\baseModule.pkl\"#)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidImportBackslashSep#res (file:///$snippetsDir/input/errors/invalidImportBackslashSep.pkl)\n\nTo resolve modules in nested directories, use `/` as the directory separator.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidImportUri.err",
    "content": "–– Pkl Error ––\nModule URI `file:///foo^bar.pkl` has invalid syntax.\n\nx | import \"file:///foo^bar.pkl\" as _foo\n           ^^^^^^^^^^^^^^^^^^^^^\nat invalidImportUri (file:///$snippetsDir/input/errors/invalidImportUri.pkl)\n\nIllegal character in path\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidMethodModifier.err",
    "content": "–– Pkl Error ––\nModifier `open` is not applicable to methods.\n\nx | open function foo() = 42\n    ^^^^\nat invalidMethodModifier (file:///$snippetsDir/input/errors/invalidMethodModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidModuleModifier.err",
    "content": "–– Pkl Error ––\nModifier `abstract` is not applicable to modules that amend another module.\n\nx | abstract module foo\n    ^^^^^^^^\nat foo (file:///$snippetsDir/input/errors/invalidModuleModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidObjectPropertyModifier.err",
    "content": "–– Pkl Error ––\nModifier `abstract` is not applicable to object members.\n\nx | abstract bar = 42\n    ^^^^^^^^\nat invalidObjectPropertyModifier#foo (file:///$snippetsDir/input/errors/invalidObjectPropertyModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput1.err",
    "content": "–– Pkl Error ––\nExpected `output` of module `file:///$snippetsDir/input/errors/invalidOutput1.pkl` to be of type `ModuleOutput`, but got type `String`.\n\nx | output: String = \"abc\"\n                     ^^^^^\nat output (file:///$snippetsDir/input/errors/invalidOutput1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput2.err",
    "content": "–– Pkl Error ––\nExpected `output` of module `file:///$snippetsDir/input/errors/invalidOutput2.pkl` to be of type `ModuleOutput`, but got type `invalidOutput2#Test`.\n\nx | output: Test = new {}\n                   ^^^^^^\nat output (file:///$snippetsDir/input/errors/invalidOutput2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidOutput3.err",
    "content": "–– Pkl Error ––\nExpected value of type `ModuleOutput`, but got `null`.\n\nxxx | hidden output: ModuleOutput = new {\n                     ^^^^^^^^^^^^\nat pkl.base#Module.output (pkl:base)\n\nx | output = null\n             ^^^^\nat invalidOutput3#output (file:///$snippetsDir/input/errors/invalidOutput3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidPropertyModifier.err",
    "content": "–– Pkl Error ––\nModifier `open` is not applicable to properties.\n\nx | open foo: Int = 42\n    ^^^^\nat invalidPropertyModifier (file:///$snippetsDir/input/errors/invalidPropertyModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTripleDotSyntax1.err",
    "content": "–– Pkl Error ––\nModule URI `.../` has invalid syntax.\n\nx | import \".../\"\n           ^^^^^^\nat invalidTripleDotSyntax1 (file:///$snippetsDir/input/errors/invalidTripleDotSyntax1.pkl)\n\nexpected `...` or `.../path/to/my_module.pkl`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTripleDotSyntax2.err",
    "content": "–– Pkl Error ––\nModule URI `...abc` has invalid syntax.\n\nx | import \"...abc\"\n           ^^^^^^^^\nat invalidTripleDotSyntax2 (file:///$snippetsDir/input/errors/invalidTripleDotSyntax2.pkl)\n\nexpected `...` or `.../path/to/my_module.pkl`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTypeAliasModifier.err",
    "content": "–– Pkl Error ––\nModifier `abstract` is not applicable to type aliases.\n\nx | abstract typealias Foo = Int\n    ^^^^^^^^\nat invalidTypeAliasModifier (file:///$snippetsDir/input/errors/invalidTypeAliasModifier.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTypeName1.err",
    "content": "–– Pkl Error ––\nExpected `base` to be a module import, but it is not.\n\nx | listing = new base.Listing {}\n                  ^^^^\nat invalidTypeName1#listing (file:///$snippetsDir/input/errors/invalidTypeName1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTypeName2.err",
    "content": "–– Pkl Error ––\nInvalid type name `x.y.Listing`.\n\nx | listing = new x.y.Listing {}\n                  ^^^^^^^^^^^\nat invalidTypeName2#listing (file:///$snippetsDir/input/errors/invalidTypeName2.pkl)\n\nA qualified type name consists of a module import name and a type name.\nExample: `importedModule.SomeClass`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTypeName3.err",
    "content": "–– Pkl Error ––\nCannot find module import `Foo`.\n\nx | bar = new Foo.Bar {}\n              ^^^\nat invalidTypeName3#bar (file:///$snippetsDir/input/errors/invalidTypeName3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidTypeName4.err",
    "content": "–– Pkl Error ––\nExpected `Foo2` to be a type, but it is not.\n\nx | foo2 = new Foo2 {}\n               ^^^^\nat invalidTypeName4#foo2 (file:///$snippetsDir/input/errors/invalidTypeName4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/invalidUnicodeEscape.err",
    "content": "–– Pkl Error ––\nInvalid Unicode escape sequence `\\u{12x}`.\n\nValid Unicode escape sequences are \\u{0} to \\u{10FFFF} (1-6 hexadecimal characters).\n\nx | res1 = \"\\u{12x}\"\n            ^^^^^^^\nat invalidUnicodeEscape (file:///$snippetsDir/input/errors/invalidUnicodeEscape.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/keywordNotAllowedHere1.err",
    "content": "–– Pkl Error ––\nKeyword `outer` is not allowed here.\n\nIf you must use this name as identifier, enclose it in backticks.\n\nx | outer = 42\n    ^^^^^\nat keywordNotAllowedHere1 (file:///$snippetsDir/input/errors/keywordNotAllowedHere1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/keywordNotAllowedHere2.err",
    "content": "–– Pkl Error ––\nKeyword `outer` is not allowed here.\n\nIf you must use this name as identifier, enclose it in backticks.\n\nx | function outer() = 42\n             ^^^^^\nat keywordNotAllowedHere2 (file:///$snippetsDir/input/errors/keywordNotAllowedHere2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/keywordNotAllowedHere3.err",
    "content": "–– Pkl Error ––\nKeyword `outer` is not allowed here.\n\nIf you must use this name as identifier, enclose it in backticks.\n\nx | res1 = outer.outer\n                 ^^^^^\nat keywordNotAllowedHere3 (file:///$snippetsDir/input/errors/keywordNotAllowedHere3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/keywordNotAllowedHere4.err",
    "content": "–– Pkl Error ––\nKeyword `record` is not allowed here.\n\nIf you must use this name as identifier, enclose it in backticks.\n\nx | record = 5\n    ^^^^^^\nat keywordNotAllowedHere4 (file:///$snippetsDir/input/errors/keywordNotAllowedHere4.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/letExpressionError1.err",
    "content": "–– Pkl Error ––\nouch\n\nx | throw(\"ouch\")\n    ^^^^^^^^^^^^^\nat letExpressionError1#res1.<function#2> (file:///$snippetsDir/input/errors/letExpressionError1.pkl)\n\nx | let (y = 2)\n    ^^^^^^^^^^^\nat letExpressionError1#res1.<function#1> (file:///$snippetsDir/input/errors/letExpressionError1.pkl)\n\nx | let (x = 1)\n    ^^^^^^^^^^^\nat letExpressionError1#res1 (file:///$snippetsDir/input/errors/letExpressionError1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/letExpressionError2.err",
    "content": "–– Pkl Error ––\nouch\n\nx | let (y = throw(\"ouch\"))\n             ^^^^^^^^^^^^^\nat letExpressionError2#res1.<function#1> (file:///$snippetsDir/input/errors/letExpressionError2.pkl)\n\nx | let (x = 1)\n    ^^^^^^^^^^^\nat letExpressionError2#res1 (file:///$snippetsDir/input/errors/letExpressionError2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/letExpressionErrorTyped.err",
    "content": "–– Pkl Error ––\nExpected value of type `Float`, but got type `String`.\nValue: \"abc\"\n\nx | let (x: Float = \"abc\")\n            ^^^^^\nat letExpressionErrorTyped#res1.<function#1> (file:///$snippetsDir/input/errors/letExpressionErrorTyped.pkl)\n\nx | let (x: Float = \"abc\")\n    ^^^^^^^^^^^^^^^^^^^^^^\nat letExpressionErrorTyped#res1 (file:///$snippetsDir/input/errors/letExpressionErrorTyped.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError1.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res = new Listing<String> {\n                      ^^^^^^\nat listingTypeCheckError1#res (file:///$snippetsDir/input/errors/listingTypeCheckError1.pkl)\n\nx | 1\n    ^\nat listingTypeCheckError1#res[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError2.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res = new Listing<String> {\n                      ^^^^^^\nat listingTypeCheckError2#res (file:///$snippetsDir/input/errors/listingTypeCheckError2.pkl)\n\nx | one\n    ^^^\nat listingTypeCheckError2#res[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError3.err",
    "content": "–– Pkl Error ––\nType constraint `!isEmpty` violated.\nValue: \"\"\n\n    !isEmpty\n    ││\n    │true\n    false\n\nx | res: Listing<String(!isEmpty)> = new Listing<String> {\n                        ^^^^^^^^\nat listingTypeCheckError3#res (file:///$snippetsDir/input/errors/listingTypeCheckError3.pkl)\n\nx | \"\"\n    ^^\nat listingTypeCheckError3#res[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError4.err",
    "content": "–– Pkl Error ––\nType constraint `endsWith(\"ga\")` violated.\nValue: \"hola\"\n\n    endsWith(\"ga\")\n    │\n    false\n\nx | res: Listing<String(!isEmpty)> = new Listing<String(endsWith(\"ga\"))> {\n                                                        ^^^^^^^^^^^^^^\nat listingTypeCheckError4#res (file:///$snippetsDir/input/errors/listingTypeCheckError4.pkl)\n\nx | \"hola\"\n    ^^^^^^\nat listingTypeCheckError4#res[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError5.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | local l = new Listing { 1; 2; 3 } as Listing<String>\n                                                 ^^^^^^\nat listingTypeCheckError5#l (file:///$snippetsDir/input/errors/listingTypeCheckError5.pkl)\n\nx | local l = new Listing { 1; 2; 3 } as Listing<String>\n                            ^\nat listingTypeCheckError5#l[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError5.pkl)\n\nx | res = l[0]\n          ^^^^\nat listingTypeCheckError5#res (file:///$snippetsDir/input/errors/listingTypeCheckError5.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError6.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | local listing2: Listing<String> = listing1\n                            ^^^^^^\nat listingTypeCheckError6#listing2 (file:///$snippetsDir/input/errors/listingTypeCheckError6.pkl)\n\nx | local listing1: Listing<Int> = new { 1 }\n                                         ^\nat listingTypeCheckError6#listing1[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError6.pkl)\n\nx | first = listing3[0]\n            ^^^^^^^^^^^\nat listingTypeCheckError6#first (file:///$snippetsDir/input/errors/listingTypeCheckError6.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError7.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | bar: Listing<String> = (foo) { \"bar\" }\n                 ^^^^^^\nat listingTypeCheckError7#bar (file:///$snippetsDir/input/errors/listingTypeCheckError7.pkl)\n\nx | foo: Listing = new { 1; 2; 3 }\n                         ^\nat listingTypeCheckError7#foo[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError7.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError8.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 0\n\nx | local b = a as Listing<Listing<String>>\n                                   ^^^^^^\nat listingTypeCheckError8#b (file:///$snippetsDir/input/errors/listingTypeCheckError8.pkl)\n\nx | local a = new Listing { new Listing { 0 } }\n                                          ^\nat listingTypeCheckError8#a[#1][#1] (file:///$snippetsDir/input/errors/listingTypeCheckError8.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/listingTypeCheckError9.err",
    "content": "–– Pkl Error ––\nExpected value of type `listingTypeCheckError9#Bar`, but got type `listingTypeCheckError9#Foo`.\nValue: new Foo {}\n\nx | local c = b as Listing<Bar>\n                           ^^^\nat listingTypeCheckError9#c (file:///$snippetsDir/input/errors/listingTypeCheckError9.pkl)\n\nx | local a = new Listing { new Foo {} }\n                            ^^^^^^^^^^\nat listingTypeCheckError9#a[#1] (file:///$snippetsDir/input/errors/listingTypeCheckError9.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/localFixedMember.err",
    "content": "–– Pkl Error ––\nModifier `fixed` is redundant here; just use `local`.\n\nx | local fixed name: String = \"hello\"\n          ^^^^^\nat localFixedMember (file:///$snippetsDir/input/errors/localFixedMember.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/localFunctionWithTypeParameter.err",
    "content": "–– Pkl Error ––\nOnly standard library members can have type parameters.\n\nx | local function x<T>() = x\n                     ^\nat localFunctionWithTypeParameter (file:///$snippetsDir/input/errors/localFunctionWithTypeParameter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/localHiddenMember.err",
    "content": "–– Pkl Error ––\nModifier `hidden` is redundant here; just use `local`.\n\nx | local hidden name: String\n          ^^^^^^\nat localHiddenMember (file:///$snippetsDir/input/errors/localHiddenMember.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError1.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res = new Mapping<String, String> {\n                              ^^^^^^\nat mappingTypeCheckError1#res (file:///$snippetsDir/input/errors/mappingTypeCheckError1.pkl)\n\nx | [\"foo\"] = 1\n              ^\nat mappingTypeCheckError1#res[\"foo\"] (file:///$snippetsDir/input/errors/mappingTypeCheckError1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError10.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | bar: Mapping<String, String> = (foo) { [\"baz\"] = \"three\" }\n                         ^^^^^^\nat mappingTypeCheckError10#bar (file:///$snippetsDir/input/errors/mappingTypeCheckError10.pkl)\n\nx | foo: Mapping = new { [\"foo\"] = 1; [\"bar\"] = 2 }\n                                   ^\nat mappingTypeCheckError10#foo[\"foo\"] (file:///$snippetsDir/input/errors/mappingTypeCheckError10.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError11.err",
    "content": "–– Pkl Error ––\nExpected value of type `mappingTypeCheckError11#Bar`, but got type `mappingTypeCheckError11#Foo`.\nValue: new Foo {}\n\nx | local c = b as Mapping<Int, Bar>\n                                ^^^\nat mappingTypeCheckError11#c (file:///$snippetsDir/input/errors/mappingTypeCheckError11.pkl)\n\nx | local a = new Mapping { [0] = new Foo {} }\n                                  ^^^^^^^^^^\nat mappingTypeCheckError11#a[0] (file:///$snippetsDir/input/errors/mappingTypeCheckError11.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError2.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res: Mapping<String, String> = new {\n                         ^^^^^^\nat mappingTypeCheckError2#res (file:///$snippetsDir/input/errors/mappingTypeCheckError2.pkl)\n\nx | [\"foo\"] = 1\n              ^\nat mappingTypeCheckError2#res[\"foo\"] (file:///$snippetsDir/input/errors/mappingTypeCheckError2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError3.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res: Mapping<String, String> = new {\n                 ^^^^^^\nat mappingTypeCheckError3#res (file:///$snippetsDir/input/errors/mappingTypeCheckError3.pkl)\n\nx | [1] = \"foo\"\n     ^\nat mappingTypeCheckError3#res[1] (file:///$snippetsDir/input/errors/mappingTypeCheckError3.pkl)\n\nx | res: Mapping<String, String> = new {\n                                   ^^^^^\nat mappingTypeCheckError3#res (file:///$snippetsDir/input/errors/mappingTypeCheckError3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError4.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res: Mapping<String, String> = new {\n                 ^^^^^^\nat mappingTypeCheckError4#res (file:///$snippetsDir/input/errors/mappingTypeCheckError4.pkl)\n\nx | [num] = \"foo\"\n     ^^^\nat mappingTypeCheckError4#res[#1] (file:///$snippetsDir/input/errors/mappingTypeCheckError4.pkl)\n\nx | res: Mapping<String, String> = new {\n                                   ^^^^^\nat mappingTypeCheckError4#res (file:///$snippetsDir/input/errors/mappingTypeCheckError4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError5.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res: Mapping<String, String> = new {\n                 ^^^^^^\nat mappingTypeCheckError5#res (file:///$snippetsDir/input/errors/mappingTypeCheckError5.pkl)\n\nx | [1] = \"foo\"\n     ^\nat mappingTypeCheckError5#res[1] (file:///$snippetsDir/input/errors/mappingTypeCheckError5.pkl)\n\nx | res: Mapping<String, String> = new {\n                                   ^^^^^\nat mappingTypeCheckError5#res (file:///$snippetsDir/input/errors/mappingTypeCheckError5.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError6.err",
    "content": "–– Pkl Error ––\nType constraint `length == 5` violated.\nValue: \"hi\"\n\n    length == 5\n    │      │\n    2      false\n\nxx | res: Mapping<Listing<String(length == 5)>, String> = bar\n                                 ^^^^^^^^^^^\nat mappingTypeCheckError6#res (file:///$snippetsDir/input/errors/mappingTypeCheckError6.pkl)\n\nx | [b] = \"foo\"\n     ^\nat mappingTypeCheckError6#bar[#1] (file:///$snippetsDir/input/errors/mappingTypeCheckError6.pkl)\n\nxx | res: Mapping<Listing<String(length == 5)>, String> = bar\n                                                          ^^^\nat mappingTypeCheckError6#res (file:///$snippetsDir/input/errors/mappingTypeCheckError6.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError7.err",
    "content": "–– Pkl Error ––\nType constraint `length == 5` violated.\nValue: \"hi\"\n\n    length == 5\n    │      │\n    2      false\n\nx | res = new Mapping<Listing<String(length == 5)>, String> {\n                                     ^^^^^^^^^^^\nat mappingTypeCheckError7#res (file:///$snippetsDir/input/errors/mappingTypeCheckError7.pkl)\n\nx | [new Listing { \"hi\" }] = \"hi\"\n     ^^^^^^^^^^^^^^^^^^^^\nat mappingTypeCheckError7#res[#1] (file:///$snippetsDir/input/errors/mappingTypeCheckError7.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError8.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | res: Mapping<String, String> = new {\n                         ^^^^^^\nat mappingTypeCheckError8#res (file:///$snippetsDir/input/errors/mappingTypeCheckError8.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/mappingTypeCheckError9.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 1\n\nx | local mapping2: Mapping<String, String> = mapping1\n                                    ^^^^^^\nat mappingTypeCheckError9#mapping2 (file:///$snippetsDir/input/errors/mappingTypeCheckError9.pkl)\n\nx | local mapping1: Mapping<String, Int> = new { [\"foo\"] = 1 }\n                                                           ^\nat mappingTypeCheckError9#mapping1[\"foo\"] (file:///$snippetsDir/input/errors/mappingTypeCheckError9.pkl)\n\nx | first = mapping3[\"foo\"]\n            ^^^^^^^^^^^^^^^\nat mappingTypeCheckError9#first (file:///$snippetsDir/input/errors/mappingTypeCheckError9.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/missingLocalPropertyValue1.err",
    "content": "–– Pkl Error ––\nMissing property value.\n\nx | local x: Int\n                ^\nat missingLocalPropertyValue1#x (file:///$snippetsDir/input/errors/missingLocalPropertyValue1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/missingLocalPropertyValue2.err",
    "content": "–– Pkl Error ––\nMissing property value.\n\nx | local x: Int\n                ^\nat missingLocalPropertyValue2#x (file:///$snippetsDir/input/errors/missingLocalPropertyValue2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleAmendsSelf.err",
    "content": "–– Pkl Error ––\nModule `moduleAmendsSelf` cannot amend itself.\n\nx | amends \"moduleAmendsSelf.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleAmendsSelf (file:///$snippetsDir/input/errors/moduleAmendsSelf.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleAmendsVersionCheck.err",
    "content": "–– Pkl Error ––\nModule `moduleWithHighMinPklVersion` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n\nx | amends \"moduleWithHighMinPklVersion.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleAmendsVersionCheck (file:///$snippetsDir/input/errors/moduleAmendsVersionCheck.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleAmendsVersionCheck2.err",
    "content": "–– Pkl Error ––\nModule `moduleAmendsVersionCheck2` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleExpected.err",
    "content": "–– Pkl Error ––\nExpected a module as argument, but got an object that amends a module.\n\nx | hidden path: List<String> = import(\"moduleExpected.pkl\").relativePathTo(module)\n                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleExpected#path (file:///$snippetsDir/input/errors/moduleExpected.pkl)\n\nx | result = (module) { dummy = 0 }.path\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleExpected#result (file:///$snippetsDir/input/errors/moduleExpected.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleExtendsSelf.err",
    "content": "–– Pkl Error ––\nModule `moduleExtendsSelf` cannot extend itself.\n\nx | extends \"moduleExtendsSelf.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleExtendsSelf (file:///$snippetsDir/input/errors/moduleExtendsSelf.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleExtendsVersionCheck.err",
    "content": "–– Pkl Error ––\nModule `moduleWithHighMinPklVersion` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n\nx | extends \"moduleWithHighMinPklVersion.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleExtendsVersionCheck (file:///$snippetsDir/input/errors/moduleExtendsVersionCheck.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleExtendsVersionCheck2.err",
    "content": "–– Pkl Error ––\nModule `moduleExtendsVersionCheck2` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleImportVersionCheck.err",
    "content": "–– Pkl Error ––\nModule `moduleWithHighMinPklVersion` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n\nx | import \"moduleWithHighMinPklVersion.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleImportVersionCheck#moduleWithHighMinPklVersion (file:///$snippetsDir/input/errors/moduleImportVersionCheck.pkl)\n\nx | res1 = moduleWithHighMinPklVersion.x\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat moduleImportVersionCheck#res1 (file:///$snippetsDir/input/errors/moduleImportVersionCheck.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleWithHighMinPklVersion.err",
    "content": "–– Pkl Error ––\nModule `moduleWithHighMinPklVersion` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/moduleWithHighMinPklVersionAndParseErrors.err",
    "content": "–– Pkl Error ––\nModule `moduleWithHighMinPklVersionAndParseErrors` requires Pkl version 99.9.9 or higher, but your Pkl version is xxx.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/multipleDefaults.err",
    "content": "–– Pkl Error ––\nA type union cannot have more than one default type.\n\nx | foo: *Int|*String|*\"foo\"\n              ^\nat multipleDefaults (file:///$snippetsDir/input/errors/multipleDefaults.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/nested1.err",
    "content": "–– Pkl Error ––\nKeyword `outer` is not allowed here.\n\nIf you must use this name as identifier, enclose it in backticks.\n\nx | x = outer.outer // nested syntax error\n              ^^^^^\nat nested1 (file:///$snippetsDir/input/errors/nested1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/noDefault.err",
    "content": "–– Pkl Error ––\nTried to read property `foo` but its value is undefined.\n\nx | foo: \"foo\"|\"bar\"|\"baz\"\n    ^^^\nat noDefault#foo (file:///$snippetsDir/input/errors/noDefault.pkl)\n\nThe above error occurred when rendering path `foo` of module `file:///$snippetsDir/input/errors/noDefault.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/noDefault2.err",
    "content": "–– Pkl Error ––\nTried to read property `foo` but its value is undefined.\n\nx | foo: Foo|\"baz\"\n    ^^^\nat noDefault2#foo (file:///$snippetsDir/input/errors/noDefault2.pkl)\n\nThe above error occurred when rendering path `foo` of module `file:///$snippetsDir/input/errors/noDefault2.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/notAUnionDefault.err",
    "content": "–– Pkl Error ––\nOnly type unions can have a default marker (*).\n\nx | foo: *\"foo\"\n         ^^^^^^\nat notAUnionDefault (file:///$snippetsDir/input/errors/notAUnionDefault.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/objectCannotHaveElement.err",
    "content": "–– Pkl Error ––\nObject of type `objectCannotHaveElement#Foo` cannot have an element.\n\nxx | (nestedStructure.propertyInNestedStructure) {\n     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat objectCannotHaveElement#foo (file:///$snippetsDir/input/errors/objectCannotHaveElement.pkl)\n\nOnly objects of type `Listing` and `Dynamic` can have elements. If you did not mean to add an element, you probably got the syntax wrong. For example, `obj { name }` adds an element, whereas `obj { name = \"Pigeon\" }` sets a property.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/objectCannotHaveElement2.err",
    "content": "–– Pkl Error ––\nObject of type `objectCannotHaveElement2#Foo` cannot have an element.\n\nxx | (nestedStructure.propertyInNestedStructure) { \"Hello world!!!\" }\n     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat objectCannotHaveElement2#foo2 (file:///$snippetsDir/input/errors/objectCannotHaveElement2.pkl)\n\nOnly objects of type `Listing` and `Dynamic` can have elements. If you did not mean to add an element, you probably got the syntax wrong. For example, `obj { name }` adds an element, whereas `obj { name = \"Pigeon\" }` sets a property.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/objectCannotHavePredicateMember.err",
    "content": "–– Pkl Error ––\nObject of type `objectCannotHavePredicateMember#Foo` cannot have a predicate member.\n\nx | [[true]] = 42\n      ^^^^\nat objectCannotHavePredicateMember#res1 (file:///$snippetsDir/input/errors/objectCannotHavePredicateMember.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/outOfRange1.err",
    "content": "–– Pkl Error ––\nCharacter index `4` is out of range `0`..`2`.\nString: \"abc\"\n\nx | res1 = \"abc\"[4]\n                 ^\nat outOfRange1#res1 (file:///$snippetsDir/input/errors/outOfRange1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/outOfRange2.err",
    "content": "–– Pkl Error ––\nCharacter index `1` is out of range `2`..`3`.\nString: \"abc\"\n\nx | res1 = \"abc\".substring(2, 1)\n           ^^^^^^^^^^^^^^^^^^^^^\nat outOfRange2#res1 (file:///$snippetsDir/input/errors/outOfRange2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/outOfRange3.err",
    "content": "–– Pkl Error ––\nElement index `1` is out of range `2`..`3`.\nCollection: List(1, 2, 3)\n\nx | res1 = List(1, 2, 3).sublist(2, 1)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat outOfRange3#res1 (file:///$snippetsDir/input/errors/outOfRange3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser1.err",
    "content": "–– Pkl Error ––\nUnexpected end of file.\n\nx | res1 = 9#\n            ^\nat parser1 (file:///$snippetsDir/input/errors/parser1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser10.err",
    "content": "–– Pkl Error ––\nUnexpected token `[`. Expected a type or `{`.\n\nx | res1 = new [ 42 }\n               ^\nat parser10 (file:///$snippetsDir/input/errors/parser10.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser11.err",
    "content": "–– Pkl Error ––\nUnexpected token `]`. Expected `}`.\n\nx | res1 = new { foo = 42 ]\n                          ^\nat parser11 (file:///$snippetsDir/input/errors/parser11.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser12.err",
    "content": "–– Pkl Error ––\nInvalid token at position. Expected a class, typealias, method, or property.\n\nx | res1 = new { foo = 42 }}\n                           ^\nat parser12 (file:///$snippetsDir/input/errors/parser12.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser14.err",
    "content": "–– Pkl Error ––\nUnexpected end of file.\n\nx | \n    ^\nat parser14 (file:///$snippetsDir/input/errors/parser14.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser15.err",
    "content": "–– Pkl Error ––\nUnexpected separator character.\n\nThe separator character (`_`) cannot follow `0x`, `0b`, `.`, `e`, or 'E' in a number literal.\n\nx | res = 100e_10\n              ^\nat parser15 (file:///$snippetsDir/input/errors/parser15.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser16.err",
    "content": "–– Pkl Error ––\nUnexpected separator character.\n\nThe separator character (`_`) cannot follow `0x`, `0b`, `.`, `e`, or 'E' in a number literal.\n\nx | res = 0x_01\n            ^\nat parser16 (file:///$snippetsDir/input/errors/parser16.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser17.err",
    "content": "–– Pkl Error ––\nUnexpected separator character.\n\nThe separator character (`_`) cannot follow `0x`, `0b`, `.`, `e`, or 'E' in a number literal.\n\nx | res = 0b_01\n            ^\nat parser17 (file:///$snippetsDir/input/errors/parser17.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser18.err",
    "content": "–– Pkl Error ––\nUnexpected separator character.\n\nThe separator character (`_`) cannot follow `0x`, `0b`, `.`, `e`, or 'E' in a number literal.\n\nx | res = 100._01\n              ^\nat parser18 (file:///$snippetsDir/input/errors/parser18.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser2.err",
    "content": "–– Pkl Error ––\nMissing `\"` delimiter.\n\nx | res1 = \"some string\n                       ^\nat parser2 (file:///$snippetsDir/input/errors/parser2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser3.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"` delimiter.\n\nx | res1 = \"\"\"some string\n                         ^\nat parser3 (file:///$snippetsDir/input/errors/parser3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser4.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"` delimiter.\n\nx | res2 = 2\n            ^\nat parser4 (file:///$snippetsDir/input/errors/parser4.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser5.err",
    "content": "–– Pkl Error ––\nInvalid token at position. Expected a class, typealias, method, or property.\n\nx | res1 = \"some string\"\"\"\n                        ^\nat parser5 (file:///$snippetsDir/input/errors/parser5.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser6.err",
    "content": "–– Pkl Error ––\nMissing `\"\"\"` delimiter.\n\nx | res1 = \"\"\"some string\"\n                          ^\nat parser6 (file:///$snippetsDir/input/errors/parser6.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser7.err",
    "content": "–– Pkl Error ––\nUnexpected token `11`. Expected a type.\n\nx | res1 = a@11\n             ^^\nat parser7 (file:///$snippetsDir/input/errors/parser7.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser8.err",
    "content": "–– Pkl Error ––\nLine must match or exceed indentation of the String's last line.\n\nx | mismatched indent\n    ^^^^^^^^^^^^^^^^^\nat parser8 (file:///$snippetsDir/input/errors/parser8.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/parser9.err",
    "content": "–– Pkl Error ––\nLine must match or exceed indentation of the String's last line.\n\nx | mismatched indent\n    ^^^^^^^^^^^^^^^^^\nat parser9 (file:///$snippetsDir/input/errors/parser9.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints1.err",
    "content": "–– Pkl Error ––\nType constraint `this == \"foo\"` violated.\nValue: \"bar\"\n\n    this == \"foo\"\n    │    │\n    │    false\n    \"bar\"\n\nx | foo: String(this == \"foo\") = \"bar\"\n                ^^^^^^^^^^^^^\nat typeConstraints1#foo (file:///$snippetsDir/input/errors/power/typeConstraints1.pkl)\n\nx | foo: String(this == \"foo\") = \"bar\"\n                                 ^^^^^\nat typeConstraints1#foo (file:///$snippetsDir/input/errors/power/typeConstraints1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints10.err",
    "content": "–– Pkl Error ––\nType constraint `this == new Dynamic { ...list }` violated.\nValue: new Dynamic {}\n\n    this == new Dynamic { ...list }\n    │    │  │                │\n    │    │  │                List(1, 2, 3)\n    │    │  new Dynamic { 1; 2; 3 }\n    │    false\n    new Dynamic {}\n\nx | foo: Dynamic(this == new Dynamic { ...list })\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints10#foo (file:///$snippetsDir/input/errors/power/typeConstraints10.pkl)\n\nx | foo: Dynamic(this == new Dynamic { ...list })\n    ^^^\nat typeConstraints10#foo (file:///$snippetsDir/input/errors/power/typeConstraints10.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints11.err",
    "content": "–– Pkl Error ––\nType constraint `this == new Dynamic { for (elem in list) { elem + 1 } }` violated.\nValue: new Dynamic {}\n\n    this == new Dynamic { for (elem in list) { elem + 1 } }\n    │    │  │                          │\n    │    │  new Dynamic { 2 }          List(1)\n    │    false\n    new Dynamic {}\n\nx | foo: Dynamic(this == new Dynamic { for (elem in list) { elem + 1 } })\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints11#foo (file:///$snippetsDir/input/errors/power/typeConstraints11.pkl)\n\nx | foo: Dynamic(this == new Dynamic { for (elem in list) { elem + 1 } })\n    ^^^\nat typeConstraints11#foo (file:///$snippetsDir/input/errors/power/typeConstraints11.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints12.err",
    "content": "–– Pkl Error ––\nType constraint `this.length > 5` violated.\nValue: \"bob\"\n\n    this.length > 5\n    │    │      │\n    │    3      false\n    \"bob\"\n\nx | foo: String(true, this.length > 5) = \"bob\"\n                      ^^^^^^^^^^^^^^^\nat typeConstraints12#foo (file:///$snippetsDir/input/errors/power/typeConstraints12.pkl)\n\nx | foo: String(true, this.length > 5) = \"bob\"\n                                         ^^^^^\nat typeConstraints12#foo (file:///$snippetsDir/input/errors/power/typeConstraints12.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints13.err",
    "content": "–– Pkl Error ––\nType constraint `this == \"Hello, \\(name)\"` violated.\nValue: \"Hello, Patty\"\n\n    this == \"Hello, \\(name)\"\n    │    │  │         │\n    │    │  │         \"Bub\"\n    │    │  \"Hello, Bub\"\n    │    false\n    \"Hello, Patty\"\n\nx | foo: String(this == \"Hello, \\(name)\") = \"Hello, Patty\"\n                ^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints13#foo (file:///$snippetsDir/input/errors/power/typeConstraints13.pkl)\n\nx | foo: String(this == \"Hello, \\(name)\") = \"Hello, Patty\"\n                                            ^^^^^^^^^^^^^^\nat typeConstraints13#foo (file:///$snippetsDir/input/errors/power/typeConstraints13.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints14.err",
    "content": "–– Pkl Error ––\nType constraint `startsWith(super.name)` violated.\nValue: \"Bubby\"\n\n    startsWith(super.name)\n    │                │\n    false            \"Foo\"\n\nx | bub: String(startsWith(super.name)) = \"Bubby\"\n                ^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints14#Bar.bub (file:///$snippetsDir/input/errors/power/typeConstraints14.pkl)\n\nx | bub: String(startsWith(super.name)) = \"Bubby\"\n                                          ^^^^^^^\nat typeConstraints14#Bar.bub (file:///$snippetsDir/input/errors/power/typeConstraints14.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints15.err",
    "content": "–– Pkl Error ––\nExpected value of type `String(this == \"foo\") | String(this == \"qux\")`, but got a different `String`.\nValue: \"bar\"\n\nx | foo: String(this == \"foo\") | String(this == \"qux\") = \"bar\"\n         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints15#foo (file:///$snippetsDir/input/errors/power/typeConstraints15.pkl)\n\n* Value is not of type `String(this == \"foo\")` because:\n  Type constraint `this == \"foo\"` violated.\n  Value: \"bar\"\n\n      this == \"foo\"\n      │    │\n      │    false\n      \"bar\"\n\n* Value is not of type `String(this == \"qux\")` because:\n  Type constraint `this == \"qux\"` violated.\n  Value: \"bar\"\n\n      this == \"qux\"\n      │    │\n      │    false\n      \"bar\"\n\nx | foo: String(this == \"foo\") | String(this == \"qux\") = \"bar\"\n                                                         ^^^^^\nat typeConstraints15#foo (file:///$snippetsDir/input/errors/power/typeConstraints15.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints16.err",
    "content": "–– Pkl Error ––\nType constraint `name?.contains(\"Bob\") ?? false` violated.\nValue: new Bird { name = \"Pigeon\" }\n\n    name?.contains(\"Bob\") ?? false\n    │     │               │\n    │     false           false\n    \"Pigeon\"\n\nx | p: Bird(name?.contains(\"Bob\") ?? false) = new {\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints16#p (file:///$snippetsDir/input/errors/power/typeConstraints16.pkl)\n\nx | p: Bird(name?.contains(\"Bob\") ?? false) = new {\n                                              ^^^^^\nat typeConstraints16#p (file:///$snippetsDir/input/errors/power/typeConstraints16.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints17.err",
    "content": "–– Pkl Error ––\nType constraint `greet(name) == \"Hello, \\(name)!\"` violated.\nValue: null\n\n    greet(name) == \"Hello, \\(name)!\"\n    │     │     │  │         │\n    │     │     │  │         \"Bob\"\n    │     │     │  \"Hello, Bob!\"\n    │     │     false\n    │     \"Bob\"\n    \"Hello, Bob\"\n\nx | foo: Any(greet(name) == \"Hello, \\(name)!\") = null\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints17#foo (file:///$snippetsDir/input/errors/power/typeConstraints17.pkl)\n\nx | foo: Any(greet(name) == \"Hello, \\(name)!\") = null\n                                                 ^^^^\nat typeConstraints17#foo (file:///$snippetsDir/input/errors/power/typeConstraints17.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints2.err",
    "content": "–– Pkl Error ––\nType constraint `startsWith(bub.name)` violated.\nValue: \"Huzzah\"\n\n    startsWith(bub.name)\n    │          │   │\n    false      │   \"Bub\"\n               new Person { name = \"Bub\" }\n\nx | foo: String(startsWith(bub.name)) = \"Huzzah\"\n                ^^^^^^^^^^^^^^^^^^^^\nat typeConstraints2#foo (file:///$snippetsDir/input/errors/power/typeConstraints2.pkl)\n\nx | foo: String(startsWith(bub.name)) = \"Huzzah\"\n                                        ^^^^^^^^\nat typeConstraints2#foo (file:///$snippetsDir/input/errors/power/typeConstraints2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints3.err",
    "content": "–– Pkl Error ––\nType constraint `this\n  + two\n    / three\n  == four` violated.\nValue: 4\n\n    this\n    │\n    4\n\n    + two\n    │ │\n    │ 2\n    4.666666666666667\n\n      / three\n      │ │\n      │ 3\n      0.6666666666666666\n\n    == four\n    │  │\n    │  4\n    false\n\nx | foo: Int(this\n             ^^^^\nat typeConstraints3#foo (file:///$snippetsDir/input/errors/power/typeConstraints3.pkl)\n\nx | == four) = 4\n               ^\nat typeConstraints3#foo (file:///$snippetsDir/input/errors/power/typeConstraints3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints4.err",
    "content": "–– Pkl Error ––\nType constraint `fold(0, (a, b) -> a + b) == 5` violated.\nValue: List(1, 2, 3)\n\n    fold(0, (a, b) -> a + b) == 5\n    │                        │\n    6                        false\n\nx | foo: List(fold(0, (a, b) -> a + b) == 5) = myList\n              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints4#foo (file:///$snippetsDir/input/errors/power/typeConstraints4.pkl)\n\nx | foo: List(fold(0, (a, b) -> a + b) == 5) = myList\n                                               ^^^^^^\nat typeConstraints4#foo (file:///$snippetsDir/input/errors/power/typeConstraints4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints5.err",
    "content": "–– Pkl Error ––\nType constraint `isCapitalized` violated.\nValue: \"hello\"\n\n    (it: String) -> it == it.capitalize()\n                    │  │  │  │\n                    │  │  │  \"Hello\"\n                    │  │  \"hello\"\n                    │  false\n                    \"hello\"\n\nx | foo: String(isCapitalized) = \"hello\"\n                ^^^^^^^^^^^^^\nat typeConstraints5#foo (file:///$snippetsDir/input/errors/power/typeConstraints5.pkl)\n\nx | foo: String(isCapitalized) = \"hello\"\n                                 ^^^^^^^\nat typeConstraints5#foo (file:///$snippetsDir/input/errors/power/typeConstraints5.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints6.err",
    "content": "–– Pkl Error ––\nType constraint `isCapitalized` violated.\nValue: \"hello\"\n\n    (it: String) ->\n    let (first = it.take(1).toUpperCase())\n                 │  │       │\n                 │  \"h\"     \"H\"\n                 \"hello\"\n\n      it == \"\\(first)\\(it.drop(1))\"\n      │  │  │  │       │  │\n      │  │  │  \"H\"     │  \"ello\"\n      │  │  \"Hello\"    \"hello\"\n      │  false\n      \"hello\"\n\nx | foo: String(isCapitalized) = \"hello\"\n                ^^^^^^^^^^^^^\nat typeConstraints6#foo (file:///$snippetsDir/input/errors/power/typeConstraints6.pkl)\n\nx | foo: String(isCapitalized) = \"hello\"\n                                 ^^^^^^^\nat typeConstraints6#foo (file:///$snippetsDir/input/errors/power/typeConstraints6.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints7.err",
    "content": "–– Pkl Error ––\nType constraint `isBetween(0, 255)` violated.\nValue: -5\n\n    isBetween(0, 255)\n    │\n    false\n\nxxxx | typealias UInt8 = Int(isBetween(0, 255))\n                             ^^^^^^^^^^^^^^^^^\nat typeConstraints7#foo (pkl:base)\n\nx | foo: UInt8 = -5\n                 ^^\nat typeConstraints7#foo (file:///$snippetsDir/input/errors/power/typeConstraints7.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints8.err",
    "content": "–– Pkl Error ––\nType constraint `!(this is Null)` violated.\nValue: null\n\n    !(this is Null)\n    │\n    false\n\nxx | typealias NonNull = Any(!(this is Null))\n                             ^^^^^^^^^^^^^^^\nat typeConstraints8#foo (pkl:base)\n\nx | foo: NonNull = null\n                   ^^^^\nat typeConstraints8#foo (file:///$snippetsDir/input/errors/power/typeConstraints8.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints9.err",
    "content": "–– Pkl Error ––\nType constraint `IntSeq(1, 5).toList().contains(this)\n    || Map(1, 2, 3, 4).values.contains(this)\n    || List(1, 2, 3, 4).contains(this)\n    || Set(1, 2, 3, 4).contains(this)\n    || Pair(1, 2).second == this\n    || Bytes(1, 2, 3, 4).toList().contains(this)\n    || Regex(\"1234\").toString().length == this` violated.\nValue: 10\n\n    IntSeq(1, 5).toList().contains(this)\n                 │        │        │\n                 │        false    10\n                 List(1, 2, 3, 4, 5)\n\n    || Map(1, 2, 3, 4).values.contains(this)\n    │                  │      │        │\n    false              │      false    10\n                       List(2, 4)\n\n    || List(1, 2, 3, 4).contains(this)\n    │                   │        │\n    false               false    10\n\n    || Set(1, 2, 3, 4).contains(this)\n    │                  │        │\n    false              false    10\n\n    || Pair(1, 2).second == this\n    │             │      │  │\n    false         2      │  10\n                         false\n\n    || Bytes(1, 2, 3, 4).toList().contains(this)\n    │                    │        │        │\n    false                │        false    10\n                         List(1, 2, 3, 4)\n\n    || Regex(\"1234\").toString().length == this\n    │                │          │      │  │\n    false            │          13     │  10\n                     │                 false\n                     \"Regex(\\\"1234\\\")\"\n\nx | IntSeq(1, 5).toList().contains(this)\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints9#foo (file:///$snippetsDir/input/errors/power/typeConstraints9.pkl)\n\nxx | ) = 10\n         ^^\nat typeConstraints9#foo (file:///$snippetsDir/input/errors/power/typeConstraints9.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/power/typeConstraints9a.err",
    "content": "–– Pkl Error ––\nType constraint `IntSeq(num, 5).toList().contains(this)\n    || Map(num, 2, 3, 4).values.contains(this)\n    || List(num, 2, 3, 4).contains(this)\n    || Set(num, 2, 3, 4).contains(this)\n    || Pair(num, 2).second == this\n    || Bytes(num, 2, 3, 4).toList().contains(this)\n    || Regex(\"\\(num)234\").toString().length == this` violated.\nValue: 10\n\n    IntSeq(num, 5).toList().contains(this)\n    │      │       │        │        │\n    │      1       │        false    10\n    IntSeq(1, 5)   List(1, 2, 3, 4, 5)\n\n    || Map(num, 2, 3, 4).values.contains(this)\n    │  │   │             │      │        │\n    │  │   1             │      false    10\n    │  Map(1, 2, 3, 4)   List(2, 4)\n    false\n\n    || List(num, 2, 3, 4).contains(this)\n    │  │    │             │        │\n    │  │    1             false    10\n    │  List(1, 2, 3, 4)\n    false\n\n    || Set(num, 2, 3, 4).contains(this)\n    │  │   │             │        │\n    │  │   1             false    10\n    │  Set(1, 2, 3, 4)\n    false\n\n    || Pair(num, 2).second == this\n    │  │    │       │      │  │\n    │  │    1       2      │  10\n    │  Pair(1, 2)          false\n    false\n\n    || Bytes(num, 2, 3, 4).toList().contains(this)\n    │  │     │             │        │        │\n    │  │     1             │        false    10\n    │  Bytes(1, 2, 3, 4)   List(1, 2, 3, 4)\n    false\n\n    || Regex(\"\\(num)234\").toString().length == this\n    │  │     │  │         │          │      │  │\n    │  │     │  1         │          13     │  10\n    │  │     \"1234\"       │                 false\n    │  Regex(\"1234\")      \"Regex(\\\"1234\\\")\"\n    false\n\nx | IntSeq(num, 5).toList().contains(this)\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat typeConstraints9a#foo (file:///$snippetsDir/input/errors/power/typeConstraints9a.pkl)\n\nxx | ) = 10\n         ^^\nat typeConstraints9a#foo (file:///$snippetsDir/input/errors/power/typeConstraints9a.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/propertyNotFound1.err",
    "content": "–– Pkl Error ––\nCannot find property `bar` in object of type `Dynamic`.\n\nx | res1 = foo.bar\n           ^^^^^^^\nat propertyNotFound1#res1 (file:///$snippetsDir/input/errors/propertyNotFound1.pkl)\n\nDid you mean any of the following?\nbarx\nxbar\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/propertyNotFound2.err",
    "content": "–– Pkl Error ––\nCannot find property `foo` in object of type `Pair`.\n\nx | res0 = Pair(1, 2).foo\n           ^^^^^^^^^^^^^^\nat propertyNotFound2#res0 (file:///$snippetsDir/input/errors/propertyNotFound2.pkl)\n\nAvailable properties:\nfirst\nkey\nsecond\nvalue\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/refusingToLoadModule.err",
    "content": "–– Pkl Error ––\nRefusing to load module `birds:///foo.pkl` because it does not match any entry in the module allowlist (`--allowed-modules`).\n\nx | import \"birds:///foo.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^\nat refusingToLoadModule#foo (file:///$snippetsDir/input/errors/refusingToLoadModule.pkl)\n\nx | output = foo\n             ^^^\nat refusingToLoadModule#output (file:///$snippetsDir/input/errors/refusingToLoadModule.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/shebang.err",
    "content": "–– Pkl Error ––\nInvalid token at position. Expected a class, typealias, method, or property.\n\nx | #!/usr/bin/env pkl eval\n    ^^^^^^^^^^^^^^^^^^^^^^^\nat shebang (file:///$snippetsDir/input/errors/shebang.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/singleBacktick.err",
    "content": "–– Pkl Error ––\nUnexpected character `\n`. Did you mean `backquote`?\n\nx | `\n     ^\nat singleBacktick (file:///$snippetsDir/input/errors/singleBacktick.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxCannotHaveElement.err",
    "content": "–– Pkl Error ––\nCannot spread object containing elements into object of type `Mapping`.\n\nx | ...source\n    ^^^^^^^^^\nat spreadSyntaxCannotHaveElement#res (file:///$snippetsDir/input/errors/spreadSyntaxCannotHaveElement.pkl)\n\nx | 1\n    ^\nat spreadSyntaxCannotHaveElement#source[#1] (file:///$snippetsDir/input/errors/spreadSyntaxCannotHaveElement.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxCannotHaveEntry.err",
    "content": "–– Pkl Error ––\nCannot spread object containing entries into object of type `Listing`.\n\nx | ...source\n    ^^^^^^^^^\nat spreadSyntaxCannotHaveEntry#res (file:///$snippetsDir/input/errors/spreadSyntaxCannotHaveEntry.pkl)\n\nx | [\"foo\"] = 1\n     ^^^^^\nat spreadSyntaxCannotHaveEntry#source[\"foo\"] (file:///$snippetsDir/input/errors/spreadSyntaxCannotHaveEntry.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxCannotHaveProperty.err",
    "content": "–– Pkl Error ––\nCannot spread object containing properties into object of type `Listing`.\n\nx | ...source\n    ^^^^^^^^^\nat spreadSyntaxCannotHaveProperty#res (file:///$snippetsDir/input/errors/spreadSyntaxCannotHaveProperty.pkl)\n\nx | foo = \"foo\"\n    ^^^\nat spreadSyntaxCannotHaveProperty#source.foo (file:///$snippetsDir/input/errors/spreadSyntaxCannotHaveProperty.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxCannotIterateOverTyped.err",
    "content": "–– Pkl Error ––\nCannot iterate over value of type `spreadSyntaxCannotIterateOverTyped#Person`.\nValue: new Person { name = ? }\n\nx | ...person\n       ^^^^^^\nat spreadSyntaxCannotIterateOverTyped#result (file:///$snippetsDir/input/errors/spreadSyntaxCannotIterateOverTyped.pkl)\n\n`Typed` values are not iterable. If you mean to spread its members, convert it to `Dynamic` using `toDynamic()`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxCannotSpreadListIntoMapping.err",
    "content": "–– Pkl Error ––\nCannot spread value of type `List` into object of type `Mapping`.\nValue: List(1, 2, 3, 4)\n\nx | ...l\n    ^^^^\nat spreadSyntaxCannotSpreadListIntoMapping#m (file:///$snippetsDir/input/errors/spreadSyntaxCannotSpreadListIntoMapping.pkl)\n\n`List` and `Set` can only be spread into objects of type `Dynamic` and `Listing`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxDuplicateEntry1.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `\"foo\"`.\n\nx | [\"foo\"] = 2\n     ^^^^^\nat spreadSyntaxDuplicateEntry1#res (file:///$snippetsDir/input/errors/spreadSyntaxDuplicateEntry1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxDuplicateEntry2.err",
    "content": "–– Pkl Error ––\nCannot spread object because the enclosing object already has a declaration of entry key `\"foo\"`.\n\nx | ...source\n    ^^^^^^^^^\nat spreadSyntaxDuplicateEntry2#res (file:///$snippetsDir/input/errors/spreadSyntaxDuplicateEntry2.pkl)\n\nx | [\"foo\"] = 1\n     ^^^^^\nat spreadSyntaxDuplicateEntry2#source[\"foo\"] (file:///$snippetsDir/input/errors/spreadSyntaxDuplicateEntry2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxDuplicateProperty1.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `foo`.\n\nx | foo = 2\n    ^^^\nat spreadSyntaxDuplicateProperty1#res (file:///$snippetsDir/input/errors/spreadSyntaxDuplicateProperty1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxDuplicateProperty2.err",
    "content": "–– Pkl Error ––\nCannot spread object because the enclosing object already has a declaration of property `foo`.\n\nx | ...source\n    ^^^^^^^^^\nat spreadSyntaxDuplicateProperty2#res (file:///$snippetsDir/input/errors/spreadSyntaxDuplicateProperty2.pkl)\n\nx | foo = 1\n    ^^^\nat spreadSyntaxDuplicateProperty2#source.foo (file:///$snippetsDir/input/errors/spreadSyntaxDuplicateProperty2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxNullValue.err",
    "content": "–– Pkl Error ––\nCannot iterate over value of type `Null`.\n\nx | res { ...source }\n             ^^^^^^\nat spreadSyntaxNullValue#res (file:///$snippetsDir/input/errors/spreadSyntaxNullValue.pkl)\n\nTo guard against a nullable value, use `...?` instead of `...`.\nTry: `...?source`\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/spreadSyntaxUnknownTypedProperty.err",
    "content": "–– Pkl Error ––\nCannot find property `age` in object of type `spreadSyntaxUnknownTypedProperty#Person`.\n\nx | res1: Person = new { ...personDynamic }\n                         ^^^^^^^^^^^^^^^^\nat spreadSyntaxUnknownTypedProperty#res1 (file:///$snippetsDir/input/errors/spreadSyntaxUnknownTypedProperty.pkl)\n\nAvailable properties:\nname\n\nx | age = 34\n    ^^^\nat spreadSyntaxUnknownTypedProperty#personDynamic.age (file:///$snippetsDir/input/errors/spreadSyntaxUnknownTypedProperty.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/stackTraceWithQuotedMemberName.err",
    "content": "–– Pkl Error ––\nouch\n\nx | four = throw(\"ouch\")\n           ^^^^^^^^^^^^^\nat stackTraceWithQuotedMemberName#one.`two three`.four (file:///$snippetsDir/input/errors/stackTraceWithQuotedMemberName.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/supercalls.err",
    "content": "–– Pkl Error ––\nCannot invoke a supermethod from here.\n\nx | bar = super.bar()\n          ^^^^^^^^^^^\nat supercalls#foo.bar (file:///$snippetsDir/input/errors/supercalls.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/typeMismatchWithSameQualifiedClassName.err",
    "content": "–– Pkl Error ––\nModule version conflict: Expected value of type `foo.bar#Baz` defined in module `file:///$snippetsDir/input/errors/typeMismatchWithSameQualifiedClassName.pkl`, but got type `foo.bar#Baz` defined in module `file:///$snippetsDir/input/errors/typeMismatchHelper.pkl`.\n\n\nx | baz: Baz = new typeMismatchHelper.Baz {}\n         ^^^\nat foo.bar#baz (file:///$snippetsDir/input/errors/typeMismatchWithSameQualifiedClassName.pkl)\n\nx | baz: Baz = new typeMismatchHelper.Baz {}\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat foo.bar#baz (file:///$snippetsDir/input/errors/typeMismatchWithSameQualifiedClassName.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/typeMismatchWithSameQualifiedModuleName.err",
    "content": "–– Pkl Error ––\nModule version conflict: Expected value of type `foo.bar` defined by module `file:///$snippetsDir/input/errors/typeMismatchWithSameQualifiedModuleName.pkl`, but got type `foo.bar` defined by module `file:///$snippetsDir/input/errors/typeMismatchHelper.pkl`.\n\n\nx | mod: module = typeMismatchHelper\n         ^^^^^^\nat foo.bar#mod (file:///$snippetsDir/input/errors/typeMismatchWithSameQualifiedModuleName.pkl)\n\nx | mod: module = typeMismatchHelper\n                  ^^^^^^^^^^^^^^^^^^\nat foo.bar#mod (file:///$snippetsDir/input/errors/typeMismatchWithSameQualifiedModuleName.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedOp1.err",
    "content": "–– Pkl Error ––\nOperator `!` is not defined for operand type `Int`.\nOperand: 1\n\nx | res1 = !1\n           ^^\nat undefinedOp1#res1 (file:///$snippetsDir/input/errors/undefinedOp1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedOp2.err",
    "content": "–– Pkl Error ––\nOperator `+` is not defined for operand types `String` and `Int`.\nLeft operand : \"str\"\nRight operand: 42\n\nx | res1 = \"str\" + 42\n           ^^^^^^^^^^\nat undefinedOp2#res1 (file:///$snippetsDir/input/errors/undefinedOp2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedOp3.err",
    "content": "–– Pkl Error ––\nOperator `[]` is not defined for operand types `List` and `String`.\nLeft operand : List(1, 2, 3)\nRight operand: \"idx\"\n\nx | res1 = l[\"idx\"]\n           ^^^^^^^^\nat undefinedOp3#res1 (file:///$snippetsDir/input/errors/undefinedOp3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty1.err",
    "content": "–– Pkl Error ––\nTried to read property `name` but its value is undefined.\n\nx | name: String\n    ^^^^\nat undefinedProperty1#Person.name (file:///$snippetsDir/input/errors/undefinedProperty1.pkl)\n\nThe above error occurred when rendering path `res1.name` of module `file:///$snippetsDir/input/errors/undefinedProperty1.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty2.err",
    "content": "–– Pkl Error ––\nTried to read property `name` but its value is undefined.\n\nx | name: String\n    ^^^^\nat undefinedProperty2#name (file:///$snippetsDir/input/errors/undefinedProperty2.pkl)\n\nThe above error occurred when rendering path `name` of module `file:///$snippetsDir/input/errors/undefinedProperty2.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty3.err",
    "content": "–– Pkl Error ––\nTried to read property `theNumber` but its value is undefined.\n\nxx | theNumber : Int\n     ^^^^^^^^^\nat undefinedProperty3#C.theNumber (file:///$snippetsDir/input/errors/undefinedProperty3.pkl)\n\nThe above error occurred when rendering path `a.b[new D { dProperty = \"dProperty\" }].`bar-baz`.theNumber` of module `file:///$snippetsDir/input/errors/undefinedProperty3.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty4.err",
    "content": "–– Pkl Error ––\nTried to read property `num` but its value is undefined.\n\nxx | num: Int\n     ^^^\nat undefinedProperty4#Bar.num (file:///$snippetsDir/input/errors/undefinedProperty4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty5.err",
    "content": "–– Pkl Error ––\nTried to read property `delta` but its value is undefined.\n\nxx | delta: Int\n     ^^^^^\nat undefinedProperty5#Charlie.delta (file:///$snippetsDir/input/errors/undefinedProperty5.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty6.err",
    "content": "–– Pkl Error ––\nTried to read property `name` but its value is undefined.\n\nx | name: String\n    ^^^^\nat undefinedProperty6#Person.name (file:///$snippetsDir/input/errors/undefinedProperty6.pkl)\n\nxx | res1 = person.name\n            ^^^^^^^^^^^\nat undefinedProperty6#res1 (file:///$snippetsDir/input/errors/undefinedProperty6.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty7.err",
    "content": "–– Pkl Error ––\nTried to read property `name` but its value is undefined.\n\nx | name: String\n    ^^^^\nat undefinedProperty7#Person.name (file:///$snippetsDir/input/errors/undefinedProperty7.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/undefinedProperty8.err",
    "content": "–– Pkl Error ––\nTried to read property `name` but its value is undefined.\n\nx | name: String\n    ^^^^\nat undefinedProperty8#Person.name (file:///$snippetsDir/input/errors/undefinedProperty8.pkl)\n\nThe above error occurred when rendering path `name`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/underscore.err",
    "content": "–– Pkl Error ––\nKeyword `_` is not allowed here.\n\nIf you must use this name as identifier, enclose it in backticks.\n\nx | _ = 0\n    ^\nat underscore (file:///$snippetsDir/input/errors/underscore.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/underscoreLambda.err",
    "content": "–– Pkl Error ––\nCannot find property `_`.\n\nx | local lambda = (_, x: Int) -> `_` + x\n                                  ^^^\nat underscoreLambda#lambda.<function#1> (file:///$snippetsDir/input/errors/underscoreLambda.pkl)\n\nx | res = lambda.apply(1, 1)\n          ^^^^^^^^^^^^^^^^^^\nat underscoreLambda#res (file:///$snippetsDir/input/errors/underscoreLambda.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/underscoreLet.err",
    "content": "–– Pkl Error ––\noops\n\nx | foo = let (_ = throw(\"oops\")) 0\n                   ^^^^^^^^^^^^^\nat underscoreLet#foo (file:///$snippetsDir/input/errors/underscoreLet.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/unterminatedUnicodeEscape.err",
    "content": "–– Pkl Error ––\nUnterminated Unicode escape sequence `\\u{123`.\n\nUnicode escape sequences must end with `}`.\n\nx | res1 = \"foo \\u{123 bar\"\n                ^^^^^^\nat unterminatedUnicodeEscape (file:///$snippetsDir/input/errors/unterminatedUnicodeEscape.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/userDefinedTypeParameter1.err",
    "content": "–– Pkl Error ––\nOnly standard library members can have type parameters.\n\nx | class Box<A> {\n              ^\nat userDefinedTypeParameter1 (file:///$snippetsDir/input/errors/userDefinedTypeParameter1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/userDefinedTypeParameter2.err",
    "content": "–– Pkl Error ––\nOnly standard library members can have type parameters.\n\nx | function doit<A>(a: A): A = a\n                  ^\nat userDefinedTypeParameter2#DoIt (file:///$snippetsDir/input/errors/userDefinedTypeParameter2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/wrongForGeneratorType1.err",
    "content": "–– Pkl Error ––\nExpected value of type `Int`, but got type `String`.\nValue: \"other\"\n\nx | for (n: Int in List(1, \"other\", 2)) { n }\n            ^^^\nat wrongForGeneratorType1#res1 (file:///$snippetsDir/input/errors/wrongForGeneratorType1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/wrongForGeneratorType2.err",
    "content": "–– Pkl Error ––\nExpected value of type `Int`, but got type `String`.\nValue: \"other\"\n\nx | for (n: Int in List(1, \"other\", 2)) { [n] = n }\n            ^^^\nat wrongForGeneratorType2#res1 (file:///$snippetsDir/input/errors/wrongForGeneratorType2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/errors/wrongNumberOfMapArguments.err",
    "content": "–– Pkl Error ––\nNumber of `Map()` arguments must be a multiple of two: `Map(key1, value1, key2, value2, ..., keyN, valueN)`\n\nx | res1 = Map(1, 2, 3)\n                      ^\nat wrongNumberOfMapArguments#res1 (file:///$snippetsDir/input/errors/wrongNumberOfMapArguments.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/duplicateDefinition1.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `y`.\n\nx | when (true) { y = 456 }\n                  ^\nat duplicateDefinition1#x (file:///$snippetsDir/input/generators/duplicateDefinition1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/duplicateDefinition2.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `\"y\"`.\n\nx | for (i in List(1)) { [\"y\"] = 456 }\n                          ^^^\nat duplicateDefinition2#x (file:///$snippetsDir/input/generators/duplicateDefinition2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/duplicateDefinition3.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `y`.\n\nx | when (true) { y = 2 }\n                  ^\nat duplicateDefinition3#x (file:///$snippetsDir/input/generators/duplicateDefinition3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/elementGenerators.pcf",
    "content": "res1 {\n  2\n  6\n  10\n}\nres1b {\n  2\n  6\n  10\n}\nres1c {\n  0\n  6\n  20\n}\nres1d {\n  0\n  6\n  20\n}\nres2 {\n  2\n  6\n  10\n}\nres2b {\n  2\n  6\n  10\n}\nres2c {\n  0\n  6\n  20\n}\nres2d {\n  0\n  6\n  20\n}\nres3 {\n  2\n  6\n  10\n}\nres3b {\n  2\n  6\n  10\n}\nres3c {\n  0\n  6\n  20\n}\nres3d {\n  0\n  6\n  20\n}\nres4 {\n  1\n}\nres4b {\n  1\n}\nres4c {\n  Pair(\"one\", 1)\n}\nres4d {\n  Pair(\"one\", 1)\n}\nres5 {\n  2\n  6\n  10\n}\nres5b {\n  2\n  6\n  10\n}\nres5c {\n  0\n  6\n  20\n}\nres5d {\n  0\n  6\n  20\n}\nres6 {\n  1\n}\nres6b {\n  1\n}\nres6c {\n  Pair(\"one\", 1)\n}\nres6d {\n  Pair(\"one\", 1)\n}\nres7 {\n  1\n}\nres7b {\n  1\n}\nres7c {\n  Pair(\"one\", 1)\n}\nres7d {\n  Pair(\"one\", 1)\n}\nres8 {\n  \"one\"\n  \"two\"\n}\nres8b {\n  \"one\"\n  \"two\"\n}\nres9 {\n  \"ae\"\n  \"af\"\n  \"be\"\n  \"bf\"\n  \"ce\"\n  \"cf\"\n}\nre9b {\n  \"ae\"\n  \"af\"\n  \"be\"\n  \"bf\"\n  \"ce\"\n  \"cf\"\n}\nres9c {\n  Pair(0, \"ae\")\n  Pair(1, \"af\")\n  Pair(1, \"be\")\n  Pair(2, \"bf\")\n  Pair(2, \"ce\")\n  Pair(3, \"cf\")\n}\nre9d {\n  Pair(0, \"ae\")\n  Pair(1, \"af\")\n  Pair(1, \"be\")\n  Pair(2, \"bf\")\n  Pair(2, \"ce\")\n  Pair(3, \"cf\")\n}\nres10 {\n  \"one\"\n  2\n  6\n  10\n  \"two\"\n  \"ae\"\n  \"af\"\n  \"be\"\n  \"bf\"\n  \"ce\"\n  \"cf\"\n  \"three\"\n}\nres10b {\n  \"one\"\n  2\n  6\n  10\n  \"two\"\n  \"ae\"\n  \"af\"\n  \"be\"\n  \"bf\"\n  \"ce\"\n  \"cf\"\n  \"three\"\n}\nres11 {\n  1\n  2\n  3\n  \"a\"\n  \"b\"\n  \"c\"\n  1\n  2\n  3\n}\nres11b {\n  1\n  2\n  3\n  \"a\"\n  \"b\"\n  \"c\"\n  1\n  2\n  3\n}\nres11c {\n  Pair(0, 1)\n  Pair(1, 2)\n  Pair(2, 3)\n  Pair(0, \"a\")\n  Pair(1, \"b\")\n  Pair(2, \"c\")\n  Pair(0, 1)\n  Pair(1, 2)\n  Pair(2, 3)\n}\nres11d {\n  Pair(0, 1)\n  Pair(1, 2)\n  Pair(2, 3)\n  Pair(0, \"a\")\n  Pair(1, \"b\")\n  Pair(2, \"c\")\n  Pair(0, 1)\n  Pair(1, 2)\n  Pair(2, 3)\n}\nres12a {\n  1\n  2\n  3\n  4\n}\nres12b {}\nvalueForOverProperties {\n  [\"Foo!\"] = \"Foo!\"\n  [42] = 42\n  [Pair(1337, \"zab\")] = Pair(1337, \"zab\")\n}\nkeyValueForOverProperties {\n  [\"foo\"] = \"Foo!\"\n  [\"bar\"] = 42\n  [\"baz\"] = Pair(1337, \"zab\")\n}\nvalueForOverAllMembers {\n  \"foo\"\n  1337\n  42\n  \"corge\"\n  \"elementBar\"\n  \"elementQuux\"\n}\nkeyValueForOverAllMembers {\n  \"propFoo -> foo\"\n  \"propBaz -> 1337\"\n  \"entryKeyQux -> 42\"\n  \"entryKeyCorge -> corge\"\n  \"0 -> elementBar\"\n  \"1 -> elementQuux\"\n}\nvalueForOverTyped {\n  \"Pigeon\"\n  42\n}\nkeyValueForOverTyped {\n  \"name -> Pigeon\"\n  \"age -> 42\"\n}\nvalueForOverConflictingPropertiesAndEntries {\n  \"property\"\n  \"can only discern by iteration order (properties before entries)\"\n  \"entry\"\n  \"can only discern by iteration order (properties before entries)\"\n}\nkeyValueForOverConflictingPropertiesAndEntries {\n  \"foo -> property\"\n  \"bar -> can only discern by iteration order (properties before entries)\"\n  \"foo -> entry\"\n  \"bar -> can only discern by iteration order (properties before entries)\"\n}\nforWithMultipleMembers {\n  \"a\"\n  \"ax\"\n  \"ay\"\n  \"b\"\n  \"bx\"\n  \"by\"\n  \"c\"\n  \"cx\"\n  \"cy\"\n}\nforWithMultipleMembersNested {\n  \"ax1\"\n  \"1xa\"\n  \"ay2\"\n  \"2ya\"\n  \"axx11\"\n  \"11xxa\"\n  \"ayy22\"\n  \"22yya\"\n  \"bx1\"\n  \"1xb\"\n  \"by2\"\n  \"2yb\"\n  \"bxx11\"\n  \"11xxb\"\n  \"byy22\"\n  \"22yyb\"\n}\nforGeneratorsWithOverlappingNamesAndWhenNestedWhen {\n  6\n}\nwhenWithMultipleMembers {\n  0\n  0\n  6\n  12\n  20\n  40\n}\nwhenWithMultipleMembersNested {\n  20\n  40\n}\nwhenWithElse {\n  0\n  0\n  \"2\"\n  \"4\"\n  6\n  12\n  \"12\"\n  \"24\"\n  20\n  40\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/elementGeneratorsTyped.pcf",
    "content": "res1 {\n  2\n  6\n  10\n}\nres1b = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres1c {\n  0\n  6\n  20\n}\nres1d = \"Expected value of type `String`, but got type `Int`. Value: 0\"\nres2 {\n  2\n  6\n  10\n}\nres2b = \"Expected value of type `Number`, but got type `String`. Value: \\\"other\\\"\"\nres2c {\n  0\n  6\n  20\n}\nres2d = \"Expected value of type `Number`, but got type `String`. Value: \\\"other\\\"\"\nres6 {\n  \"ae\"\n  \"af\"\n  \"be\"\n  \"bf\"\n  \"ce\"\n  \"cf\"\n}\nres6b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres6c {\n  Pair(0, \"ae\")\n  Pair(1, \"af\")\n  Pair(1, \"be\")\n  Pair(2, \"bf\")\n  Pair(2, \"ce\")\n  Pair(3, \"cf\")\n}\nres6d = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres7 {\n  \"one\"\n  2\n  6\n  10\n  \"two\"\n  \"ae\"\n  \"af\"\n  \"be\"\n  \"bf\"\n  \"ce\"\n  \"cf\"\n  \"three\"\n}\nres7b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres8 {\n  1\n  2\n  3\n  \"a\"\n  \"b\"\n  \"c\"\n  1\n  2\n  3\n}\nres8b = \"Expected value of type `String`, but got type `Duration`. Value: 42.min\"\nres8c {\n  Pair(0, 1)\n  Pair(1, 2)\n  Pair(2, 3)\n  Pair(0, \"a\")\n  Pair(1, \"b\")\n  Pair(2, \"c\")\n  Pair(0, 1)\n  Pair(1, 2)\n  Pair(2, 3)\n}\nres8d = \"Expected value of type `String`, but got type `Duration`. Value: 42.min\"\nforWithMultipleMembers {\n  \"a\"\n  \"ax\"\n  \"ay\"\n  \"b\"\n  \"bx\"\n  \"by\"\n  \"c\"\n  \"cx\"\n  \"cy\"\n}\nforWithMultipleMembersNested {\n  \"ax1\"\n  \"1xa\"\n  \"ay2\"\n  \"2ya\"\n  \"axx11\"\n  \"11xxa\"\n  \"ayy22\"\n  \"22yya\"\n  \"bx1\"\n  \"1xb\"\n  \"by2\"\n  \"2yb\"\n  \"bxx11\"\n  \"11xxb\"\n  \"byy22\"\n  \"22yyb\"\n}\nwhenWithMultipleMembers {\n  0\n  0\n  6\n  12\n  20\n  40\n}\nwhenWithMultipleMembersNested {\n  20\n  40\n}\nwhenWithElse {\n  0\n  0\n  \"2\"\n  \"4\"\n  6\n  12\n  \"12\"\n  \"24\"\n  20\n  40\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/entryGenerators.pcf",
    "content": "res1 {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres1b {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres1c {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres1d {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres2 {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres2b {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres2c {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres2d {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres3 {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres3b {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres3c {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres3d {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres4 {\n  [1] = 2\n}\nres4b {\n  [1] = 2\n}\nres4c {\n  [\"eno\"] = 2\n}\nres4d {\n  [\"eno\"] = 2\n}\nres5 {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres5b {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres5c {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres5d {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres6 {\n  [1] = 2\n}\nres6b {\n  [1] = 2\n}\nres6c {\n  [\"eno\"] = 2\n}\nres6d {\n  [\"eno\"] = 2\n}\nres7 {\n  [1] = 2\n}\nres7b {\n  [1] = 2\n}\nres7c {\n  [\"eno\"] = 2\n}\nres7d {\n  [\"eno\"] = 2\n}\nres8 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres8b {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres9 {\n  [\"ae\"] = \"ae\"\n  [\"af\"] = \"af\"\n  [\"be\"] = \"be\"\n  [\"bf\"] = \"bf\"\n  [\"ce\"] = \"ce\"\n  [\"cf\"] = \"cf\"\n}\nres9b {\n  [\"ae\"] = \"ae\"\n  [\"af\"] = \"af\"\n  [\"be\"] = \"be\"\n  [\"bf\"] = \"bf\"\n  [\"ce\"] = \"ce\"\n  [\"cf\"] = \"cf\"\n}\nres9c {\n  [\"ae\"] = Pair(0, \"ae\")\n  [\"af\"] = Pair(1, \"af\")\n  [\"be\"] = Pair(1, \"be\")\n  [\"bf\"] = Pair(2, \"bf\")\n  [\"ce\"] = Pair(2, \"ce\")\n  [\"cf\"] = Pair(3, \"cf\")\n}\nres9d {\n  [\"ae\"] = Pair(0, \"ae\")\n  [\"af\"] = Pair(1, \"af\")\n  [\"be\"] = Pair(1, \"be\")\n  [\"bf\"] = Pair(2, \"bf\")\n  [\"ce\"] = Pair(2, \"ce\")\n  [\"cf\"] = Pair(3, \"cf\")\n}\nres10 {\n  [\"one\"] = 1\n  [2] = 2\n  [6] = 6\n  [10] = 10\n  [\"two\"] = 2\n  [\"ae\"] = \"ae\"\n  [\"af\"] = \"af\"\n  [\"be\"] = \"be\"\n  [\"bf\"] = \"bf\"\n  [\"ce\"] = \"ce\"\n  [\"cf\"] = \"cf\"\n  [\"three\"] = 3\n}\nres10b {\n  [\"one\"] = 1\n  [2] = 2\n  [6] = 6\n  [10] = 10\n  [\"two\"] = 2\n  [\"ae\"] = \"ae\"\n  [\"af\"] = \"af\"\n  [\"be\"] = \"be\"\n  [\"bf\"] = \"bf\"\n  [\"ce\"] = \"ce\"\n  [\"cf\"] = \"cf\"\n  [\"three\"] = 3\n}\nres11 {\n  [1] = 1\n  [2] = 2\n  [3] = 3\n  [\"a\"] = \"a\"\n  [\"b\"] = \"b\"\n  [\"c\"] = \"c\"\n  [4] = 4\n  [5] = 5\n  [6] = 6\n}\nres11b {\n  [1] = 1\n  [2] = 2\n  [3] = 3\n  [\"a\"] = \"a\"\n  [\"b\"] = \"b\"\n  [\"c\"] = \"c\"\n  [4] = 4\n  [5] = 5\n  [6] = 6\n}\nres11c {\n  [1] = Pair(0, 1)\n  [2] = Pair(1, 2)\n  [3] = Pair(2, 3)\n  [\"a\"] = Pair(0, \"a\")\n  [\"b\"] = Pair(1, \"b\")\n  [\"c\"] = Pair(2, \"c\")\n  [4] = Pair(0, 4)\n  [5] = Pair(1, 5)\n  [6] = Pair(2, 6)\n}\nres11d {\n  [1] = Pair(0, 1)\n  [2] = Pair(1, 2)\n  [3] = Pair(2, 3)\n  [\"a\"] = Pair(0, \"a\")\n  [\"b\"] = Pair(1, \"b\")\n  [\"c\"] = Pair(2, \"c\")\n  [4] = Pair(0, 4)\n  [5] = Pair(1, 5)\n  [6] = Pair(2, 6)\n}\nvalueForOverProperties {\n  [\"Foo!\"] = \"Foo!\"\n  [42] = 42\n  [Pair(1337, \"zab\")] = Pair(1337, \"zab\")\n}\nkeyValueForOverProperties {\n  [\"foo\"] = \"Foo!\"\n  [\"bar\"] = 42\n  [\"baz\"] = Pair(1337, \"zab\")\n}\nvalueForOverAllMembers {\n  [\"foo\"] = \"foo\"\n  [1337] = 1337\n  [42] = 42\n  [\"corge\"] = \"corge\"\n  [\"elementBar\"] = \"elementBar\"\n  [\"elementQuux\"] = \"elementQuux\"\n}\nkeyValueForOverAllMembers {\n  [\"propFoo\"] = \"foo\"\n  [\"propBaz\"] = 1337\n  [\"entryKeyQux\"] = 42\n  [\"entryKeyCorge\"] = \"corge\"\n  [0] = \"elementBar\"\n  [1] = \"elementQuux\"\n}\nvalueForOverTyped {\n  [\"Pigeon\"] = \"Pigeon\"\n  [42] = 42\n}\nkeyValueForOverTyped {\n  [\"name\"] = \"Pigeon\"\n  [\"age\"] = 42\n}\nvalueForOverConflictingPropertiesAndEntries = \"Duplicate definition of member `\\\"can only discern by iteration order (properties before entries)\\\"`.\"\nkeyValueForOverConflictingPropertiesAndEntries = \"Duplicate definition of member `\\\"foo\\\"`.\"\nforWithMultipleMembers {\n  [\"a\"] = \"a\"\n  [\"ax\"] = \"ax\"\n  [\"ay\"] = \"ay\"\n  [\"b\"] = \"b\"\n  [\"bx\"] = \"bx\"\n  [\"by\"] = \"by\"\n  [\"c\"] = \"c\"\n  [\"cx\"] = \"cx\"\n  [\"cy\"] = \"cy\"\n}\nforWithMultipleMembersNested {\n  [\"ax1\"] = \"ax1\"\n  [\"1xa\"] = \"1xa\"\n  [\"ay2\"] = \"ay2\"\n  [\"2ya\"] = \"2ya\"\n  [\"axx11\"] = \"axx11\"\n  [\"11xxa\"] = \"11xxa\"\n  [\"ayy22\"] = \"ayy22\"\n  [\"22yya\"] = \"22yya\"\n  [\"bx1\"] = \"bx1\"\n  [\"1xb\"] = \"1xb\"\n  [\"by2\"] = \"by2\"\n  [\"2yb\"] = \"2yb\"\n  [\"bxx11\"] = \"bxx11\"\n  [\"11xxb\"] = \"11xxb\"\n  [\"byy22\"] = \"byy22\"\n  [\"22yyb\"] = \"22yyb\"\n}\nwhenWithMultipleMembers {\n  [1] = 1\n  [2] = 2\n  [9] = 9\n  [18] = 18\n  [25] = 25\n  [50] = 50\n}\nwhenWithMultipleMembersNested {\n  [25] = 25\n  [50] = 50\n}\nwhenWithElse {\n  [1] = 1\n  [2] = 2\n  [\"4\"] = \"4\"\n  [\"8\"] = \"8\"\n  [9] = 9\n  [18] = 18\n  [\"16\"] = \"16\"\n  [\"32\"] = \"32\"\n  [25] = 25\n  [50] = 50\n}\nwithinMethod {\n  [\"a\"] = 1\n  [\"b\"] = 2\n}\nwithinLetExpr {\n  [\"a\"] = 1\n  [\"b\"] = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/entryGeneratorsTyped.pcf",
    "content": "res1 {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres1b = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres1c {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres1d = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres2 {\n  [2] = 2\n  [6] = 6\n  [10] = 10\n}\nres2b = \"Expected value of type `Number`, but got type `String`. Value: \\\"other\\\"\"\nres2c {\n  [0] = 0\n  [6] = 6\n  [20] = 20\n}\nres2d = \"Expected value of type `Number`, but got type `String`. Value: \\\"other\\\"\"\nres6 {\n  [\"ae\"] = \"ae\"\n  [\"af\"] = \"af\"\n  [\"be\"] = \"be\"\n  [\"bf\"] = \"bf\"\n  [\"ce\"] = \"ce\"\n  [\"cf\"] = \"cf\"\n}\nres6b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres6c {\n  [\"ae\"] = Pair(0, \"ae\")\n  [\"af\"] = Pair(1, \"af\")\n  [\"be\"] = Pair(1, \"be\")\n  [\"bf\"] = Pair(2, \"bf\")\n  [\"ce\"] = Pair(2, \"ce\")\n  [\"cf\"] = Pair(3, \"cf\")\n}\nres6d = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres7 {\n  [\"one\"] = 1\n  [2] = 2\n  [6] = 6\n  [10] = 10\n  [\"two\"] = 2\n  [\"ae\"] = \"ae\"\n  [\"af\"] = \"af\"\n  [\"be\"] = \"be\"\n  [\"bf\"] = \"bf\"\n  [\"ce\"] = \"ce\"\n  [\"cf\"] = \"cf\"\n  [\"three\"] = 3\n}\nres7b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres8 {\n  [1] = 1\n  [2] = 2\n  [3] = 3\n  [\"a\"] = \"a\"\n  [\"b\"] = \"b\"\n  [\"c\"] = \"c\"\n  [4] = 4\n  [5] = 5\n  [6] = 6\n}\nres8b = \"Expected value of type `String`, but got type `Duration`. Value: 42.min\"\nres8c {\n  [1] = Pair(0, 1)\n  [2] = Pair(1, 2)\n  [3] = Pair(2, 3)\n  [\"a\"] = Pair(0, \"a\")\n  [\"b\"] = Pair(1, \"b\")\n  [\"c\"] = Pair(2, \"c\")\n  [4] = Pair(0, 4)\n  [5] = Pair(1, 5)\n  [6] = Pair(2, 6)\n}\nres8d = \"Expected value of type `String`, but got type `Duration`. Value: 42.min\"\nforWithMultipleMembers {\n  [\"a\"] = \"a\"\n  [\"ax\"] = \"ax\"\n  [\"ay\"] = \"ay\"\n  [\"b\"] = \"b\"\n  [\"bx\"] = \"bx\"\n  [\"by\"] = \"by\"\n  [\"c\"] = \"c\"\n  [\"cx\"] = \"cx\"\n  [\"cy\"] = \"cy\"\n}\nforWithMultipleMembersNested {\n  [\"ax1\"] = \"ax1\"\n  [\"1xa\"] = \"1xa\"\n  [\"ay2\"] = \"ay2\"\n  [\"2ya\"] = \"2ya\"\n  [\"axx11\"] = \"axx11\"\n  [\"11xxa\"] = \"11xxa\"\n  [\"ayy22\"] = \"ayy22\"\n  [\"22yya\"] = \"22yya\"\n  [\"bx1\"] = \"bx1\"\n  [\"1xb\"] = \"1xb\"\n  [\"by2\"] = \"by2\"\n  [\"2yb\"] = \"2yb\"\n  [\"bxx11\"] = \"bxx11\"\n  [\"11xxb\"] = \"11xxb\"\n  [\"byy22\"] = \"byy22\"\n  [\"22yyb\"] = \"22yyb\"\n}\nwhenWithMultipleMembers {\n  [1] = 1\n  [2] = 2\n  [9] = 9\n  [18] = 18\n  [25] = 25\n  [50] = 50\n}\nwhenWithMultipleMembersNested {\n  [25] = 25\n  [50] = 50\n}\nwhenWithElse {\n  [1] = 1\n  [2] = 2\n  [\"4\"] = \"4\"\n  [\"8\"] = \"8\"\n  [9] = 9\n  [18] = 18\n  [\"16\"] = \"16\"\n  [\"32\"] = \"32\"\n  [25] = 25\n  [50] = 50\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorInFunctionBody.pcf",
    "content": "res1 {\n  arg = \"property\"\n  [Pair(\"three\", 0)] = Pair(\"property\", \"one\")\n  [Pair(\"three\", 1)] = Pair(\"property\", \"two\")\n  [Pair(\"three\", 2)] = Pair(\"property\", \"three\")\n}\nres2 {\n  arg = \"property\"\n  [Pair(\"three\", 0)] = Pair(\"property\", \"one\")\n  [Pair(\"three\", 1)] = Pair(\"property\", \"two\")\n  [Pair(\"three\", 2)] = Pair(\"property\", \"three\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorInMixins.pcf",
    "content": "foo {\n  bar {\n    new {\n      name = \"res1Name\"\n      value = \"res1Value\"\n    }\n    new {\n      name = \"res2Name\"\n      value = \"res2Value\"\n    }\n    new {\n      name = \"res1Name 2\"\n      value = \"res1Value 2\"\n    }\n    new {\n      name = \"res2Name 2\"\n      value = \"res2Value 2\"\n    }\n  }\n  baz {\n    new {\n      name = \"res3Name\"\n      value = \"res3Value\"\n    }\n    new {\n      name = \"res4Name\"\n      value = \"res4Value\"\n    }\n    new {\n      name = \"res3Name 2\"\n      value = \"res3Value 2\"\n    }\n    new {\n      name = \"res4Name 2\"\n      value = \"res4Value 2\"\n    }\n  }\n}\nres {\n  [\"base\"] = \"alreadyThere\"\n  [\"newElement\"] = \"newElement\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorLexicalScope.pcf",
    "content": "examples {\n  [\"accessing for-bound variable from a lambda in a nested for\"] {\n    new {\n      \"aa\"\n    }\n  }\n  [\"accessing for-bound variable from a lambda in a nested when\"] {\n    new {\n      \"a\"\n    }\n  }\n  [\"accessing for-bound variable from an expression inside a nested for\"] {\n    new {\n      1\n      1\n      1\n      2\n      2\n      2\n      3\n      3\n      3\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorNestedReference.pcf",
    "content": "res1 {\n  new {\n    age = 1\n  }\n}\nres2 {\n  new {\n    age = 1\n  }\n}\nres3 {\n  new {\n    \"hello-there\"\n  }\n}\nres4 {\n  new {\n    \"hello-there\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorNestedReference2.pcf",
    "content": "bar {}\nres1 {\n  new {\n    1\n  }\n}\nres2 {\n  new {\n    1\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/forGeneratorVariableShadowing.pcf",
    "content": "examples {\n  [\"shadow key variable\"] {\n    new {\n      List(\"1\", 0, \"a\")\n      List(\"1\", 1, \"b\")\n      List(\"1\", 2, \"c\")\n      List(\"1\", 3, \"d\")\n      List(\"2\", 0, \"a\")\n      List(\"2\", 1, \"b\")\n      List(\"2\", 2, \"c\")\n      List(\"2\", 3, \"d\")\n      List(\"3\", 0, \"a\")\n      List(\"3\", 1, \"b\")\n      List(\"3\", 2, \"c\")\n      List(\"3\", 3, \"d\")\n      List(\"4\", 0, \"a\")\n      List(\"4\", 1, \"b\")\n      List(\"4\", 2, \"c\")\n      List(\"4\", 3, \"d\")\n    }\n  }\n  [\"shadow value variable\"] {\n    new {\n      List(0, \"a\", 0)\n      List(0, \"b\", 1)\n      List(0, \"c\", 2)\n      List(0, \"d\", 3)\n      List(1, \"a\", 0)\n      List(1, \"b\", 1)\n      List(1, \"c\", 2)\n      List(1, \"d\", 3)\n      List(2, \"a\", 0)\n      List(2, \"b\", 1)\n      List(2, \"c\", 2)\n      List(2, \"d\", 3)\n      List(3, \"a\", 0)\n      List(3, \"b\", 1)\n      List(3, \"c\", 2)\n      List(3, \"d\", 3)\n    }\n  }\n  [\"sibling for-generators can use same variable names\"] {\n    new {\n      List(0, \"1\")\n      List(1, \"2\")\n      List(2, \"3\")\n      List(3, \"4\")\n      List(0, \"a\")\n      List(1, \"b\")\n      List(2, \"c\")\n      List(3, \"d\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/generatorNoMembers.err",
    "content": "res1 {\n  prop = \"hello\"\n}\nres2 {\n  prop = \"hello\"\n}\nres3 {\n  prop = \"hello\"\n}\nres4 {\n  prop = \"hello\"\n}\nres5 {\n  prop = \"hello\"\n}\nres6 {}\nres7 {}\nres8 {}\nres9 {}\npkl: TRACE: \"hello\" = \"hello\" (file:///$snippetsDir/input/generators/generatorNoMembers.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/predicateMembersDynamicListing.pcf",
    "content": "res1 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres2 {\n  new {\n    name = \"Pigeon\"\n    age = 99\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres3 {\n  new {\n    name = \"Pigeon\"\n    age = 99\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  new {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres4 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres5 {\n  barnOwl = \"Barn Owl\"\n  new {\n    result {\n      new {\n        name = \"Pigeon\"\n        age = 42\n      }\n      new {\n        name = \"Barn Owl\"\n        age = 99\n      }\n      new {\n        name = \"Parrot\"\n        age = 33\n      }\n    }\n  }\n}\nres6 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 55\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres7 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n  new {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres8 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n  new {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres9 = \"Duplicate definition of member `0`.\"\nres10 = \"Duplicate definition of member `0`.\"\nres11 {\n  new {\n    name = \"Pigeon\"\n    age = 99\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres12 {\n  new {\n    name = \"Pigeon\"\n    age = 122\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/predicateMembersDynamicMapping.pcf",
    "content": "res1 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres2 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 99\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres3 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 99\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres4 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres5 {\n  barnOwl = \"Barn Owl\"\n  new {\n    result {\n      [\"Pigeon\"] {\n        name = \"Pigeon\"\n        age = 42\n      }\n      [\"Barn Owl\"] {\n        name = \"Barn Owl\"\n        age = 99\n      }\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 33\n      }\n    }\n  }\n}\nres6 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 55\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres7 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n  [\"Albatross\"] {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres8 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n  [\"Albatross\"] {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres9 = \"Duplicate definition of member `\\\"Pigeon\\\"`.\"\nres10 = \"Duplicate definition of member `\\\"Pigeon\\\"`.\"\nres11 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 99\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres12 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 122\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/predicateMembersListing.pcf",
    "content": "res1 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres2 {\n  new {\n    name = \"Pigeon\"\n    age = 99\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres3 {\n  new {\n    name = \"Pigeon\"\n    age = 99\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  new {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres4 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres5 {\n  barnOwl = \"Barn Owl\"\n  new {\n    result {\n      new {\n        name = \"Pigeon\"\n        age = 42\n      }\n      new {\n        name = \"Barn Owl\"\n        age = 99\n      }\n      new {\n        name = \"Parrot\"\n        age = 33\n      }\n    }\n  }\n}\nres6 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 55\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres7 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n  new {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres8 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n  new {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres9 = \"Duplicate definition of member `0`.\"\nres10 = \"Duplicate definition of member `0`.\"\nres11 {\n  new {\n    name = \"Pigeon\"\n    age = 99\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres12 {\n  new {\n    name = \"Pigeon\"\n    age = 122\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 33\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/predicateMembersMapping.pcf",
    "content": "res1 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres2 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 99\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres3 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 99\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 99\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres4 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres5 {\n  barnOwl = \"Barn Owl\"\n  new {\n    result {\n      [\"Pigeon\"] {\n        name = \"Pigeon\"\n        age = 42\n      }\n      [\"Barn Owl\"] {\n        name = \"Barn Owl\"\n        age = 99\n      }\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 33\n      }\n    }\n  }\n}\nres6 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 55\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\nres7 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n  [\"Albatross\"] {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres8 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n  [\"Albatross\"] {\n    name = \"Albatross\"\n    age = 4\n  }\n}\nres9 = \"Duplicate definition of member `\\\"Pigeon\\\"`.\"\nres10 = \"Duplicate definition of member `\\\"Pigeon\\\"`.\"\nres11 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 99\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 99\n  }\n}\nres12 {\n  [\"Pigeon\"] {\n    name = \"Pigeon\"\n    age = 122\n  }\n  [\"Barn Owl\"] {\n    name = \"Barn Owl\"\n    age = 21\n  }\n  [\"Parrot\"] {\n    name = \"Parrot\"\n    age = 33\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/predicateMembersThis.pcf",
    "content": "res1 {\n  99\n  new {\n    name = \"Barn Owl\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/propertyGenerators.pcf",
    "content": "res1 {\n  x = \"x\"\n  foo = \"foo\"\n  y = \"y\"\n}\nres2 {\n  name = \"Pigeon\"\n  age = 21\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/spreadSyntaxDynamic.pcf",
    "content": "facts {\n  [\"length\"] {\n    true\n  }\n  [\"equality\"] {\n    true\n  }\n}\nexamples {\n  [\"inferred Dynamic parent\"] {\n    new {\n      1\n      2\n      3\n    }\n    new {\n      [\"a\"] = 1\n      [\"b\"] = 2\n      1\n      2\n      3\n      foo = \"foo\"\n      bar = \"bar\"\n      [\"foo\"] = 0\n      [\"bar\"] = 1\n      1\n      2\n      3\n      1\n      2\n      3\n      [\"zz\"] = 1\n      [\"yy\"] = 2\n      0\n      2\n      4\n      10\n      20\n      30\n      1\n      2\n      3\n      4\n    }\n  }\n  [\"explicit Dynamic type\"] {\n    new {\n      1\n      2\n      3\n    }\n    new {\n      [\"a\"] = 1\n      [\"b\"] = 2\n      1\n      2\n      3\n      foo = \"foo\"\n      bar = \"bar\"\n      [\"foo\"] = 0\n      [\"bar\"] = 1\n      1\n      2\n      3\n      1\n      2\n      3\n      [\"zz\"] = 1\n      [\"yy\"] = 2\n      0\n      2\n      4\n      10\n      20\n      30\n      1\n      2\n      3\n      4\n    }\n  }\n  [\"legacy syntax\"] {\n    new {\n      foo = \"foo\"\n      bar = \"bar\"\n      [\"foo\"] = 0\n      [\"bar\"] = 1\n      1\n      2\n      3\n    }\n    new {\n      1\n      2\n      3\n    }\n    new {\n      1\n      2\n      3\n    }\n    new {\n      [\"zz\"] = 1\n      [\"yy\"] = 2\n    }\n    new {\n      0\n      2\n      4\n    }\n    new {\n      10\n      20\n      30\n    }\n    new {\n      1\n      2\n      3\n      4\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/spreadSyntaxListing.pcf",
    "content": "res1 {\n  0\n  1\n  2\n  3\n  4\n  5\n  6\n}\nres2 = true\nres3 {\n  0\n  1\n  2\n  3\n  4\n  5\n  6\n  1\n  2\n  3\n}\nres4 {\n  1\n  2\n  3\n  1\n  2\n  3\n  1\n  2\n  3\n  1\n  2\n  3\n}\nres5 = \"Cannot find property `d1`.\"\nres6 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres7 = \"Cannot spread object containing entries into object of type `Listing`.\"\nres8 {\n  1\n  2\n  3\n  4\n  5\n  6\n}\nres9 {\n  1\n  2\n  3\n  1\n  2\n  3\n  1\n  2\n  3\n}\nres10 {\n  1\n  2\n  3\n  1\n  2\n  3\n  1\n  2\n  3\n  10\n  11\n  1\n  2\n  3\n}\nres11 {\n  0\n  2\n  4\n}\nres12 {\n  1\n  2\n  3\n}\nres13 = \"Cannot spread value of type `Map` into object of type `Listing`. Value: Map(\\\"a\\\", 1, \\\"b\\\", 2)\"\nres14 {\n  10\n  20\n  30\n}\nres15 {\n  1\n  2\n  3\n}\nres16 {\n  0\n  1\n  2\n  3\n  0\n  0\n  0\n}\nres17 = 7\nres18 {\n  1\n  2\n  3\n  4\n}\nres19 {\n  0\n  1\n  2\n  3\n  4\n  0\n  0\n  0\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/spreadSyntaxMapping.pcf",
    "content": "res1 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n}\nres2 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n}\nres3 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n  [\"c\"] = 1\n  [\"d\"] = 2\n}\nres4 = \"Cannot spread object because the enclosing object already has a declaration of entry key `\\\"a\\\"`.\"\nres5 = \"Duplicate definition of member `\\\"a\\\"`.\"\nres6 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n}\nres7 = \"Expected value of type `Boolean`, but got type `String`. Value: \\\"a\\\"\"\nres8 = \"Cannot spread object containing elements into object of type `Mapping`.\"\nres9 = \"Cannot spread object containing properties into object of type `Mapping`.\"\nres10 = \"Cannot spread value of type `List` into object of type `Mapping`. Value: List(1, 2, 3)\"\nres11 = \"Cannot spread value of type `Set` into object of type `Mapping`. Value: Set(10, 20, 30)\"\nres12 = \"Cannot spread value of type `IntSeq` into object of type `Mapping`. Value: IntSeq(0, 5).step(2)\"\nres13 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n  [\"child\"] {\n    [\"a\"] = 1\n    [\"b\"] = 2\n    [\"child\"] {\n      [\"a\"] = 1\n      [\"b\"] = 2\n    }\n  }\n}\nres14 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n}\nres15 {\n  [\"a\"] = 1\n  [\"b\"] = 2\n  [\"c\"] = 1\n  [\"d\"] = 2\n}\nres16 = \"Duplicate definition of member `\\\"a\\\"`.\"\nres17 {\n  [\"bar\"] {\n    names {\n      \"original-bar\"\n      \"new one\"\n    }\n  }\n}\nres18 = \"Cannot spread value of type `Bytes` into object of type `Mapping`. Value: Bytes(1, 2, 3, 4)\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/spreadSyntaxNoSpace.err",
    "content": "–– Pkl Error ––\nObject members must be separated by whitespace, newline, or semicolon.\nObject entries must be separated by newline or semicolon.\n\nx | 1 2 3...IntSeq(4, 10)...IntSeq(11, 20)\n         ^^^^^^^^^^^^^^^^\nat spreadSyntaxNoSpace#foo (file:///$snippetsDir/input/generators/spreadSyntaxNoSpace.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/spreadSyntaxNullable.pcf",
    "content": "a = null\nb {}\nc {\n  1\n  2\n  3\n}\nd {\n  1\n  2\n  3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/generators/spreadSyntaxTyped.pcf",
    "content": "res1 {\n  name = \"Barn Owl\"\n}\nres2 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/implementation/equality.pcf",
    "content": "facts {\n  [\"mix EqualsNode specializations (VmValue first)\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/implementation/inequality.pcf",
    "content": "facts {\n  [\"mix EqualsNode specializations (VmValue first)\"] {\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/internal/polymorphicCallSite.pcf",
    "content": "res1 = false\nres2 = false\nres3 = Set(1, 2)\nres4 = Set(1, 2)\nres5 = \"cat size\"\nres6 = \"dog size\"\nres7 = \"bird size\"\nres8 = \"lion size\"\nres9 = \"turtle size\"\nres10 = \"cat walks\"\nres11 = \"dog walks\"\nres12 = \"bird walks\"\nres13 = \"lion walks\"\nres14 = \"turtle walks\"\nres15 = \"hi\"\nres16 = \"bye\"\nres17 = \"hi\"\nres18 = \"bye\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaDef.pcf",
    "content": "x {\n  res0 {\n    zero = 0\n    amended = \"amended\"\n  }\n  res1 {\n    one = 1\n    amended = \"amended\"\n  }\n  res2 {\n    one = 1\n    two = 2\n    amended = \"amended\"\n  }\n  res3 {\n    one = 1\n    two = 2\n    three = 3\n    amended = \"amended\"\n  }\n  res4 {\n    one = 1\n    two = 2\n    three = 3\n    four = 4\n    amended = \"amended\"\n  }\n  res5 {\n    one = 1\n    two = 2\n    three = 3\n    four = 4\n    five = 5\n    amended = \"amended\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaExpr.pcf",
    "content": "res0 {\n  zero = 0\n  amended = \"amended\"\n}\nres1 {\n  one = 1\n  amended = \"amended\"\n}\nres2 {\n  one = 1\n  two = 2\n  amended = \"amended\"\n}\nres3 {\n  one = 1\n  two = 2\n  three = 3\n  amended = \"amended\"\n}\nres4 {\n  one = 1\n  two = 2\n  three = 3\n  four = 4\n  amended = \"amended\"\n}\nres5 {\n  one = 1\n  two = 2\n  three = 3\n  four = 4\n  five = 5\n  amended = \"amended\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaExternalClassError.err",
    "content": "–– Pkl Error ––\nCannot instantiate, or amend an instance of, external class `List`.\n\nx | hidden amendAb = (ab) { amended = \"amended\" }\n                      ^^\nat amendLambdaExternalClassError#amendAb.<function> (file:///$snippetsDir/input/lambdas/amendLambdaExternalClassError.pkl)\n\nTo create an instance of an external class, use its literal syntax or constructor method.\nExamples:\n* `123` uses literal syntax to create an instance of class `Int`.\n* `Pair(1, 2)` uses the `Pair()` constructor method to create an instance of class `Pair`.\n\nx | res1 = amendAb.apply(1, 2)\n           ^^^^^^^^^^^^^^^^^^^\nat amendLambdaExternalClassError#res1 (file:///$snippetsDir/input/lambdas/amendLambdaExternalClassError.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaParameters.pcf",
    "content": "example1 {\n  result {\n    prop = 2\n  }\n}\nexample2 {\n  result {\n    prop = 3\n  }\n}\nexample3 {\n  result {\n    prop3 = 3\n    prop1 = 1\n    prop2 = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaParametersTyped.pcf",
    "content": "example1 {\n  result {\n    prop = 2\n  }\n}\nexample2 {\n  result {\n    prop = 3\n  }\n}\nexample3 {\n  result = \"Type constraint `this > 3` violated. Value: 2\"\n}\nexample4 {\n  result = \"Expected value of type `String`, but got type `Int`. Value: 1\"\n}\nexample5 {\n  result {\n    prop3 {}\n    prop1 {}\n    prop2 {}\n  }\n}\nexample6 {\n  result = \"Expected value of type `amendLambdaParametersTyped#Baz`, but got type `amendLambdaParametersTyped#Foo`. Value: new Foo {}\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaThatReturnsAnotherLambda.pcf",
    "content": "example1 {\n  result {\n    name = \"Pigeon\"\n  }\n}\nexample2 {\n  result {\n    name = \"Pigeon\"\n    name2 = \"Pigeon2\"\n    name3 = \"Pigeon3\"\n    name4 = \"Pigeon4\"\n  }\n}\nexample3 {\n  result1 {\n    f1Args = List()\n    f2Args = List(\"f2Arg1\")\n    f3Args = List(\"f3Arg1\", \"f3Arg2\")\n  }\n  result2 {\n    f1Args = List()\n    f2Args = List(3.min)\n    f3Args = List(42, 5.gb)\n  }\n  result3 {\n    f1Args = List()\n    f2Args = List(new {\n      z = 3.min\n    })\n    f3Args = List(new {\n      x = 42\n    }, new {\n      y = 5.gb\n    })\n  }\n}\nexample4 {\n  result {\n    f1Args = List(\"f1Arg1\", \"f1Arg2\")\n    f2Args = List(\"f2Arg1\")\n    f3Args = List()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaTooFewArgsError.err",
    "content": "–– Pkl Error ––\nExpected 3 function arguments but got 2.\n\nx | hidden abc = (a, b, c) -> new Dynamic { one = a; two = b; three = c }\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat amendLambdaTooFewArgsError#abc.<function#1> (file:///$snippetsDir/input/lambdas/amendLambdaTooFewArgsError.pkl)\n\nx | hidden amendAbc = (abc) { amended = \"amended\" }\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat amendLambdaTooFewArgsError#amendAbc.<function> (file:///$snippetsDir/input/lambdas/amendLambdaTooFewArgsError.pkl)\n\nx | res1 = amendAbc.apply(1, 2)\n           ^^^^^^^^^^^^^^^^^^^^\nat amendLambdaTooFewArgsError#res1 (file:///$snippetsDir/input/lambdas/amendLambdaTooFewArgsError.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/amendLambdaTooManyArgsError.err",
    "content": "–– Pkl Error ––\nExpected 3 function arguments but got 4.\n\nx | hidden abc = (a, b, c) -> new Dynamic { one = a; two = b; three = c }\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat amendLambdaTooManyArgsError#abc.<function#1> (file:///$snippetsDir/input/lambdas/amendLambdaTooManyArgsError.pkl)\n\nx | hidden amendAbc = (abc) { amended = \"amended\" }\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat amendLambdaTooManyArgsError#amendAbc.<function> (file:///$snippetsDir/input/lambdas/amendLambdaTooManyArgsError.pkl)\n\nx | res1 = amendAbc.apply(1, 2, 3, 4)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^\nat amendLambdaTooManyArgsError#res1 (file:///$snippetsDir/input/lambdas/amendLambdaTooManyArgsError.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/equality.pcf",
    "content": "res1 = false\nres2 = false\nres3 = false\nres4 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/inequality.pcf",
    "content": "res1 = true\nres2 = true\nres3 = true\nres4 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambda1.pcf",
    "content": "res1 = \"abc\"\nres2 = true\nres3 = false\nres4 = 6\nres5 = \"new Function1 {}\"\nres6 = \"new Function2 {}\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambda2.pcf",
    "content": "x = 2\nres1 = 5\nres2 = 6\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambda3.pcf",
    "content": "x = 4\npigeon {\n  name = \"Pigeon\"\n  age = 30\n}\nmultiplier {}\nl = List(1, 2, 3)\nres1 = List(16, 16, 16)\nres2 = List(2, 4, 6)\nres3 = List(30, 60, 90)\nres4 = List(4, 8, 12)\nres5 = List(4, 8, 12)\nres6 = 18\nres7 = 11\nres8 = 180\nres9 = 27\nres10 = 0\nres11 = 4\nres12 = 8\nres13 = 30\nres14 = 16\nres15 = 6\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambda4.pcf",
    "content": "n = 999\nn2 = 999\nres1 = List(4, 5, 6, 8, 10, 12, 12, 15, 18)\nres2 = List(16, 25, 36, 16, 25, 36, 16, 25, 36)\nres3 = List(4, 5, 6, 4, 5, 6, 8, 10, 12, 8, 10, 12, 12, 15, 18, 12, 15, 18)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambda5.pcf",
    "content": "res1 = 0\nres2 = 1\nres3 = 3\nres4 = 6\nres5 = 10\nres6 = 15\nres7 = 0\nres8 = 1\nres9 = 3\nres10 = 6\nres11 = 10\nres12 = 15\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambdaStackTrace1.err",
    "content": "–– Pkl Error ––\nOperator `+` is not defined for operand types `String` and `Int`.\nLeft operand : \"Pigeon\"\nRight operand: 42\n\nx | hidden f = (a, b) -> a + b\n                         ^^^^^\nat lambdaStackTrace1#f.<function#1> (file:///$snippetsDir/input/lambdas/lambdaStackTrace1.pkl)\n\nx | res1 = f.apply(\"Pigeon\", 42)\n           ^^^^^^^^^^^^^^^^^^^^^\nat lambdaStackTrace1#res1 (file:///$snippetsDir/input/lambdas/lambdaStackTrace1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambdaStackTrace2.err",
    "content": "–– Pkl Error ––\nouch\n\nx | hidden f1 = () -> (() -> (() -> throw(\"ouch\")).apply()).apply()\n                                    ^^^^^^^^^^^^^\nat lambdaStackTrace2#f1.<function#3> (file:///$snippetsDir/input/lambdas/lambdaStackTrace2.pkl)\n\nx | hidden f1 = () -> (() -> (() -> throw(\"ouch\")).apply()).apply()\n                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat lambdaStackTrace2#f1.<function#2> (file:///$snippetsDir/input/lambdas/lambdaStackTrace2.pkl)\n\nx | hidden f1 = () -> (() -> (() -> throw(\"ouch\")).apply()).apply()\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat lambdaStackTrace2#f1.<function#1> (file:///$snippetsDir/input/lambdas/lambdaStackTrace2.pkl)\n\nx | res1 = f1.apply()\n           ^^^^^^^^^^\nat lambdaStackTrace2#res1 (file:///$snippetsDir/input/lambdas/lambdaStackTrace2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/lambdaStackTrace3.err",
    "content": "–– Pkl Error ––\nouch\n\nx | hidden fs = List(() -> 42, () -> throw(\"ouch\"))\n                                     ^^^^^^^^^^^^^\nat lambdaStackTrace3#fs.<function#2> (file:///$snippetsDir/input/lambdas/lambdaStackTrace3.pkl)\n\nx | res1 = fs[1].apply()\n           ^^^^^^^^^^^^^\nat lambdaStackTrace3#res1 (file:///$snippetsDir/input/lambdas/lambdaStackTrace3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/pipeOperator.pcf",
    "content": "res1 = 43\nres2 = 44\nres3 = 86\nres4 = 0\nres5 = 7\nres6 = 42\nres7 = 22\nres8 = 44\nres9 = 44\nres10 = \"Operator `|>` is not defined for operand types `Int` and `Int`. Left operand : 42 Right operand: 21\"\nres11 = \"Operator `|>` is not defined for operand types `Int` and `pipeOperator#Person`. Left operand : 42 Right operand: new Person {}\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/tooManyLambdaParams.err",
    "content": "–– Pkl Error ––\nFunction literals can have at most five parameters.\n\nx | f = (a1, a2, a3, a4, a5, a6) -> a1\n        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat tooManyLambdaParams#f (file:///$snippetsDir/input/lambdas/tooManyLambdaParams.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/typedLambdas.pcf",
    "content": "res1 = 43\nres2 = \"Expected value of type `Int`, but got type `String`. Value: \\\"wrong type\\\"\"\nres3 = 43\nres4 = \"Type constraint `isPositive` violated. Value: -1\"\nfoo {\n  n = 3\n  bar {\n    res5 = \"abcde\"\n    res6 = \"Type constraint `length > n` violated. Value: \\\"abc\\\"\"\n  }\n}\nfoo2 {\n  n = 4\n  bar {\n    res5 = \"abcde\"\n    res6 = \"Type constraint `length > n` violated. Value: \\\"abc\\\"\"\n  }\n}\nres7 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/lambdas/wrongArgumentListLength.err",
    "content": "–– Pkl Error ––\nExpected 3 function arguments but got 6.\n\nx | f = (a1, a2, a3) -> a1\n        ^^^^^^^^^^^^^^^^^^\nat wrongArgumentListLength#f.<function#1> (file:///$snippetsDir/input/lambdas/wrongArgumentListLength.pkl)\n\nx | res = f.applyToList(List(1, 2, 3, 4, 5, 6))\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat wrongArgumentListLength#res (file:///$snippetsDir/input/lambdas/wrongArgumentListLength.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/cacheStealing.pcf",
    "content": "foo1 {\n  \"hello\"\n}\nfoo2 {\n  \"hello\"\n}\nres1 = true\nres2 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/cacheStealingTypeCheck.pcf",
    "content": "foo {\n  \"abcdx\"\n  \"ax\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/default.pcf",
    "content": "res1 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n}\nres2 {\n  new {\n    name = \"Pigeon\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 21\n  }\n}\nres3 {\n  new {\n    name = \"Pigeon\"\n    age = 0\n  }\n  new {\n    name = \"Parrot\"\n    age = 1\n  }\n}\nres4 {\n  new {\n    name = \"Pigeon\"\n    age = 0\n  }\n  new {\n    name = \"Parrot\"\n    age = 1\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 5\n  }\n}\nres5 {\n  name = \"Bald Eagle\"\n  age = 99\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/equality.pcf",
    "content": "res1 = true\nres2 = true\nres3 = false\nres4 = false\nres5 = true\nres6 = false\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\nres13 = true\nres14 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/hashCode.pcf",
    "content": "facts {\n  [\"local members aren't included in hash code\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"hidden members aren't included in hash code\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"delegating listings compute correct hash codes\"] {\n    List(1, 2, 3, 4, 5, 6, new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Stork\"\n      }\n    })\n  }\n  [\"delegating listings compute correct hash codes -- re-use hash-code\"] {\n    List(1, 2, 3, 4, 5, 6, new {\n      new {\n        name = \"Pigeon\"\n      }\n      new {\n        name = \"Stork\"\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/inequality.pcf",
    "content": "res1 = false\nres2 = false\nres3 = true\nres4 = true\nres5 = false\nres6 = true\nres8 = false\nres9 = false\nres10 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing1.pcf",
    "content": "res1 {}\nres2 {\n  null\n  true\n  42\n  1.23\n  \"foo\"\n  Regex(\"bar\")\n  5.gb\n  3.min\n  Pair(1, 2)\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1, \"two\", 2)\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    1\n    2\n    3\n  }\n  new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\nres3 {\n  null\n  true\n  42\n  1.23\n  \"foo\"\n  Regex(\"bar\")\n  5.gb\n  3.min\n  Pair(1, 2)\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1, \"two\", 2)\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    1\n    2\n    3\n  }\n  new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing2.pcf",
    "content": "res1 {\n  \"one\"\n  \"updated two\"\n  \"three\"\n}\nres1a {\n  \"one\"\n  \"updated two\"\n  \"three\"\n}\nres2 {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres2a {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres3 {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres3a {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres4 {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n  \"four\"\n  \"five\"\n  \"six\"\n}\nres4a {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n  \"four\"\n  \"five\"\n  \"six\"\n}\nres5 = \"Element index `3` is out of range `0`..`2`.\"\nres5a = \"Element index `3` is out of range `0`..`2`.\"\nres5b = \"Element index `3` is out of range `0`..`2`.\"\nres5c = \"Element index `3` is out of range `0`..`2`.\"\nres6 = \"Element index `3` is out of range `0`..`2`.\"\nres6a = \"Element index `3` is out of range `0`..`2`.\"\nres7 = \"Element index `-1` is out of range `0`..`2`.\"\nres7a = \"Element index `-1` is out of range `0`..`2`.\"\nres8 = \"Expected key of type `Int`, but got type `String`.\"\nres8a = \"Expected key of type `Int`, but got type `String`.\"\nres9 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres10 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres11 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres12 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres12a = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres13 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres13a = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres14 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres14a = \"Object of type `Listing` cannot have a property (other than `default`).\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing3.pcf",
    "content": "res1 = \"one\"\nres2 = \"two\"\nres3 = \"three\"\nres4 = \"Element index `-1` is out of range `0`..`2`.\"\nres5 = \"Element index `3` is out of range `0`..`2`.\"\nres6 = \"Element index `-9,223,372,036,854,775,808` is out of range `0`..`2`.\"\nres7 = \"Element index `9,223,372,036,854,775,807` is out of range `0`..`2`.\"\nres8 = \"one\"\nres9 = \"two\"\nres10 = \"three\"\nres11 = 4\nres12 = \"Element index `3` is out of range `0`..`2`.\"\nres13 = \"Element index `2` is out of range `0`..`1`.\"\nres14 = \"Cannot find key `\\\"other\\\"`.\"\nres15 {\n  \"one\"\n  \"one\"\n  \"two\"\n  \"two\"\n  \"one\"\n}\nres16 {\n  \"one\"\n  \"one\"\n  \"two\"\n  \"two\"\n  \"one\"\n  \"three\"\n  \"one\"\n  \"three\"\n}\nres17 {\n  \"item\"\n  \"item2\"\n}\nres18 {\n  \"element\"\n  \"element2\"\n  \"element3\"\n}\nres19 {\n  \"object\"\n  \"object2\"\n  \"object3\"\n  \"object4\"\n}\nres20 {\n  \"one2\"\n  \"one3\"\n  \"three\"\n  \"one4\"\n  \"one24\"\n}\nres21 = \"Element index `3` is out of range `0`..`1`.\"\nres22 {\n  new {}\n  new {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing4.pcf",
    "content": "examples {\n  [\"listings are lazy\"] {\n    \"foo\"\n    \"uh oh\"\n  }\n  [\"listings are lazy with generator entries\"] {\n    \"foo\"\n  }\n  [\"nested listings are also lazy\"] {\n    \"bar\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing5.pcf",
    "content": "facts {\n  [\"equals\"] {\n    true\n  }\n}\nexamples {\n  [\"type check: new with explicit parent\"] {\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"type check: local new with inferred parent\"] {\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"type check: local parameterized property type, unparameterized new with explicit parent\"] {\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"type check: local unparameterized property type, parameterized new with explicit parent\"] {\n    \"Expected value of type `String`, but got type `Int`. Value: 1\"\n  }\n  [\"amending listings does not require type checks on amending object members\"] {\n    new {\n      \"hi\"\n      1\n    }\n    new {\n      1\n      2\n    }\n    new {\n      \"hi\"\n      1\n    }\n  }\n  [\"type check: constraints on both property type node and explicit parent type node are checked\"] {\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n  }\n  [\"type check: nested listings: constraints on both parent type node and child type node are checked\"] {\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n  }\n  [\"type check: propagate from List\"] {\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n  }\n  [\"type check: propagate function types\"] {\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n  }\n  [\"type check: union type\"] {\n    \"Expected value of type `Listing<String(length.isOdd)>|Listing<String(length == 4)>`, but got a different `Listing`. Value: new Listing { \\\"Ba\\\"; ?; ?; ? }\"\n  }\n  [\"type check: nullable type\"] {\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n  }\n  [\"type check: propagate lambda type\"] {\n    \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\n    \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\n  }\n  [\"intermediary objects are not checked\"] {\n    new {\n      \"Hello\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing6.pcf",
    "content": "examples {\n  [\"name resolution in type constraint\"] {\n    \"Type constraint `isLongString` violated. Value: \\\"too short\\\"\"\n    new {\n      prop {\n        \"this is long enough\"\n      }\n    }\n  }\n  [\"resolves the receiver\"] {\n    new {\n      prop {\n        \"long enough\"\n      }\n    }\n    \"Type constraint `length > requiredLength` violated. Value: \\\"too short\\\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/listing7.err",
    "content": "listing {\n  1\n}\nlisting2 {\n  1\n}\nlisting3 {\n  new {\n    2\n  }\n}\nlisting4 {\n  new {\n    2\n  }\n}\npkl: TRACE: 1 = 1 (file:///$snippetsDir/input/listings/listing7.pkl)\npkl: TRACE: 2 = 2 (file:///$snippetsDir/input/listings/listing7.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/numberLiterals.pcf",
    "content": "res1 {\n  2\n  -1\n  2\n  -1\n  1\n  2.5\n  3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/typeCheck.pcf",
    "content": "res1 = \"pigeon\"\nres2 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres3 = \"pigeon\"\nres4 = \"Type constraint `length > 3` violated. Value: \\\"bob\\\"\"\nres5 = true\nres6 = true\nres7 = true\nres8 = true\nres9 = true\nres10 = false\nres11 = \"foo\"\nres12 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres13 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres14 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres15 = \"Expected value of type `Listing<String>|Listing<Int>`, but got a different `Listing`. Value: new Listing { \\\"foo\\\"; 1 }\"\nres16 = \"Expected value of type `Listing<String>|Listing<Int>?`, but got a different `Listing`. Value: new Listing { \\\"foo\\\"; 1 }\"\nres17 = \"Expected value of type `Listing<String>|(Listing<Int>|Int)`, but got a different `Listing`. Value: new Listing { \\\"foo\\\"; 1 }\"\nres18 = 2\nres19 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres20 = 1\nres21 = 1\nres22 = \"Expected value of type `String`, but got type `Int`. Value: 5\"\nres23 = 3\nres24 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres25 = 1\nres26 = \"Expected value of type `String`, but got type `Int`. Value: 15\"\nres27 = 3\nres28 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres29 = 3\nres30 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres31 {\n  \"hi\"\n  \"hi\"\n}\nres32 {\n  1\n  2\n}\nres33 {\n  \"hi\"\n  1\n}\nres34 {\n  \"hi\"\n  1\n  2\n  3\n}\nres35 = \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\nres36 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres37 = \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\nres38 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres39 = \"hello\"\nres40 = 1\nres41 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\nres42 = \"goodbye\"\nres43 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres45 = \"Expected value of type `String|Listing<Int>`, but got a different `Listing`. Value: new Listing { \\\"foo\\\" }\"\nres46 = \"hello\"\nres47 = \"Expected value of type `List<Listing<Int>>|List<Listing<String>>`, but got a different `List`. Value: List(new Listing { 1; \\\"hello\\\" })\"\nres48 = 2\nres49 = \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\nres50 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres51 = 3\nres52 = 1\nres53 = 2\nres54 = 2\nres55 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres56 = \"Expected value of type `String`, but got type `Int`. Value: 2\"\nres57 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres58 = 2\nres59 = 1\nres60 = 1\nres61 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hi\\\"\"\nres62 = 1\nres63 = 1\nres64 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres65 = \"Expected value of type `String`, but got type `Int`. Value: 2\"\nres66 = 5\nres67 = 1\nres68 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres69 = 2\nres70 = 1\nres71 = 2\nres73 = \"hello\"\nres74 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres75 = \"Expected value of type `Int|Listing<String>`, but got a different `Listing`. Value: new Listing { \\\"hello\\\"; 1 }\"\nres76 = \"Expected value of type `Collection<Listing<String>>|Collection<Listing<Int>>`, but got a different `List`. Value: List(new Listing { 1; \\\"hi\\\" })\"\nres77 = 3\nres78 = 1\nres79 = 2\nres80 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hi\\\"\"\nres81 = 3\nres82 = 1\nres83 = 2\nres84 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres85 = 1\nres86 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres87 = 1\nres88 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres89 = 1\nres90 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres91 = 1\nres92 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/wrongIndex.pcf",
    "content": "res1 = \"Element index `3` is out of range `0`..`0`.\"\nres2 = \"Element index `3` is out of range `0`..`0`.\"\nres3 = \"Element index `-1` is out of range `0`..`0`.\"\nres4 = \"Element index `-1` is out of range `0`..`0`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings/wrongParent.pcf",
    "content": "res1 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres2 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres3 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres4 = \"Object of type `wrongParent#Person` cannot have an element.\"\nres5 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres6 = \"Object of type `Mapping` cannot have an element.\"\nres7 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres8 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres9 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres10 = \"Object of type `wrongParent#Person` cannot have an element.\"\nres11 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres12 = \"Object of type `Mapping` cannot have an element.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/default.pcf",
    "content": "res1 {\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n}\nres2 {\n  new {\n    name = \"Pigeon\"\n    age = 21\n  }\n  new {\n    name = \"Parrot\"\n    age = 21\n  }\n}\nres3 {\n  new {\n    name = \"Pigeon\"\n    age = 0\n  }\n  new {\n    name = \"Parrot\"\n    age = 1\n  }\n}\nres4 {\n  new {\n    name = \"Pigeon\"\n    age = 0\n  }\n  new {\n    name = \"Parrot\"\n    age = 1\n  }\n  new {\n    name = \"Barn Owl\"\n    age = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/equality.pcf",
    "content": "res1 = true\nres2 = true\nres3 = false\nres4 = false\nres5 = true\nres6 = false\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\nres13 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/inequality.pcf",
    "content": "res1 = false\nres2 = false\nres3 = true\nres4 = true\nres5 = false\nres6 = true\nres8 = false\nres9 = false\nres10 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/listing1.pcf",
    "content": "res1 {}\nres2 {\n  null\n  true\n  42\n  1.23\n  \"foo\"\n  Regex(\"bar\")\n  5.gb\n  3.min\n  Pair(1, 2)\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1, \"two\", 2)\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    1\n    2\n    3\n  }\n  new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\nres3 {\n  null\n  true\n  42\n  1.23\n  \"foo\"\n  Regex(\"bar\")\n  5.gb\n  3.min\n  Pair(1, 2)\n  List(1, 2, 3)\n  Set(1, 2, 3)\n  Map(\"one\", 1, \"two\", 2)\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    name = \"Pigeon\"\n    age = 42\n  }\n  new {\n    1\n    2\n    3\n  }\n  new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/listing2.pcf",
    "content": "res1 {\n  \"one\"\n  \"updated two\"\n  \"three\"\n}\nres1a {\n  \"one\"\n  \"updated two\"\n  \"three\"\n}\nres2 {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres2a {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres3 {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres3a {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n}\nres4 {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n  \"four\"\n  \"five\"\n  \"six\"\n}\nres4a {\n  \"updated one\"\n  \"updated two\"\n  \"updated three\"\n  \"four\"\n  \"five\"\n  \"six\"\n}\nres5 = \"Element index `3` is out of range `0`..`2`.\"\nres5a = \"Element index `3` is out of range `0`..`2`.\"\nres5b = \"Element index `3` is out of range `0`..`2`.\"\nres5c = \"Element index `3` is out of range `0`..`2`.\"\nres6 = \"Element index `3` is out of range `0`..`2`.\"\nres6a = \"Element index `3` is out of range `0`..`2`.\"\nres7 = \"Element index `-1` is out of range `0`..`2`.\"\nres7a = \"Element index `-1` is out of range `0`..`2`.\"\nres8 = \"Expected key of type `Int`, but got type `String`.\"\nres8a = \"Expected key of type `Int`, but got type `String`.\"\nres9 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres10 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres11 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres12 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres12a = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres13 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres13a = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres14 = \"Object of type `Listing` cannot have a property (other than `default`).\"\nres14a = \"Object of type `Listing` cannot have a property (other than `default`).\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/listing3.pcf",
    "content": "res1 = \"one\"\nres2 = \"two\"\nres3 = \"three\"\nres4 = \"Element index `-1` is out of range `0`..`2`.\"\nres5 = \"Element index `3` is out of range `0`..`2`.\"\nres6 = \"Element index `-9,223,372,036,854,775,808` is out of range `0`..`2`.\"\nres7 = \"Element index `9,223,372,036,854,775,807` is out of range `0`..`2`.\"\nres8 = \"one\"\nres9 = \"two\"\nres10 = \"three\"\nres11 = 4\nres12 = \"Element index `3` is out of range `0`..`2`.\"\nres13 = \"Element index `2` is out of range `0`..`1`.\"\nres14 = \"Cannot find key `\\\"other\\\"`.\"\nres15 {\n  \"one\"\n  \"one\"\n  \"two\"\n  \"two\"\n  \"one\"\n}\nres16 {\n  \"one\"\n  \"one\"\n  \"two\"\n  \"two\"\n  \"one\"\n  \"three\"\n  \"one\"\n  \"three\"\n}\nres17 {\n  \"item\"\n  \"item2\"\n}\nres18 {\n  \"element\"\n  \"element2\"\n  \"element3\"\n}\nres19 {\n  \"object\"\n  \"object2\"\n  \"object3\"\n  \"object4\"\n}\nres20 {\n  \"one2\"\n  \"one3\"\n  \"three\"\n  \"one4\"\n  \"one24\"\n}\nres21 = \"Element index `3` is out of range `0`..`1`.\"\nres22 {\n  new {}\n  new {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/numberLiterals.pcf",
    "content": "res1 {\n  2\n  -1\n  2\n  -1\n  1\n  2.5\n  3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/typeCheck.pcf",
    "content": "res1 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres2 = \"Type constraint `length > 3` violated. Value: \\\"bob\\\"\"\nres3 = \"Type constraint `!isEmpty` violated. Value: new Listing {}\"\nres4 = true\nres5 = true\nres6 = true\nres7 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/wrongIndex.pcf",
    "content": "res1 = \"Element index `3` is out of range `0`..`0`.\"\nres2 = \"Element index `3` is out of range `0`..`0`.\"\nres3 = \"Element index `-1` is out of range `0`..`0`.\"\nres4 = \"Element index `-1` is out of range `0`..`0`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/listings2/wrongParent.pcf",
    "content": "res1 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres2 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres3 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres4 = \"Object of type `new Person {}` cannot have an element.\"\nres5 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres6 = \"Object of type `new Mapping {}` cannot have an element.\"\nres7 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres8 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres9 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres10 = \"Object of type `new Person {}` cannot have an element.\"\nres11 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres12 = \"Object of type `new Mapping {}` cannot have an element.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/default.pcf",
    "content": "res1 {\n  [\"pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"parrot\"] {\n    name = \"Parrot\"\n    age = 50\n  }\n}\nres2 {\n  [\"pigeon\"] {\n    name = \"Pigeon\"\n    age = 45\n  }\n  [\"parrot\"] {\n    name = \"Parrot\"\n    age = 50\n  }\n}\nres3 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 40\n  }\n  [\"parrot\"] {\n    name = \"PARROT\"\n    age = 50\n  }\n  [\"susan\"] {\n    name = \"susan!!!\"\n    age = 60\n  }\n}\nres4 {\n  name = \"Bald Eagle\"\n  age = 99\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/duplicateComputedKey.pcf",
    "content": "res1 = \"Duplicate definition of member `\\\"barn owl\\\"`.\"\nres2 = \"Duplicate definition of member `\\\"barn owl\\\"`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/duplicateConstantKey.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `\"barn owl\"`.\n\nx | [\"barn owl\"] = 3\n     ^^^^^^^^^^\nat duplicateConstantKey#res1 (file:///$snippetsDir/input/mappings/duplicateConstantKey.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/equality.pcf",
    "content": "res1 = true\nres2 = true\nres3 = false\nres4 = false\nres5 = true\nres6 = true\nres7 = false\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\nres13 = true\nres14 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/hashCode.pcf",
    "content": "facts {\n  [\"local members aren't included in hash code\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"hidden members aren't included in hash code\"] {\n    true\n    true\n    true\n  }\n}\nexamples {\n  [\"delegating mappings produce correct hash codes\"] {\n    List(1, 2, 3, 4, 5, 6, new {\n      [\"Pigeon\"] {\n        name = \"Pigeon\"\n      }\n      [\"Stork\"] {\n        name = \"Stork\"\n      }\n    })\n  }\n  [\"delegating mappings produce correct hash codes -- re-use hash-code\"] {\n    List(1, 2, 3, 4, 5, 6, new {\n      [\"Pigeon\"] {\n        name = \"Pigeon\"\n      }\n      [\"Stork\"] {\n        name = \"Stork\"\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/inequality.pcf",
    "content": "res1 = false\nres2 = false\nres3 = true\nres4 = true\nres5 = false\nres6 = false\nres7 = true\nres8 = false\nres9 = false\nres10 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/mapping1.pcf",
    "content": "res1 {}\nres2 {\n  [null] = null\n  [true] = true\n  [42] = 42\n  [1.23] = 1.23\n  [\"foo\"] = \"foo\"\n  [Regex(\"bar\")] = Regex(\"bar\")\n  [5.gb] = 5.gb\n  [3.min] = 3.min\n  [Pair(1, 2)] = Pair(1, 2)\n  [List(1, 2, 3)] = List(1, 2, 3)\n  [Set(1, 2, 3)] = Set(1, 2, 3)\n  [Map(\"one\", 1, \"two\", 2)] = Map(\"one\", 1, \"two\", 2)\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    1\n    2\n    3\n  }] {\n    1\n    2\n    3\n  }\n  [new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }] {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\nres3 {\n  [null] = null\n  [true] = true\n  [42] = 42\n  [1.23] = 1.23\n  [\"foo\"] = \"foo\"\n  [Regex(\"bar\")] = Regex(\"bar\")\n  [5.gb] = 5.gb\n  [3.min] = 3.min\n  [Pair(1, 2)] = Pair(1, 2)\n  [List(1, 2, 3)] = List(1, 2, 3)\n  [Set(1, 2, 3)] = Set(1, 2, 3)\n  [Map(\"one\", 1, \"two\", 2)] = Map(\"one\", 1, \"two\", 2)\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    1\n    2\n    3\n  }] {\n    1\n    2\n    3\n  }\n  [new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }] {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/mapping2.pcf",
    "content": "res1 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres2 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres3 {\n  [\"item one\"] = 1\n  [\"two\"] = 2\n}\nres4 {\n  [\"one\"] = 2\n  [\"two\"] = 3\n}\nres5 {\n  [\"one\"] {\n    [\"a\"] {\n      [\"x\"] = 1\n    }\n    [\"b\"] {\n      [\"y\"] = 2\n    }\n  }\n  [\"two\"] {\n    [\"c\"] {\n      [\"z\"] = 3\n    }\n  }\n}\nres5a {\n  [\"a\"] {\n    [\"x\"] = 1\n  }\n  [\"b\"] {\n    [\"y\"] = 2\n  }\n}\nres5b {\n  [\"x\"] = 1\n}\nres5c = 1\nres5d {\n  [\"y\"] = 2\n}\nres5e = 2\nres5f {\n  [\"c\"] {\n    [\"z\"] = 3\n  }\n}\nres5g {\n  [\"z\"] = 3\n}\nres5h = 3\nres5i = \"Cannot find key `\\\"three\\\"`.\"\nres6 {\n  [\"one\"] = List(1, 2, 3)\n  [\"two\"] = List(1, 2, 3, 4, 5, 6)\n  [\"three\"] = 3\n}\nres7 {\n  [\"one\"] = List(1, 2, 3, 4, 5, 6)\n  [\"two\"] = List(1, 2, 3, 4, 5, 6, 4, 5, 6)\n  [\"three\"] = 6\n}\nres8 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 42\n  }\n  [\"barn owl\"] {\n    name = \"barn owl\"\n    age = 42\n  }\n  [\"parrot\"] {\n    name = \"parrot\"\n    age = 42\n  }\n}\nres9 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 42\n  }\n  [\"barn owl\"] {\n    name = \"barn owl\"\n    age = 42\n  }\n  [\"parrot\"] {\n    name = \"parrot\"\n    age = 32\n  }\n}\nres10 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 42\n  }\n  [\"barn owl\"] {\n    name = \"barn owl\"\n    age = 22\n  }\n  [\"parrot\"] {\n    name = \"parrot\"\n    age = 32\n  }\n  [\"elf owl\"] {\n    name = \"elf owl\"\n    age = 42\n  }\n}\nres11 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/stringKeyNotFound.err",
    "content": "–– Pkl Error ––\nCannot find key `\"foo\"`.\n\nx | res1 = x[\"foo\"]\n           ^^^^^^^^\nat stringKeyNotFound#res1 (file:///$snippetsDir/input/mappings/stringKeyNotFound.pkl)\n\nDid you mean any of the following?\n\"fooy\"\n\"fozo\"\n\"xfoo\"\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/typeCheck.pcf",
    "content": "res1 = 2\nres2 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres3 = 2\nres4 = List(1, 2, 3)\nres5 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres6 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres7 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres8 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres9 = 1\nres10 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres11 = 1\nres12 = 1\nres13 = 1\nres14 = 3\nres15 = 42\nres16 = 1\nres17 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres18 = 1\nres19 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres20 = \"Expected value of type `Mapping<String, String>|Mapping<String, Int>`, but got a different `Mapping`. Value: new Mapping { [\\\"one\\\"] = 1; [\\\"two\\\"] = \\\"two\\\" }\"\nres21 = \"Expected value of type `Mapping<String, String>|Mapping<String, Int>?`, but got a different `Mapping`. Value: new Mapping { [\\\"one\\\"] = 1; [\\\"two\\\"] = \\\"two\\\" }\"\nres22 = \"Expected value of type `Mapping<String, String>|(Mapping<String, Int>|Int)`, but got a different `Mapping`. Value: new Mapping { [\\\"one\\\"] = 1; [\\\"two\\\"] = \\\"two\\\" }\"\nres23 = 2\nres24 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres25 = 1\nres26 = 1\nres27 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres28 = 1\nres29 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres30 = 1\nres31 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres32 = 1\nres33 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres34 = 1\nres35 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres36 {\n  [\"hi\"] = \"hi\"\n  [\"hi2\"] = 1\n}\nres37 {\n  [\"hi\"] = \"hi\"\n  [\"hi2\"] = 1\n}\nres38 {\n  [\"hi\"] = \"hi\"\n  [\"hi2\"] = 1\n}\nres39 = \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\nres40 = \"Cannot find key `\\\"\\\"`.\"\nres41 = \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\nres42 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres43 = \"hello\"\nres44 = 1\nres45 = \"Expected value of type `Int`, but got type `String`. Value: \\\"foo\\\"\"\nres46 = \"goodbye\"\nres47 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres48 = 1\nres49 = \"Expected value of type `List<Mapping<String, Int>>|List<Mapping<String, String>>`, but got a different `List`. Value: List(new Mapping { [\\\"foo\\\"] = 1; [\\\"bar\\\"] = \\\"hi\\\" })\"\nres50 = 2\nres51 = \"Type constraint `length.isOdd` violated. Value: \\\"Ba\\\"\"\nres52 = \"Type constraint `this == capitalize()` violated. Value: \\\"bar\\\"\"\nres53 = 3\nres54 = 1\nres55 = 2\nres56 = 2\nres57 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres58 = \"Expected value of type `String`, but got type `Int`. Value: 2\"\nres59 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres60 = 2\nres61 = 1\nres62 = 1\nres63 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hi\\\"\"\nres64 = 1\nres65 = 1\nres66 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres67 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres68 = 5\nres69 = 1\nres70 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres71 = 2\nres72 = 1\nres73 = 2\nres74 = \"hello\"\nres75 = \"Expected value of type `String`, but got type `Int`. Value: 1\"\nres77 = \"Expected value of type `Int|Mapping<String, String>`, but got a different `Mapping`. Value: new Mapping { [\\\"one\\\"] = \\\"hello\\\"; [\\\"two\\\"] = 1 }\"\nres78 = \"Expected value of type `Collection<Mapping<String, String>>|Collection<Mapping<String, Int>>`, but got a different `List`. Value: List(new Mapping { [\\\"one\\\"] = \\\"hello\\\"; [\\\"two\\\"] = 1 })\"\nres79 = 3\nres80 = 1\nres81 = 2\nres82 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hi\\\"\"\nres83 = 3\nres84 = 1\nres85 = 2\nres86 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres87 = 1\nres88 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres89 = 1\nres90 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres91 = 1\nres92 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\nres93 = 1\nres94 = \"Expected value of type `Int`, but got type `String`. Value: \\\"hello\\\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings/wrongParent.pcf",
    "content": "res1 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres2 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres3 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres4 = \"Object of type `wrongParent#Person` cannot have an entry.\"\nres5 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres6 = \"Element index `0` is out of range `0`..`-1`.\"\nres7 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres8 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres9 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres10 = \"Object of type `wrongParent#Person` cannot have an entry.\"\nres11 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres12 = \"Element index `0` is out of range `0`..`-1`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/default.pcf",
    "content": "res1 {\n  [\"pigeon\"] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [\"parrot\"] {\n    name = \"Parrot\"\n    age = 50\n  }\n}\nres2 {\n  [\"pigeon\"] {\n    name = \"Pigeon\"\n    age = 45\n  }\n  [\"parrot\"] {\n    name = \"Parrot\"\n    age = 50\n  }\n}\nres3 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 40\n  }\n  [\"parrot\"] {\n    name = \"PARROT\"\n    age = 50\n  }\n  [\"susan\"] {\n    name = \"susan!!!\"\n    age = 60\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/duplicateComputedKey.pcf",
    "content": "res1 = \"Duplicate definition of member `\\\"barn owl\\\"`.\"\nres2 = \"Duplicate definition of member `\\\"barn owl\\\"`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/duplicateConstantKey.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `\"barn owl\"`.\n\nx | [\"barn owl\"] = 3\n     ^^^^^^^^^^\nat duplicateConstantKey#res1 (file:///$snippetsDir/input/mappings2/duplicateConstantKey.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/equality.pcf",
    "content": "res1 = true\nres2 = true\nres3 = false\nres4 = false\nres5 = true\nres6 = true\nres7 = false\nres8 = true\nres9 = true\nres10 = true\nres11 = true\nres12 = true\nres13 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/inequality.pcf",
    "content": "res1 = false\nres2 = false\nres3 = true\nres4 = true\nres5 = false\nres6 = false\nres7 = true\nres8 = false\nres9 = false\nres10 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/mapping1.pcf",
    "content": "res1 {}\nres2 {\n  [null] = null\n  [true] = true\n  [42] = 42\n  [1.23] = 1.23\n  [\"foo\"] = \"foo\"\n  [Regex(\"bar\")] = Regex(\"bar\")\n  [5.gb] = 5.gb\n  [3.min] = 3.min\n  [Pair(1, 2)] = Pair(1, 2)\n  [List(1, 2, 3)] = List(1, 2, 3)\n  [Set(1, 2, 3)] = Set(1, 2, 3)\n  [Map(\"one\", 1, \"two\", 2)] = Map(\"one\", 1, \"two\", 2)\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    1\n    2\n    3\n  }] {\n    1\n    2\n    3\n  }\n  [new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }] {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\nres3 {\n  [null] = null\n  [true] = true\n  [42] = 42\n  [1.23] = 1.23\n  [\"foo\"] = \"foo\"\n  [Regex(\"bar\")] = Regex(\"bar\")\n  [5.gb] = 5.gb\n  [3.min] = 3.min\n  [Pair(1, 2)] = Pair(1, 2)\n  [List(1, 2, 3)] = List(1, 2, 3)\n  [Set(1, 2, 3)] = Set(1, 2, 3)\n  [Map(\"one\", 1, \"two\", 2)] = Map(\"one\", 1, \"two\", 2)\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    name = \"Pigeon\"\n    age = 42\n  }] {\n    name = \"Pigeon\"\n    age = 42\n  }\n  [new {\n    1\n    2\n    3\n  }] {\n    1\n    2\n    3\n  }\n  [new {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }] {\n    [\"one\"] = 1\n    [\"two\"] = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/mapping2.pcf",
    "content": "res1 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres2 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\nres3 {\n  [\"item one\"] = 1\n  [\"two\"] = 2\n}\nres4 {\n  [\"one\"] = 2\n  [\"two\"] = 3\n}\nres5 {\n  [\"one\"] {\n    [\"a\"] {\n      [\"x\"] = 1\n    }\n    [\"b\"] {\n      [\"y\"] = 2\n    }\n  }\n  [\"two\"] {\n    [\"c\"] {\n      [\"z\"] = 3\n    }\n  }\n}\nres5a {\n  [\"a\"] {\n    [\"x\"] = 1\n  }\n  [\"b\"] {\n    [\"y\"] = 2\n  }\n}\nres5b {\n  [\"x\"] = 1\n}\nres5c = 1\nres5d {\n  [\"y\"] = 2\n}\nres5e = 2\nres5f {\n  [\"c\"] {\n    [\"z\"] = 3\n  }\n}\nres5g {\n  [\"z\"] = 3\n}\nres5h = 3\nres5i = \"Cannot find key `\\\"three\\\"`.\"\nres6 {\n  [\"one\"] = List(1, 2, 3)\n  [\"two\"] = List(1, 2, 3, 4, 5, 6)\n  [\"three\"] = 3\n}\nres7 {\n  [\"one\"] = List(1, 2, 3, 4, 5, 6)\n  [\"two\"] = List(1, 2, 3, 4, 5, 6, 4, 5, 6)\n  [\"three\"] = 6\n}\nres8 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 42\n  }\n  [\"barn owl\"] {\n    name = \"barn owl\"\n    age = 42\n  }\n  [\"parrot\"] {\n    name = \"parrot\"\n    age = 42\n  }\n}\nres9 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 42\n  }\n  [\"barn owl\"] {\n    name = \"barn owl\"\n    age = 42\n  }\n  [\"parrot\"] {\n    name = \"parrot\"\n    age = 32\n  }\n}\nres10 {\n  [\"pigeon\"] {\n    name = \"pigeon\"\n    age = 42\n  }\n  [\"barn owl\"] {\n    name = \"barn owl\"\n    age = 22\n  }\n  [\"parrot\"] {\n    name = \"parrot\"\n    age = 32\n  }\n  [\"elf owl\"] {\n    name = \"elf owl\"\n    age = 42\n  }\n}\nres11 {\n  [\"one\"] = 1\n  [\"two\"] = 2\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/stringKeyNotFound.err",
    "content": "–– Pkl Error ––\nCannot find key `\"foo\"`.\n\nx | res1 = x[\"foo\"]\n           ^^^^^^^^\nat stringKeyNotFound#res1 (file:///$snippetsDir/input/mappings2/stringKeyNotFound.pkl)\n\nDid you mean any of the following?\n\"fooy\"\n\"fozo\"\n\"xfoo\"\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/typeCheck.pcf",
    "content": "res1 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres2 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres3 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres4 = \"Expected value of type `List`, but got type `Int`. Value: 42\"\nres5 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres6 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres7 = true\nres8 = true\nres9 = true\nres10 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/mappings2/wrongParent.pcf",
    "content": "res1 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres2 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres3 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres4 = \"Object of type `new Person {}` cannot have an entry.\"\nres5 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres6 = \"Element index `0` is out of range `0`..`-1`.\"\nres7 = \"Cannot instantiate, or amend an instance of, external class `Int`.\"\nres8 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres9 = \"Cannot instantiate, or amend an instance of, external class `List`.\"\nres10 = \"Object of type `new Person {}` cannot have an entry.\"\nres11 = \"Cannot instantiate abstract class `ValueRenderer`.\"\nres12 = \"Element index `0` is out of range `0`..`-1`.\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/methods/methodParameterConstraints1.pcf",
    "content": "res0 = 3\nres1 = List(\"1\", \"2\")\nres2 = Map(\"1\", 1, \"2\", 2)\nres3 = \"1\"\nres4 = null\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/methods/methodParameterConstraints2.pcf",
    "content": "res1 = \"Type constraint `isPositive` violated. Value: -3\"\nres2 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres3 = \"Type constraint `isPositive` violated. Value: -2\"\nres4 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres5 = \"Type constraint `isPositive` violated. Value: -3\"\nres6 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\nres7 = \"Type constraint `isPositive` violated. Value: -2\"\nres8 = \"Type constraint `!isEmpty` violated. Value: \\\"\\\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/methods/methodParameterTypes1.pcf",
    "content": "res1 = 3\nres2 = 3\nres3 = 3.3000000000000003\nres4 = \"Expected value of type `Int`, but got type `Float`. Value: 1.1\"\nres5 = \"Expected value of type `Number`, but got type `String`. Value: \\\"2\\\"\"\nres6 = \"Expected value of type `Int`, but got type `Float`. Value: 1.1\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/methods/methodParameterTypes2.pcf",
    "content": "res1 = \"hello\"\nres3 = \"hellohello\"\nres4 = 1\nres5 = 3\nres6 = 3\nres7 = 1.2\nres8 = 2.2\nres9 = 2.2\nres10 = 1.s\nres11 = 4.s\nres12 = 1.mb\nres13 = 3.mb\nres17 = List(1, 2)\nres18 = List(1, 2, 3)\nres19 = List(1, 2, 3)\nres20 = Set(1, 2)\nres21 = Set(1, 2, 3)\nres22 = Set(1, 2, 3)\nres23 = Map(1, 2)\nres24 = Map(1, 2, 3, 4)\nres25 {}\nres26 {}\nres27 {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/methods/methodParameterTypes3.pcf",
    "content": "res1 = List(\"1\", \"2\")\nres2 = Map(\"1\", 1, \"2\", 2)\nres3 = \"1\"\nres4 = null\nres5 = 5\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule1.pcf",
    "content": "name = \"pigeon1\"\npigeon {\n  name = \"pigeon1\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule2.pcf",
    "content": "name = \"Pigeon\"\npigeon {\n  name = \"pigeon2\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule3.pcf",
    "content": "name = \"pigeon1\"\npigeon {\n  name = \"pigeon3\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule4.pcf",
    "content": "name = \"Pigeon\"\npigeon {\n  name = \"pigeon4\"\n}\nparrot {\n  name = \"parrot4\"\n  subjects = List(\"Fire making\", \"Stone age\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule5.pcf",
    "content": "name = \"pigeon5\"\npigeon {\n  name = \"pigeon5\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/amendModule6.pcf",
    "content": "pidgy = null\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/duplicateFunction.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `foo`.\n\nx | function foo(arg) = \"other\" // duplicate\n    ^^^^^^^^^^^^^^^^^\nat duplicateFunction (file:///$snippetsDir/input/modules/duplicateFunction.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/duplicateProperty1.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `test`.\n\nx | test = \"test\" // duplicate\n    ^^^^\nat duplicateProperty1 (file:///$snippetsDir/input/modules/duplicateProperty1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/duplicateProperty2.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `test`.\n\nx | class test // duplicate\n    ^^^^^^^^^^\nat duplicateProperty2 (file:///$snippetsDir/input/modules/duplicateProperty2.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/duplicateProperty3.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `test`.\n\nx | test = \"test\" // this is considered the duplicate as ASTGenerator doesn't maintain order between props and classes\n    ^^^^\nat duplicateProperty3 (file:///$snippetsDir/input/modules/duplicateProperty3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/equality.pcf",
    "content": "res1 = true\nres2 = true\nres3 = false\nres4 = false\nres5 = true\nres6 = false\nres7 = false\nres8 = true\nres9 = true\nres10 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/extendModule1.pcf",
    "content": "name = \"Pigeon\"\npigeon {\n  name = \"PIGEON\"\n}\nparrot {\n  name = \"Parrot\"\n  subjects = List(\"Fire making\", \"Stone age\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/externalFunction.err",
    "content": "–– Pkl Error ––\nExternal members can only be defined by standard library modules.\n\nx | external function foo()\n    ^^^^^^^^\nat externalFunction (file:///$snippetsDir/input/modules/externalFunction.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/externalProperty.err",
    "content": "–– Pkl Error ––\nExternal members can only be defined by standard library modules.\n\nx | external foo: String\n    ^^^^^^^^\nat externalProperty (file:///$snippetsDir/input/modules/externalProperty.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/filename with spaces 2.pcf",
    "content": "otherFile {\n  foo = \"bar\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/filename with spaces.pcf",
    "content": "foo = \"bar\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/functions.pcf",
    "content": "moduleVar = 3\nres1 = 42\nres2 = 9\nres3 = \"e\"\nres4 = 11\nres5 = \"x: 5 moduleVar: 3\"\nres6 = 7\nres7 = 8\nres8 = 3\nres9 = 3\nres10 = 13\nres11 {\n  b = 3\n  c {\n    d = 99\n    x {\n      a = 5\n      y {\n        z = 5\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidAmend1.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 42\n\nx | name: String = \"Pigeon\"\n          ^^^^^^\nat my.library#name (file:///$snippetsDir/input/modules/library.pkl)\n\nx | name = 42\n           ^^\nat invalidAmend1#name (file:///$snippetsDir/input/modules/invalidAmend1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidAmend2.err",
    "content": "–– Pkl Error ––\nCannot find property `other` in module `my.library`.\n\nx | other = \"parrot\"\n    ^^^^^\nat invalidAmend2 (file:///$snippetsDir/input/modules/invalidAmend2.pkl)\n\nAvailable properties in module `my.library`:\nPerson\nname\noutput\npigeon\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidAmend3.err",
    "content": "–– Pkl Error ––\nA non-local object property cannot have a type annotation.\n\nx | name: String = \"parrot\"\n          ^^^^^^\nat invalidAmend3#name (file:///$snippetsDir/input/modules/invalidAmend3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidAmend4.err",
    "content": "–– Pkl Error ––\nMethod needs a `local` modifier.\n\nx | function foo() = \"parrot\"\n    ^^^^^^^^^^^^^^\nat invalidAmend4 (file:///$snippetsDir/input/modules/invalidAmend4.pkl)\n\nTo define a non-local method, extend rather than amend the parent module (which must be `open` for extension).\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidAmend5.err",
    "content": "–– Pkl Error ––\nClass needs a `local` modifier.\n\nx | class Other\n    ^^^^^^^^^^^\nat invalidAmend5 (file:///$snippetsDir/input/modules/invalidAmend5.pkl)\n\nTo define a non-local class, extend rather than amend the parent module (which must be `open` for extension).\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidAmend6.err",
    "content": "–– Pkl Error ––\nCannot find property `foo` in object of type `Resource`.\n\nx | foo = \"bar\"\n    ^^^\nat invalidAmend6#resource (file:///$snippetsDir/input/modules/invalidAmend6.pkl)\n\nAvailable properties:\nbase64\nbytes\nmd5\nsha1\nsha256\nsha256Int\ntext\nuri\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidExtend1.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 42\n\nx | name: String = \"Pigeon\"\n          ^^^^^^\nat my.library#name (file:///$snippetsDir/input/modules/library.pkl)\n\nx | name = 42\n           ^^\nat invalidExtend1#name (file:///$snippetsDir/input/modules/invalidExtend1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidExtend2.err",
    "content": "–– Pkl Error ––\nCannot extend non-open module `extendModule1`.\n\nx | extends \"extendModule1.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidExtend2 (file:///$snippetsDir/input/modules/invalidExtend2.pkl)\n\nBy default, modules are closed for extension.\nTo make a module extensible, add an `open` modifier: `open module my_module; ...`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidExtend3.err",
    "content": "–– Pkl Error ––\nModule `my.library` cannot be extended or used as type because it amends another module.\n\nx | extends \"amendModule1.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidExtend3 (file:///$snippetsDir/input/modules/invalidExtend3.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/invalidModule1.err",
    "content": "–– Pkl Error ––\nUnexpected token `\"`. Expected `identifier`.\n\nx | module \"DoNotQuote\"\n           ^\nat invalidModule1 (file:///$snippetsDir/input/modules/invalidModule1.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/library.pcf",
    "content": "name = \"Pigeon\"\npigeon {\n  name = \"Pigeon\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/lists.pcf",
    "content": "x = List(List(1, 2), List(3, 4))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/objects.pcf",
    "content": "x {\n  y {\n    z = 1\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/recursiveModule1.pcf",
    "content": "foo {\n  bar {\n    foo {\n      bar = null\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/supercalls1.pcf",
    "content": "prefix = \"\"\nsameProp = \"a\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/supercalls2.pcf",
    "content": "prefix = \"\"\nsameProp = \"ab\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/supercalls3.pcf",
    "content": "prefix = \"Oh \"\nsameProp = \"abc\"\nres1 = \"Oh Pigeon\"\nres2 = \"Oh Barn Owl\"\nres3 = \"Oh ParrotOh Parrot\"\nres4 = \"Oh PigeonOh Barn Owl\"\nres5 = \"Oh Barn OwlOh Pigeon\"\nres6 = \"Oh Parrot\"\nres7 = \"Cannot find method `other` in module `supercalls2`.\"\nres8 = 6\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/typedModuleMethods1.pcf",
    "content": "res1 = \"Pigeon\"\nres2 = \"Pigeon\"\nres3 = \"PigeonParrot\"\nres4 = \"PigeonParrot\"\nres5 = \"Pigeon\"\nres6 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres7 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres8 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres9 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/typedModuleProperties1.pcf",
    "content": "res1 = \"str\"\nres2 = \"str\"\nres3 {\n  name = \"Pigeon\"\n}\nres4 {\n  name = \"Parrot\"\n  subjects = List(\"Fire making, Stone age\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/typedModuleProperties2.err",
    "content": "–– Pkl Error ––\nExpected value of type `String`, but got type `Int`.\nValue: 42\n\nx | res1: String = 42\n          ^^^^^^\nat typedModuleProperties2#res1 (file:///$snippetsDir/input/modules/typedModuleProperties2.pkl)\n\nx | res1: String = 42\n                   ^^\nat typedModuleProperties2#res1 (file:///$snippetsDir/input/modules/typedModuleProperties2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/typedModuleProperties3.err",
    "content": "–– Pkl Error ––\nType constraint `!isEmpty` violated.\nValue: \"\"\n\n    !isEmpty\n    ││\n    │true\n    false\n\nx | res1: String(!isEmpty) = \"\"\n                 ^^^^^^^^\nat typedModuleProperties3#res1 (file:///$snippetsDir/input/modules/typedModuleProperties3.pkl)\n\nx | res1: String(!isEmpty) = \"\"\n                             ^^\nat typedModuleProperties3#res1 (file:///$snippetsDir/input/modules/typedModuleProperties3.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/日本語.pcf",
    "content": "日本語 = \"Japanese language\"\nreadOne = \"\"\"\n  // covers https://github.com/apple/pkl/issues/653\n  日本語 = \"Japanese language\"\n  readOne = read(\"日本語.pkl\").text\n  readGlob = read*(\"./日*.pkl\").keys\n  importOne = import(\"日本語.pkl\").readOne\n  importGlob = import*(\"./日*.pkl\").keys\n  \n  \"\"\"\nreadGlob = Set(\"./日本語.pkl\", \"./日本語_error.pkl\")\nimportOne = \"\"\"\n  // covers https://github.com/apple/pkl/issues/653\n  日本語 = \"Japanese language\"\n  readOne = read(\"日本語.pkl\").text\n  readGlob = read*(\"./日*.pkl\").keys\n  importOne = import(\"日本語.pkl\").readOne\n  importGlob = import*(\"./日*.pkl\").keys\n  \n  \"\"\"\nimportGlob = Set(\"./日本語.pkl\", \"./日本語_error.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/modules/日本語_error.err",
    "content": "–– Pkl Error ––\nError reporting should also handle unicode filenames!\n\nx | 日本語 = throw(\"Error reporting should also handle unicode filenames!\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat 日本語_error#日本語 (file:///$snippetsDir/input/modules/%E6%97%A5%E6%9C%AC%E8%AA%9E_error.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/closure.pcf",
    "content": "res1 = 4\nres2 = 4\nres3 = 9\nres4 = 9\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/configureObjectAssign.pcf",
    "content": "x {\n  foo {\n    bar {\n      num1 = 1\n      num2 = 2\n    }\n    baz {\n      num3 = 3\n    }\n  }\n}\ny {\n  foo {\n    bar {\n      num1 = 11\n      num2 = 2\n      str = \"str\"\n    }\n    baz {\n      num3 = 3\n    }\n    baz2 {\n      num4 = 4\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/duplicateProperty.err",
    "content": "–– Pkl Error ––\nDuplicate definition of member `prop1`.\n\nx | prop1 = \"other\" // duplicate\n    ^^^^^\nat duplicateProperty#obj (file:///$snippetsDir/input/objects/duplicateProperty.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/equality.pcf",
    "content": "a1 = true\na2 = true\na3 = true\na4 = true\na5 = false\na6 = false\na7 = false\na8 = true\na9 = true\na10 = true\na11 = true\nb1 = true\nb2 = true\nb3 = true\nb4 = true\nb5 = true\nb6 = true\nb7 = false\nb8 = false\nc1 = false\nc2 = false\nc3 = true\nc4 = false\nc5 = true\nc6 = false\nc7 = true\nc8 = true\nd1 = true\nd2 = true\nd3 = true\nd4 = true\ne1 = true\ne2 = true\ne3 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/hashCode.pcf",
    "content": "facts {\n  [\"local members aren't included in hash code - Dynamic\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"local members aren't included in hash code - Typed\"] {\n    true\n    true\n    true\n    true\n  }\n  [\"hidden members aren't included in hash code - Dynamic\"] {\n    true\n    true\n    true\n  }\n  [\"hidden members aren't included in hash code - Typed\"] {\n    true\n    true\n    true\n  }\n  [\"hidden members of superclass aren't included in hash code - Typed\"] {\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/implicitReceiver1.pcf",
    "content": "x = 0\nfoo {\n  x = 1\n  bar {\n    x = 2\n    y = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/implicitReceiver2.pcf",
    "content": "x = 0\nfoo {\n  x = 1\n  bar {\n    y = 4\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/implicitReceiver3.pcf",
    "content": "x = 0\nfoo {\n  bar {\n    y = 3\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/implicitReceiver4.err",
    "content": "–– Pkl Error ––\nCannot find property `x`.\n\nx | y = x + 3\n        ^\nat implicitReceiver4#foo.bar.y (file:///$snippetsDir/input/objects/implicitReceiver4.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/inequality.pcf",
    "content": "res1 = false\nres2 = false\nres3 = false\nres4 = false\nres5 = true\nres6 = true\nres7 = true\nres8 = false\nres9 = false\nres10 = false\nres11 = false\nres12 = false\nres13 = false\nres14 = true\nres15 = true\nres16 = true\nres17 = true\nres18 = false\nres19 = true\nres20 = false\nres21 = true\nres22 = false\nres23 = false\nres24 = false\nres25 = false\nres26 = false\nres27 = false\nres28 = false\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/lateBinding1.pcf",
    "content": "v1 {\n  foo {\n    x = 3\n    y = 3\n  }\n}\nv2 {\n  foo {\n    x = 4\n    y = 4\n  }\n}\nv3 {\n  foo {\n    x = 3\n    y = 3\n  }\n  y = 5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/lateBinding2.pcf",
    "content": "v1 {\n  foo {\n    x = 3\n  }\n  y = 3\n}\nv2 {\n  foo {\n    x = 4\n  }\n  y = 4\n}\nv3 {\n  foo {\n    x = 3\n    y = 5\n  }\n  y = 3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/lateBinding3.pcf",
    "content": "v1 {\n  foo {\n    x = 3\n    y = 1\n  }\n  y = 3\n}\nv2 {\n  foo {\n    x = 4\n    y = 1\n  }\n  y = 4\n}\nv3 {\n  foo {\n    x = 3\n    y = 5\n  }\n  y = 3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/lateBinding4.pcf",
    "content": "v1 {\n  foo {\n    x = 1\n    y = 1\n  }\n}\nv2 {\n  foo {\n    x = 1\n    y = 1\n  }\n  y = 4\n}\nv3 {\n  foo {\n    x = 5\n    y = 5\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/outer.pcf",
    "content": "res1 {\n  x = 1\n  y {\n    z = 1\n  }\n}\nres2 {\n  x = 2\n  y {\n    z = 2\n  }\n}\nres3 {\n  x = 1\n  y {\n    x = 3\n    z = 1\n  }\n}\nres4 {\n  x = 2\n  y {\n    x = 4\n    z = 2\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/outer2.err",
    "content": "–– Pkl Error ––\nCannot find property `y` in object of type `Dynamic`.\n\nx | z = outer.y\n        ^^^^^^^\nat outer2#res1.x.z (file:///$snippetsDir/input/objects/outer2.pkl)\n\nAvailable properties:\ndefault\nx\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/super1.pcf",
    "content": "parent {\n  x = 1\n  y = 2\n}\nchild {\n  x = 4\n  y = 3\n}\ngrandChild {\n  x = 5\n  y = 12\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/super2.pcf",
    "content": "parent {\n  x = 3\n  y = 2\n}\nchild {\n  x = 104\n  y = 3\n}\ngrandChild {\n  x = 105\n  y = 4\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/super3.pcf",
    "content": "parent {\n  x = 3\n  y = 2\n}\nchild {\n  x = 4\n  y = 3\n}\ngrandChild {\n  x = 105\n  y = 4\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/super4.pcf",
    "content": "parent {\n  x = 3\n  y = 2\n}\nchild {\n  x = 104\n  y = 3\n}\ngrandChild {\n  x = 305\n  y = 4\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/super5.pcf",
    "content": "res1 {\n  x = 42\n}\nres2 {\n  x = 43\n}\nres3 {\n  x = 44\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/this1.pcf",
    "content": "foo {\n  bar = 4\n  baz = 3\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/objects/this2.pcf",
    "content": "res1 {\n  x = 42\n}\nres2 {\n  x = 42\n  y = 43\n}\nres3 {\n  x = 42\n  y = 43\n  z = 44\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport1.err",
    "content": "–– Pkl Error ––\nModule URI `package://localhost:0/foo#/bar.pkl` has invalid syntax.\n\nx | res = import(\"package://localhost:0/foo#/bar.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport1.error#res (file:///$snippetsDir/input/packages/badImport1.error.pkl)\n\nInvalid path `/foo`.\n\nA package URI must have its path suffixed by its version (e.g. `package://example.com/my/package@1.0.0`).\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport10.err",
    "content": "–– Pkl Error ––\nModule URI `package://localhost:0/birds@0.5.0::invalidalgo:abc123#/catalog/Bird.pkl` has invalid syntax.\n\nx | res = import(\"package://localhost:0/birds@0.5.0::invalidalgo:abc123#/catalog/Bird.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport10.error#res (file:///$snippetsDir/input/packages/badImport10.error.pkl)\n\nUnrecognized checksum algorithm: `invalidalgo`.\n\nThe only supported checksum algorithm is sha256.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport11.err",
    "content": "–– Pkl Error ––\nModule URI `package://localhost:0/birds@0.5.0::boguschecksumpart#/catalog/Bird.pkl` has invalid syntax.\n\nx | res = import(\"package://localhost:0/birds@0.5.0::boguschecksumpart#/catalog/Bird.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport11.error#res (file:///$snippetsDir/input/packages/badImport11.error.pkl)\n\nInvalid checksum specification: `boguschecksumpart`.\n\nChecksums in package uris must have form `sha256:<checksum>`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport2.err",
    "content": "–– Pkl Error ––\nModule URI `package://localhost:0/foo@notAVersion#/bar.pkl` has invalid syntax.\n\nx | res = import(\"package://localhost:0/foo@notAVersion#/bar.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport2.error#res (file:///$snippetsDir/input/packages/badImport2.error.pkl)\n\n`notAVersion` could not be parsed as a semantic version number.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport3.err",
    "content": "–– Pkl Error ––\nModule URI `package://localhost:0/bar/baz@1.0.0` has invalid syntax.\n\nx | res = import(\"package://localhost:0/bar/baz@1.0.0\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport3.error#res (file:///$snippetsDir/input/packages/badImport3.error.pkl)\n\nExpected URI to contain a fragment.\n\nThe URI must end in `#`, followed by a path string. For example: `package://example.com/my/project@1.0.0#/path/to/file.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport4.err",
    "content": "–– Pkl Error ––\nModule URI `package://localhost:0/birds@0.5.0#catalog/Swallow.pkl` has invalid syntax.\n\nx | res = import(\"package://localhost:0/birds@0.5.0#catalog/Swallow.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport4.error#res (file:///$snippetsDir/input/packages/badImport4.error.pkl)\n\nCannot have a relative fragment path `catalog/Swallow.pkl`.\n\nThe fragment of this URI is interpreted as a path, and it must be absolute (it should start with `/`).\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport6.err",
    "content": "–– Pkl Error ––\nExpected the zip asset for package `package://localhost:0/badPackageZipUrl@1.0.0` to be an HTTPS URI, but got `ftp://wait/a/minute`.\n\nx | import \"package://localhost:0/badPackageZipUrl@1.0.0#/Bug.pkl\"\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport6.error#Bug (file:///$snippetsDir/input/packages/badImport6.error.pkl)\n\nx | res: Bug\n         ^^^\nat badImport6.error (file:///$snippetsDir/input/packages/badImport6.error.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport7.err",
    "content": "–– Pkl Error ––\nReceived invalid dependency metadata for package `package://localhost:0/badMetadataJson@1.0.0` when making request `GET https://localhost:0/badMetadataJson@1.0.0`:\nMalformed JSON: Expected 'r' at 1:2.\n\nOriginal input:\n`this is not json\n`\n\nx | res = import(\"package://localhost:0/badMetadataJson@1.0.0#/Bug.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport7.error#res (file:///$snippetsDir/input/packages/badImport7.error.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport8.err",
    "content": "–– Pkl Error ––\nCannot find dependency named `fruits`, because it was not declared in package `package://localhost:0/badImportsWithinPackage@1.0.0`.\n\nx | res = import(\"@fruits/Foo.pkl\")\n                 ^^^^^^^^^^^^^^^^^\nat badImport8.error#res (package://localhost:0/badImportsWithinPackage@1.0.0#/unknownDependency.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badImport9.err",
    "content": "–– Pkl Error ––\nCannot find module `package://localhost:0/badImportsWithinPackage@1.0.0#/not/a/valid/path.pkl`.\n\nx | res = import(\"not/a/valid/path.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidPath#res (package://localhost:0/badImportsWithinPackage@1.0.0#/invalidPath.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badRead1.err",
    "content": "–– Pkl Error ––\nResource URI `package://localhost:0/foo#/bar.pkl` has invalid syntax.\n\nx | res = read(\"package://localhost:0/foo#/bar.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badRead1.error#res (file:///$snippetsDir/input/packages/badRead1.error.pkl)\n\nInvalid path `/foo`.\n\nA package URI must have its path suffixed by its version (e.g. `package://example.com/my/package@1.0.0`).\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badRead2.err",
    "content": "–– Pkl Error ––\nResource URI `package://localhost:0/foo@notAVersion#/bar.pkl` has invalid syntax.\n\nx | res = read(\"package://localhost:0/foo@notAVersion#/bar.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badRead2.error#res (file:///$snippetsDir/input/packages/badRead2.error.pkl)\n\n`notAVersion` could not be parsed as a semantic version number.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badRead3.err",
    "content": "–– Pkl Error ––\nResource URI `package://localhost:0/bar/baz@1.0.0` has invalid syntax.\n\nx | res = read(\"package://localhost:0/bar/baz@1.0.0\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badRead3.error#res (file:///$snippetsDir/input/packages/badRead3.error.pkl)\n\nExpected URI to contain a fragment.\n\nThe URI must end in `#`, followed by a path string. For example: `package://example.com/my/project@1.0.0#/path/to/file.pkl`.\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badRead4.err",
    "content": "–– Pkl Error ––\nResource URI `package://localhost:0/birds@0.5.0#catalog/Swallow.pkl` has invalid syntax.\n\nx | res = read(\"package://localhost:0/birds@0.5.0#catalog/Swallow.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badRead4.error#res (file:///$snippetsDir/input/packages/badRead4.error.pkl)\n\nCannot have a relative fragment path `catalog/Swallow.pkl`.\n\nThe fragment of this URI is interpreted as a path, and it must be absolute (it should start with `/`).\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badRead8.err",
    "content": "–– Pkl Error ––\nCannot find dependency named `notapackage`, because it was not declared in package `package://localhost:0/badImportsWithinPackage@1.0.0`.\n\nx | res = read(\"@notapackage/Foo.txt\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat unknownDependencyRead#res (package://localhost:0/badImportsWithinPackage@1.0.0#/unknownDependencyRead.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/badRead9.err",
    "content": "–– Pkl Error ––\nI/O error reading resource `package://localhost:0/badImportsWithinPackage@1.0.0#/not/a/valid/path.txt`.\n\nx | res = read(\"not/a/valid/path.txt\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalidPathRead#res (package://localhost:0/badImportsWithinPackage@1.0.0#/invalidPathRead.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/packages1.pcf",
    "content": "examples {\n  [\"basic imports\"] {\n    new {\n      name = \"Pigeon\"\n      favoriteFruit {\n        name = \"Banana\"\n      }\n    }\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple\"\n      }\n    }\n    new {\n      name = \"Ostrich\"\n      favoriteFruit {\n        name = \"Orange\"\n      }\n    }\n  }\n  [\"importing while specifying checksum\"] {\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple\"\n      }\n    }\n  }\n  [\"reads\"] {\n    new {\n      uri = \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\n      text = \"\"\"\n        open module birds.Bird\n        \n        import \"@fruities/Fruit.pkl\"\n        \n        name: String\n        \n        favoriteFruit: Fruit\n        \n        \"\"\"\n      base64 = \"b3BlbiBtb2R1bGUgYmlyZHMuQmlyZAoKaW1wb3J0ICJAZnJ1aXRpZXMvRnJ1aXQucGtsIgoKbmFtZTogU3RyaW5nCgpmYXZvcml0ZUZydWl0OiBGcnVpdAo=\"\n    }\n    new {\n      uri = \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n      text = \"\"\"\n        amends \"../Bird.pkl\"\n        \n        import \"@fruities/catalog/apple.pkl\"\n        \n        name = \"Swallow\"\n        \n        favoriteFruit = apple\n        \n        \"\"\"\n      base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n    }\n    new {\n      uri = \"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n      text = \"\"\"\n        amends \"../Bird.pkl\"\n        \n        name = \"Ostrich\"\n        \n        favoriteFruit {\n          name = \"Orange\"\n        }\n        \n        \"\"\"\n      base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/packages2.pcf",
    "content": "examples {\n  [\"glob import\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n    }\n  }\n  [\"glob import within package\"] {\n    new {\n      [\"catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n    }\n  }\n  [\"glob import transitive dep within package\"] {\n    new {\n      [\"@fruities/catalog/apple.pkl\"] {\n        name = \"Apple\"\n      }\n    }\n  }\n  [\"glob read\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n    }\n  }\n  [\"glob read within package\"] {\n    new {\n      [\"catalog/Ostrich.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"catalog/Swallow.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n    }\n  }\n  [\"glob read transitive dep within package\"] {\n    new {\n      [\"@fruities/catalog/apple.pkl\"] {\n        uri = \"package://localhost:0/fruit@1.0.5#/catalog/apple.pkl\"\n        text = \"\"\"\n          amends \"../Fruit.pkl\"\n          \n          name = \"Apple\"\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9GcnVpdC5wa2wiCgpuYW1lID0gIkFwcGxlIgo=\"\n      }\n    }\n  }\n  [\"glob import while specifying checksum\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0::sha256:b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de#/catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"package://localhost:0/birds@0.5.0::sha256:b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de#/catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/packages/redirects.pcf",
    "content": "examples {\n  [\"permanent redirect is followed\"] {\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple\"\n      }\n    }\n  }\n  [\"temporary redirect is followed\"] {\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple\"\n      }\n    }\n  }\n  [\"double redirect is followed\"] {\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/amendsRequiresParens.err",
    "content": "–– Pkl Error ––\nUnexpected token: `{`.\n\nIf you meant to write an amends expression, wrap the parent in parentheses. Try: `(bar) { ... }`\n\nx | (bar { \"baz\" })\n         ^\nat amendsRequiresParens (file:///$snippetsDir/input/parser/amendsRequiresParens.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/constantStringInterpolation.err",
    "content": "–– Pkl Error ––\nString constant cannot have interpolated values.\n\nx | import \"\\(name).pkl\"\n            ^^\nat constantStringInterpolation (file:///$snippetsDir/input/parser/constantStringInterpolation.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/constraintsTrailingComma.pcf",
    "content": "res1 = 6\nres2 = 6\nres3 = 6\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/invalidCharacter.err",
    "content": "–– Pkl Error ––\nInvalid identifier `^`.\n\nx | foo = 1 ^ 1\n            ^\nat invalidCharacter (file:///$snippetsDir/input/parser/invalidCharacter.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/lineCommentBetween.pcf",
    "content": "foo = 1\ntheComment = \"\"\"\n  doc comment\n  doc continuation\n  \"\"\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/methodTrailingCommas.pcf",
    "content": "moduleMethodA1Call1 = true\nmoduleMethodA1Call2 = true\nmoduleMethodA1Call3 = true\nmoduleMethodA2Call1 = true\nmoduleMethodA2Call2 = true\nmoduleMethodA2Call3 = true\nmoduleMethodA3Call1 = true\nmoduleMethodA3Call2 = true\nmoduleMethodA3Call3 = true\nmoduleMethodB1Call1 = true\nmoduleMethodB1Call2 = true\nmoduleMethodB1Call3 = true\nmoduleMethodB2Call1 = true\nmoduleMethodB2Call2 = true\nmoduleMethodB2Call3 = true\nmoduleMethodB3Call1 = true\nmoduleMethodB3Call2 = true\nmoduleMethodB3Call3 = true\nclassMethodA1Call1 = true\nclassMethodA1Call2 = true\nclassMethodA1Call3 = true\nclassMethodA2Call1 = true\nclassMethodA2Call2 = true\nclassMethodA2Call3 = true\nclassMethodA3Call1 = true\nclassMethodA3Call2 = true\nclassMethodA3Call3 = true\nclassMethodB1Call1 = true\nclassMethodB1Call2 = true\nclassMethodB1Call3 = true\nclassMethodB2Call1 = true\nclassMethodB2Call2 = true\nclassMethodB2Call3 = true\nclassMethodB3Call1 = true\nclassMethodB3Call2 = true\nclassMethodB3Call3 = true\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/newline.pcf",
    "content": "facts {\n  [\"parsed as two expressions because `String<newline>(foo)` is not a syntactically valid constrained type\"] {\n    true\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/spacesBetweenDocComments.err",
    "content": "–– Pkl Error ––\nDangling documentation comment.\n\nDocumentation comments must be attached to modules, classes, typealiases, methods, or properties.\n\nx | /// doc comment continuation\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat spacesBetweenDocComments (file:///$snippetsDir/input/parser/spacesBetweenDocComments.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/spread.pcf",
    "content": "qux {\n  new {\n    bar = 1\n    new {\n      qux = 1\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/trailingCommas.pcf",
    "content": "res1 {\n  [\"hello\"] = \"world\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/typeAnnotationInAmends.err",
    "content": "–– Pkl Error ––\nProperties with type annotations cannot have object bodies.\n\nTo define both a type annotation and an object body, try using assignment instead.\nFor example: `obj: Bird = new { ... }`.\n\nx | bird: Listing<String> {\n                          ^\nat typeAnnotationInAmends (file:///$snippetsDir/input/parser/typeAnnotationInAmends.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/parser/wrongDocComment.err",
    "content": "–– Pkl Error ––\nImports cannot have doc comments, annotations or modifiers.\n\nx | import \"../../input-helper/basic/read/module1.pkl\"\n    ^^^^^^\nat wrongDocComment (file:///$snippetsDir/input/parser/wrongDocComment.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/basic.msgpack.yaml",
    "content": "- 1\n- 'basic.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/basic.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - 'bar'\n  - \n    - 16\n    - 'res2'\n    - ''\n  - \n    - 16\n    - 'res3'\n    - 1\n  - \n    - 16\n    - 'res4'\n    - 2.3\n  - \n    - 16\n    - 'res5'\n    - true\n  - \n    - 16\n    - 'res6'\n    - false\n  - \n    - 16\n    - 'res7'\n    - null"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/classes.msgpack.yaml",
    "content": "- 1\n- 'com.foo.bar.MyModule'\n- 'file:///$snippetsDir/input/pklbinary/classes.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'barnOwl'\n    - \n      - 1\n      - 'com.foo.bar.MyModule#Person'\n      - 'file:///$snippetsDir/input/pklbinary/classes.msgpack.yaml.pkl'\n      - \n        - \n          - 16\n          - 'firstName'\n          - 'Barn Owl'\n        - \n          - 16\n          - 'lastName'\n          - 'Bird'\n        - \n          - 16\n          - 'age'\n          - 38\n  - \n    - 16\n    - 'pigeon'\n    - \n      - 1\n      - 'com.foo.bar.MyModule#Person'\n      - 'file:///$snippetsDir/input/pklbinary/classes.msgpack.yaml.pkl'\n      - \n        - \n          - 16\n          - 'firstName'\n          - 'Pigeon'\n        - \n          - 16\n          - 'lastName'\n          - 'Bird'\n        - \n          - 16\n          - 'age'\n          - 41\n  - \n    - 16\n    - 'personClass'\n    - \n      - 12\n      - 'com.foo.bar.MyModule#Person'\n      - 'file:///$snippetsDir/input/pklbinary/classes.msgpack.yaml.pkl'\n  - \n    - 16\n    - 'personTypeAlias'\n    - \n      - 13\n      - 'com.foo.bar.MyModule#MyPerson'\n      - 'file:///$snippetsDir/input/pklbinary/classes.msgpack.yaml.pkl'"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/datasize.msgpack.yaml",
    "content": "- 1\n- 'datasize.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/datasize.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 8\n      - 1.0\n      - 'b'\n  - \n    - 16\n    - 'res2'\n    - \n      - 8\n      - 2.0\n      - 'kb'\n  - \n    - 16\n    - 'res3'\n    - \n      - 8\n      - 3.0\n      - 'kib'\n  - \n    - 16\n    - 'res4'\n    - \n      - 8\n      - 4.0\n      - 'mb'\n  - \n    - 16\n    - 'res5'\n    - \n      - 8\n      - 5.0\n      - 'mib'\n  - \n    - 16\n    - 'res6'\n    - \n      - 8\n      - 6.0\n      - 'gb'\n  - \n    - 16\n    - 'res7'\n    - \n      - 8\n      - 7.0\n      - 'gib'\n  - \n    - 16\n    - 'res8'\n    - \n      - 8\n      - 8.0\n      - 'tb'\n  - \n    - 16\n    - 'res9'\n    - \n      - 8\n      - 9.0\n      - 'tib'\n  - \n    - 16\n    - 'res10'\n    - \n      - 8\n      - 10.0\n      - 'pb'\n  - \n    - 16\n    - 'res11'\n    - \n      - 8\n      - 11.0\n      - 'pib'"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/duration.msgpack.yaml",
    "content": "- 1\n- 'duration.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/duration.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 7\n      - 1.0\n      - 'ns'\n  - \n    - 16\n    - 'res2'\n    - \n      - 7\n      - 2.0\n      - 'us'\n  - \n    - 16\n    - 'res3'\n    - \n      - 7\n      - 3.0\n      - 'ms'\n  - \n    - 16\n    - 'res4'\n    - \n      - 7\n      - 4.0\n      - 's'\n  - \n    - 16\n    - 'res5'\n    - \n      - 7\n      - 5.0\n      - 'min'\n  - \n    - 16\n    - 'res6'\n    - \n      - 7\n      - 6.0\n      - 'h'\n  - \n    - 16\n    - 'res7'\n    - \n      - 7\n      - 7.0\n      - 'd'"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/intseq.msgpack.yaml",
    "content": "- 1\n- 'intseq.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/intseq.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 10\n      - 1\n      - 3\n      - 1\n  - \n    - 16\n    - 'res2'\n    - \n      - 10\n      - 1\n      - 4\n      - 5"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/list.msgpack.yaml",
    "content": "- 1\n- 'list.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/list.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 4\n      - \n        - 1\n        - 3\n        - 5\n        - 7\n  - \n    - 16\n    - 'res2'\n    - \n      - 5\n      - \n        - 2\n        - 4\n        - 6\n        - 8\n  - \n    - 16\n    - 'res3'\n    - \n      - 4\n      - []\n  - \n    - 16\n    - 'res4'\n    - \n      - 5\n      - []\n  - \n    - 16\n    - 'res5'\n    - \n      - 4\n      - \n        - \n          - 4\n          - \n            - 1\n            - 2\n  - \n    - 16\n    - 'res6'\n    - \n      - 5\n      - \n        - \n          - 5\n          - \n            - 1\n            - 2"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/map.msgpack.yaml",
    "content": "- 1\n- 'map.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/map.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 2\n      - \n        'foo': 1\n        'bar': 2\n  - \n    - 16\n    - 'res2'\n    - \n      - 3\n      - \n        'foo': 1\n        'bar': 2\n  - \n    - 16\n    - 'res3'\n    - \n      - 3\n      - \n        'childMap': \n          - 3\n          - \n            'childFoo': 3\n  - \n    - 16\n    - 'res4'\n    - \n      - 3\n      - \n        ? \n          - 2\n          - \n            'foo': 1\n        : \n          - 3\n          - \n            'bar': 2\n  - \n    - 16\n    - 'res5'\n    - \n      - 3\n      - \n        'foo': \n          - 1\n          - 'Dynamic'\n          - 'pkl:base'\n          - \n            - \n              - 16\n              - 'name'\n              - 'foo'\n        'bar': \n          - 1\n          - 'Dynamic'\n          - 'pkl:base'\n          - \n            - \n              - 16\n              - 'name'\n              - 'foobar'"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/pair.msgpack.yaml",
    "content": "- 1\n- 'pair.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/pair.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 9\n      - 1\n      - 2\n  - \n    - 16\n    - 'res2'\n    - \n      - 9\n      - 'foo'\n      - 'bar'"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/regex.msgpack.yaml",
    "content": "- 1\n- 'regex.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/regex.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 11\n      - 'abc'\n  - \n    - 16\n    - 'res2'\n    - \n      - 11\n      - ''\n  - \n    - 16\n    - 'res3'\n    - \n      - 11\n      - '(?m)^abc$'"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/pklbinary/set.msgpack.yaml",
    "content": "- 1\n- 'set.msgpack.yaml'\n- 'file:///$snippetsDir/input/pklbinary/set.msgpack.yaml.pkl'\n- \n  - \n    - 16\n    - 'res1'\n    - \n      - 6\n      - \n        - 1\n        - 3\n        - 5\n        - 7\n  - \n    - 16\n    - 'res2'\n    - \n      - 6\n      - []\n  - \n    - 16\n    - 'res3'\n    - \n      - 6\n      - \n        - 1\n        - true\n        - ''\n        - null"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badLocalProject/dog.pcf",
    "content": "name = \"Dog\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject1/bug.err",
    "content": "–– Pkl Error ––\nExpected `output.value` of module `file:///$snippetsDir/input/projects/badPklProject1/PklProject` to be of type `pkl.Project`, but got type `invalid.project.Module`.\n\nx | module invalid.project.Module\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat invalid.project.Module (file:///$snippetsDir/input/projects/badPklProject1/PklProject)\n\nTry adding `amends \"pkl:Project\"` to the module header.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject2/bug.err",
    "content": "–– Pkl Error ––\nExpected `output.value` of module `file:///$snippetsDir/input/projects/badPklProject2/PklProject` to be of type `pkl.Project`, but got type `Int`.\n\nx | value = 5\n            ^\nat value (file:///$snippetsDir/input/projects/badPklProject2/PklProject)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badPklProject3/bug.err",
    "content": "–– Pkl Error ––\nExpected value of type `pkl.Project#Package`, but got type `Mapping`.\nValue: new Mapping { [\"foo\"] = ? }\n\nxx | package: Package?\n              ^^^^^^^\nat pkl.Project#package (pkl:Project)\n\nx | package = new Mapping {\n              ^^^^^^^^^^^^^\nat PklProject#package (file:///$snippetsDir/input/projects/badPklProject3/PklProject)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badProjectDeps1/bug.err",
    "content": "–– Pkl Error ––\nCannot resolve dependency because file `file:///$snippetsDir/input/projects/badProjectDeps1/PklProject.deps.json` is malformed.\nRun `pkl project resolve` to re-create this file.\n\nx | import \"@bird/Bird.pkl\"\n           ^^^^^^^^^^^^^^^^\nat bug (file:///$snippetsDir/input/projects/badProjectDeps1/bug.pkl)\n\nDetails: Malformed JSON: Expected 'r' at 1:2.\n\nOriginal input:\n`this is not json\n`\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badProjectDeps2/bug.err",
    "content": "–– Pkl Error ––\nCannot resolve dependency because file `file:///$snippetsDir/input/projects/badProjectDeps2/PklProject.deps.json` is malformed.\nRun `pkl project resolve` to re-create this file.\n\nx | import \"@bird/Bird.pkl\"\n           ^^^^^^^^^^^^^^^^\nat bug (file:///$snippetsDir/input/projects/badProjectDeps2/bug.pkl)\n\nDetails: Failed to parse key `resolvedDependencies`: Failed to parse key `uri`: Package URIs must have an authority component.\n\nFor example, `example.com` in URI `project://example.com/my/package@1.0.0`.: package:/invalidPackageUri..\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badProjectDeps3/bug.err",
    "content": "–– Pkl Error ––\nDid not find a resolved dependency for package `package://localhost:0/birds@0.5.0`.\n\nRun `pkl project resolve` to update resolved dependencies.\n\nx | import \"@bird/Bird.pkl\"\n           ^^^^^^^^^^^^^^^^\nat bug (file:///$snippetsDir/input/projects/badProjectDeps3/bug.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badProjectDeps4/bug.err",
    "content": "–– Pkl Error ––\nExpected value of type `*RemoteDependency | Project(isValidLoadDependency)`, but got a different `pkl.Project`.\nValue: new ModuleClass { package = ?; tests = ?; dependencies { [\"badLocalProject\"] ...\n\nxxx | dependencies: Mapping<String(!contains(\"/\")), *RemoteDependency | Project(isValidLoadDependency)>\n                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.Project#dependencies (pkl:Project)\n\n* Value is not of type `Project(isValidLoadDependency)` because:\n  Type constraint `isValidLoadDependency` violated.\n  Value: new ModuleClass { package = ?; tests = ?; dependencies { [\"badLocalProject\"...\n\n      (it: Project) ->\n      isUriLocal(projectFileUri, it.projectFileUri)\n      │          │               │  │\n      true       │               │  \"file:///$snippetsDir/projects/badProjectDeps4/PklProject\"\n                 │               new ModuleClass { package = ?; tests = ?; dependencies { [\"badLocalProject\"] = ? }; evaluatorSett...\n                 \"file:///$snippetsDir/projects/badProjectDeps4/PklProject\"\n\n        && it.projectFileUri.endsWith(\"/PklProject\")\n        │  │  │              │\n        │  │  │              true\n        │  │  \"file:///$snippetsDir/projects/badProjectDeps4/PklProject\"\n        │  new ModuleClass { package = ?; tests = ?; dependencies { [\"badLocalProject\"] = ? }; evaluatorSett...\n        true\n\n        && it != module\n        │  │  │\n        │  │  false\n        │  new ModuleClass { package = ?; tests = ?; dependencies { [\"badLocalProject\"] = ? }; evaluatorSett...\n        false\n\n        && it.package != null\n        │\n        false\n\nx | [\"badLocalProject\"] = import(\"PklProject\")\n                          ^^^^^^^^^^^^^^^^^^^^\nat PklProject#dependencies[\"badLocalProject\"] (file:///$snippetsDir/input/projects/badProjectDeps4/PklProject)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badProjectDeps5/bug.err",
    "content": "–– Pkl Error ––\nTransitive dependency declared by package `package://localhost:0/birds@0.5.0` is newer than what is declared in `PklProject.deps.json`.\n\nDeclared: `package://localhost:0/fruit@1.0.5`\nResolved: `package://localhost:0/fruit@1.0.0`\n\nRun `pkl project resolve` to update resolved dependencies.\n\nx | import \"@fruities/Fruit.pkl\"\n           ^^^^^^^^^^^^^^^^^^^^^\nat bug#Bird (projectpackage://localhost:0/birds@0.5.0#/Bird.pkl)\n\nx | bird: Bird\n          ^^^^\nat bug (file:///$snippetsDir/input/projects/badProjectDeps5/bug.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/badProjectDeps6/bug.err",
    "content": "–– Pkl Error ––\nProject `file:///$snippetsDir/input/projects/badProjectDeps6/PklProject` declares a dependency on a package that is newer than what is declared in `PklProject.deps.json`.\n\nDeclared: `package://localhost:0/birds@0.8.0`\nResolved: `package://localhost:0/birds@0.5.0`\n\nRun `pkl project resolve` to update resolved dependencies.\n\nx | import \"@birds/Bird.pkl\"\n           ^^^^^^^^^^^^^^^^^\nat bug (file:///$snippetsDir/input/projects/badProjectDeps6/bug.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/compactTraceMode/compactTraceMode.err",
    "content": "examples {\n  [\"traceMode = 'default' results in single-line trace() values\"] {\n    new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings {\n          kicked = true\n          [\"fjordConfig\"] {\n            isPining = true\n          }\n        }\n      }\n    }\n  }\n}\npkl: TRACE: new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    } = new Dynamic { [\"Parrot\"] { name = \"Parrot\"; age = 1234; bucketSettings { kicked = true; [\"fjordConfig\"] { isPining = true } } } } (file:///$snippetsDir/input/projects/compactTraceMode/compactTraceMode.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/evaluatorSettings/basic.pcf",
    "content": "examples {\n  [\"all env vars come from settings\"] {\n    new {\n      [\"env:one\"] = \"1\"\n    }\n  }\n  [\"all props come from settings\"] {\n    new {\n      [\"prop:two\"] = \"2\"\n    }\n  }\n  [\"cannot import modulepath because it is not allowed\"] {\n    \"Refusing to load module `modulepath:/org/pkl/core/stdlib/release.pkl` because it does not match any entry in the module allowlist (`--allowed-modules`).\"\n    \"Refusing to read resource `modulepath:/org/pkl/core/brokenModule1.pkl` because it does not match any entry in the resource allowlist (`--allowed-resources`).\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/evaluatorSettings/nullTraceMode.err",
    "content": "examples {\n  [\"traceMode = null results in single-line trace() values\"] {\n    new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings {\n          kicked = true\n          [\"fjordConfig\"] {\n            isPining = true\n          }\n        }\n      }\n    }\n  }\n}\npkl: TRACE: new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings = new {\n          kicked = true\n          [\"fjordConfig\"] = new {\n            isPining = true\n          }\n        }\n      }\n    } = new Dynamic { [\"Parrot\"] { name = \"Parrot\"; age = 1234; bucketSettings { kicked = true; [\"fjordConfig\"] { isPining = true } } } } (file:///$snippetsDir/input/projects/evaluatorSettings/nullTraceMode.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/missingProjectDeps/bug.err",
    "content": "–– Pkl Error ––\nEncountered an error when attempting to load `PklProject.deps.json` at `file:///$snippetsDir/input/projects/missingProjectDeps/PklProject.deps.json`.\nNoSuchFileException: /$snippetsDir/input/projects/missingProjectDeps/PklProject.deps.json\n\nx | import \"@birds/Bird.pkl\"\n           ^^^^^^^^^^^^^^^^^\nat bug (file:///$snippetsDir/input/projects/missingProjectDeps/bug.pkl)\n\nTry running `pkl project resolve` within the project directory to create a new set of dependencies.\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/notAProject/@child/theChild.pcf",
    "content": "res = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/notAProject/badImport.err",
    "content": "–– Pkl Error ––\nCannot import dependency because there is no project found.\n\nIf you meant to import a path that starts with `@`, prefix the path with `./` (e.g. `import \"./@myPath\").\nIf you meant to import a dependency, ensure that this file is within a directory that contains a PklProject module.\n\nx | res = import(\"@child/theChild.pkl\")\n                 ^^^^^^^^^^^^^^^^^^^^^\nat badImport.error#res (file:///$snippetsDir/input/projects/notAProject/badImport.error.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/notAProject/goodImport.pcf",
    "content": "res {\n  res = 1\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/prettyTraceMode/prettyTraceMode.err",
    "content": "examples {\n  [\"single-line lhs, single-line rhs\"] {\n    \"Parrot\"\n  }\n  [\"single-line lhs, multi-line rhs\"] {\n    new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings {\n          kicked = true\n          [\"fjordConfig\"] {\n            isPining = true\n          }\n        }\n      }\n    }\n  }\n  [\"multi-line lhs, single-line rhs\"] {\n    \"Parrot\"\n  }\n  [\"multi-line lhs, multi-line rhs\"] {\n    new {\n      [\"Parrot\"] {\n        name = \"Parrot\"\n        age = 1234\n        bucketSettings {\n          kicked = true\n          [\"fjordConfig\"] {\n            isPining = true\n          }\n        }\n      }\n    }\n  }\n}\npkl: TRACE: val[\"Parrot\"].name = \"Parrot\"\n(file:///$snippetsDir/input/projects/prettyTraceMode/prettyTraceMode.pkl)\npkl: TRACE: val =\n  new Dynamic {\n    [\"Parrot\"] {\n      name = \"Parrot\"\n      age = 1234\n      bucketSettings {\n        kicked = true\n        [\"fjordConfig\"] {\n          isPining = true\n        }\n      }\n    }\n  }\n(file:///$snippetsDir/input/projects/prettyTraceMode/prettyTraceMode.pkl)\npkl: TRACE: \n  (new Dynamic {\n        [\"Parrot\"] {\n          name = \"Parrot\"\n          age = 1234\n          bucketSettings = new {\n            kicked = true\n            [\"fjordConfig\"] = new {\n              isPining = true\n            }\n          }\n        }\n      })[\"Parrot\"].name\n= \"Parrot\"\n(file:///$snippetsDir/input/projects/prettyTraceMode/prettyTraceMode.pkl)\npkl: TRACE: \n  new {\n        [\"Parrot\"] {\n          name = \"Parrot\"\n          age = 1234\n          bucketSettings = new {\n            kicked = true\n            [\"fjordConfig\"] = new {\n              isPining = true\n            }\n          }\n        }\n      }\n=\n  new Dynamic {\n    [\"Parrot\"] {\n      name = \"Parrot\"\n      age = 1234\n      bucketSettings {\n        kicked = true\n        [\"fjordConfig\"] {\n          isPining = true\n        }\n      }\n    }\n  }\n(file:///$snippetsDir/input/projects/prettyTraceMode/prettyTraceMode.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/badImport1.err",
    "content": "–– Pkl Error ––\nCannot find a dependency named `doesnotexist`, because it is not declared in the current project.\n\nTo fix this, add it to the `dependencies` section of your `PklProject` file, and resolve your dependencies.\n\nx | import \"@doesnotexist/bar/baz.pkl\"\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badImport1.error (file:///$snippetsDir/input/projects/project1/badImport1.error.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/badImport2.err",
    "content": "–– Pkl Error ––\nCannot find a dependency named `fruities`, because it is not declared in the current project.\n\nTo fix this, add it to the `dependencies` section of your `PklProject` file, and resolve your dependencies.\n\nx | import \"@fruities/Fruit.pkl\"\n           ^^^^^^^^^^^^^^^^^^^^^\nat badImport2.error (file:///$snippetsDir/input/projects/project1/badImport2.error.pkl)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/badImport3.err",
    "content": "–– Pkl Error ––\nCannot find dependency named `fruits`, because it was not declared in package `package://localhost:0/badImportsWithinPackage@1.0.0`.\n\nx | res = import(\"@fruits/Foo.pkl\")\n                 ^^^^^^^^^^^^^^^^^\nat badImport3.error#res (projectpackage://localhost:0/badImportsWithinPackage@1.0.0#/unknownDependency.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/badRead1.err",
    "content": "–– Pkl Error ––\nCannot find a dependency named `doesnotexist`, because it is not declared in the current project.\n\nTo fix this, add it to the `dependencies` section of your `PklProject` file, and resolve your dependencies.\n\nx | res = read(\"@doesnotexist/bar/baz.pkl\")\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat badRead1.error#res (file:///$snippetsDir/input/projects/project1/badRead1.error.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/basic.pcf",
    "content": "facts {\n  [\"package-relative dependency is not same import as absolute URI dependency\"] {\n    true\n  }\n  [\"package-relative dependency has scheme projectpackage\"] {\n    true\n  }\n  [\"transitive import resolves to same dependency as direct dependency import\"] {\n    true\n  }\n  [\"transitive import resolves to same dependency as projectpackage import\"] {\n    true\n    true\n  }\n}\nexamples {\n  [\"import package\"] {\n    new {\n      name = \"Ostrich\"\n      favoriteFruit {\n        name = \"Orange\"\n      }\n    }\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple 🍎\"\n      }\n    }\n  }\n  [\"import module that uses triple-dot import\"] {\n    new {\n      name = \"Bird\"\n      favoriteFruit {\n        name = \"Fruit\"\n      }\n    }\n  }\n  [\"reading directories\"] {\n    new {\n      uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog\"\n      text = \"\"\"\n        Ostrich.pkl\n        Swallow.pkl\n        \n        \"\"\"\n      base64 = \"T3N0cmljaC5wa2wKU3dhbGxvdy5wa2wK\"\n    }\n    new {\n      uri = \"projectpackage://localhost:0/birds@0.5.0#/\"\n      text = \"\"\"\n        Bird.pkl\n        allFruit.pkl\n        catalog\n        catalog.pkl\n        some\n        \n        \"\"\"\n      base64 = \"QmlyZC5wa2wKYWxsRnJ1aXQucGtsCmNhdGFsb2cKY2F0YWxvZy5wa2wKc29tZQo=\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/directPackageImport.err",
    "content": "–– Pkl Error ––\nI/O error loading module `projectpackage://localhost:0/birds@0.5.0#/`.\nIOException: Is a directory\n\nx | res = import(\"@birds\")\n          ^^^^^^^^^^^^^^^^\nat directPackageImport.error#res (file:///$snippetsDir/input/projects/project1/directPackageImport.error.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/globbing.pcf",
    "content": "examples {\n  [\"glob-import within package\"] {\n    new {\n      [\"catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple 🍎\"\n        }\n      }\n    }\n  }\n  [\"glob-import absolute package uri\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"] {\n        name = \"Ostrich\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"] {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n    }\n  }\n  [\"glob-import local project\"] {\n    new {\n      [\"@project2/penguin.pkl\"] {\n        bird {\n          name = \"Penguin\"\n          favoriteFruit {\n            name = \"Ice Fruit\"\n          }\n        }\n      }\n    }\n  }\n  [\"glob-import using dependency notation\"] {\n    Set(\"@birds/catalog/Ostrich.pkl\", \"@birds/catalog/Swallow.pkl\")\n    Set(\"@birds/Bird.pkl\", \"@birds/allFruit.pkl\", \"@birds/catalog.pkl\")\n    Set(\"@birds/Bird.pkl\", \"@birds/allFruit.pkl\", \"@birds/catalog.pkl\", \"@birds/catalog/Ostrich.pkl\", \"@birds/catalog/Swallow.pkl\", \"@birds/some/dir/Bird.pkl\")\n  }\n  [\"glob-read using dependency notation\"] {\n    new {\n      [\"@birds/catalog/Ostrich.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"@birds/catalog/Swallow.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n    }\n    new {\n      [\"@birds/Bird.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\"\n        text = \"\"\"\n          open module birds.Bird\n          \n          import \"@fruities/Fruit.pkl\"\n          \n          name: String\n          \n          favoriteFruit: Fruit\n          \n          \"\"\"\n        base64 = \"b3BlbiBtb2R1bGUgYmlyZHMuQmlyZAoKaW1wb3J0ICJAZnJ1aXRpZXMvRnJ1aXQucGtsIgoKbmFtZTogU3RyaW5nCgpmYXZvcml0ZUZydWl0OiBGcnVpdAo=\"\n      }\n      [\"@birds/allFruit.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/allFruit.pkl\"\n        text = \"\"\"\n          module birds.allFruit\n          \n          fruit = import*(\"@fruities/catalog/*.pkl\")\n          fruitFiles = read*(\"@fruities/catalog/*.pkl\")\n          \n          \"\"\"\n        base64 = \"bW9kdWxlIGJpcmRzLmFsbEZydWl0CgpmcnVpdCA9IGltcG9ydCooIkBmcnVpdGllcy9jYXRhbG9nLyoucGtsIikKZnJ1aXRGaWxlcyA9IHJlYWQqKCJAZnJ1aXRpZXMvY2F0YWxvZy8qLnBrbCIpCg==\"\n      }\n      [\"@birds/catalog.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog.pkl\"\n        text = \"\"\"\n          module birds.catalog\n          \n          catalog = import*(\"catalog/*.pkl\")\n          catalogFiles = read*(\"catalog/*.pkl\")\n          \n          \"\"\"\n        base64 = \"bW9kdWxlIGJpcmRzLmNhdGFsb2cKCmNhdGFsb2cgPSBpbXBvcnQqKCJjYXRhbG9nLyoucGtsIikKY2F0YWxvZ0ZpbGVzID0gcmVhZCooImNhdGFsb2cvKi5wa2wiKQo=\"\n      }\n    }\n    new {\n      [\"@birds/Bird.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\"\n        text = \"\"\"\n          open module birds.Bird\n          \n          import \"@fruities/Fruit.pkl\"\n          \n          name: String\n          \n          favoriteFruit: Fruit\n          \n          \"\"\"\n        base64 = \"b3BlbiBtb2R1bGUgYmlyZHMuQmlyZAoKaW1wb3J0ICJAZnJ1aXRpZXMvRnJ1aXQucGtsIgoKbmFtZTogU3RyaW5nCgpmYXZvcml0ZUZydWl0OiBGcnVpdAo=\"\n      }\n      [\"@birds/allFruit.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/allFruit.pkl\"\n        text = \"\"\"\n          module birds.allFruit\n          \n          fruit = import*(\"@fruities/catalog/*.pkl\")\n          fruitFiles = read*(\"@fruities/catalog/*.pkl\")\n          \n          \"\"\"\n        base64 = \"bW9kdWxlIGJpcmRzLmFsbEZydWl0CgpmcnVpdCA9IGltcG9ydCooIkBmcnVpdGllcy9jYXRhbG9nLyoucGtsIikKZnJ1aXRGaWxlcyA9IHJlYWQqKCJAZnJ1aXRpZXMvY2F0YWxvZy8qLnBrbCIpCg==\"\n      }\n      [\"@birds/catalog.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog.pkl\"\n        text = \"\"\"\n          module birds.catalog\n          \n          catalog = import*(\"catalog/*.pkl\")\n          catalogFiles = read*(\"catalog/*.pkl\")\n          \n          \"\"\"\n        base64 = \"bW9kdWxlIGJpcmRzLmNhdGFsb2cKCmNhdGFsb2cgPSBpbXBvcnQqKCJjYXRhbG9nLyoucGtsIikKY2F0YWxvZ0ZpbGVzID0gcmVhZCooImNhdGFsb2cvKi5wa2wiKQo=\"\n      }\n      [\"@birds/catalog/Ostrich.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"@birds/catalog/Swallow.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n      [\"@birds/some/dir/Bird.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/some/dir/Bird.pkl\"\n        text = \"\"\"\n          amends \"...\"\n          \n          name = \"Bird\"\n          \n          favoriteFruit {\n            name = \"Fruit\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi4iCgpuYW1lID0gIkJpcmQiCgpmYXZvcml0ZUZydWl0IHsKICBuYW1lID0gIkZydWl0Igp9Cg==\"\n      }\n    }\n  }\n  [\"glob-read within package\"] {\n    new {\n      [\"catalog/Ostrich.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"catalog/Swallow.pkl\"] {\n        uri = \"projectpackage://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n    }\n  }\n  [\"glob-read absolute package uri\"] {\n    new {\n      [\"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Ostrich.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          name = \"Ostrich\"\n          \n          favoriteFruit {\n            name = \"Orange\"\n          }\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCm5hbWUgPSAiT3N0cmljaCIKCmZhdm9yaXRlRnJ1aXQgewogIG5hbWUgPSAiT3JhbmdlIgp9Cg==\"\n      }\n      [\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"] {\n        uri = \"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"\n        text = \"\"\"\n          amends \"../Bird.pkl\"\n          \n          import \"@fruities/catalog/apple.pkl\"\n          \n          name = \"Swallow\"\n          \n          favoriteFruit = apple\n          \n          \"\"\"\n        base64 = \"YW1lbmRzICIuLi9CaXJkLnBrbCIKCmltcG9ydCAiQGZydWl0aWVzL2NhdGFsb2cvYXBwbGUucGtsIgoKbmFtZSA9ICJTd2FsbG93IgoKZmF2b3JpdGVGcnVpdCA9IGFwcGxlCg==\"\n      }\n    }\n  }\n  [\"glob-import behind local project import\"] {\n    new {\n      children {\n        [\"children/a.pkl\"] {\n          name = \"a\"\n        }\n        [\"children/b.pkl\"] {\n          name = \"b\"\n        }\n        [\"children/c.pkl\"] {\n          name = \"c\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/localProject.pcf",
    "content": "res {\n  bird {\n    name = \"Penguin\"\n    favoriteFruit {\n      name = \"Ice Fruit\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project1/localProjectRead.pcf",
    "content": "res = \"\"\"\n  import \"@burds/Bird.pkl\"\n  \n  bird: Bird = new {\n    name = \"Penguin\"\n    favoriteFruit {\n      name = \"Ice Fruit\"\n    }\n  }\n  \n  \"\"\"\nres2 {\n  [\"@project2/PklProject\"] {\n    uri = \"file:/$snippetsDir/input/projects/project2/PklProject\"\n    text = \"\"\"\n      amends \"pkl:Project\"\n      \n      package {\n        name = \"project2\"\n        baseUri = \"package://localhost:0/project2\"\n        version = \"1.0.0\"\n        packageZipUrl = \"https://localhost:0/project2/project2-\\\\(version).zip\"\n      }\n      \n      dependencies {\n        [\"burds\"] {\n          uri = \"package://localhost:0/birds@0.5.0\"\n        }\n      }\n      \n      \"\"\"\n    base64 = \"YW1lbmRzICJwa2w6UHJvamVjdCIKCnBhY2thZ2UgewogIG5hbWUgPSAicHJvamVjdDIiCiAgYmFzZVVyaSA9ICJwYWNrYWdlOi8vbG9jYWxob3N0OjAvcHJvamVjdDIiCiAgdmVyc2lvbiA9ICIxLjAuMCIKICBwYWNrYWdlWmlwVXJsID0gImh0dHBzOi8vbG9jYWxob3N0OjAvcHJvamVjdDIvcHJvamVjdDItXCh2ZXJzaW9uKS56aXAiCn0KCmRlcGVuZGVuY2llcyB7CiAgWyJidXJkcyJdIHsKICAgIHVyaSA9ICJwYWNrYWdlOi8vbG9jYWxob3N0OjAvYmlyZHNAMC41LjAiCiAgfQp9Cg==\"\n  }\n  [\"@project2/PklProject.deps.json\"] {\n    uri = \"file:/$snippetsDir/input/projects/project2/PklProject.deps.json\"\n    text = \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"$skipChecksumVerification\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n            \"checksums\": {\n              \"sha256\": \"$skipChecksumVerification\"\n            }\n          }\n        }\n      }\n      \n      \"\"\"\n    base64 = \"ewogICJzY2hlbWFWZXJzaW9uIjogMSwKICAicmVzb2x2ZWREZXBlbmRlbmNpZXMiOiB7CiAgICAicGFja2FnZTovL2xvY2FsaG9zdDowL2JpcmRzQDAiOiB7CiAgICAgICJ0eXBlIjogInJlbW90ZSIsCiAgICAgICJ1cmkiOiAicHJvamVjdHBhY2thZ2U6Ly9sb2NhbGhvc3Q6MC9iaXJkc0AwLjUuMCIsCiAgICAgICJjaGVja3N1bXMiOiB7CiAgICAgICAgInNoYTI1NiI6ICIkc2tpcENoZWNrc3VtVmVyaWZpY2F0aW9uIgogICAgICB9CiAgICB9LAogICAgInBhY2thZ2U6Ly9sb2NhbGhvc3Q6MC9mcnVpdEAxIjogewogICAgICAidHlwZSI6ICJyZW1vdGUiLAogICAgICAidXJpIjogInByb2plY3RwYWNrYWdlOi8vbG9jYWxob3N0OjAvZnJ1aXRAMS4xLjAiLAogICAgICAiY2hlY2tzdW1zIjogewogICAgICAgICJzaGEyNTYiOiAiJHNraXBDaGVja3N1bVZlcmlmaWNhdGlvbiIKICAgICAgfQogICAgfQogIH0KfQo=\"\n  }\n  [\"@project2/penguin.pkl\"] {\n    uri = \"file:/$snippetsDir/input/projects/project2/penguin.pkl\"\n    text = \"\"\"\n      import \"@burds/Bird.pkl\"\n      \n      bird: Bird = new {\n        name = \"Penguin\"\n        favoriteFruit {\n          name = \"Ice Fruit\"\n        }\n      }\n      \n      \"\"\"\n    base64 = \"aW1wb3J0ICJAYnVyZHMvQmlyZC5wa2wiCgpiaXJkOiBCaXJkID0gbmV3IHsKICBuYW1lID0gIlBlbmd1aW4iCiAgZmF2b3JpdGVGcnVpdCB7CiAgICBuYW1lID0gIkljZSBGcnVpdCIKICB9Cn0K\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project2/penguin.pcf",
    "content": "bird {\n  name = \"Penguin\"\n  favoriteFruit {\n    name = \"Ice Fruit\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project3/basic.pcf",
    "content": "examples {\n  [\"inherits all the imports of project1\"] {\n    new {\n      name = \"Swallow\"\n      favoriteFruit {\n        name = \"Apple 🍎\"\n      }\n    }\n    new {\n      name = \"Apple 🍎\"\n    }\n    new {\n      bird {\n        name = \"Penguin\"\n        favoriteFruit {\n          name = \"Ice Fruit\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project4/main.pcf",
    "content": "orange {\n  name = \"Orange\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project5/main.pcf",
    "content": "bird {\n  name = \"Finch\"\n  favoriteFruit {\n    name = \"Nuts\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project6/children/a.pcf",
    "content": "name = \"a\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project6/children/b.pcf",
    "content": "name = \"b\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project6/children/c.pcf",
    "content": "name = \"c\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/projects/project6/children.pcf",
    "content": "children {\n  [\"children/a.pkl\"] {\n    name = \"a\"\n  }\n  [\"children/b.pkl\"] {\n    name = \"b\"\n  }\n  [\"children/c.pkl\"] {\n    name = \"c\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/syntax/shebang.pcf",
    "content": "foo = 1\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/ThisInTypeConstraint.pcf",
    "content": "res1 = List(\"one\")\nres2 {\n  [\"one\"] = \"one\"\n}\nres3 = List(Set(\"one\"), Set(\"one\"))\nres4 = List(\"one\")\nres5 {\n  res1 = List(\"one\")\n  res2 {\n    [\"one\"] = \"one\"\n  }\n  res3 = List(List(\"one\"), List(\"one\"))\n}\nres6 = List(Set(\"one\"), Set(\"one\"))\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/currentModuleType1.pcf",
    "content": "result = \"ok\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/currentModuleType2.pcf",
    "content": "result = \"ok\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/currentModuleType3.pcf",
    "content": "result = \"ok\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/cyclicTypeAlias1.err",
    "content": "–– Pkl Error ––\nType alias definitions must not be cyclic.\n\nx | typealias Foo = List<Foo>\n                         ^^^\nat cyclicTypeAlias1#Foo (file:///$snippetsDir/input/types/cyclicTypeAlias1.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/cyclicTypeAlias2.err",
    "content": "–– Pkl Error ––\nType alias definitions must not be cyclic.\n\nx | typealias Baz = Map<String, Foo>\n                                ^^^\nat cyclicTypeAlias2#Baz (file:///$snippetsDir/input/types/cyclicTypeAlias2.pkl)\n\nx | typealias Bar = Set<Baz>\n                        ^^^\nat cyclicTypeAlias2#Bar (file:///$snippetsDir/input/types/cyclicTypeAlias2.pkl)\n\nx | typealias Foo = List<Bar>\n                         ^^^\nat cyclicTypeAlias2#Foo (file:///$snippetsDir/input/types/cyclicTypeAlias2.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/helpers/someModule.pcf",
    "content": "foo = \"foo\"\nbar = 42\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/modifiersForTypes.pcf",
    "content": "res1 = \"Foo\"\nres2 = \"modifiersForTypes#Bar\"\nres3 = Set()\nres4 = Set()\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/moduleType.pcf",
    "content": "res1 {\n  foo = \"foo2\"\n  bar = 42\n}\nres2 = true\nres3 {\n  new {\n    foo = \"foo2\"\n    bar = 42\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/moduleType2.pcf",
    "content": "prop = \"hi\"\nmyself {\n  prop = \"hi again\"\n  myself = null\n  prop2 = 15\n}\nprop2 = 15\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/moduleType3.pcf",
    "content": "bar {\n  prop = \"hi\"\n  myself {\n    prop = \"hi again\"\n    myself = null\n    prop2 = 15\n  }\n  prop2 = 15\n}\nbaz {\n  prop = \"hi\"\n  myself {\n    prop = \"hihihi\"\n    myself = null\n    prop2 = \"hihihihi\"\n  }\n  prop2 = \"hihi\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/moduleType4.pcf",
    "content": "bar {\n  mod {\n    mod = null\n    num = 6\n  }\n  num = 5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/moduleType5.pcf",
    "content": "bar {\n  mod {\n    mod = null\n    num = 5\n  }\n  num = 5\n}\nbaz {\n  mod {\n    mod = null\n    num2 = 5\n  }\n  num2 = 5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/nothingType.err",
    "content": "–– Pkl Error ––\nthrowing a message\n\nx | function throws(): nothing = throw(\"throwing a message\")\n                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat nothingType#throws (file:///$snippetsDir/input/types/nothingType.pkl)\n\nx | myValue: String = throws()\n                      ^^^^^^^^\nat nothingType#myValue (file:///$snippetsDir/input/types/nothingType.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/nothingWithUnions.pcf",
    "content": "x = \"foo\"\ny = \"foo\"\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/typeAlias1.pcf",
    "content": "res1 = \"abc\"\nres1b = \"abc\"\nres2 = List(\"abc\")\nres2b = List(\"abc\")\nres3 = \"abc\"\nres3b = \"abc\"\nres4 = Map(\"abc\", List(\"def\"))\nres4b = Map(\"abc\", List(\"def\"))\nres5 = false\nres5b = false\nres6 = null\nres6b = null\ngood {\n  res7 = \"abc\"\n  res7b = \"abc\"\n  res8 = List(\"abc\")\n  res8b = List(\"abc\")\n  res9 = \"abc\"\n  res9b = \"abc\"\n  res10 = Map(\"abc\", List(\"def\"))\n  res10b = Map(\"abc\", List(\"def\"))\n  res11 = false\n  res11b = false\n  res12 = null\n  res12b = null\n}\nres13 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres13b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres14 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres14b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres15 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres15b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres16 = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres16b = \"Expected value of type `String`, but got type `Int`. Value: 42\"\nres17 = \"Expected value of type `Int|Boolean`, but got type `String`. Value: \\\"foo\\\"\"\nres17b = \"Expected value of type `Int|Boolean`, but got type `String`. Value: \\\"foo\\\"\"\nres18 = \"Expected value of type `Duration`, but got type `DataSize`. Value: 5.mb\"\nres18b = \"Expected value of type `Duration`, but got type `DataSize`. Value: 5.mb\"\nres19 = \"abc\"\nres20 = Pair(Map(\"abc\", List(\"def\")), Map(\"abc\", List(\"def\")))\nres21 {\n  \"John Birdo\"\n}\nres22 = Pair(new {\n  \"John Birdo\"\n}, 0)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/typeAlias2.pcf",
    "content": "res1 = List(1, 2, 3)\nres2 = List(List(\"Pigeon\"), List(\"Barn Owl\"))\nres3 = Map(42, \"Pigeon\", 21, \"Barn Owl\")\nres4 = Map(\"Pigeon\", 3.min, \"Barn Owl\", 5.s)\nres5 = Map(null, new {\n  name = \"Pigeon\"\n}, new {\n  name = \"Barn Owl\"\n}, null)\nres6 {\n  name = \"Other\"\n}\nres7 = 42\nres8 {\n  foo = 5\n  bar = 5\n}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/typeAliasConstraint1.pcf",
    "content": "res1 = \"a\"\nres2 = List(\"a\", \"b\")\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/typeAliasConstraint2.pcf",
    "content": "foo = 1\nbar {}\nqux {}\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/typeAliasContext.err",
    "content": "–– Pkl Error ––\nType constraint `endsWith(lastName)` violated.\nValue: \"Jimmy Bird\"\n\n    endsWith(lastName)\n    │        │\n    false    \"Birdo\"\n\nx | typealias Birds = Listing<String(endsWith(lastName))>\n                                     ^^^^^^^^^^^^^^^^^^\nat typeAliasContext#res (file:///$snippetsDir/input/types/helpers/originalTypealias.pkl)\n\nx | res: originalTypealias.Birds = new { \"Jimmy Bird\" }\n                                         ^^^^^^^^^^^^\nat typeAliasContext#res[#1] (file:///$snippetsDir/input/types/typeAliasContext.pkl)\n\nxxx | renderer.renderDocument(value)\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nat pkl.base#Module.output.text (pkl:base)\n\nxxx | if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n                                                                         ^^^^\nat pkl.base#Module.output.bytes (pkl:base)\n"
  },
  {
    "path": "pkl-core/src/test/files/LanguageSnippetTests/output/types/typeAliasUnion.pcf",
    "content": "bar = \"bar\"\nbar2 = \"bar\"\nbaz = \"baz\"\nb = \"b\"\nc = \"c\"\nd {\n  name = \"foo\"\n}\ne {\n  name = \"foo\"\n}\nf {\n  name = \"baz\"\n}\ng {\n  name = \"baz\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/AnalyzerTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.writeString\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.project.Project\n\nclass AnalyzerTest {\n  private val simpleAnalyzer =\n    Analyzer(\n      StackFrameTransformers.defaultTransformer,\n      false,\n      SecurityManagers.defaultManager,\n      listOf(ModuleKeyFactories.file, ModuleKeyFactories.standardLibrary, ModuleKeyFactories.pkg),\n      null,\n      null,\n      HttpClient.dummyClient(),\n      TraceMode.COMPACT,\n    )\n\n  @Test\n  fun `simple case`(@TempDir tempDir: Path) {\n    val file =\n      tempDir\n        .resolve(\"test.pkl\")\n        .writeString(\n          \"\"\"\n            amends \"pkl:base\"\n\n            import \"pkl:json\"\n\n            myProp = import(\"pkl:xml\")\n          \"\"\"\n            .trimIndent()\n        )\n        .toUri()\n    val result = simpleAnalyzer.importGraph(file)\n    assertThat(result.imports)\n      .containsEntry(\n        file,\n        setOf(\n          ImportGraph.Import(URI(\"pkl:base\")),\n          ImportGraph.Import(URI(\"pkl:json\")),\n          ImportGraph.Import(URI(\"pkl:xml\")),\n        ),\n      )\n  }\n\n  @Test\n  fun `glob imports`(@TempDir tempDir: Path) {\n    val file1 =\n      tempDir\n        .resolve(\"file1.pkl\")\n        .writeString(\n          \"\"\"\n            import* \"*.pkl\"\n          \"\"\"\n            .trimIndent()\n        )\n        .toUri()\n    val file2 = tempDir.resolve(\"file2.pkl\").writeString(\"foo = 1\").toUri()\n    val file3 = tempDir.resolve(\"file3.pkl\").writeString(\"bar = 1\").toUri()\n    val result = simpleAnalyzer.importGraph(file1)\n    assertThat(result.imports)\n      .isEqualTo(\n        mapOf(\n          file1 to\n            setOf(ImportGraph.Import(file1), ImportGraph.Import(file2), ImportGraph.Import(file3)),\n          file2 to emptySet(),\n          file3 to emptySet(),\n        )\n      )\n  }\n\n  @Test\n  fun `cyclical imports`(@TempDir tempDir: Path) {\n    val file1 = tempDir.resolve(\"file1.pkl\").writeString(\"import \\\"file2.pkl\\\"\").toUri()\n    val file2 = tempDir.resolve(\"file2.pkl\").writeString(\"import \\\"file1.pkl\\\"\").toUri()\n    val result = simpleAnalyzer.importGraph(file1)\n    assertThat(result.imports)\n      .isEqualTo(\n        mapOf(file1 to setOf(ImportGraph.Import(file2)), file2 to setOf(ImportGraph.Import(file1)))\n      )\n  }\n\n  @Test\n  fun `package imports`(@TempDir tempDir: Path) {\n    val analyzer =\n      Analyzer(\n        StackFrameTransformers.defaultTransformer,\n        false,\n        SecurityManagers.defaultManager,\n        listOf(ModuleKeyFactories.file, ModuleKeyFactories.standardLibrary, ModuleKeyFactories.pkg),\n        tempDir.resolve(\"packages\"),\n        null,\n        HttpClient.dummyClient(),\n        TraceMode.COMPACT,\n      )\n    PackageServer.populateCacheDir(tempDir.resolve(\"packages\"))\n    val file1 =\n      tempDir\n        .resolve(\"file1.pkl\")\n        .writeString(\"import \\\"package://localhost:0/birds@0.5.0#/Bird.pkl\\\"\")\n        .toUri()\n    val result = analyzer.importGraph(file1)\n    assertThat(result.imports)\n      .isEqualTo(\n        mapOf(\n          file1 to setOf(ImportGraph.Import(URI(\"package://localhost:0/birds@0.5.0#/Bird.pkl\"))),\n          URI(\"package://localhost:0/birds@0.5.0#/Bird.pkl\") to\n            setOf(ImportGraph.Import(URI(\"package://localhost:0/fruit@1.0.5#/Fruit.pkl\"))),\n          URI(\"package://localhost:0/fruit@1.0.5#/Fruit.pkl\") to emptySet(),\n        )\n      )\n  }\n\n  @Test\n  fun `project dependency imports`(@TempDir tempDir: Path) {\n    tempDir\n      .resolve(\"PklProject\")\n      .writeString(\n        \"\"\"\n          amends \"pkl:Project\"\n\n          dependencies {\n            [\"birds\"] { uri = \"package://localhost:0/birds@0.5.0\" }\n          }\n        \"\"\"\n          .trimIndent()\n      )\n    tempDir\n      .resolve(\"PklProject.deps.json\")\n      .writeString(\n        \"\"\"\n          {\n            \"schemaVersion\": 1,\n            \"resolvedDependencies\": {\n              \"package://localhost:0/birds@0\": {\n                \"type\": \"remote\",\n                \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n                \"checksums\": {\n                  \"sha256\": \"${'$'}skipChecksumVerification\"\n                }\n              },\n              \"package://localhost:0/fruit@1\": {\n                \"type\": \"remote\",\n                \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n                \"checksums\": {\n                  \"sha256\": \"${'$'}skipChecksumVerification\"\n                }\n              }\n            }\n          }\n        \"\"\"\n          .trimIndent()\n      )\n    val project = Project.loadFromPath(tempDir.resolve(\"PklProject\"))\n    PackageServer.populateCacheDir(tempDir.resolve(\"packages\"))\n    val analyzer =\n      Analyzer(\n        StackFrameTransformers.defaultTransformer,\n        false,\n        SecurityManagers.defaultManager,\n        listOf(\n          ModuleKeyFactories.file,\n          ModuleKeyFactories.standardLibrary,\n          ModuleKeyFactories.pkg,\n          ModuleKeyFactories.projectpackage,\n        ),\n        tempDir.resolve(\"packages\"),\n        project.dependencies,\n        HttpClient.dummyClient(),\n        TraceMode.COMPACT,\n      )\n    val file1 =\n      tempDir\n        .resolve(\"file1.pkl\")\n        .writeString(\n          \"\"\"\n            import \"@birds/Bird.pkl\"\n          \"\"\"\n            .trimIndent()\n        )\n        .toUri()\n    val result = analyzer.importGraph(file1)\n    assertThat(result.imports)\n      .isEqualTo(\n        mapOf(\n          file1 to\n            setOf(ImportGraph.Import(URI(\"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\"))),\n          URI(\"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\") to\n            setOf(ImportGraph.Import(URI(\"projectpackage://localhost:0/fruit@1.0.5#/Fruit.pkl\"))),\n          URI(\"projectpackage://localhost:0/fruit@1.0.5#/Fruit.pkl\") to emptySet(),\n        )\n      )\n    assertThat(result.resolvedImports)\n      .isEqualTo(\n        mapOf(\n          file1 to file1.realPath(),\n          URI(\"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\") to\n            URI(\"projectpackage://localhost:0/birds@0.5.0#/Bird.pkl\"),\n          URI(\"projectpackage://localhost:0/fruit@1.0.5#/Fruit.pkl\") to\n            URI(\"projectpackage://localhost:0/fruit@1.0.5#/Fruit.pkl\"),\n        )\n      )\n  }\n\n  @Test\n  fun `local project dependency import`(@TempDir tempDir: Path) {\n    val pklProject =\n      tempDir\n        .resolve(\"project1/PklProject\")\n        .createParentDirectories()\n        .writeString(\n          \"\"\"\n            amends \"pkl:Project\"\n\n            dependencies {\n              [\"birds\"] = import(\"../birds/PklProject\")\n            }\n          \"\"\"\n            .trimIndent()\n        )\n\n    tempDir\n      .resolve(\"birds/PklProject\")\n      .createParentDirectories()\n      .writeString(\n        \"\"\"\n          amends \"pkl:Project\"\n\n          package {\n            name = \"birds\"\n            version = \"1.0.0\"\n            packageZipUrl = \"https://localhost:0/foo.zip\"\n            baseUri = \"package://localhost:0/birds\"\n          }\n        \"\"\"\n          .trimIndent()\n      )\n\n    val birdModule = tempDir.resolve(\"birds/bird.pkl\").writeString(\"name = \\\"Warbler\\\"\")\n\n    pklProject.parent\n      .resolve(\"PklProject.deps.json\")\n      .writeString(\n        \"\"\"\n          {\n            \"schemaVersion\": 1,\n            \"resolvedDependencies\": {\n              \"package://localhost:0/birds@1\": {\n                \"type\": \"local\",\n                \"uri\": \"projectpackage://localhost:0/birds@1.0.0\",\n                \"path\": \"../birds\"\n              }\n            }\n          }\n        \"\"\"\n          .trimIndent()\n      )\n    val mainPkl =\n      pklProject.parent\n        .resolve(\"main.pkl\")\n        .writeString(\n          \"\"\"\n            import \"@birds/bird.pkl\"\n          \"\"\"\n            .trimIndent()\n        )\n\n    val project = Project.loadFromPath(pklProject)\n    val analyzer =\n      Analyzer(\n        StackFrameTransformers.defaultTransformer,\n        false,\n        SecurityManagers.defaultManager,\n        listOf(\n          ModuleKeyFactories.file,\n          ModuleKeyFactories.standardLibrary,\n          ModuleKeyFactories.pkg,\n          ModuleKeyFactories.projectpackage,\n        ),\n        tempDir.resolve(\"packages\"),\n        project.dependencies,\n        HttpClient.dummyClient(),\n        TraceMode.COMPACT,\n      )\n    val result = analyzer.importGraph(mainPkl.toUri())\n    val birdUri = URI(\"projectpackage://localhost:0/birds@1.0.0#/bird.pkl\")\n    assertThat(result.imports)\n      .isEqualTo(\n        mapOf(mainPkl.toUri() to setOf(ImportGraph.Import(birdUri)), birdUri to emptySet())\n      )\n    assertThat(result.resolvedImports)\n      .isEqualTo(\n        mapOf(\n          mainPkl.toUri() to mainPkl.toRealPath().toUri(),\n          birdUri to birdModule.toRealPath().toUri(),\n        )\n      )\n  }\n\n  private fun URI.realPath() = Path.of(this).toRealPath().toUri()\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/ClassInheritanceTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass ClassInheritanceTest {\n  private val evaluator = Evaluator.preconfigured()\n\n  @Test\n  fun `property override without type annotation is considered an object property definition`() {\n    val module =\n      evaluator.evaluateSchema(\n        ModuleSource.text(\n          \"\"\"\n        class Thing\n        open class Base {\n          hidden thing: Thing\n        }\n        class Derived extends Base {\n          thing {}\n        }\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    val derivedClass = module.classes[\"Derived\"]!!\n    assertThat(derivedClass.properties[\"thing\"]).isNull()\n    val thingProperty = derivedClass.allProperties[\"thing\"]\n    assertThat(thingProperty).isNotNull\n    assertThat(thingProperty!!.isHidden).isTrue\n    assertThat(thingProperty.type).isInstanceOf(PType.Class::class.java)\n    assertThat((thingProperty.type as PType.Class).pClass).isSameAs(module.classes[\"Thing\"])\n  }\n\n  @Test\n  fun `property override with type annotation is considered a class property definition`() {\n    val module =\n      evaluator.evaluateSchema(\n        ModuleSource.text(\n          \"\"\"\n        class Thing\n        open class Base {\n          hidden thing: Thing\n        }\n        class Derived extends Base {\n          thing: Thing = new {}\n        }\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    val derivedClass = module.classes[\"Derived\"]!!\n    val thingProperty = derivedClass.properties[\"thing\"]\n    assertThat(thingProperty).isNotNull\n    assertThat(thingProperty!!.isHidden).isFalse\n    assertThat(thingProperty.type).isInstanceOf(PType.Class::class.java)\n    assertThat((thingProperty.type as PType.Class).pClass).isSameAs(module.classes[\"Thing\"])\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/DataSizeTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.DataSizeUnit.*\n\nclass DataSizeTest {\n  private val size1 = DataSize(0.3, KILOBYTES)\n  private val size2 = DataSize(300.0, BYTES)\n  private val size3 = DataSize(300.1, BYTES)\n  private val size4 = DataSize(0.0, PEBIBYTES)\n\n  @Test\n  fun `of()`() {\n    assertThat(DataSize.ofBytes(33.0)).isEqualTo(DataSize(33.0, BYTES))\n    assertThat(DataSize.ofKilobytes(33.0)).isEqualTo(DataSize(33.0, KILOBYTES))\n    assertThat(DataSize.ofKibibytes(33.0)).isEqualTo(DataSize(33.0, KIBIBYTES))\n    assertThat(DataSize.ofMegabytes(33.0)).isEqualTo(DataSize(33.0, MEGABYTES))\n    assertThat(DataSize.ofMebibytes(33.0)).isEqualTo(DataSize(33.0, MEBIBYTES))\n    assertThat(DataSize.ofGigabytes(33.0)).isEqualTo(DataSize(33.0, GIGABYTES))\n    assertThat(DataSize.ofGibibytes(33.0)).isEqualTo(DataSize(33.0, GIBIBYTES))\n    assertThat(DataSize.ofTerabytes(33.0)).isEqualTo(DataSize(33.0, TERABYTES))\n    assertThat(DataSize.ofTebibytes(33.0)).isEqualTo(DataSize(33.0, TEBIBYTES))\n    assertThat(DataSize.ofPetabytes(33.0)).isEqualTo(DataSize(33.0, PETABYTES))\n    assertThat(DataSize.ofPebibytes(33.0)).isEqualTo(DataSize(33.0, PEBIBYTES))\n  }\n\n  @Test\n  fun `in()`() {\n    assertThat(size1.inBytes()).isEqualTo(300.0)\n    assertThat(size1.inKilobytes()).isEqualTo(0.3)\n    assertThat(size1.inMegabytes()).isEqualTo(0.0003)\n    assertThat(size1.inGigabytes()).isEqualTo(0.0000003)\n    assertThat(size1.inTerabytes()).isEqualTo(0.0000000003)\n    assertThat(size1.inPetabytes()).isEqualTo(0.0000000000003)\n\n    assertThat(DataSize.ofBytes(1024.0).inKibibytes()).isEqualTo(1.0)\n    assertThat(DataSize.ofKibibytes(1024.0).inMebibytes()).isEqualTo(1.0)\n    assertThat(DataSize.ofMebibytes(1024.0).inGibibytes()).isEqualTo(1.0)\n    assertThat(DataSize.ofGibibytes(1024.0).inTebibytes()).isEqualTo(1.0)\n    assertThat(DataSize.ofTebibytes(1024.0).inPebibytes()).isEqualTo(1.0)\n  }\n\n  @Test\n  fun `inWhole()`() {\n    assertThat(DataSize.ofBytes(123.4).inWholeBytes()).isEqualTo(123)\n    assertThat(DataSize.ofBytes(1000.0).inWholeKilobytes()).isEqualTo(1)\n    assertThat(DataSize.ofKilobytes(999.0).inWholeMegabytes()).isEqualTo(1)\n    assertThat(DataSize.ofMegabytes(1001.0).inWholeGigabytes()).isEqualTo(1)\n    assertThat(DataSize.ofGigabytes(2000.0).inWholeTerabytes()).isEqualTo(2)\n    assertThat(DataSize.ofTerabytes(1600.0).inWholePetabytes()).isEqualTo(2)\n\n    assertThat(DataSize.ofBytes(1023.0).inWholeKibibytes()).isEqualTo(1)\n    assertThat(DataSize.ofKibibytes(1024.0).inWholeMebibytes()).isEqualTo(1)\n    assertThat(DataSize.ofMebibytes(1025.0).inWholeGibibytes()).isEqualTo(1)\n    assertThat(DataSize.ofGibibytes(2000.0).inWholeTebibytes()).isEqualTo(2)\n    assertThat(DataSize.ofTebibytes(1600.0).inWholePebibytes()).isEqualTo(2)\n  }\n\n  @Test\n  fun `destructure()`() {\n    assertThat(size1.value).isEqualTo(0.3)\n    assertThat(size1.unit).isEqualTo(KILOBYTES)\n\n    assertThat(size2.value).isEqualTo(300.0)\n    assertThat(size2.unit).isEqualTo(BYTES)\n\n    assertThat(size3.value).isEqualTo(300.1)\n    assertThat(size3.unit).isEqualTo(BYTES)\n\n    assertThat(size4.value).isEqualTo(0.0)\n    assertThat(size4.unit).isEqualTo(PEBIBYTES)\n  }\n\n  @Test\n  fun `convertTo()`() {\n    assertThat(size1.convertTo(KILOBYTES)).isEqualTo(size1)\n    assertThat(size1.convertTo(BYTES)).isEqualTo(size2)\n    assertThat(size2.convertTo(KILOBYTES)).isEqualTo(size1)\n    assertThat(size4.convertTo(PETABYTES)).isEqualTo(DataSize(0.0, KIBIBYTES))\n  }\n\n  @Test\n  fun `convertValueTo()`() {\n    assertThat(size1.convertValueTo(KILOBYTES)).isEqualTo(size1.value)\n    assertThat(size1.convertValueTo(BYTES)).isEqualTo(size2.value)\n    assertThat(size2.convertValueTo(KILOBYTES)).isEqualTo(size1.value)\n    assertThat(size4.convertValueTo(PETABYTES)).isEqualTo(0.0)\n  }\n\n  @Test\n  fun `equals()`() {\n    assertThat(size1).isEqualTo(size1)\n    assertThat(size1).isEqualTo(size2)\n    assertThat(size2).isEqualTo(size1)\n\n    assertThat(size3).isNotEqualTo(size1)\n    assertThat(size2).isNotEqualTo(size3)\n  }\n\n  @Test\n  fun `hashCode()`() {\n    assertThat(size1.hashCode()).isEqualTo(size1.hashCode())\n    assertThat(size2.hashCode()).isEqualTo(size1.hashCode())\n    assertThat(size1.hashCode()).isEqualTo(size2.hashCode())\n\n    assertThat(size3.hashCode()).isNotEqualTo(size1.hashCode())\n    assertThat(size2.hashCode()).isNotEqualTo(size3.hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/DataSizeUnitTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass DataSizeUnitTest {\n  @Test\n  fun destructure() {\n    val bytes = DataSizeUnit.BYTES\n    assertThat(bytes.bytes).isEqualTo(1)\n    assertThat(bytes.symbol).isEqualTo(\"b\")\n\n    val mebibytes = DataSizeUnit.MEBIBYTES\n    assertThat(mebibytes.bytes).isEqualTo(1024L * 1024)\n    assertThat(mebibytes.symbol).isEqualTo(\"mib\")\n  }\n\n  @Test\n  fun `toString()`() {\n    assertThat(DataSizeUnit.BYTES.toString()).isEqualTo(\"b\")\n    assertThat(DataSizeUnit.MEBIBYTES.toString()).isEqualTo(\"mib\")\n  }\n\n  @Test\n  fun parse() {\n    assertThat(DataSizeUnit.parse(\"gb\")).isEqualTo(DataSizeUnit.GIGABYTES)\n    assertThat(DataSizeUnit.parse(\"other\")).isNull()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/DurationTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport kotlin.math.nextDown\nimport kotlin.math.nextUp\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.DurationUnit.*\n\nclass DurationTest {\n  private val duration1 = Duration(0.3, SECONDS)\n  private val duration2 = Duration(300.0, MILLIS)\n  private val duration3 = Duration(300.1, MILLIS)\n  private val duration4 = Duration(0.0, DAYS)\n\n  @Test\n  fun `of()`() {\n    assertThat(Duration.ofNanos(33.0)).isEqualTo(Duration(33.0, NANOS))\n    assertThat(Duration.ofMicros(33.0)).isEqualTo(Duration(33.0, MICROS))\n    assertThat(Duration.ofMillis(33.0)).isEqualTo(Duration(33.0, MILLIS))\n    assertThat(Duration.ofSeconds(33.0)).isEqualTo(Duration(33.0, SECONDS))\n    assertThat(Duration.ofMinutes(33.0)).isEqualTo(Duration(33.0, MINUTES))\n    assertThat(Duration.ofHours(33.0)).isEqualTo(Duration(33.0, HOURS))\n    assertThat(Duration.ofDays(33.0)).isEqualTo(Duration(33.0, DAYS))\n  }\n\n  @Test\n  fun `in()`() {\n    val d = Duration.ofNanos(123456789.0)\n    assertThat(d.inNanos()).isEqualTo(123456789.0)\n    assertThat(d.inMicros()).isEqualTo(123456.789)\n    assertThat(d.inMillis()).isEqualTo(123.456789)\n    assertThat(d.inSeconds()).isEqualTo(0.123456789)\n    assertThat(d.inMinutes()).isEqualTo(0.00205761315)\n    assertThat(d.inHours()).isEqualTo(3.42935525E-5)\n    assertThat(d.inDays()).isEqualTo(1.4288980208333333E-6)\n  }\n\n  @Test\n  fun `inWhole()`() {\n    assertThat(Duration.ofNanos(1.23).inWholeNanos()).isEqualTo(1)\n    assertThat(Duration.ofMicros(1.87).inWholeMicros()).isEqualTo(2)\n    assertThat(Duration.ofMillis(1923.4).inWholeMillis()).isEqualTo(1923)\n    assertThat(Duration.ofSeconds(1234.5).inWholeSeconds()).isEqualTo(1235)\n    assertThat(Duration.ofMinutes(987.6).inWholeMinutes()).isEqualTo(988)\n    assertThat(Duration.ofHours(456.7).inWholeHours()).isEqualTo(457)\n    assertThat(Duration.ofDays(543.2).inWholeDays()).isEqualTo(543)\n  }\n\n  @Test\n  fun `destructure()`() {\n    assertThat(duration1.value).isEqualTo(0.3)\n    assertThat(duration1.unit).isEqualTo(SECONDS)\n\n    assertThat(duration2.value).isEqualTo(300.0)\n    assertThat(duration2.unit).isEqualTo(MILLIS)\n\n    assertThat(duration3.value).isEqualTo(300.1)\n    assertThat(duration3.unit).isEqualTo(MILLIS)\n\n    assertThat(duration4.value).isEqualTo(0.0)\n    assertThat(duration4.unit).isEqualTo(DAYS)\n  }\n\n  @Test\n  fun `convertTo()`() {\n    assertThat(duration1.convertTo(SECONDS)).isEqualTo(duration1)\n    assertThat(duration1.convertTo(MILLIS)).isEqualTo(duration2)\n    assertThat(duration2.convertTo(SECONDS)).isEqualTo(duration1)\n\n    assertThat(duration4.convertTo(NANOS)).isEqualTo(Duration(0.0, NANOS))\n  }\n\n  @Test\n  fun toIsoString() {\n    assertThat(duration1.toIsoString()).isEqualTo(\"PT0.3S\")\n    assertThat(duration2.toIsoString()).isEqualTo(\"PT0.3S\")\n    assertThat(duration3.toIsoString()).isEqualTo(\"PT0.3001S\")\n    assertThat(duration4.toIsoString()).isEqualTo(\"PT0S\")\n    assertThat(Duration(1.0, NANOS).toIsoString()).isEqualTo(\"PT0.000000001S\")\n    // Although ISO8601 allows for durations (P) denoted in days, months and years, it is not\n    // recommended.\n    // The day notation can express an hour more or less, depending on whether it crosses a daylight\n    // savings transition,\n    // when added to \"now\" (at the time of evaluation).\n    assertThat(Duration(100.0, DAYS).toIsoString()).isEqualTo(\"PT2400H\")\n  }\n\n  @Test\n  fun `convertValueTo()`() {\n    assertThat(duration1.convertValueTo(SECONDS)).isEqualTo(duration1.value)\n    assertThat(duration1.convertValueTo(MILLIS)).isEqualTo(duration2.value)\n    assertThat(duration2.convertValueTo(SECONDS)).isEqualTo(duration1.value)\n    assertThat(duration4.convertValueTo(NANOS)).isEqualTo(0.0)\n  }\n\n  @Test\n  fun `toJavaDuration() - positive`() {\n    assertThat(Duration(999.0, NANOS).toJavaDuration()).isEqualTo(java.time.Duration.ofNanos(999))\n    assertThat(Duration(999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(999999))\n    assertThat(Duration(999999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(999999999))\n    assertThat(Duration(999999999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(999999999999))\n    assertThat(Duration(999999999999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(999999999999999))\n    @Suppress(\"FloatingPointLiteralPrecision\")\n    assertThat(Duration(9999999999999999.0, NANOS).toJavaDuration())\n      .isNotEqualTo(java.time.Duration.ofNanos(9999999999999999))\n\n    assertThat(Duration(999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(999))\n    assertThat(Duration(999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(999999))\n    assertThat(Duration(999999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(999999999))\n    assertThat(Duration(999999999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(999999999999))\n    assertThat(Duration(999999999999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(999999999999999))\n    @Suppress(\"FloatingPointLiteralPrecision\")\n    assertThat(Duration(9999999999999999.0, SECONDS).toJavaDuration())\n      .isNotEqualTo(java.time.Duration.ofSeconds(9999999999999999))\n\n    assertThat(Duration(999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(999))\n    assertThat(Duration(999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(999999))\n    assertThat(Duration(999999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(999999999))\n    assertThat(Duration(999999999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(999999999999))\n    assertThat(Duration(999999999999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(999999999999999))\n    @Suppress(\"FloatingPointLiteralPrecision\")\n    assertThat(Duration(9999999999999999.0, MINUTES).toJavaDuration())\n      .isNotEqualTo(java.time.Duration.ofMinutes(9999999999999999))\n\n    assertThat(Duration(999.0, HOURS).toJavaDuration()).isEqualTo(java.time.Duration.ofHours(999))\n    assertThat(Duration(999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(999999))\n    assertThat(Duration(999999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(999999999))\n    assertThat(Duration(999999999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(999999999999))\n    assertThat(Duration(999999999999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(999999999999999))\n    assertThrows<ArithmeticException> {\n      @Suppress(\"FloatingPointLiteralPrecision\")\n      Duration(9999999999999999.0, HOURS).toJavaDuration()\n    }\n\n    assertThat(Duration(999.0, DAYS).toJavaDuration()).isEqualTo(java.time.Duration.ofDays(999))\n    assertThat(Duration(999999.0, DAYS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofDays(999999))\n    assertThat(Duration(999999999.0, DAYS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofDays(999999999))\n    assertThat(Duration(999999999999.0, DAYS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofDays(999999999999))\n    assertThrows<ArithmeticException> { Duration(999999999999999.0, DAYS).toJavaDuration() }\n  }\n\n  @Test\n  fun `toJavaDuration() - negative`() {\n    assertThat(Duration(-999.0, NANOS).toJavaDuration()).isEqualTo(java.time.Duration.ofNanos(-999))\n    assertThat(Duration(-999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(-999999))\n    assertThat(Duration(-999999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(-999999999))\n    assertThat(Duration(-999999999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(-999999999999))\n    assertThat(Duration(-999999999999999.0, NANOS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofNanos(-999999999999999))\n    @Suppress(\"FloatingPointLiteralPrecision\")\n    assertThat(Duration(-9999999999999999.0, NANOS).toJavaDuration())\n      .isNotEqualTo(java.time.Duration.ofNanos(-9999999999999999))\n\n    assertThat(Duration(-999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(-999))\n    assertThat(Duration(-999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(-999999))\n    assertThat(Duration(-999999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(-999999999))\n    assertThat(Duration(-999999999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(-999999999999))\n    assertThat(Duration(-999999999999999.0, SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(-999999999999999))\n    @Suppress(\"FloatingPointLiteralPrecision\")\n    assertThat(Duration(-9999999999999999.0, SECONDS).toJavaDuration())\n      .isNotEqualTo(java.time.Duration.ofSeconds(-9999999999999999))\n\n    assertThat(Duration(-999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(-999))\n    assertThat(Duration(-999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(-999999))\n    assertThat(Duration(-999999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(-999999999))\n    assertThat(Duration(-999999999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(-999999999999))\n    assertThat(Duration(-999999999999999.0, MINUTES).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofMinutes(-999999999999999))\n    @Suppress(\"FloatingPointLiteralPrecision\")\n    assertThat(Duration(-9999999999999999.0, MINUTES).toJavaDuration())\n      .isNotEqualTo(java.time.Duration.ofMinutes(-9999999999999999))\n\n    assertThat(Duration(-999.0, HOURS).toJavaDuration()).isEqualTo(java.time.Duration.ofHours(-999))\n    assertThat(Duration(-999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(-999999))\n    assertThat(Duration(-999999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(-999999999))\n    assertThat(Duration(-999999999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(-999999999999))\n    assertThat(Duration(-999999999999999.0, HOURS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofHours(-999999999999999))\n    assertThrows<ArithmeticException> {\n      @Suppress(\"FloatingPointLiteralPrecision\")\n      Duration(-9999999999999999.0, HOURS).toJavaDuration()\n    }\n\n    assertThat(Duration(-999.0, DAYS).toJavaDuration()).isEqualTo(java.time.Duration.ofDays(-999))\n    assertThat(Duration(-999999.0, DAYS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofDays(-999999))\n    assertThat(Duration(-999999999.0, DAYS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofDays(-999999999))\n    assertThat(Duration(-999999999999.0, DAYS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofDays(-999999999999))\n    assertThrows<ArithmeticException> { Duration(-999999999999999.0, DAYS).toJavaDuration() }\n  }\n\n  @Test\n  fun `toJavaDuration() - edge cases`() {\n    assertThat(Duration(0.0, NANOS).toJavaDuration()).isEqualTo(java.time.Duration.ofNanos(0))\n    assertThat(Duration(Long.MAX_VALUE.toDouble(), SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(Long.MAX_VALUE))\n    assertThat(Duration(Long.MIN_VALUE.toDouble(), SECONDS).toJavaDuration())\n      .isEqualTo(java.time.Duration.ofSeconds(Long.MIN_VALUE))\n\n    val justTooLarge = Duration(Long.MAX_VALUE.toDouble().nextUp(), SECONDS)\n    assertThrows<ArithmeticException> { justTooLarge.toJavaDuration() }\n\n    val negJustTooLarge = Duration(Long.MIN_VALUE.toDouble().nextDown(), SECONDS)\n    assertThrows<ArithmeticException> { negJustTooLarge.toJavaDuration() }\n\n    val nan = Duration(Double.NaN, SECONDS)\n    assertThrows<ArithmeticException> { nan.toJavaDuration() }\n\n    val inf = Duration(Double.POSITIVE_INFINITY, SECONDS)\n    assertThrows<ArithmeticException> { inf.toJavaDuration() }\n\n    val negInf = Duration(Double.NEGATIVE_INFINITY, SECONDS)\n    assertThrows<ArithmeticException> { negInf.toJavaDuration() }\n  }\n\n  @Test\n  fun `equals()`() {\n    assertThat(duration1).isEqualTo(duration1)\n    assertThat(duration1).isEqualTo(duration2)\n    assertThat(duration2).isEqualTo(duration1)\n\n    assertThat(duration3).isNotEqualTo(duration1)\n    assertThat(duration2).isNotEqualTo(duration3)\n  }\n\n  @Test\n  fun `hashCode()`() {\n    assertThat(duration1.hashCode()).isEqualTo(duration1.hashCode())\n    assertThat(duration2.hashCode()).isEqualTo(duration1.hashCode())\n    assertThat(duration1.hashCode()).isEqualTo(duration2.hashCode())\n\n    assertThat(duration3.hashCode()).isNotEqualTo(duration1.hashCode())\n    assertThat(duration2.hashCode()).isNotEqualTo(duration3.hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/DurationUnitTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.time.temporal.ChronoUnit\nimport java.util.concurrent.TimeUnit\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass DurationUnitTest {\n  @Test\n  fun destructure() {\n    val bytes = DataSizeUnit.BYTES\n    assertThat(bytes.bytes).isEqualTo(1)\n    assertThat(bytes.symbol).isEqualTo(\"b\")\n\n    val mebibytes = DataSizeUnit.MEBIBYTES\n    assertThat(mebibytes.bytes).isEqualTo(1024L * 1024)\n    assertThat(mebibytes.symbol).isEqualTo(\"mib\")\n  }\n\n  @Test\n  fun `toString()`() {\n    assertThat(DataSizeUnit.BYTES.toString()).isEqualTo(\"b\")\n    assertThat(DataSizeUnit.MEBIBYTES.toString()).isEqualTo(\"mib\")\n  }\n\n  @Test\n  fun parse() {\n    assertThat(DurationUnit.parse(\"min\")).isEqualTo(DurationUnit.MINUTES)\n    assertThat(DurationUnit.parse(\"other\")).isNull()\n  }\n\n  @Test\n  fun toChronoUnit() {\n    assertThat(DurationUnit.NANOS.toChronoUnit()).isEqualTo(ChronoUnit.NANOS)\n    assertThat(DurationUnit.MICROS.toChronoUnit()).isEqualTo(ChronoUnit.MICROS)\n    assertThat(DurationUnit.MILLIS.toChronoUnit()).isEqualTo(ChronoUnit.MILLIS)\n    assertThat(DurationUnit.SECONDS.toChronoUnit()).isEqualTo(ChronoUnit.SECONDS)\n    assertThat(DurationUnit.MINUTES.toChronoUnit()).isEqualTo(ChronoUnit.MINUTES)\n    assertThat(DurationUnit.HOURS.toChronoUnit()).isEqualTo(ChronoUnit.HOURS)\n    assertThat(DurationUnit.DAYS.toChronoUnit()).isEqualTo(ChronoUnit.DAYS)\n  }\n\n  @Test\n  fun toTimeUnit() {\n    assertThat(DurationUnit.NANOS.toTimeUnit()).isEqualTo(TimeUnit.NANOSECONDS)\n    assertThat(DurationUnit.MICROS.toTimeUnit()).isEqualTo(TimeUnit.MICROSECONDS)\n    assertThat(DurationUnit.MILLIS.toTimeUnit()).isEqualTo(TimeUnit.MILLISECONDS)\n    assertThat(DurationUnit.SECONDS.toTimeUnit()).isEqualTo(TimeUnit.SECONDS)\n    assertThat(DurationUnit.MINUTES.toTimeUnit()).isEqualTo(TimeUnit.MINUTES)\n    assertThat(DurationUnit.HOURS.toTimeUnit()).isEqualTo(TimeUnit.HOURS)\n    assertThat(DurationUnit.DAYS.toTimeUnit()).isEqualTo(TimeUnit.DAYS)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/DynamicTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\n\nclass DynamicTest {\n  private fun brokenInput(value: String): String =\n    \"\"\"\n      class Person { name: String; age: Int }\n\n      person: Person = new { name = 42; age = \"Pigeon\" } // oops\n\n      output { value = $value }\n    \"\"\"\n      .trimIndent()\n\n  @Test\n  fun `property access respects type`() {\n    // Does not involve Dynamic, but is a baseline for the other cases.\n    val evaluator = Evaluator.preconfigured()\n    assertThrows<PklException> {\n      evaluator.evaluateOutputText(ModuleSource.text(brokenInput(\"person.name\")))\n    }\n  }\n\n  @Test\n  fun `toDynamic respects type`() {\n    val evaluator = Evaluator.preconfigured()\n    assertThrows<PklException> {\n      evaluator.evaluateOutputText(ModuleSource.text(brokenInput(\"person.toDynamic()\")))\n    }\n  }\n\n  @Test\n  fun `amending a Dynamic loses type information`() {\n    val evaluator = Evaluator.preconfigured()\n    val amendingDynamic = \"(person.toDynamic()) { name = false; age = 0.ms }\"\n    assertDoesNotThrow {\n      evaluator.evaluateOutputText(ModuleSource.text(brokenInput(amendingDynamic)))\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluateExpressionTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass EvaluateExpressionTest {\n  companion object {\n    private val evaluator by lazy { Evaluator.preconfigured() }\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      evaluator.close()\n    }\n  }\n\n  private fun evaluate(program: String, expression: String): Any {\n    return evaluator.evaluateExpression(ModuleSource.text(program), expression)\n  }\n\n  @Test\n  fun `evaluate expression`() {\n    val program =\n      \"\"\"\n      res1 = 1\n      res2 {\n        res3 = 3\n        res4 = 4\n      }\n    \"\"\"\n        .trimIndent()\n    assertThat(evaluate(program, \"res1\")).isEqualTo(1L)\n    val res2 = evaluate(program, \"res2\")\n    assertThat(res2).isInstanceOf(PObject::class.java)\n    res2 as PObject\n    assertThat(res2.get(\"res3\")).isEqualTo(3L)\n    assertThat(res2.get(\"res4\")).isEqualTo(4L)\n  }\n\n  @Test\n  fun `evaluate subpath`() {\n    val resp =\n      evaluate(\n        \"\"\"\n      foo {\n        bar = 2\n      }\n    \"\"\"\n          .trimIndent(),\n        \"foo.bar\",\n      )\n\n    assertThat(resp).isEqualTo(2L)\n  }\n\n  @Test\n  fun `evaluate output text`() {\n    val result =\n      evaluate(\n        \"\"\"\n      foo {\n        bar = 2\n      }\n      \n      output {\n        renderer = new YamlRenderer {}\n      }\n    \"\"\"\n          .trimIndent(),\n        \"output.text\",\n      )\n\n    assertThat(result)\n      .isEqualTo(\n        \"\"\"\n      foo:\n        bar: 2\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `evaluate let expression`() {\n    val result = evaluate(\"foo = 1\", \"let (bar = 2) foo + bar\")\n\n    assertThat(result).isEqualTo(3L)\n  }\n\n  @Test\n  fun `evaluate import expression`() {\n    val result = evaluate(\"\", \"\"\"import(\"pkl:release\").current.documentation.homepage\"\"\")\n\n    assertThat(result as String).startsWith(\"https://pkl-lang.org/\")\n  }\n\n  @Test\n  fun `evaluate expression with invalid syntax`() {\n    val error = assertThrows<PklException> { evaluate(\"foo = 1\", \"<>!!!\") }\n\n    assertThat(error).hasMessageContaining(\"Unexpected token\")\n    assertThat(error).hasMessageContaining(\"<>!!!\")\n  }\n\n  @Test\n  fun `evaluate non-expression`() {\n    val error = assertThrows<PklException> { evaluate(\"bar = 2\", \"bar = 15\") }\n\n    assertThat(error).hasMessageContaining(\"Unexpected token\")\n    assertThat(error).hasMessageContaining(\"bar = 15\")\n  }\n\n  @Test\n  fun `evaluate semantically invalid expression`() {\n    val error = assertThrows<PklException> { evaluate(\"foo = 1\", \"foo as String\") }\n\n    assertThat(error).hasMessageContaining(\"Expected value of type `String`, but got type `Int`\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluateMultipleFileOutputTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.*\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.ModuleSource.text\n\nclass EvaluateMultipleFileOutputTest {\n\n  private val evaluator = Evaluator.preconfigured()\n\n  @Test\n  fun `output files`() {\n    val program =\n      \"\"\"\n      output {\n        files {\n          [\"foo.yml\"] {\n            text = \"foo: foo text\"\n          }\n          [\"bar.yml\"] {\n            text = \"bar: bar text\"\n          }\n          [\"bar/biz.yml\"] {\n            text = \"biz: bar biz\"\n          }\n          [\"bar/../bark.yml\"] {\n            text = \"bark: bark bark\"\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val output = evaluator.evaluateOutputFiles(text(program))\n    assertThat(output.keys).isEqualTo(setOf(\"foo.yml\", \"bar.yml\", \"bar/biz.yml\", \"bar/../bark.yml\"))\n    assertThat(output[\"foo.yml\"]?.text).isEqualTo(\"foo: foo text\")\n    assertThat(output[\"foo.yml\"]?.bytes).isEqualTo(\"foo: foo text\".toByteArray())\n    assertThat(output[\"bar.yml\"]?.text).isEqualTo(\"bar: bar text\")\n    assertThat(output[\"bar.yml\"]?.bytes).isEqualTo(\"bar: bar text\".toByteArray())\n    assertThat(output[\"bar/biz.yml\"]?.text).isEqualTo(\"biz: bar biz\")\n    assertThat(output[\"bar/biz.yml\"]?.bytes).isEqualTo(\"biz: bar biz\".toByteArray())\n    assertThat(output[\"bar/../bark.yml\"]?.text).isEqualTo(\"bark: bark bark\")\n    assertThat(output[\"bar/../bark.yml\"]?.bytes).isEqualTo(\"bark: bark bark\".toByteArray())\n  }\n\n  @Test\n  fun `using a renderer`() {\n    val evaluator = Evaluator.preconfigured()\n    val program =\n      \"\"\"\n      output {\n        files {\n          [\"foo.json\"] {\n            value = new {\n              foo = \"fooey\"\n              bar = \"barrey\"\n            }\n            renderer = new JsonRenderer {}\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val output = evaluator.evaluateOutputFiles(text(program))\n    assertThat(output[\"foo.json\"]?.text)\n      .isEqualTo(\n        \"\"\"\n      {\n        \"foo\": \"fooey\",\n        \"bar\": \"barrey\"\n      }\n      \n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `reading files after the evaluator is closed`() {\n    val evaluator = Evaluator.preconfigured()\n    val program =\n      \"\"\"\n      output {\n        files {\n          [\"foo.json\"] {\n            value = new {\n              foo = \"fooey\"\n              bar = \"barrey\"\n            }\n            renderer = new JsonRenderer {}\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val output = evaluator.evaluateOutputFiles(text(program))\n    evaluator.close()\n    assertThrows<PklException> { output[\"foo.json\"]!!.text }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluateOutputTextTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.util.IoUtils\n\n// tests language-internal renderers\n// uses same input/output files as Pcf/Json/Yaml/PListRendererTest\nclass EvaluateOutputTextTest {\n  @Test\n  fun `render Pcf`() {\n    checkRenderedOutput(OutputFormat.PCF)\n  }\n\n  @Test\n  fun `render JSON`() {\n    checkRenderedOutput(OutputFormat.JSON)\n  }\n\n  @Test\n  fun `render YAML`() {\n    checkRenderedOutput(OutputFormat.YAML)\n  }\n\n  @Test\n  fun `render plist`() {\n    checkRenderedOutput(OutputFormat.PLIST)\n  }\n\n  private fun checkRenderedOutput(format: OutputFormat) {\n    val evaluator = EvaluatorBuilder.preconfigured().setOutputFormat(format).build()\n\n    val output =\n      evaluator.evaluateOutputText(ModuleSource.modulePath(\"org/pkl/core/rendererTest.pkl\"))\n    val expected = IoUtils.readClassPathResourceAsString(javaClass, \"rendererTest.$format\")\n\n    assertThat(output.trim()).isEqualTo(expected.trim())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluateSchemaTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.ModuleSource.*\nimport org.pkl.core.runtime.BaseModule\n\nclass EvaluateSchemaTest {\n  private val evaluator = Evaluator.preconfigured()\n\n  @AfterEach\n  fun afterEach() {\n    evaluator.close()\n  }\n\n  @Test\n  fun `evaluate test schema`() {\n    val module = evaluator.evaluateSchema(modulePath(\"org/pkl/core/EvaluateSchemaTest.pkl\"))\n\n    checkModuleMetadata(module)\n\n    checkModuleProperties(module)\n\n    checkModuleMethods(module)\n\n    checkModuleClasses(module)\n\n    checkSupermodule(module)\n  }\n\n  @Test\n  fun `evaluate pkl_base schema`() {\n    val module = evaluator.evaluateSchema(uri(URI(\"pkl:base\")))\n    assertThat(module.moduleClass.superclass).isEqualTo(BaseModule.getModuleClass().export())\n  }\n\n  @Test\n  fun `does not export local classes`() {\n    val module =\n      evaluator.evaluateSchema(\n        text(\n          \"\"\"\n        class Foo {}\n        local class Baz {}\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    assertThat(module.classes.keys).containsExactly(\"Foo\")\n  }\n\n  private fun checkModuleMetadata(module: ModuleSchema) {\n    assertThat(module.moduleUri).isEqualTo(URI(\"modulepath:/org/pkl/core/EvaluateSchemaTest.pkl\"))\n\n    assertThat(module.moduleName).isEqualTo(\"test\")\n\n    assertThat(module.moduleClass.sourceLocation.startLine()).isEqualTo(2)\n    assertThat(module.moduleClass.sourceLocation.endLine()).isEqualTo(26)\n  }\n\n  private fun checkModuleProperties(module: ModuleSchema) {\n    val properties = module.moduleClass.properties\n    assertThat(properties).hasSize(3)\n\n    val propertyb1 = properties.getValue(\"propertyb1\")\n    assertThat(propertyb1.sourceLocation.startLine()).isEqualTo(5)\n    assertThat(propertyb1.sourceLocation.endLine()).isEqualTo(5)\n    assertThat(propertyb1.type).isEqualTo(PType.UNKNOWN)\n\n    val propertyb2 = properties.getValue(\"propertyb2\")\n    assertThat(propertyb2.sourceLocation.startLine()).isEqualTo(8)\n    assertThat(propertyb2.sourceLocation.endLine()).isEqualTo(9)\n    val paramType = propertyb2.type\n    assertThat(paramType).isInstanceOf(PType.Class::class.java)\n    paramType as PType.Class\n    assertThat(paramType.pClass).isEqualTo(BaseModule.getIntClass().export())\n\n    val propertyb3 = properties.getValue(\"propertyb3\")\n    assertThat(propertyb3.sourceLocation.startLine()).isEqualTo(24)\n    assertThat(propertyb3.sourceLocation.endLine()).isEqualTo(24)\n  }\n\n  private fun checkModuleMethods(module: ModuleSchema) {\n    val methods = module.moduleClass.methods\n    assertThat(methods).hasSize(3)\n\n    val methodb1 = methods.getValue(\"methodb1\")\n    assertThat(methodb1.sourceLocation.startLine()).isEqualTo(12)\n    assertThat(methodb1.sourceLocation.endLine()).isEqualTo(12)\n    assertThat(methodb1.parameters).isEmpty()\n    assertThat(methodb1.returnType).isEqualTo(PType.UNKNOWN)\n\n    val methodb2 = methods.getValue(\"methodb2\")\n    assertThat(methodb2.sourceLocation.startLine()).isEqualTo(15)\n    assertThat(methodb2.sourceLocation.endLine()).isEqualTo(16)\n    val paramType = methodb2.parameters.getValue(\"str\")\n    assertThat(paramType).isInstanceOf(PType.Constrained::class.java)\n    paramType as PType.Constrained\n    val paramBaseType = paramType.baseType\n    assertThat(paramBaseType).isInstanceOf(PType.Class::class.java)\n    paramBaseType as PType.Class\n    assertThat(paramBaseType.pClass).isEqualTo(BaseModule.getStringClass().export())\n    assertThat(paramType.constraints).isEqualTo(listOf(\"!isEmpty\", \"startsWith(\\\"a\\\")\"))\n\n    val returnType = methodb2.returnType\n    assertThat(returnType).isInstanceOf(PType.Constrained::class.java)\n    returnType as PType.Constrained\n    val returnBaseType = returnType.baseType\n    assertThat(returnBaseType).isInstanceOf(PType.Class::class.java)\n    returnBaseType as PType.Class\n    assertThat(returnBaseType.pClass).isEqualTo(BaseModule.getIntClass().export())\n    assertThat(returnType.constraints).isEqualTo(listOf(\"isPositive\"))\n\n    val methodb3 = methods.getValue(\"methodb3\")\n    assertThat(methodb3.sourceLocation.startLine()).isEqualTo(26)\n    assertThat(methodb3.sourceLocation.endLine()).isEqualTo(26)\n    assertThat(methodb3.parameters.keys).containsExactly(\"x\", \"_#1\", \"i\", \"_#3\")\n  }\n\n  private fun checkModuleClasses(module: ModuleSchema) {\n    val classes = module.classes\n    assertThat(classes).hasSize(1)\n    val classb1 = classes.getValue(\"Classb1\")\n    assertThat(classb1.sourceLocation.startLine()).isEqualTo(19)\n    assertThat(classb1.sourceLocation.endLine()).isEqualTo(22)\n    assertThat(classb1.properties).hasSize(2)\n  }\n\n  private fun checkSupermodule(module: ModuleSchema) {\n    val supermodule = module.supermodule\n\n    assertThat(supermodule).isNotNull\n    assertThat(supermodule!!.supermodule).isNull()\n\n    assertThat(module.moduleClass.superclass).isEqualTo(supermodule.moduleClass)\n    assertThat(supermodule.moduleClass.superclass).isEqualTo(BaseModule.getModuleClass().export())\n\n    assertThat(supermodule.moduleUri)\n      .isEqualTo(URI(\"modulepath:/org/pkl/core/EvaluateSchemaTestBaseModule.pkl\"))\n    assertThat(supermodule.moduleName).isEqualTo(\"test.base\")\n\n    assertThat(supermodule.moduleClass.sourceLocation.startLine()).isEqualTo(1)\n    assertThat(supermodule.moduleClass.sourceLocation.endLine()).isEqualTo(10)\n\n    val properties = supermodule.moduleClass.properties\n    assertThat(properties).hasSize(1)\n    assertThat(properties.getValue(\"propertya1\").type).isEqualTo(PType.UNKNOWN)\n\n    val methods = supermodule.moduleClass.methods\n    assertThat(methods).hasSize(1)\n    assertThat(methods.getValue(\"methoda1\").returnType).isEqualTo(PType.UNKNOWN)\n\n    val classes = supermodule.classes\n    assertThat(classes).hasSize(1)\n    assertThat(classes).containsKey(\"Classa1\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluateTestsTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.createFile\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.createTempFile\nimport org.pkl.commons.writeString\nimport org.pkl.core.ModuleSource.*\n\nclass EvaluateTestsTest {\n\n  private val evaluator = EvaluatorBuilder.preconfigured().setPowerAssertionsEnabled(true).build()\n\n  @Test\n  fun `test successful module`() {\n    val results =\n      evaluator.evaluateTest(\n        text(\n          \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"should pass\"] {\n          1 == 1\n          \"foo\" == \"foo\"\n        }\n      }\n    \"\"\"\n            .trimIndent()\n        ),\n        true,\n      )\n\n    assertThat(results.moduleName).isEqualTo(\"text\")\n    assertThat(results.displayUri).isEqualTo(\"repl:text\")\n    assertThat(results.totalTests()).isEqualTo(1)\n    assertThat(results.failed()).isFalse\n    assertThat(results.facts().results[0].name).isEqualTo(\"should pass\")\n    assertThat(results.logs().isBlank()).isTrue\n  }\n\n  @Test\n  fun `test module failure`() {\n    val results =\n      evaluator.evaluateTest(\n        text(\n          \"\"\"\n        amends \"pkl:test\"\n  \n        facts {\n          [\"should fail\"] {\n            1 == 2\n            \"foo\" == \"bar\"\n          }\n        }\n        \"\"\"\n            .trimIndent()\n        ),\n        true,\n      )\n\n    assertThat(results.totalTests()).isEqualTo(1)\n    assertThat(results.totalFailures()).isEqualTo(1)\n    assertThat(results.failed()).isTrue\n\n    val res = results.facts().results[0]\n    assertThat(res.name).isEqualTo(\"should fail\")\n    assertThat(results.facts().hasError()).isFalse\n    assertThat(res.failures.size).isEqualTo(2)\n\n    val fail1 = res.failures[0]\n    assertThat(fail1.message)\n      .isEqualTo(\n        \"\"\"\n      1 == 2 (repl:text)\n        │\n        false\n      \"\"\"\n          .trimIndent()\n      )\n\n    val fail2 = res.failures[1]\n    assertThat(fail2.message)\n      .isEqualTo(\n        \"\"\"\n      \"foo\" == \"bar\" (repl:text)\n            │\n            false\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `test module error`() {\n    val results =\n      evaluator.evaluateTest(\n        text(\n          \"\"\"\n        amends \"pkl:test\"\n  \n        facts {\n          [\"should fail\"] {\n            1 == 2\n            throw(\"got an error\")\n          }\n        }\n        \"\"\"\n            .trimIndent()\n        ),\n        true,\n      )\n\n    assertThat(results.totalTests()).isEqualTo(1)\n    assertThat(results.totalFailures()).isEqualTo(1)\n    assertThat(results.failed()).isTrue\n\n    val res = results.facts().results[0]\n    assertThat(res.name).isEqualTo(\"should fail\")\n    assertThat(res.failures).hasSize(1)\n    assertThat(res.errors).hasSize(1)\n\n    val error = res.errors[0]\n    assertThat(error.message).isEqualTo(\"got an error\")\n    assertThat(error.exception().message)\n      .isEqualTo(\n        \"\"\"\n      –– Pkl Error ––\n      got an error\n\n      6 | throw(\"got an error\")\n          ^^^^^^^^^^^^^^^^^^^^^\n      at text#facts[\"should fail\"][#2] (repl:text)\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `test successful example`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile(prefix = \"example\", suffix = \".pkl\")\n    Files.writeString(\n      file,\n      \"\"\"\n      amends \"pkl:test\"\n      \n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    Files.writeString(\n      createExpected(file),\n      \"\"\"\n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val results = evaluator.evaluateTest(path(file), false)\n    assertThat(results.moduleName).startsWith(\"example\")\n    assertThat(results.displayUri).startsWith(\"file:///\").endsWith(\".pkl\")\n    assertThat(results.totalTests()).isEqualTo(1)\n    assertThat(results.failed()).isFalse\n    assertThat(results.examples().results[0].name).isEqualTo(\"user\")\n  }\n\n  @Test\n  fun `test fact failures with successful example`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile(prefix = \"example\", suffix = \".pkl\")\n    Files.writeString(\n      file,\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"should fail\"] {\n          1 == 2\n          \"foo\" == \"bar\"\n        }\n      }\n\n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    Files.writeString(\n      createExpected(file),\n      \"\"\"\n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val results = evaluator.evaluateTest(path(file), false)\n    assertThat(results.moduleName).startsWith(\"example\")\n    assertThat(results.displayUri).startsWith(\"file:///\").endsWith(\".pkl\")\n    assertThat(results.totalTests()).isEqualTo(2)\n    assertThat(results.totalFailures()).isEqualTo(1)\n    assertThat(results.failed()).isTrue\n\n    assertThat(results.facts().results[0].name).isEqualTo(\"should fail\")\n    assertThat(results.facts().results[0].failures.size).isEqualTo(2)\n    assertThat(results.examples().results[0].name).isEqualTo(\"user\")\n  }\n\n  @Test\n  fun `test fact error with successful example`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile(prefix = \"example\", suffix = \".pkl\")\n    Files.writeString(\n      file,\n      \"\"\"\n      amends \"pkl:test\"\n\n      facts {\n        [\"should fail\"] {\n          throw(\"exception\")\n        }\n      }\n\n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    Files.writeString(\n      createExpected(file),\n      \"\"\"\n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val results = evaluator.evaluateTest(path(file), false)\n    assertThat(results.moduleName).startsWith(\"example\")\n    assertThat(results.displayUri).startsWith(\"file:///\").endsWith(\".pkl\")\n\n    assertThat(results.totalTests()).isEqualTo(2)\n    assertThat(results.totalFailures()).isEqualTo(1)\n    assertThat(results.failed()).isTrue\n\n    val res = results.facts().results[0]\n    assertThat(res.name).isEqualTo(\"should fail\")\n    assertThat(res.failures).hasSize(0)\n    assertThat(res.errors).hasSize(1)\n\n    val error = res.errors[0]\n    assertThat(error.message).isEqualTo(\"exception\")\n\n    assertThat(results.examples().results[0].name).isEqualTo(\"user\")\n  }\n\n  @Test\n  fun `test example failure`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile(prefix = \"example\", suffix = \".pkl\")\n    Files.writeString(\n      file,\n      \"\"\"\n      amends \"pkl:test\"\n      \n      examples {\n        [\"user\"] {\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    Files.writeString(\n      createExpected(file),\n      \"\"\"\n      examples {\n        [\"user\"] {\n          new {\n            name = \"Alice\"\n            age = 45\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val results = evaluator.evaluateTest(path(file), false)\n    assertThat(results.moduleName).startsWith(\"example\")\n    assertThat(results.displayUri).startsWith(\"file:///\").endsWith(\".pkl\")\n    assertThat(results.totalTests()).isEqualTo(1)\n    assertThat(results.failed()).isTrue\n    assertThat(results.totalFailures()).isEqualTo(1)\n\n    val res = results.examples().results[0]\n    assertThat(res.name).isEqualTo(\"user\")\n    assertFalse(results.examples().hasError())\n\n    val fail1 = res.failures[0]\n    assertThat(fail1.message.stripFileAndLines(tempDir))\n      .isEqualTo(\n        \"\"\"\n        #0: (/tempDir/example.pkl)\n          Expected: (/tempDir/example.pkl-expected.pcf)\n          new {\n            name = \"Alice\"\n            age = 45\n          }\n          Actual: (/tempDir/example.pkl-actual.pcf)\n          new {\n            name = \"Bob\"\n            age = 33\n          }\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `written examples use custom string delimiters`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile(prefix = \"example\", suffix = \".pkl\")\n    Files.writeString(\n      file,\n      \"\"\"\n      amends \"pkl:test\"\n      \n      examples {\n        [\"myStr\"] {\n          \"my \\\"string\\\"\"\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    evaluator.evaluateTest(path(file), false)\n    val expectedFile = file.parent.resolve(file.fileName.toString() + \"-expected.pcf\")\n    assertThat(expectedFile).exists()\n    assertThat(expectedFile)\n      .hasContent(\n        \"\"\"\n      examples {\n        [\"myStr\"] {\n          #\"my \"string\"\"#\n        }\n      }\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  // test for backwards compatibility\n  @Test\n  fun `examples that don't use custom string delimiters still pass`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile(prefix = \"example\", suffix = \".pkl\")\n    Files.writeString(\n      file,\n      \"\"\"\n      amends \"pkl:test\"\n      \n      examples {\n        [\"myStr\"] {\n          \"my \\\"string\\\"\"\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    createExpected(file)\n      .writeString(\n        \"\"\"\n      examples {\n        [\"myStr\"] {\n          \"my \\\"string\\\"\"\n        }\n      }\n\n    \"\"\"\n          .trimIndent()\n      )\n    val result = evaluator.evaluateTest(path(file), false)\n    assertFalse(result.failed())\n  }\n\n  companion object {\n    private fun createExpected(path: Path): Path {\n      return path.parent.resolve(path.fileName.toString() + \"-expected.pcf\").createFile()\n    }\n\n    private fun String.stripFileAndLines(tmpDir: Path) =\n      replace(tmpDir.toUri().toString(), \"/tempDir/\")\n        .replace(Regex(\"example\\\\d+\"), \"example\")\n        .replace(Regex(\"line \\\\d+\"), \"line x\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluatorBuilderTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.nio.file.Path\nimport java.time.Duration\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.project.Project\nimport org.pkl.core.resource.TestResourceReader\n\nclass EvaluatorBuilderTest {\n  @Test\n  fun `preconfigured builder sets process env vars`() {\n    val builder = EvaluatorBuilder.preconfigured()\n    assertThat(builder.environmentVariables).isEqualTo(System.getenv())\n  }\n\n  @Test\n  fun `preconfigured builder sets system properties`() {\n    val builder = EvaluatorBuilder.preconfigured()\n    assertThat(builder.externalProperties).isEqualTo(System.getProperties())\n  }\n\n  @Test\n  fun `preconfigured builder adds resource readers from service providers`() {\n    val builder = EvaluatorBuilder.preconfigured()\n    assertThat(builder.resourceReaders).hasAtLeastOneElementOfType(TestResourceReader::class.java)\n  }\n\n  @Test\n  fun `unconfigured builder does not set process env vars`() {\n    val builder = EvaluatorBuilder.unconfigured()\n    assertThat(builder.environmentVariables).isEmpty()\n  }\n\n  @Test\n  fun `unconfigured builder does not set system properties`() {\n    val builder = EvaluatorBuilder.unconfigured()\n    assertThat(builder.externalProperties).isEmpty()\n  }\n\n  @Test\n  fun `enforces that security manager is set`() {\n    val e1 =\n      assertThrows<IllegalStateException> {\n        EvaluatorBuilder.unconfigured()\n          .setStackFrameTransformer(StackFrameTransformers.empty)\n          .build()\n      }\n    assertThat(e1).hasMessage(\"No security manager set.\")\n  }\n\n  @Test\n  fun `enforces that stack frame transformer is set`() {\n    val e1 =\n      assertThrows<IllegalStateException> {\n        EvaluatorBuilder.unconfigured().setSecurityManager(SecurityManagers.defaultManager).build()\n      }\n    assertThat(e1).hasMessage(\"No stack frame transformer set.\")\n  }\n\n  @Test\n  fun `sets evaluator settings from project`() {\n    val projectPath = Path.of(javaClass.getResource(\"project/project1/PklProject\")!!.toURI())\n    val project = Project.loadFromPath(projectPath, SecurityManagers.defaultManager, null)\n    val projectDir = projectPath.parent\n    val builder = EvaluatorBuilder.unconfigured()\n    val moduleKeyFactoryCount = builder.moduleKeyFactories.size\n    builder.applyFromProject(project)\n    assertThat(builder.allowedResources.map { it.pattern() }).isEqualTo(listOf(\"foo:\", \"bar:\"))\n    assertThat(builder.allowedModules.map { it.pattern() }).isEqualTo(listOf(\"baz:\", \"biz:\"))\n    assertThat(builder.externalProperties).isEqualTo(mapOf(\"one\" to \"1\"))\n    assertThat(builder.environmentVariables).isEqualTo(mapOf(\"two\" to \"2\"))\n    assertThat(builder.moduleCacheDir).isEqualTo(projectDir.resolve(\"my-cache-dir/\"))\n    assertThat(builder.rootDir).isEqualTo(projectDir.resolve(\"my-root-dir/\"))\n    assertThat(builder.timeout).isEqualTo(Duration.ofMinutes(5L))\n    assertThat(builder.moduleKeyFactories.size - moduleKeyFactoryCount)\n      .isEqualTo(3) // two external readers, one module path\n    assertThat(builder.resourceReaders.find { it.uriScheme == \"scheme3\" }).isNotNull\n    assertThat(builder.resourceReaders.find { it.uriScheme == \"scheme4\" }).isNotNull\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/EvaluatorTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.File\nimport java.net.URI\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.FileSystems\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.util.*\nimport java.util.regex.Pattern\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.writeText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.createTempFile\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.toPath\nimport org.pkl.commons.writeString\nimport org.pkl.core.ModuleSource.*\nimport org.pkl.core.module.ModuleKey\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.module.ModuleKeyFactory\nimport org.pkl.core.module.ResolvedModuleKey\nimport org.pkl.core.project.Project\nimport org.pkl.core.util.IoUtils\n\nclass EvaluatorTest {\n  companion object {\n    private val evaluator = Evaluator.preconfigured()\n\n    @Suppress(\"ConstPropertyName\") private const val sourceText = \"name = \\\"pigeon\\\"; age = 10 + 20\"\n\n    private object CustomModuleKeyFactory : ModuleKeyFactory {\n      override fun create(uri: URI): Optional<ModuleKey> {\n        return if (uri.scheme == \"custom\") Optional.of(CustomModuleKey(uri))\n        else Optional.empty<ModuleKey>()\n      }\n    }\n\n    private class CustomModuleKey(private val uri: URI) : ModuleKey, ResolvedModuleKey {\n      override fun hasHierarchicalUris(): Boolean = true\n\n      override fun isGlobbable(): Boolean = false\n\n      override fun getOriginal(): ModuleKey = this\n\n      override fun getUri(): URI = uri\n\n      override fun loadSource(): String =\n        javaClass.classLoader.getResourceAsStream(uri.path.drop(1))!!.use {\n          it.readAllBytes().toString(StandardCharsets.UTF_8)\n        }\n\n      override fun resolve(securityManager: SecurityManager): ResolvedModuleKey = this\n    }\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      evaluator.close()\n    }\n  }\n\n  @Test\n  fun `evaluate text`() {\n    val module = evaluator.evaluate(text(sourceText))\n    checkModule(module)\n  }\n\n  @Test\n  fun `evaluate text with relative import`() {\n    val e = assertThrows<PklException> { evaluator.evaluate(text(\"import \\\"foo.bar\\\"\")) }\n    assertThat(e).hasMessageContaining(\"Module `repl:text` cannot have a relative import URI.\")\n  }\n\n  @Test\n  fun `evaluate named module`() {\n    val module = evaluator.evaluate(modulePath(\"org/pkl/core/EvaluatorTest.pkl\"))\n    checkModule(module)\n  }\n\n  @Test\n  fun `evaluate non-existing named module`() {\n    val e = assertThrows<PklException> { evaluator.evaluate(modulePath(\"non/existing.pkl\")) }\n    assertThat(e).hasMessageContaining(\"Cannot find module `modulepath:/non/existing.pkl`.\")\n  }\n\n  @Test\n  fun `evaluate file`(@TempDir tempDir: Path) {\n    val file = tempDir.createTempFile()\n    Files.writeString(file, sourceText)\n\n    val module = evaluator.evaluate(path(file))\n    checkModule(module)\n  }\n\n  @Test\n  fun `evaluate non-existing file`() {\n    val file = File(\"/non/existing\")\n    val e = assertThrows<PklException> { evaluator.evaluate(file(file)) }\n    assertThat(e).hasMessageContaining(\"Cannot find module `${file.toPath().toUri()}`.\")\n  }\n\n  @Test\n  fun `evaluate path`(@TempDir tempDir: Path) {\n    val path = tempDir.createTempFile()\n    Files.writeString(path, sourceText)\n\n    val module = evaluator.evaluate(path(path))\n    checkModule(module)\n  }\n\n  @Test\n  fun `evaluate non-existing path`() {\n    val path = \"/non/existing\".toPath()\n    val e = assertThrows<PklException> { evaluator.evaluate(path(path)) }\n    assertThat(e).hasMessageContaining(\"Cannot find module `${path.toUri()}`.\")\n  }\n\n  @Test\n  fun `evaluate zip file system path`(@TempDir tempDir: Path) {\n    val zipFile = createModulesZip(tempDir)\n    // cast required to compile on JDK 14+ (which adds new overload)\n    FileSystems.newFileSystem(zipFile, null as ClassLoader?).use { zipFs ->\n      val file = zipFs.getPath(\"foo/bar/module1.pkl\")\n      val module = evaluator.evaluate(path(file))\n      checkModule(module)\n    }\n  }\n\n  @Test\n  fun `evaluate non-existing zip file system path`(@TempDir tempDir: Path) {\n    val zipFile = createModulesZip(tempDir)\n    // cast required to compile on JDK 14+ (which adds new overload)\n    FileSystems.newFileSystem(zipFile, null as ClassLoader?).use { zipFs ->\n      val file = zipFs.getPath(\"non/existing\")\n      val e = assertThrows<PklException> { evaluator.evaluate(path(file)) }\n      assertThat(e)\n        .hasMessageContaining(\"Cannot find module `jar:file:\")\n        .hasMessageContaining(\"non/existing\")\n    }\n  }\n\n  @Test\n  fun `evaluate URI`(@TempDir tempDir: Path) {\n    val path = tempDir.createTempFile()\n    Files.writeString(path, sourceText)\n\n    val module = evaluator.evaluate(uri(path.toUri()))\n    checkModule(module)\n  }\n\n  @Test\n  fun `evaluate non-existing URI`() {\n    val e =\n      assertThrows<PklException> { evaluator.evaluate(uri(URI(\"https://localhost/non/existing\"))) }\n    assertThat(e).hasMessageContaining(\"I/O error loading module `https://localhost/non/existing`.\")\n  }\n\n  @Test\n  fun `evaluate jar URI`(@TempDir tempDir: Path) {\n    val zipFile = createModulesZip(tempDir)\n    val module = evaluator.evaluate(uri(URI(\"jar:${zipFile.toUri()}!/foo/bar/module1.pkl\")))\n    checkModule(module)\n  }\n\n  @Test\n  fun `evaluate jar URI with non-existing archive`() {\n    val moduleUri = URI(\"jar:file:///non/existing!/bar.pkl\")\n    val e = assertThrows<PklException> { evaluator.evaluate(uri(moduleUri)) }\n    assertThat(e).hasMessageContaining(\"Cannot find module `$moduleUri`.\")\n  }\n\n  @Test\n  fun `evaluate jar URI with non-existing archive path`(@TempDir tempDir: Path) {\n    val zipFile = createModulesZip(tempDir)\n    val moduleUri = URI(\"jar:${zipFile.toUri()}!/non/existing\")\n    val e = assertThrows<PklException> { evaluator.evaluate(uri(moduleUri)) }\n    assertThat(e).hasMessageContaining(\"Cannot find module `$moduleUri`.\")\n  }\n\n  @Test\n  fun `evaluate module with relative URI`() {\n    val e = assertThrows<PklException> { evaluator.evaluate(create(URI(\"foo.bar\"), \"\")) }\n\n    assertThat(e).hasMessageContaining(\"Cannot evaluate relative module URI `foo.bar`.\")\n  }\n\n  @Test\n  fun `evaluating a broken module multiple times results in the same error every time`() {\n    val e1 =\n      assertThrows<PklException> {\n        evaluator.evaluate(modulePath(\"org/pkl/core/brokenModule1.pkl\"))\n      }\n    val e2 =\n      assertThrows<PklException> {\n        evaluator.evaluate(modulePath(\"org/pkl/core/brokenModule1.pkl\"))\n      }\n    assertThat(e2.message).isEqualTo(e1.message)\n\n    val e3 =\n      assertThrows<PklException> {\n        evaluator.evaluate(modulePath(\"org/pkl/core/brokenModule2.pkl\"))\n      }\n    val e4 =\n      assertThrows<PklException> {\n        evaluator.evaluate(modulePath(\"org/pkl/core/brokenModule2.pkl\"))\n      }\n    assertThat(e4.message).isEqualTo(e3.message)\n  }\n\n  @Test\n  fun `evaluation timeout`() {\n    val evaluator =\n      EvaluatorBuilder.preconfigured().setTimeout(java.time.Duration.ofMillis(100)).build()\n    val e =\n      assertThrows<PklException> {\n        evaluator.evaluate(\n          text(\n            \"\"\"\n        function fib(n) = if (n < 2) 0 else fib(n - 1) + fib(n - 2)\n        x = fib(100)\n      \"\"\"\n              .trimIndent()\n          )\n        )\n      }\n    assertThat(e.message).contains(\"timed out\")\n  }\n\n  @Test\n  fun `stack overflow`() {\n    val evaluator = Evaluator.preconfigured()\n    val e =\n      assertThrows<PklException> {\n        evaluator.evaluate(\n          text(\n            \"\"\"\n        a = b\n        b = c\n        c = a\n      \"\"\"\n              .trimIndent()\n          )\n        )\n      }\n    assertThat(e.message).contains(\"A stack overflow occurred.\")\n  }\n\n  @Test\n  fun `cannot import module located outside root dir`(@TempDir tempDir: Path) {\n    val evaluator =\n      with(EvaluatorBuilder.preconfigured()) {\n        rootDir = tempDir\n        build()\n      }\n\n    val module = tempDir.resolve(\"test.pkl\").writeString(\"amends \\\"/non/existing.pkl\\\"\")\n\n    val e = assertThrows<PklException> { evaluator.evaluate(path(module)) }\n    assertThat(e.message)\n      .contains(\n        \"Refusing to load module `file:///non/existing.pkl` because it is not within the root directory (`--root-dir`).\"\n      )\n  }\n\n  @Test\n  fun `cannot import module from zip filesystem located outside root dir`(\n    @TempDir tempDir: Path,\n    @TempDir forbidden: Path,\n  ) {\n    val evaluator =\n      with(EvaluatorBuilder.preconfigured()) {\n        rootDir = tempDir\n        build()\n      }\n\n    val zipFile = createModulesZip(forbidden)\n\n    val module =\n      tempDir\n        .resolve(\"test.pkl\")\n        .writeString(\"res = import(\\\"jar:${zipFile.toUri()}!/foo/var/module1.pkl\\\")\")\n\n    val e = assertThrows<PklException> { evaluator.evaluate(path(module)) }\n    assertThat(e)\n      .hasMessageContaining(\n        \"Refusing to load module `jar:${zipFile.toUri()}!/foo/var/module1.pkl` because it is not within the root directory (`--root-dir`).\"\n      )\n  }\n\n  @Test\n  fun `cannot read resource from zip filesystem located outside root dir`(\n    @TempDir tempDir: Path,\n    @TempDir forbidden: Path,\n  ) {\n    val evaluator =\n      with(EvaluatorBuilder.preconfigured()) {\n        rootDir = tempDir\n        allowedResources.add(Pattern.compile(\"jar:file:\"))\n        build()\n      }\n\n    val zipFile = createModulesZip(forbidden)\n\n    val module =\n      tempDir\n        .resolve(\"test.pkl\")\n        .writeString(\"res = read(\\\"jar:${zipFile.toUri()}!/foo/var/module1.pkl\\\")\")\n\n    val e = assertThrows<PklException> { evaluator.evaluate(path(module)) }\n    assertThat(e)\n      .hasMessageContaining(\n        \"Refusing to read resource `jar:${zipFile.toUri()}!/foo/var/module1.pkl` because it is not within the root directory (`--root-dir`).\"\n      )\n  }\n\n  @Test\n  fun `cannot read resource located outside root dir`(@TempDir tempDir: Path) {\n    val evaluator =\n      with(EvaluatorBuilder.preconfigured()) {\n        rootDir = tempDir\n        build()\n      }\n\n    val module = tempDir.resolve(\"test.pkl\").writeString(\"res = read(\\\"/bar.txt\\\")\")\n\n    val e = assertThrows<PklException> { evaluator.evaluate(path(module)) }\n    assertThat(e)\n      .hasMessageContaining(\n        \"Refusing to read resource `file:///bar.txt` because it is not within the root directory (`--root-dir`).\"\n      )\n  }\n\n  @Test\n  fun `multiple-file output`() {\n    val evaluator = Evaluator.preconfigured()\n    val program =\n      \"\"\"\n      output {\n        files {\n          [\"foo.yml\"] {\n            text = \"foo: foo text\"\n          }\n          [\"bar.yml\"] {\n            text = \"bar: bar text\"\n          }\n          [\"bar/biz.yml\"] {\n            text = \"biz: bar biz\"\n          }\n          [\"bar/../bark.yml\"] {\n            text = \"bark: bark bark\"\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val output = evaluator.evaluateOutputFiles(text(program))\n    assertThat(output.keys).isEqualTo(setOf(\"foo.yml\", \"bar.yml\", \"bar/biz.yml\", \"bar/../bark.yml\"))\n    assertThat(output[\"foo.yml\"]?.text).isEqualTo(\"foo: foo text\")\n    assertThat(output[\"bar.yml\"]?.text).isEqualTo(\"bar: bar text\")\n    assertThat(output[\"bar/biz.yml\"]?.text).isEqualTo(\"biz: bar biz\")\n    assertThat(output[\"bar/../bark.yml\"]?.text).isEqualTo(\"bark: bark bark\")\n  }\n\n  @Test\n  fun `project set from modulepath`(@TempDir cacheDir: Path) {\n    PackageServer.populateCacheDir(cacheDir)\n    val evaluatorBuilder = EvaluatorBuilder.preconfigured().setModuleCacheDir(cacheDir)\n    val project = Project.load(modulePath(\"/org/pkl/core/project/project5/PklProject\"))\n    val result =\n      evaluatorBuilder.setProjectDependencies(project.dependencies).build().use { evaluator ->\n        evaluator.evaluateOutputText(modulePath(\"/org/pkl/core/project/project5/main.pkl\"))\n      }\n    assertThat(result)\n      .isEqualTo(\n        \"\"\"\n      prop1 {\n        name = \"Apple\"\n      }\n      prop2 {\n        res = 1\n      }\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `project set from custom ModuleKeyFactory`(@TempDir cacheDir: Path) {\n    PackageServer.populateCacheDir(cacheDir)\n    val evaluatorBuilder =\n      with(EvaluatorBuilder.preconfigured()) {\n        setAllowedModules(SecurityManagers.defaultAllowedModules + Pattern.compile(\"custom:\"))\n        setAllowedResources(SecurityManagers.defaultAllowedResources + Pattern.compile(\"custom:\"))\n        setModuleCacheDir(cacheDir)\n        setModuleKeyFactories(\n          listOf(\n            CustomModuleKeyFactory,\n            ModuleKeyFactories.standardLibrary,\n            ModuleKeyFactories.pkg,\n            ModuleKeyFactories.projectpackage,\n            ModuleKeyFactories.file,\n          )\n        )\n      }\n    val project =\n      evaluatorBuilder.build().use {\n        Project.load(it, uri(\"custom:/org/pkl/core/project/project5/PklProject\"))\n      }\n\n    val evaluator = evaluatorBuilder.setProjectDependencies(project.dependencies).build()\n    val output =\n      evaluator.use { it.evaluateOutputText(uri(\"custom:/org/pkl/core/project/project5/main.pkl\")) }\n    assertThat(output)\n      .isEqualTo(\n        \"\"\"\n        prop1 {\n          name = \"Apple\"\n        }\n        prop2 {\n          res = 1\n        }\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `project base path set to non-hierarchical scheme`() {\n    class FooBarModuleKey(val moduleUri: URI) : ModuleKey, ResolvedModuleKey {\n      override fun hasHierarchicalUris(): Boolean = false\n\n      override fun isGlobbable(): Boolean = false\n\n      override fun getOriginal(): ModuleKey = this\n\n      override fun getUri(): URI = moduleUri\n\n      override fun loadSource(): String =\n        if (uri.schemeSpecificPart.endsWith(\"PklProject\")) {\n          \"\"\"\n          amends \"pkl:Project\"\n          \"\"\"\n            .trimIndent()\n        } else\n          \"\"\"\n          birds = import(\"@birds/catalog/Ostrich.pkl\")\n        \"\"\"\n            .trimIndent()\n\n      override fun resolve(securityManager: SecurityManager): ResolvedModuleKey {\n        return this\n      }\n    }\n\n    val fooBayModuleKeyFactory = ModuleKeyFactory { uri ->\n      if (uri.scheme == \"foobar\") Optional.of(FooBarModuleKey(uri)) else Optional.empty()\n    }\n\n    val evaluatorBuilder =\n      with(EvaluatorBuilder.preconfigured()) {\n        setAllowedModules(SecurityManagers.defaultAllowedModules + Pattern.compile(\"foobar:\"))\n        setAllowedResources(SecurityManagers.defaultAllowedResources + Pattern.compile(\"foobar:\"))\n        setModuleKeyFactories(\n          listOf(\n            fooBayModuleKeyFactory,\n            ModuleKeyFactories.standardLibrary,\n            ModuleKeyFactories.pkg,\n            ModuleKeyFactories.projectpackage,\n            ModuleKeyFactories.file,\n          )\n        )\n      }\n\n    val project = evaluatorBuilder.build().use { Project.load(it, uri(\"foobar:foo/PklProject\")) }\n    val evaluator = evaluatorBuilder.setProjectDependencies(project.dependencies).build()\n    assertThatCode { evaluator.use { it.evaluateOutputText(uri(\"foobar:baz\")) } }\n      .hasMessageContaining(\n        \"Cannot import dependency because project URI `foobar:foo/PklProject` does not have a hierarchical path.\"\n      )\n  }\n\n  @Test\n  fun `cannot glob import in local dependency from modulepath`(@TempDir cacheDir: Path) {\n    PackageServer.populateCacheDir(cacheDir)\n    val evaluatorBuilder = EvaluatorBuilder.preconfigured().setModuleCacheDir(cacheDir)\n    val project = Project.load(modulePath(\"/org/pkl/core/project/project6/PklProject\"))\n    evaluatorBuilder.setProjectDependencies(project.dependencies).build().use { evaluator ->\n      assertThatCode {\n          evaluator.evaluateOutputText(\n            modulePath(\"/org/pkl/core/project/project6/globWithinDependency.pkl\")\n          )\n        }\n        .hasMessageContaining(\n          \"\"\"\n        Cannot resolve import in local dependency because scheme `modulepath` is not globbable.\n        \n        1 | res = import*(\"*.pkl\")\n                  ^^^^^^^^^^^^^^^^\n      \"\"\"\n            .trimIndent()\n        )\n      assertThatCode {\n          evaluator.evaluateOutputText(\n            modulePath(\"/org/pkl/core/project/project6/globIntoDependency.pkl\")\n          )\n        }\n        .hasMessageContaining(\n          \"\"\"\n        –– Pkl Error ––\n        Cannot resolve import in local dependency because scheme `modulepath` is not globbable.\n        \n        1 | import* \"@project7/*.pkl\" as proj7Files\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n      \"\"\"\n            .trimIndent()\n        )\n    }\n  }\n\n  private fun checkModule(module: PModule) {\n    assertThat(module.properties.size).isEqualTo(2)\n    assertThat(module.getProperty(\"name\")).isEqualTo(\"pigeon\")\n    assertThat(module.getProperty(\"age\")).isEqualTo(30L)\n  }\n\n  private fun createModulesZip(tempDir: Path): Path {\n    val modulesDir = tempDir.resolve(\"modules\")\n    val module1 = modulesDir.resolve(\"foo/bar/module1.pkl\").createParentDirectories()\n    val module2 = modulesDir.resolve(\"foo/baz/module2.pkl\").createParentDirectories()\n\n    module1.writeText(\n      \"\"\"\n      // verify that relative import is resolved correctly\n      import \"../baz/module2.pkl\"\n      \n      name = module2.name\n      age = module2.age\n    \"\"\"\n        .trimIndent()\n    )\n\n    module2.writeText(sourceText)\n\n    val zipFile = tempDir.resolve(\"modules.zip\")\n    IoUtils.zipDirectory(modulesDir, zipFile)\n    assertThat(zipFile).exists()\n    return zipFile\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/JsonRendererTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.StringWriter\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.util.IoUtils\nimport org.pkl.core.util.json.JsonHandler\nimport org.pkl.core.util.json.JsonParser\n\nclass JsonRendererTest {\n  @Test\n  fun `render document`() {\n    val evaluator = Evaluator.preconfigured()\n    val module = evaluator.evaluate(ModuleSource.modulePath(\"org/pkl/core/rendererTest.pkl\"))\n    val writer = StringWriter()\n    val renderer = ValueRenderers.json(writer, \"  \", true)\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n    val expected = IoUtils.readClassPathResourceAsString(javaClass, \"rendererTest.json\")\n\n    assertThat(output).isEqualTo(expected)\n    assertThatCode { JsonParser(object : JsonHandler<Any, Any>() {}).parse(output) }\n      .doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `rendered document ends in newline`() {\n    val module: PModule = Evaluator.preconfigured().evaluate(ModuleSource.text(\"foo { bar = 0 }\"))\n\n    for (omitNullProperties in listOf(false, true)) {\n      val writer = StringWriter()\n      ValueRenderers.json(writer, \"  \", omitNullProperties).renderDocument(module)\n      assertThat(writer.toString()).endsWith(\"\\n\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/LanguageSnippetTests.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.junit.platform.commons.annotation.Testable\n\n@Testable class LanguageSnippetTests\n\n@Testable class MacLanguageSnippetTests\n\n@Testable class LinuxLanguageSnippetTests\n\n@Testable class AlpineLanguageSnippetTests\n\n@Testable class WindowsLanguageSnippetTests\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/LanguageSnippetTestsEngine.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.PrintWriter\nimport java.io.StringWriter\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.exists\nimport kotlin.io.path.isRegularFile\nimport kotlin.reflect.KClass\nimport org.junit.platform.engine.EngineDiscoveryRequest\nimport org.junit.platform.engine.TestDescriptor\nimport org.junit.platform.engine.UniqueId\nimport org.junit.platform.engine.support.descriptor.EngineDescriptor\nimport org.pkl.commons.test.Executables\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.InputOutputTestEngine\nimport org.pkl.commons.test.MessagePackDebugRenderer\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.project.Project\nimport org.pkl.core.util.IoUtils\n\n// @TODO: this test fails on JDK 22+, because of an output mismatch\nprivate val excludedOnJvm22Plus = listOf(Regex(\".*analyzeInvalidHttpModule.*\"))\n\nprivate fun currentMajorJavaVersion(): Int =\n  System.getProperty(\"java.version\").substringBefore('.').toInt()\n\nprivate fun exclusionsForThisJvm(): List<Regex> =\n  when {\n    currentMajorJavaVersion() >= 22 -> excludedOnJvm22Plus\n    else -> emptyList()\n  }\n\nabstract class AbstractLanguageSnippetTestsEngine : InputOutputTestEngine() {\n  private val lineNumberRegex = Regex(\"(?m)^(( ║ )*)(\\\\d+) \\\\|\")\n  private val locationLineNumberRegex = Regex(\"#L(\\\\d+)\")\n  private val reflectedDeclarationLineNumberRegex = Regex(\"line = (\\\\d+)\")\n  private val hiddenExtensionRegex = Regex(\".*[.]([^.]*)[.]pkl\")\n  private val msgpackExtensionRegex = Regex(\".*[.]msgpack[.]yaml[.]pkl\")\n\n  private val snippetsDir: Path =\n    rootProjectDir.resolve(\"pkl-core/src/test/files/LanguageSnippetTests\")\n\n  protected val projectsDir: Path = snippetsDir.resolve(\"input/projects\")\n\n  private val expectedOutputDir: Path = snippetsDir.resolve(\"output\")\n\n  /**\n   * Convenience for development; this selects which snippet test(s) to run. There is a\n   * (non-language-snippet) test to make sure this is `\"\"` before commit.\n   */\n  // language=regexp\n  internal val selection: String = \"\"\n\n  protected val packageServer: PackageServer = PackageServer()\n\n  override val includedTests: List<Regex> = listOf(Regex(\".*$selection\\\\.pkl\"))\n\n  override val excludedTests: List<Regex> = buildList {\n    add(Regex(\".*/native/.*\"))\n    if (IoUtils.isWindows()) {\n      addAll(windowsExcludedTests)\n    }\n\n    // on experimental JVM versions, exclude tests which are known to be incompatible\n    addAll(exclusionsForThisJvm())\n  }\n\n  override val inputDir: Path = snippetsDir.resolve(\"input\")\n\n  override val isInputFile: (Path) -> Boolean = { it.isRegularFile() }\n\n  protected tailrec fun Path.getProjectDir(): Path? =\n    if (Files.exists(this.resolve(\"PklProject\"))) this else parent?.getProjectDir()\n\n  override fun expectedOutputFileFor(inputFile: Path): Path {\n    val relativePath = IoUtils.relativize(inputFile, inputDir).toString()\n    val stdoutPath =\n      if (relativePath.matches(hiddenExtensionRegex)) relativePath.dropLast(4)\n      else relativePath.dropLast(3) + \"pcf\"\n    return expectedOutputDir.resolve(stdoutPath)\n  }\n\n  override fun beforeAll() {\n    // disable SHA verification for packages\n    IoUtils.setTestMode()\n  }\n\n  override fun afterAll() {\n    packageServer.close()\n  }\n\n  private val replacement by lazy {\n    if (snippetsDir.root.toString() != \"/\") \"\\$snippetsDir\" else \"/\\$snippetsDir\"\n  }\n\n  protected fun ByteArray.decodeOutput(inputFile: Path): String =\n    if (inputFile.toString().matches(msgpackExtensionRegex)) MessagePackDebugRenderer(this).output\n    else toString(StandardCharsets.UTF_8)\n\n  protected fun String.stripFilePaths(): String =\n    replace(IoUtils.toNormalizedPathString(snippetsDir), replacement)\n\n  protected fun String.stripLineNumbers(): String =\n    replace(lineNumberRegex) { result ->\n        // replace line number with equivalent number of 'x' characters to keep formatting intact\n        (result.groups[1]!!.value) + \"x\".repeat(result.groups[3]!!.value.length) + \" |\"\n      }\n      .replace(locationLineNumberRegex) { result ->\n        \"#L\" + \"X\".repeat(result.groups[1]!!.value.length)\n      }\n      .replace(reflectedDeclarationLineNumberRegex) { result ->\n        \"line = \" + \"X\".repeat(result.groups[1]!!.value.length)\n      }\n\n  protected fun String.stripWebsite(): String =\n    replace(Release.current().documentation().homepage(), \"https://\\$pklWebsite/\")\n\n  // can't think of a better solution right now\n  protected fun String.stripVersionCheckErrorMessage(): String =\n    replace(\"Pkl version is ${Release.current().version()}\", \"Pkl version is xxx\")\n\n  protected fun String.stripStdlibLocationSha(): String {\n    // Logic must be kept in-sync with `doc-package-info.pkl`.\n    val commitIsh =\n      if (Release.current().version().isNormal) Release.current().version()\n      else Release.current().commitId()\n    return replace(\n      \"https://github.com/apple/pkl/blob/${commitIsh}/stdlib/\",\n      \"https://github.com/apple/pkl/blob/\\$commitId/stdlib/\",\n    )\n  }\n\n  protected fun String.withUnixLineEndings(): String {\n    return if (System.lineSeparator() == \"\\r\\n\") replace(\"\\r\\n\", \"\\n\") else this\n  }\n}\n\nclass LanguageSnippetTestsEngine : AbstractLanguageSnippetTestsEngine() {\n  private fun evaluatorBuilder(): EvaluatorBuilder {\n    return EvaluatorBuilder.preconfigured()\n      .setLogger(Loggers.stdErr())\n      .setStackFrameTransformer(StackFrameTransformers.empty)\n      // used by some tests\n      .setEnvironmentVariables(\n        mapOf(\n          \"NAME1\" to \"value1\",\n          \"NAME2\" to \"value2\",\n          \"/foo/bar\" to \"foobar\",\n          \"foo bar\" to \"foo bar\",\n          \"file:///foo/bar\" to \"file:///foo/bar\",\n        )\n      )\n      .setExternalProperties(\n        mapOf(\"name1\" to \"value1\", \"name2\" to \"value2\", \"/foo/bar\" to \"foobar\")\n      )\n      .setModuleCacheDir(null)\n      .setHttpClient(\n        HttpClient.builder()\n          .setTestPort(packageServer.port)\n          .addCertificates(FileTestUtils.selfSignedCertificate)\n          .buildLazily()\n      )\n      .setPowerAssertionsEnabled(true)\n  }\n\n  override val testClass: KClass<*> = LanguageSnippetTests::class\n\n  override fun generateOutputFor(inputFile: Path): kotlin.Pair<Boolean, String> {\n    val logWriter = StringWriter()\n\n    val (success, output) =\n      try {\n        val evaluator =\n          evaluatorBuilder()\n            .setLogger(Loggers.writer(PrintWriter(logWriter)))\n            .apply {\n              if (inputFile.startsWith(projectsDir)) {\n                val projectDir = inputFile.getProjectDir() ?: return@apply\n                val project =\n                  Project.loadFromPath(\n                    projectDir.resolve(\"PklProject\"),\n                    SecurityManagers.defaultManager,\n                    null,\n                    StackFrameTransformers.empty,\n                    mapOf(),\n                    true, // enable power assertions for tests\n                  )\n                securityManager = null\n                applyFromProject(project)\n              }\n            }\n            .build()\n        evaluator.use { ev ->\n          true to\n            ev\n              .evaluateOutputBytes(ModuleSource.path(inputFile))\n              .decodeOutput(inputFile)\n              .stripLineNumbers()\n        }\n      } catch (e: PklBugException) {\n        false to e.stackTraceToString()\n      } catch (e: PklException) {\n        false to e.message!!.stripLineNumbers().stripVersionCheckErrorMessage()\n      }\n\n    val stderr = logWriter.toString().withUnixLineEndings()\n\n    return (success && stderr.isBlank()) to\n      (output + stderr).stripFilePaths().stripWebsite().stripStdlibLocationSha()\n  }\n}\n\nabstract class AbstractNativeLanguageSnippetTestsEngine : AbstractLanguageSnippetTestsEngine() {\n  abstract val pklExecutablePath: Path\n\n  override val excludedTests: List<Regex> =\n    listOf(\n      // exclude test that loads module from class path (there is no class path when using native\n      // executable)\n      // on the other hand, don't exclude /native/\n      Regex(\".*/import1b\\\\.pkl\"),\n      // URIs get rendered slightly differently (percent-encoded vs raw)\n      Regex(\".*日本語_error\\\\.pkl\"),\n    ) + exclusionsForThisJvm()\n\n  /** Avoid running tests for native binaries when those native binaries have not been built. */\n  override fun discover(\n    discoveryRequest: EngineDiscoveryRequest,\n    uniqueId: UniqueId,\n  ): TestDescriptor {\n    if (!pklExecutablePath.exists()) {\n      // return empty descriptor w/o children\n      return EngineDescriptor(uniqueId, javaClass.simpleName)\n    }\n\n    return super.discover(discoveryRequest, uniqueId)\n  }\n\n  override fun generateOutputFor(inputFile: Path): kotlin.Pair<Boolean, String> {\n    val args = buildList {\n      add(pklExecutablePath.toString())\n      add(\"eval\")\n      add(\"--no-cache\")\n      if (inputFile.startsWith(projectsDir)) {\n        val projectDir = inputFile.getProjectDir()\n        if (projectDir != null) {\n          add(\"--project-dir\")\n          add(projectDir.toString())\n        }\n      } else {\n        add(\"--no-project\")\n        add(\"--property\")\n        add(\"name1=value1\")\n        add(\"--property\")\n        add(\"name2=value2\")\n        add(\"--property\")\n        add(\"/foo/bar=foobar\")\n        add(\"--env-var\")\n        add(\"NAME1=value1\")\n        add(\"--env-var\")\n        add(\"NAME2=value2\")\n        add(\"--env-var\")\n        add(\"/foo/bar=foobar\")\n        add(\"--env-var\")\n        add(\"foo bar=foo bar\")\n        add(\"--env-var\")\n        add(\"file:///foo/bar=file:///foo/bar\")\n      }\n      add(\"--settings\")\n      add(\"pkl:settings\")\n      add(\"--ca-certificates\")\n      add(FileTestUtils.selfSignedCertificate.toString())\n      add(\"--test-mode\")\n      add(\"--test-port\")\n      add(packageServer.port.toString())\n      add(inputFile.toString())\n    }\n\n    val builder = ProcessBuilder().command(args)\n\n    val process = builder.start()\n    return try {\n      val out = process.inputStream.readAllBytes().decodeOutput(inputFile).withUnixLineEndings()\n      val err =\n        process.errorStream.readAllBytes().toString(StandardCharsets.UTF_8).withUnixLineEndings()\n      val success = process.waitFor() == 0 && err.isBlank()\n      success to\n        (out + err)\n          .stripFilePaths()\n          .stripLineNumbers()\n          .stripWebsite()\n          .stripVersionCheckErrorMessage()\n          .stripStdlibLocationSha()\n    } finally {\n      process.destroy()\n    }\n  }\n}\n\nclass MacAmd64LanguageSnippetTestsEngine : AbstractNativeLanguageSnippetTestsEngine() {\n  override val pklExecutablePath: Path = Executables.pkl.macAmd64\n  override val testClass: KClass<*> = MacLanguageSnippetTests::class\n}\n\nclass MacAarch64LanguageSnippetTestsEngine : AbstractNativeLanguageSnippetTestsEngine() {\n  override val pklExecutablePath: Path = Executables.pkl.macAarch64\n  override val testClass: KClass<*> = MacLanguageSnippetTests::class\n}\n\nclass LinuxAmd64LanguageSnippetTestsEngine : AbstractNativeLanguageSnippetTestsEngine() {\n  override val pklExecutablePath: Path = Executables.pkl.linuxAmd64\n  override val testClass: KClass<*> = LinuxLanguageSnippetTests::class\n}\n\nclass LinuxAarch64LanguageSnippetTestsEngine : AbstractNativeLanguageSnippetTestsEngine() {\n  override val pklExecutablePath: Path = Executables.pkl.linuxAarch64\n  override val testClass: KClass<*> = LinuxLanguageSnippetTests::class\n}\n\nclass AlpineLanguageSnippetTestsEngine : AbstractNativeLanguageSnippetTestsEngine() {\n  override val pklExecutablePath: Path = Executables.pkl.alpineAmd64\n  override val testClass: KClass<*> = AlpineLanguageSnippetTests::class\n}\n\nprivate val windowsExcludedTests\n  get() =\n    listOf(\n      // error message contains different file path on Windows\n      Regex(\".*missingProjectDeps/bug\\\\.pkl\"),\n      // URIs get rendered slightly differently (percent-encoded vs raw)\n      Regex(\".*日本語_error\\\\.pkl\"),\n    )\n\nprivate val windowsNativeExcludedTests\n  get() =\n    listOf(\n      // CLI args on Windows turn into `?` when in native image\n      // https://github.com/oracle/graal/issues/8593\n      Regex(\".*日本語\\\\.pkl\")\n    )\n\nclass WindowsLanguageSnippetTestsEngine : AbstractNativeLanguageSnippetTestsEngine() {\n  override val pklExecutablePath: Path = Executables.pkl.windowsAmd64\n  override val testClass: KClass<*> = WindowsLanguageSnippetTests::class\n  override val excludedTests: List<Regex>\n    get() = super.excludedTests + windowsNativeExcludedTests + windowsExcludedTests\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PClassInfoTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass PClassInfoTest {\n  @Test\n  fun `standard type`() {\n    val info = PClassInfo.get(\"pkl.base\", \"Duration\", URI(\"pkl:base\"))\n    assertThat(info.moduleName).isEqualTo(\"pkl.base\")\n    assertThat(info.simpleName).isEqualTo(\"Duration\")\n    assertThat(info.qualifiedName).isEqualTo(\"pkl.base#Duration\")\n    assertThat(info.displayName).isEqualTo(\"Duration\")\n    assertThat(info.toString()).isEqualTo(\"Duration\")\n    assertThat(info.javaClass).isEqualTo(Duration::class.java)\n    assertThat(info.moduleUri).isEqualTo(URI(\"pkl:base\"))\n  }\n\n  @Test\n  fun `user-defined type`() {\n    val uri = URI.create(\"my:person\")\n    val info = PClassInfo.get(\"my\", \"Person\", uri)\n    assertThat(info.moduleName).isEqualTo(\"my\")\n    assertThat(info.simpleName).isEqualTo(\"Person\")\n    assertThat(info.qualifiedName).isEqualTo(\"my#Person\")\n    assertThat(info.displayName).isEqualTo(\"my#Person\")\n    assertThat(info.toString()).isEqualTo(\"my#Person\")\n    assertThat(info.javaClass).isEqualTo(PObject::class.java)\n    assertThat(info.moduleUri).isEqualTo(uri)\n  }\n\n  @Test\n  fun isExactTypeOf() {\n    assertThat(PClassInfo.Any.isExactClassOf(Object())).isFalse\n    assertThat(PClassInfo.Typed.isExactClassOf(Object())).isFalse\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PListRendererTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.StringWriter\nimport javax.xml.parsers.DocumentBuilderFactory\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.util.IoUtils\nimport org.xml.sax.ErrorHandler\nimport org.xml.sax.InputSource\nimport org.xml.sax.SAXParseException\n\nclass PListRendererTest {\n  @Test\n  fun `render document`() {\n    val evaluator = Evaluator.preconfigured()\n    val module = evaluator.evaluate(ModuleSource.modulePath(\"org/pkl/core/rendererTest.pkl\"))\n    val writer = StringWriter()\n    val renderer = ValueRenderers.plist(writer, \"  \")\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n    val expected = IoUtils.readClassPathResourceAsString(javaClass, \"rendererTest.plist\")\n\n    assertThat(output.trim()).isEqualTo(expected.trim())\n\n    parseAndValidateRenderedDocument(output)\n  }\n\n  @Test\n  fun `rendered document ends in newline`() {\n    val module = Evaluator.preconfigured().evaluate(ModuleSource.text(\"foo { bar = 0 }\"))\n\n    val writer = StringWriter()\n    ValueRenderers.plist(writer, \"  \").renderDocument(module)\n    assertThat(writer.toString()).endsWith(\"\\n\")\n  }\n\n  private fun parseAndValidateRenderedDocument(output: String) {\n    val builderFactory = DocumentBuilderFactory.newInstance().apply { isValidating = true }\n\n    val builder =\n      builderFactory.newDocumentBuilder().apply {\n        setEntityResolver { _, _ ->\n          InputSource(PListRendererTest::class.java.getResourceAsStream(\"PropertyList-1.0.dtd\"))\n        }\n        setErrorHandler(\n          object : ErrorHandler {\n            override fun warning(exception: SAXParseException) {\n              throw exception\n            }\n\n            override fun error(exception: SAXParseException) {\n              throw exception\n            }\n\n            override fun fatalError(exception: SAXParseException) {\n              throw exception\n            }\n          }\n        )\n      }\n\n    builder.parse(output.byteInputStream())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PModuleTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass PModuleTest {\n  private val moduleUri = URI(\"modulepath:/module/uri.pkl\")\n  private val moduleName = \"test.module\"\n  private val classInfo = PClassInfo.forModuleClass(\"test\", moduleUri)\n  private val properties = mapOf(\"name\" to \"Pigeon\", \"age\" to 42)\n  private val pigeon = PModule(moduleUri, moduleName, classInfo, properties)\n\n  @Test\n  fun `getProperties()`() {\n    assertThat(pigeon.properties).isSameAs(properties)\n  }\n\n  @Test\n  fun `getProperty()`() {\n    assertThat(pigeon.getProperty(\"name\")).isEqualTo(\"Pigeon\")\n    assertThat(pigeon.getProperty(\"age\")).isEqualTo(42)\n  }\n\n  @Test\n  fun `get unknown property`() {\n    val e = assertThrows<NoSuchPropertyException> { pigeon.getProperty(\"other\") }\n\n    assertThat(e)\n      .hasMessage(\n        \"Module `test.module` does not have a property \" +\n          \"named `other`. Available properties: [name, age]\"\n      )\n  }\n\n  @Test\n  fun `hasProperty()`() {\n    assertThat(pigeon.hasProperty(\"name\")).isTrue\n    assertThat(pigeon.hasProperty(\"age\")).isTrue\n    assertThat(pigeon.hasProperty(\"other\")).isFalse\n  }\n\n  @Test\n  fun `accept()`() {\n    var objectVisited = false\n    var moduleVisited = false\n\n    val visitor =\n      object : ValueVisitor {\n        override fun visitObject(value: PObject) {\n          objectVisited = true\n        }\n\n        override fun visitModule(value: PModule) {\n          moduleVisited = true\n        }\n      }\n\n    pigeon.accept(visitor)\n\n    assertThat(objectVisited).isFalse\n    assertThat(moduleVisited).isTrue\n  }\n\n  @Test\n  fun `equals() and hashCode()`() {\n    assertThat(pigeon).isEqualTo(pigeon)\n    assertThat(pigeon.hashCode()).isEqualTo(pigeon.hashCode())\n\n    val pigeon2 = PModule(moduleUri, moduleName, classInfo, HashMap(properties))\n\n    assertThat(pigeon2).isEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - different module uri`() {\n    val pigeon2 = PModule(URI(\"other/module\"), moduleName, classInfo, properties)\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - different module name`() {\n    val pigeon2 = PModule(moduleUri, \"other.module\", classInfo, properties)\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - different property value`() {\n    val pigeon2 = PModule(moduleUri, moduleName, classInfo, mapOf(\"name\" to \"Pigeon\", \"age\" to 21))\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - missing property`() {\n    val pigeon2 = PModule(moduleUri, moduleName, classInfo, mapOf(\"name\" to \"Pigeon\"))\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - extra property`() {\n    val pigeon2 =\n      PModule(\n        moduleUri,\n        moduleName,\n        classInfo,\n        mapOf(\"name\" to \"Pigeon\", \"age\" to 42, \"other\" to true),\n      )\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `toString()`() {\n    assertThat(pigeon.toString()).isEqualTo(\"test.module { name = Pigeon; age = 42 }\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PNullTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass PNullTest {\n  @Test\n  fun basics() {\n    assertThat(PNull.getInstance()).isEqualTo(PNull.getInstance())\n    assertThat(PNull.getInstance().hashCode()).isEqualTo(PNull.getInstance().hashCode())\n    assertThat(PNull.getInstance().classInfo).isEqualTo(PClassInfo.Null)\n    assertThat(PNull.getInstance().toString()).isEqualTo(\"null\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PObjectTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass PObjectTest {\n  private val testUri = URI(\"repl:test\")\n  private val classInfo = PClassInfo.get(\"test\", \"Person\", testUri)\n  private val properties = mapOf(\"name\" to \"Pigeon\", \"age\" to 42)\n  private val pigeon = PObject(classInfo, properties)\n\n  @Test\n  fun `getPClassInfo()`() {\n    assertThat(pigeon.classInfo).isSameAs(classInfo)\n  }\n\n  @Test\n  fun `getProperties()`() {\n    assertThat(pigeon.properties).isSameAs(properties)\n  }\n\n  @Test\n  fun `getProperty()`() {\n    assertThat(pigeon.getProperty(\"name\")).isEqualTo(\"Pigeon\")\n    assertThat(pigeon.getProperty(\"age\")).isEqualTo(42)\n  }\n\n  @Test\n  fun `get unknown property`() {\n    val e = assertThrows<NoSuchPropertyException> { pigeon.getProperty(\"other\") }\n\n    assertThat(e)\n      .hasMessage(\n        \"Object of type `test#Person` does not have a property \" +\n          \"named `other`. Available properties: [name, age]\"\n      )\n  }\n\n  @Test\n  fun `hasProperty()`() {\n    assertThat(pigeon.hasProperty(\"name\")).isTrue\n    assertThat(pigeon.hasProperty(\"age\")).isTrue\n    assertThat(pigeon.hasProperty(\"other\")).isFalse\n  }\n\n  @Test\n  fun `accept()`() {\n    var objectVisited = false\n    var moduleVisited = false\n\n    val visitor =\n      object : ValueVisitor {\n        override fun visitObject(value: PObject) {\n          objectVisited = true\n        }\n\n        override fun visitModule(value: PModule) {\n          moduleVisited = true\n        }\n      }\n\n    pigeon.accept(visitor)\n\n    assertThat(objectVisited).isTrue\n    assertThat(moduleVisited).isFalse\n  }\n\n  @Test\n  fun `equals() and hashCode()`() {\n    assertThat(pigeon).isEqualTo(pigeon)\n    assertThat(pigeon.hashCode()).isEqualTo(pigeon.hashCode())\n\n    val pigeon2 = PObject(PClassInfo.get(\"test\", \"Person\", URI(\"repl:test\")), HashMap(properties))\n\n    assertThat(pigeon2).isEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - different type`() {\n    val pigeon2 = PObject(PClassInfo.get(\"test\", \"Other\", URI(\"repl:Other\")), properties)\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - different property value`() {\n    val pigeon2 =\n      PObject(\n        PClassInfo.get(\"test\", \"Person\", URI(\"repl:test\")),\n        mapOf(\"name\" to \"Pigeon\", \"age\" to 21),\n      )\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - missing property`() {\n    val pigeon2 =\n      PObject(PClassInfo.get(\"test\", \"Person\", URI(\"repl:test\")), mapOf(\"name\" to \"Pigeon\"))\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `non-equal - extra property`() {\n    val pigeon2 =\n      PObject(\n        PClassInfo.get(\"test\", \"Person\", URI(\"repl:test\")),\n        mapOf(\"name\" to \"Pigeon\", \"age\" to 42, \"other\" to true),\n      )\n\n    assertThat(pigeon2).isNotEqualTo(pigeon)\n    assertThat(pigeon2.hashCode()).isNotEqualTo(pigeon.hashCode())\n  }\n\n  @Test\n  fun `toString()`() {\n    assertThat(pigeon.toString()).isEqualTo(\"test#Person { name = Pigeon; age = 42 }\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PairTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass PairTest {\n  @Test\n  fun basics() {\n    val pair = Pair(3, \"five\")\n    assertThat(pair.first).isEqualTo(3)\n    assertThat(pair.second).isEqualTo(\"five\")\n    assertThat(pair.toString()).isEqualTo(\"Pair(3, five)\")\n    assertThat(pair.classInfo).isEqualTo(PClassInfo.Pair)\n  }\n\n  @Test\n  fun iterator() {\n    val pair = Pair(3, \"five\")\n    val iterator = pair.iterator()\n    assertThat(iterator.next()).isEqualTo(3)\n    assertThat(iterator.next()).isEqualTo(\"five\")\n    assertThrows<NoSuchElementException> { iterator.next() }\n  }\n\n  @Test\n  fun equals() {\n    val pair1 = Pair(3, \"five\")\n    val pair2 = Pair(3, \"five\")\n    val pair3 = Pair(\"five\", 3)\n\n    assertThat(pair1).isEqualTo(pair1)\n    assertThat(pair1).isEqualTo(pair2)\n    assertThat(pair2).isEqualTo(pair1)\n\n    assertThat(pair1).isNotEqualTo(pair3)\n    assertThat(pair3).isNotEqualTo(pair2)\n  }\n\n  @Test\n  fun hash() {\n    val pair1 = Pair(3, \"five\")\n    val pair2 = Pair(\"five\", 3)\n\n    assertThat(pair1.hashCode()).isEqualTo(pair1.hashCode())\n\n    assertThat(pair1.hashCode()).isNotEqualTo(pair2.hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PcfRendererTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.StringWriter\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.util.IoUtils\n\nclass PcfRendererTest {\n  private val writer = StringWriter()\n  private val renderer = ValueRenderers.pcf(writer, \"  \", false, false)\n\n  @Test\n  fun `render document`() {\n    val evaluator = Evaluator.preconfigured()\n    val module = evaluator.evaluate(ModuleSource.modulePath(\"org/pkl/core/rendererTest.pkl\"))\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n    val expected = IoUtils.readClassPathResourceAsString(javaClass, \"rendererTest.pcf\")\n\n    assertThat(output.trim()).isEqualTo(expected.trim())\n\n    // TODO: make pcf a pkl subset again\n    // assertThatCode { evaluator.evaluateText(output) }.doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `rendered document ends in newline`() {\n    val module =\n      EvaluatorBuilder.preconfigured().build().evaluate(ModuleSource.text(\"foo { bar = 0 }\"))\n\n    val writer = StringWriter()\n    ValueRenderers.pcf(writer, \"  \", false, false).renderDocument(module)\n    assertThat(writer.toString()).endsWith(\"\\n\")\n  }\n\n  @Test\n  fun `rendering with and without null properties`() {\n    val cases =\n      listOf(\n        true to\n          \"\"\"\n          baz {\n            qux = 42\n            corge = List(null, 1337, null, \"Hello World\")\n            grault = Map(\"garply\", null, \"waldo\", 42, \"pigeon\", null)\n          }\n        \"\"\"\n            .trimIndent(),\n        false to\n          \"\"\"\n          foo = null\n          bar = null\n          baz {\n            qux = 42\n            quux = null\n            corge = List(null, 1337, null, \"Hello World\")\n            grault = Map(\"garply\", null, \"waldo\", 42, \"pigeon\", null)\n          }\n        \"\"\"\n            .trimIndent(),\n      )\n\n    val module =\n      Evaluator.preconfigured()\n        .evaluate(\n          ModuleSource.text(\n            \"\"\"\n        foo = null\n        bar = null\n        baz {\n          qux = 42\n          quux = null\n          corge = new Listing {\n            null\n            1337\n            null\n            \"Hello World\"\n          }\n          grault = new Mapping {\n            [\"garply\"] = null\n            [\"waldo\"] = 42\n            [\"pigeon\"] = null\n          }\n        }\n      \"\"\"\n              .trimIndent()\n          )\n        )\n    for ((omitNullProperties, expected) in cases) {\n      val writer = StringWriter()\n      ValueRenderers.pcf(writer, \"  \", omitNullProperties, false).renderDocument(module)\n      assertThat(writer.toString().trim()).isEqualTo(expected)\n    }\n  }\n\n  // TODO: ada\n  // can happen in REPL or when rendering manually constructed container\n  /*  @Test\n  fun `render container with unevaluated element`() {\n    renderer.renderValue(PObject(PClassInfo.Mapping, mapOf(\"one\" to 1L, \"two\" to null)))\n\n    assertThat(writer.toString().trim()).isEqualTo(\"\"\"\n      {\n        one = 1\n        two = ?\n      }\n    \"\"\".trimIndent())\n  }*/\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PklBinaryDecoderTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport java.util.regex.Pattern\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.util.pklbinary.PklBinaryCode\n\nclass PklBinaryDecoderTest {\n  @Test\n  fun `decoding succeeds`() {\n    val moduleUri = URI.create(\"file:///\\$snippetsDir/input/api/encoding1.msgpack.yaml.pkl\")\n    // based on pkl-core/src/test/files/LanguageSnippetTests/input/api/encoding1.msgpack.yaml.pkl\n    // but Class, TypeAlias, and IntSeq values are nil'd\n    // and any module URIs are normalized to use $snippetsDir instead of an absoulute path\n    val inputStream = javaClass.getResourceAsStream(\"pklBinaryDecoderTest.msgpack\")\n    assertThat(inputStream).isNotNull\n    val decoded = PklBinaryDecoder.decode(inputStream!!.readAllBytes())\n    val expected =\n      PObject(\n        PClassInfo.get(\"encoding1\", \"Foo\", moduleUri),\n        mapOf(\n          \"dynamic\" to PObject(PClassInfo.Dynamic, mapOf(\"hello\" to \"world\", \"0\" to \"hello world\")),\n          \"string\" to \"foo\",\n          \"map\" to mapOf(\"foo\" to \"bar\"),\n          \"mapping\" to mapOf(\"foo\" to \"bar\"),\n          \"list\" to listOf(\"foo\", \"bar\"),\n          \"listing\" to listOf(\"foo\", 0L),\n          \"set\" to setOf(\"foo\", \"bar\"),\n          \"duration\" to Duration(123.0, DurationUnit.HOURS),\n          \"dataSize\" to DataSize(123.0, DataSizeUnit.GIBIBYTES),\n          \"pair\" to Pair(\"foo\", \"bar\"),\n          \"intSeq\" to PNull.getInstance(), // IntSeq is not exportable\n          \"regex\" to\n            (decoded as PObject).getProperty(\"regex\"), // asserted below == Pattern.compile(\"foo.*\")\n          \"func\" to PNull.getInstance(), // Function is not encodable or decodable\n          \"bytes\" to\n            decoded.getProperty(\"bytes\"), // asserted below == byteArrayOf(0x01, 0x02, 0x03)\n          \"moduleClass\" to PNull.getInstance(), // PClass is not decodable\n          \"baseModuleClass\" to PNull.getInstance(), // PClass is not decodable\n          \"encodingModuleClass\" to PNull.getInstance(), // PClass is not decodable\n          \"stdlibClass\" to PNull.getInstance(), // PClass is not decodable\n          \"someClass\" to PNull.getInstance(), // PClass is not decodable\n          \"stdlibTypealias\" to PNull.getInstance(), // TypeAlias is not decodable\n          \"someTypealias\" to PNull.getInstance(), // TypeAlias is not decodable\n          \"something\" to\n            PObject(\n              PClassInfo.get(\"pkl.base\", \"PcfRenderer\", PClassInfo.pklBaseUri),\n              mapOf(\n                \"converters\" to emptyMap<Object, Object>(),\n                \"extension\" to \"pcf\",\n                \"indent\" to \"  \",\n                \"omitNullProperties\" to false,\n                \"useCustomStringDelimiters\" to false,\n              ),\n            ),\n        ),\n      )\n\n    assertThat(decoded).isEqualTo(expected)\n    assertThat((decoded.getProperty(\"regex\") as Pattern).pattern()).isEqualTo(\"foo.*\")\n    assertThat(decoded.getProperty(\"bytes\") as ByteArray).isEqualTo(byteArrayOf(0x01, 0x02, 0x03))\n  }\n\n  private val strFoo =\n    byteArrayOf(0xA3.toByte(), 'f'.code.toByte(), 'o'.code.toByte(), 'o'.code.toByte())\n  private val doubleZero =\n    byteArrayOf(0xcb.toByte(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)\n\n  fun assertExceptionCauseMessageContains(bytes: ByteArray, msg: String) {\n    val exc = assertThrows<RuntimeException> { PklBinaryDecoder.decode(bytes) }\n    assertThat(exc.cause).hasMessageContaining(msg)\n  }\n\n  @Test\n  fun `decoding of unsupported pkl types fails`() {\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x94.toByte(), PklBinaryCode.INTSEQ.code, 0x00, 0x04, 0x02),\n      \"Cannot decode IntSeq value\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.CLASS.code) + strFoo + strFoo,\n      \"Cannot decode Class value\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.TYPEALIAS.code) + strFoo + strFoo,\n      \"Cannot decode TypeAlias value\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x91.toByte(), PklBinaryCode.FUNCTION.code),\n      \"Cannot decode Function value\",\n    )\n  }\n\n  @Test\n  fun `decode unexpected eof`() {\n    // missing List element\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x92.toByte(), PklBinaryCode.LIST.code, 0x91.toByte()),\n      \"Unexpected EOF\",\n    )\n    // missing struct slot\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x92.toByte(), PklBinaryCode.LIST.code),\n      \"Unexpected EOF\",\n    )\n  }\n\n  @Test\n  fun `decode unexpected msgpack values`() {\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0xc4.toByte(), 0x00),\n      \"Unexpected msgpack bin value\",\n    )\n    assertExceptionCauseMessageContains(byteArrayOf(0x80.toByte()), \"Unexpected msgpack map value\")\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0xd4.toByte(), 0x00, 0x00),\n      \"Unexpected msgpack ext value\",\n    )\n  }\n\n  @Test\n  fun `decode invalid non-primitives`() {\n    // empty struct array\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x90.toByte()),\n      \"Unexpected empty object array value\",\n    )\n    // unrecognized code\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), 0xff.toByte()),\n      \"Unrecognized code 0xff\",\n    )\n    // unrecognized object code (member code)\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.ELEMENT.code, 0x00, 0x00),\n      \"Unrecognized object code ELEMENT\",\n    )\n  }\n\n  @Test\n  fun `decode invalid object`() {\n    // too few slots\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x91.toByte(), PklBinaryCode.OBJECT.code),\n      \"Expected OBJECT structure to have at least 4 slots, found 1\",\n    )\n    // blank class\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x94.toByte(), PklBinaryCode.OBJECT.code, 0xa0.toByte()) + strFoo,\n      \"Unexpected blank object class name\",\n    )\n    // blank module uri\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x94.toByte(), PklBinaryCode.OBJECT.code) + strFoo + byteArrayOf(0xa0.toByte()),\n      \"Unexpected blank object module URI\",\n    )\n    // unexpected member struct length\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x94.toByte(), PklBinaryCode.OBJECT.code) +\n        strFoo +\n        strFoo +\n        byteArrayOf(0x91.toByte(), 0x90.toByte()),\n      \"Expected 3 fields in object member, found 0\",\n    )\n    // unrecognized code in a member\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x94.toByte(), PklBinaryCode.OBJECT.code) +\n        strFoo +\n        strFoo +\n        byteArrayOf(0x91.toByte(), 0x93.toByte(), 0xff.toByte()),\n      \"Unrecognized code 0xff\",\n    )\n    // unrecognized member code (object code)\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x94.toByte(), PklBinaryCode.OBJECT.code) +\n        strFoo +\n        strFoo +\n        byteArrayOf(0x91.toByte(), 0x93.toByte(), PklBinaryCode.OBJECT.code),\n      \"Unrecognized member code OBJECT\",\n    )\n  }\n\n  @Test\n  fun `decode invalid units`() {\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.DURATION.code) + doubleZero + strFoo,\n      \"Invalid Duration unit `foo`\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.DATASIZE.code) + doubleZero + strFoo,\n      \"Invalid DataSize unit `foo`\",\n    )\n  }\n\n  @Test\n  fun `decode invalid types`() {\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.CLASS.code, 0xa0.toByte()) + strFoo,\n      \"Unexpected blank class name\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.CLASS.code) + strFoo + byteArrayOf(0xa0.toByte()),\n      \"Unexpected blank class module URI\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.TYPEALIAS.code, 0xa0.toByte()) + strFoo,\n      \"Unexpected blank typealias name\",\n    )\n    assertExceptionCauseMessageContains(\n      byteArrayOf(0x93.toByte(), PklBinaryCode.TYPEALIAS.code) +\n        strFoo +\n        byteArrayOf(0xa0.toByte()),\n      \"Unexpected blank typealias module URI\",\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PklInfoTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\nclass PklInfoTest {\n  @Test\n  fun `get current info`() {\n    assertThatCode { PklInfo.current() }.doesNotThrowAnyException()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PlatformTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\nclass PlatformTest {\n  @Test\n  fun `get current platform`() {\n    assertThatCode { Platform.current() }.doesNotThrowAnyException()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/PropertiesRendererTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.StringWriter\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.util.IoUtils\n\nclass PropertiesRendererTest {\n  @Test\n  fun `render document`() {\n    val evaluator = Evaluator.preconfigured()\n    val module =\n      evaluator.evaluate(ModuleSource.modulePath(\"org/pkl/core/propertiesRendererTest.pkl\"))\n    val writer = StringWriter()\n    val renderer = ValueRenderers.properties(writer, true, false)\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n    val expected =\n      IoUtils.readClassPathResourceAsString(javaClass, \"propertiesRendererTest.properties\")\n\n    assertThat(output).isEqualTo(expected)\n  }\n\n  @Test\n  fun `render unsupported document values`() {\n    val unsupportedValues =\n      listOf(\n        \"List()\",\n        \"new Listing {}\",\n        \"Map()\",\n        \"new Mapping {}\",\n        \"Set()\",\n        \"new PropertiesRenderer {}\",\n        \"new Dynamic {}\",\n      )\n\n    unsupportedValues.forEach {\n      val evaluator = Evaluator.preconfigured()\n      val renderer = ValueRenderers.properties(StringWriter(), true, false)\n\n      val module = evaluator.evaluate(ModuleSource.text(\"value = $it\"))\n      assertThrows<RendererException> { renderer.renderValue(module) }\n    }\n  }\n\n  @Test\n  fun `rendered document ends in newline`() {\n    val module = Evaluator.preconfigured().evaluate(ModuleSource.text(\"foo { bar = 0 }\"))\n\n    for (omitNullProperties in listOf(false, true)) {\n      for (restrictCharSet in listOf(false, true)) {\n        val writer = StringWriter()\n        ValueRenderers.properties(writer, omitNullProperties, restrictCharSet)\n          .renderDocument(module)\n        assertThat(writer.toString()).endsWith(\"\\n\")\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/ReleaseTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\nclass ReleaseTest {\n  @Test\n  fun `get current release`() {\n    assertThatCode { Release.current() }.doesNotThrowAnyException()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/ReplServerTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.commons.toPath\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.repl.ReplRequest\nimport org.pkl.core.repl.ReplResponse\nimport org.pkl.core.repl.ReplServer\nimport org.pkl.core.resource.ResourceReaders\n\nclass ReplServerTest {\n  private val server =\n    ReplServer(\n      SecurityManagers.defaultManager,\n      HttpClient.dummyClient(),\n      Loggers.stdErr(),\n      listOf(\n        ModuleKeyFactories.standardLibrary,\n        ModuleKeyFactories.classPath(this::class.java.classLoader),\n        ModuleKeyFactories.file,\n      ),\n      listOf(ResourceReaders.environmentVariable(), ResourceReaders.externalProperty()),\n      mapOf(\"NAME1\" to \"value1\", \"NAME2\" to \"value2\"),\n      mapOf(\"name1\" to \"value1\", \"name2\" to \"value2\"),\n      null,\n      null,\n      null,\n      \"/\".toPath(),\n      StackFrameTransformers.defaultTransformer,\n      false,\n      TraceMode.COMPACT,\n    )\n\n  @Test\n  fun `complete members of local property`() {\n    server.handleRequest(ReplRequest.Eval(\"id\", \"local foo = new { bar = 10 }\", false, false))\n    val responses = server.handleRequest(ReplRequest.Completion(\"id\", \"foo\"))\n\n    assertThat(responses.size).isEqualTo(1)\n\n    val response = responses[0]\n    assertThat(response).isInstanceOf(ReplResponse.Completion::class.java)\n\n    val completionResponse = response as ReplResponse.Completion\n    assertThat(completionResponse.members.toSortedSet())\n      .isEqualTo(\n        sortedSetOf(\n          \"default\",\n          \"bar\",\n          \"toList()\",\n          \"toMap()\",\n          \"getProperty(\",\n          \"getPropertyOrNull(\",\n          \"hasProperty(\",\n          \"ifNonNull(\",\n          \"length()\",\n          \"getClass()\",\n          \"toString()\",\n          \"toTyped(\",\n        )\n      )\n  }\n\n  @Test\n  fun `complete members of module import`() {\n    server.handleRequest(ReplRequest.Eval(\"id\", \"import \\\"pkl:test\\\"\", false, false))\n    val responses = server.handleRequest(ReplRequest.Completion(\"id\", \"test\"))\n\n    assertThat(responses.size).isEqualTo(1)\n\n    val response = responses[0]\n    assertThat(response).isInstanceOf(ReplResponse.Completion::class.java)\n\n    val completionResponse = response as ReplResponse.Completion\n    assertThat(completionResponse.members).apply {\n      contains(\"relativePathTo(\") // member of base.pkl\n      contains(\"catch(\") // member of test.pkl\n    }\n  }\n\n  @Test\n  fun `complete members of 'this' expression`() {\n    val responses1 =\n      server.handleRequest(ReplRequest.Eval(\"id\", \"x = 1; function f() = 3\", false, false))\n    assertThat(responses1.size).isEqualTo(0)\n\n    val responses2 = server.handleRequest(ReplRequest.Completion(\"id\", \"this\"))\n    assertThat(responses2.size).isEqualTo(1)\n\n    val response = responses2[0]\n    assertThat(response).isInstanceOf(ReplResponse.Completion::class.java)\n\n    val completionResponse = response as ReplResponse.Completion\n    assertThat(completionResponse.members.toSortedSet())\n      .isEqualTo(\n        sortedSetOf(\n          \"output\",\n          \"toDynamic()\",\n          \"toMap()\",\n          \"f()\",\n          \"x\",\n          \"ifNonNull(\",\n          \"getClass()\",\n          \"getProperty(\",\n          \"getPropertyOrNull(\",\n          \"hasProperty(\",\n          \"relativePathTo(\",\n          \"toString()\",\n        )\n      )\n  }\n\n  @Test\n  fun `complete members of empty expression`() {\n    server.handleRequest(ReplRequest.Eval(\"id\", \"x = 1\", false, false))\n    val responses = server.handleRequest(ReplRequest.Completion(\"id\", \"\"))\n\n    assertThat(responses.size).isEqualTo(1)\n\n    val response = responses[0]\n    assertThat(response).isInstanceOf(ReplResponse.Completion::class.java)\n\n    val completionResponse = response as ReplResponse.Completion\n    assertThat(completionResponse.members).apply {\n      contains(\"x\")\n      contains(\"Any\") // pkl.base class\n      contains(\"Regex(\") // pkl.base function\n      contains(\"Infinity\") // pkl.base property\n    }\n  }\n\n  @Test\n  fun `read environment variable`() {\n    val result = makeEvalRequest(\"\"\"read(\"env:NAME1\")\"\"\")\n    assertThat(result).isEqualTo(\"\\\"value1\\\"\")\n  }\n\n  @Test\n  fun `read external property`() {\n    val result = makeEvalRequest(\"\"\"read(\"prop:name1\")\"\"\")\n    assertThat(result).isEqualTo(\"\\\"value1\\\"\")\n  }\n\n  @Test\n  fun `replace untyped property with typed property`() {\n    val result = makeEvalRequest(\"timeout = 5.ms; timeout\")\n    assertThat(result).isEqualTo(\"5.ms\")\n\n    val result2 = makeEvalRequest(\"timeout = 10; timeout\")\n    assertThat(result2).isEqualTo(\"10\")\n\n    val result3 = makeEvalRequest(\"timeout: Duration = 8.ms; timeout\")\n    assertThat(result3).isEqualTo(\"8.ms\")\n\n    val result4 = makeFailingEvalRequest(\"timeout = 12; timeout\")\n    assertThat(result4).contains(\"Expected value of type `Duration`, but got type `Int`.\")\n  }\n\n  @Test\n  fun `replace untyped method with typed method`() {\n    val result = makeEvalRequest(\"function greet(name) = \\\"Hello, \\\\(name)!\\\"; greet(\\\"Pigeon\\\") \")\n    assertThat(result).isEqualTo(\"\\\"Hello, Pigeon!\\\"\")\n\n    val result2 = makeEvalRequest(\"\"\"greet(42)\"\"\")\n    assertThat(result2).isEqualTo(\"\\\"Hello, 42!\\\"\")\n\n    val result3 =\n      makeEvalRequest(\n        \"function greet(name: String): String = \\\"Hello, \\\\(name)!\\\"; greet(\\\"Pigeon\\\") \"\n      )\n    assertThat(result3).isEqualTo(\"\\\"Hello, Pigeon!\\\"\")\n\n    val result4 = makeFailingEvalRequest(\"\"\"greet(44)\"\"\")\n    assertThat(result4).contains(\"Expected value of type `String`, but got type `Int`.\")\n  }\n\n  @Test\n  fun `syntax highlighting on response values`() {\n    val server =\n      ReplServer(\n        SecurityManagers.defaultManager,\n        HttpClient.dummyClient(),\n        Loggers.stdErr(),\n        listOf(\n          ModuleKeyFactories.standardLibrary,\n          ModuleKeyFactories.classPath(this::class.java.classLoader),\n          ModuleKeyFactories.file,\n        ),\n        listOf(ResourceReaders.environmentVariable(), ResourceReaders.externalProperty()),\n        mapOf(\"NAME1\" to \"value1\", \"NAME2\" to \"value2\"),\n        mapOf(\"name1\" to \"value1\", \"name2\" to \"value2\"),\n        null,\n        null,\n        null,\n        \"/\".toPath(),\n        StackFrameTransformers.defaultTransformer,\n        true,\n        TraceMode.COMPACT,\n      )\n    val responses = server.handleRequest(ReplRequest.Eval(\"id\", \"5.ms\", false, false))\n    assertThat(responses).hasSize(1)\n    val response = responses[0]\n\n    assertThat(response).isInstanceOf(ReplResponse.EvalSuccess::class.java)\n    assertThat((response as ReplResponse.EvalSuccess).result).isEqualTo(\"\\u001B[32m5\\u001B[0m.ms\")\n  }\n\n  private fun makeEvalRequest(text: String): String {\n    val responses = server.handleRequest(ReplRequest.Eval(\"id\", text, false, false))\n\n    assertThat(responses).hasSize(1)\n    val response = responses[0]\n    assertThat(response).isInstanceOf(ReplResponse.EvalSuccess::class.java)\n\n    val successResponse = response as ReplResponse.EvalSuccess\n    return successResponse.result\n  }\n\n  private fun makeFailingEvalRequest(text: String): String {\n    val responses = server.handleRequest(ReplRequest.Eval(\"id\", text, false, false))\n\n    assertThat(responses).hasSize(1)\n    val response = responses[0]\n    assertThat(response).isInstanceOf(ReplResponse.EvalError::class.java)\n\n    val errorResponse = response as ReplResponse.EvalError\n    return errorResponse.message\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/RepositoryHygiene.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.nio.file.Path\nimport java.util.stream.Collectors\nimport kotlin.io.path.extension\nimport kotlin.io.path.isRegularFile\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.walk\n\n/**\n * These tests don't assert Pkl's implementation correctness, but rather that no debugging settings\n * remain in the code.\n */\nclass RepositoryHygiene {\n  @Test\n  fun `no remaining language snippet test selection`() {\n    assertThat(LanguageSnippetTestsEngine().selection).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `no output files exists for language snippets without an input`() {\n    val input = snippetsFolder.resolve(\"input\")\n    val inputs =\n      input\n        .walk()\n        .filter { it.extension == \"pkl\" }\n        .map {\n          val path = input.relativize(it).toString()\n          inputRegex.replace(path, \"$1$2\")\n        }\n        .collect(Collectors.toSet())\n\n    val output = snippetsFolder.resolve(\"output\")\n    output\n      .walk()\n      .filter { it.isRegularFile() }\n      .forEach {\n        val out = output.relativize(it).toString()\n        checkOutputHasInput(inputs, out)\n      }\n  }\n\n  private fun checkOutputHasInput(inputs: Set<String>, output: String) {\n    val fileTocheck = outputRegex.replace(output, \"$1.pkl\")\n    assertThat(inputs).contains(fileTocheck)\n  }\n\n  private val snippetsFolder: Path by lazy {\n    FileTestUtils.rootProjectDir.resolve(\"pkl-core/src/test/files/LanguageSnippetTests\")\n  }\n\n  companion object {\n    private val inputRegex = Regex(\"(.*)\\\\.[^.]*(\\\\.pkl)\")\n    private val outputRegex = Regex(\"(.*)\\\\.[^.]+$\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/SecurityManagersTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.util.regex.Pattern\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.catchThrowable\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.toPath\n\nclass SecurityManagersTest {\n  private val manager =\n    SecurityManagers.standard(\n      listOf(Pattern.compile(\"test:foo/bar\")),\n      listOf(Pattern.compile(\"env:FOO_BAR\")),\n      { uri -> if (uri.scheme == \"one\") 1 else if (uri.scheme == \"two\") 2 else 0 },\n      null,\n    )\n\n  @Test\n  fun `checkResolveModule() - complete match`() {\n    val e = catchThrowable { manager.checkResolveModule(URI(\"test:foo/bar\")) }\n    assertThat(e).doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `checkResolveModule() - partial match from start`() {\n    val e = catchThrowable { manager.checkResolveModule(URI(\"test:foo/bar/baz\")) }\n    assertThat(e).doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `checkResolveModule() - partial match not from start`() {\n    assertThrows<SecurityManagerException> { manager.checkResolveModule(URI(\"other:test:foo/bar\")) }\n  }\n\n  @Test\n  fun `checkResolveModule() - no match`() {\n    assertThrows<SecurityManagerException> { manager.checkResolveModule(URI(\"other:uri\")) }\n  }\n\n  @Test\n  fun `checkResolveModule() - no match #2`() {\n    assertThrows<SecurityManagerException> { manager.checkResolveModule(URI(\"test:foo/baz\")) }\n  }\n\n  @Test\n  fun `checkReadResource() - complete match`() {\n    val e = catchThrowable { manager.checkReadResource(URI(\"env:FOO_BAR\")) }\n    assertThat(e).doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `checkReadResource() - partial match from start`() {\n    val e = catchThrowable { manager.checkReadResource(URI(\"env:FOO_BAR_BAZ\")) }\n    assertThat(e).doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `checkReadResource() - partial match not from start`() {\n    assertThrows<SecurityManagerException> { manager.checkReadResource(URI(\"other:env:FOO_BAR\")) }\n  }\n\n  @Test\n  fun `checkReadResource() - no match`() {\n    assertThrows<SecurityManagerException> { manager.checkReadResource(URI(\"other:uri\")) }\n  }\n\n  @Test\n  fun `checkReadResource() - no match #2`() {\n    assertThrows<SecurityManagerException> { manager.checkReadResource(URI(\"env:FOO_BAZ\")) }\n  }\n\n  @Test\n  fun `checkImportModule() - same trust level`() {\n    val e = catchThrowable { manager.checkImportModule(URI(\"one:foo\"), URI(\"one:bar\")) }\n    assertThat(e).doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `checkImportModule() - higher trust level`() {\n    assertThrows<SecurityManagerException> {\n      manager.checkImportModule(URI(\"one:foo\"), URI(\"two:bar\"))\n    }\n  }\n\n  @Test\n  fun `checkImportModule() - lower trust level`() {\n    val e = catchThrowable { manager.checkImportModule(URI(\"two:foo\"), URI(\"one:bar\")) }\n    assertThat(e).doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `default trust levels`() {\n    val repl = URI(\"repl:foo\")\n    val localFile = URI(\"file:///some/path\")\n    val jarLocalFile = URI(\"jar:file:///some/path!/some/path\")\n    val namedModule = URI(\"modulepath:/some/path\")\n    val remoteFile = URI(\"file://apple.com/some.path\")\n    val jarRemoteFile = URI(\"jar:file://apple.com/some.path!/some/path\")\n    val other = URI(\"http://apple.com/some.path\")\n    val jarOther = URI(\"jar:http://apple.com/some.path!/some/path\")\n    val stdLib = URI(\"pkl:test\")\n\n    val levels = SecurityManagers.defaultTrustLevels\n    assertThat(levels.apply(repl)).isEqualTo(40)\n    assertThat(levels.apply(localFile)).isEqualTo(30)\n    assertThat(levels.apply(jarLocalFile)).isEqualTo(30)\n    assertThat(levels.apply(namedModule)).isEqualTo(20)\n    assertThat(levels.apply(remoteFile)).isEqualTo(10)\n    assertThat(levels.apply(jarRemoteFile)).isEqualTo(10)\n    assertThat(levels.apply(other)).isEqualTo(10)\n    assertThat(levels.apply(jarOther)).isEqualTo(10)\n    assertThat(levels.apply(stdLib)).isEqualTo(0)\n  }\n\n  @Test\n  fun `can resolve modules and resources under root dir - files do exist`(@TempDir tempDir: Path) {\n    val rootDir = tempDir.resolve(\"root\")\n    Files.createDirectory(rootDir)\n\n    val manager =\n      SecurityManagers.standard(\n        listOf(Pattern.compile(\"file\")),\n        listOf(Pattern.compile(\"file\")),\n        SecurityManagers.defaultTrustLevels,\n        rootDir,\n      )\n\n    val path = rootDir.resolve(\"baz.pkl\")\n    Files.createFile(path)\n    manager.checkResolveModule(path.toUri())\n    manager.checkReadResource(path.toUri())\n\n    manager.checkResolveModule(rootDir.toUri().resolve(\"qux/../baz.pkl\"))\n    manager.checkReadResource(rootDir.toUri().resolve(\"qux/../baz.pkl\"))\n  }\n\n  @Test\n  fun `can resolve modules and resources under root dir - files don't exist`() {\n    val rootDir = \"/foo/bar\".toPath()\n\n    val manager =\n      SecurityManagers.standard(\n        listOf(Pattern.compile(\"file\")),\n        listOf(Pattern.compile(\"file\")),\n        SecurityManagers.defaultTrustLevels,\n        rootDir,\n      )\n\n    manager.checkResolveModule(Path.of(\"/foo/bar/baz.pkl\").toUri())\n    manager.checkReadResource(Path.of(\"/foo/bar/baz.pkl\").toUri())\n\n    manager.checkResolveModule(Path.of(\"/foo/bar/qux/../baz.pkl\").toUri())\n    manager.checkReadResource(Path.of(\"/foo/bar/qux/../baz.pkl\").toUri())\n  }\n\n  @Test\n  fun `cannot resolve modules and resources outside root dir - files do exist`(\n    @TempDir tempDir: Path\n  ) {\n    val rootDir = tempDir.resolve(\"root\")\n    Files.createDirectory(rootDir)\n\n    val manager =\n      SecurityManagers.standard(\n        listOf(Pattern.compile(\"file\")),\n        listOf(Pattern.compile(\"file\")),\n        SecurityManagers.defaultTrustLevels,\n        rootDir,\n      )\n\n    val path = rootDir.resolve(\"../baz.pkl\")\n    Files.createFile(path)\n    assertThrows<SecurityManagerException> { manager.checkResolveModule(path.toUri()) }\n    assertThrows<SecurityManagerException> { manager.checkReadResource(path.toUri()) }\n\n    val symlink = rootDir.resolve(\"qux\")\n    Files.createSymbolicLink(symlink, tempDir)\n    val path2 = symlink.resolve(\"baz2.pkl\")\n    Files.createFile(path2)\n    assertThrows<SecurityManagerException> { manager.checkResolveModule(path2.toUri()) }\n    assertThrows<SecurityManagerException> { manager.checkReadResource(path2.toUri()) }\n  }\n\n  @Test\n  fun `cannot resolve modules and resources outside root dir - files don't exist`() {\n    val rootDir = \"/foo/bar\".toPath()\n\n    val manager =\n      SecurityManagers.standard(\n        listOf(Pattern.compile(\"file\")),\n        listOf(Pattern.compile(\"file\")),\n        SecurityManagers.defaultTrustLevels,\n        rootDir,\n      )\n\n    assertThrows<SecurityManagerException> {\n      manager.checkResolveModule(Path.of(\"/foo/baz.pkl\").toUri())\n    }\n    assertThrows<SecurityManagerException> {\n      manager.checkReadResource(Path.of(\"/foo/baz.pkl\").toUri())\n    }\n\n    assertThrows<SecurityManagerException> {\n      manager.checkResolveModule(Path.of(\"/foo/bar/../baz.pkl\").toUri())\n    }\n    assertThrows<SecurityManagerException> {\n      manager.checkReadResource(Path.of(\"/foo/bar/../baz.pkl\").toUri())\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/StackFrameTransformersTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Disabled\nimport org.junit.jupiter.api.Test\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.core.http.HttpClient\n\nclass StackFrameTransformersTest {\n  // TODO figure out how to test this; right now this fails because there is no VM context.\n  @Test\n  @Disabled\n  fun replacePackageUriWithSourceCodeUrl() {\n    PackageServer().use { server ->\n      val httpClient = HttpClient.builder().setTestPort(server.port).build()\n      EvaluatorBuilder.preconfigured().setHttpClient(httpClient).build().use {\n        val frame =\n          StackFrame(\"package://localhost:0/birds@0.5.0#/Bird.pkl\", null, listOf(), 1, 1, 2, 2)\n        val transformed = StackFrameTransformers.replacePackageUriWithSourceCodeUrl.apply(frame)\n        assertThat(transformed.moduleUri)\n          .isEqualTo(\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L1-L2\")\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/VersionTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass VersionTest {\n  @Test\n  fun `parse release version`() {\n    val version = Version.parse(\"1.2.3\")\n    assertThat(version.major).isEqualTo(1)\n    assertThat(version.minor).isEqualTo(2)\n    assertThat(version.patch).isEqualTo(3)\n    assertThat(version.preRelease).isNull()\n    assertThat(version.build).isNull()\n  }\n\n  @Test\n  fun `parse snapshot version`() {\n    val version = Version.parse(\"1.2.3-SNAPSHOT+build-123\")\n    assertThat(version.major).isEqualTo(1)\n    assertThat(version.minor).isEqualTo(2)\n    assertThat(version.patch).isEqualTo(3)\n    assertThat(version.preRelease).isEqualTo(\"SNAPSHOT\")\n    assertThat(version.build).isEqualTo(\"build-123\")\n  }\n\n  @Test\n  fun `parse beta version`() {\n    val version = Version.parse(\"1.2.3-beta.1+build-123\")\n    assertThat(version.major).isEqualTo(1)\n    assertThat(version.minor).isEqualTo(2)\n    assertThat(version.patch).isEqualTo(3)\n    assertThat(version.preRelease).isEqualTo(\"beta.1\")\n    assertThat(version.build).isEqualTo(\"build-123\")\n  }\n\n  @Test\n  fun `parse invalid version`() {\n    assertThat(Version.parseOrNull(\"not a version number\")).isNull()\n\n    assertThrows<IllegalArgumentException> { Version.parse(\"not a version number\") }\n  }\n\n  @Test\n  fun `parse too large version`() {\n    assertThrows<IllegalArgumentException> { Version.parse(\"not a version number\") }\n\n    assertThrows<IllegalArgumentException> { Version.parse(\"999999999999999.0.0\") }\n  }\n\n  @Test\n  fun toNormal() {\n    val stripped = Version.parse(\"1.2.3\")\n    assertThat(Version.parse(\"1.2.3-beta-1+build-123\").toNormal()).isEqualTo(stripped)\n    assertThat(Version.parse(\"1.2.3-beta-1\").toNormal()).isEqualTo(stripped)\n    assertThat(Version.parse(\"1.2.3\").toNormal()).isEqualTo(stripped)\n  }\n\n  @Test\n  fun withMethods() {\n    val version =\n      Version.parse(\"0.0.0\")\n        .withMajor(1)\n        .withMinor(2)\n        .withPatch(3)\n        .withPreRelease(\"rc.1\")\n        .withBuild(\"456.789\")\n\n    assertThat(version).isEqualTo(Version.parse(\"1.2.3-rc.1+456.789\"))\n\n    val version2 =\n      Version.parse(\"0.0.0\")\n        .withBuild(\"456.789\")\n        .withPreRelease(\"rc.1\")\n        .withPatch(3)\n        .withMinor(2)\n        .withMajor(1)\n\n    assertThat(version2).isEqualTo(version)\n  }\n\n  @Test\n  fun `compareTo()`() {\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 2, 3, null, null))).isEqualTo(0)\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null).compareTo(Version(1, 2, 3, \"SNAPSHOT\", null)))\n      .isEqualTo(0)\n    assertThat(Version(1, 2, 3, \"alpha\", null).compareTo(Version(1, 2, 3, \"alpha\", null)))\n      .isEqualTo(0)\n    assertThat(Version(1, 2, 3, \"alpha\", null).compareTo(Version(1, 2, 3, \"alpha\", \"build123\")))\n      .isEqualTo(0)\n\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(2, 2, 3, null, null))).isLessThan(0)\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 3, 3, null, null))).isLessThan(0)\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 2, 4, null, null))).isLessThan(0)\n\n    assertThat(Version(2, 2, 3, null, null).compareTo(Version(1, 2, 3, null, null)))\n      .isGreaterThan(0)\n    assertThat(Version(1, 3, 3, null, null).compareTo(Version(1, 2, 3, null, null)))\n      .isGreaterThan(0)\n    assertThat(Version(1, 2, 4, null, null).compareTo(Version(1, 2, 3, null, null)))\n      .isGreaterThan(0)\n\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null).compareTo(Version(1, 2, 3, null, null)))\n      .isLessThan(0)\n    assertThat(Version(1, 2, 3, \"alpha\", null).compareTo(Version(1, 2, 3, \"beta\", null)))\n      .isLessThan(0)\n    assertThat(Version(1, 2, 3, \"alpha\", \"build123\").compareTo(Version(1, 2, 3, \"beta\", null)))\n      .isLessThan(0)\n\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 2, 3, \"SNAPSHOT\", null)))\n      .isGreaterThan(0)\n    assertThat(Version(1, 2, 3, \"beta\", null).compareTo(Version(1, 2, 3, \"alpha\", \"build123\")))\n      .isGreaterThan(0)\n  }\n\n  @Test\n  fun `compare version with too large numeric pre-release identifier`() {\n    // error is deferred until compareTo(), but should be good enough\n    assertThrows<IllegalArgumentException> {\n      Version(1, 2, 3, \"999\", null).compareTo(Version(1, 2, 3, \"9999999999999999999\", null))\n    }\n  }\n\n  @Test\n  fun `equals()`() {\n    assertThat(Version(1, 2, 3, null, null)).isEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null)).isEqualTo(Version(1, 2, 3, \"SNAPSHOT\", null))\n    assertThat(Version(1, 2, 3, \"alpha\", null)).isEqualTo(Version(1, 2, 3, \"alpha\", null))\n    assertThat(Version(1, 2, 3, \"beta\", \"build123\")).isEqualTo(Version(1, 2, 3, \"beta\", \"build456\"))\n\n    assertThat(Version(1, 3, 3, null, null)).isNotEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 4, null, null)).isNotEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null)).isNotEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 3, \"beta\", null)).isNotEqualTo(Version(1, 2, 3, \"alpha\", null))\n  }\n\n  @Test\n  fun `hashCode()`() {\n    assertThat(Version(1, 2, 3, null, null).hashCode())\n      .isEqualTo(Version(1, 2, 3, null, null).hashCode())\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null).hashCode())\n      .isEqualTo(Version(1, 2, 3, \"SNAPSHOT\", null).hashCode())\n    assertThat(Version(1, 2, 3, \"alpha\", null).hashCode())\n      .isEqualTo(Version(1, 2, 3, \"alpha\", null).hashCode())\n    assertThat(Version(1, 2, 3, \"alpha\", \"build123\").hashCode())\n      .isEqualTo(Version(1, 2, 3, \"alpha\", \"build456\").hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/YamlRendererTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core\n\nimport java.io.StringWriter\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.util.IoUtils\nimport org.snakeyaml.engine.v2.api.Load\nimport org.snakeyaml.engine.v2.api.LoadSettings\n\nclass YamlRendererTest {\n  @Test\n  fun `render document`() {\n    val evaluator = Evaluator.preconfigured()\n    val module = evaluator.evaluate(ModuleSource.modulePath(\"org/pkl/core/rendererTest.pkl\"))\n    val writer = StringWriter()\n    val renderer = ValueRenderers.yaml(writer, 2, true, false)\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n    val expected = IoUtils.readClassPathResourceAsString(javaClass, \"rendererTest.yaml\")\n\n    assertThat(output.trim()).isEqualTo(expected.trim())\n    assertThatCode { Load(LoadSettings.builder().build()).loadFromString(output) }\n      .doesNotThrowAnyException()\n  }\n\n  @Test\n  fun `render YAML stream`() {\n    val evaluator = Evaluator.preconfigured()\n    val module =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        stream = new Listing {\n          new Dynamic {\n            name = \"Pigeon\"\n            age = 42\n          }\n          new Listing {\n            \"one\"\n            \"two\"\n            \"three\"\n          }\n          new Mapping {\n            [\"one\"] = 1\n            [\"two\"] = 2\n            [\"three\"] = 3\n          }\n          \"Blue Rock Ltd.\"\n          12345\n        }\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    val writer = StringWriter()\n    val renderer = ValueRenderers.yaml(writer, 2, true, true)\n\n    renderer.renderDocument(module.getProperty(\"stream\"))\n    val output = writer.toString()\n\n    assertThat(output.trim())\n      .isEqualTo(\n        \"\"\"\n      name: Pigeon\n      age: 42\n      ---\n      - one\n      - two\n      - three\n      ---\n      one: 1\n      two: 2\n      three: 3\n      --- Blue Rock Ltd.\n      --- 12345\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `rendered document ends in newline`() {\n    val module = Evaluator.preconfigured().evaluate(ModuleSource.text(\"foo { bar = 0 }\"))\n\n    for (omitNullProperties in listOf(false, true)) {\n      for (isStream in listOf(false, true)) {\n        val writer = StringWriter()\n        ValueRenderers.yaml(writer, 2, omitNullProperties, isStream).renderDocument(listOf(module))\n        assertThat(writer.toString()).endsWith(\"\\n\")\n      }\n    }\n  }\n\n  @Test\n  fun `render truthy strings, octals and number-like strings`() {\n    val evaluator = Evaluator.preconfigured()\n    val module =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        num1 = \"50\"\n        num2 = \"50.123\"\n        `60.123` = \"60.123\"\n        yes = \"yes\"\n        truth = \"true\"\n        octalNumber = \"0777\"\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    val writer = StringWriter()\n    val renderer = ValueRenderers.yaml(writer, 2, true, false)\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n\n    assertThat(output.trim())\n      .isEqualTo(\n        \"\"\"\n      num1: '50'\n      num2: '50.123'\n      '60.123': '60.123'\n      'yes': 'yes'\n      truth: 'true'\n      octalNumber: '0777'\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `render byte array values as binary`() {\n    val evaluator = Evaluator.preconfigured()\n    val module =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        res1 = Bytes()\n        res2 = Bytes(1, 2, 3)\n        res3 = IntSeq(0, 127).toList().toBytes()\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    val writer = StringWriter()\n    val renderer = ValueRenderers.yaml(writer, 2, true, false)\n\n    renderer.renderDocument(module)\n    val output = writer.toString()\n\n    assertThat(output.trim())\n      .isEqualTo(\n        \"\"\"\n      res1: !!binary ''\n      res2: !!binary 'AQID'\n      res3: !!binary 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8='\n    \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/ast/builder/ImportsAndReadsParserTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.ast.builder\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.StackFrameTransformers\nimport org.pkl.core.module.ModuleKeys\nimport org.pkl.core.runtime.VmException\n\nclass ImportsAndReadsParserTest {\n  @Test\n  fun parse() {\n    val moduleText =\n      \"\"\"\n      amends \"foo.pkl\"\n\n      import \"bar.pkl\"\n      import \"bazzy/buz.pkl\"\n\n      res1 = import(\"qux.pkl\")\n      res2 = import*(\"qux/*.pkl\")\n\n      class MyClass {\n        res3 {\n          res4 {\n            res5 = read(\"/some/dir/chown.txt\")\n            res6 = read?(\"/some/dir/chowner.txt\")\n            res7 = read*(\"/some/dir/*.txt\")\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    val moduleKey = ModuleKeys.synthetic(URI(\"repl:text\"), moduleText)\n    val imports =\n      ImportsAndReadsParser.parse(moduleKey, moduleKey.resolve(SecurityManagers.defaultManager))\n    assertThat(imports?.map { it.stringValue })\n      .hasSameElementsAs(\n        listOf(\n          \"foo.pkl\",\n          \"bar.pkl\",\n          \"bazzy/buz.pkl\",\n          \"qux.pkl\",\n          \"qux/*.pkl\",\n          \"/some/dir/chown.txt\",\n          \"/some/dir/chowner.txt\",\n          \"/some/dir/*.txt\",\n        )\n      )\n  }\n\n  @Test\n  fun `invalid syntax`() {\n    val moduleText =\n      \"\"\"\n        not valid Pkl syntax\n      \"\"\"\n        .trimIndent()\n    val moduleKey = ModuleKeys.synthetic(URI(\"repl:text\"), moduleText)\n    val err =\n      assertThrows<VmException> {\n        ImportsAndReadsParser.parse(moduleKey, moduleKey.resolve(SecurityManagers.defaultManager))\n      }\n    assertThat(err.toPklException(StackFrameTransformers.defaultTransformer, false))\n      .hasMessage(\n        \"\"\"\n          –– Pkl Error ––\n          Invalid property definition. Expected a type annotation, `=` or `{`.\n          \n          1 | not valid Pkl syntax\n              ^^^\n          at text (repl:text)\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/ExternalModuleReader.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.net.URI\nimport org.pkl.core.messaging.Messages.ModuleReaderSpec\n\n/** An external module reader, to be used with [ExternalReaderClient]. */\ninterface ExternalModuleReader : ExternalReaderBase {\n  val isLocal: Boolean\n\n  fun read(uri: URI): String\n\n  val spec: ModuleReaderSpec\n    get() = ModuleReaderSpec(scheme, hasHierarchicalUris, isLocal, isGlobbable)\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/ExternalReaderBase.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.net.URI\nimport org.pkl.core.module.PathElement\n\n/** Base interface for external module and resource readers. */\ninterface ExternalReaderBase {\n  val scheme: String\n\n  val hasHierarchicalUris: Boolean\n\n  val isGlobbable: Boolean\n\n  fun listElements(uri: URI): List<PathElement>\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/ExternalReaderClient.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.io.IOException\nimport org.pkl.core.externalreader.ExternalReaderMessages.*\nimport org.pkl.core.messaging.Message\nimport org.pkl.core.messaging.MessageTransport\nimport org.pkl.core.messaging.Messages\nimport org.pkl.core.messaging.Messages.*\nimport org.pkl.core.messaging.ProtocolException\nimport org.pkl.core.util.Nullable\n\n/** An implementation of the client side of the external reader flow */\nclass ExternalReaderClient(\n  private val externalModuleReaders: List<ExternalModuleReader>,\n  private val externalResourceReaders: List<ExternalResourceReader>,\n  private val transport: MessageTransport,\n) {\n  /** Close the runtime and its transport. */\n  fun close() {\n    transport.close()\n  }\n\n  private fun findModuleReader(scheme: String): @Nullable ExternalModuleReader? {\n    for (moduleReader in externalModuleReaders) {\n      if (moduleReader.scheme.equals(scheme, ignoreCase = true)) {\n        return moduleReader\n      }\n    }\n    return null\n  }\n\n  private fun findResourceReader(scheme: String): @Nullable ExternalResourceReader? {\n    for (resourceReader in externalResourceReaders) {\n      if (resourceReader.scheme.equals(scheme, ignoreCase = true)) {\n        return resourceReader\n      }\n    }\n    return null\n  }\n\n  /**\n   * Start the runtime so it can respond to incoming messages on its transport.\n   *\n   * Blocks until the underlying transport is closed.\n   */\n  @Throws(ProtocolException::class, IOException::class)\n  fun run() {\n    transport.start(\n      { msg: Message.OneWay ->\n        if (msg.type() == Message.Type.CLOSE_EXTERNAL_PROCESS) {\n          close()\n        } else {\n          throw ProtocolException(\"Unexpected incoming one-way message: $msg\")\n        }\n      },\n      { msg: Message.Request ->\n        when (msg.type()) {\n          Message.Type.INITIALIZE_MODULE_READER_REQUEST -> {\n            val req = msg as InitializeModuleReaderRequest\n            val reader = findModuleReader(req.scheme)\n            var spec: Messages.ModuleReaderSpec? = null\n            if (reader != null) {\n              spec = reader.spec\n            }\n            transport.send(InitializeModuleReaderResponse(req.requestId, spec))\n          }\n          Message.Type.INITIALIZE_RESOURCE_READER_REQUEST -> {\n            val req = msg as InitializeResourceReaderRequest\n            val reader = findResourceReader(req.scheme)\n            var spec: Messages.ResourceReaderSpec? = null\n            if (reader != null) {\n              spec = reader.spec\n            }\n            transport.send(InitializeResourceReaderResponse(req.requestId, spec))\n          }\n          Message.Type.LIST_MODULES_REQUEST -> {\n            val req = msg as ListModulesRequest\n            val reader = findModuleReader(req.uri.scheme)\n            if (reader == null) {\n              transport.send(\n                ListModulesResponse(\n                  req.requestId,\n                  req.evaluatorId,\n                  null,\n                  \"No module reader found for scheme \" + req.uri.scheme,\n                )\n              )\n              return@start\n            }\n            try {\n              transport.send(\n                ListModulesResponse(\n                  req.requestId,\n                  req.evaluatorId,\n                  reader.listElements(req.uri),\n                  null,\n                )\n              )\n            } catch (e: Exception) {\n              transport.send(\n                ListModulesResponse(req.requestId, req.evaluatorId, null, e.toString())\n              )\n            }\n          }\n          Message.Type.LIST_RESOURCES_REQUEST -> {\n            val req = msg as ListResourcesRequest\n            val reader = findModuleReader(req.uri.scheme)\n            if (reader == null) {\n              transport.send(\n                ListResourcesResponse(\n                  req.requestId,\n                  req.evaluatorId,\n                  null,\n                  \"No resource reader found for scheme \" + req.uri.scheme,\n                )\n              )\n              return@start\n            }\n            try {\n              transport.send(\n                ListResourcesResponse(\n                  req.requestId,\n                  req.evaluatorId,\n                  reader.listElements(req.uri),\n                  null,\n                )\n              )\n            } catch (e: Exception) {\n              transport.send(\n                ListResourcesResponse(req.requestId, req.evaluatorId, null, e.toString())\n              )\n            }\n          }\n          Message.Type.READ_MODULE_REQUEST -> {\n            val req = msg as ReadModuleRequest\n            val reader = findModuleReader(req.uri.scheme)\n            if (reader == null) {\n              transport.send(\n                ReadModuleResponse(\n                  req.requestId,\n                  req.evaluatorId,\n                  null,\n                  \"No module reader found for scheme \" + req.uri.scheme,\n                )\n              )\n              return@start\n            }\n            try {\n              transport.send(\n                ReadModuleResponse(req.requestId, req.evaluatorId, reader.read(req.uri), null)\n              )\n            } catch (e: Exception) {\n              transport.send(ReadModuleResponse(req.requestId, req.evaluatorId, null, e.toString()))\n            }\n          }\n          Message.Type.READ_RESOURCE_REQUEST -> {\n            val req = msg as ReadResourceRequest\n            val reader = findResourceReader(req.uri.scheme)\n            if (reader == null) {\n              transport.send(\n                ReadResourceResponse(\n                  req.requestId,\n                  req.evaluatorId,\n                  byteArrayOf(),\n                  \"No resource reader found for scheme \" + req.uri.scheme,\n                )\n              )\n              return@start\n            }\n            try {\n              transport.send(\n                ReadResourceResponse(req.requestId, req.evaluatorId, reader.read(req.uri), null)\n              )\n            } catch (e: Exception) {\n              transport.send(\n                ReadResourceResponse(req.requestId, req.evaluatorId, byteArrayOf(), e.toString())\n              )\n            }\n          }\n          else -> throw ProtocolException(\"Unexpected incoming request message: $msg\")\n        }\n      },\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/ExternalResourceReader.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.net.URI\nimport org.pkl.core.messaging.Messages.ResourceReaderSpec\n\n/** An external resource reader, to be used with [ExternalReaderClient]. */\ninterface ExternalResourceReader : ExternalReaderBase {\n  fun read(uri: URI): ByteArray\n\n  val spec: ResourceReaderSpec\n    get() = ResourceReaderSpec(scheme, hasHierarchicalUris, isGlobbable)\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/MessagePackCodecTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.io.PipedInputStream\nimport java.io.PipedOutputStream\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.msgpack.core.MessagePack\nimport org.pkl.core.externalreader.ExternalReaderMessages.*\nimport org.pkl.core.messaging.*\n\nclass MessagePackCodecTest {\n  private val encoder: MessageEncoder\n  private val decoder: MessageDecoder\n\n  init {\n    val inputStream = PipedInputStream()\n    val outputStream = PipedOutputStream(inputStream)\n    encoder = ExternalReaderMessagePackEncoder(MessagePack.newDefaultPacker(outputStream))\n    decoder = ExternalReaderMessagePackDecoder(MessagePack.newDefaultUnpacker(inputStream))\n  }\n\n  private fun roundtrip(message: Message) {\n    encoder.encode(message)\n    val decoded = decoder.decode()\n    assertThat(decoded).isEqualTo(message)\n  }\n\n  @Test\n  fun `round-trip InitializeModuleReaderRequest`() {\n    roundtrip(InitializeModuleReaderRequest(123, \"my-scheme\"))\n  }\n\n  @Test\n  fun `round-trip InitializeResourceReaderRequest`() {\n    roundtrip(InitializeResourceReaderRequest(123, \"my-scheme\"))\n  }\n\n  @Test\n  fun `round-trip InitializeModuleReaderResponse`() {\n    roundtrip(InitializeModuleReaderResponse(123, null))\n    roundtrip(\n      InitializeModuleReaderResponse(123, Messages.ModuleReaderSpec(\"my-scheme\", true, true, true))\n    )\n  }\n\n  @Test\n  fun `round-trip InitializeResourceReaderResponse`() {\n    roundtrip(InitializeResourceReaderResponse(123, null))\n    roundtrip(\n      InitializeResourceReaderResponse(123, Messages.ResourceReaderSpec(\"my-scheme\", true, true))\n    )\n  }\n\n  @Test\n  fun `round-trip CloseExternalProcess`() {\n    roundtrip(CloseExternalProcess())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/TestExternalModuleReader.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.net.URI\nimport org.pkl.core.module.PathElement\n\nclass TestExternalModuleReader : ExternalModuleReader {\n  override val scheme: String = \"test\"\n\n  override val hasHierarchicalUris: Boolean = false\n\n  override val isLocal: Boolean = true\n\n  override val isGlobbable: Boolean = false\n\n  override fun read(uri: URI): String =\n    \"\"\"\n    name = \"Pigeon\"\n    age = 40\n  \"\"\"\n      .trimIndent()\n\n  override fun listElements(uri: URI): List<PathElement> = emptyList()\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/TestExternalReaderProcess.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.io.IOException\nimport java.io.PipedInputStream\nimport java.io.PipedOutputStream\nimport java.util.concurrent.CompletableFuture\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.ExecutionException\nimport java.util.concurrent.Future\nimport kotlin.random.Random\nimport org.pkl.core.externalreader.ExternalReaderMessages.*\nimport org.pkl.core.messaging.MessageTransport\nimport org.pkl.core.messaging.MessageTransports\nimport org.pkl.core.messaging.ProtocolException\n\nclass TestExternalReaderProcess(private val transport: MessageTransport) : ExternalReaderProcess {\n  private val initializeModuleReaderResponses: MutableMap<String, Future<ModuleReaderSpec?>> =\n    ConcurrentHashMap()\n  private val initializeResourceReaderResponses: MutableMap<String, Future<ResourceReaderSpec?>> =\n    ConcurrentHashMap()\n\n  override fun close() {\n    transport.send(CloseExternalProcess())\n    transport.close()\n  }\n\n  override fun getModuleResolver(evaluatorId: Long): ExternalModuleResolver =\n    ExternalModuleResolver.of(transport, evaluatorId)\n\n  override fun getResourceResolver(evaluatorId: Long): ExternalResourceResolver =\n    ExternalResourceResolver.of(transport, evaluatorId)\n\n  fun run() {\n    try {\n      transport.start(\n        { throw ProtocolException(\"Unexpected incoming one-way message: $it\") },\n        { throw ProtocolException(\"Unexpected incoming request message: $it\") },\n      )\n    } catch (e: ProtocolException) {\n      throw RuntimeException(e)\n    } catch (e: IOException) {\n      throw RuntimeException(e)\n    }\n  }\n\n  override fun getModuleReaderSpec(scheme: String): ModuleReaderSpec? =\n    initializeModuleReaderResponses\n      .computeIfAbsent(scheme) {\n        CompletableFuture<ModuleReaderSpec?>().apply {\n          val request = InitializeModuleReaderRequest(Random.nextLong(), scheme)\n          transport.send(request) { response ->\n            when (response) {\n              is InitializeModuleReaderResponse -> {\n                val spec =\n                  response.spec?.let {\n                    ModuleReaderSpec(it.scheme, it.hasHierarchicalUris, it.isLocal, it.isGlobbable)\n                  }\n                complete(spec)\n              }\n              else -> completeExceptionally(ProtocolException(\"unexpected response\"))\n            }\n          }\n        }\n      }\n      .getUnderlying()\n\n  override fun getResourceReaderSpec(scheme: String): ResourceReaderSpec? =\n    initializeResourceReaderResponses\n      .computeIfAbsent(scheme) {\n        CompletableFuture<ResourceReaderSpec?>().apply {\n          val request = InitializeResourceReaderRequest(Random.nextLong(), scheme)\n          transport.send(request) { response ->\n            when (response) {\n              is InitializeResourceReaderResponse -> {\n                val spec =\n                  response.spec?.let {\n                    ResourceReaderSpec(it.scheme, it.hasHierarchicalUris, it.isGlobbable)\n                  }\n                complete(spec)\n              }\n              else -> completeExceptionally(ProtocolException(\"unexpected response\"))\n            }\n          }\n        }\n      }\n      .getUnderlying()\n\n  companion object {\n    fun initializeTestHarness(\n      externalModuleReaders: List<ExternalModuleReader>,\n      externalResourceReaders: List<ExternalResourceReader>,\n    ): Pair<TestExternalReaderProcess, ExternalReaderClient> {\n      val rxIn = PipedInputStream(10240)\n      val rxOut = PipedOutputStream(rxIn)\n      val txIn = PipedInputStream(10240)\n      val txOut = PipedOutputStream(txIn)\n      val serverTransport =\n        MessageTransports.stream(\n          ExternalReaderMessagePackDecoder(rxIn),\n          ExternalReaderMessagePackEncoder(txOut),\n        ) {}\n      val clientTransport =\n        MessageTransports.stream(\n          ExternalReaderMessagePackDecoder(txIn),\n          ExternalReaderMessagePackEncoder(rxOut),\n        ) {}\n\n      val client =\n        ExternalReaderClient(externalModuleReaders, externalResourceReaders, clientTransport)\n      val proc = TestExternalReaderProcess(serverTransport)\n\n      Thread(client::run).start()\n      Thread(proc::run).start()\n\n      return proc to client\n    }\n  }\n}\n\nfun <T> Future<T>.getUnderlying(): T =\n  try {\n    get()\n  } catch (e: ExecutionException) {\n    throw e.cause!!\n  }\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/externalreader/TestExternalResourceReader.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.externalreader\n\nimport java.net.URI\nimport org.pkl.core.module.PathElement\n\nclass TestExternalResourceReader : ExternalResourceReader {\n  override val scheme: String = \"test\"\n\n  override val hasHierarchicalUris: Boolean = false\n\n  override val isGlobbable: Boolean = false\n\n  override fun read(uri: URI): ByteArray = \"success\".toByteArray(Charsets.UTF_8)\n\n  override fun listElements(uri: URI): List<PathElement> = emptyList()\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/http/DummyHttpClientTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http\n\nimport java.net.URI\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\n\nclass DummyHttpClientTest {\n  @Test\n  fun `refuses to send messages`() {\n    val client = HttpClient.dummyClient()\n    val request = HttpRequest.newBuilder(URI(\"https://example.com\")).build()\n\n    assertThrows<AssertionError> { client.send(request, HttpResponse.BodyHandlers.discarding()) }\n\n    assertThrows<AssertionError> { client.send(request, HttpResponse.BodyHandlers.discarding()) }\n  }\n\n  @Test\n  fun `can be closed`() {\n    val client = HttpClient.dummyClient()\n\n    assertDoesNotThrow {\n      client.close()\n      client.close()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/http/HttpClientTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http\n\nimport java.net.URI\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse\nimport java.nio.file.Path\nimport java.time.Duration\nimport kotlin.io.path.createFile\nimport kotlin.io.path.readBytes\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.core.Release\n\nclass HttpClientTest {\n  @Test\n  fun `can build default client`() {\n    val client = assertDoesNotThrow { HttpClient.builder().build() }\n\n    assertThat(client).isInstanceOf(RequestRewritingClient::class.java)\n    client as RequestRewritingClient\n\n    val release = Release.current()\n    assertThat(client.userAgent)\n      .isEqualTo(\"Pkl/${release.version()} (${release.os()}; ${release.flavor()})\")\n    assertThat(client.requestTimeout).isEqualTo(Duration.ofSeconds(60))\n\n    assertThat(client.delegate).isInstanceOf(JdkHttpClient::class.java)\n    val delegate = client.delegate as JdkHttpClient\n\n    assertThat(delegate.underlying.connectTimeout()).hasValue(Duration.ofSeconds(60))\n  }\n\n  @Test\n  fun `can build custom client`() {\n    val client =\n      HttpClient.builder()\n        .setUserAgent(\"Agent 1\")\n        .setRequestTimeout(Duration.ofHours(86))\n        .setConnectTimeout(Duration.ofMinutes(42))\n        .build() as RequestRewritingClient\n\n    assertThat(client.userAgent).isEqualTo(\"Agent 1\")\n    assertThat(client.requestTimeout).isEqualTo(Duration.ofHours(86))\n\n    val delegate = client.delegate as JdkHttpClient\n    assertThat(delegate.underlying.connectTimeout()).hasValue(Duration.ofMinutes(42))\n  }\n\n  @Test\n  fun `can load certificates from regular file`() {\n    assertDoesNotThrow {\n      HttpClient.builder().addCertificates(FileTestUtils.selfSignedCertificate).build()\n    }\n  }\n\n  @Test\n  fun `can load certificates from a byte array`() {\n    assertDoesNotThrow {\n      HttpClient.builder().addCertificates(FileTestUtils.selfSignedCertificate.readBytes()).build()\n    }\n  }\n\n  @Test\n  fun `certificate file cannot be empty`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"certs.pem\").createFile()\n\n    val e =\n      assertThrows<HttpClientInitException> { HttpClient.builder().addCertificates(file).build() }\n\n    assertThat(e).hasMessageContaining(\"empty\")\n  }\n\n  @Test\n  fun `can load built-in certificates`() {\n    assertDoesNotThrow { HttpClient.builder().build() }\n  }\n\n  @Test\n  fun `can be closed multiple times`() {\n    val client = HttpClient.builder().build()\n\n    assertDoesNotThrow {\n      client.close()\n      client.close()\n    }\n  }\n\n  @Test\n  fun `refuses to send messages once closed`() {\n    val client = HttpClient.builder().build()\n    val request = HttpRequest.newBuilder(URI(\"https://example.com\")).build()\n\n    client.close()\n\n    assertThrows<IllegalStateException> {\n      client.send(request, HttpResponse.BodyHandlers.discarding())\n    }\n    assertThrows<IllegalStateException> {\n      client.send(request, HttpResponse.BodyHandlers.discarding())\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/http/LazyHttpClientTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http\n\nimport java.net.URI\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse.BodyHandlers\nimport java.nio.file.Path\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.createTempFile\nimport org.pkl.commons.writeString\n\nclass LazyHttpClientTest {\n  @Test\n  fun `builds underlying client on first send`(@TempDir tempDir: Path) {\n    val certFile = tempDir.resolve(\"cert.pem\").apply { writeString(\"broken\") }\n    val client = HttpClient.builder().addCertificates(certFile).buildLazily()\n    val request = HttpRequest.newBuilder(URI(\"https://example.com\")).build()\n\n    assertThrows<HttpClientInitException> { client.send(request, BodyHandlers.discarding()) }\n  }\n\n  @Test\n  fun `does not build underlying client unnecessarily`(@TempDir tempDir: Path) {\n    val certFile = tempDir.createTempFile().apply { writeString(\"broken\") }\n    val client = HttpClient.builder().addCertificates(certFile).buildLazily()\n\n    assertDoesNotThrow {\n      client.close()\n      client.close()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/http/NoProxyRuleTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http\n\nimport java.net.URI\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\n@Suppress(\"HttpUrlsUsage\")\nclass NoProxyRuleTest {\n  @Test\n  fun wildcard() {\n    val noProxyRule = NoProxyRule(\"*\")\n    assertTrue(noProxyRule.matches(URI(\"https://foo.com\")))\n    assertTrue(noProxyRule.matches(URI(\"https://bar.com\")))\n    assertTrue(noProxyRule.matches(URI(\"https://foo:5000\")))\n  }\n\n  @Test\n  fun `hostname matching`() {\n    val noProxyRule = NoProxyRule(\"foo.com\")\n    assertTrue(noProxyRule.matches(URI(\"https://foo.com\")))\n    assertTrue(noProxyRule.matches(URI(\"http://foo.com\")))\n    assertTrue(noProxyRule.matches(URI(\"https://foo.com:5000\")))\n    assertTrue(noProxyRule.matches(URI(\"https://FOO.COM\")))\n    assertTrue(noProxyRule.matches(URI(\"https://bar.foo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"https://bar.foo.com.bar\")))\n    assertFalse(noProxyRule.matches(URI(\"https://bar.foocom\")))\n    assertFalse(noProxyRule.matches(URI(\"https://fooo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"https://ooofoo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"pkl:foo.com\")))\n  }\n\n  @Test\n  fun `hostname matching, leading dot`() {\n    val noProxyRule = NoProxyRule(\".foo.com\")\n    assertTrue(noProxyRule.matches(URI(\"https://foo.com\")))\n    assertTrue(noProxyRule.matches(URI(\"http://foo.com\")))\n    assertTrue(noProxyRule.matches(URI(\"https://foo.com:5000\")))\n    assertTrue(noProxyRule.matches(URI(\"https://FOO.COM\")))\n    assertTrue(noProxyRule.matches(URI(\"https://bar.foo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"https://bar.foo.com.bar\")))\n    assertFalse(noProxyRule.matches(URI(\"https://bar.foocom\")))\n    assertFalse(noProxyRule.matches(URI(\"https://fooo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"https://ooofoo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"pkl:foo.com\")))\n  }\n\n  @Test\n  fun `hostname matching, with port`() {\n    val noProxyRule = NoProxyRule(\"foo.com:5000\")\n    assertTrue(noProxyRule.matches(URI(\"https://foo.com:5000\")))\n    assertFalse(noProxyRule.matches(URI(\"https://foo.com\")))\n    assertFalse(noProxyRule.matches(URI(\"https://foo.com:3000\")))\n  }\n\n  @Test\n  fun `ipv4 address literal matching`() {\n    val noProxyRule = NoProxyRule(\"192.168.1.1\")\n    assertTrue(noProxyRule.matches(URI(\"http://192.168.1.1:5000\")))\n    assertTrue(noProxyRule.matches(URI(\"http://192.168.1.1\")))\n    assertTrue(noProxyRule.matches(URI(\"https://192.168.1.1\")))\n    assertFalse(noProxyRule.matches(URI(\"https://192.168.1.0\")))\n    assertFalse(noProxyRule.matches(URI(\"https://192.168.1.0:5000\")))\n  }\n\n  @Test\n  fun `ipv4 address literal matching, with port`() {\n    val noProxyRule = NoProxyRule(\"192.168.1.1:5000\")\n    assertTrue(noProxyRule.matches(URI(\"http://192.168.1.1:5000\")))\n    assertTrue(noProxyRule.matches(URI(\"https://192.168.1.1:5000\")))\n    assertFalse(noProxyRule.matches(URI(\"http://192.168.1.1\")))\n    assertFalse(noProxyRule.matches(URI(\"https://192.168.1.1\")))\n    assertFalse(noProxyRule.matches(URI(\"http://192.168.1.1:3000\")))\n    assertFalse(noProxyRule.matches(URI(\"https://192.168.1.1:3000\")))\n  }\n\n  @Test\n  fun `ipv6 address literal matching`() {\n    val noProxyRule = NoProxyRule(\"::1\")\n    assertTrue(noProxyRule.matches(URI(\"http://[::1]\")))\n    assertTrue(noProxyRule.matches(URI(\"http://[::1]:5000\")))\n    assertTrue(noProxyRule.matches(URI(\"https://[::1]\")))\n    assertTrue(noProxyRule.matches(URI(\"https://[0000:0000:0000:0000:0000:0000:0000:0001]\")))\n    assertFalse(noProxyRule.matches(URI(\"https://[::2]\")))\n    assertFalse(noProxyRule.matches(URI(\"https://[::2]:5000\")))\n  }\n\n  @Test\n  fun `ipv6 address literal matching, with port`() {\n    val noProxyRule = NoProxyRule(\"[::1]:5000\")\n    assertTrue(noProxyRule.matches(URI(\"http://[::1]:5000\")))\n    assertTrue(noProxyRule.matches(URI(\"https://[0000:0000:0000:0000:0000:0000:0000:0001]:5000\")))\n    assertFalse(noProxyRule.matches(URI(\"http://[::1]\")))\n    assertFalse(noProxyRule.matches(URI(\"https://[::1]\")))\n    assertFalse(noProxyRule.matches(URI(\"https://[::2]\")))\n    assertFalse(noProxyRule.matches(URI(\"https://[::2]:5000\")))\n  }\n\n  @Test\n  fun `ipv4 port from protocol`() {\n    val noProxyRuleHttp = NoProxyRule(\"192.168.1.1:80\")\n    assertTrue(noProxyRuleHttp.matches(URI(\"http://192.168.1.1\")))\n    assertTrue(noProxyRuleHttp.matches(URI(\"http://192.168.1.1:80\")))\n    assertTrue(noProxyRuleHttp.matches(URI(\"https://192.168.1.1:80\")))\n    assertFalse(noProxyRuleHttp.matches(URI(\"https://192.168.1.1\")))\n    assertFalse(noProxyRuleHttp.matches(URI(\"https://192.168.1.1:5000\")))\n\n    val noProxyRuleHttps = NoProxyRule(\"192.168.1.1:443\")\n    assertTrue(noProxyRuleHttps.matches(URI(\"https://192.168.1.1\")))\n    assertTrue(noProxyRuleHttps.matches(URI(\"http://192.168.1.1:443\")))\n    assertFalse(noProxyRuleHttps.matches(URI(\"http://192.168.1.1\")))\n    assertFalse(noProxyRuleHttps.matches(URI(\"https://192.168.1.1:80\")))\n  }\n\n  @Test\n  fun `ipv4 cidr block matching`() {\n    val noProxyRule1 = NoProxyRule(\"10.0.0.0/16\")\n    assertTrue(noProxyRule1.matches(URI(\"https://10.0.0.0\")))\n    assertTrue(noProxyRule1.matches(URI(\"https://10.0.255.255\")))\n    assertTrue(noProxyRule1.matches(URI(\"https://10.0.255.255:5000\")))\n    assertFalse(noProxyRule1.matches(URI(\"https://10.1.0.0\")))\n    assertFalse(noProxyRule1.matches(URI(\"https://11.0.0.0\")))\n    assertFalse(noProxyRule1.matches(URI(\"https://9.255.255.255\")))\n    assertFalse(noProxyRule1.matches(URI(\"https://9.255.255.255:5000\")))\n\n    val noProxyRule2 = NoProxyRule(\"10.0.0.0/32\")\n    assertTrue(noProxyRule2.matches(URI(\"https://10.0.0.0\")))\n    assertTrue(noProxyRule2.matches(URI(\"https://10.0.0.0:5000\")))\n    assertFalse(noProxyRule2.matches(URI(\"https://10.0.0.1\")))\n    assertFalse(noProxyRule2.matches(URI(\"https://9.255.255.55:5000\")))\n  }\n\n  @Test\n  fun `ipv6 cidr block matching`() {\n    val noProxyRule1 = NoProxyRule(\"1000::ff/32\")\n    assertTrue(noProxyRule1.matches(URI(\"https://[1000::]\")))\n    assertTrue(noProxyRule1.matches(URI(\"https://[1000:0:ffff:ffff:ffff:ffff:ffff:ffff]\")))\n    assertFalse(noProxyRule1.matches(URI(\"https://[999::]\")))\n    assertFalse(noProxyRule1.matches(URI(\"https://[1000:1::]\")))\n\n    val noProxyRule2 = NoProxyRule(\"1000::ff/128\")\n    assertTrue(noProxyRule2.matches(URI(\"https://[1000::ff]\")))\n    assertFalse(noProxyRule2.matches(URI(\"https://[999::]\")))\n    assertFalse(noProxyRule2.matches(URI(\"https://[1001::]\")))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/http/RequestCapturingClient.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http\n\nimport java.net.http.HttpRequest\nimport java.net.http.HttpResponse\nimport org.pkl.commons.test.FakeHttpResponse\n\nclass RequestCapturingClient : HttpClient {\n  lateinit var request: HttpRequest\n\n  override fun <T : Any> send(\n    request: HttpRequest,\n    responseBodyHandler: HttpResponse.BodyHandler<T>,\n  ): HttpResponse<T> {\n    this.request = request\n    return FakeHttpResponse()\n  }\n\n  override fun close() {}\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/http/RequestRewritingClientTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.http\n\nimport java.net.URI\nimport java.net.http.HttpClient as JdkHttpClient\nimport java.net.http.HttpRequest\nimport java.net.http.HttpRequest.BodyPublishers\nimport java.net.http.HttpResponse.BodyHandlers\nimport java.time.Duration\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatList\nimport org.junit.jupiter.api.Test\n\nclass RequestRewritingClientTest {\n  private val captured = RequestCapturingClient()\n  private val client =\n    RequestRewritingClient(\n      \"Pkl\",\n      Duration.ofSeconds(42),\n      -1,\n      captured,\n      mapOf(URI(\"https://foo/\") to URI(\"https://bar/\")),\n    )\n  private val exampleUri = URI(\"https://example.com/foo/bar.html\")\n  private val exampleRequest = HttpRequest.newBuilder(exampleUri).build()\n\n  @Test\n  fun `fills in missing User-Agent header`() {\n    client.send(exampleRequest, BodyHandlers.discarding())\n\n    assertThatList(captured.request.headers().allValues(\"User-Agent\")).containsOnly(\"Pkl\")\n  }\n\n  @Test\n  fun `overrides existing User-Agent headers`() {\n    val request =\n      HttpRequest.newBuilder(exampleUri)\n        .header(\"User-Agent\", \"Agent 1\")\n        .header(\"User-Agent\", \"Agent 2\")\n        .build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThatList(captured.request.headers().allValues(\"User-Agent\")).containsOnly(\"Pkl\")\n  }\n\n  @Test\n  fun `fills in missing request timeout`() {\n    client.send(exampleRequest, BodyHandlers.discarding())\n\n    assertThat(captured.request.timeout()).hasValue(Duration.ofSeconds(42))\n  }\n\n  @Test\n  fun `leaves existing request timeout intact`() {\n    val request = HttpRequest.newBuilder(exampleUri).timeout(Duration.ofMinutes(33)).build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.timeout()).hasValue(Duration.ofMinutes(33))\n  }\n\n  @Test\n  fun `fills in missing HTTP version`() {\n    client.send(exampleRequest, BodyHandlers.discarding())\n\n    assertThat(captured.request.version()).hasValue(JdkHttpClient.Version.HTTP_2)\n  }\n\n  @Test\n  fun `leaves existing HTTP version intact`() {\n    val request = HttpRequest.newBuilder(exampleUri).version(JdkHttpClient.Version.HTTP_1_1).build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.version()).hasValue(JdkHttpClient.Version.HTTP_1_1)\n  }\n\n  @Test\n  fun `leaves default method intact`() {\n    val request = HttpRequest.newBuilder(exampleUri).build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.method()).isEqualTo(\"GET\")\n  }\n\n  @Test\n  fun `leaves explicit method intact`() {\n    val request = HttpRequest.newBuilder(exampleUri).DELETE().build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.method()).isEqualTo(\"DELETE\")\n  }\n\n  @Test\n  fun `leaves body publisher intact`() {\n    val publisher = BodyPublishers.ofString(\"body\")\n    val request = HttpRequest.newBuilder(exampleUri).PUT(publisher).build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.bodyPublisher().get()).isSameAs(publisher)\n  }\n\n  @Test\n  fun `rewrites port 0 if test port is set`() {\n    val captured = RequestCapturingClient()\n    val client = RequestRewritingClient(\"Pkl\", Duration.ofSeconds(42), 5000, captured, mapOf())\n    val request = HttpRequest.newBuilder(URI(\"https://example.com:0\")).build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.uri().port).isEqualTo(5000)\n  }\n\n  @Test\n  fun `leaves port 0 intact if no test port is set`() {\n    val request = HttpRequest.newBuilder(URI(\"https://example.com:0\")).build()\n\n    client.send(request, BodyHandlers.discarding())\n\n    assertThat(captured.request.uri().port).isEqualTo(0)\n  }\n\n  @Test\n  fun `matches rewrite rule`() {\n    fun assertThatRewriteMatches(uri: String, rule: String) =\n      assertThat(RequestRewritingClient.matchesRewriteRule(URI(uri), URI(rule)))\n        .`as`(\"$uri matches $rule\")\n\n    assertThatRewriteMatches(\"https://www.foo.com/path/to/qux.html\", \"https://www.foo.com/\").isTrue\n    assertThatRewriteMatches(\"HTTPS://www.foo.com/path/to/qux.html\", \"https://www.foo.com/\").isTrue\n    assertThatRewriteMatches(\"HTTPS://WWW.FOO.COM/path/to/qux.html\", \"https://www.foo.com/\").isTrue\n\n    assertThatRewriteMatches(\"https://www.foo.com/path/to/qux.html\", \"https://www.foo.com/path/\")\n      .isTrue\n    assertThatRewriteMatches(\"https://www.foo.com/path/to/qux.html\", \"https://www.foo.com/PATH/\")\n      .isFalse\n    assertThatRewriteMatches(\"https://www.foo.com\", \"https://www.foo.com/\").isFalse\n\n    assertThatRewriteMatches(\n        \"https://www.foo.com/path/to/qux.html?foo&bar\",\n        \"https://www.foo.com/path/to/qux.html?foo&bar\",\n      )\n      .isTrue\n    assertThatRewriteMatches(\n        \"https://www.foo.com/path/to/qux.html?foo&baz\",\n        \"https://www.foo.com/path/to/qux.html?foo&bar\",\n      )\n      .isFalse\n\n    assertThatRewriteMatches(\n        \"https://www.foo.com/path/to/qux.html?foo&bar#qux\",\n        \"https://www.foo.com/path/to/qux.html?foo&bar#q\",\n      )\n      .isTrue\n    assertThatRewriteMatches(\n        \"https://www.foo.com/path/to/qux.html?foo&bar#qux\",\n        \"https://www.foo.com/path/to/qux.html?foo&bar#w\",\n      )\n      .isFalse\n    assertThatRewriteMatches(\n        \"https://www.foo.com/path/to/qux.html?foo&bar\",\n        \"https://www.foo.com/path/to/qux.html?foo&bar#w\",\n      )\n      .isFalse\n\n    assertThatRewriteMatches(\"https:///\", \"https:///\").isTrue\n    assertThatRewriteMatches(\"https:///\", \"http:///\").isFalse\n\n    // userinfo\n    assertThatRewriteMatches(\"https://foo@foo.com/\", \"http://foo.com/\").isFalse\n    assertThatRewriteMatches(\"https://foo@foo.com/\", \"http://foo@foo.com/\").isFalse\n    assertThatRewriteMatches(\"https://foo@foo.com/\", \"http://FOO@foo.com/\").isFalse\n  }\n\n  @Test\n  fun `rewrites URIs`() {\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/bar/baz\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://FOO.COM/bar/baz\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/bar/baz\",\n          mapOf(URI(\"https://FOO.COM/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/bar/baz\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/qux/baz/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/qux/baz/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/bar/baz\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/qux/baz/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/qux/baz/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/bar/baz?qux=foo#corge\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz?qux=foo#corge\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://fooey@foo.com/bar/baz\",\n          mapOf(URI(\"https://fooey@foo.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n  }\n\n  @Test\n  fun `rewrites URIs - longest rewrite wins`() {\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/qux/bar/baz\",\n          mapOf(\n            URI(\"https://foo.com/\") to URI(\"https://bar.com/\"),\n            URI(\"https://foo.com/qux\") to URI(\"https://corge.com/\"),\n          ),\n        )\n      )\n      .isEqualTo(\"https://corge.com/bar/baz\")\n  }\n\n  @Test\n  fun `rewrites URIs - hostname is always lowercased`() {\n    assertThat(\n        rewrittenRequest(\n          \"https://foo.com/bar/baz\",\n          mapOf(URI(\"https://FOO.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://FOO.com/bar/baz\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n  }\n\n  @Test\n  fun `rewrites URIs - scheme is always lowercased`() {\n    assertThat(\n        rewrittenRequest(\n          \"HTTPS://foo.com/bar/baz\",\n          mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n\n    assertThat(\n        rewrittenRequest(\n          \"https://FOO.com/bar/baz\",\n          mapOf(URI(\"HTTPS://foo.com/\") to URI(\"HTTPS://bar.com/\")),\n        )\n      )\n      .isEqualTo(\"https://bar.com/bar/baz\")\n  }\n\n  private fun rewrittenRequest(uri: String, rules: Map<URI, URI>): String {\n    val captured = RequestCapturingClient()\n    val client = RequestRewritingClient(\"Pkl\", Duration.ofSeconds(42), -1, captured, rules)\n    val request = HttpRequest.newBuilder(URI(uri)).build()\n    client.send(request, BodyHandlers.discarding())\n    return captured.request.uri().toString()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/messaging/BaseMessagePackCodecTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.messaging\n\nimport java.io.PipedInputStream\nimport java.io.PipedOutputStream\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.msgpack.core.MessagePack\nimport org.pkl.core.messaging.Messages.*\nimport org.pkl.core.module.PathElement\n\nclass BaseMessagePackCodecTest {\n  private val encoder: MessageEncoder\n  private val decoder: MessageDecoder\n\n  init {\n    val inputStream = PipedInputStream()\n    val outputStream = PipedOutputStream(inputStream)\n    encoder = BaseMessagePackEncoder(MessagePack.newDefaultPacker(outputStream))\n    decoder = BaseMessagePackDecoder(MessagePack.newDefaultUnpacker(inputStream))\n  }\n\n  private fun roundtrip(message: Message) {\n    encoder.encode(message)\n    val decoded = decoder.decode()\n    assertThat(decoded).isEqualTo(message)\n  }\n\n  @Test\n  fun `round-trip ReadResourceRequest`() {\n    roundtrip(ReadResourceRequest(123, 456, URI(\"some/resource.json\")))\n  }\n\n  @Test\n  fun `round-trip ReadResourceResponse`() {\n    roundtrip(ReadResourceResponse(123, 456, byteArrayOf(1, 2, 3, 4, 5), null))\n  }\n\n  @Test\n  fun `round-trip ReadModuleRequest`() {\n    roundtrip(ReadModuleRequest(123, 456, URI(\"some/module.pkl\")))\n  }\n\n  @Test\n  fun `round-trip ReadModuleResponse`() {\n    roundtrip(ReadModuleResponse(123, 456, \"x = 42\", null))\n  }\n\n  @Test\n  fun `round-trip ListModulesRequest`() {\n    roundtrip(ListModulesRequest(135, 246, URI(\"foo:/bar/baz/biz\")))\n  }\n\n  @Test\n  fun `round-trip ListModulesResponse`() {\n    roundtrip(\n      ListModulesResponse(\n        123,\n        234,\n        listOf(PathElement(\"foo\", true), PathElement(\"bar\", false)),\n        null,\n      )\n    )\n    roundtrip(ListModulesResponse(123, 234, null, \"Something dun went wrong\"))\n  }\n\n  @Test\n  fun `round-trip ListResourcesRequest`() {\n    roundtrip(ListResourcesRequest(987, 1359, URI(\"bar:/bazzy\")))\n  }\n\n  @Test\n  fun `round-trip ListResourcesResponse`() {\n    roundtrip(\n      ListResourcesResponse(\n        3851,\n        3019,\n        listOf(PathElement(\"foo\", true), PathElement(\"bar\", false)),\n        null,\n      )\n    )\n    roundtrip(ListResourcesResponse(3851, 3019, null, \"something went wrong\"))\n  }\n\n  @Test\n  fun `decode request with missing request ID`() {\n    val bytes =\n      MessagePack.newDefaultBufferPacker()\n        .apply {\n          packArrayHeader(2)\n          packInt(Message.Type.LIST_RESOURCES_REQUEST.code)\n          packMapHeader(1)\n          packString(\"uri\")\n          packString(\"file:/test\")\n        }\n        .toByteArray()\n\n    val decoder = BaseMessagePackDecoder(MessagePack.newDefaultUnpacker(bytes))\n    val exception = assertThrows<DecodeException> { decoder.decode() }\n    assertThat(exception.message).contains(\"requestId\")\n  }\n\n  @Test\n  fun `decode invalid message header`() {\n    val bytes = MessagePack.newDefaultBufferPacker().apply { packInt(2) }.toByteArray()\n\n    val decoder = BaseMessagePackDecoder(MessagePack.newDefaultUnpacker(bytes))\n    val exception = assertThrows<DecodeException> { decoder.decode() }\n    assertThat(exception).hasMessage(\"Malformed message header.\")\n    assertThat(exception).hasRootCauseMessage(\"Expected Array, but got Integer (02)\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/module/ModuleKeyFactoriesTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module\n\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.outputStream\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.toPath\nimport org.pkl.commons.writeString\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.externalreader.*\n\nclass ModuleKeyFactoriesTest {\n  @Test\n  fun `standard library`() {\n    val factory = ModuleKeyFactories.standardLibrary\n    assertThat(factory.create(URI(\"other:test\"))).isNotPresent\n\n    val module = factory.create(URI(\"pkl:test\"))\n    assertThat(module).isPresent\n  }\n\n  @Test\n  fun file() {\n    val factory = ModuleKeyFactories.file\n    assertThat(factory.create(URI(\"other:test\"))).isNotPresent\n\n    val module = factory.create(URI(\"file:///some/file\"))\n    assertThat(module).isPresent\n  }\n\n  @Test\n  fun `generic url`() {\n    val factory = ModuleKeyFactories.genericUrl\n    assertThat(factory.create(URI(\"other:text\"))).isNotPresent\n\n    val module = factory.create(URI(\"file:///some/file\"))\n    assertThat(module).isPresent\n  }\n\n  @Test\n  fun `class path`() {\n    val factory = ModuleKeyFactories.classPath(this::class.java.classLoader)\n    assertThat(factory.create(URI(\"other:text\"))).isNotPresent\n\n    val module = factory.create(URI(\"modulepath:/foo/bar.pkl\"))\n    assertThat(module).isPresent\n  }\n\n  @Test\n  fun `module path - basics`() {\n    val factory = ModuleKeyFactories.modulePath(ModulePathResolver(listOf(\"/path\".toPath())))\n    assertThat(factory.create(URI(\"other:text\"))).isNotPresent\n\n    val module = factory.create(URI(\"modulepath:/foo/bar.pkl\"))\n    assertThat(module).isPresent\n  }\n\n  @Test\n  fun `module path - directories`(@TempDir tempDir: Path) {\n    val dir1 = tempDir.resolve(\"foo/bar\").createDirectories()\n    val dir2 = tempDir.resolve(\"foo2/bar2\").createDirectories()\n    val filePath = dir2.resolve(\"baz/mymodule.pkl\").createParentDirectories().writeString(\"x = 1\")\n\n    val factory = ModuleKeyFactories.modulePath(ModulePathResolver(listOf(dir1, dir2)))\n    val module = factory.create(URI(\"modulepath:/baz/mymodule.pkl\"))\n    assertThat(module).isPresent\n\n    val resolved = module.get().resolve(SecurityManagers.defaultManager)\n    assertThat(resolved.original).isSameAs(module.get())\n    assertThat(resolved.uri).isEqualTo(filePath.toRealPath().toUri())\n    assertThat(resolved.loadSource().trim()).isEqualTo(\"x = 1\")\n  }\n\n  @Test\n  fun `module path - jar files`(@TempDir tempDir: Path) {\n    val jarFile = tempDir.resolve(\"test.jar\")\n    jarFile.outputStream().use { outStream ->\n      javaClass.getResourceAsStream(\"test.jar\")!!.use { inStream -> inStream.copyTo(outStream) }\n    }\n\n    val factory = ModuleKeyFactories.modulePath(ModulePathResolver(listOf(jarFile)))\n    val module = factory.create(URI(\"modulepath:/dir1/module1.pkl\"))\n    assertThat(module).isPresent\n\n    val resolved = module.get().resolve(SecurityManagers.defaultManager)\n    assertThat(resolved.original).isSameAs(module.get())\n    assertThat(resolved.uri.toString()).startsWith(\"jar:file:\")\n    assertThat(resolved.uri.toString()).endsWith(\"/test.jar!/dir1/module1.pkl\")\n    assertThat(resolved.loadSource().trim()).isEqualTo(\"x = 1\")\n\n    // Assert that creating a modulekey from the resolved URI is still a ModulePath\n    val module2 = factory.create(resolved.uri)\n    assertThat(module2).isPresent\n    assertThat(module2.get()).hasSameClassAs(module.get())\n  }\n\n  @Test\n  fun `module path via service provider`() {\n    val factories = ModuleKeyFactories.fromServiceProviders()\n    assertThat(factories).hasSize(1)\n\n    val factory = factories.single()\n\n    val module = factory.create(URI(\"test:foo\"))\n    assertThat(module).isPresent\n    assertThat(module.get().uri.scheme).isEqualTo(\"modulepath\")\n\n    val module2 = factory.create(URI(\"other\"))\n    assertThat(module2).isNotPresent\n  }\n\n  @Test\n  fun externalProcess() {\n    val extReader = TestExternalModuleReader()\n    val (proc, runtime) =\n      TestExternalReaderProcess.initializeTestHarness(listOf(extReader), emptyList())\n\n    val factory = ModuleKeyFactories.externalProcess(extReader.scheme, proc)\n\n    val module = factory.create(URI(\"test:foo\"))\n    assertThat(module).isPresent\n    assertThat(module.get().uri.scheme).isEqualTo(\"test\")\n\n    val module2 = factory.create(URI(\"other\"))\n    assertThat(module2).isNotPresent\n\n    proc.close()\n    runtime.close()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/module/ModuleKeysTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module\n\nimport java.io.FileNotFoundException\nimport java.net.MalformedURLException\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.nio.file.Path\nimport kotlin.io.path.createFile\nimport kotlin.io.path.createParentDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.toPath\nimport org.pkl.commons.writeString\nimport org.pkl.core.SecurityManagers\n\nclass ModuleKeysTest {\n  private val securityManager = SecurityManagers.defaultManager\n\n  @Test\n  fun synthetic() {\n    val key = ModuleKeys.synthetic(URI(\"repl:some\"), \"age = 40\")\n\n    assertThat(key.uri).isEqualTo(URI(\"repl:some\"))\n    assertThat(key.isCached).isFalse\n    assertThat(ModuleKeys.isStdLibModule(key)).isFalse\n    assertThat(ModuleKeys.isBaseModule(key)).isFalse\n\n    assertThat(key.resolve(securityManager).uri).isEqualTo(URI(\"repl:some\"))\n    assertThat(key.resolve(securityManager).loadSource()).contains(\"age = 40\")\n  }\n\n  @Test\n  fun `standard library`() {\n    val key = ModuleKeys.standardLibrary(URI(\"pkl:test\"))\n\n    assertThat(key.uri).isEqualTo(URI(\"pkl:test\"))\n    assertThat(key.isCached).isTrue\n    assertThat(ModuleKeys.isStdLibModule(key)).isTrue\n    assertThat(ModuleKeys.isBaseModule(key)).isFalse\n\n    assertThat(key.resolve(securityManager).uri).isEqualTo(URI(\"pkl:test\"))\n    assertThat(key.resolve(securityManager).loadSource()).contains(\"module pkl.test\")\n  }\n\n  @Test\n  fun `standard library - wrong scheme`() {\n    assertThrows<IllegalArgumentException> { ModuleKeys.standardLibrary(URI(\"other:base\")) }\n  }\n\n  @Test\n  fun `file`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"foo.pkl\").createFile()\n    file.writeString(\"age = 40\")\n\n    val uri = file.toUri()\n    val key = ModuleKeys.file(uri)\n\n    assertThat(key.uri).isEqualTo(uri)\n    assertThat(key.isCached).isTrue\n    assertThat(ModuleKeys.isStdLibModule(key)).isFalse\n    assertThat(ModuleKeys.isBaseModule(key)).isFalse\n\n    val resolvedKey = key.resolve(securityManager)\n    val resolvedUri = uri.toPath().toRealPath().toUri()\n\n    assertThat(resolvedKey.uri).isEqualTo(resolvedUri)\n    assertThat(resolvedKey.loadSource()).isEqualTo(\"age = 40\")\n  }\n\n  @Test\n  fun `class path`() {\n    val uri = URI(\"modulepath:/org/pkl/core/module/NamedModuleResolversTest.pkl\")\n    val key = ModuleKeys.classPath(uri, ModuleKeysTest::class.java.classLoader)\n\n    assertThat(key.uri).isEqualTo(uri)\n    assertThat(key.isCached).isTrue\n    assertThat(ModuleKeys.isStdLibModule(key)).isFalse\n    assertThat(ModuleKeys.isBaseModule(key)).isFalse\n\n    val resolved = key.resolve(SecurityManagers.defaultManager)\n    assertThat(resolved.original).isSameAs(key)\n    assertThat(resolved.uri.scheme).isEqualTo(\"file\")\n    assertThat(resolved.uri.path).endsWith(\"/org/pkl/core/module/NamedModuleResolversTest.pkl\")\n    assertThat(resolved.loadSource().trim()).isEqualTo(\"x = 1\")\n  }\n\n  @Test\n  fun `class path - wrong scheme`() {\n    assertThrows<IllegalArgumentException> {\n      ModuleKeys.classPath(URI(\"other:base\"), ModuleKeysTest::class.java.classLoader)\n    }\n  }\n\n  @Test\n  fun `class path - module not found`() {\n    val key =\n      ModuleKeys.classPath(URI(\"modulepath:/non/existing\"), ModuleKeysTest::class.java.classLoader)\n\n    assertThrows<FileNotFoundException> { key.resolve(SecurityManagers.defaultManager) }\n  }\n\n  @Test\n  fun `class path - missing leading slash`() {\n    val e =\n      assertThrows<IllegalArgumentException> {\n        ModuleKeys.classPath(URI(\"modulepath:foo/bar.pkl\"), ModuleKeysTest::class.java.classLoader)\n      }\n    assertThat(e).hasMessageContaining(\"`/`\")\n  }\n\n  @Test\n  fun `module path`(@TempDir tempDir: Path) {\n    val file = tempDir.resolve(\"foo/bar.pkl\").createParentDirectories()\n    file.writeString(\"age = 40\")\n\n    val uri = URI(\"modulepath:/foo/bar.pkl\")\n    val key = ModuleKeys.modulePath(uri, ModulePathResolver(listOf(tempDir)))\n\n    assertThat(key.uri).isEqualTo(uri)\n    assertThat(key.isCached).isTrue\n    assertThat(ModuleKeys.isStdLibModule(key)).isFalse\n    assertThat(ModuleKeys.isBaseModule(key)).isFalse\n\n    val resolvedKey = key.resolve(securityManager)\n\n    assertThat(resolvedKey.uri.scheme).isEqualTo(\"file\")\n    assertThat(resolvedKey.loadSource()).isEqualTo(\"age = 40\")\n  }\n\n  @Test\n  fun `module path - wrong scheme`() {\n    assertThrows<IllegalArgumentException> {\n      ModuleKeys.modulePath(URI(\"other:base\"), ModulePathResolver(listOf()))\n    }\n  }\n\n  @Test\n  fun `module path - module not found`() {\n    val key = ModuleKeys.modulePath(URI(\"modulepath:/non/existing\"), ModulePathResolver(listOf()))\n\n    assertThrows<FileNotFoundException> { key.resolve(SecurityManagers.defaultManager) }\n  }\n\n  @Test\n  fun `module path - missing leading slash`() {\n    val e =\n      assertThrows<IllegalArgumentException> {\n        ModuleKeys.modulePath(URI(\"modulepath:foo/bar.pkl\"), ModulePathResolver(listOf()))\n      }\n    assertThat(e).hasMessageContaining(\"`/`\")\n  }\n\n  @Test\n  fun `package - no version`() {\n    val e =\n      assertThrows<URISyntaxException> {\n        ModuleKeys.pkg(URI(\"package://localhost:0/birds#/Bird.pkl\"))\n      }\n    assertThat(e).hasMessageContaining(\"A package URI must have its path suffixed by its version\")\n  }\n\n  @Test\n  fun `package - invalid semver`() {\n    val e =\n      assertThrows<URISyntaxException> {\n        ModuleKeys.pkg(URI(\"package://localhost:0/birds@notAVersion#/Bird.pkl\"))\n      }\n    assertThat(e).hasMessageContaining(\"`notAVersion` could not be parsed\")\n  }\n\n  @Test\n  fun `package - missing leading slash`() {\n    val e = assertThrows<URISyntaxException> { ModuleKeys.pkg(URI(\"package:invalid\")) }\n    assertThat(e)\n      .hasMessageContaining(\"Module URI `package:invalid` is missing a `/` after `package:`\")\n  }\n\n  @Test\n  fun `package - missing authority`() {\n    val e = assertThrows<URISyntaxException> { ModuleKeys.pkg(URI(\"package:/not/a/valid/path\")) }\n    assertThat(e).hasMessageContaining(\"Package URIs must have an authority component\")\n\n    val e2 = assertThrows<URISyntaxException> { ModuleKeys.pkg(URI(\"package:///not/a/valid/path\")) }\n    assertThat(e2).hasMessageContaining(\"Package URIs must have an authority component\")\n  }\n\n  @Test\n  fun `package - missing path`() {\n    val e = assertThrows<URISyntaxException> { ModuleKeys.pkg(URI(\"package://example.com\")) }\n    assertThat(e).hasMessageContaining(\"Package URIs must have a path component\")\n  }\n\n  @Test\n  fun `generic URL`() {\n    val uri = URI(\"https://apple.com/some/foo.pkl\")\n    val key = ModuleKeys.genericUrl(uri)\n\n    assertThat(key.uri).isEqualTo(uri)\n    assertThat(key.isCached).isTrue\n\n    assertThat(ModuleKeys.isStdLibModule(key)).isFalse\n    assertThat(ModuleKeys.isBaseModule(key)).isFalse\n  }\n\n  @Test\n  fun `generic URL - resolve`(@TempDir tempDir: Path) {\n    // use file: URL because it's easiest to test (but normally handled by ModuleKeys.file())\n\n    val file = tempDir.resolve(\"foo.pkl\").createFile()\n    file.writeString(\"age = 40\")\n\n    val uri = file.toUri()\n    val key = ModuleKeys.genericUrl(uri)\n\n    val resolvedKey = key.resolve(securityManager)\n    assertThat(resolvedKey.uri).isEqualTo(uri)\n    assertThat(resolvedKey.loadSource()).isEqualTo(\"age = 40\")\n  }\n\n  @Test\n  fun `generic URL with unknown scheme`() {\n    val uri = URI(\"repl:foo\")\n    val key = ModuleKeys.genericUrl(uri)\n\n    val e = assertThrows<MalformedURLException> { key.resolve(securityManager) }\n\n    assertThat(e).hasMessage(\"unknown protocol: repl\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/module/ModulePathResolverTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module\n\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\n\nclass ModulePathResolverTest {\n  @Test\n  fun `close without having been used`() {\n    val resolver = ModulePathResolver(listOf())\n    assertThatCode { resolver.close() }.doesNotThrowAnyException()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/module/ResolvedModuleKeysTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module\n\nimport java.net.URI\nimport java.nio.file.Path\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.createTempFile\nimport org.pkl.commons.writeString\n\nclass ResolvedModuleKeysTest {\n  private val module = ModuleKeys.synthetic(URI(\"test:module\"), \"x = 1\")\n\n  @Test\n  fun `path()`(@TempDir tempDir: Path) {\n    val path = tempDir.createTempFile().writeString(\"x = 1\")\n    val resolvedUri = URI(\"test:resolved.uri\")\n    val resolved = ResolvedModuleKeys.file(module, resolvedUri, path)\n\n    assertThat(resolved.original).isSameAs(module)\n    assertThat(resolved.uri).isEqualTo(resolvedUri)\n    assertThat(resolved.loadSource()).isEqualTo(\"x = 1\")\n  }\n\n  @Test\n  fun `url()`(@TempDir tempDir: Path) {\n    val path = tempDir.createTempFile().writeString(\"x = 1\")\n    val resolvedUri = URI(\"test:resolved.uri\")\n    val resolved = ResolvedModuleKeys.url(module, resolvedUri, path.toUri().toURL())\n\n    assertThat(resolved.original).isSameAs(module)\n    assertThat(resolved.uri).isEqualTo(resolvedUri)\n    assertThat(resolved.loadSource()).isEqualTo(\"x = 1\")\n  }\n\n  @Test\n  fun `virtual()`() {\n    val resolvedUri = URI(\"test:resolved.uri\")\n    val resolved = ResolvedModuleKeys.virtual(module, resolvedUri, \"x = 1\", false)\n\n    assertThat(resolved.original).isSameAs(module)\n    assertThat(resolved.uri).isEqualTo(resolvedUri)\n    assertThat(resolved.loadSource()).isEqualTo(\"x = 1\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/module/ServiceProviderTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource\nimport org.pkl.core.PClassInfo\nimport org.pkl.core.PModule\n\nclass ServiceProviderTest {\n  @Test\n  fun `load module through service provider`() {\n    val module = Evaluator.preconfigured().evaluate(ModuleSource.uri(URI(\"test:foo\")))\n\n    val uri = URI(\"modulepath:/org/pkl/core/module/testFactoryTest.pkl\")\n    Assertions.assertThat(module)\n      .isEqualTo(\n        PModule(\n          uri,\n          \"testFactoryTest\",\n          PClassInfo.forModuleClass(\"testFactoryTest\", uri),\n          mapOf(\"name\" to \"Pigeon\", \"age\" to 40L),\n        )\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/module/TestModuleKeyFactory.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.module\n\nimport java.net.URI\nimport java.util.*\n\nclass TestModuleKeyFactory : ModuleKeyFactory {\n  override fun create(uri: URI): Optional<ModuleKey> =\n    if (uri.scheme == \"test\") {\n      ModuleKeyFactories.classPath(this::class.java.classLoader)\n        .create(URI(\"modulepath:/org/pkl/core/module/testFactoryTest.pkl\"))\n    } else {\n      Optional.empty<ModuleKey>()\n    }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/packages/DependencyMetadataTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages\n\nimport java.io.ByteArrayOutputStream\nimport java.net.URI\nimport java.nio.charset.StandardCharsets\nimport java.util.regex.Pattern\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.*\n\nclass DependencyMetadataTest {\n  private val dependencyMetadata =\n    DependencyMetadata(\n      \"my-proj-name\",\n      PackageUri(\"package://example.com/my-proj-name@0.10.0\"),\n      Version.parse(\"0.10.0\"),\n      URI(\"https://example.com/foo/bar@0.5.3.zip\"),\n      Checksums(\"abc123\"),\n      mapOf(\n        \"foo\" to\n          Dependency.RemoteDependency(\n            PackageUri(\"package://example.com/foo@0.5.3\"),\n            Checksums(\"abc123\"),\n          )\n      ),\n      \"https://example.com/my/source/0.5.3/blob%{path}#L%{line}-L%{endLine}\",\n      URI(\"https://example.com/my/source\"),\n      URI(\"https://example.com/my/docs\"),\n      \"MIT\",\n      \"The MIT License, you know it\",\n      listOf(\"birdy@bird.com\"),\n      URI(\"https://example.com/issues\"),\n      \"Some package description\",\n      listOf(\n        PObject(PClassInfo.Unlisted, mapOf()),\n        PObject(PClassInfo.Deprecated, mapOf(\"since\" to \"0.26.1\", \"message\" to \"don't use\")),\n        PObject(\n          PClassInfo.get(\"myModule\", \"MyAnnotation\", URI(\"pkl:fake\")),\n          mapOf(\n            \"string\" to \"bar\",\n            \"boolean\" to true,\n            \"long\" to 1L,\n            \"double\" to 1.66,\n            \"null\" to PNull.getInstance(),\n            \"list\" to listOf(\"a\", \"b\"),\n            \"set\" to setOf(\"a\", \"b\"),\n            \"map\" to mapOf(true to \"t\", false to \"f\"),\n            \"dataSize\" to DataSize(1.5, DataSizeUnit.GIGABYTES),\n            \"duration\" to Duration(2.9, DurationUnit.HOURS),\n            \"pair\" to Pair(1L, \"1\"),\n          ),\n        ),\n      ),\n    )\n  private val dependencyMetadataStr =\n    \"\"\"\n     {\n       \"name\": \"my-proj-name\",\n       \"packageUri\": \"package://example.com/my-proj-name@0.10.0\",\n       \"version\": \"0.10.0\",\n       \"packageZipUrl\": \"https://example.com/foo/bar@0.5.3.zip\",\n       \"packageZipChecksums\": {\n         \"sha256\": \"abc123\"\n       },\n       \"dependencies\": {\n         \"foo\": {\n           \"uri\": \"package://example.com/foo@0.5.3\",\n           \"checksums\": {\n             \"sha256\": \"abc123\"\n           }\n         }\n       },\n       \"sourceCodeUrlScheme\": \"https://example.com/my/source/0.5.3/blob%{path}#L%{line}-L%{endLine}\",\n       \"sourceCode\": \"https://example.com/my/source\",\n       \"documentation\": \"https://example.com/my/docs\",\n       \"license\": \"MIT\",\n       \"licenseText\": \"The MIT License, you know it\",\n       \"authors\": [\n         \"birdy@bird.com\"\n       ],\n       \"issueTracker\": \"https://example.com/issues\",\n       \"description\": \"Some package description\",\n       \"annotations\": [\n         {\n           \"type\": \"PObject\",\n           \"classInfo\": {\n             \"moduleName\": \"pkl.base\",\n             \"class\": \"Unlisted\",\n             \"moduleUri\": \"pkl:base\"\n           },\n           \"properties\": {}\n         },\n         {\n           \"type\": \"PObject\",\n           \"classInfo\": {\n             \"moduleName\": \"pkl.base\",\n             \"class\": \"Deprecated\",\n             \"moduleUri\": \"pkl:base\"\n           },\n           \"properties\": {\n             \"since\": \"0.26.1\",\n             \"message\": \"don't use\"\n           }\n         },\n         {\n           \"type\": \"PObject\",\n           \"classInfo\": {\n             \"moduleName\": \"myModule\",\n             \"class\": \"MyAnnotation\",\n             \"moduleUri\": \"pkl:fake\"\n           },\n           \"properties\": {\n             \"string\": \"bar\",\n             \"boolean\": true,\n             \"long\": 1,\n             \"double\": 1.66,\n             \"null\": null,\n             \"list\": [\n               \"a\",\n               \"b\"\n             ],\n             \"set\": {\n               \"type\": \"Set\",\n               \"value\": [\n                 \"a\",\n                 \"b\"\n               ]\n             },\n             \"map\": {\n               \"type\": \"Map\",\n               \"value\": [\n                 {\n                   \"key\": true,\n                   \"value\": \"t\"\n                 },\n                 {\n                   \"key\": false,\n                   \"value\": \"f\"\n                 }\n               ]\n             },\n             \"dataSize\": {\n               \"type\": \"DataSize\",\n               \"unit\": \"gb\",\n               \"value\": 1.5\n             },\n             \"duration\": {\n               \"type\": \"Duration\",\n               \"unit\": \"h\",\n               \"value\": 2.9\n             },\n             \"pair\": {\n               \"type\": \"Pair\",\n               \"first\": 1,\n               \"second\": \"1\"\n             }\n           }\n         }\n       ]\n     }\n    \"\"\"\n      .trimIndent()\n\n  @Test\n  fun parse() {\n    val parsed = DependencyMetadata.parse(dependencyMetadataStr)\n    assertThat(parsed).isEqualTo(dependencyMetadata)\n  }\n\n  /** Patterns cannot be compared with [equals], so we have to test them separately. */\n  @Test\n  fun testPatternSerialization() {\n    val dependencyMetadata =\n      DependencyMetadata(\n        \"my-proj-name\",\n        PackageUri(\"package://example.com/my-proj-name@0.10.0\"),\n        Version.parse(\"0.10.0\"),\n        URI(\"https://example.com/foo/bar@0.5.3.zip\"),\n        Checksums(\"abc123\"),\n        mapOf(),\n        \"https://example.com/my/source/0.5.3/blob%{path}#L%{line}-L%{endLine}\",\n        URI(\"https://example.com/my/source\"),\n        URI(\"https://example.com/my/docs\"),\n        \"MIT\",\n        \"The MIT License, you know it\",\n        listOf(\"birdy@bird.com\"),\n        URI(\"https://example.com/issues\"),\n        \"Some package description\",\n        listOf(\n          PObject(\n            PClassInfo.get(\"myModule\", \"MyAnnotation\", URI(\"pkl:fake\")),\n            mapOf(\"pattern\" to Regex(\".*\").toPattern()),\n          )\n        ),\n      )\n    val dependencyMetadataStr =\n      \"\"\"\n     {\n       \"name\": \"my-proj-name\",\n       \"packageUri\": \"package://example.com/my-proj-name@0.10.0\",\n       \"version\": \"0.10.0\",\n       \"packageZipUrl\": \"https://example.com/foo/bar@0.5.3.zip\",\n       \"packageZipChecksums\": {\n         \"sha256\": \"abc123\"\n       },\n       \"dependencies\": {},\n       \"sourceCodeUrlScheme\": \"https://example.com/my/source/0.5.3/blob%{path}#L%{line}-L%{endLine}\",\n       \"sourceCode\": \"https://example.com/my/source\",\n       \"documentation\": \"https://example.com/my/docs\",\n       \"license\": \"MIT\",\n       \"licenseText\": \"The MIT License, you know it\",\n       \"authors\": [\n         \"birdy@bird.com\"\n       ],\n       \"issueTracker\": \"https://example.com/issues\",\n       \"description\": \"Some package description\",\n       \"annotations\": [\n         {\n           \"type\": \"PObject\",\n           \"classInfo\": {\n             \"moduleName\": \"myModule\",\n             \"class\": \"MyAnnotation\",\n             \"moduleUri\": \"pkl:fake\"\n           },\n           \"properties\": {\n             \"pattern\": {\n               \"type\": \"Pattern\",\n               \"value\": \".*\"\n             }\n           }\n         }\n       ]\n     }\n    \"\"\"\n        .trimIndent()\n\n    val parsed = DependencyMetadata.parse(dependencyMetadataStr)\n    val expectedPattern = dependencyMetadata.annotations[0][\"pattern\"] as Pattern\n    val actualPattern = parsed.annotations[0][\"pattern\"]\n    assertThat(actualPattern).isInstanceOf(Pattern::class.java)\n    actualPattern as Pattern\n    assertThat(expectedPattern.pattern()).isEqualTo(actualPattern.pattern())\n\n    val str =\n      ByteArrayOutputStream()\n        .apply { dependencyMetadata.writeTo(this) }\n        .toString(StandardCharsets.UTF_8)\n    assertThat(str).isEqualTo(dependencyMetadataStr)\n  }\n\n  @Test\n  fun writeTo() {\n    val str =\n      ByteArrayOutputStream()\n        .apply { dependencyMetadata.writeTo(this) }\n        .toString(StandardCharsets.UTF_8)\n    assertThat(str).isEqualTo(dependencyMetadataStr)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/packages/PackageResolversTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.packages\n\nimport java.io.FileNotFoundException\nimport java.io.IOException\nimport java.nio.charset.StandardCharsets\nimport kotlin.io.path.ExperimentalPathApi\nimport kotlin.io.path.deleteRecursively\nimport kotlin.io.path.exists\nimport kotlin.io.path.readBytes\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.*\nimport org.junit.jupiter.api.parallel.Execution\nimport org.junit.jupiter.api.parallel.ExecutionMode\nimport org.pkl.commons.readString\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.test.listFilesRecursively\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.module.PathElement\n\nclass PackageResolversTest {\n  @TestInstance(TestInstance.Lifecycle.PER_CLASS)\n  abstract class AbstractPackageResolverTest {\n    abstract val resolver: PackageResolver\n\n    private val packageRoot =\n      FileTestUtils.rootProjectDir.resolve(\"pkl-commons-test/src/main/files/packages\")\n\n    // Each subclass gets its own PackageServer instance (instance property, Lifecycle.PER_CLASS).\n    // This is important because closePackageServer() is called once per subclass.\n    private val packageServer = PackageServer()\n\n    val httpClient: HttpClient by lazy {\n      HttpClient.builder()\n        .addCertificates(FileTestUtils.selfSignedCertificate)\n        .setTestPort(packageServer.port)\n        .build()\n    }\n\n    @AfterAll\n    fun closePackageServer() {\n      packageServer.close()\n    }\n\n    // execute test 3 times to check concurrent writes\n    @RepeatedTest(3)\n    @Execution(ExecutionMode.CONCURRENT)\n    fun `get module bytes`() {\n      val expectedBirdModule =\n        packageRoot.resolve(\"birds@0.5.0/package/Bird.pkl\").readString(StandardCharsets.UTF_8)\n      val assetUri = PackageAssetUri(\"package://localhost:0/birds@0.5.0#/Bird.pkl\")\n      val birdModule = resolver.getBytes(assetUri, false, null).toString(StandardCharsets.UTF_8)\n      assertThat(birdModule).isEqualTo(expectedBirdModule)\n    }\n\n    @Test\n    fun `get directory`() {\n      val assetUri = PackageAssetUri(\"package://localhost:0/birds@0.5.0#/\")\n      val err =\n        assertThrows<IOException> {\n          resolver.getBytes(assetUri, false, null).toString(StandardCharsets.UTF_8)\n        }\n      assertThat(err).hasMessage(\"Is a directory\")\n    }\n\n    @Test\n    fun `get directory, allowing directory reads`() {\n      val assetUri = PackageAssetUri(\"package://localhost:0/birds@0.5.0#/\")\n      val bytes = resolver.getBytes(assetUri, true, null).toString(StandardCharsets.UTF_8)\n      assertThat(bytes)\n        .isEqualTo(\n          \"\"\"\n        Bird.pkl\n        allFruit.pkl\n        catalog\n        catalog.pkl\n        some\n\n      \"\"\"\n            .trimIndent()\n        )\n    }\n\n    @Test\n    fun `get module bytes resolving path`() {\n      val expectedBirdModule =\n        packageRoot.resolve(\"birds@0.5.0/package/Bird.pkl\").readString(StandardCharsets.UTF_8)\n      val assetUri = PackageAssetUri(\"package://localhost:0/birds@0.5.0#/foo/../Bird.pkl\")\n      val birdModule = resolver.getBytes(assetUri, false, null).toString(StandardCharsets.UTF_8)\n      assertThat(birdModule).isEqualTo(expectedBirdModule)\n    }\n\n    @Test\n    fun `list path elements at root`() {\n      // cast to set to avoid sort issues\n      val elements =\n        resolver.listElements(PackageAssetUri(\"package://localhost:0/birds@0.5.0#/\"), null).toSet()\n      assertThat(elements)\n        .isEqualTo(\n          setOf(\n            PathElement(\"some\", true),\n            PathElement(\"catalog\", true),\n            PathElement(\"Bird.pkl\", false),\n            PathElement(\"allFruit.pkl\", false),\n            PathElement(\"catalog.pkl\", false),\n          )\n        )\n    }\n\n    @Test\n    fun `get multiple assets`() {\n      val bird =\n        resolver.getBytes(\n          PackageAssetUri(\"package://localhost:0/birds@0.5.0#/Bird.pkl\"),\n          false,\n          null,\n        )\n      val swallow =\n        resolver.getBytes(\n          PackageAssetUri(\"package://localhost:0/birds@0.5.0#/catalog/Swallow.pkl\"),\n          false,\n          null,\n        )\n      assertThat(bird).isEqualTo(packageRoot.resolve(\"birds@0.5.0/package/Bird.pkl\").readBytes())\n      assertThat(swallow)\n        .isEqualTo(packageRoot.resolve(\"birds@0.5.0/package/catalog/Swallow.pkl\").readBytes())\n    }\n\n    @Test\n    fun `list path elements in nested directory`() {\n      // cast to set to avoid sort issues\n      val elements =\n        resolver\n          .listElements(PackageAssetUri(\"package://localhost:0/birds@0.5.0#/catalog/\"), null)\n          .toSet()\n      assertThat(elements)\n        .isEqualTo(setOf(PathElement(\"Ostrich.pkl\", false), PathElement(\"Swallow.pkl\", false)))\n    }\n\n    @Test\n    fun `getBytes() throws FileNotFound if package exists but path does not`() {\n      assertThrows<FileNotFoundException> {\n        resolver\n          .getBytes(PackageAssetUri(\"package://localhost:0/birds@0.5.0#/Horse.pkl\"), false, null)\n          .toString(StandardCharsets.UTF_8)\n      }\n    }\n\n    @Test\n    fun `getBytes() throws PackageLoadError if package does not exist`() {\n      assertThrows<PackageLoadError> {\n        resolver\n          .getBytes(\n            PackageAssetUri(\"package://localhost:0/not-a-package@0.5.0#/Horse.pkl\"),\n            false,\n            null,\n          )\n          .toString(StandardCharsets.UTF_8)\n      }\n    }\n\n    @Test\n    fun `requires package zip to be an HTTPS URI`() {\n      assertThatCode {\n          resolver.getBytes(\n            PackageAssetUri(\"package://localhost:0/badPackageZipUrl@1.0.0#/Bug.pkl\"),\n            false,\n            null,\n          )\n        }\n        .hasMessage(\n          \"Expected the zip asset for package `package://localhost:0/badPackageZipUrl@1.0.0` to be an HTTPS URI, but got `ftp://wait/a/minute`.\"\n        )\n    }\n\n    @Test\n    fun `throws if package checksum is invalid`() {\n      val error =\n        assertThrows<PackageLoadError> {\n          resolver.getBytes(\n            PackageAssetUri(\"package://localhost:0/badChecksum@1.0.0#/Bug.pkl\"),\n            false,\n            null,\n          )\n        }\n      assertThat(error)\n        .hasMessageContaining(\n          \"\"\"\n        Computed checksum: \"a6bf858cdd1c09da475c2abe50525902580910ee5cc1ff624999170591bf8f69\"\n        Expected checksum: \"intentionally bogus checksum\"\n      \"\"\"\n            .trimIndent()\n        )\n    }\n  }\n\n  @ExperimentalPathApi\n  class DiskCachedPackageResolverTest : AbstractPackageResolverTest() {\n    private val cacheDir = FileTestUtils.rootProjectDir.resolve(\"pkl-core/build/test-cache\")\n\n    @BeforeAll\n    fun deleteCacheDir() {\n      cacheDir.deleteRecursively()\n    }\n\n    @AfterAll\n    fun checkCacheDir() {\n      assertThat(cacheDir.exists())\n      assertThat(cacheDir.listFilesRecursively()).isNotEmpty\n    }\n\n    override val resolver: PackageResolver =\n      PackageResolvers.DiskCachedPackageResolver(\n        SecurityManagers.defaultManager,\n        httpClient,\n        cacheDir,\n      )\n  }\n\n  class InMemoryPackageResolverTest : AbstractPackageResolverTest() {\n    override val resolver: PackageResolver =\n      PackageResolvers.InMemoryPackageResolver(SecurityManagers.defaultManager, httpClient)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/parser/MultiLineStringLiteralTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.parser\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource\n\n// tests whitespace handling in multi-line string literals that cannot be reliably tested via\n// snippets\n// (e.g. due to editors not displaying and/or automatically removing whitespace)\nclass MultiLineStringLiteralTest {\n  private val evaluator = Evaluator.preconfigured()\n\n  @Test\n  fun `multi-line strings have unix newlines`() {\n    val module =\n      evaluator.evaluate(ModuleSource.text(\"x = \\\"\\\"\\\"\\none\\rtwo\\nthree\\r\\nfour\\n\\\"\\\"\\\"\"))\n    assertThat(module.properties[\"x\"]).isEqualTo(\"one\\ntwo\\nthree\\nfour\")\n  }\n\n  @Test\n  fun `raw multi-line strings have unix newlines`() {\n    val module =\n      evaluator.evaluate(ModuleSource.text(\"x = #\\\"\\\"\\\"\\none\\rtwo\\nthree\\r\\nfour\\n\\\"\\\"\\\"#\"))\n    assertThat(module.properties[\"x\"]).isEqualTo(\"one\\ntwo\\nthree\\nfour\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/parser/ShebangTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.parser\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource\n\nclass ShebangTest {\n  private val evaluator = Evaluator.preconfigured()\n\n  @Test\n  fun `shebang is ignored`() {\n    val module =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n          #!/usr/local/bin/pkl\n          x = 1\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    assertThat(module.properties[\"x\"]).isEqualTo(1L)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/parser/TrailingCommasTest.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.parser\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.parser.Parser\n\n// tests type argument and parameter parsing with trailing commas that cannot be tested with\n// snippets because these constructs are currently only allowed in the stdlib\nclass TrailingCommasTest {\n  @Test\n  fun `class type parameter lists parse correctly`() {\n    val module =\n      Parser()\n        .parseModule(\n          \"\"\"\n        class Foo<\n          Key,\n          Value,\n        >\n        \n        class Bar<\n          Key,\n          Value,\n        > {\n          baz: Key\n          buzz: Value\n        }\n      \"\"\"\n            .trimIndent()\n        )\n\n    val fooClass = module.classes.find { it.name.value == \"Foo\" }\n    assertThat(fooClass).isNotNull\n    assertThat(fooClass!!.typeParameterList?.parameters?.first()?.identifier?.value)\n      .isEqualTo(\"Key\")\n    assertThat(fooClass.typeParameterList?.parameters?.last()?.identifier?.value).isEqualTo(\"Value\")\n\n    val barClass = module.classes.find { it.name.value == \"Bar\" }\n    assertThat(barClass).isNotNull\n    assertThat(barClass!!.typeParameterList?.parameters?.first()?.identifier?.value)\n      .isEqualTo(\"Key\")\n    assertThat(barClass.typeParameterList?.parameters?.last()?.identifier?.value).isEqualTo(\"Value\")\n  }\n\n  @Test\n  fun `method type parameter lists parse correctly`() {\n    val module =\n      Parser()\n        .parseModule(\n          \"\"\"\n        function foo<\n          A,\n          B,\n        >(a: A, b: B,): Value? = \"\\(a):\\(b)\"\n      \"\"\"\n            .trimIndent()\n        )\n\n    val fooMethod = module.methods.find { it.name.value == \"foo\" }\n    assertThat(fooMethod).isNotNull\n    assertThat(fooMethod!!.typeParameterList?.parameters?.first()?.identifier?.value).isEqualTo(\"A\")\n    assertThat(fooMethod.typeParameterList?.parameters?.last()?.identifier?.value).isEqualTo(\"B\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/project/ProjectDependenciesResolverTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project\n\nimport java.io.ByteArrayOutputStream\nimport java.nio.charset.StandardCharsets\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.toPath\nimport org.pkl.core.PklException\nimport org.pkl.core.SecurityManagers\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.packages.PackageResolver\n\nclass ProjectDependenciesResolverTest {\n  companion object {\n    private val packageServer = PackageServer()\n\n    @JvmStatic\n    @AfterAll\n    fun afterAll() {\n      packageServer.close()\n    }\n\n    val httpClient: HttpClient by lazy {\n      HttpClient.builder()\n        .addCertificates(FileTestUtils.selfSignedCertificate)\n        .setTestPort(packageServer.port)\n        .build()\n    }\n  }\n\n  @Test\n  fun resolveDependencies() {\n    val project2Path = javaClass.getResource(\"project2/PklProject\")!!.toURI().toPath()\n    val project = Project.loadFromPath(project2Path)\n    val packageResolver =\n      PackageResolver.getInstance(SecurityManagers.defaultManager, httpClient, null)\n    val deps = ProjectDependenciesResolver(project, packageResolver, System.out.writer()).resolve()\n    val strDeps =\n      ByteArrayOutputStream()\n        .apply { deps.writeTo(this) }\n        .toByteArray()\n        .toString(StandardCharsets.UTF_8)\n    assertThat(strDeps)\n      .isEqualTo(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.BIRDS_SHA}\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.1.0\",\n            \"checksums\": {\n              \"sha256\": \"${PackageServer.FRUIT_1_1_SHA}\"\n            }\n          },\n          \"package://localhost:0/project3@1\": {\n            \"type\": \"local\",\n            \"uri\": \"projectpackage://localhost:0/project3@1.5.0\",\n            \"path\": \"../project3\"\n          }\n        }\n      }\n      \n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `fails if project declares a package with an incorrect checksum`() {\n    val projectPath = javaClass.getResource(\"badProjectChecksum/PklProject\")!!.toURI().toPath()\n    val project = Project.loadFromPath(projectPath)\n    val packageResolver =\n      PackageResolver.getInstance(SecurityManagers.defaultManager, httpClient, null)\n    val e =\n      assertThrows<PklException> {\n        ProjectDependenciesResolver(project, packageResolver, System.err.writer()).resolve()\n      }\n    assertThat(e)\n      .hasMessage(\n        \"\"\"\n      Computed checksum did not match declared checksum for dependency `package://localhost:0/birds@0.5.0`.\n\n      Computed: \"${PackageServer.BIRDS_SHA}\"\n      Declared: \"intentionally bogus value\"\n    \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/project/ProjectDepsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project\n\nimport java.io.ByteArrayOutputStream\nimport java.nio.file.Path\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.packages.Checksums\nimport org.pkl.core.packages.Dependency\nimport org.pkl.core.packages.PackageUri\nimport org.pkl.core.util.EconomicMaps\n\nclass ProjectDepsTest {\n  private val projectDepsStr =\n    \"\"\"\n        {\n          \"schemaVersion\": 1,\n          \"resolvedDependencies\": {\n            \"package://localhost:0/birds@0\": {\n              \"type\": \"remote\",\n              \"uri\": \"package://localhost:0/birds@0.5.0\",\n              \"checksums\": {\n                \"sha256\": \"abc123\"\n              }\n            },\n            \"package://localhost:0/fruit@1\": {\n              \"type\": \"local\",\n              \"uri\": \"package://localhost:0/fruit@1.1.0\",\n              \"path\": \"../fruit\"\n            }\n          }\n        }\n        \n      \"\"\"\n      .trimIndent()\n\n  private val projectDeps = let {\n    val projectDepsMap =\n      EconomicMaps.of<CanonicalPackageUri, Dependency>(\n        CanonicalPackageUri.of(\"package://localhost:0/birds@0\"),\n        Dependency.RemoteDependency(\n          PackageUri.create(\"package://localhost:0/birds@0.5.0\"),\n          Checksums(\"abc123\"),\n        ),\n        CanonicalPackageUri.of(\"package://localhost:0/fruit@1\"),\n        Dependency.LocalDependency(\n          PackageUri.create(\"package://localhost:0/fruit@1.1.0\"),\n          Path.of(\"../fruit\"),\n        ),\n      )\n    ProjectDeps(projectDepsMap)\n  }\n\n  @Test\n  fun writeTo() {\n    val str = ByteArrayOutputStream().apply { projectDeps.writeTo(this) }.toString(Charsets.UTF_8)\n    assertThat(str).isEqualTo(projectDepsStr)\n  }\n\n  @Test\n  fun parse() {\n    val parsedProjectDeps = ProjectDeps.parse(projectDepsStr)\n    assertThat(parsedProjectDeps).isEqualTo(projectDeps)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/project/ProjectTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.project\n\nimport java.net.URI\nimport java.nio.file.Path\nimport java.util.regex.Pattern\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.toPath\nimport org.pkl.commons.writeString\nimport org.pkl.core.*\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.packages.PackageUri\n\nclass ProjectTest {\n  @Test\n  fun loadFromPath(@TempDir path: Path) {\n    val projectPath = path.resolve(\"PklProject\")\n    val expectedPackage =\n      Package(\n        \"hawk\",\n        PackageUri(\"package://example.com/hawk@0.5.0\"),\n        Version.parse(\"0.5.0\"),\n        URI(\"https://example.com/hawk/0.5.0/hawk-0.5.0.zip\"),\n        \"Some project about hawks\",\n        listOf(\"Birdy Bird <birdy@bird.com>\"),\n        URI(\"https://example.com/my/website\"),\n        URI(\"https://example.com/my/docs\"),\n        URI(\"https://example.com/my/repo\"),\n        \"https://example.com/my/repo/0.5.0%{path}\",\n        \"MIT\",\n        \"\"\"\n        # Some License text\n        \n        This is my license text\n      \"\"\"\n          .trimIndent(),\n        URI(\"https://example.com/my/issues\"),\n        listOf(Path.of(\"apiTest1.pkl\"), Path.of(\"apiTest2.pkl\")),\n        listOf(\"PklProject\", \"PklProject.deps.json\", \".**\", \"*.exe\"),\n      )\n    val expectedSettings =\n      PklEvaluatorSettings(\n        mapOf(\"two\" to \"2\"),\n        mapOf(\"one\" to \"1\"),\n        listOf(\"foo:\", \"bar:\").map(Pattern::compile),\n        listOf(\"baz:\", \"biz:\").map(Pattern::compile),\n        null,\n        false,\n        path.resolve(\"cache/\"),\n        listOf(path.resolve(\"modulepath1/\"), path.resolve(\"modulepath2/\")),\n        Duration.ofMinutes(5.0),\n        path,\n        null,\n        null,\n        null,\n        null,\n      )\n    val expectedAnnotations =\n      listOf(\n        PObject(\n          PClassInfo.Deprecated,\n          mapOf(\"since\" to \"1.2\", \"message\" to \"do not use\", \"replaceWith\" to \"somethingElse\"),\n        ),\n        PObject(PClassInfo.Unlisted, mapOf()),\n        PObject(PClassInfo.ModuleInfo, mapOf(\"minPklVersion\" to \"0.26.0\")),\n      )\n    projectPath.writeString(\n      \"\"\"\n      @Deprecated { since = \"1.2\"; message = \"do not use\"; replaceWith = \"somethingElse\" }\n      @Unlisted\n      @ModuleInfo { minPklVersion = \"0.26.0\" }\n      amends \"pkl:Project\"\n\n      evaluatorSettings {\n        timeout = 5.min\n        rootDir = \".\"\n        noCache = false\n        moduleCacheDir = \"cache/\"\n        env {\n          [\"one\"] = \"1\"\n        }\n        externalProperties {\n          [\"two\"] = \"2\"\n        }\n        modulePath {\n          \"modulepath1/\"\n          \"modulepath2/\"\n        }\n        allowedModules {\n          \"foo:\"\n          \"bar:\"\n        }\n        allowedResources {\n          \"baz:\"\n          \"biz:\"\n        }\n      }\n\n      package {\n        name = \"hawk\"\n        baseUri = \"package://example.com/hawk\"\n        version = \"0.5.0\"\n        description = \"Some project about hawks\"\n        packageZipUrl = \"https://example.com/hawk/\\(version)/hawk-\\(version).zip\"\n        authors {\n          \"Birdy Bird <birdy@bird.com>\"\n        }\n        license = \"MIT\"\n        sourceCode = \"https://example.com/my/repo\"\n        sourceCodeUrlScheme = \"https://example.com/my/repo/\\(version)%{path}\"\n        documentation = \"https://example.com/my/docs\"\n        website = \"https://example.com/my/website\"\n        licenseText = \"\"${'\"'}\n          # Some License text\n          \n          This is my license text\n          \"\"${'\"'}\n        apiTests {\n          \"apiTest1.pkl\"\n          \"apiTest2.pkl\"\n        }\n        exclude { \"*.exe\" }\n        issueTracker = \"https://example.com/my/issues\"\n      }\n      \n      tests {\n        \"test1.pkl\"\n        \"test2.pkl\"\n      }\n    \"\"\"\n        .trimIndent()\n    )\n    val project = Project.loadFromPath(projectPath)\n    assertThat(project.`package`).isEqualTo(expectedPackage)\n    assertThat(project.evaluatorSettings).isEqualTo(expectedSettings)\n    assertThat(project.annotations).isEqualTo(expectedAnnotations)\n    assertThat(project.tests)\n      .isEqualTo(listOf(path.resolve(\"test1.pkl\"), path.resolve(\"test2.pkl\")))\n  }\n\n  @Test\n  fun `load wrong type`(@TempDir path: Path) {\n    val projectPath = path.resolve(\"PklProject\")\n    projectPath.writeString(\n      \"\"\"\n      module com.apple.Foo\n\n      foo = 1\n    \"\"\"\n        .trimIndent()\n    )\n    assertThatCode { Project.loadFromPath(projectPath, SecurityManagers.defaultManager, null) }\n      .hasMessageContaining(\"be of type `pkl.Project`, but got type `com.apple.Foo`\")\n  }\n\n  @Test\n  fun `evaluate project module -- invalid checksum`() {\n    PackageServer().use { server ->\n      val projectDir = Path.of(javaClass.getResource(\"badProjectChecksum2/\")!!.toURI())\n      val project = Project.loadFromPath(projectDir.resolve(\"PklProject\"))\n      val httpClient =\n        HttpClient.builder()\n          .addCertificates(FileTestUtils.selfSignedCertificate)\n          .setTestPort(server.port)\n          .build()\n      val evaluator =\n        EvaluatorBuilder.preconfigured()\n          .applyFromProject(project)\n          .setModuleCacheDir(null)\n          .setHttpClient(httpClient)\n          .build()\n      assertThatCode { evaluator.evaluate(ModuleSource.path(projectDir.resolve(\"bug.pkl\"))) }\n        .hasMessageStartingWith(\n          \"\"\"\n        –– Pkl Error ––\n        Cannot download package `package://localhost:0/fruit@1.0.5` because the computed checksum for package metadata does not match the expected checksum.\n        \n        Computed checksum: \"${PackageServer.FRUIT_SHA}\"\n        Expected checksum: \"intentionally bogus checksum\"\n        Asset URL: \"https://localhost:0/fruit@1.0.5\"\n        \n        1 | import \"@fruit/Fruit.pkl\"\n            ^^^^^^^^^^^^^^^^^^^^^^^^^\n      \"\"\"\n            .trimIndent()\n        )\n    }\n  }\n\n  @Test\n  fun `fails if project has cyclical dependencies`() {\n    val projectPath = javaClass.getResource(\"projectCycle1/PklProject\")!!.toURI().toPath()\n    val e = assertThrows<PklException> { Project.loadFromPath(projectPath) }\n    val cleanMsg = e.message!!.replace(Regex(\"file:///.*/resources/test\"), \"file://\")\n    assertThat(cleanMsg)\n      .isEqualTo(\n        \"\"\"\n        –– Pkl Error ––\n        Local project dependencies cannot be circular.\n        \n        Cycle:\n        ┌─>\n        │  file:///org/pkl/core/project/projectCycle2/PklProject\n        │\n        │  file:///org/pkl/core/project/projectCycle3/PklProject\n        └─\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `fails if a project has cyclical dependencies -- multiple cycles found`() {\n    val projectPath = javaClass.getResource(\"projectCycle4/PklProject\")!!.toURI().toPath()\n    val e = assertThrows<PklException> { Project.loadFromPath(projectPath) }\n    val cleanMsg = e.message!!.replace(Regex(\"file://.*/resources/test\"), \"file://\")\n    assertThat(cleanMsg)\n      .isEqualTo(\n        \"\"\"\n        –– Pkl Error ––\n        Local project dependencies cannot be circular.\n        \n        The following circular imports were found.\n        Not all of them are necessarily problematic.\n        The problematic cycles are those declared as local dependencies.\n        \n        Cycle 1:\n        ┌─>\n        │  file:///org/pkl/core/project/projectCycle2/PklProject\n        │\n        │  file:///org/pkl/core/project/projectCycle3/PklProject\n        └─\n        \n        Cycle 2:\n        ┌─>\n        │  file:///org/pkl/core/project/projectCycle4/PklProject\n        └─\n        \n        \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/resource/ResourceReadersEvaluatorTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.resource\n\nimport java.nio.file.Path\nimport kotlin.io.path.outputStream\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.core.Evaluator\nimport org.pkl.core.EvaluatorBuilder\nimport org.pkl.core.ModuleSource\nimport org.pkl.core.module.ModulePathResolver\n\nclass ResourceReadersEvaluatorTest {\n  @Test\n  fun `class path`() {\n    val evaluator = Evaluator.preconfigured()\n\n    val module =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        res1 = read(\"modulepath:/org/pkl/core/resource/resource.txt\").text\n        \"\"\"\n        )\n      )\n\n    assertThat(module.getProperty(\"res1\")).isEqualTo(\"content\")\n  }\n\n  @Test\n  fun `module path`(@TempDir tempDir: Path) {\n    val jarFile = tempDir.resolve(\"resource1.jar\")\n    jarFile.outputStream().use { outStream ->\n      javaClass.getResourceAsStream(\"resource1.jar\")!!.use { inStream ->\n        inStream.copyTo(outStream)\n      }\n    }\n\n    ModulePathResolver(listOf(jarFile)).use { resolver ->\n      val reader = ResourceReaders.modulePath(resolver)\n\n      val evaluator = EvaluatorBuilder.preconfigured().addResourceReader(reader).build()\n\n      val module =\n        evaluator.evaluate(\n          ModuleSource.text(\n            \"\"\"\n          res1 = read(\"modulepath:/dir1/resource1.txt\").text\n          \"\"\"\n          )\n        )\n\n      assertThat(module.getProperty(\"res1\")).isEqualTo(\"content\\n\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/resource/ResourceReadersTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.resource\n\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.nio.file.Path\nimport kotlin.io.path.outputStream\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.core.externalreader.TestExternalReaderProcess\nimport org.pkl.core.externalreader.TestExternalResourceReader\nimport org.pkl.core.module.ModulePathResolver\n\nclass ResourceReadersTest {\n  @Test\n  fun `class path - present resource`() {\n    val reader = ResourceReaders.classPath(this::class.java.classLoader)\n    val resource = reader.read(URI(\"modulepath:/org/pkl/core/resource/resource.txt\"))\n\n    assertThat(resource).isPresent\n    assertThat(resource.get()).isInstanceOf(Resource::class.java)\n    assertThat((resource.get() as Resource).text).isEqualTo(\"content\")\n    assertThat((resource.get() as Resource).base64).isEqualTo(\"Y29udGVudA==\")\n  }\n\n  @Test\n  fun `class path - absent resource`() {\n    val reader = ResourceReaders.classPath(this::class.java.classLoader)\n    val resource = reader.read(URI(\"modulepath:/non/existing\"))\n\n    assertThat(resource).isNotPresent\n  }\n\n  @Test\n  fun `class path - missing leading slash`() {\n    val reader = ResourceReaders.classPath(this::class.java.classLoader)\n\n    assertThrows<URISyntaxException> {\n      reader.read(URI(\"modulepath:org/pkl/core/resource/resource.txt\"))\n    }\n  }\n\n  @Test\n  fun `module path - present resource`(@TempDir tempDir: Path) {\n    val jarFile = tempDir.resolve(\"resource1.jar\")\n    jarFile.outputStream().use { outStream ->\n      javaClass.getResourceAsStream(\"resource1.jar\")!!.use { inStream ->\n        inStream.copyTo(outStream)\n      }\n    }\n    val zipFile = tempDir.resolve(\"resource2.zip\")\n    zipFile.outputStream().use { outStream ->\n      javaClass.getResourceAsStream(\"resource2.zip\")!!.use { inStream ->\n        inStream.copyTo(outStream)\n      }\n    }\n\n    ModulePathResolver(listOf(jarFile, zipFile)).use { resolver ->\n      val reader = ResourceReaders.modulePath(resolver)\n\n      val resource1 = reader.read(URI(\"modulepath:/dir1/resource1.txt\"))\n      assertThat(resource1).isPresent\n      assertThat(resource1.get()).isInstanceOf(Resource::class.java)\n      assertThat((resource1.get() as Resource).text).isEqualTo(\"content\\n\")\n\n      val resource2 = reader.read(URI(\"modulepath:/dir2/subdir2/resource2.txt\"))\n      assertThat(resource2).isPresent\n      assertThat(resource2.get()).isInstanceOf(Resource::class.java)\n      assertThat((resource2.get() as Resource).text).isEqualTo(\"content\\n\")\n      assertThat((resource2.get() as Resource).base64).isEqualTo(\"Y29udGVudAo=\")\n    }\n  }\n\n  @Test\n  fun `module path - absent resource`() {\n    val reader = ResourceReaders.modulePath(ModulePathResolver(listOf()))\n    val resource = reader.read(URI(\"modulepath:/non/existing\"))\n\n    assertThat(resource).isNotPresent\n  }\n\n  @Test\n  fun `module path - missing leading slash`() {\n    val reader = ResourceReaders.modulePath(ModulePathResolver(listOf()))\n\n    assertThrows<URISyntaxException> { reader.read(URI(\"modulepath:non/existing\")) }\n  }\n\n  @Test\n  fun `module path - missing jar is ignored`(@TempDir tempDir: Path) {\n    val missingJarFile = tempDir.resolve(\"missing.jar\")\n\n    val jarFile = tempDir.resolve(\"resource1.jar\")\n    jarFile.outputStream().use { outStream ->\n      javaClass.getResourceAsStream(\"resource1.jar\")!!.use { inStream ->\n        inStream.copyTo(outStream)\n      }\n    }\n\n    ModulePathResolver(listOf(missingJarFile, jarFile)).use { resolver ->\n      val reader = ResourceReaders.modulePath(resolver)\n\n      val resource1 = reader.read(URI(\"modulepath:/dir1/resource1.txt\"))\n      assertThat(resource1).isPresent\n      assertThat(resource1.get()).isInstanceOf(Resource::class.java)\n      assertThat((resource1.get() as Resource).text).isEqualTo(\"content\\n\")\n      assertThat((resource1.get() as Resource).base64).isEqualTo(\"Y29udGVudAo=\")\n    }\n  }\n\n  @Test\n  fun `via service provider`() {\n    val readers = ResourceReaders.fromServiceProviders()\n    assertThat(readers).hasSize(1)\n\n    val reader = readers.single()\n    val resource = reader.read(URI(\"test:foo\"))\n\n    assertThat(resource).contains(\"success\")\n  }\n\n  @Test\n  fun externalProcess() {\n    val extReader = TestExternalResourceReader()\n    val (proc, runtime) =\n      TestExternalReaderProcess.initializeTestHarness(emptyList(), listOf(extReader))\n\n    val reader = ResourceReaders.externalProcess(extReader.scheme, proc)\n    val resource = reader.read(URI(\"test:foo\"))\n\n    assertThat(resource).isPresent\n    assertThat(resource.get()).isInstanceOf(Resource::class.java)\n    assertThat((resource.get() as Resource).text).contains(\"success\")\n\n    proc.close()\n    runtime.close()\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/resource/TestResourceReader.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.resource\n\nimport java.net.URI\nimport java.util.*\n\nclass TestResourceReader : ResourceReader {\n  override fun hasHierarchicalUris(): Boolean = false\n\n  override fun isGlobbable(): Boolean = false\n\n  override fun getUriScheme(): String = \"test\"\n\n  override fun read(uri: URI): Optional<Any> = Optional.of(\"success\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/CommandSpecParserTest.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.writeString\nimport org.pkl.core.CommandSpec\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource.uri\nimport org.pkl.core.PklException\n\nclass CommandSpecParserTest {\n  companion object {\n    private val renderOptions =\n      \"\"\"\n      extends \"pkl:Command\"\n      import \"pkl:Command\"\n      \n      options: Options\n      \n      output {\n        value = options\n      }\n      \n    \"\"\"\n        .trimIndent()\n\n    private val evaluator = Evaluator.preconfigured()\n  }\n\n  @TempDir private lateinit var tempDir: Path\n\n  private fun writePklFile(fileName: String, contents: String): URI {\n    tempDir.resolve(fileName).createParentDirectories()\n    return tempDir.resolve(fileName).writeString(contents).toUri()\n  }\n\n  private fun parse(moduleUri: URI): CommandSpec {\n    var spec: CommandSpec? = null\n    evaluator.evaluateCommand(uri(moduleUri), setOf(\"help\", \"root-dir\"), setOf(\"h\")) { spec = it }\n    return spec!!\n  }\n\n  @Test\n  fun `command module does not amend pkl_Command`() {\n    val moduleUri = writePklFile(\"cmd.pkl\", \"\")\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"Expected value of type `pkl.Command`, but got type\")\n  }\n\n  @Test\n  fun `options property assigned`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          options = new {}\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"options = \")\n    assertThat(exc.message).contains(\"Commands must not assign or amend property `options`.\")\n  }\n\n  @Test\n  fun `options property amended`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          options {}\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"options {\")\n    assertThat(exc.message).contains(\"Commands must not assign or amend property `options`.\")\n  }\n\n  @Test\n  fun `parent property assigned`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          parent = new {}\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"parent = \")\n    assertThat(exc.message).contains(\"Commands must not assign or amend property `parent`.\")\n  }\n\n  @Test\n  fun `parent property amended`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          parent {}\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"parent {\")\n    assertThat(exc.message).contains(\"Commands must not assign or amend property `parent`.\")\n  }\n\n  @Test\n  fun `options type annotation does not reference class`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          options: \"nope\" | \"try again\"\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"options: \\\"nope\\\" | \\\"try again\\\"\")\n    assertThat(exc.message)\n      .contains(\n        \"Type annotation `\\\"nope\\\" | \\\"try again\\\"` on `options` property in `pkl:Command` subclass must be a class type.\"\n      )\n  }\n\n  @Test\n  fun `options class is abstract`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          options: Options\n          abstract class Options {}\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"abstract class Options {\")\n    assertThat(exc.message).contains(\"Command options class `cmd#Options` may not be abstract.\")\n  }\n\n  @Test\n  fun `command property value does not amend CommandInfo`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n          extends \"pkl:Command\"\n          command = new Foo {}\n          class Foo\n        \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"command = new Foo {}\")\n    assertThat(exc.message)\n      .contains(\"Expected value of type `pkl.Command#CommandInfo`, but got type `cmd#Foo`.\")\n  }\n\n  @Test\n  fun `first annotation of the same type wins`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n          open class BaseOptions {\n            /// foo in BaseOptions\n            @Flag { shortName = \"a\" }\n            foo: String\n            \n            /// bar in BaseOptions\n            @Flag { shortName = \"b\" }\n            bar: String\n          }\n          class Options extends BaseOptions {\n            /// bar in Options\n            @Flag { shortName = \"x\" }\n            bar: String\n            \n            /// baz in Options\n            @Flag { shortName = \"y\" }\n            @CountedFlag { shortName = \"z\" }\n            baz: Int\n          }\n        \"\"\"\n            .trimIndent(),\n      )\n\n    val spec = parse(moduleUri)\n\n    // assert class overrides its superclass\n    assertThat(spec.options.toList()[0]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[0] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"bar\")\n      assertThat(this.shortName).isEqualTo(\"x\")\n      assertThat(this.helpText).isEqualTo(\"bar in Options\")\n    }\n\n    // assert first flag annotation wins\n    assertThat(spec.options.toList()[1]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[1] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"baz\")\n      assertThat(this.shortName).isEqualTo(\"y\")\n      assertThat(this.helpText).isEqualTo(\"baz in Options\")\n    }\n\n    // assert superclass options are inherited\n    assertThat(spec.options.toList()[2]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[2] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"foo\")\n      assertThat(this.shortName).isEqualTo(\"a\")\n      assertThat(this.helpText).isEqualTo(\"foo in BaseOptions\")\n    }\n  }\n\n  @Test\n  fun `@Flag and @Argument on the same option`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Flag\n        @Argument\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: String\")\n    assertThat(exc.message)\n      .contains(\"Found both `@Flag` and `@Argument` annotations for options property `foo`.\")\n  }\n\n  @Test\n  fun `option with no type annotation`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo = \"bar\"\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo = \\\"bar\\\"\")\n    assertThat(exc.message).contains(\"No type annotation found for `foo` property.\")\n  }\n\n  @Test\n  fun `option with union type containing non-string-literals`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: \"oops\" | String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: \\\"oops\\\" | String\")\n    assertThat(exc.message)\n      .contains(\"Command option property `foo` has unsupported type `\\\"oops\\\" | String`.\")\n  }\n\n  @Test\n  fun `argument with default not allowed`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        foo: String = \"bar\"\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: String = \\\"bar\\\"\")\n    assertThat(exc.message).contains(\"Unexpected default value for `@Argument` property `foo`.\")\n  }\n\n  @Test\n  fun `nullable non-collection argument not allowed`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        foo: String?\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: String?\")\n    assertThat(exc.message)\n      .contains(\"Unexpected nullable type for non-collection `@Argument` property `foo`.\")\n  }\n\n  @Test\n  fun `non-constant default values result in an optional flag with no default`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n          class Options {\n            foo: String = \"hi\"\n            bar: String = foo\n            baz: Map<String, String> = Map()\n            qux: Map<String, String> = baz\n            quux: Int = 5\n          }\n        \"\"\"\n            .trimIndent(),\n      )\n\n    val spec = parse(moduleUri)\n\n    assertThat(spec.options.toList()[0]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[0] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"foo\")\n      assertThat(this.defaultValue).isEqualTo(\"hi\")\n    }\n\n    assertThat(spec.options.toList()[1]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[1] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"bar\")\n      assertThat(this.defaultValue).isNull()\n    }\n\n    assertThat(spec.options.toList()[2]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[2] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"baz\")\n      assertThat(this.defaultValue).isNull()\n    }\n\n    assertThat(spec.options.toList()[3]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[3] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"qux\")\n      assertThat(this.defaultValue).isNull()\n    }\n\n    assertThat(spec.options.toList()[4]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[4] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"quux\")\n      assertThat(this.defaultValue).isEqualTo(\"5\")\n    }\n  }\n\n  @Test\n  fun `flag with collision on --help`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        help: Boolean\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"help: Boolean\")\n    assertThat(exc.message).contains(\"Flag option `help` name collides with a reserved flag name.\")\n  }\n\n  @Test\n  fun `flag with collision on -h`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Flag { shortName = \"h\" }\n        showHelp: Boolean\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"showHelp: Boolean\")\n    assertThat(exc.message)\n      .contains(\"Flag option `showHelp` short name `h` collides with a reserved flag short name.\")\n  }\n\n  @Test\n  fun `flag with collision on reserved option name`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        `root-dir`: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"`root-dir`: String\")\n    assertThat(exc.message)\n      .contains(\"Flag option `root-dir` name collides with a reserved flag name.\")\n  }\n\n  @Test\n  fun `multiple arguments with collection types not allowed`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Argument\n        list: List<String>\n        @Argument\n        set: Set<String>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"class Options {\")\n    assertThat(exc.message)\n      .contains(\"More than one repeated option annotated with `@Argument` found: `list` and `set`.\")\n    assertThat(exc.message).contains(\"Only one repeated argument is permitted per command.\")\n  }\n\n  @Test\n  fun `collection option with collection element type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: List<List<\"a\" | \"b\">>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: List<List<\\\"a\\\" | \\\"b\\\">>\")\n    assertThat(exc.message)\n      .contains(\"Command option property `foo` has unsupported element type `List<\\\"a\\\" | \\\"b\\\">`.\")\n  }\n\n  @Test\n  fun `collection option with map element type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: List<Map<String, \"a\" | \"b\">>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: List<Map<String, \\\"a\\\" | \\\"b\\\">>\")\n    assertThat(exc.message)\n      .contains(\n        \"Command option property `foo` has unsupported element type `Map<String, \\\"a\\\" | \\\"b\\\">`.\"\n      )\n  }\n\n  @Test\n  fun `map option with collection value type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: Map<String, List<\"a\" | \"b\">>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: Map<String, List<\\\"a\\\" | \\\"b\\\">>\")\n    assertThat(exc.message)\n      .contains(\"Command option property `foo` has unsupported value type `List<\\\"a\\\" | \\\"b\\\">`.\")\n  }\n\n  @Test\n  fun `map option with map value type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: Map<String, Map<String, \"a\" | \"b\">>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: Map<String, Map<String, \\\"a\\\" | \\\"b\\\">>\")\n    assertThat(exc.message)\n      .contains(\n        \"Command option property `foo` has unsupported value type `Map<String, \\\"a\\\" | \\\"b\\\">`.\"\n      )\n  }\n\n  @Test\n  fun `map option with collection key type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: Map<Map<String, \"a\" | \"b\">, String>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: Map<Map<String, \\\"a\\\" | \\\"b\\\">, String>\")\n    assertThat(exc.message)\n      .contains(\n        \"Command option property `foo` has unsupported key type `Map<String, \\\"a\\\" | \\\"b\\\">`.\"\n      )\n  }\n\n  @Test\n  fun `map option with map key type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: Map<Map<String, \"a\" | \"b\">, String>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: Map<Map<String, \\\"a\\\" | \\\"b\\\">, String>\")\n    assertThat(exc.message)\n      .contains(\n        \"Command option property `foo` has unsupported key type `Map<String, \\\"a\\\" | \\\"b\\\">`.\"\n      )\n  }\n\n  @Test\n  fun `map option with map key type allowed with convert`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @Flag { convert = (it) -> Pair(\"foo\", \"a\") }\n        foo: Map<Map<String, \"a\" | \"b\">, String>\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    assertDoesNotThrow { parse(moduleUri) }\n  }\n\n  @Test\n  fun `unsupported option type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: Foo\n      }\n      class Foo\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: Foo\")\n    assertThat(exc.message).contains(\"Command option property `foo` has unsupported type `Foo`.\")\n  }\n\n  @Test\n  fun `options constraints in all positions are erased`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        a: String(true)\n        b: String?(true)\n        c: String(true)?\n        d: List<String(true)>\n        e: List<String(true)>(true)\n        f: List<String(true)>(true)?(true)\n        g: (Map<String(true), String(true)>(true)?(true))(true)\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    parse(moduleUri)\n  }\n\n  @Test\n  fun `conflicting subcommand names`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        \"\"\"\n      extends \"pkl:Command\"\n      import \"pkl:Command\"\n      command {\n        subcommands {\n          new Sub { command { name = \"foo\" } }\n          new Sub { command { name = \"foo\" } }\n        }\n      }\n      \n      class Sub extends Command\n    \"\"\"\n          .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"Command `cmd` has subcommands with conflicting name \\\"foo\\\".\")\n  }\n\n  @Test\n  fun `list or set option with no type arguments`() {\n    for (type in listOf(\"List\", \"Set\")) {\n      val moduleUri =\n        writePklFile(\n          \"cmd_$type.pkl\",\n          renderOptions +\n            \"\"\"\n      class Options {\n        foo: $type\n      }\n    \"\"\"\n              .trimIndent(),\n        )\n\n      val exc = assertThrows<PklException> { parse(moduleUri) }\n      assertThat(exc.message).contains(\"foo: $type\")\n      assertThat(exc.message)\n        .contains(\"Command option property `foo` has unsupported type `$type`.\")\n      assertThat(exc.message).contains(\"$type options must provide one type argument.\")\n    }\n  }\n\n  @Test\n  fun `map option with no type arguments`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        foo: Map\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: Map\")\n    assertThat(exc.message).contains(\"Command option property `foo` has unsupported type `Map`.\")\n    assertThat(exc.message).contains(\"Map options must provide two type arguments.\")\n  }\n\n  @Test\n  fun `boolean flag with incorrect type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @BooleanFlag\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: String\")\n    assertThat(exc.message)\n      .contains(\"Option `foo` with annotation `@BooleanFlag` has invalid type `String`.\")\n    assertThat(exc.message).contains(\"Expected type: `Boolean`\")\n  }\n\n  @Test\n  fun `counted flag with incorrect type`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        @CountedFlag\n        foo: String\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val exc = assertThrows<PklException> { parse(moduleUri) }\n    assertThat(exc.message).contains(\"foo: String\")\n    assertThat(exc.message)\n      .contains(\"Option `foo` with annotation `@CountedFlag` has invalid type `String`.\")\n    assertThat(exc.message).contains(\"Expected type: `Int`\")\n  }\n\n  @Test\n  fun `union typed option validates invalid choice without stream error`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      class Options {\n        format: \"json\" | \"yaml\" | \"toml\"\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val spec = parse(moduleUri)\n    val flag = spec.options.first() as CommandSpec.Flag\n\n    assertThat(flag.metavar()).isEqualTo(\"[json, toml, yaml]\")\n\n    val apply =\n      assertThrows<CommandSpec.Option.BadValue> {\n        flag.transformEach().apply(\"xml\", URI(\"file:///tmp\"))\n      }\n    assertThat(apply.message).contains(\"invalid choice\")\n    assertThat(apply.message).contains(\"xml\")\n  }\n\n  @Test\n  fun `typealias of nullable is resolved as optional`() {\n    val moduleUri =\n      writePklFile(\n        \"cmd.pkl\",\n        renderOptions +\n          \"\"\"\n      typealias OptionalString = String?\n      class Options {\n        foo: OptionalString\n      }\n    \"\"\"\n            .trimIndent(),\n      )\n\n    val spec = parse(moduleUri)\n\n    assertThat(spec.options.toList()[0]).isInstanceOf(CommandSpec.Flag::class.java)\n    (spec.options.toList()[0] as CommandSpec.Flag).apply {\n      assertThat(this.name).isEqualTo(\"foo\")\n      assertThat(this.showAsRequired).isFalse()\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/DefaultModuleResolverTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\n//\n// import java.io.IOException;\n// import java.net.URI;\n// import java.net.URISyntaxException;\n// import java.nio.file.Files;\n// import java.nio.file.Path;\n// import java.util.Arrays;\n// import java.util.Collections;\n//\n// import org.pkl.core.EvalOptions;\n// import org.pkl.core.EvalException;\n// import org.pkl.core.resolve.ModuleKey;\n// import org.pkl.core.resolve.ModuleKeyFactories;\n// import org.pkl.core.resolve.ModuleKeys;\n// import com.oracle.truffle.api.source.SourceSection;\n// import org.junit.Ignore;\n// import org.junit.Test;\n//\n// import static org.junit.Assert.assertEquals;\n// import static org.junit.Assert.assertTrue;\n//\n// public class DefaultModuleResolverTest {\n//  private final SourceSection sourceSection = VmUtils.unavailableSourceSection();\n//  private final ModuleResolver resolver =\n//      new ModuleResolver(ModuleKeyFactories.namedModuleOnClassPath,\n// EvalOptions.namedModuleOnClassPath.getAllowedModules());\n//  private final ModuleKey fileUrlModule;\n//  private final ModuleKey httpsUrlModule;\n//  private final ModuleKey literalUrlModule;\n//\n//  {\n//    try {\n//      fileUrlModule = ModuleKeys.genericUrl(new URI(\"file:///path/script.pkl\"),\n// ModuleKeys.FULL_TRUST);\n//      httpsUrlModule = ModuleKeys.genericUrl(new URI(\"https://some.domain.com/path/script.pkl\"),\n// ModuleKeys.FULL_TRUST);\n//      literalUrlModule = ModuleKeys.synthetic(\"myLiteralModule\", \"my literal source code\",\n// ModuleKeys.FULL_TRUST);\n//    } catch (URISyntaxException e) {\n//      throw new RuntimeException(e);\n//    }\n//  }\n//\n//  @Test\n//  public void importAbsolutePathFromFileUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"/import/file.pkl\", fileUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"file:/import/file.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importRelativePathFromFileUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"import/file.pkl\", fileUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"file:/path/import/file.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importFileUrlFromFileUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"file:///import/file.pkl\", fileUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"file:///import/file.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importHttpsUrlFromFileUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"https://other.domain.com/path2/script2.pkl\",\n// fileUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"https://other.domain.com/path2/script2.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importStdLibModuleFromFileUrl() {\n//    ModuleKey result = resolver.resolve(\"pkl:base\", fileUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.StandardLibrary);\n//    assertEquals(\"pkl:base\", result.toString());\n//  }\n//\n//  @Test\n//  public void importAbsolutePathFromHttpsUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"/import/file.pkl\", httpsUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"https://some.domain.com/import/file.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importRelativePathFromHttpsUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"import/file.pkl\", httpsUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"https://some.domain.com/path/import/file.pkl\", result.toString());\n//  }\n//\n//  @Test(expected = EvalException.class)\n//  public void importFileUrlFromHttpsUrl() throws IOException {\n//    resolver.resolve(\"file:///import/file.pkl\", httpsUrlModule, sourceSection);\n//  }\n//\n//  @Test\n//  public void importHttpsUrlFromHttpsUrl() throws IOException {\n//    ModuleKey result = resolver.resolve(\"https://other.domain.com/path2/script2.pkl\",\n// httpsUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"https://other.domain.com/path2/script2.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importStdLibModuleFromHttpsUrl() {\n//    ModuleKey result = resolver.resolve(\"pkl:base\", httpsUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.StandardLibrary);\n//    assertEquals(\"pkl:base\", result.toString());\n//  }\n//\n//  @Test\n//  public void importAbsolutePathFromLiteral() throws IOException {\n//    Path path = Files.createTempFile(\"file\", \".pkl\");\n//    try {\n//      ModuleKey result = resolver.resolve(path.toString(), literalUrlModule, sourceSection);\n//      assertTrue(result instanceof ModuleKey.File);\n//      assertEquals(path.toString(), result.toString());\n//    } finally {\n//      //noinspection ThrowFromFinallyBlock\n//      Files.delete(path);\n//    }\n//  }\n//\n//  @Ignore(\"not sure how to test relative path behavior\")\n//  @Test(expected = EvalException.class)\n//  public void importRelativePathFromLiteral() throws IOException {\n//    resolver.resolve(\"import/file.pkl\", literalUrlModule, sourceSection);\n//  }\n//\n//  @Test\n//  public void importFileUrlFromLiteral() throws IOException {\n//    ModuleKey result = resolver.resolve(\"file:///import/file.pkl\", literalUrlModule,\n// sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"file:///import/file.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importHttpsUrlFromLiteral() throws IOException {\n//    ModuleKey result = resolver.resolve(\"https://other.domain.com/path2/script2.pkl\",\n// literalUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.Url);\n//    assertEquals(\"https://other.domain.com/path2/script2.pkl\", result.toString());\n//  }\n//\n//  @Test\n//  public void importStdLibModuleFromLiteral() {\n//    ModuleKey result = resolver.resolve(\"pkl:base\", literalUrlModule, sourceSection);\n//    assertTrue(result instanceof ModuleKey.StandardLibrary);\n//    assertEquals(\"pkl:base\", result.toString());\n//  }\n//\n//  @Test(expected = EvalException.class)\n//  public void importWithNotAllowedScheme() {\n//    resolver.resolve(\"http://some.domain.com/path/script.pkl\", fileUrlModule, sourceSection);\n//  }\n//\n//  @Test(expected = EvalException.class)\n//  public void invalidImportUrl() {\n//    resolver.resolve(\"unknown://bar\", fileUrlModule, sourceSection);\n//  }\n//\n//  @Test\n//  public void importMatchesAllowedModules() {\n//    ModuleResolver resolver =\n//        new ModuleResolver(\n//            Arrays.asList(\"file:///pkl/.*\", \"https://.*\\\\.apple\\\\.com\"));\n//\n//    resolver.resolve(\"file:///pkl/foo.pkl\", fileUrlModule, sourceSection);\n//    resolver.resolve(\"https://example.com/foo.pkl\", fileUrlModule, sourceSection);\n//  }\n//\n//  @Test(expected = EvalException.class)\n//  public void importDoesNotMatchAllowedModules() {\n//    ModuleResolver resolver =\n//        new ModuleResolver(\n//            Collections.singletonList(\"https://.*\\\\.apple\\\\.com\"));\n//\n//    resolver.resolve(\"https://evil.corp/foo.pkl\", fileUrlModule, sourceSection);\n//  }\n//\n//  @Test(expected = EvalException.class)\n//  public void emptyAllowedModulesMatchesNothing() {\n//    ModuleResolver resolver =\n//        new ModuleResolver(\n//            Collections.emptyList());\n//\n//    resolver.resolve(\"pkl:base\", fileUrlModule, sourceSection);\n//  }\n// }\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/FileSystemManagerTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport java.net.URI\nimport java.nio.file.FileSystems\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\nclass FileSystemManagerTest {\n  private val resource = javaClass.getResource(\"/org/pkl/core/resource/resource1.jar\")!!.toURI()\n  private val resourceUri = URI(\"jar:$resource\")\n\n  @Test\n  fun `only closes a file system after the last usage closes`() {\n    val fs1 = FileSystemManager.getFileSystem(resourceUri)\n    val fs2 = FileSystemManager.getFileSystem(resourceUri)\n    val fs3 = FileSystemManager.getFileSystem(resourceUri)\n    fs1.close()\n    assertTrue(fs1.isOpen)\n    assertTrue(fs2.isOpen)\n    assertTrue(fs3.isOpen)\n    fs2.close()\n    assertTrue(fs1.isOpen)\n    assertTrue(fs2.isOpen)\n    assertTrue(fs3.isOpen)\n    fs3.close()\n    assertFalse(fs1.isOpen)\n    assertFalse(fs2.isOpen)\n    assertFalse(fs3.isOpen)\n  }\n\n  @Test\n  fun `does not close file system that was spawned externally`() {\n    FileSystems.newFileSystem(resourceUri, emptyMap<String, Any>()).use { fs ->\n      val fs2 = FileSystemManager.getFileSystem(resourceUri)\n      assertTrue(fs.isOpen)\n      assertTrue(fs2.isOpen)\n      fs2.close()\n      assertTrue(fs.isOpen)\n      assertTrue(fs2.isOpen)\n    }\n  }\n\n  @Test\n  fun `close and re-open same file system`() {\n    val fs = FileSystemManager.getFileSystem(resourceUri)\n    assertTrue(fs.isOpen)\n    fs.close()\n    assertFalse(fs.isOpen)\n    val fs2 = FileSystemManager.getFileSystem(resourceUri)\n    assertTrue(fs2.isOpen)\n    fs2.close()\n    assertFalse(fs2.isOpen)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/IteratorsTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.runtime.Iterators.*\n\nclass IteratorsTest {\n  @Test\n  fun `forward iterator`() {\n    val iter = TruffleIterator(listOf(1, 2, 3))\n\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(1)\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(2)\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(3)\n    assertThat(iter.hasNext()).isFalse\n  }\n\n  @Test\n  fun `empty forward iterator`() {\n    val iter = TruffleIterator(listOf<Any>())\n\n    assertThat(iter.hasNext()).isFalse\n  }\n\n  @Test\n  fun `reverse iterator`() {\n    val iter = ReverseTruffleIterator(listOf(1, 2, 3))\n\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(3)\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(2)\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(1)\n    assertThat(iter.hasNext()).isFalse\n  }\n\n  @Test\n  fun `empty reverse iterator`() {\n    val iter = ReverseTruffleIterator(listOf<Any>())\n\n    assertThat(iter.hasNext()).isFalse\n  }\n\n  @Test\n  fun `reverse array iterator`() {\n    val iter = ReverseArrayIterator(arrayOf(1, 2, 3))\n\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(3)\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(2)\n    assertThat(iter.hasNext()).isTrue\n    assertThat(iter.next()).isEqualTo(1)\n    assertThat(iter.hasNext()).isFalse\n  }\n\n  @Test\n  fun `empty reverse array iterator`() {\n    val iter = ReverseArrayIterator(arrayOf())\n\n    assertThat(iter.hasNext()).isFalse\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/ModuleKeyTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\n//\n// import java.io.File;\n// import java.io.IOException;\n// import java.net.URI;\n// import java.net.URISyntaxException;\n//\n// import org.pkl.core.resolve.ModuleKey;\n// import org.pkl.core.resolve.ModuleKeys;\n// import org.junit.Rule;\n// import org.junit.Test;\n// import org.junit.rules.TemporaryFolder;\n//\n// import static org.junit.Assert.assertEquals;\n// import static org.junit.Assert.assertFalse;\n// import static org.junit.Assert.assertTrue;\n//\n//// some parts of ModuleKey are tested as part of DefaultModuleResolverTest\n// public class ModuleKeyTest {\n//  @Rule\n//  public TemporaryFolder folder = new TemporaryFolder();\n//\n//  @Test\n//  public void stdLibModule() {\n//    ModuleKey module = ModuleKeys.standardLibrary(\"base\");\n//\n//    assertEquals(\"pkl\", module.getUri().getScheme());\n//    assertEquals(\"base\", module.getName());\n//    assertEquals(\"pkl:base\", module.getUri().toString());\n//    assertTrue(ModuleKeys.isBaseModule(module));\n//\n//    ModuleKeys.StandardLibrary other = ModuleKeys.standardLibrary(URI(\"pkl:test\"));\n//    assertFalse(ModuleKeys.isBaseModule(other));\n//  }\n//\n//  @Test\n//  public void fileModule() throws IOException {\n//    File file = folder.newFile(\"baz.pkl\");\n//\n//    ModuleKey module = new ModuleKeys.Gene/*/ricUrl()File(file.toPath());\n//\n//    assertEquals(\"file\", module.getScheme());\n//    assertEquals(\"baz\", module.getName());\n//    assertEquals(\"file://\" + file.getAbsolutePath(), module.getUri());\n//    assertFalse(module.isBaseModule());\n//  }\n//\n//  @Test\n//  public void urlModule() throws URISyntaxException {\n//    ModuleKey module = new ModuleKey.Url(new URI(\"https://apple.com/baz.pkl\"));\n//    assertEquals(\"https\", module.getScheme());\n//    assertEquals(\"baz\", module.getName());\n//    assertEquals(\"https://apple.com/baz.pkl\", module.getUri());\n//    assertFalse(module.isBaseModule());\n//  }\n//\n//  @Test\n//  public void libraryPathModule() {\n//    ModuleKey module = new ModuleKey.Lib(\"foo.bar.baz\");\n//\n//    assertEquals(\"lib\", module.getScheme());\n//    assertEquals(\"baz\", module.getName());\n//    assertEquals(\"module:foo.bar.baz\", module.getUri());\n//    assertFalse(module.isBaseModule());\n//  }\n//\n//  @Test\n//  public void literalModule() {\n//    ModuleKey module = new ModuleKey.Virtual(\"name\", \"x=1\");\n//\n//    assertEquals(\"literal\", module.getScheme());\n//    assertEquals(\"name\", module.getName());\n//    assertEquals(\"literal:name\", module.getUri());\n//    assertFalse(module.isBaseModule());\n//  }\n// }\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/StackTraceRendererTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.*\nimport org.pkl.core.util.AnsiStringBuilder\n\nclass StackTraceRendererTest {\n  companion object {\n    private val evaluator = Evaluator.preconfigured()\n\n    @JvmStatic\n    @AfterAll\n    @Suppress(\"unused\")\n    fun afterAll() {\n      evaluator.close()\n    }\n  }\n\n  @Test\n  fun `stringy self-reference`() {\n    val message =\n      assertThrows<PklException> {\n          evaluator.evaluate(\n            ModuleSource.text(\n              \"\"\"\n          self: String = \"Strings; if they were lazy, you could tie the knot on \\(self.take(7))\"\n          \"\"\"\n                .trimIndent()\n            )\n          )\n        }\n        .message!!\n    assertThat(message)\n      .contains(\"A stack overflow occurred.\")\n      .containsPattern(\n        \"\"\"\n┌─ \\d* repetitions of:\n│ 1 | self: String = \"Strings; if they were lazy, you could tie the knot on \\\\\\(self.take\\(7\\)\\)\"\n│                                                                             ^^^^\n   \"\"\"\n          .trim()\n      )\n  }\n\n  @Test\n  fun `cyclic property references`() {\n    val message =\n      assertThrows<PklException> {\n          evaluator.evaluate(\n            ModuleSource.text(\n              \"\"\"\n              foo: String = \"FOO:\" + bar\n              bar: String = \"BAR:\" + baz\n              baz: String = \"BAZ:\" + qux\n              qux: String = \"QUX:\" + foo\n            \"\"\"\n                .trimIndent()\n            )\n          )\n        }\n        .message!!\n    assertThat(message)\n      .contains(\"A stack overflow occurred.\")\n      .containsPattern(\n        \"\"\"\n┌─ \\d+ repetitions of:\n│ 4 | qux: String = \"QUX:\" + foo\n│                            ^^^\n│ at text#qux (repl:text)\n│ \n│ 3 | baz: String = \"BAZ:\" + qux\n│                            ^^^\n│ at text#baz (repl:text)\n│ \n│ 2 | bar: String = \"BAR:\" + baz\n│                            ^^^\n│ at text#bar (repl:text)\n│ \n│ 1 | foo: String = \"FOO:\" + bar\n│                            ^^^\n│ at text#foo (repl:text)\n└─        \n      \"\"\"\n          .trim()\n      )\n  }\n\n  @Test\n  @Suppress(\"RegExpRepeatedSpace\")\n  fun `reduce stack overflow from actual Pkl code`() {\n    val pklCode =\n      \"\"\"\n        function suffix(n: UInt): UInt =\n          if (n == 0)\n            0\n          else\n            suffix(n - 1)\n\n        function loopBody4(n: UInt): UInt =\n          if (n == 0)\n            loop()\n          else\n            loopBody1(n - 1)\n\n        function loopBody3(n: UInt) = loopBody4(n)\n        function loopBody2(n: UInt) = loopBody3(n)\n        function loopBody1(n: UInt) = loopBody2(n)\n\n        function loop(): UInt =\n          if (suffix(100) > 0)\n            1\n          else\n            loopBody1(5)\n\n        function prefix(n: UInt): UInt =\n          if (n == 0)\n            loop()\n          else\n            prefix(n - 1)\n\n        result = prefix(13)\n      \"\"\"\n        .trimIndent()\n    val message =\n      assertThrows<PklException> { evaluator.evaluate(ModuleSource.text(pklCode)) }.message!!\n\n    if (message.contains(\"5 | suffix\")) {\n      assertThat(message).containsPattern(\"repetitions of:\\n│ 5 | suffix(n - 1)\")\n    }\n\n    assertThat(message)\n      .contains(\"A stack overflow occurred.\")\n      .containsPattern(\"┌─ \\\\d+ repetitions of:\\n│ \\n│ 9 | loop\\\\(\\\\)\")\n      .containsPattern(\"│ ┌─ 5 repetitions of:\\n│  │ \\n│  │ 11 | loopBody1\\\\(n - 1\\\\)\")\n      .containsPattern(\"┌─ 13 repetitions of:\\n│ \\n│ 27 | prefix\\\\(n - 1\\\\)\")\n  }\n\n  @Test\n  fun `compression preserves prefix and suffix and counts loop correctly`() {\n    val prefixLength = 5\n    val loopLength = 30\n    val suffixLength = 10\n    val repetitions = 4\n\n    val prefix = List(prefixLength) { createFrame(\"Prefix\", prefixLength - it) }\n    val loop = List(loopLength) { createFrame(\"Loop\", loopLength - it) }\n    val suffix = List(suffixLength) { createFrame(\"Suffix\", suffixLength - it) }\n\n    val frames = buildList {\n      addAll(suffix)\n      repeat(repetitions) { addAll(loop) }\n      addAll(prefix)\n    }\n    val compressedFrames = StackTraceRenderer.compressFrames(frames)\n\n    assertThat(compressedFrames.size).isEqualTo(suffix.size + 1 + prefix.size)\n\n    val compressedLoop = compressedFrames[suffix.size] as? StackTraceRenderer.StackFrameLoop\n    assertThat(compressedFrames.take(suffix.size)).isEqualTo(suffix)\n    assertThat(compressedLoop?.frames).isEqualTo(loop)\n    assertThat(compressedLoop?.count).isEqualTo(repetitions)\n    assertThat(compressedFrames.drop(suffix.size + 1)).isEqualTo(prefix)\n  }\n\n  // TODO: fix these false positives in the loop search algorithm.\n  @Test\n  fun `cycles of length 1 don't get rendered as a loop`() {\n    val renderer = StackTraceRenderer(StackFrameTransformers.defaultTransformer)\n    val loopFrames = buildList {\n      add(createFrame(\"foo\", 1))\n      add(createFrame(\"foo\", 2))\n      add(createFrame(\"foo\", 3))\n    }\n    val loop = StackTraceRenderer.StackFrameLoop(loopFrames, 1)\n    val frames = listOf(createFrame(\"bar\", 1), createFrame(\"baz\", 2), loop)\n    val formatter = AnsiStringBuilder(false)\n    renderer.doRender(frames, null, null, formatter, \"\", true)\n    val renderedFrames = formatter.toString()\n    assertThat(renderedFrames)\n      .isEqualTo(\n        \"\"\"\n      1 | foo\n          ^\n      at <unknown> (file:bar)\n\n      2 | foo\n          ^\n      at <unknown> (file:baz)\n\n      1 | foo\n          ^\n      at <unknown> (file:foo)\n\n      2 | foo\n          ^\n      at <unknown> (file:foo)\n\n      3 | foo\n          ^\n      at <unknown> (file:foo)\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  private fun createFrame(name: String, id: Int): StackFrame {\n    return StackFrame(\"file:$name\", null, listOf(\"foo\"), id, 1, id, 1)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/VmClassTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass VmClassTest {\n  @Test\n  fun `class pkl_base_Container has one hidden property named 'default'`() {\n    assertThat(BaseModule.getMappingClass().isHiddenProperty(Identifier.DEFAULT)).isTrue\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/VmDataSizeTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.DataSizeUnit\n\nclass VmDataSizeTest {\n  private val size1 = VmDataSize(0.3, DataSizeUnit.KILOBYTES)\n  private val size2 = VmDataSize(300.0, DataSizeUnit.BYTES)\n  private val size3 = VmDataSize(300.1, DataSizeUnit.BYTES)\n\n  @Test\n  fun `equals()`() {\n    assertThat(size1).isEqualTo(size1)\n    assertThat(size2).isEqualTo(size1)\n    assertThat(size1).isEqualTo(size2)\n\n    assertThat(size3).isNotEqualTo(size1)\n    assertThat(size2).isNotEqualTo(size3)\n  }\n\n  @Test\n  fun `hashCode()`() {\n    assertThat(size1.hashCode()).isEqualTo(size1.hashCode())\n    assertThat(size2.hashCode()).isEqualTo(size1.hashCode())\n    assertThat(size1.hashCode()).isEqualTo(size2.hashCode())\n\n    assertThat(size3.hashCode()).isNotEqualTo(size1.hashCode())\n    assertThat(size2.hashCode()).isNotEqualTo(size3.hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/VmDurationTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.DurationUnit\n\nclass VmDurationTest {\n  private val duration1 = VmDuration(0.3, DurationUnit.SECONDS)\n  private val duration2 = VmDuration(300.0, DurationUnit.MILLIS)\n  private val duration3 = VmDuration(300.1, DurationUnit.MILLIS)\n\n  @Test\n  fun `equals()`() {\n    assertThat(duration1).isEqualTo(duration1)\n    assertThat(duration2).isEqualTo(duration1)\n    assertThat(duration1).isEqualTo(duration2)\n\n    assertThat(duration3).isNotEqualTo(duration1)\n    assertThat(duration2).isNotEqualTo(duration3)\n  }\n\n  @Test\n  fun `hashCode()`() {\n    assertThat(duration1.hashCode()).isEqualTo(duration1.hashCode())\n    assertThat(duration2.hashCode()).isEqualTo(duration1.hashCode())\n    assertThat(duration1.hashCode()).isEqualTo(duration2.hashCode())\n\n    assertThat(duration3.hashCode()).isNotEqualTo(duration1.hashCode())\n    assertThat(duration2.hashCode()).isNotEqualTo(duration3.hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/VmSafeMathTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass VmSafeMathTest {\n  @Test\n  fun `negate long`() {\n    assertThat(VmSafeMath.negate(0)).isEqualTo(0)\n    assertThat(VmSafeMath.negate(1)).isEqualTo(-1)\n    assertThat(VmSafeMath.negate(-1)).isEqualTo(1)\n    assertThat(VmSafeMath.negate(java.lang.Long.MAX_VALUE)).isEqualTo(-java.lang.Long.MAX_VALUE)\n  }\n\n  @Test\n  fun `negate long - overflow`() {\n    assertThrows<VmEvalException> { VmSafeMath.negate(java.lang.Long.MIN_VALUE) }\n  }\n\n  @Test\n  fun `negate double`() {\n    assertThat(VmSafeMath.negate(0.0)).isEqualTo(-0.0)\n    assertThat(VmSafeMath.negate(-1.0)).isEqualTo(1.0)\n    assertThat(VmSafeMath.negate(1.0)).isEqualTo(-1.0)\n    assertThat(VmSafeMath.negate(123.456)).isEqualTo(-123.456)\n    assertThat(VmSafeMath.negate(-java.lang.Double.MAX_VALUE)).isEqualTo(java.lang.Double.MAX_VALUE)\n    assertThat(VmSafeMath.negate(-java.lang.Double.MIN_VALUE)).isEqualTo(java.lang.Double.MIN_VALUE)\n  }\n\n  @Test\n  fun `add long`() {\n    assertThat(VmSafeMath.add(0, 0)).isEqualTo(0)\n    assertThat(VmSafeMath.add(1, 2)).isEqualTo(3)\n    assertThat(VmSafeMath.add(1, -2)).isEqualTo(-1)\n    assertThat(VmSafeMath.add(java.lang.Long.MAX_VALUE - 1, 1)).isEqualTo(java.lang.Long.MAX_VALUE)\n  }\n\n  @Test\n  fun `add long - overflow #1`() {\n    assertThrows<VmEvalException> { VmSafeMath.add(java.lang.Long.MAX_VALUE, 1) }\n  }\n\n  @Test\n  fun `add long - overflow #2`() {\n    assertThrows<VmEvalException> { VmSafeMath.add(java.lang.Long.MIN_VALUE, -1) }\n  }\n\n  @Test\n  fun `add long - overflow #3`() {\n    assertThrows<VmEvalException> {\n      VmSafeMath.add(java.lang.Long.MAX_VALUE / 2, java.lang.Long.MAX_VALUE / 3 * 2)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/VmUtilsTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass VmUtilsTest {\n  @Test\n  fun `codePointOffsetToCharOffset - ascii`() {\n    val str = \"0123\"\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, -1)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, -999)).isEqualTo(-1)\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 0)).isEqualTo(0)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 1)).isEqualTo(1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 2)).isEqualTo(2)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 3)).isEqualTo(3)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 4)).isEqualTo(4)\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 5)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(\"012345\", 999)).isEqualTo(-1)\n  }\n\n  @Test\n  fun `codePointOffsetToCharOffset - unicode`() {\n    val str = \"0\\uD83D\\uDE002\\uD83D\\uDE00\"\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, -1)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, -999)).isEqualTo(-1)\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 0)).isEqualTo(0)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 1)).isEqualTo(1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 2)).isEqualTo(3)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 3)).isEqualTo(4)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 4)).isEqualTo(6)\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 5)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 999)).isEqualTo(-1)\n  }\n\n  @Test\n  fun `codePointOffsetToCharOffset - unicode with startIndex`() {\n    val str = \"0\\uD83D\\uDE002\\uD83D\\uDE00\"\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, -1, 3)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, -999, 3)).isEqualTo(-1)\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 0, 3)).isEqualTo(3)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 1, 3)).isEqualTo(4)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 2, 3)).isEqualTo(6)\n\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 3, 3)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 5)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetToCharOffset(str, 999)).isEqualTo(-1)\n  }\n\n  @Test\n  fun `codePointOffsetFromEndToCharOffset - ascii`() {\n    val str = \"0123\"\n\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, -1)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, -999)).isEqualTo(-1)\n\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 0)).isEqualTo(4)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 1)).isEqualTo(3)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 2)).isEqualTo(2)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 3)).isEqualTo(1)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 4)).isEqualTo(0)\n\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 5)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(\"012345\", 999)).isEqualTo(-1)\n  }\n\n  @Test\n  fun `codePointOffsetFromEndToCharOffset - unicode`() {\n    val str = \"0\\uD83D\\uDE002\\uD83D\\uDE00\"\n\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, -1)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, -999)).isEqualTo(-1)\n\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 0)).isEqualTo(6)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 1)).isEqualTo(4)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 2)).isEqualTo(3)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 3)).isEqualTo(1)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 4)).isEqualTo(0)\n\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 5)).isEqualTo(-1)\n    assertThat(VmUtils.codePointOffsetFromEndToCharOffset(str, 999)).isEqualTo(-1)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/runtime/VmValueRendererTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.runtime\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass VmValueRendererTest {\n  private val renderer = VmValueRenderer.singleLine(80)\n\n  @Test\n  fun `render null without default`() {\n    val none = VmNull.withoutDefault()\n    assertThat(renderer.render(none)).isEqualTo(\"null\")\n  }\n\n  @Test\n  fun `render null with default`() {\n    val none = VmNull.withDefault(\"default\")\n    assertThat(renderer.render(none)).isEqualTo(\"null\")\n  }\n\n  @Test\n  fun `render bytes`() {\n    val bytes = VmBytes((-128..127).map { it.toByte() }.toByteArray())\n    assertThat(renderer.render(bytes))\n      .isEqualTo(\"Bytes(128, 129, 130, 131, 132, 133, 134, 135, ... <total size: 256.b>)\")\n  }\n\n  @Test\n  fun `render bytes - precisions`() {\n    val oneKbExactly = VmBytes(ByteArray(1000))\n    assertThat(renderer.render(oneKbExactly))\n      .isEqualTo(\"Bytes(0, 0, 0, 0, 0, 0, 0, 0, ... <total size: 1.kb>)\")\n\n    val over1Kb = VmBytes(ByteArray(123467))\n    assertThat(renderer.render(over1Kb))\n      .isEqualTo(\"Bytes(0, 0, 0, 0, 0, 0, 0, 0, ... <total size: 123.47.kb>)\")\n\n    val oneTenthPrecision = VmBytes(ByteArray(1100))\n    assertThat(renderer.render(oneTenthPrecision))\n      .isEqualTo(\"Bytes(0, 0, 0, 0, 0, 0, 0, 0, ... <total size: 1.1.kb>)\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/settings/PklSettingsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.settings\n\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.writeString\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource\nimport org.pkl.core.PObject\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings\nimport org.pkl.core.settings.PklSettings.Editor\n\nclass PklSettingsTest {\n  @Test\n  fun `load user settings`(@TempDir tempDir: Path) {\n    val settingsPath = tempDir.resolve(\"settings.pkl\")\n    settingsPath.createParentDirectories()\n    settingsPath.writeString(\n      \"\"\"\n      amends \"pkl:settings\"\n      editor = Sublime\n      \"\"\"\n        .trimIndent()\n    )\n\n    val settings = PklSettings.loadFromPklHomeDir(tempDir)\n    assertThat(settings).isEqualTo(PklSettings(Editor.SUBLIME, null))\n  }\n\n  @Test\n  fun `load user settings with http`(@TempDir tempDir: Path) {\n    val settingsPath = tempDir.resolve(\"settings.pkl\")\n    settingsPath.createParentDirectories()\n    settingsPath.writeString(\n      \"\"\"\n      amends \"pkl:settings\"\n      http {\n        proxy {\n          address = \"http://localhost:8080\"\n          noProxy {\n            \"example.com\"\n            \"pkg.pkl-lang.org\"\n          }\n        }\n        rewrites {\n          [\"https://foo.com/\"] = \"https://bar.com/\"\n        }\n      }\n      \"\"\"\n        .trimIndent()\n    )\n\n    val settings = PklSettings.loadFromPklHomeDir(tempDir)\n    val expectedHttp =\n      PklEvaluatorSettings.Http(\n        PklEvaluatorSettings.Proxy(\n          URI(\"http://localhost:8080\"),\n          listOf(\"example.com\", \"pkg.pkl-lang.org\"),\n        ),\n        mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n      )\n    assertThat(settings).isEqualTo(PklSettings(Editor.SYSTEM, expectedHttp))\n  }\n\n  @Test\n  fun `load user settings with http, but no noProxy`(@TempDir tempDir: Path) {\n    val settingsPath = tempDir.resolve(\"settings.pkl\")\n    settingsPath.createParentDirectories()\n    settingsPath.writeString(\n      \"\"\"\n      amends \"pkl:settings\"\n      http {\n        proxy {\n          address = \"http://localhost:8080\"\n        }\n      }\n      \"\"\"\n        .trimIndent()\n    )\n\n    val settings = PklSettings.loadFromPklHomeDir(tempDir)\n    val expectedHttp =\n      PklEvaluatorSettings.Http(\n        PklEvaluatorSettings.Proxy(URI(\"http://localhost:8080\"), listOf()),\n        null,\n      )\n    assertThat(settings).isEqualTo(PklSettings(Editor.SYSTEM, expectedHttp))\n  }\n\n  @Test\n  fun `load settings from path`(@TempDir tempDir: Path) {\n    val settingsPath = tempDir.resolve(\"my-settings.pkl\")\n    settingsPath.writeString(\n      \"\"\"\n      amends \"pkl:settings\"\n      editor = Idea\n      \"\"\"\n        .trimIndent()\n    )\n\n    val settings = PklSettings.load(ModuleSource.path(settingsPath))\n    assertThat(settings).isEqualTo(PklSettings(Editor.IDEA, null))\n  }\n\n  @Test\n  fun `predefined editors`() {\n    val evaluator = Evaluator.preconfigured()\n    val module =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        import \"pkl:settings\"\n  \n        system = settings.System\n        idea = settings.Idea\n        textMate = settings.TextMate\n        sublime = settings.Sublime\n        atom = settings.Atom\n        vsCode = settings.VsCode\n        \"\"\"\n            .trimIndent()\n        )\n      )\n\n    checkEquals(Editor.SYSTEM, module.getProperty(\"system\") as PObject)\n    checkEquals(Editor.IDEA, module.getProperty(\"idea\") as PObject)\n    checkEquals(Editor.TEXT_MATE, module.getProperty(\"textMate\") as PObject)\n    checkEquals(Editor.SUBLIME, module.getProperty(\"sublime\") as PObject)\n    checkEquals(Editor.ATOM, module.getProperty(\"atom\") as PObject)\n    checkEquals(Editor.VS_CODE, module.getProperty(\"vsCode\") as PObject)\n  }\n\n  @Test\n  fun `invalid settings file`(@TempDir tempDir: Path) {\n    val settingsFile = tempDir.resolve(\"settings.pkl\").apply { writeString(\"foo = 1\") }\n    assertThatCode { PklSettings.loadFromPklHomeDir(tempDir) }\n      .hasMessageContaining(\n        \"Expected `output.value` of module `${settingsFile.toUri()}` to be of type `pkl.settings`, but got type `settings`.\"\n      )\n  }\n\n  private fun checkEquals(expected: Editor, actual: PObject) {\n    assertThat(actual.getProperty(\"urlScheme\") as String).isEqualTo(expected.urlScheme())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/stdlib/PathConverterSupportTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib\n\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.runtime.Identifier\n\nclass PathConverterSupportTest {\n  @Test\n  fun `exact path matches`() {\n    val pathSpec = listOf(Identifier.get(\"foo\"), Identifier.get(\"bar\"), Identifier.get(\"baz\"))\n    val pathPartSpec = listOf(Identifier.get(\"foo\"), Identifier.get(\"bar\"), Identifier.get(\"baz\"))\n    assertTrue(PathConverterSupport.pathMatches(pathSpec, pathPartSpec))\n  }\n\n  @Test\n  fun `wildcard properties`() {\n    val pathSpec =\n      listOf(Identifier.get(\"foo\"), PklConverter.WILDCARD_PROPERTY, Identifier.get(\"baz\"))\n    val pathPartSpec = listOf(Identifier.get(\"foo\"), Identifier.get(\"bar\"), Identifier.get(\"baz\"))\n    assertTrue(PathConverterSupport.pathMatches(pathSpec, pathPartSpec))\n  }\n\n  @Test\n  fun `wildcard elements`() {\n    val pathSpec =\n      listOf(Identifier.get(\"foo\"), PklConverter.WILDCARD_ELEMENT, Identifier.get(\"baz\"))\n    val pathPartSpec = listOf(Identifier.get(\"foo\"), 0, Identifier.get(\"baz\"))\n    assertTrue(PathConverterSupport.pathMatches(pathSpec, pathPartSpec))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/stdlib/PathSpecParserTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.core.runtime.Identifier\nimport org.pkl.core.runtime.VmException\nimport org.pkl.core.runtime.VmValueConverter.*\n\nclass PathSpecParserTest {\n  private val parser = PathSpecParser()\n\n  @Test\n  fun `parse valid path specs`() {\n    assertThat(parser.parse(\"\")).isEqualTo(arrayOf(TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"^\")).isEqualTo(arrayOf(TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"property\")).isEqualTo(arrayOf(Identifier.get(\"property\")))\n\n    assertThat(parser.parse(\"^property\"))\n      .isEqualTo(arrayOf(Identifier.get(\"property\"), TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"prop1.prop2.prop3\"))\n      .isEqualTo(arrayOf(Identifier.get(\"prop3\"), Identifier.get(\"prop2\"), Identifier.get(\"prop1\")))\n\n    assertThat(parser.parse(\"^prop1.prop2.prop3\"))\n      .isEqualTo(\n        arrayOf(\n          Identifier.get(\"prop3\"),\n          Identifier.get(\"prop2\"),\n          Identifier.get(\"prop1\"),\n          TOP_LEVEL_VALUE,\n        )\n      )\n\n    assertThat(parser.parse(\"[key]\")).isEqualTo(arrayOf(\"key\"))\n\n    assertThat(parser.parse(\"^[key]\")).isEqualTo(arrayOf(\"key\", TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"[key1][key2][key3]\")).isEqualTo(arrayOf(\"key3\", \"key2\", \"key1\"))\n\n    assertThat(parser.parse(\"^[key1][key2][key3]\"))\n      .isEqualTo(arrayOf(\"key3\", \"key2\", \"key1\", TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"*\")).isEqualTo(arrayOf(WILDCARD_PROPERTY))\n\n    assertThat(parser.parse(\"^*\")).isEqualTo(arrayOf(WILDCARD_PROPERTY, TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"[*]\")).isEqualTo(arrayOf(WILDCARD_ELEMENT))\n\n    assertThat(parser.parse(\"^[*]\")).isEqualTo(arrayOf(WILDCARD_ELEMENT, TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"*.*.*\"))\n      .isEqualTo(arrayOf(WILDCARD_PROPERTY, WILDCARD_PROPERTY, WILDCARD_PROPERTY))\n\n    assertThat(parser.parse(\"^*.*.*\"))\n      .isEqualTo(arrayOf(WILDCARD_PROPERTY, WILDCARD_PROPERTY, WILDCARD_PROPERTY, TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"[*][*][*]\"))\n      .isEqualTo(arrayOf(WILDCARD_ELEMENT, WILDCARD_ELEMENT, WILDCARD_ELEMENT))\n\n    assertThat(parser.parse(\"^[*][*][*]\"))\n      .isEqualTo(arrayOf(WILDCARD_ELEMENT, WILDCARD_ELEMENT, WILDCARD_ELEMENT, TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"[*].*[*]\"))\n      .isEqualTo(arrayOf(WILDCARD_ELEMENT, WILDCARD_PROPERTY, WILDCARD_ELEMENT))\n\n    assertThat(parser.parse(\"^[*].*[*]\"))\n      .isEqualTo(arrayOf(WILDCARD_ELEMENT, WILDCARD_PROPERTY, WILDCARD_ELEMENT, TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"*[*].*\"))\n      .isEqualTo(arrayOf(WILDCARD_PROPERTY, WILDCARD_ELEMENT, WILDCARD_PROPERTY))\n\n    assertThat(parser.parse(\"^*[*].*\"))\n      .isEqualTo(arrayOf(WILDCARD_PROPERTY, WILDCARD_ELEMENT, WILDCARD_PROPERTY, TOP_LEVEL_VALUE))\n\n    assertThat(parser.parse(\"prop1[key1].*[key2].prop2[*]\"))\n      .isEqualTo(\n        arrayOf(\n          WILDCARD_ELEMENT,\n          Identifier.get(\"prop2\"),\n          \"key2\",\n          WILDCARD_PROPERTY,\n          \"key1\",\n          Identifier.get(\"prop1\"),\n        )\n      )\n\n    assertThat(parser.parse(\"^prop1[key1].*[key2].prop2[*]\"))\n      .isEqualTo(\n        arrayOf(\n          WILDCARD_ELEMENT,\n          Identifier.get(\"prop2\"),\n          \"key2\",\n          WILDCARD_PROPERTY,\n          \"key1\",\n          Identifier.get(\"prop1\"),\n          TOP_LEVEL_VALUE,\n        )\n      )\n  }\n\n  // TODO: how to handle whitespace?\n  // TODO: support quoted identifiers?\n  @Test\n  fun `parse invalid path specs`() {\n    assertThrows<VmException> { parser.parse(\"^^\") }\n\n    assertThrows<VmException> { parser.parse(\"property.\") }\n\n    assertThrows<VmException> { parser.parse(\"property^\") }\n\n    assertThrows<VmException> { parser.parse(\".property\") }\n\n    assertThrows<VmException> { parser.parse(\"prop1..prop2\") }\n\n    assertThrows<VmException> { parser.parse(\"[key\") }\n\n    assertThrows<VmException> { parser.parse(\"key]\") }\n\n    assertThrows<VmException> { parser.parse(\"[[key]]\") }\n\n    assertThrows<VmException> { parser.parse(\"property.[key]\") }\n\n    assertThrows<VmException> { parser.parse(\"[key1].[key2]\") }\n\n    assertThrows<VmException> { parser.parse(\"[key1] [key2]\") }\n\n    assertThrows<VmException> { parser.parse(\"**\") }\n\n    assertThrows<VmException> { parser.parse(\"[**]\") }\n\n    assertThrows<VmException> { parser.parse(\"[*\") }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/stdlib/ReflectModuleTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ValueSource\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource\n\nclass ReflectModuleTest {\n  private val evaluator = Evaluator.preconfigured()\n\n  @ValueSource(\n    strings =\n      [\n        \"pkl:base\",\n        \"pkl:json\",\n        \"pkl:jsonnet\",\n        \"pkl:math\",\n        \"pkl:protobuf\",\n        \"pkl:reflect\",\n        \"pkl:settings\",\n        \"pkl:shell\",\n        \"pkl:test\",\n        \"pkl:xml\",\n        \"pkl:yaml\",\n      ]\n  )\n  @ParameterizedTest(name = \"can reflect on {0} module\")\n  fun `can reflect on stdlib module`(moduleName: String) {\n    // language=Pkl\n    evaluator.evaluate(\n      ModuleSource.text(\n        \"\"\"\n        import \"pkl:reflect\"\n        // use toString() because default values of some class properties\n        // (e.g., Listing.default) cannot be exported or rendered as Pcf\n        output {\n          text = reflect.Module(import(\"$moduleName\")).toString()\n        }\n        \"\"\"\n          .trimIndent()\n      )\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/stdlib/SimpleReportTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.stdlib\n\nimport java.io.StringWriter\nimport java.util.*\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.TestResults\nimport org.pkl.core.TestResults.TestResult\nimport org.pkl.core.TestResults.TestSectionResults\nimport org.pkl.core.stdlib.test.report.SimpleReport\n\nclass SimpleReportTest {\n\n  @Test\n  fun `summarize method should generate correct output`() {\n    var resultsBuilder = TestResults.Builder(\"module1\", \"module1\")\n    resultsBuilder.setFactsSection(\n      TestSectionResults(\n        TestResults.TestSectionName.FACTS,\n        listOf(\n          TestResult(\n            \"example1\",\n            321919,\n            listOf(TestResults.Failure(\"Fact Failure\", \"failed\")),\n            emptyList(),\n            false,\n          )\n        ),\n      )\n    )\n    resultsBuilder.setExamplesSection(\n      TestSectionResults(\n        TestResults.TestSectionName.EXAMPLES,\n        listOf(\n          TestResult(\n            \"example1\",\n            432525,\n            listOf(TestResults.Failure(\"Output Mismatch\", \"does not match\")),\n            emptyList(),\n            false,\n          )\n        ),\n      )\n    )\n    val testResults = listOf(resultsBuilder.build())\n\n    val writer = StringWriter()\n    val simpleReport = SimpleReport(false)\n    simpleReport.summarize(testResults, writer)\n\n    val expectedOutput =\n      \"\"\"\n            0.0% tests pass [2/2 failed], 99.9% asserts pass [2/754444 failed]\n            \"\"\"\n        .trimIndent()\n\n    assertThat(writer.toString().trimIndent()).isEqualTo(expectedOutput)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/truffle/LongVsDoubleSpecializationTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.truffle\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSource\n\n// Verifies that (long, long) specialization is chosen for (long, long) inputs\n// even if (double, double) specialization is currently active.\n// This didn't work correctly for the pkl.math nodes exercised by this test\n// before we removed the @ImplicitCast from long and double.\n// (Strangely enough, it did work for nodes such as AdditionNode,\n// which Christian Humer couldn't reproduce with a standalone example.\n// According to him, @ImplicitCast doesn't provide such a guarantee\n// and shouldn't be used if it's needed as in our case.)\nclass LongVsDoubleSpecializationTest {\n  private val evaluator = Evaluator.preconfigured()\n\n  @Test\n  fun addition() {\n    val result =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        x1 = Pair(1.0 + 2.0, 1 + 2).second\n        \"\"\"\n        )\n      )\n\n    assertThat(result.properties[\"x1\"]).isEqualTo(3L)\n  }\n\n  @Test\n  fun subtraction() {\n    val result =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        x1 = Pair(1.0 - 2.0, 1 - 2).second\n        \"\"\"\n        )\n      )\n\n    assertThat(result.properties[\"x1\"]).isEqualTo(-1L)\n  }\n\n  @Test\n  fun multiplication() {\n    val result =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        x1 = Pair(1.0 * 2.0, 1 * 2).second\n        \"\"\"\n        )\n      )\n\n    assertThat(result.properties[\"x1\"]).isEqualTo(2L)\n  }\n\n  @Test\n  fun exponentiation() {\n    val result =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        import \"pkl:math\"\n  \n        x1 = Pair(2.0 ** 2.0, 2 ** 2).second\n        \"\"\"\n        )\n      )\n\n    assertThat(result.properties[\"x1\"]).isEqualTo(4L)\n  }\n\n  @Test\n  fun math_min() {\n    val result =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        import \"pkl:math\"\n  \n        x1 = Pair(math.min(1.0, 2.0), math.min(1, 2)).second\n        \"\"\"\n        )\n      )\n\n    assertThat(result.properties[\"x1\"]).isEqualTo(1L)\n  }\n\n  @Test\n  fun math_max() {\n    val result =\n      evaluator.evaluate(\n        ModuleSource.text(\n          \"\"\"\n        import \"pkl:math\"\n  \n        x1 = Pair(math.max(1.0, 2.0), math.max(1, 2)).second\n        \"\"\"\n        )\n      )\n\n    assertThat(result.properties[\"x1\"]).isEqualTo(2L)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/AnsiStringBuilderTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport java.util.*\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.util.AnsiStringBuilder.AnsiCode\n\nclass AnsiStringBuilderTest {\n  @Test\n  fun `no formatting`() {\n    val result = AnsiStringBuilder(false).append(AnsiCode.RED, \"hello\").toString()\n    assertThat(result).isEqualTo(\"hello\")\n  }\n\n  private val red = \"\\u001b[31m\"\n  private val redBold = \"\\u001b[1;31m\"\n  private val reset = \"\\u001b[0m\"\n  private val bold = \"\\u001b[1m\"\n\n  // make test failures easier to debug\n  private val String.escaped\n    get() = replace(\"\\u001b\", \"[ESC]\")\n\n  @Test\n  fun `don't emit same color code`() {\n    val result =\n      AnsiStringBuilder(true).append(AnsiCode.RED, \"hi\").append(AnsiCode.RED, \"hi\").toString()\n    assertThat(result.escaped).isEqualTo(\"${red}hihi${reset}\".escaped)\n  }\n\n  @Test\n  fun `only add needed codes`() {\n    val result =\n      AnsiStringBuilder(true)\n        .append(AnsiCode.RED, \"hi\")\n        .append(EnumSet.of(AnsiCode.RED, AnsiCode.BOLD), \"hi\")\n        .toString()\n    assertThat(result.escaped).isEqualTo(\"${red}hi${bold}hi${reset}\".escaped)\n  }\n\n  @Test\n  fun `reset if need to subtract`() {\n    val result =\n      AnsiStringBuilder(true)\n        .append(EnumSet.of(AnsiCode.RED, AnsiCode.BOLD), \"hi\")\n        .append(AnsiCode.RED, \"hi\")\n        .toString()\n    assertThat(result.escaped).isEqualTo(\"${redBold}hi${reset}${red}hi${reset}\".escaped)\n  }\n\n  @Test\n  fun `plain text in between`() {\n    val result =\n      AnsiStringBuilder(true)\n        .append(AnsiCode.RED, \"hi\")\n        .append(\"hi\")\n        .append(AnsiCode.RED, \"hi\")\n        .toString()\n    assertThat(result.escaped).isEqualTo(\"${red}hi${reset}hi${red}hi${reset}\".escaped)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/ArrayCharEscaperTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass ArrayCharEscaperTest {\n  @Test\n  fun `basic usage`() {\n    val escaper =\n      ArrayCharEscaper.builder()\n        .withEscape('ä', \"ae\")\n        .withEscape('ö', \"oe\")\n        .withEscape('ü', \"ue\")\n        .build()\n\n    assertThat(escaper.escape(\"\")).isEqualTo(\"\")\n    assertThat(escaper.escape(\"äää\")).isEqualTo(\"aeaeae\")\n    assertThat(escaper.escape(\"äxöyüz\")).isEqualTo(\"aexoeyuez\")\n\n    val fox = \"The quick brown fox jumps over the lazy dog.\"\n    assertThat(escaper.escape(fox)).isEqualTo(fox)\n\n    assertThat(escaper.escape(\"ä😀😈😍öö😎😡🤢üüü🤣\")).isEqualTo(\"ae😀😈😍oeoe😎😡🤢ueueue🤣\")\n  }\n\n  @Test\n  fun `enforces size limit`() {\n    assertThrows<IllegalStateException> {\n      ArrayCharEscaper.builder().withEscape('a', \"aa\").withEscape('Ɇ', \"ee\").build()\n    }\n  }\n\n  @Test\n  fun `works if no escapes defined`() {\n    val escaper = ArrayCharEscaper.builder().build()\n\n    assertThat(escaper.escape(\"\")).isEqualTo(\"\")\n    assertThat(escaper.escape(\"äää\")).isEqualTo(\"äää\")\n    assertThat(escaper.escape(\"äxöyüz\")).isEqualTo(\"äxöyüz\")\n  }\n\n  @Test\n  fun `returns original string if no escaping required`() {\n    val escaper = ArrayCharEscaper.builder().withEscape('ä', \"ae\").build()\n\n    val fox = \"The quick brown fox jumps over the lazy dog.\"\n    assertThat(escaper.escape(fox)).isSameAs(fox)\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/ExceptionsTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport java.io.IOException\nimport java.lang.Error\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass ExceptionsTest {\n  @Test\n  fun `get root cause of simple exception`() {\n    val e = IOException(\"io\")\n    assertThat(Exceptions.getRootCause(e)).isSameAs(e)\n  }\n\n  @Test\n  fun `get root cause of nested exception`() {\n    val e = IOException(\"io\")\n    val e2 = RuntimeException(\"runtime\")\n    val e3 = Error(\"error\")\n    e.initCause(e2)\n    e2.initCause(e3)\n    assertThat(Exceptions.getRootCause(e)).isSameAs(e3)\n  }\n\n  @Test\n  fun `get root reason`() {\n    val e = IOException(\"io\")\n    val e2 = RuntimeException(\"the root reason\")\n    e.initCause(e2)\n    assertThat(Exceptions.getRootReason(e)).isEqualTo(\"the root reason\")\n  }\n\n  @Test\n  fun `get root reason if null`() {\n    val e = IOException(\"io\")\n    val e2 = RuntimeException(null as String?)\n    e.initCause(e2)\n    assertThat(Exceptions.getRootReason(e)).isEqualTo(\"(unknown reason)\")\n  }\n\n  @Test\n  fun `get root reason if empty`() {\n    val e = IOException(\"io\")\n    val e2 = RuntimeException(\"\")\n    e.initCause(e2)\n    assertThat(Exceptions.getRootReason(e)).isEqualTo(\"(unknown reason)\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/GlobResolverTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ValueSource\n\nclass GlobResolverTest {\n  @Test\n  fun `basic match`() {\n    val pattern = GlobResolver.toRegexPattern(\"foobar\")\n    assertTrue(pattern.matcher(\"foobar\").matches())\n    assertFalse(pattern.matcher(\"oobar\").matches())\n    assertFalse(pattern.matcher(\"fooba\").matches())\n    assertFalse(pattern.matcher(\"\").matches())\n  }\n\n  @Test\n  fun `basic match 2`() {\n    val pattern = GlobResolver.toRegexPattern(\"foo+bar.pkl\")\n    assertTrue(pattern.matcher(\"foo+bar.pkl\").matches())\n    assertFalse(pattern.matcher(\"foooooobar.pkl\").matches())\n  }\n\n  @ParameterizedTest\n  @ValueSource(\n    strings =\n      [\n        \"foo.pkl\",\n        \"bar.pkl\",\n        \"baz.pkl\",\n        \"buzzy...baz.pkl\",\n        \"ted_lasso.min.pkl\",\n        \"ted_lasso.pkl.min.pkl\",\n      ]\n  )\n  fun `glob match`(input: String) {\n    val pattern = GlobResolver.toRegexPattern(\"*.pkl\")\n    assertTrue(pattern.matcher(input).matches())\n  }\n\n  @ParameterizedTest\n  @ValueSource(\n    strings =\n      [\n        \"bar.pcf\",\n        \"bar.yml\",\n        \"bar.pkl.bcl\",\n        \"bar.pklpkl\",\n        \"pkl\",\n        // crosses directory boundaries\n        \"/bar/baz.pkl\",\n        \"/baz.pkl\",\n      ]\n  )\n  fun `glob non-match`(input: String) {\n    val pattern = GlobResolver.toRegexPattern(\"*.pkl\")\n    assertFalse(pattern.matcher(input).matches())\n  }\n\n  @ParameterizedTest\n  @ValueSource(\n    strings = [\"/foo.pkl/bar/baz.pkl\", \"//fo///ba.pkl\", \".pkl\", \"buz.pkl\", \"pkl.pkl.pkl.pkl\"]\n  )\n  fun `globstar match`(input: String) {\n    val pattern = GlobResolver.toRegexPattern(\"**.pkl\")\n    assertTrue(pattern.matcher(input).matches())\n  }\n\n  @ParameterizedTest\n  @ValueSource(\n    strings = [\"/foo.pkl/bar/baz.pkl\", \"//fo///ba.pkl\", \".pkl\", \"buz.pkl\", \"pkl.pkl.pkl.pkl\"]\n  )\n  fun `globstar non-match`(input: String) {\n    val pattern = GlobResolver.toRegexPattern(\"**.pkl\")\n    assertTrue(pattern.matcher(input).matches())\n  }\n\n  @ParameterizedTest\n  @ValueSource(strings = [\"/foo.pkl/bar/baz.pkl\", \"//fo///ba.pkl\"])\n  fun `globstar match 2`(input: String) {\n    val pattern = GlobResolver.toRegexPattern(\"/**/*.pkl\")\n    assertTrue(pattern.matcher(input).matches())\n  }\n\n  @ParameterizedTest\n  @ValueSource(strings = [\"bar.pkl\", \".pkl\", \"/foo.pkl\"])\n  fun `globstar non-match 2`(input: String) {\n    val pattern = GlobResolver.toRegexPattern(\"/**/*.pkl\")\n    assertFalse(pattern.matcher(input).matches())\n  }\n\n  @Test\n  fun `sub-patterns`() {\n    val pattern = GlobResolver.toRegexPattern(\"{foo,bar}\")\n    assertTrue(pattern.matcher(\"foo\").matches())\n    assertTrue(pattern.matcher(\"bar\").matches())\n    assertFalse(pattern.matcher(\"barr\").matches())\n    assertFalse(pattern.matcher(\"fooo\").matches())\n    assertFalse(pattern.matcher(\"zebra\").matches())\n    assertFalse(pattern.matcher(\"\").matches())\n\n    val pattern2 = GlobResolver.toRegexPattern(\"{,,,a,}\")\n    assertTrue(pattern2.matcher(\"a\").matches())\n    assertTrue(pattern2.matcher(\"\").matches())\n    assertFalse(pattern2.matcher(\"z\").matches())\n\n    val pattern3 = GlobResolver.toRegexPattern(\"*.y{a,}ml\")\n    assertTrue(pattern3.matcher(\"foo.yml\").matches())\n    assertTrue(pattern3.matcher(\"foo.yaml\").matches())\n    assertFalse(pattern3.matcher(\"foo.yaaaaaml\").matches())\n  }\n\n  @Test\n  fun `sub-patterns with wildcards`() {\n    val pattern = GlobResolver.toRegexPattern(\"{*.foo,*.bar}\")\n    assertTrue(pattern.matcher(\"thing.foo\").matches())\n    assertTrue(pattern.matcher(\"thing.bar\").matches())\n    assertTrue(pattern.matcher(\"zing.bar\").matches())\n    assertTrue(pattern.matcher(\".bar\").matches())\n    assertTrue(pattern.matcher(\".foo\").matches())\n  }\n\n  @Test\n  fun `invalid sub-patterns`() {\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"{foo{bar}}\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> { GlobResolver.toRegexPattern(\"{foo\") }\n    // no leading open curly means closing curly is treated verbatim\n    assertDoesNotThrow { GlobResolver.toRegexPattern(\"foo}\") }\n  }\n\n  @Test\n  fun `character classes`() {\n    // leading `^` is the verbatim caret character.\n    val pattern = GlobResolver.toRegexPattern(\"thing[^0-9]\")\n    assertTrue(pattern.matcher(\"thing^\").matches())\n    assertTrue(pattern.matcher(\"thing0\").matches())\n    assertTrue(pattern.matcher(\"thing1\").matches())\n    assertTrue(pattern.matcher(\"thing2\").matches())\n    assertTrue(pattern.matcher(\"thing3\").matches())\n    assertTrue(pattern.matcher(\"thing4\").matches())\n    assertTrue(pattern.matcher(\"thing5\").matches())\n  }\n\n  @Test\n  fun `character classes don't cross directory boundaries`() {\n    val pattern = GlobResolver.toRegexPattern(\"[.-z]\")\n    assertTrue(pattern.matcher(\"f\").matches())\n    assertFalse(pattern.matcher(\"/\").matches())\n  }\n\n  @Test\n  fun `invalid character classes`() {\n    assertThrows<GlobResolver.InvalidGlobPatternException> { GlobResolver.toRegexPattern(\"thing[\") }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"thing[foo/bar]\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"[[=a=]]\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"[[:alnum:]]\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"[[.a-acute.]]\")\n    }\n    // no leading open square bracket means closing square bracket is verbatim\n    assertDoesNotThrow { GlobResolver.toRegexPattern(\"]\") }\n  }\n\n  @Test\n  fun `invalid extglob`() {\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"!(foo|bar)\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"+(foo|bar)\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"?(foo|bar)\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"@(foo|bar)\")\n    }\n    assertThrows<GlobResolver.InvalidGlobPatternException> {\n      GlobResolver.toRegexPattern(\"*(foo|bar)\")\n    }\n  }\n\n  @Test\n  fun `wildcard character`() {\n    val pattern = GlobResolver.toRegexPattern(\"ae?ou\")\n    assertTrue(pattern.matcher(\"aeiou\").matches())\n    assertTrue(pattern.matcher(\"aeeou\").matches())\n    assertTrue(pattern.matcher(\"aelou\").matches())\n    assertTrue(pattern.matcher(\"aejou\").matches())\n    assertFalse(pattern.matcher(\"aeou\").matches())\n    assertFalse(pattern.matcher(\"aou\").matches())\n  }\n\n  @Test\n  fun `character classes - negation`() {\n    val pattern = GlobResolver.toRegexPattern(\"thing[!0-5]\")\n    assertFalse(pattern.matcher(\"thing1\").matches())\n    assertFalse(pattern.matcher(\"thing2\").matches())\n    assertFalse(pattern.matcher(\"thing3\").matches())\n    assertFalse(pattern.matcher(\"thing4\").matches())\n    assertFalse(pattern.matcher(\"thing5\").matches())\n    assertTrue(pattern.matcher(\"thing6\").matches())\n    assertTrue(pattern.matcher(\"thing7\").matches())\n  }\n\n  @Test\n  fun escapes() {\n    val pattern1 = GlobResolver.toRegexPattern(\"\\\\\\\\foo\")\n    assertTrue(pattern1.matcher(\"\\\\foo\").matches())\n\n    val pattern2 = GlobResolver.toRegexPattern(\"\\\\{foo-bar.pkl\")\n    assertTrue(pattern2.matcher(\"{foo-bar.pkl\").matches())\n\n    val pattern3 = GlobResolver.toRegexPattern(\"\\\\[foo-bar.pkl\")\n    assertTrue(pattern3.matcher(\"[foo-bar.pkl\").matches())\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/HttpUtilsTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport java.io.IOException\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertDoesNotThrow\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.commons.test.FakeHttpResponse\n\nclass HttpUtilsTest {\n  @Test\n  fun isHttpUrl() {\n    assertThat(HttpUtils.isHttpUrl(URI(\"http://example.com\"))).isTrue\n    assertThat(HttpUtils.isHttpUrl(URI(\"https://example.com\"))).isTrue\n    assertThat(HttpUtils.isHttpUrl(URI(\"HtTpS://example.com\"))).isTrue\n    assertThat(HttpUtils.isHttpUrl(URI(\"file://example.com\"))).isFalse\n\n    assertThat(HttpUtils.isHttpUrl(URI(\"http://example.com\").toURL())).isTrue\n    assertThat(HttpUtils.isHttpUrl(URI(\"https://example.com\").toURL())).isTrue\n    assertThat(HttpUtils.isHttpUrl(URI(\"HtTpS://example.com\").toURL())).isTrue\n    assertThat(HttpUtils.isHttpUrl(URI(\"file://example.com\").toURL())).isFalse\n  }\n\n  @Test\n  fun checkHasStatusCode200() {\n    val response = FakeHttpResponse.withoutBody { statusCode = 200 }\n    assertDoesNotThrow { HttpUtils.checkHasStatusCode200(response) }\n\n    val response2 = FakeHttpResponse.withoutBody { statusCode = 404 }\n    assertThrows<IOException> { HttpUtils.checkHasStatusCode200(response2) }\n  }\n\n  @Test\n  fun setPort() {\n    assertThrows<IllegalArgumentException> { HttpUtils.setPort(URI(\"https://example.com\"), -1) }\n    assertThrows<IllegalArgumentException> { HttpUtils.setPort(URI(\"https://example.com\"), 65536) }\n    assertThat(HttpUtils.setPort(URI(\"http://example.com\"), 123))\n      .isEqualTo(URI(\"http://example.com:123\"))\n    assertThat(HttpUtils.setPort(URI(\"http://example.com:456\"), 123))\n      .isEqualTo(URI(\"http://example.com:123\"))\n    assertThat(HttpUtils.setPort(URI(\"https://example.com/foo/bar.baz?query=1#fragment\"), 123))\n      .isEqualTo(URI(\"https://example.com:123/foo/bar.baz?query=1#fragment\"))\n    assertThat(HttpUtils.setPort(URI(\"https://example.com:456/foo/bar.baz?query=1#fragment\"), 123))\n      .isEqualTo(URI(\"https://example.com:123/foo/bar.baz?query=1#fragment\"))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/ImportGraphUtilsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.ImportGraph\n\nclass ImportGraphUtilsTest {\n  @Test\n  fun basic() {\n    val barUri = URI(\"file:///bar.pkl\")\n    val fooUri = URI(\"file:///foo.pkl\")\n    val graph =\n      ImportGraph(\n        mapOf(\n          fooUri to setOf(ImportGraph.Import(barUri)),\n          barUri to setOf(ImportGraph.Import(fooUri)),\n        ),\n        // resolved URIs is not important\n        mapOf(),\n      )\n    val cycles = ImportGraphUtils.findImportCycles(graph)\n    assertThat(cycles).isEqualTo(listOf(listOf(fooUri, barUri)))\n  }\n\n  @Test\n  fun `two cycles`() {\n    val barUri = URI(\"file:///bar.pkl\")\n    val fooUri = URI(\"file:///foo.pkl\")\n    val bizUri = URI(\"file:///biz.pkl\")\n    val quxUri = URI(\"file:///qux.pkl\")\n    val graph =\n      ImportGraph(\n        mapOf(\n          fooUri to setOf(ImportGraph.Import(barUri)),\n          barUri to setOf(ImportGraph.Import(fooUri)),\n          bizUri to setOf(ImportGraph.Import(quxUri)),\n          quxUri to setOf(ImportGraph.Import(bizUri)),\n        ),\n        // resolved URIs is not important\n        mapOf(),\n      )\n    val cycles = ImportGraphUtils.findImportCycles(graph)\n    assertThat(cycles).isEqualTo(listOf(listOf(fooUri, barUri), listOf(bizUri, quxUri)))\n  }\n\n  @Test\n  fun `no cycles`() {\n    val barUri = URI(\"file:///bar.pkl\")\n    val fooUri = URI(\"file:///foo.pkl\")\n    val bizUri = URI(\"file:///biz.pkl\")\n    val quxUri = URI(\"file:///qux.pkl\")\n    val graph =\n      ImportGraph(\n        mapOf(\n          barUri to setOf(ImportGraph.Import(fooUri)),\n          fooUri to setOf(ImportGraph.Import(bizUri)),\n          bizUri to setOf(ImportGraph.Import(quxUri)),\n          quxUri to setOf(),\n        ),\n        // resolved URIs is not important\n        mapOf(),\n      )\n    val cycles = ImportGraphUtils.findImportCycles(graph)\n    assertThat(cycles).isEmpty()\n  }\n\n  @Test\n  fun `self-import`() {\n    val fooUri = URI(\"file:///foo.pkl\")\n    val graph =\n      ImportGraph(\n        mapOf(fooUri to setOf(ImportGraph.Import(fooUri))),\n        // resolved URIs is not important\n        mapOf(),\n      )\n    val cycles = ImportGraphUtils.findImportCycles(graph)\n    assertThat(cycles).isEqualTo(listOf(listOf(fooUri)))\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/kotlin/org/pkl/core/util/IoUtilsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.core.util\n\nimport java.io.FileNotFoundException\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.nio.file.Path\nimport kotlin.io.path.createFile\nimport kotlin.io.path.createParentDirectories\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatExceptionOfType\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.toPath\nimport org.pkl.core.SecurityManager\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.module.ModuleKeys\nimport org.pkl.core.runtime.ModuleResolver\n\nclass IoUtilsTest {\n  object FakeSecurityManager : SecurityManager {\n    override fun checkResolveModule(uri: URI) {}\n\n    override fun checkImportModule(importingModule: URI, importedModule: URI) {}\n\n    override fun checkReadResource(resource: URI) {}\n\n    override fun checkResolveResource(resource: URI) {}\n  }\n\n  private val moduleResolver =\n    ModuleResolver(\n      listOf(\n        ModuleKeyFactories.pkg,\n        ModuleKeyFactories.file,\n        ModuleKeyFactories.standardLibrary,\n        ModuleKeyFactories.genericUrl,\n      )\n    )\n\n  @Test\n  fun `ensurePathEndsWithSlash() - relative URI`() {\n    val uri = URI(\"/some/path\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri)).isEqualTo(URI(\"/some/path/\"))\n\n    val uri2 = URI(\"/some/path/\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri2)).isEqualTo(URI(\"/some/path/\"))\n  }\n\n  @Test\n  fun `ensurePathEndsWithSlash() - absolute URI`() {\n    val uri = URI(\"https://apple.com/path\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri)).isEqualTo(URI(\"https://apple.com/path/\"))\n\n    val uri2 = URI(\"https://apple.com/path/\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri2)).isEqualTo(URI(\"https://apple.com/path/\"))\n\n    val uri3 = URI(\"https://user:pwd@apple.com:8080/path?foo=bar#frag\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri3))\n      .isEqualTo(URI(\"https://user:pwd@apple.com:8080/path/?foo=bar#frag\"))\n\n    val uri4 = URI(\"https://user:pwd@apple.com:8080/path/?foo=bar#frag\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri4))\n      .isEqualTo(URI(\"https://user:pwd@apple.com:8080/path/?foo=bar#frag\"))\n  }\n\n  @Test\n  fun `ensurePathEndsWithSlash() - opaque URI`() {\n    val uri = URI(\"foo:some.thing\")\n    assertThat(IoUtils.ensurePathEndsWithSlash(uri)).isEqualTo(URI(\"foo:some.thing\"))\n  }\n\n  @Test\n  fun `resolving relative URI against triple-slash file URI results in triple-slash file URI`() {\n    val resolved = IoUtils.resolve(URI(\"file:///foo/bar\"), URI(\"baz\"))\n    assertThat(resolved).isEqualTo(URI(\"file:///foo/baz\"))\n  }\n\n  @Test\n  fun `resolving relative URI against single-slash file URI results in single-slash file URI`() {\n    val resolved = IoUtils.resolve(URI(\"file:/foo/bar\"), URI(\"baz\"))\n    assertThat(resolved).isEqualTo(URI(\"file:/foo/baz\"))\n  }\n\n  @Test\n  fun `resolving relative URI against triple-slash jar-file URI results in triple-slash jar-file URI`() {\n    val resolved = IoUtils.resolve(URI(\"jar:file:///some/archive.zip!/foo/bar\"), URI(\"baz\"))\n    assertThat(resolved).isEqualTo(URI(\"jar:file:///some/archive.zip!/foo/baz\"))\n  }\n\n  @Test\n  fun `resolving relative URI against single-slash jar-file URI results in single-slash jar-file URI`() {\n    val resolved = IoUtils.resolve(URI(\"jar:file:/some/archive.zip!/foo/bar\"), URI(\"baz\"))\n    assertThat(resolved).isEqualTo(URI(\"jar:file:/some/archive.zip!/foo/baz\"))\n  }\n\n  @Test\n  fun `resolve absolute URI against jar-file URI`() {\n    val uri = URI(\"jar:file:///some/archive.zip!/foo/bar.pkl\")\n    assertThat(IoUtils.resolve(uri, URI(\"https://apple.com\"))).isEqualTo(URI(\"https://apple.com\"))\n  }\n\n  @Test\n  fun `resolving other URIs works the same as java_net_URI_resolve()`() {\n    val resolved = IoUtils.resolve(URI(\"https://apple.com/foo/bar\"), URI(\"baz\"))\n    assertThat(resolved).isEqualTo(URI(\"https://apple.com/foo/baz\"))\n\n    val resolved2 = IoUtils.resolve(URI(\"test:opaque1\"), URI(\"test:opaque2\"))\n    assertThat(resolved2).isEqualTo(URI(\"test:opaque2\"))\n  }\n\n  @Test\n  fun `relativize file URLs`() {\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/bar/baz.pkl\")))\n      .isEqualTo(URI(\"baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/bar/qux.pkl\")))\n      .isEqualTo(URI(\"baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/bar/\")))\n      .isEqualTo(URI(\"baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/bar\")))\n      .isEqualTo(URI(\"bar/baz.pkl\"))\n\n    // URI.relativize() returns an absolute URI here\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/qux/\")))\n      .isEqualTo(URI(\"../bar/baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/qux/qux2/\")))\n      .isEqualTo(URI(\"../../bar/baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///foo/qux/qux2\")))\n      .isEqualTo(URI(\"../bar/baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"file:///qux/qux2/\")))\n      .isEqualTo(URI(\"../../foo/bar/baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"file:///foo/bar/baz.pkl\"), URI(\"https:///foo/bar/baz.pkl\")))\n      .isEqualTo(URI(\"file:///foo/bar/baz.pkl\"))\n  }\n\n  @Test\n  fun `relativize HTTP URLs`() {\n    // perhaps URI(\"\") would be a more precise result\n    assertThat(\n        IoUtils.relativize(URI(\"https://foo.com/bar/baz.pkl\"), URI(\"https://foo.com/bar/baz.pkl\"))\n      )\n      .isEqualTo(URI(\"baz.pkl\"))\n\n    assertThat(\n        IoUtils.relativize(URI(\"https://foo.com/bar/baz.pkl\"), URI(\"https://foo.com/bar/qux.pkl\"))\n      )\n      .isEqualTo(URI(\"baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"https://foo.com/bar/baz.pkl\"), URI(\"https://foo.com/qux/\")))\n      .isEqualTo(URI(\"../bar/baz.pkl\"))\n\n    assertThat(\n        IoUtils.relativize(\n          URI(\"https://foo.com/bar/baz.pkl?query\"),\n          URI(\"https://foo.com/bar/qux.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"baz.pkl?query\"))\n\n    assertThat(\n        IoUtils.relativize(\n          URI(\"https://foo.com/bar/baz.pkl#fragment\"),\n          URI(\"https://foo.com/bar/qux.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"baz.pkl#fragment\"))\n\n    assertThat(\n        IoUtils.relativize(\n          URI(\"https://foo.com/bar/baz.pkl?query#fragment\"),\n          URI(\"https://foo.com/bar/qux.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"baz.pkl?query#fragment\"))\n\n    assertThat(\n        IoUtils.relativize(\n          URI(\"https://foo.com/bar/baz.pkl?query#fragment\"),\n          URI(\"https://foo.com/bar/qux.pkl?query2#fragment2\"),\n        )\n      )\n      .isEqualTo(URI(\"baz.pkl?query#fragment\"))\n\n    assertThat(\n        IoUtils.relativize(URI(\"https://foo.com:80/bar/baz.pkl\"), URI(\"https://foo.com:443/bar/\"))\n      )\n      .isEqualTo(URI(\"https://foo.com:80/bar/baz.pkl\"))\n\n    assertThat(\n        IoUtils.relativize(\n          URI(\"https://foo.com:80/bar/baz.pkl\"),\n          URI(\"https://bar.com:80/bar/baz.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"https://foo.com:80/bar/baz.pkl\"))\n\n    assertThat(\n        IoUtils.relativize(\n          URI(\"https://foo:bar@foo.com:80/bar/baz.pkl\"),\n          URI(\"https://foo:baz@bar.com:80/bar/baz.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"https://foo:bar@foo.com:80/bar/baz.pkl\"))\n\n    assertThat(IoUtils.relativize(URI(\"https://foo/bar/baz.pkl\"), URI(\"file://foo/bar/baz.pkl\")))\n      .isEqualTo(URI(\"https://foo/bar/baz.pkl\"))\n  }\n\n  @Test\n  fun `isWhitespace()`() {\n    assertThat(IoUtils.isWhitespace(\"\")).isTrue\n    assertThat(IoUtils.isWhitespace(\"  \\t \")).isTrue\n    assertThat(IoUtils.isWhitespace(\"  a \")).isFalse\n  }\n\n  @Test\n  fun `toPath()`() {\n    val uri = URI(\"file:///foo/bar.txt\")\n    assertThat(IoUtils.toPath(uri)).isEqualTo(uri.toPath())\n\n    assertThat(IoUtils.toPath(URI(\"https://apple.com\"))).isNull()\n    assertThat(IoUtils.toPath(URI(\"unknown://foo/bar\"))).isNull()\n  }\n\n  @Test\n  fun `toPath() only accepts absolute URIs`() {\n    assertThatExceptionOfType(IllegalArgumentException::class.java).isThrownBy {\n      IoUtils.toPath(URI(\"foo/bar\"))\n    }\n  }\n\n  @Test\n  fun getMaxLineLength() {\n    assertThat(IoUtils.getMaxLineLength(\"abc\")).isEqualTo(3)\n    assertThat(IoUtils.getMaxLineLength(\"abc\\n\\nabcd\\n\\nab\")).isEqualTo(4)\n  }\n\n  @Test\n  fun capitalize() {\n    assertThat(IoUtils.capitalize(\"abc\")).isEqualTo(\"Abc\")\n    assertThat(IoUtils.capitalize(\"Abc\")).isEqualTo(\"Abc\")\n    assertThat(IoUtils.capitalize(\"a&*\")).isEqualTo(\"A&*\")\n    assertThat(IoUtils.capitalize(\"_&*\")).isEqualTo(\"_&*\")\n    assertThat(IoUtils.capitalize(\"abc def\")).isEqualTo(\"Abc def\")\n    assertThat(IoUtils.capitalize(\"Abc def\")).isEqualTo(\"Abc def\")\n  }\n\n  @Test\n  fun inferModuleName() {\n    val assertions =\n      mapOf(\n        \"file:///foo.pkl\" to \"foo\",\n        \"file:///foo/bar/baz.pkl\" to \"baz\",\n        \"jar:file:///some/archive.zip!/foo.pkl\" to \"foo\",\n        \"jar:file:///some/archive.zip!/foo/bar/baz.pkl\" to \"baz\",\n        \"https://apple.com/foo.pkl\" to \"foo\",\n        \"https://apple.com/foo/bar/baz.pkl\" to \"baz\",\n        \"pkl:foo\" to \"foo\",\n        \"pkl:foo.bar.baz\" to \"baz\",\n        \"modulepath:/foo.pkl\" to \"foo\",\n        \"modulepath:/foo/bar/baz.pkl\" to \"baz\",\n        \"package://example.com/foo/bar@1.0.0#/baz.pkl\" to \"baz\",\n        \"package://example.com/foo/bar@1.0.0#/baz/biz/qux.pkl\" to \"qux\",\n      )\n    for ((uriStr, name) in assertions) {\n      val uri = URI(uriStr)\n      val moduleKey = moduleResolver.resolve(uri)\n      assertThat(IoUtils.inferModuleName(moduleKey)).isEqualTo(name)\n    }\n  }\n\n  @Test\n  fun toUri() {\n    assertThat(IoUtils.toUri(\"file://foo.pkl\")).isEqualTo(URI(\"file://foo.pkl\"))\n    assertThat(IoUtils.toUri(\"foo.pkl\")).isEqualTo(URI(\"foo.pkl\"))\n    assertThat(IoUtils.toUri(\"foo bar.pkl\").rawPath).isEqualTo(\"foo%20bar.pkl\")\n    assertThrows<URISyntaxException> { IoUtils.toUri(\"file:foo bar.pkl\") }\n  }\n\n  @Test\n  fun `resolveUri - file hierarchy`(@TempDir tempDir: Path) {\n    val file1 = tempDir.resolve(\"base1/base2/foo.pkl\").createParentDirectories().createFile()\n    val file2 =\n      tempDir.resolve(\"base1/base2/dir1/dir2/foo.pkl\").createParentDirectories().createFile()\n    val file3 = tempDir.resolve(\"base1/dir2/foo.pkl\").createParentDirectories().createFile()\n\n    val uri = file2.toUri()\n    val key = ModuleKeys.file(uri)\n\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\"...\"))).isEqualTo(file1.toUri())\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\".../foo.pkl\")))\n      .isEqualTo(file1.toUri())\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\".../base2/foo.pkl\")))\n      .isEqualTo(file1.toUri())\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\".../base1/base2/foo.pkl\")))\n      .isEqualTo(file1.toUri())\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\".../dir2/foo.pkl\")))\n      .isEqualTo(file3.toUri())\n\n    assertThrows<URISyntaxException> { IoUtils.resolve(FakeSecurityManager, key, URI(\".../\")) }\n\n    assertThrows<URISyntaxException> { IoUtils.resolve(FakeSecurityManager, key, URI(\"...abc\")) }\n\n    assertThrows<FileNotFoundException> {\n      IoUtils.resolve(FakeSecurityManager, key, URI(\".../bar.pkl\"))\n    }\n\n    assertThrows<FileNotFoundException> {\n      IoUtils.resolve(FakeSecurityManager, key, URI(\".../base2/bar.pkl\"))\n    }\n\n    assertThrows<FileNotFoundException> {\n      IoUtils.resolve(FakeSecurityManager, key, URI(\".../foo/bar.pkl\"))\n    }\n  }\n\n  @Test\n  fun `resolveUri - classpath hierarchy`() {\n    val classLoader = this::class.java.classLoader\n    val uri = URI(\"modulepath:/org/pkl/core/module/dir1/dir2/NamedModuleResolversTest.pkl\")\n    val key = ModuleKeys.classPath(uri, classLoader)\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\"...\")))\n      .isEqualTo(URI(\"modulepath:/org/pkl/core/module/NamedModuleResolversTest.pkl\"))\n\n    assertThat(IoUtils.resolve(FakeSecurityManager, key, URI(\".../NamedModuleResolversTest.pkl\")))\n      .isEqualTo(URI(\"modulepath:/org/pkl/core/module/NamedModuleResolversTest.pkl\"))\n\n    assertThat(\n        IoUtils.resolve(FakeSecurityManager, key, URI(\".../module/NamedModuleResolversTest.pkl\"))\n      )\n      .isEqualTo(URI(\"modulepath:/org/pkl/core/module/NamedModuleResolversTest.pkl\"))\n\n    assertThat(\n        IoUtils.resolve(\n          FakeSecurityManager,\n          key,\n          URI(\".../core/module/NamedModuleResolversTest.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"modulepath:/org/pkl/core/module/NamedModuleResolversTest.pkl\"))\n\n    assertThat(\n        IoUtils.resolve(\n          FakeSecurityManager,\n          key,\n          URI(\".../org/pkl/core/module/NamedModuleResolversTest.pkl\"),\n        )\n      )\n      .isEqualTo(URI(\"modulepath:/org/pkl/core/module/NamedModuleResolversTest.pkl\"))\n\n    val uri2 = URI(\"modulepath:/foo/bar/baz.pkl\")\n    val key2 = ModuleKeys.classPath(uri2, classLoader)\n    assertThrows<FileNotFoundException> { IoUtils.resolve(FakeSecurityManager, key2, URI(\"...\")) }\n    assertThrows<FileNotFoundException> {\n      IoUtils.resolve(FakeSecurityManager, key2, URI(\".../other.pkl\"))\n    }\n    assertThrows<FileNotFoundException> {\n      IoUtils.resolve(FakeSecurityManager, key2, URI(\".../dir1/dir2/NamedModuleResolversTest.pkl\"))\n    }\n\n    assertThrows<URISyntaxException> { IoUtils.resolve(FakeSecurityManager, key2, URI(\".../\")) }\n    assertThrows<URISyntaxException> {\n      IoUtils.resolve(FakeSecurityManager, key2, URI(\"...NamedModuleResolversTest.pkl\"))\n    }\n  }\n\n  @Test\n  fun `readBytes(URL) does not support HTTP URLs`() {\n    assertThrows<IllegalArgumentException> { IoUtils.readBytes(URI(\"https://example.com\")) }\n    assertThrows<IllegalArgumentException> { IoUtils.readBytes(URI(\"http://example.com\")) }\n  }\n\n  @Test\n  fun `readString(URL) does not support HTTP URLs`() {\n    assertThrows<IllegalArgumentException> {\n      IoUtils.readString(URI(\"https://example.com\").toURL())\n    }\n    assertThrows<IllegalArgumentException> { IoUtils.readString(URI(\"http://example.com\").toURL()) }\n  }\n\n  @Test\n  fun `encodePath encodes characters reserved on windows`() {\n    assertThat(IoUtils.encodePath(\"foo:bar\")).isEqualTo(\"foo(3a)bar\")\n    assertThat(IoUtils.encodePath(\"<>:\\\"\\\\|?*\")).isEqualTo(\"(3c)(3e)(3a)(22)(5c)(7c)(3f)(2a)\")\n    assertThat(IoUtils.encodePath(\"foo(3a)bar\")).isEqualTo(\"foo((3a)bar\")\n    assertThat(IoUtils.encodePath(\"(\")).isEqualTo(\"((\")\n    assertThat(IoUtils.encodePath(\"3a)\")).isEqualTo(\"3a)\")\n    assertThat(IoUtils.encodePath(\"foo/bar/baz\")).isEqualTo(\"foo/bar/baz\")\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/META-INF/services/org.junit.platform.engine.TestEngine",
    "content": "org.pkl.core.LanguageSnippetTestsEngine\norg.pkl.core.MacAmd64LanguageSnippetTestsEngine\norg.pkl.core.MacAarch64LanguageSnippetTestsEngine\norg.pkl.core.LinuxAmd64LanguageSnippetTestsEngine\norg.pkl.core.LinuxAarch64LanguageSnippetTestsEngine\norg.pkl.core.AlpineLanguageSnippetTestsEngine\norg.pkl.core.WindowsLanguageSnippetTestsEngine\n"
  },
  {
    "path": "pkl-core/src/test/resources/META-INF/services/org.pkl.core.module.ModuleKeyFactory",
    "content": "org.pkl.core.module.TestModuleKeyFactory\n"
  },
  {
    "path": "pkl-core/src/test/resources/META-INF/services/org.pkl.core.resource.ResourceReader",
    "content": "org.pkl.core.resource.TestResourceReader\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTest.pkl",
    "content": "/// comment\nmodule test extends \"EvaluateSchemaTestBaseModule.pkl\"\n\n/// comment\npropertyb1 = \"parrot\"\n\n/// comment\npropertyb2: Int =\n  42\n\n/// comment\nfunction methodb1() = \"parrot\"\n\n/// comment\nfunction methodb2(str: String(!isEmpty, startsWith(\"a\"))): Int(isPositive) =\n  str.length\n\n/// comment\nclass Classb1 extends Classa1 {\n  name: String\n  age: Int\n}\n\npropertyb3 = (_, _) -> 3\n\nfunction methodb3(x: String, _, i: Int, _): Int = x.length + i\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/EvaluateSchemaTestBaseModule.pkl",
    "content": "open module test.base\n\npropertya1 = \"pigeon\"\n\nfunction methoda1() = \"pigeon\"\n\nopen class Classa1 {\n  name: String\n  age: Int\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/EvaluatorTest.pkl",
    "content": "name = \"pigeon\"\nage = 10 + 20\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/PropertyList-1.0.dtd",
    "content": "<!ENTITY % plistObject \"(array | data | date | dict | real | integer | string | true | false )\" >\n<!ELEMENT plist %plistObject;>\n<!ATTLIST plist version CDATA \"1.0\" >\n\n<!-- Collections -->\n<!ELEMENT array (%plistObject;)*>\n<!ELEMENT dict (key, %plistObject;)*>\n<!ELEMENT key (#PCDATA)>\n\n<!--- Primitive types -->\n<!ELEMENT string (#PCDATA)>\n<!ELEMENT data (#PCDATA)> <!-- Contents interpreted as Base-64 encoded -->\n<!ELEMENT date (#PCDATA)> <!-- Contents should conform to a subset of ISO 8601 (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'.  Smaller units may be omitted with a loss of precision) -->\n\n<!-- Numerical primitives -->\n<!ELEMENT true EMPTY>  <!-- Boolean constant true -->\n<!ELEMENT false EMPTY> <!-- Boolean constant false -->\n<!ELEMENT real (#PCDATA)> <!-- Contents should represent a floating point number matching (\"+\" | \"-\")? d+ (\".\"d*)? (\"E\" (\"+\" | \"-\") d+)? where d is a digit 0-9.  -->\n<!ELEMENT integer (#PCDATA)> <!-- Contents should represent a (possibly signed) integer number in base 10 -->\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/brokenModule1.pkl",
    "content": "// module with syntax error\n\nx = {}"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/brokenModule2.pkl",
    "content": "x: UnknownType"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/module/NamedModuleResolversTest.pkl",
    "content": "x = 1"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/module/testFactoryTest.pkl",
    "content": "name = \"Pigeon\"\nage = 40\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/badProjectChecksum/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n    checksums {\n      sha256 = \"intentionally bogus value\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/badProjectChecksum2/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"fruit\"] {\n    // should fail because the checksum is invalid\n    uri = \"package://localhost:0/fruit@1.0.5\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/badProjectChecksum2/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n      \"checksums\": {\n        \"sha256\": \"intentionally bogus checksum\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/badProjectChecksum2/bug.pkl",
    "content": "import \"@fruit/Fruit.pkl\"\n\nres = Fruit\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project1/PklProject",
    "content": "amends \"pkl:Project\"\n\nevaluatorSettings {\n  allowedResources {\n    \"foo:\"\n    \"bar:\"\n  }\n  allowedModules {\n    \"baz:\"\n    \"biz:\"\n  }\n  modulePath {\n    \"buzzy\"\n  }\n  externalProperties {\n    [\"one\"] = \"1\"\n  }\n  env {\n    [\"two\"] = \"2\"\n  }\n  moduleCacheDir = \"my-cache-dir/\"\n  color = \"always\"\n  noCache = false\n  rootDir = \"my-root-dir/\"\n  timeout = 5.min\n  externalModuleReaders {\n    [\"scheme1\"] {\n      executable = \"reader1\"\n    }\n    [\"scheme2\"] {\n      executable = \"reader2\"\n      arguments { \"with\"; \"args\" }\n    }\n  }\n  externalResourceReaders {\n    [\"scheme3\"] {\n      executable = \"reader3\"\n    }\n    [\"scheme4\"] {\n      executable = \"reader4\"\n      arguments { \"with\"; \"args\" }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project2/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"birds\"] {\n    uri = \"package://localhost:0/birds@0.5.0\"\n  }\n  [\"project3\"] = import(\"../project3/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project3/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"project3\"\n  baseUri = \"package://localhost:0/project3\"\n  version = \"1.5.0\"\n  // not actually used, just need to provide one so tests pass\n  packageZipUrl = \"https://bogus.value\"\n}\n\ndependencies {\n  [\"fruit\"] {\n    uri = \"package://localhost:0/fruit@1.1.0\"\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project4/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"project4\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://bogus.value\"\n  baseUri = \"package://localhost:0/project4\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project4/main.txt",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project4/module1.pkl",
    "content": "module module1\n\nres = 1\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project4/module2.pkl",
    "content": "module module2\n\nresult = read(\"../project4/module1.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project5/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"fruit\"] {\n    uri = \"package://localhost:0/fruit@1.0.5\"\n  }\n  [\"project4\"] = import(\"../project4/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project5/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/fruit@1\": {\n      \"type\": \"remote\",\n      \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n      \"checksums\": {\n        \"sha256\": \"$skipChecksumVerification\"\n      }\n    },\n    \"package://localhost:0/project4@1\": {\n      \"type\": \"local\",\n      \"uri\": \"projectpackage://localhost:0/project4@1.0.0\",\n      \"path\": \"../project4\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project5/main.pkl",
    "content": "import \"@fruit/catalog/apple.pkl\"\nimport \"@project4/module1.pkl\"\n\nprop1 = apple\nprop2 = module1\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project6/PklProject",
    "content": "amends \"pkl:Project\"\n\ndependencies {\n  [\"project7\"] = import(\"../project7/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project6/PklProject.deps.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"resolvedDependencies\": {\n    \"package://localhost:0/project7@1\": {\n      \"type\": \"local\",\n      \"uri\": \"projectpackage://localhost:0/project7@1.0.0\",\n      \"path\": \"../project7\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project6/globIntoDependency.pkl",
    "content": "import* \"@project7/*.pkl\" as proj7Files\n\nres = proj7Files\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project6/globWithinDependency.pkl",
    "content": "import \"@project7/main.pkl\"\n\nres = main.res\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project7/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"project7\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://bogus.value\"\n  baseUri = \"package://localhost:0/project7\"\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project7/main.pkl",
    "content": "res = import*(\"*.pkl\")\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project7/moduleA.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/project7/moduleB.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/projectCycle1/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"projectCycle1\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://bogus.value\"\n  baseUri = \"package://localhost:0/projectCycle1\"\n}\n\ndependencies {\n  [\"projectCycle2\"] = import(\"../projectCycle2/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/projectCycle2/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"projectCycle2\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://bogus.value\"\n  baseUri = \"package://localhost:0/projectCycle2\"\n}\n\ndependencies {\n  [\"projectCycle3\"] = import(\"../projectCycle3/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/projectCycle3/PklProject",
    "content": "amends \"pkl:Project\"\n\npackage {\n  name = \"projectCycle3\"\n  version = \"1.0.0\"\n  packageZipUrl = \"https://bogus.value\"\n  baseUri = \"package://localhost:0/projectCycle3\"\n}\n\ndependencies {\n  [\"projectCycle2\"] = import(\"../projectCycle2/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/project/projectCycle4/PklProject",
    "content": "amends \"pkl:Project\"\n\nimport \"PklProject\"\n\ndependencies {\n  [\"projectCycle1\"] = import(\"../projectCycle1/PklProject\")\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/propertiesRendererTest.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n  address: Address\n  friend: Person?\n}\n\nclass Address {\n  street: String\n}\n\nint = 123\n\nfloat = 1.23\n\nbool = true\n\nstring = \"Pigeon\"\n\nunicodeString = \"abc😀abc😎abc\"\n\nmultiLineString = \"\"\"\n  have a\n  great\n  day\n  \"\"\"\n\nmap = Map(\n  \"one\", int,\n  \"two\", float,\n  \"three\", bool,\n  \"four\", string,\n  \"five\", unicodeString,\n  \"six\", multiLineString,\n  \"seven\", new Dynamic { name = \"Pigeon\" },\n  \"eight\", null\n)\n\nmapping = new Mapping {\n  [\"one\"] = int\n  [\"two\"] = float\n  [\"three\"] = bool\n  [\"four\"] = string\n  [\"five\"] = unicodeString\n  [\"six\"] = multiLineString\n  [\"seven\"] = new { name = \"Pigeon\" }\n  [\"eight\"] = null\n}\n\ntypedObject = new Person {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  friend = null\n}\n\ncontainer {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  friend = null\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/propertiesRendererTest.properties",
    "content": "int = 123\nfloat = 1.23\nbool = true\nstring = Pigeon\nunicodeString = abc😀abc😎abc\nmultiLineString = have a\\ngreat\\nday\nmap.one = 123\nmap.two = 1.23\nmap.three = true\nmap.four = Pigeon\nmap.five = abc😀abc😎abc\nmap.six = have a\\ngreat\\nday\nmap.seven.name = Pigeon\nmapping.one = 123\nmapping.two = 1.23\nmapping.three = true\nmapping.four = Pigeon\nmapping.five = abc😀abc😎abc\nmapping.six = have a\\ngreat\\nday\nmapping.seven.name = Pigeon\ntypedObject.name = Pigeon\ntypedObject.age = 30\ntypedObject.address.street = Folsom St.\ncontainer.name = Pigeon\ncontainer.age = 30\ncontainer.address.street = Folsom St.\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/rendererTest.json",
    "content": "{\n  \"int\": 123,\n  \"float\": 1.23,\n  \"bool\": true,\n  \"string\": \"Pigeon\",\n  \"unicodeString\": \"abc😀abc😎abc\",\n  \"multiLineString\": \"have a\\ngreat\\nday\",\n  \"list\": [\n    123,\n    1.23,\n    true,\n    \"Pigeon\",\n    \"abc😀abc😎abc\",\n    \"have a\\ngreat\\nday\",\n    [\n      1,\n      2,\n      3\n    ],\n    [\n      1,\n      2,\n      3\n    ],\n    {\n      \"one\": 1\n    },\n    {\n      \"name\": \"Pigeon\"\n    }\n  ],\n  \"set\": [\n    123,\n    1.23,\n    true,\n    \"Pigeon\",\n    \"abc😀abc😎abc\",\n    \"have a\\ngreat\\nday\",\n    [\n      1,\n      2,\n      3\n    ],\n    [\n      1,\n      2,\n      3\n    ],\n    {\n      \"one\": 1\n    },\n    {\n      \"name\": \"Pigeon\"\n    }\n  ],\n  \"map\": {\n    \"one\": 123,\n    \"two\": 1.23,\n    \"three\": true,\n    \"four\": \"Pigeon\",\n    \"five\": \"abc😀abc😎abc\",\n    \"six\": \"have a\\ngreat\\nday\",\n    \"seven\": [\n      1,\n      2,\n      3\n    ],\n    \"eight\": [\n      1,\n      2,\n      3\n    ],\n    \"nine\": {\n      \"one\": 1\n    },\n    \"ten\": {\n      \"name\": \"Pigeon\"\n    }\n  },\n  \"typedObject\": {\n    \"name\": \"Pigeon\",\n    \"age\": 30,\n    \"address\": {\n      \"street\": \"Folsom St.\"\n    },\n    \"hobbies\": [\n      \"swimming\",\n      \"gardening\",\n      \"reading\"\n    ]\n  },\n  \"container\": {\n    \"name\": \"Pigeon\",\n    \"age\": 30,\n    \"address\": {\n      \"street\": \"Folsom St.\",\n      \"hobbies\": [\n        \"swimming\",\n        \"gardening\",\n        \"reading\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/rendererTest.pcf",
    "content": "int = 123\nfloat = 1.23\nbool = true\nstring = \"Pigeon\"\nunicodeString = \"abc😀abc😎abc\"\nmultiLineString = \"\"\"\n  have a\n  great\n  day\n  \"\"\"\nlist = List(123, 1.23, true, \"Pigeon\", \"abc😀abc😎abc\", \"\"\"\n  have a\n  great\n  day\n  \"\"\", List(1, 2, 3), Set(1, 2, 3), Map(\"one\", 1), new {\n  name = \"Pigeon\"\n})\nset = Set(123, 1.23, true, \"Pigeon\", \"abc😀abc😎abc\", \"\"\"\n  have a\n  great\n  day\n  \"\"\", List(1, 2, 3), Set(1, 2, 3), Map(\"one\", 1), new {\n  name = \"Pigeon\"\n})\nmap = Map(\"one\", 123, \"two\", 1.23, \"three\", true, \"four\", \"Pigeon\", \"five\", \"abc😀abc😎abc\", \"six\", \"\"\"\n  have a\n  great\n  day\n  \"\"\", \"seven\", List(1, 2, 3), \"eight\", Set(1, 2, 3), \"nine\", Map(\"one\", 1), \"ten\", new {\n  name = \"Pigeon\"\n}, \"eleven\", null)\ntypedObject {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  hobbies = List(\"swimming\", \"gardening\", \"reading\")\n  friend = null\n}\ncontainer {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n    hobbies = List(\"swimming\", \"gardening\", \"reading\")\n  }\n  friend = null\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/rendererTest.pkl",
    "content": "class Person {\n  name: String\n  age: Int\n  address: Address\n  hobbies: List<String>\n  friend: Person?\n}\n\nclass Address {\n  street: String\n}\n\nint = 123\n\nfloat = 1.23\n\nbool = true\n\nstring = \"Pigeon\"\n\nunicodeString = \"abc😀abc😎abc\"\n\nmultiLineString = \"\"\"\n  have a\n  great\n  day\n  \"\"\"\n\nlist = List(\n  123,\n  1.23,\n  bool,\n  string,\n  unicodeString,\n  multiLineString,\n  List(1, 2, 3),\n  Set(1, 2, 3),\n  Map(\"one\", 1),\n  new Dynamic { name = \"Pigeon\" }\n)\n\nset = Set(\n  int,\n  float,\n  bool,\n  string,\n  unicodeString,\n  multiLineString,\n  List(1, 2, 3),\n  Set(1, 2, 3),\n  Map(\"one\", 1),\n  new Dynamic { name = \"Pigeon\" }\n)\n\nmap = Map(\n  \"one\", int,\n  \"two\", float,\n  \"three\", bool,\n  \"four\", string,\n  \"five\", unicodeString,\n  \"six\", multiLineString,\n  \"seven\", List(1, 2, 3),\n  \"eight\", Set(1, 2, 3),\n  \"nine\", Map(\"one\", 1),\n  \"ten\", new Dynamic { name = \"Pigeon\" },\n  \"eleven\", null\n)\n\ntypedObject = new Person {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n  }\n  hobbies = List(\n    \"swimming\",\n    \"gardening\",\n    \"reading\"\n  )\n  friend = null\n}\n\ncontainer {\n  name = \"Pigeon\"\n  age = 30\n  address {\n    street = \"Folsom St.\"\n    hobbies = List(\n      \"swimming\",\n      \"gardening\",\n      \"reading\"\n    )\n  }\n  friend = null\n}\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/rendererTest.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>int</key>\n  <integer>123</integer>\n  <key>float</key>\n  <real>1.23</real>\n  <key>bool</key>\n  <true/>\n  <key>string</key>\n  <string>Pigeon</string>\n  <key>unicodeString</key>\n  <string>abc😀abc😎abc</string>\n  <key>multiLineString</key>\n  <string>have a\ngreat\nday</string>\n  <key>list</key>\n  <array>\n    <integer>123</integer>\n    <real>1.23</real>\n    <true/>\n    <string>Pigeon</string>\n    <string>abc😀abc😎abc</string>\n    <string>have a\ngreat\nday</string>\n    <array>\n      <integer>1</integer>\n      <integer>2</integer>\n      <integer>3</integer>\n    </array>\n    <array>\n      <integer>1</integer>\n      <integer>2</integer>\n      <integer>3</integer>\n    </array>\n    <dict>\n      <key>one</key>\n      <integer>1</integer>\n    </dict>\n    <dict>\n      <key>name</key>\n      <string>Pigeon</string>\n    </dict>\n  </array>\n  <key>set</key>\n  <array>\n    <integer>123</integer>\n    <real>1.23</real>\n    <true/>\n    <string>Pigeon</string>\n    <string>abc😀abc😎abc</string>\n    <string>have a\ngreat\nday</string>\n    <array>\n      <integer>1</integer>\n      <integer>2</integer>\n      <integer>3</integer>\n    </array>\n    <array>\n      <integer>1</integer>\n      <integer>2</integer>\n      <integer>3</integer>\n    </array>\n    <dict>\n      <key>one</key>\n      <integer>1</integer>\n    </dict>\n    <dict>\n      <key>name</key>\n      <string>Pigeon</string>\n    </dict>\n  </array>\n  <key>map</key>\n  <dict>\n    <key>one</key>\n    <integer>123</integer>\n    <key>two</key>\n    <real>1.23</real>\n    <key>three</key>\n    <true/>\n    <key>four</key>\n    <string>Pigeon</string>\n    <key>five</key>\n    <string>abc😀abc😎abc</string>\n    <key>six</key>\n    <string>have a\ngreat\nday</string>\n    <key>seven</key>\n    <array>\n      <integer>1</integer>\n      <integer>2</integer>\n      <integer>3</integer>\n    </array>\n    <key>eight</key>\n    <array>\n      <integer>1</integer>\n      <integer>2</integer>\n      <integer>3</integer>\n    </array>\n    <key>nine</key>\n    <dict>\n      <key>one</key>\n      <integer>1</integer>\n    </dict>\n    <key>ten</key>\n    <dict>\n      <key>name</key>\n      <string>Pigeon</string>\n    </dict>\n  </dict>\n  <key>typedObject</key>\n  <dict>\n    <key>name</key>\n    <string>Pigeon</string>\n    <key>age</key>\n    <integer>30</integer>\n    <key>address</key>\n    <dict>\n      <key>street</key>\n      <string>Folsom St.</string>\n    </dict>\n    <key>hobbies</key>\n    <array>\n      <string>swimming</string>\n      <string>gardening</string>\n      <string>reading</string>\n    </array>\n  </dict>\n  <key>container</key>\n  <dict>\n    <key>name</key>\n    <string>Pigeon</string>\n    <key>age</key>\n    <integer>30</integer>\n    <key>address</key>\n    <dict>\n      <key>street</key>\n      <string>Folsom St.</string>\n      <key>hobbies</key>\n      <array>\n        <string>swimming</string>\n        <string>gardening</string>\n        <string>reading</string>\n      </array>\n    </dict>\n  </dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/rendererTest.yaml",
    "content": "int: 123\nfloat: 1.23\nbool: true\nstring: Pigeon\nunicodeString: abc😀abc😎abc\nmultiLineString: |-\n  have a\n  great\n  day\nlist:\n- 123\n- 1.23\n- true\n- Pigeon\n- abc😀abc😎abc\n- |-\n  have a\n  great\n  day\n- - 1\n  - 2\n  - 3\n- - 1\n  - 2\n  - 3\n- one: 1\n- name: Pigeon\nset:\n- 123\n- 1.23\n- true\n- Pigeon\n- abc😀abc😎abc\n- |-\n  have a\n  great\n  day\n- - 1\n  - 2\n  - 3\n- - 1\n  - 2\n  - 3\n- one: 1\n- name: Pigeon\nmap:\n  one: 123\n  two: 1.23\n  three: true\n  four: Pigeon\n  five: abc😀abc😎abc\n  six: |-\n    have a\n    great\n    day\n  seven:\n  - 1\n  - 2\n  - 3\n  eight:\n  - 1\n  - 2\n  - 3\n  nine:\n    one: 1\n  ten:\n    name: Pigeon\ntypedObject:\n  name: Pigeon\n  age: 30\n  address:\n    street: Folsom St.\n  hobbies:\n  - swimming\n  - gardening\n  - reading\ncontainer:\n  name: Pigeon\n  age: 30\n  address:\n    street: Folsom St.\n    hobbies:\n    - swimming\n    - gardening\n    - reading\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/resource/resource.txt",
    "content": "content"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/snippets/imported.pkl",
    "content": "foo = bar * 2\nbar = 3\n"
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/snippets/name with [wierd]! chars~~.pkl",
    "content": ""
  },
  {
    "path": "pkl-core/src/test/resources/org/pkl/core/stdlib/protobufRendererTest.textproto",
    "content": "start_timestamp_ms: 0\nend_timestamp_ms: 100\npeople: {\n  key: \"Pigeon\"\n  value: {\n    name: \"Pigeon\"\n    profile: {\n      isExtinct: false\n    }\n    fictional: true\n    height: 1.77\n    hobbies: \"cooing\"\n    role: Lead\n  }\n}\npeople: {\n  key: \"Parrot\"\n  value: {\n    name: \"Parrot\"\n    fictional: true\n    height: 1.76\n    hobbies: \"singing\"\n    role: Lead\n  }\n}\nowner: \"Pigeon\"\n"
  },
  {
    "path": "pkl-doc/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.36.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.guava:failureaccess:1.0.3=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.guava:guava:33.4.8-jre=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.j2objc:j2objc-annotations:3.0.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.google.jimfs:jimfs:1.3.1=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\ncom.ibm.icu:icu4j:58.2=validator\ncom.shapesecurity:salvation:2.7.2=validator\ncommons-codec:commons-codec:1.10=validator\ncommons-io:commons-io:2.4=validator\ncommons-logging:commons-logging:1.2=validator\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nisorelax:isorelax:20030108=validator\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=runtimeClasspath,testRuntimeClasspath\nnet.sf.saxon:Saxon-HE:9.6.0-4=validator\nnu.validator:cssvalidator:1.0.8=validator\nnu.validator:galimatias:0.1.3=validator\nnu.validator:htmlparser:1.4.16=validator\nnu.validator:jing:20200702VNU=validator\nnu.validator:langdetect:1.2=validator\nnu.validator:validator:20.7.2=validator\norg.apache.httpcomponents:httpclient:4.4=validator\norg.apache.httpcomponents:httpcore:4.4=validator\norg.apache.logging.log4j:log4j-1.2-api:2.17.1=validator\norg.apache.logging.log4j:log4j-api:2.17.1=validator\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.commonmark:commonmark-ext-gfm-tables:0.26.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.commonmark:commonmark:0.26.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.eclipse.jetty:jetty-util-ajax:9.4.18.v20190429=validator\norg.eclipse.jetty:jetty-util:9.4.18.v20190429=validator\norg.graalvm.js:js-language:25.0.0=testRuntimeClasspath\norg.graalvm.js:js:25.0.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.polyglot:polyglot:25.0.0=nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.regex:regex:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:jniutils:25.0.0=nativeImageClasspath,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.shadowed:icu4j:25.0.0=testRuntimeClasspath\norg.graalvm.shadowed:xz:25.0.0=testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-compiler:25.0.0=nativeImageClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-runtime:25.0.0=nativeImageClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-serialization-compiler-plugin-embeddable:2.2.20=kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,nativeImageClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:atomicfu:0.23.1=implementationDependenciesMetadata,testImplementationDependenciesMetadata\norg.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-html-jvm:0.11.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0=compileClasspath,implementationDependenciesMetadata,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains:annotations:23.0.0=compileClasspath,nativeImageClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown:0.7.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.jspecify:jspecify:1.0.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=nativeImageClasspath,runtimeClasspath,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,shadow,signatures,sourcesJar,stagedAlpineLinuxAmd64Executable,stagedLinuxAarch64Executable,stagedLinuxAmd64Executable,stagedMacAarch64Executable,stagedMacAmd64Executable,stagedWindowsAmd64Executable,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-doc/pkl-doc.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklJavaExecutable\n  pklNativeExecutable\n  pklHtmlValidator\n  alias(libs.plugins.kotlinxSerialization)\n}\n\nexecutable {\n  mainClass = \"org.pkl.doc.Main\"\n  name = \"pkldoc\"\n  javaName = \"jpkldoc\"\n  documentationName = \"Pkldoc CLI\"\n  publicationName = \"pkldoc\"\n  javaPublicationName = \"jpkldoc\"\n  website = \"https://pkl-lang.org/main/current/pkl-doc/index.html\"\n}\n\ndependencies {\n  implementation(projects.pklCore)\n  implementation(projects.pklCommonsCli)\n  implementation(projects.pklCommons)\n  implementation(projects.pklParser)\n  implementation(libs.commonMark)\n  implementation(libs.commonMarkTables)\n  implementation(libs.kotlinxHtml)\n  implementation(libs.kotlinxSerializationJson) {\n    // use our own Kotlin version\n    // (exclude is supported both for Maven and Gradle metadata, whereas dependency constraints\n    // aren't)\n    exclude(group = \"org.jetbrains.kotlin\")\n  }\n  implementation(libs.kotlinxCoroutinesCore) { exclude(group = \"org.jetbrains.kotlin\") }\n\n  testImplementation(projects.pklCommonsTest)\n  testImplementation(libs.jimfs)\n\n  // Graal.JS\n  testImplementation(libs.graalSdk)\n  testImplementation(libs.graalJs)\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-doc\")\n        description.set(\"Documentation generator for Pkl modules.\")\n      }\n    }\n  }\n}\n\nval testNativeExecutable by\n  tasks.registering(Test::class) {\n    dependsOn(tasks.assembleNative)\n    testClassesDirs = sourceSets.test.get().output.classesDirs\n    classpath = sourceSets.test.get().runtimeClasspath\n\n    inputs.dir(\"src/test/files/DocGeneratorTest/input\")\n    outputs.dir(\"src/test/files/DocGeneratorTest/output\")\n    systemProperty(\"org.pkl.doc.NativeExecutableTest\", \"true\")\n\n    filter { includeTestsMatching(\"org.pkl.doc.NativeExecutableTest\") }\n  }\n\nval testJavaExecutable by\n  tasks.registering(Test::class) {\n    testClassesDirs = sourceSets.test.get().output.classesDirs\n    classpath = sourceSets.test.get().runtimeClasspath\n\n    dependsOn(tasks.javaExecutable)\n    inputs.dir(\"src/test/files/DocGeneratorTest/input\")\n    outputs.dir(\"src/test/files/DocGeneratorTest/output\")\n    systemProperty(\"org.pkl.doc.JavaExecutableTest\", \"true\")\n\n    filter { includeTestsMatching(\"org.pkl.doc.JavaExecutableTest\") }\n  }\n\ntasks.check { dependsOn(testJavaExecutable) }\n\ntasks.testNative { dependsOn(testNativeExecutable) }\n\ntasks.withType<NativeImageBuild> { extraNativeImageArgs.add(\"-H:IncludeResources=org/pkl/doc/.*\") }\n\ntasks.jar { manifest { attributes += mapOf(\"Main-Class\" to \"org.pkl.doc.Main\") } }\n\nhtmlValidator { sources = files(\"src/test/files/DocGeneratorTest/output\") }\n\ntasks.validateHtml { mustRunAfter(testJavaExecutable) }\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/AbstractGenerator.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\n\nabstract class AbstractGenerator(protected val consoleOut: OutputStream) {\n  protected fun writeOutputLine(message: String) {\n    consoleOut.writeLine(message)\n  }\n\n  protected fun writeOutput(message: String) {\n    consoleOut.write(message)\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/ClassPageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlinx.html.*\nimport org.pkl.core.PClass\n\ninternal class ClassPageGenerator(\n  docsiteInfo: DocsiteInfo,\n  docPackage: DocPackage,\n  docModule: DocModule,\n  clazz: PClass,\n  pageScope: ClassScope,\n  isTestMode: Boolean,\n  consoleOut: OutputStream,\n) : ModuleOrClassPageGenerator<ClassScope>(docsiteInfo, clazz, pageScope, isTestMode, consoleOut) {\n  override val html: HTML.() -> Unit = {\n    renderHtmlHead()\n\n    body {\n      onLoad = \"onLoad()\"\n\n      renderPageHeader(docPackage.name, docPackage.version, clazz.moduleName, clazz.simpleName)\n\n      main {\n        renderParentLinks()\n\n        renderAnchors(clazz)\n\n        h1 {\n          id = \"declaration-title\"\n          +clazz.simpleName.asIdentifier\n\n          span {\n            id = \"declaration-version\"\n            +docPackage.version\n          }\n        }\n\n        val memberDocs =\n          MemberDocs(\n            clazz.docComment,\n            pageScope,\n            clazz.annotations,\n            isDeclaration = true,\n            mapOf(\n              MemberInfoKey(\"Known subtypes in package\", runtimeDataClasses) to\n                {\n                  id = HtmlConstants.KNOWN_SUBTYPES\n                  classes = runtimeDataClasses\n                },\n              MemberInfoKey(\"Known usages in package\", runtimeDataClasses) to\n                {\n                  id = HtmlConstants.KNOWN_USAGES\n                  classes = runtimeDataClasses\n                },\n              MemberInfoKey(\"All versions\", runtimeDataClasses) to\n                {\n                  id = HtmlConstants.KNOWN_VERSIONS\n                  classes = runtimeDataClasses\n                },\n            ),\n          )\n\n        renderMemberGroupLinks(\n          Triple(\"Overview\", \"#_overview\", memberDocs.isExpandable),\n          Triple(\"Properties\", \"#_properties\", clazz.hasListedProperty),\n          Triple(\"Methods\", \"#_methods\", clazz.hasListedMethod),\n        )\n\n        renderAnchor(\"_overview\")\n        div {\n          id = \"_declaration\"\n          classes = setOf(\"member\")\n\n          memberDocs.renderExpandIcon(this)\n\n          div {\n            classes =\n              if (memberDocs.isDeprecatedMember) {\n                setOf(\"member-signature\", \"member-deprecated\")\n              } else setOf(\"member-signature\")\n\n            renderModifiers(clazz.modifiers, \"class\")\n\n            span {\n              classes = setOf(\"name-decl\")\n\n              +clazz.simpleName.asIdentifier\n            }\n\n            renderTypeParameters(clazz.typeParameters)\n\n            renderClassExtendsClause(clazz, pageScope)\n          }\n\n          memberDocs.renderDocComment(this)\n        }\n\n        renderProperties()\n        renderMethods()\n      }\n    }\n  }\n\n  // example output:\n  // HostAlias (pkg.pkl-lang.org/pkl-k8s/k8s@1.0.0) • Package Docs\n  override fun HTMLTag.renderPageTitle() {\n    val classScope = pageScope\n    val moduleScope = classScope.parent!!\n    val packageScope = moduleScope.parent!!\n\n    +classScope.clazz.simpleName\n    +\" (\"\n    +packageScope.name\n    +moduleScope.name.drop(packageScope.name.length).replace('.', '/')\n    +\":\"\n    +packageScope.version\n    +\") • \"\n    +(docsiteInfo.title ?: \"Pkldoc\")\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/CliDocGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.nio.file.Path\nimport kotlin.Pair\nimport org.pkl.commons.cli.CliBaseOptions.Companion.getProjectFile\nimport org.pkl.commons.cli.CliBugException\nimport org.pkl.commons.cli.CliCommand\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.toPath\nimport org.pkl.core.*\nimport org.pkl.core.packages.*\n\n/**\n * Entry point for the high-level Pkldoc API.\n *\n * The high-level API offers the same configuration options as the Pkldoc CLI.\n *\n * For the low-level Pkldoc API, see [DocGenerator].\n */\nclass CliDocGenerator(\n  private val options: CliDocGeneratorOptions,\n  private val consoleOut: OutputStream = System.out,\n) : CliCommand(options.base) {\n  constructor(options: CliDocGeneratorOptions) : this(options, System.out)\n\n  private val packageResolver =\n    PackageResolver.getInstance(securityManager, httpClient, moduleCacheDir)\n\n  private val stdlibDependency =\n    DocPackageInfo.PackageDependency(\n      name = \"pkl\",\n      uri = null,\n      version = if (options.isTestMode) \"0.24.0\" else Release.current().version().toString(),\n      sourceCode =\n        if (options.isTestMode) URI(\"https://github.com/apple/pkl/blob/dev/stdlib/\")\n        else URI(Release.current().sourceCode().homepage()),\n      sourceCodeUrlScheme =\n        if (options.isTestMode)\n          \"https://github.com/apple/pkl/blob/0.24.0/stdlib%{path}#L%{line}-L%{endLine}\"\n        else Release.current().sourceCode().sourceCodeUrlScheme(),\n      documentation =\n        if (options.isTestMode) URI(\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/\")\n        else\n          URI(\n            PklInfo.current()\n              .packageIndex\n              .getPackagePage(\"pkl\", Release.current().version().toString())\n          ),\n    )\n\n  private val versions = mutableMapOf<String, Version>()\n\n  private val versionComparator =\n    Comparator<String> { v1, v2 ->\n      versions\n        .getOrPut(v1) { Version.parse(v1) }\n        .compareTo(versions.getOrPut(v2) { Version.parse(v2) })\n    }\n\n  private val docMigrator = DocMigrator(options.outputDir, System.out, versionComparator)\n\n  private fun DependencyMetadata.getPackageDependencies(): List<DocPackageInfo.PackageDependency> {\n    return buildList {\n      for ((_, dependency) in dependencies) {\n        val metadata =\n          try {\n            packageResolver.getDependencyMetadata(dependency.packageUri, dependency.checksums)\n          } catch (e: Exception) {\n            throw CliException(\n              \"Failed to fetch dependency metadata for ${dependency.packageUri}: ${e.message}\"\n            )\n          }\n        val packageDependency =\n          DocPackageInfo.PackageDependency(\n            name = metadata.name,\n            uri = dependency.packageUri.uri,\n            version = metadata.version.toString(),\n            sourceCode = metadata.sourceCode,\n            sourceCodeUrlScheme = metadata.sourceCodeUrlScheme,\n            documentation = metadata.documentation,\n          )\n        add(packageDependency)\n      }\n      add(stdlibDependency)\n    }\n  }\n\n  private fun PackageUri.toDocPackageInfo(): DocPackageInfo {\n    val (metadata, checksum) =\n      try {\n        packageResolver.getDependencyMetadataAndComputeChecksum(this)\n      } catch (e: PackageLoadError) {\n        throw CliException(\"Failed to package metadata for $this: ${e.message}\")\n      }\n    return DocPackageInfo(\n      name = \"${uri.authority}${uri.path.substringBeforeLast('@')}\",\n      moduleNamePrefix = \"${metadata.name}.\",\n      version = metadata.version.toString(),\n      importUri = toPackageAssetUri(\"/\").toString(),\n      uri = uri,\n      authors = metadata.authors,\n      issueTracker = metadata.issueTracker,\n      dependencies = metadata.getPackageDependencies(),\n      overview = metadata.description,\n      extraAttributes = mapOf(\"Checksum\" to checksum.sha256),\n      sourceCode = metadata.sourceCode,\n      sourceCodeUrlScheme = metadata.sourceCodeUrlScheme,\n      annotations = metadata.annotations,\n    )\n  }\n\n  private fun PackageUri.gatherAllModules(): List<PackageAssetUri> {\n    fun PackageAssetUri.gatherModulesRecursively(): List<PackageAssetUri> {\n      val self = this\n      return buildList {\n        for (element in packageResolver.listElements(self, null)) {\n          val elementAssetUri = self.resolve(element.name)\n          if (element.isDirectory) {\n            addAll(elementAssetUri.gatherModulesRecursively())\n          } else if (element.name.endsWith(\".pkl\")) {\n            add(elementAssetUri)\n          }\n        }\n      }\n    }\n    return toPackageAssetUri(\"/\").gatherModulesRecursively()\n  }\n\n  override fun doRun() {\n    if (options.migrate) {\n      docMigrator.run()\n      return\n    }\n    if (!docMigrator.isUpToDate) {\n      throw CliException(\n        \"pkldoc website model is too old (found: ${docMigrator.docsiteVersion}, required: ${DocMigrator.CURRENT_VERSION}). Run `pkldoc --migrate` to migrate the website.\"\n      )\n    }\n    val docsiteInfoModuleUris = mutableListOf<URI>()\n    val packageInfoModuleUris = mutableListOf<URI>()\n    val regularModuleUris = mutableListOf<URI>()\n    val pklProjectPaths = mutableSetOf<Path>()\n    val packageUris = mutableListOf<PackageUri>()\n    for (moduleUri in resolvedSourceModules) {\n      if (moduleUri.scheme == \"file\") {\n        val dir = moduleUri.toPath().parent\n        val projectFile = dir.getProjectFile(options.base.normalizedRootDir)\n        if (projectFile != null) {\n          pklProjectPaths.add(projectFile)\n        }\n      }\n      when {\n        moduleUri.path?.endsWith(\"/docsite-info.pkl\", ignoreCase = true) ?: false ->\n          docsiteInfoModuleUris.add(moduleUri)\n        moduleUri.path?.endsWith(\"/doc-package-info.pkl\", ignoreCase = true) ?: false ->\n          packageInfoModuleUris.add(moduleUri)\n        moduleUri.scheme == \"package\" -> {\n          if (moduleUri.fragment != null) {\n            throw CliException(\"Cannot generate documentation for just one module within a package\")\n          }\n          try {\n            packageUris.add(PackageUri(moduleUri))\n          } catch (e: URISyntaxException) {\n            throw CliException(e.message!!)\n          }\n        }\n        else -> regularModuleUris.add(moduleUri)\n      }\n    }\n\n    if (docsiteInfoModuleUris.size > 1) {\n      throw CliException(\n        \"`sourceModules` contains multiple modules named `docsite-info.pkl`:\\n\" +\n          docsiteInfoModuleUris.joinToString(\"\\n\")\n      )\n    }\n\n    if (packageInfoModuleUris.isEmpty() && packageUris.isEmpty()) {\n      throw CliException(\n        \"`sourceModules` must contain at least one module named `doc-package-info.pkl`, or an argument must be a package URI.\"\n      )\n    }\n\n    if (regularModuleUris.isEmpty() && packageUris.isEmpty()) {\n      throw CliException(\n        \"`sourceModules` must contain at least one module to generate documentation for.\"\n      )\n    }\n\n    val builder = evaluatorBuilder()\n    var docsiteInfo: DocsiteInfo\n    val schemasByDocPackageInfoAndPath =\n      mutableMapOf<Pair<DocPackageInfo, Path>, MutableSet<ModuleSchema>>()\n    val schemasByDocPackageInfo = mutableMapOf<DocPackageInfo, Set<ModuleSchema>>()\n    // Evaluate module imports eagerly, which is cheap if docs are also generated for most imported\n    // modules.\n    // Alternatively, imports could be evaluated lazily,\n    // at the expense of interleaving schema/module evaluation and Pkldoc generation.\n    val importedModules: MutableMap<URI, ModuleSchema> = mutableMapOf()\n\n    try {\n      fun Evaluator.collectImportedModules(imports: Map<String, URI>) {\n        for ((_, uri) in imports) {\n          importedModules.computeIfAbsent(uri) { evaluateSchema(ModuleSource.uri(uri)) }\n        }\n      }\n\n      builder.build().use { evaluator ->\n        for (packageUri in packageUris) {\n          val docPackageInfo = packageUri.toDocPackageInfo()\n          val pklModules = packageUri.gatherAllModules()\n          val pklModuleSchemas =\n            pklModules\n              .map { evaluator.evaluateSchema(ModuleSource.uri(it.uri)) }\n              .filter { !it.isAmend }\n              .onEach { evaluator.collectImportedModules(it.imports) }\n              .toSet()\n\n          schemasByDocPackageInfo[docPackageInfo] = pklModuleSchemas\n        }\n\n        docsiteInfo =\n          when {\n            docsiteInfoModuleUris.isEmpty() -> DocsiteInfo(null, null, mapOf())\n            else -> {\n              val module = evaluator.evaluate(ModuleSource.uri(docsiteInfoModuleUris.single()))\n              DocsiteInfo.fromPkl(module).apply {\n                evaluator.collectImportedModules(overviewImports)\n              }\n            }\n          }\n\n        for (uri in packageInfoModuleUris) {\n          val module = evaluator.evaluate(ModuleSource.uri(uri))\n          val docPackageInfo =\n            DocPackageInfo.fromPkl(module).apply {\n              evaluator.collectImportedModules(overviewImports)\n            }\n          schemasByDocPackageInfoAndPath[docPackageInfo to uri.toPath().parent] = mutableSetOf()\n        }\n\n        for (uri in regularModuleUris) {\n          val entry =\n            schemasByDocPackageInfoAndPath.keys.find { uri.toPath().startsWith(it.second) }\n              ?: throw CliException(\"Could not find a doc-package-info.pkl for module $uri\")\n          val schema =\n            evaluator.evaluateSchema(ModuleSource.uri(uri)).apply {\n              evaluator.collectImportedModules(imports)\n            }\n          schemasByDocPackageInfoAndPath[entry]!!.add(schema)\n        }\n\n        // doc generator resolves `pkl.base` even if not imported explicitly\n        val pklBaseUri = URI(\"pkl:base\")\n        importedModules[pklBaseUri] = evaluator.evaluateSchema(ModuleSource.uri(pklBaseUri))\n      }\n    } finally {\n      Closeables.closeQuietly(builder.moduleKeyFactories)\n      Closeables.closeQuietly(builder.resourceReaders)\n    }\n\n    val versions = mutableMapOf<String, Version>()\n    val versionComparator =\n      Comparator<String> { v1, v2 ->\n        versions\n          .getOrPut(v1) { Version.parse(v1) }\n          .compareTo(versions.getOrPut(v2) { Version.parse(v2) })\n      }\n    schemasByDocPackageInfo.putAll(schemasByDocPackageInfoAndPath.mapKeys { it.key.first })\n\n    try {\n      DocGenerator(\n          docsiteInfo,\n          schemasByDocPackageInfo,\n          importedModules::getValue,\n          versionComparator,\n          options.normalizedOutputDir,\n          options.isTestMode,\n          options.noSymlinks,\n          consoleOut,\n          docMigrator,\n        )\n        .run()\n    } catch (e: DocGeneratorBugException) {\n      throw CliBugException(e)\n    } catch (e: DocGeneratorException) {\n      throw CliException(e.message!!)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/CliDocGeneratorOptions.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.nio.file.Path\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.resolveSafely\n\n/** Configuration options for [CliDocGenerator]. */\ndata class CliDocGeneratorOptions\n@JvmOverloads\nconstructor(\n  /** Base options shared between CLI commands. */\n  val base: CliBaseOptions,\n\n  /** The directory where generated documentation is placed. */\n  val outputDir: Path,\n\n  /**\n   * Internal option only used for testing.\n   *\n   * Generates source URLs with fixed line numbers `#L123-L456` to avoid churn in expected output\n   * files (e.g., when stdlib line numbers change).\n   */\n  val isTestMode: Boolean = false,\n\n  /**\n   * Disables creation of symlinks, replacing them with regular files and directories.\n   *\n   * In particular, this affects creation of the \"current\" directory which contains documentation\n   * for the latest version of the package.\n   *\n   * `false` will make the current directory into a symlink to the actual version directory. `true`,\n   * however, will create a full copy instead.\n   */\n  val noSymlinks: Boolean = false,\n\n  /** Migrate existing pkldoc */\n  val migrate: Boolean = false,\n) {\n  /** [outputDir] after undergoing normalization. */\n  val normalizedOutputDir: Path = base.normalizedWorkingDir.resolveSafely(outputDir)\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/Constants.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\ninternal object HtmlConstants {\n  /** The `known-versions` element ID. */\n  const val KNOWN_VERSIONS: String = \"known-versions\"\n\n  /** The `known-subtypes` element ID. */\n  const val KNOWN_SUBTYPES: String = \"known-subtypes\"\n\n  /** The `known-usages` element ID. */\n  const val KNOWN_USAGES: String = \"known-usages\"\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/DocGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.IOException\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.util.concurrent.Executor\nimport java.util.concurrent.Executors\nimport kotlin.io.path.*\nimport kotlinx.coroutines.*\nimport org.pkl.commons.copyRecursively\nimport org.pkl.core.ModuleSchema\nimport org.pkl.core.PClassInfo\nimport org.pkl.core.Version\nimport org.pkl.core.util.IoUtils\n\n/**\n * Entry point for the low-level Pkldoc API.\n *\n * For the high-level Pkldoc API, see [CliDocGenerator].\n */\n@OptIn(ExperimentalPathApi::class)\nclass DocGenerator(\n  /**\n   * The documentation website to generate.\n   *\n   * API equivalent of `pkl:DocsiteInfo`.\n   */\n  private val docsiteInfo: DocsiteInfo,\n\n  /** The packages to generate documentation for. */\n  packages: Map<DocPackageInfo, Collection<ModuleSchema>>,\n\n  /**\n   * A function to resolve imports in [packages] and [docsiteInfo].\n   *\n   * Module `pkl.base` is resolved with this function even if not explicitly imported.\n   */\n  private val importResolver: (URI) -> ModuleSchema,\n\n  /** A comparator for package versions. */\n  versionComparator: Comparator<String>,\n\n  /** The directory where generated documentation is placed. */\n  private val outputDir: Path,\n\n  /**\n   * Internal option used only for testing.\n   *\n   * Generates source URLs with fixed line numbers `#L123-L456` to avoid churn in expected output\n   * files (e.g., when stdlib line numbers change).\n   */\n  private val isTestMode: Boolean = false,\n\n  /**\n   * Disables creation of symbolic links, using copies of files and directories instead of them.\n   *\n   * In particular, determines how to create the \"current\" directory which contains documentation\n   * for the latest version of the package.\n   *\n   * `false` will make the current directory into a symlink to the actual version directory. `true`,\n   * however, will create a full copy instead.\n   */\n  private val noSymlinks: Boolean = false,\n\n  /** The output stream to write logs to. */\n  consoleOut: OutputStream,\n\n  /**\n   * The doc migrator that is used to determine the latest docsite version, as well as update the\n   * version file.\n   */\n  private val docMigrator: DocMigrator = DocMigrator(outputDir, consoleOut, versionComparator),\n) : AbstractGenerator(consoleOut) {\n  companion object {\n    const val CURRENT_DIRECTORY_NAME = \"current\"\n\n    internal fun determineCurrentPackages(\n      packages: List<PackageData>,\n      descendingVersionComparator: Comparator<String>,\n    ): List<PackageData> {\n      val comparator =\n        compareBy<PackageData> { it.ref.pkg }.thenBy(descendingVersionComparator) { it.ref.version }\n      return packages\n        // If matching a semver pattern, remove any version that has a prerelease\n        // version (e.g. SNAPSHOT in 1.2.3-SNAPSHOT)\n        .filter { Version.parseOrNull(it.ref.version)?.preRelease == null }\n        .sortedWith(comparator)\n        .distinctBy { it.ref.pkg }\n        .toList()\n    }\n\n    /**\n     * The default executor when running the doc generator.\n     *\n     * Uses [Executors.newVirtualThreadPerTaskExecutor] if available (JDK 21). Otherwise, uses\n     * [Executors.newFixedThreadPool] with 64 threads, or the number of available processors\n     * available to the JVM (whichever is higher).\n     */\n    internal val executor: Executor\n      get() {\n        try {\n          val method = Executors::class.java.getMethod(\"newVirtualThreadPerTaskExecutor\")\n          return method.invoke(null) as Executor\n        } catch (e: Throwable) {\n          when (e) {\n            is NoSuchMethodException,\n            is IllegalAccessException ->\n              return Executors.newFixedThreadPool(\n                64.coerceAtLeast(Runtime.getRuntime().availableProcessors())\n              )\n            else -> throw e\n          }\n        }\n      }\n  }\n\n  private val descendingVersionComparator: Comparator<String> = versionComparator.reversed()\n\n  private val docPackages: List<DocPackage> =\n    packages.map { DocPackage(it.key, it.value.toList()) }.filter { !it.isUnlisted }\n\n  private fun tryLoadPackageData(entry: SearchIndexGenerator.PackageIndexEntry): PackageData? {\n    var packageDataFile =\n      outputDir.resolve(entry.packageEntry.url).resolveSibling(\"package-data.json\")\n    if (!Files.exists(packageDataFile)) {\n      // search-index.js in Pkl 0.29 and below did not encode path.\n      // If we get a file does not exist, try again by encoding the path.\n      packageDataFile =\n        outputDir.resolve(entry.packageEntry.url.pathEncoded).resolveSibling(\"package-data.json\")\n      if (!Files.exists((packageDataFile))) {\n        writeOutputLine(\n          \"[Warn] likely corrupted search index; missing $packageDataFile. This entry will be removed in the newly generated index.\"\n        )\n        return null\n      }\n    }\n    writeOutput(\"Loading package data for ${packageDataFile.toUri()}\\r\")\n    return PackageData.read(packageDataFile)\n  }\n\n  private suspend fun getCurrentPackages(\n    siteSearchIndex: List<SearchIndexGenerator.PackageIndexEntry>\n  ): List<PackageData> = coroutineScope {\n    siteSearchIndex.map { async { tryLoadPackageData(it) } }.awaitAll().filterNotNull()\n  }\n\n  /** Runs this documentation generator. */\n  fun run() =\n    runBlocking(executor.asCoroutineDispatcher()) {\n      try {\n        if (!docMigrator.isUpToDate) {\n          throw DocGeneratorException(\n            \"Docsite is not up to date. Expected: ${DocMigrator.CURRENT_VERSION}. Found: ${docMigrator.docsiteVersion}. Use DocMigrator to migrate the site.\"\n          )\n        }\n        val htmlGenerator =\n          HtmlGenerator(docsiteInfo, docPackages, importResolver, outputDir, isTestMode, consoleOut)\n        val searchIndexGenerator = SearchIndexGenerator(outputDir, consoleOut)\n        val packageDataGenerator = PackageDataGenerator(outputDir, consoleOut)\n        val runtimeDataGenerator =\n          RuntimeDataGenerator(descendingVersionComparator, outputDir, consoleOut)\n\n        coroutineScope {\n          for (docPackage in docPackages) {\n            launch {\n              docPackage.deletePackageDir()\n              coroutineScope {\n                launch { htmlGenerator.generate(docPackage) }\n                launch { searchIndexGenerator.generate(docPackage) }\n                launch { packageDataGenerator.generate(docPackage) }\n              }\n            }\n          }\n        }\n\n        writeOutputLine(\"Generated HTML for packages\")\n\n        val newlyGeneratedPackages = docPackages.map(::PackageData).sortedBy { it.ref.pkg }\n        val currentSearchIndex = searchIndexGenerator.getCurrentSearchIndex()\n\n        writeOutputLine(\"Loaded current search index\")\n\n        val existingCurrentPackages = getCurrentPackages(currentSearchIndex)\n\n        writeOutputLine(\"Fetched latest packages\")\n\n        val currentPackages =\n          determineCurrentPackages(\n            newlyGeneratedPackages + existingCurrentPackages,\n            descendingVersionComparator,\n          )\n\n        createCurrentDirectories(currentPackages, existingCurrentPackages)\n        searchIndexGenerator.generateSiteIndex(currentPackages)\n        htmlGenerator.generateSite(currentPackages)\n        runtimeDataGenerator.generate(newlyGeneratedPackages)\n\n        writeOutputLine(\"Wrote package runtime data files\")\n\n        docMigrator.updateDocsiteVersion()\n      } catch (e: IOException) {\n        throw DocGeneratorBugException(\"I/O error generating documentation: $e\", e)\n      }\n    }\n\n  private fun DocPackage.deletePackageDir() {\n    outputDir.resolve(IoUtils.encodePath(\"$name/$version\")).deleteRecursively()\n  }\n\n  private fun createCurrentDirectories(\n    currentPackages: List<PackageData>,\n    existingCurrentPackages: List<PackageData>,\n  ) {\n    val packagesToCreate = currentPackages - existingCurrentPackages\n    for (packageData in packagesToCreate) {\n      val basePath = outputDir.resolve(packageData.ref.pkg.pathEncoded)\n      val src = basePath.resolve(packageData.ref.version)\n      val dst = basePath.resolve(CURRENT_DIRECTORY_NAME)\n\n      if (noSymlinks) {\n        dst.deleteRecursively()\n        src.copyRecursively(dst)\n      } else {\n        if (!dst.exists() || !dst.isSameFileAs(src)) {\n          dst.deleteRecursively()\n          dst.createSymbolicLinkPointingTo(IoUtils.relativize(src, basePath))\n        }\n      }\n    }\n  }\n}\n\ninternal class DocPackage(val docPackageInfo: DocPackageInfo, val modules: List<ModuleSchema>) {\n  val name: String\n    get() = docPackageInfo.name\n\n  val version: String\n    get() = docPackageInfo.version\n\n  val uri: URI?\n    get() = docPackageInfo.uri\n\n  val overview: String?\n    get() = docPackageInfo.overview\n\n  val minPklVersion: Version? by lazy { docModules.mapNotNull { it.minPklVersion }.maxOrNull() }\n\n  @Suppress(\"unused\") val deprecation: String? = docPackageInfo.annotations.deprecation\n\n  val isUnlisted: Boolean = docPackageInfo.annotations.isUnlisted\n\n  val hasListedModule: Boolean by lazy { docModules.any { !it.isUnlisted } }\n\n  private val exampleModulesBySubject: Map<String, List<ModuleSchema>> by lazy {\n    val result = mutableMapOf<String, MutableList<ModuleSchema>>()\n    for (mod in modules) {\n      val ann = mod.annotations.find { it.classInfo == PClassInfo.DocExample } ?: continue\n\n      @Suppress(\"UNCHECKED_CAST\") val subjects = ann[\"subjects\"] as List<String>\n      for (subject in subjects) {\n        val examples = result[subject]\n        if (examples == null) {\n          result[subject] = mutableListOf(mod)\n        } else {\n          examples.add(mod)\n        }\n      }\n    }\n    result\n  }\n\n  val docModules: List<DocModule> by lazy {\n    val regularModules =\n      modules.filter { mod -> !mod.annotations.any { it.classInfo == PClassInfo.DocExample } }\n    regularModules.map { mod ->\n      DocModule(\n        this,\n        mod,\n        docPackageInfo.version,\n        docPackageInfo.getModuleImportUri(mod.moduleName),\n        docPackageInfo.getModuleSourceCode(mod.moduleName),\n        exampleModulesBySubject[mod.moduleName] ?: listOf(),\n      )\n    }\n  }\n}\n\ninternal class DocModule(\n  val parent: DocPackage,\n  val schema: ModuleSchema,\n  val version: String,\n  val importUri: URI,\n  val sourceUrl: URI?,\n  val examples: List<ModuleSchema>,\n) {\n  val name: String\n    get() = schema.moduleName\n\n  val path: String by lazy {\n    name.pathEncoded.substring(parent.docPackageInfo.moduleNamePrefix.length).replace('.', '/')\n  }\n\n  val overview: String?\n    get() = schema.docComment\n\n  val minPklVersion: Version? by lazy {\n    val version =\n      schema.annotations.find { it.classInfo == PClassInfo.ModuleInfo }?.get(\"minPklVersion\")\n        as String?\n    version?.let { Version.parse(it) }\n  }\n\n  @Suppress(\"unused\") val deprecation: String? = schema.annotations.deprecation\n\n  val isUnlisted: Boolean = schema.annotations.isUnlisted\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/DocGeneratorException.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nopen class DocGeneratorException(message: String, cause: Throwable? = null) :\n  RuntimeException(message, cause)\n\nclass DocGeneratorBugException(message: String, cause: Throwable? = null) :\n  DocGeneratorException(message, cause)\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/DocMigrator.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport java.nio.file.Files\nimport java.nio.file.NoSuchFileException\nimport java.nio.file.Path\nimport java.util.concurrent.atomic.AtomicInteger\nimport kotlin.io.path.ExperimentalPathApi\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.deleteIfExists\nimport kotlin.io.path.exists\nimport kotlin.io.path.isRegularFile\nimport kotlin.io.path.listDirectoryEntries\nimport kotlin.io.path.name\nimport kotlin.io.path.readLines\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.serialization.json.Json\nimport org.pkl.commons.lazyWithReceiver\nimport org.pkl.commons.readString\nimport org.pkl.commons.toUri\nimport org.pkl.commons.writeString\nimport org.pkl.core.util.IoUtils\nimport org.pkl.doc.RuntimeData.Companion.EMPTY\n\n/** Migrates an existing Pkldoc site from version 1 to version 2. */\n@OptIn(ExperimentalPathApi::class)\nclass DocMigrator(\n  private val outputDir: Path,\n  consoleOut: OutputStream,\n  versionComparator: Comparator<String>,\n) : AbstractGenerator(consoleOut) {\n  companion object {\n    const val CURRENT_VERSION = 2\n\n    private val json = Json {\n      ignoreUnknownKeys = true\n      explicitNulls = false\n    }\n\n    private const val LEGACY_KNOWN_VERSIONS_PREFIX =\n      \"runtimeData.links('${HtmlConstants.KNOWN_VERSIONS}','\"\n    private const val LEGACY_KNOWN_USAGES_PREFIX =\n      \"runtimeData.links('${HtmlConstants.KNOWN_USAGES}','\"\n    private const val LEGACY_KNOWN_SUBTYPES_PREFIX =\n      \"runtimeData.links('${HtmlConstants.KNOWN_SUBTYPES}','\"\n    private const val LEGACY_SUFFIX = \"');\"\n\n    internal fun parseLegacyRuntimeData(path: Path, myVersionHref: String): RuntimeData {\n      try {\n        var runtimeData = EMPTY\n        for (line in Files.lines(path)) {\n          runtimeData =\n            when {\n              line.startsWith(LEGACY_KNOWN_VERSIONS_PREFIX) -> {\n                val knownVersions =\n                  readLegacyLine(line, LEGACY_KNOWN_VERSIONS_PREFIX, LEGACY_SUFFIX).mapTo(\n                    mutableSetOf()\n                  ) { link ->\n                    // fill in missing href\n                    if (link.href != null) link else link.copy(href = myVersionHref)\n                  }\n                runtimeData.copy(knownVersions = knownVersions)\n              }\n\n              line.startsWith(LEGACY_KNOWN_USAGES_PREFIX) -> {\n                val knownUsages = readLegacyLine(line, LEGACY_KNOWN_USAGES_PREFIX, LEGACY_SUFFIX)\n                runtimeData.copy(knownUsages = knownUsages)\n              }\n\n              line.startsWith(LEGACY_KNOWN_SUBTYPES_PREFIX) -> {\n                val knownSubtypes =\n                  readLegacyLine(line, LEGACY_KNOWN_SUBTYPES_PREFIX, LEGACY_SUFFIX)\n                runtimeData.copy(knownSubtypes = knownSubtypes)\n              }\n\n              else -> throw RuntimeException(\"Unexpected runtimeData line: $line\")\n            }\n        }\n        return runtimeData\n      } catch (e: NoSuchFileException) {\n        throw e\n      }\n    }\n\n    private fun readLegacyLine(line: String, prefix: String, suffix: String): Set<RuntimeDataLink> {\n      val jsStr = line.substring(prefix.length, line.length - suffix.length)\n      return json.decodeFromString<List<RuntimeDataLink>>(jsStr).toSet()\n    }\n  }\n\n  val isUpToDate by lazy {\n    if (!Files.exists(outputDir.resolve(\"index.html\"))) {\n      // must be the first run\n      return@lazy true\n    }\n    docsiteVersion == CURRENT_VERSION\n  }\n\n  val docsiteVersion by lazy {\n    if (!versionPath.isRegularFile()) 1 else versionPath.readString().trim().toInt()\n  }\n\n  private val versionPath\n    get() = outputDir.resolve(\".pkldoc/VERSION\")\n\n  private val descendingVersionComparator = versionComparator.reversed()\n\n  fun updateDocsiteVersion() {\n    versionPath.createParentDirectories()\n    versionPath.writeString(CURRENT_VERSION.toString())\n  }\n\n  private suspend fun migratePackage(pkgData: PackageData, isCurrentVersion: Boolean) {\n    coroutineScope {\n      if (!isCurrentVersion) {\n        launch { migrateRuntimeData(pkgData) }\n      }\n      launch { migrateHtml(pkgData, isCurrentVersion) }\n    }\n  }\n\n  fun run() =\n    runBlocking(Dispatchers.IO) {\n      if (isUpToDate) {\n        consoleOut.writeLine(\n          \"Generated pkldoc is already version $CURRENT_VERSION; there's nothing to do.\"\n        )\n        return@runBlocking\n      }\n      val packageDatas = Files.walk(outputDir).filter { it.name == \"package-data.json\" }.toList()\n      val count = AtomicInteger(1)\n      for (path in packageDatas) {\n        val pkgData = PackageData.read(path)\n        val isCurrentVersion = path.parent.name == \"current\"\n        migratePackage(pkgData, isCurrentVersion)\n        if (!isCurrentVersion) {\n          deleteLegacyRuntimeData(pkgData)\n        }\n        consoleOut.write(\n          \"Migrated ${count.incrementAndGet()} packages (${pkgData.ref.pkg}@${pkgData.ref.version})\\r\"\n        )\n        consoleOut.flush()\n      }\n      launch { copyResource(\"scripts/pkldoc.js\", outputDir) }\n      updateDocsiteVersion()\n      consoleOut.writeLine(\"Finished migration, migrated $count packages.\")\n    }\n\n  private suspend fun migrateHtml(packageData: PackageData, isCurrentVersion: Boolean) =\n    coroutineScope {\n      for (ref in packageData.refs) {\n        launch { doMigrateHtml(ref, outputDir.resolveHtmlPath(ref, isCurrentVersion)) }\n      }\n    }\n\n  private fun Path.resolveHtmlPath(ref: ElementRef<*>, isCurrentVersion: Boolean): Path {\n    val effectiveRef = if (isCurrentVersion) ref.withVersion(\"current\") else ref\n    return resolve(effectiveRef.htmlPath)\n  }\n\n  private val migratedCurrentPackages = mutableSetOf<String>()\n\n  private fun doMigrateHtml(ref: ElementRef<*>, path: Path) {\n    val newHtml = buildString {\n      val lines = path.readLines()\n      for ((idx, line) in lines.withIndex()) {\n        if (line.contains(ref.legacyVersionedRuntimeDataPath)) continue\n\n        appendLine(line)\n\n        if (line.contains(\"scripts/pkldoc.js\")) {\n          if (lines.getOrNull(idx + 1)?.contains(\"<script type=\\\"module\\\"\") == false) {\n            val packageVersionUrl =\n              IoUtils.relativize(ref.perPackageRuntimeDataPath.toUri(), ref.htmlPath.toUri())\n                .toString()\n            val perPackageVersionUrl =\n              IoUtils.relativize(ref.perPackageVersionRuntimeDataPath.toUri(), ref.htmlPath.toUri())\n                .toString()\n\n            appendLine(\n              \"\"\"    <script type=\"module\">\n      import perPackageData from \"$packageVersionUrl\" with { type: \"json\" }\n      import perPackageVersionData from \"$perPackageVersionUrl\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, ${json.encodeToString(ref.version)});\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\"\"\"\n            )\n          }\n        }\n      }\n    }\n    path.writeString(newHtml)\n  }\n\n  private fun getLatestPackageData(pkg: String): PackageData {\n    val currentPackage = outputDir.resolve(\"${pkg.pathEncoded}/current/package-data.json\")\n    if (currentPackage.isRegularFile()) {\n      return PackageData.read(currentPackage)\n    }\n    // it's possible that the \"current\" path doesn't exist if there are only pre-releases.\n    val versions = currentPackage.parent.parent.listDirectoryEntries()\n    val latestVersion = versions.map { it.name }.sortedWith(descendingVersionComparator).first()\n    return PackageData.read(\n      outputDir.resolve(\"${pkg.pathEncoded}/$latestVersion/package-data.json\")\n    )\n  }\n\n  /** Convert legacy style data paths to new style paths */\n  private suspend fun migrateRuntimeData(packageData: PackageData) = coroutineScope {\n    if (!migratedCurrentPackages.contains(packageData.ref.pkg)) {\n      val currentPackageData = getLatestPackageData(packageData.ref.pkg)\n      for (ref in currentPackageData.refs) {\n        launch { doMigratePerPackageData(ref) }\n      }\n      migratedCurrentPackages.add(packageData.ref.pkg)\n    }\n    for (ref in packageData.refs) {\n      launch { doMigratePerPackageVersionData(ref) }\n    }\n  }\n\n  private val PackageData.refs\n    get(): List<ElementRef<*>> {\n      return buildList {\n        add(ref)\n        for (module in modules) {\n          add(module.ref)\n          for (clazz in module.classes) {\n            add(clazz.ref)\n          }\n        }\n      }\n    }\n\n  private val ElementRef<*>.legacyRuntimeData: RuntimeData? by lazyWithReceiver {\n    val legacyPath = outputDir.resolve(legacyVersionedRuntimeDataPath)\n    when {\n      legacyPath.exists() ->\n        parseLegacyRuntimeData(legacyPath, myVersionHref = pageUrlForVersion(version))\n      else -> null\n    }\n  }\n\n  private fun doMigratePerPackageVersionData(ref: ElementRef<*>) {\n    val data = ref.legacyRuntimeData ?: return\n    data.perPackageVersion().writeTo(outputDir.resolve(ref.perPackageVersionRuntimeDataPath))\n  }\n\n  private fun doMigratePerPackageData(ref: ElementRef<*>) {\n    val data = ref.legacyRuntimeData ?: return\n    data.perPackage().writeTo(outputDir.resolve(ref.perPackageRuntimeDataPath))\n  }\n\n  private suspend fun deleteLegacyRuntimeData(packageData: PackageData) = coroutineScope {\n    for (ref in packageData.refs) {\n      launch { outputDir.resolve(ref.legacyVersionedRuntimeDataPath).deleteIfExists() }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/DocPackageInfo.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.net.URI\nimport kotlinx.serialization.Contextual\nimport org.pkl.commons.toUri\nimport org.pkl.core.Member\nimport org.pkl.core.Member.SourceLocation\nimport org.pkl.core.PModule\nimport org.pkl.core.PObject\nimport org.pkl.core.TypeAlias\nimport org.pkl.core.packages.PackageUri\n\n/** API equivalent of standard library module `pkl.DocPackageInfo`. */\ndata class DocPackageInfo(\n  /** The name of this doc package. */\n  val name: String,\n\n  /** The prefix for all modules within this doc package. */\n  val moduleNamePrefix: String = \"$name.\",\n\n  /** The URI of the package, if it is a `package://` URI. */\n  val uri: URI?,\n\n  /**\n   * The version of this package.\n   *\n   * Use `\"0.0.0\"` for unversioned packages.\n   */\n  val version: String,\n\n  /** The import base URI for modules in this package. */\n  val importUri: String,\n\n  /** The maintainers' emails for this package. */\n  val authors: List<String>?,\n\n  /** The web URL of the source code for this package. */\n  val sourceCode: URI?,\n\n  /** The source code scheme for this package. */\n  val sourceCodeUrlScheme: String?,\n\n  /** The web URL of the issue tracker for this package. */\n  val issueTracker: URI?,\n\n  /**\n   * The packages depended-on by this package.\n   *\n   * Used to display package dependencies and to create documentation links.\n   */\n  val dependencies: List<PackageDependency> = listOf(),\n\n  /**\n   * The overview documentation for this package.\n   *\n   * Supports the same Markdown syntax as Pkldoc comments. By default, only the first paragraph is\n   * displayed.\n   */\n  val overview: String?,\n\n  /** Imports used to resolve Pkldoc links in [overview]. */\n  val overviewImports: Map<String, URI> = mapOf(),\n\n  /** Annotations for this package, such as `@Deprecated`. */\n  val annotations: List<PObject> = listOf(),\n\n  /** Extra attributes to add to the documentation of the package. */\n  val extraAttributes: Map<String, String> = mapOf(),\n) {\n  companion object {\n    @Suppress(\"UNCHECKED_CAST\")\n    fun fromPkl(module: PModule): DocPackageInfo =\n      DocPackageInfo(\n        name = module[\"name\"] as String,\n        version = module[\"version\"] as String,\n        importUri = module[\"importUri\"] as String,\n        uri = (module[\"uri\"] as String?)?.toUri(),\n        authors = module[\"authors\"] as List<String>,\n        sourceCode = (module[\"sourceCode\"] as String?)?.toUri(),\n        sourceCodeUrlScheme = module[\"sourceCodeUrlScheme\"] as String?,\n        issueTracker = (module[\"issueTracker\"] as String?)?.toUri(),\n        dependencies =\n          (module[\"dependencies\"] as List<PObject>).map { dependency ->\n            PackageDependency(\n              name = dependency[\"name\"] as String,\n              uri = null, // dependencies declared in a doc-package-info file do not have URIs\n              version = dependency[\"version\"] as String,\n              sourceCode = (dependency[\"sourceCode\"] as String?)?.toUri(),\n              sourceCodeUrlScheme = dependency[\"sourceCodeUrlScheme\"] as String?,\n              documentation = (dependency[\"documentation\"] as String?)?.toUri(),\n            )\n          },\n        overview = module[\"overview\"] as String,\n        overviewImports =\n          (module[\"overviewImports\"] as Map<String, String>).mapValues { it.value.toUri() },\n        annotations = module[\"annotations\"] as List<PObject>,\n        extraAttributes = module[\"extraAttributes\"] as Map<String, String>,\n      )\n  }\n\n  internal fun getModuleRef(moduleName: String): ModuleRef? {\n    if (moduleName.startsWith(moduleNamePrefix)) {\n      return ModuleRef(name, uri, version, getModulePath(moduleName, moduleNamePrefix))\n    }\n    for (dependency in dependencies) {\n      if (moduleName.startsWith(dependency.prefix)) {\n        return ModuleRef(\n          dependency.name,\n          dependency.uri,\n          dependency.version,\n          getModulePath(moduleName, dependency.prefix),\n        )\n      }\n    }\n    return null\n  }\n\n  internal fun getTypeRef(type: Member /* PClass|TypeAlias */): TypeRef? {\n    val moduleName = type.moduleName\n    if (moduleName.startsWith(moduleNamePrefix)) {\n      return TypeRef(\n        name,\n        uri,\n        version,\n        getModulePath(moduleName, moduleNamePrefix),\n        type.simpleName,\n        isTypeAlias = type is TypeAlias,\n      )\n    }\n    for (dependency in dependencies) {\n      if (moduleName.startsWith(dependency.prefix)) {\n        return TypeRef(\n          dependency.name,\n          dependency.uri,\n          dependency.version,\n          getModulePath(moduleName, dependency.prefix),\n          type.simpleName,\n          isTypeAlias = type is TypeAlias,\n        )\n      }\n    }\n    return null\n  }\n\n  internal fun getModuleImportUri(moduleName: String): URI =\n    when (importUri) {\n      \"pkl:/\" -> \"pkl:${moduleName.substring(4)}\".toUri()\n      else -> {\n        val path = getModulePath(moduleName, moduleNamePrefix).uriEncoded + \".pkl\"\n        URI(importUri + path)\n      }\n    }\n\n  internal fun getModuleSourceCode(moduleName: String): URI? {\n    val path = \"/\" + getModulePath(moduleName, moduleNamePrefix).uriEncoded + \".pkl\"\n    // assumption: the fragment is only used for line numbers\n    return sourceCodeUrlScheme?.replace(\"%{path}\", path)?.substringBefore('#')?.let(URI::create)\n  }\n\n  /** Information about a depended-on package. */\n  data class PackageDependency(\n    /** The name of the depended-on package. */\n    val name: String,\n\n    /** The URI of the depended-upon package, if any. */\n    val uri: @Contextual URI?,\n\n    /** The version of the depended-on package. */\n    val version: String,\n\n    /**\n     * The web URL of the source code for the depended-on package *version*. Must end with a slash.\n     */\n    val sourceCode: @Contextual URI?,\n\n    /** The source URL scheme of the depended-upon package _version_, with placeholders. */\n    val sourceCodeUrlScheme: String?,\n\n    /**\n     * The web URL of the Pkldoc page for the depended-on package *version*. Must end with a slash.\n     * Only needs to be set if the depended-on package belongs to a different Pkldoc website.\n     */\n    val documentation: @Contextual URI?,\n  ) {\n    internal val prefix = \"$name.\"\n\n    val qualifiedName: String =\n      if (uri != null) {\n        val packageUri = PackageUri(uri)\n        \"${uri.authority}${packageUri.pathWithoutVersion}\"\n      } else name\n\n    /** Note: Returns an absolute URI, or an URI relative to the current site. */\n    internal fun getModuleDocUrl(moduleName: String): URI? =\n      when {\n        !moduleName.startsWith(prefix) -> null\n        else -> {\n          val modulePath = moduleName.substring(prefix.length).replace('.', '/').pathEncoded\n          if (documentation == null) {\n            \"${name.pathEncoded}/$version/$modulePath/index.html\".toUri()\n          } else {\n            documentation.resolve(\"$modulePath/index.html\")\n          }\n        }\n      }\n\n    @Suppress(\"unused\")\n    internal fun getModuleSourceCode(moduleName: String): URI? =\n      when {\n        !moduleName.startsWith(prefix) -> null\n        else -> {\n          val modulePath = moduleName.substring(prefix.length).replace('.', '/')\n          sourceCode?.resolve(\"$modulePath.pkl\")\n        }\n      }\n\n    internal fun getModuleSourceCodeWithSourceLocation(\n      moduleName: String,\n      sourceLocation: SourceLocation,\n    ): URI? {\n      return when {\n        !moduleName.startsWith(prefix) -> null\n        else -> {\n          val modulePath = moduleName.substring(prefix.length).replace('.', '/')\n          val path = \"/$modulePath.pkl\"\n          sourceCodeUrlScheme?.replaceSourceCodePlaceholders(path, sourceLocation)?.toUri()\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/DocScope.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.net.URI\nimport java.nio.file.Path\nimport org.pkl.commons.toUri\nimport org.pkl.core.*\nimport org.pkl.core.Member.SourceLocation\nimport org.pkl.core.util.IoUtils\n\n/**\n * A lexical scope that can be the source or target of a doc link (that is, a link to a Pkl member\n * embedded in a doc comment). Used to resolve doc links as well as class names in type signatures.\n * Scoping rules conform to the Pkl language as much as possible.\n *\n * Implementation note: equals and hashCode implementations are based on identity comparisons of\n * underlying [ModuleSchema] types.\n */\ninternal sealed class DocScope {\n  abstract val url: URI\n\n  abstract val parent: DocScope?\n\n  val siteScope: SiteScope? by lazy {\n    var scope = this\n    while (scope !is SiteScope) {\n      scope = scope.parent ?: return@lazy null\n    }\n    scope\n  }\n\n  private val packageScope: PackageScope? by lazy {\n    var scope = this\n    while (scope !is PackageScope) {\n      scope = scope.parent ?: return@lazy null\n    }\n    scope\n  }\n\n  val relativeSiteUrl: URI by lazy { siteScope!!.urlRelativeTo(this) }\n\n  val relativePackageUrl: URI by lazy { packageScope!!.urlRelativeTo(this) }\n\n  fun urlRelativeTo(other: DocScope): URI = IoUtils.relativize(url, other.url)\n\n  /** Looks up the method with the given name in the program element associated with this scope. */\n  abstract fun getMethod(name: String): MethodScope?\n\n  /**\n   * Looks up the property or class with the given name in the program element associated with this\n   * scope.\n   */\n  abstract fun getProperty(name: String): DocScope?\n\n  abstract fun resolveModuleNameToDocUrl(name: String): URI?\n\n  fun resolveModuleNameToRelativeDocUrl(name: String): URI? =\n    resolveModuleNameToDocUrl(name)?.let { IoUtils.relativize(it, url) }\n\n  abstract fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation): URI?\n\n  /** Resolves the given method name relative to this scope. */\n  abstract fun resolveMethod(name: String): MethodScope?\n\n  /**\n   * Resolves the given property name, class name, type alias name, method parameter name, or type\n   * parameter name relative to this scope.\n   */\n  abstract fun resolveVariable(name: String): DocScope?\n\n  /**\n   * Resolves a doc link such as `someImport.SomeClass` or `SomeClass.someMethod()` originating in\n   * this scope.\n   */\n  fun resolveDocLink(text: String): DocScope? {\n    var currScope: DocScope = this\n\n    val parts = text.split('.')\n    if (parts.isEmpty()) return null\n\n    val first = parts[0]\n    currScope =\n      when {\n        first.endsWith(\"()\") -> currScope.resolveMethod(first.dropLast(2)) ?: return null\n        else -> currScope.resolveVariable(first) ?: return null\n      }\n\n    for (i in 1..parts.lastIndex) {\n      val part = parts[i]\n      currScope =\n        when {\n          part.endsWith(\"()\") -> currScope.getMethod(part.dropLast(2)) ?: return null\n          else -> currScope.getProperty(part) ?: return null\n        }\n    }\n\n    return currScope\n  }\n\n  override fun toString() = \"${this::class.java.simpleName} { url=$url }\"\n}\n\n/** A scope that corresponds to an entire Pkldoc page. */\ninternal abstract class PageScope : DocScope() {\n  /** The location of the runtime data file for this page. */\n  abstract val perPackageDataUrl: URI\n\n  /** The location of the runtime data JSON file that is per-version for this page. */\n  abstract val perPackageVersionDataUrl: URI\n}\n\n// equality is identity\ninternal class SiteScope(\n  val docPackages: List<DocPackage>,\n  private val overviewImports: Map<String, URI>,\n  private val importResolver: (URI) -> ModuleSchema,\n  val outputDir: Path,\n) : PageScope() {\n  private val pklVersion = Release.current().version().withBuild(null).toString()\n\n  private val pklBaseModule: ModuleSchema by lazy { importResolver(\"pkl:base\".toUri()) }\n\n  val packageScopes: Map<DocPackageInfo, PackageScope> by lazy {\n    docPackages.associate { docPackage ->\n      docPackage.docPackageInfo to\n        PackageScope(\n          docPackage.docPackageInfo,\n          docPackage.docModules.map { it.schema },\n          pklBaseModule,\n          docPackage.docPackageInfo.overviewImports,\n          this,\n        )\n    }\n  }\n\n  val stdlibPackageScope: PackageScope? by lazy {\n    val pklPackage = docPackages.find { it.name == \"pkl\" }\n    packageScopes[pklPackage?.docPackageInfo]\n  }\n\n  private val pklBaseScope: ModuleScope by lazy {\n    ModuleScope(pklBaseModule, resolveModuleNameToDocUrl(\"pkl.base\")!!, null)\n  }\n\n  override val parent: DocScope?\n    get() = null\n\n  override val url: URI by lazy {\n    IoUtils.ensurePathEndsWithSlash(outputDir.toUri()).resolve(\"index.html\")\n  }\n\n  override val perPackageDataUrl: URI\n    get() = throw UnsupportedOperationException(\"perVersionDataUrl\")\n\n  override val perPackageVersionDataUrl: URI\n    get() = throw UnsupportedOperationException(\"perVersionDataUrl\")\n\n  fun createEmptyPackageScope(\n    name: String,\n    version: String,\n    sourceCodeUrlScheme: String?,\n    sourceCode: URI?,\n  ): PackageScope =\n    PackageScope(\n      DocPackageInfo(\n        name = name,\n        version = version,\n        sourceCode = sourceCode,\n        sourceCodeUrlScheme = sourceCodeUrlScheme,\n        authors = emptyList(),\n        extraAttributes = emptyMap(),\n        importUri = \"\",\n        issueTracker = null,\n        overview = null,\n        uri = null,\n      ),\n      emptyList(),\n      pklBaseModule,\n      emptyMap(),\n      this,\n    )\n\n  override fun getMethod(name: String): MethodScope? = null\n\n  override fun getProperty(name: String): DocScope? = null\n\n  fun getPackage(packageInfo: DocPackageInfo): PackageScope = packageScopes.getValue(packageInfo)\n\n  fun resolveImport(uri: URI): ModuleSchema = importResolver(uri)\n\n  override fun resolveModuleNameToDocUrl(name: String): URI? =\n    when {\n      name.startsWith(\"pkl.\") -> {\n        val packagePage =\n          stdlibPackageScope?.url // link to locally generated stdlib docs if available\n          ?: PklInfo.current().packageIndex.getPackagePage(\"pkl\", pklVersion).toUri()\n        packagePage.resolve(name.substring(4) + \"/\")\n      }\n      // doesn't make much sense to search in [packageScopes]\n      // because we don't know the requested module version\n      else -> null\n    }\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation): URI? =\n    when {\n      name.startsWith(\"pkl.\") -> {\n        val path = \"/stdlib/${name.substring(4)}.pkl\"\n        Release.current()\n          .sourceCode()\n          .sourceCodeUrlScheme()\n          .replaceSourceCodePlaceholders(path, sourceLocation)\n          .toUri()\n      }\n      // doesn't make much sense to search in [packageScopes]\n      // because we don't know the requested module version\n      else -> null\n    }\n\n  // used to resolve Pkldoc links in docsite-info.pkl\n  override fun resolveMethod(name: String): MethodScope? = pklBaseScope.getMethod(name)\n\n  // used to resolve Pkldoc links in docsite-info.pkl\n  override fun resolveVariable(name: String): DocScope? =\n    overviewImports[name]?.let { uri ->\n      val mod = resolveImport(uri)\n      resolveModuleNameToDocUrl(mod.moduleName)?.let { url -> ModuleScope(mod, url, null) }\n    } ?: pklBaseScope.getProperty(name)\n}\n\ninternal class PackageScope(\n  val docPackageInfo: DocPackageInfo,\n  modules: List<ModuleSchema>,\n  pklBaseModule: ModuleSchema,\n  private val overviewImports: Map<String, URI>,\n  override val parent: SiteScope,\n) : PageScope() {\n  val name = docPackageInfo.name\n\n  val version = docPackageInfo.version\n\n  private val modulePrefix = docPackageInfo.moduleNamePrefix\n\n  private val moduleScopes: Map<String, ModuleScope> by lazy {\n    modules.associate { module ->\n      val docUrl =\n        url.resolve(\n          getModulePath(module.moduleName, modulePrefix).pathEncoded.uriEncoded + \"/index.html\"\n        )\n      module.moduleName to ModuleScope(module, docUrl, this)\n    }\n  }\n\n  private val pklBaseScope: ModuleScope by lazy {\n    ModuleScope(pklBaseModule, resolveModuleNameToDocUrl(\"pkl.base\")!!, null)\n  }\n\n  override val url: URI by lazy { parent.url.resolve(\"./${name.pathEncoded}/$version/index.html\") }\n\n  fun urlForVersionRelativeTo(scope: DocScope, version: String): URI {\n    val myVersion = parent.url.resolve(\"./${name.pathEncoded}/$version/index.html\")\n    return IoUtils.relativize(myVersion, scope.url)\n  }\n\n  override val perPackageDataUrl: URI by lazy {\n    parent.url.resolve(\"./data/${name.pathEncoded}/_/index.json\")\n  }\n\n  override val perPackageVersionDataUrl: URI by lazy {\n    parent.url.resolve(\"./data/${name.pathEncoded}/$version/index.json\")\n  }\n\n  fun getModule(name: String): ModuleScope = moduleScopes.getValue(name)\n\n  fun getPklBaseMethod(name: String): MethodScope? = pklBaseScope.getMethod(name)\n\n  fun getPklBaseProperty(name: String): DocScope? = pklBaseScope.getProperty(name)\n\n  override fun getMethod(name: String): MethodScope? = null\n\n  override fun getProperty(name: String): DocScope? = null\n\n  fun resolveImport(uri: URI): ModuleSchema = parent.resolveImport(uri)\n\n  override fun resolveModuleNameToDocUrl(name: String): URI? {\n    moduleScopes[name]?.url?.let {\n      return it\n    }\n    for (dependency in docPackageInfo.dependencies) {\n      dependency.getModuleDocUrl(name)?.let {\n        return parent.url.resolve(it)\n      }\n    }\n    return parent.resolveModuleNameToDocUrl(name)\n  }\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation): URI? {\n    for (dependency in docPackageInfo.dependencies) {\n      dependency.getModuleSourceCodeWithSourceLocation(name, sourceLocation)?.let {\n        return it\n      }\n    }\n    return parent.resolveModuleNameToSourceUrl(name, sourceLocation)\n  }\n\n  // used to resolve Pkldoc links in package-info.pkl\n  override fun resolveMethod(name: String): MethodScope? = getPklBaseMethod(name)\n\n  // used to resolve Pkldoc links in package-info.pkl\n  override fun resolveVariable(name: String): DocScope? =\n    overviewImports[name]?.let { uri ->\n      val mod = resolveImport(uri)\n      resolveModuleNameToDocUrl(mod.moduleName)?.let { url -> ModuleScope(mod, url, null) }\n    } ?: getPklBaseProperty(name)\n\n  override fun equals(other: Any?): Boolean =\n    other is PackageScope && docPackageInfo.name == other.docPackageInfo.name\n\n  override fun hashCode(): Int =\n    PackageScope::class.hashCode() * 31 + docPackageInfo.name.hashCode()\n}\n\ninternal class ModuleScope(\n  val module: ModuleSchema,\n  override val url: URI,\n  override val parent: PackageScope?,\n) : PageScope() {\n  val name: String\n    get() = module.moduleName\n\n  val path: String by lazy {\n    getModulePath(module.moduleName, parent!!.docPackageInfo.moduleNamePrefix).uriEncoded\n  }\n\n  override val perPackageDataUrl: URI by lazy {\n    parent!!.perPackageDataUrl.resolve(\"./$path/index.json\")\n  }\n\n  override val perPackageVersionDataUrl: URI by lazy {\n    parent!!.perPackageVersionDataUrl.resolve(\"./$path/index.json\")\n  }\n\n  override fun getMethod(name: String): MethodScope? =\n    module.moduleClass.allMethods[name]?.let { MethodScope(it, this) }\n\n  override fun getProperty(name: String): DocScope? =\n    module.moduleClass.allProperties[name]?.let { PropertyScope(it, this) }\n      ?: module.allClasses[name]?.let { ClassScope(it, url, this) }\n      ?: module.allTypeAliases[name]?.let { TypeAliasScope(it, url, this) }\n\n  private fun resolveImport(uri: URI): ModuleSchema = parent!!.resolveImport(uri)\n\n  override fun resolveModuleNameToDocUrl(name: String): URI? =\n    when (name) {\n      module.moduleName -> url\n      else -> parent!!.resolveModuleNameToDocUrl(name)\n    }\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation): URI? =\n    when (name) {\n      module.moduleName ->\n        parent!!\n          .docPackageInfo\n          .sourceCodeUrlScheme\n          ?.replaceSourceCodePlaceholders(\"/$path.pkl\", sourceLocation)\n          ?.toUri()\n      else -> parent!!.resolveModuleNameToSourceUrl(name, sourceLocation)\n    }\n\n  override fun resolveMethod(name: String): MethodScope? =\n    module.moduleClass.methods[name]?.let { MethodScope(it, this) }\n      ?: parent!!.getPklBaseMethod(name)\n      ?: getMethod(name)\n\n  override fun resolveVariable(name: String): DocScope? =\n    name.takeIf { it == \"module\" }?.let { this }\n      ?: module.imports[name]?.let { uri ->\n        val mod = resolveImport(uri)\n        resolveModuleNameToDocUrl(mod.moduleName)?.let { url -> ModuleScope(mod, url, null) }\n      }\n      ?: module.moduleClass.properties[name]?.let { PropertyScope(it, this) }\n      // inherited classes/type aliases are in scope when resolving types -> search `all`\n      ?: module.allClasses[name]?.let { ClassScope(it, url, this) }\n      ?: module.allTypeAliases[name]?.let { TypeAliasScope(it, url, this) }\n      ?: parent!!.getPklBaseProperty(name)\n      ?: getProperty(name)\n\n  override fun equals(other: Any?): Boolean = other is ModuleScope && module == other.module\n\n  override fun hashCode(): Int = module.hashCode()\n}\n\ninternal class ClassScope(\n  val clazz: PClass,\n  private val parentUrl: URI,\n  override val parent: ModuleScope?,\n) : PageScope() {\n  override val url: URI by lazy {\n    // `isModuleClass` distinction is relevant when this scope is a link target\n    if (clazz.isModuleClass) parentUrl\n    else parentUrl.resolve(\"${clazz.simpleName.pathEncoded.uriEncodedComponent}.html\")\n  }\n\n  override val perPackageDataUrl: URI by lazy {\n    parent!!.perPackageDataUrl.resolve(\"${clazz.simpleName.pathEncoded.uriEncodedComponent}.json\")\n  }\n\n  override val perPackageVersionDataUrl: URI by lazy {\n    parent!!\n      .perPackageVersionDataUrl\n      .resolve(\"${clazz.simpleName.pathEncoded.uriEncodedComponent}.json\")\n  }\n\n  override fun getMethod(name: String): MethodScope? =\n    clazz.allMethods[name]?.let { MethodScope(it, this) }\n\n  override fun getProperty(name: String): DocScope? =\n    clazz.allProperties[name]?.let { PropertyScope(it, this) }\n\n  override fun resolveModuleNameToDocUrl(name: String): URI? =\n    parent!!.resolveModuleNameToDocUrl(name)\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation): URI? =\n    parent!!.resolveModuleNameToSourceUrl(name, sourceLocation)\n\n  override fun resolveMethod(name: String): MethodScope? =\n    clazz.methods[name]?.let { MethodScope(it, this) }\n      ?: parent!!.resolveMethod(name)\n      ?: getMethod(name)\n\n  override fun resolveVariable(name: String): DocScope? =\n    clazz.typeParameters.find { it.name == name }?.let { ParameterScope(name, this) }\n      ?: clazz.properties[name]?.let { PropertyScope(it, this) }\n      ?: parent!!.resolveVariable(name)\n      ?: clazz.allProperties[name]?.let { PropertyScope(it, this) }\n\n  override fun equals(other: Any?): Boolean = other is ClassScope && clazz == other.clazz\n\n  override fun hashCode(): Int = clazz.hashCode()\n}\n\ninternal class TypeAliasScope(\n  val typeAlias: TypeAlias,\n  private val parentDocUrl: URI,\n  override val parent: ModuleScope?,\n) : DocScope() {\n  override val url: URI\n    get() = parentDocUrl.resolve(\"#${typeAlias.simpleName}\")\n\n  override fun getMethod(name: String): MethodScope? = parent?.getMethod(name)\n\n  override fun getProperty(name: String): DocScope? = parent?.getProperty(name)\n\n  override fun resolveModuleNameToDocUrl(name: String) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToDocUrl\")\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToSourceUrl\")\n\n  override fun resolveMethod(name: String): MethodScope? = parent?.resolveMethod(name)\n\n  override fun resolveVariable(name: String): DocScope? = parent?.resolveVariable(name)\n\n  override fun equals(other: Any?): Boolean =\n    other is TypeAliasScope && typeAlias == other.typeAlias\n\n  override fun hashCode(): Int = typeAlias.hashCode()\n}\n\ninternal class MethodScope(val method: PClass.Method, override val parent: DocScope) : DocScope() {\n  override val url: URI\n    get() = parent.url.resolve(\"#${method.simpleName}()\")\n\n  override fun getMethod(name: String): MethodScope? = null\n\n  override fun getProperty(name: String): DocScope? = null\n\n  override fun resolveModuleNameToDocUrl(name: String) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToDocUrl\")\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToSourceUrl\")\n\n  override fun resolveMethod(name: String): MethodScope? = parent.resolveMethod(name)\n\n  override fun resolveVariable(name: String): DocScope? =\n    method.typeParameters.find { it.name == name }?.let { ParameterScope(name, this) }\n      ?: method.parameters[name]?.let { ParameterScope(name, this) }\n      ?: parent.resolveVariable(name)\n\n  override fun equals(other: Any?): Boolean = other is MethodScope && method == other.method\n\n  override fun hashCode(): Int = method.hashCode()\n}\n\ninternal class PropertyScope(\n  val property: PClass.Property,\n  override val parent: DocScope, // ModuleScope|ClassScope\n) : DocScope() {\n  override val url: URI\n    get() = parent.url.resolve(\"#${property.simpleName}\")\n\n  override fun getProperty(name: String): DocScope? = null\n\n  override fun getMethod(name: String): MethodScope? = null\n\n  override fun resolveModuleNameToDocUrl(name: String) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToDocUrl\")\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToSourceUrl\")\n\n  override fun resolveMethod(name: String): MethodScope? = parent.resolveMethod(name)\n\n  override fun resolveVariable(name: String): DocScope? = parent.resolveVariable(name)\n\n  override fun equals(other: Any?): Boolean = other is PropertyScope && property == other.property\n\n  override fun hashCode(): Int = property.hashCode()\n}\n\n/** A method parameter or type parameter. */\ninternal class ParameterScope(val name: String, override val parent: DocScope) : DocScope() {\n  override val url: URI\n    get() =\n      if (parent is ClassScope) {\n        parent.url.resolve(\"#$name\")\n      } else {\n        \"${parent.url}.$name\".toUri()\n      }\n\n  override fun getMethod(name: String): MethodScope? = null\n\n  override fun getProperty(name: String): DocScope? = null\n\n  override fun resolveModuleNameToDocUrl(name: String) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToDocUrl\")\n\n  override fun resolveModuleNameToSourceUrl(name: String, sourceLocation: SourceLocation) =\n    // only used for page scopes\n    throw UnsupportedOperationException(\"resolveModuleNameToSourceUrl\")\n\n  override fun resolveMethod(name: String): MethodScope? = parent.resolveMethod(name)\n\n  override fun resolveVariable(name: String): DocScope? = parent.resolveVariable(name)\n\n  override fun equals(other: Any?): Boolean =\n    other is ParameterScope && name == other.name && parent == other.parent\n\n  override fun hashCode(): Int = name.hashCode() * 31 + parent.hashCode()\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/DocsiteInfo.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.net.URI\nimport org.pkl.commons.toUri\nimport org.pkl.core.PModule\n\n/** API equivalent of standard library module `pkl.DocsiteInfo`. */\ndata class DocsiteInfo(\n  /** The display title of this Pkldoc website. */\n  val title: String?,\n\n  /**\n   * The overview documentation on the main page of this website.\n   *\n   * Uses the same Markdown format as Pkldoc comments. Unless expanded, only the first paragraph is\n   * shown.\n   */\n  val overview: String?,\n\n  /** Imports used to resolve Pkldoc links in [overview]. */\n  val overviewImports: Map<String, URI>,\n) {\n  companion object {\n    @Suppress(\"UNCHECKED_CAST\")\n    fun fromPkl(module: PModule): DocsiteInfo =\n      DocsiteInfo(\n        title = module[\"title\"] as String?,\n        overview = module[\"overview\"] as String?,\n        overviewImports =\n          (module[\"overviewImports\"] as Map<String, String>).mapValues { it.value.toUri() },\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/HtmlGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.launch\nimport org.pkl.core.ModuleSchema\n\ninternal class HtmlGenerator(\n  private val docsiteInfo: DocsiteInfo,\n  docPackages: List<DocPackage>,\n  importResolver: (URI) -> ModuleSchema,\n  private val outputDir: Path,\n  private val isTestMode: Boolean,\n  consoleOut: OutputStream,\n) : AbstractGenerator(consoleOut) {\n  private val siteScope =\n    SiteScope(docPackages, docsiteInfo.overviewImports, importResolver, outputDir)\n\n  suspend fun generate(docPackage: DocPackage) = coroutineScope {\n    val packageScope = siteScope.getPackage(docPackage.docPackageInfo)\n    launch { PackagePageGenerator(docsiteInfo, docPackage, packageScope, consoleOut).run() }\n\n    for (docModule in docPackage.docModules) {\n      if (docModule.isUnlisted) continue\n\n      val moduleScope = packageScope.getModule(docModule.name)\n      launch {\n        ModulePageGenerator(docsiteInfo, docPackage, docModule, moduleScope, isTestMode, consoleOut)\n          .run()\n      }\n\n      for ((_, clazz) in docModule.schema.classes) {\n        if (clazz.isUnlisted) continue\n        launch {\n          ClassPageGenerator(\n              docsiteInfo,\n              docPackage,\n              docModule,\n              clazz,\n              ClassScope(clazz, moduleScope.url, moduleScope),\n              isTestMode,\n              consoleOut,\n            )\n            .run()\n        }\n      }\n    }\n  }\n\n  suspend fun generateSite(packages: List<PackageData>) = coroutineScope {\n    launch { MainPageGenerator(docsiteInfo, packages, siteScope, consoleOut).run() }\n    launch { generateStaticResources() }\n  }\n\n  private suspend fun generateStaticResources() = coroutineScope {\n    val resources =\n      listOf(\n        \"fonts/lato-v14-latin_latin-ext-regular.woff2\",\n        \"fonts/lato-v14-latin_latin-ext-700.woff2\",\n        \"fonts/open-sans-v15-latin_latin-ext-regular.woff2\",\n        \"fonts/open-sans-v15-latin_latin-ext-italic.woff2\",\n        \"fonts/open-sans-v15-latin_latin-ext-700.woff2\",\n        \"fonts/open-sans-v15-latin_latin-ext-700italic.woff2\",\n        \"fonts/source-code-pro-v7-latin_latin-ext-regular.woff2\",\n        \"fonts/source-code-pro-v7-latin_latin-ext-700.woff2\",\n        \"fonts/MaterialIcons-Regular.woff2\",\n        \"scripts/pkldoc.js\",\n        \"scripts/search-worker.js\",\n        \"scripts/scroll-into-view.min.js\",\n        \"styles/pkldoc.css\",\n        \"images/apple-touch-icon.png\",\n        \"images/favicon.svg\",\n        \"images/favicon-16x16.png\",\n        \"images/favicon-32x32.png\",\n      )\n    for (resource in resources) {\n      launch { copyResource(resource, outputDir) }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/Main.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:JvmName(\"Main\")\n\npackage org.pkl.doc\n\nimport com.github.ajalt.clikt.core.main\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.arguments.convert\nimport com.github.ajalt.clikt.parameters.arguments.multiple\nimport com.github.ajalt.clikt.parameters.groups.provideDelegate\nimport com.github.ajalt.clikt.parameters.options.flag\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.options.required\nimport com.github.ajalt.clikt.parameters.types.path\nimport java.net.URI\nimport java.nio.file.Path\nimport org.pkl.commons.cli.cliMain\nimport org.pkl.commons.cli.commands.BaseCommand\nimport org.pkl.commons.cli.commands.BaseOptions.Companion.parseModuleName\nimport org.pkl.commons.cli.commands.ProjectOptions\nimport org.pkl.commons.cli.commands.installCommonOptions\nimport org.pkl.commons.cli.commands.single\nimport org.pkl.core.Release\n\n/** Main method for the Pkldoc CLI. */\ninternal fun main(args: Array<String>) {\n  cliMain { DocCommand().main(args) }\n}\n\nval helpLink = \"${Release.current().documentation.homepage}pkl-doc/index.html#cli\"\n\nclass DocCommand : BaseCommand(name = \"pkldoc\", helpLink = helpLink) {\n  private val modules: List<URI> by\n    argument(\n        name = \"modules\",\n        help = \"Module paths/uris, or package uris to generate documentation for\",\n      )\n      .convert { parseModuleName(it) }\n      .multiple()\n\n  private val outputDir: Path by\n    option(\n        names = arrayOf(\"-o\", \"--output-dir\"),\n        metavar = \"directory\",\n        help = \"Directory where generated documentation is placed.\",\n      )\n      .path()\n      .required()\n\n  private val noSymlinks: Boolean by\n    option(\n        names = arrayOf(\"--no-symlinks\"),\n        help = \"Create copies of directories and files instead of symbolic links.\",\n      )\n      .single()\n      .flag(default = false)\n\n  private val isTestMode by\n    option(names = arrayOf(\"--test-mode\"), help = \"Internal test mode\", hidden = true).flag()\n\n  private val migrate: Boolean by\n    option(\n        names = arrayOf(\"--migrate\"),\n        help = \"Migrate a pkl-doc site from version 0 to version 1.\",\n      )\n      .single()\n      .flag(default = false)\n\n  private val projectOptions by ProjectOptions()\n\n  override val helpString: String = \"Generate HTML documentation from Pkl modules and packages.\"\n\n  override fun run() {\n    val options =\n      CliDocGeneratorOptions(\n        baseOptions.baseOptions(modules, projectOptions),\n        outputDir,\n        isTestMode,\n        noSymlinks,\n        migrate,\n      )\n    CliDocGenerator(options).run()\n  }\n\n  init {\n    installCommonOptions()\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/MainOrPackagePageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlinx.html.*\n\ninternal abstract class MainOrPackagePageGenerator<S>(\n  docsiteInfo: DocsiteInfo,\n  pageScope: S,\n  consoleOut: OutputStream,\n) : PageGenerator<S>(docsiteInfo, pageScope, consoleOut) where S : PageScope {\n  protected fun UL.renderModuleOrPackage(\n    name: String,\n    moduleOrPackageScope: DocScope,\n    memberDocs: MemberDocs,\n  ) {\n    li {\n      renderAnchor(name)\n\n      div {\n        classes = setOf(\"member\", \"with-page-link\")\n\n        memberDocs.renderExpandIcon(this)\n        renderSelfLink(name)\n\n        div {\n          classes = setOf(\"member-left\")\n\n          div {\n            classes =\n              if (memberDocs.isDeprecatedMember) {\n                setOf(\"member-modifiers\", \"member-deprecated\")\n              } else setOf(\"member-modifiers\")\n\n            renderModifiers(\n              setOf(),\n              if (moduleOrPackageScope is PackageScope) \"package\" else \"module\",\n            )\n          }\n        }\n\n        div {\n          classes = setOf(\"member-main\")\n\n          div {\n            classes =\n              if (memberDocs.isDeprecatedMember) {\n                setOf(\"member-signature\", \"member-deprecated\")\n              } else setOf(\"member-signature\")\n\n            a {\n              classes = setOf(\"name-decl\")\n              val link = \"./\" + moduleOrPackageScope.urlRelativeTo(pageScope).toString()\n              href =\n                if (pageScope is SiteScope) {\n                  link.replaceFirst((moduleOrPackageScope as PackageScope).version, \"current\")\n                } else {\n                  link\n                }\n              if (moduleOrPackageScope is ModuleScope) {\n                +name.asModuleName\n              } else {\n                +name\n              }\n            }\n          }\n\n          memberDocs.renderDocComment(this)\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/MainPageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlinx.html.*\n\ninternal class MainPageGenerator(\n  docsiteInfo: DocsiteInfo,\n  private val packagesData: List<PackageData>,\n  pageScope: SiteScope,\n  consoleOut: OutputStream,\n) : MainOrPackagePageGenerator<SiteScope>(docsiteInfo, pageScope, consoleOut) {\n  override val html: HTML.() -> Unit = {\n    renderHtmlHead()\n\n    body {\n      onLoad = \"onLoad()\"\n\n      renderPageHeader(null, null, null, null)\n\n      main {\n        h1 {\n          id = \"declaration-title\"\n\n          +(docsiteInfo.title ?: \"\")\n        }\n\n        val memberDocs = MemberDocs(docsiteInfo.overview, pageScope, listOf(), isDeclaration = true)\n\n        renderMemberGroupLinks(\n          Triple(\"Overview\", \"#_overview\", memberDocs.isExpandable),\n          Triple(\"Packages\", \"#_packages\", packagesData.isNotEmpty()),\n        )\n\n        if (docsiteInfo.overview != null) {\n          renderAnchor(\"_overview\")\n          div {\n            id = \"_declaration\"\n            classes = setOf(\"member\")\n\n            memberDocs.renderExpandIcon(this)\n            memberDocs.renderDocComment(this)\n          }\n        }\n\n        renderPackages()\n      }\n    }\n  }\n\n  override fun HTMLTag.renderPageTitle() {\n    +(docsiteInfo.title ?: \"Pkldoc\")\n  }\n\n  private fun HtmlBlockTag.renderPackages() {\n    if (packagesData.isEmpty()) return\n\n    val sortedPackages =\n      packagesData.sortedWith { pkg1, pkg2 ->\n        when {\n          pkg1.ref.pkg == \"pkl\" -> -1 // always sort the stdlib first\n          else -> pkg1.ref.pkg.compareTo(pkg2.ref.pkg)\n        }\n      }\n\n    div {\n      classes = setOf(\"member-group\")\n\n      renderAnchor(\"_packages\")\n\n      h2 {\n        classes = setOf(\"member-group-title\")\n\n        +\"Packages\"\n      }\n\n      ul {\n        for (pkg in sortedPackages) {\n          val packageScope =\n            pageScope.createEmptyPackageScope(\n              pkg.ref.pkg,\n              pkg.ref.version,\n              pkg.sourceCodeUrlScheme,\n              pkg.sourceCode,\n            )\n\n          val memberDocs =\n            MemberDocs(\n              pkg.summary,\n              packageScope,\n              listOfNotNull(pkg.deprecation?.let { createDeprecatedAnnotation(it) }),\n            )\n\n          renderModuleOrPackage(pkg.ref.pkg, packageScope, memberDocs)\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/Markdown.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport org.commonmark.internal.InlineParserImpl\nimport org.commonmark.node.Code\nimport org.commonmark.node.Link\nimport org.commonmark.node.LinkReferenceDefinition\nimport org.commonmark.node.Text\nimport org.commonmark.parser.InlineParser\nimport org.commonmark.parser.InlineParserContext\nimport org.commonmark.parser.InlineParserFactory\nimport org.commonmark.parser.beta.InlineContentParserFactory\nimport org.commonmark.parser.beta.LinkProcessor\nimport org.commonmark.parser.delimiter.DelimiterProcessor\nimport org.commonmark.renderer.html.CoreHtmlNodeRenderer\nimport org.commonmark.renderer.html.HtmlNodeRendererContext\n\ninternal class MarkdownParserFactory(private val pageScope: DocScope) : InlineParserFactory {\n  // the scope of the doc comment to be parsed next; mutated by [MemberDocs]\n  var docScope: DocScope = pageScope\n\n  override fun create(inlineParserContext: InlineParserContext): InlineParser {\n    return InlineParserImpl(MarkdownParserContext(docScope, pageScope, inlineParserContext))\n  }\n}\n\ninternal class MarkdownParserContext(\n  private val docScope: DocScope,\n  private val pageScope: DocScope,\n  private val delegate: InlineParserContext,\n) : InlineParserContext {\n  companion object {\n    private val keywords = setOf(\"null\", \"true\", \"false\", \"this\", \"unknown\", \"nothing\")\n  }\n\n  private val seenLinkTargets = mutableSetOf<DocScope>()\n\n  override fun getCustomDelimiterProcessors(): List<DelimiterProcessor> {\n    return delegate.customDelimiterProcessors\n  }\n\n  override fun <D : Any> getDefinition(type: Class<D>, label: String): D? {\n    @Suppress(\"UNCHECKED_CAST\")\n    return when (type) {\n      LinkReferenceDefinition::class.java -> getLinkReferenceDefinition(label) as D\n      else -> null\n    }\n  }\n\n  /**\n   * This method communicates with [MarkdownNodeRenderer] through the method's return value:\n   * * `title = \"pkldoc:1:$label\"` -> replace link with `Code(label)`\n   * * `title = \"pkldoc:2:$label\"` -> replace link text with `Code(label)`\n   *\n   * We only want to modify *short* reference links as described above. Whereas this method can't\n   * tell whether it's resolving a short or full reference link, PklNodeRenderer can, by comparing\n   * the link text to the passed through label.\n   */\n  @Suppress(\"OVERRIDE_DEPRECATION\")\n  override fun getLinkReferenceDefinition(label: String): LinkReferenceDefinition {\n    if (label in keywords) {\n      return LinkReferenceDefinition(label, label, \"pkldoc:1:$label\")\n    }\n\n    val destScope = docScope.resolveDocLink(label)\n    val destination = destScope?.urlRelativeTo(pageScope)?.toString() ?: \"not_found\"\n    val command =\n      when {\n        // dangling link\n        destScope == null -> 2\n\n        // don't link to ourselves\n        destScope == docScope -> 1\n\n        // don't link to our own method parameters\n        destScope is ParameterScope && destScope.parent == docScope -> 1\n\n        // only link to a target once\n        !seenLinkTargets.add(destScope) -> 1\n        else -> 2\n      }\n\n    return LinkReferenceDefinition(label, destination, \"pkldoc:$command:$label\")\n  }\n\n  override fun getCustomInlineContentParserFactories(): MutableList<InlineContentParserFactory> =\n    mutableListOf()\n\n  override fun getCustomLinkProcessors(): MutableList<LinkProcessor> = mutableListOf()\n\n  override fun getCustomLinkMarkers(): MutableSet<Char> = mutableSetOf()\n}\n\ninternal class MarkdownNodeRenderer(context: HtmlNodeRendererContext) :\n  CoreHtmlNodeRenderer(context) {\n  override fun visit(link: Link) {\n    val title = link.title\n    if (title == null || !title.startsWith(\"pkldoc:\")) {\n      super.visit(link)\n      return\n    }\n\n    // see [MarkdownParserContext] for contents of `title`\n    val command = title[7]\n    val label = title.substring(9)\n    val isShortReferenceLink =\n      link.firstChild === link.lastChild && (link.firstChild as? Text)?.literal == label\n\n    when {\n      !isShortReferenceLink -> super.visit(link.apply { this.title = null })\n      command == '1' -> visit(Code(label))\n      command == '2' -> visit(Link(link.destination, null).apply { appendChild(Code(label)) })\n      else -> throw AssertionError(\"Unknown command: $command\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/ModuleOrClassPageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlinx.html.*\nimport org.pkl.core.Member\nimport org.pkl.core.PClass\nimport org.pkl.core.PClass.ClassMember\nimport org.pkl.core.PClass.Method\nimport org.pkl.core.TypeParameter\nimport org.pkl.core.TypeParameter.Variance\n\ninternal abstract class ModuleOrClassPageGenerator<S>(\n  docsiteInfo: DocsiteInfo,\n  protected val clazz: PClass,\n  scope: S,\n  private val isTestMode: Boolean,\n  consoleOut: OutputStream,\n) : PageGenerator<S>(docsiteInfo, scope, consoleOut) where S : PageScope {\n  protected fun HtmlBlockTag.renderProperties() {\n    if (!clazz.hasListedProperty) return\n\n    div {\n      classes = setOf(\"member-group\")\n\n      renderAnchor(\"_properties\")\n\n      h2 {\n        classes = setOf(\"member-group-title\")\n\n        +\"Properties\"\n        if (clazz.superclass.hasListedProperty) {\n          renderShowInheritedButton()\n        }\n      }\n\n      ul {\n        for ((propertyName, property) in clazz.allProperties) {\n          if (property.isUnlisted) continue\n\n          li {\n            renderAnchor(propertyName)\n\n            div {\n              val isInherited = property.owner.info != clazz.info\n              classes =\n                when {\n                  isInherited -> setOf(\"member\", \"inherited\", \"expandable\", \"hidden\", \"collapsed\")\n                  property.isHidden -> setOf(\"member\", \"hidden-member\")\n                  else -> setOf(\"member\")\n                }\n\n              val propertyScope = PropertyScope(property, pageScope)\n              val memberDocs =\n                MemberDocs(property.inheritedDocComment, propertyScope, property.annotations)\n\n              memberDocs.renderExpandIcon(this)\n              renderSelfLink(propertyName)\n\n              div {\n                classes = setOf(\"member-left\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-modifiers\", \"member-deprecated\")\n                    } else setOf(\"member-modifiers\")\n\n                  renderModifiers(property.modifiers)\n                }\n              }\n\n              div {\n                classes = setOf(\"member-main\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-signature\", \"member-deprecated\")\n                    } else setOf(\"member-signature\")\n\n                  if (isInherited) renderClassContext(property)\n\n                  span {\n                    classes = setOf(\"name-decl\")\n\n                    +propertyName.asIdentifier\n                  }\n\n                  +\": \"\n                  renderType(property.type, propertyScope)\n\n                  if (isInherited) {\n                    renderModuleContext(property)\n                  }\n                  renderMemberSourceLink(property)\n                }\n\n                memberDocs.renderDocComment(this)\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun HtmlBlockTag.renderClassContext(member: ClassMember) {\n    if (pageScope is ClassScope) {\n      span {\n        classes = setOf(\"context\")\n        renderClassName(member.owner)\n        +\".\"\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderModuleContext(member: Member) {\n    span {\n      classes = setOf(\"context\")\n      +\" (\"\n      renderModuleName(member.moduleName)\n      +\")\"\n    }\n  }\n\n  protected fun HtmlBlockTag.renderMethods() {\n    if (!clazz.hasListedMethod) return\n\n    div {\n      classes = setOf(\"member-group\")\n\n      renderAnchor(\"_methods\")\n\n      h2 {\n        classes = setOf(\"member-group-title\")\n\n        +\"Methods\"\n        if (clazz.superclass.hasListedMethod) {\n          renderShowInheritedButton()\n        }\n      }\n\n      ul {\n        for ((methodName, method) in clazz.allMethods) {\n          if (method.isUnlisted) continue\n\n          li {\n            renderAnchors(method)\n\n            div {\n              val isInherited = method.owner.info != clazz.info\n              classes =\n                if (isInherited) {\n                  setOf(\"member\", \"inherited\", \"expandable\", \"hidden\", \"collapsed\")\n                } else setOf(\"member\")\n\n              val methodScope = MethodScope(method, pageScope)\n              val memberDocs =\n                MemberDocs(method.inheritedDocComment, methodScope, method.annotations)\n\n              memberDocs.renderExpandIcon(this)\n              renderSelfLink(\"$methodName()\")\n\n              div {\n                classes = setOf(\"member-left\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-modifiers\", \"member-deprecated\")\n                    } else setOf(\"member-modifiers\")\n\n                  renderModifiers(method.modifiers, \"function\")\n                }\n              }\n\n              div {\n                classes = setOf(\"member-main\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember)\n                      setOf(\"member-signature\", \"member-deprecated\")\n                    else setOf(\"member-signature\")\n\n                  if (isInherited) renderClassContext(method)\n\n                  span {\n                    classes = setOf(\"name-decl\")\n\n                    +method.simpleName.asIdentifier\n                  }\n\n                  renderTypeParameters(method.typeParameters)\n\n                  renderMethodParameters(method, methodScope)\n\n                  +\": \"\n                  renderType(method.returnType, methodScope)\n\n                  if (isInherited) {\n                    renderModuleContext(method)\n                  }\n                  renderMemberSourceLink(method)\n                }\n\n                memberDocs.renderDocComment(this)\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderTypeParameters(parameters: List<TypeParameter>) {\n    if (parameters.isEmpty()) return\n\n    +\"<\"\n    var first = true\n    parameters.forEachIndexed { idx, param ->\n      if (first) first = false else +\", \"\n      when (param.variance) {\n        Variance.CONTRAVARIANT -> +\"in \"\n        Variance.COVARIANT -> +\"out \"\n        else -> {}\n      }\n      a {\n        classes = setOf(\"param${idx + 1}\")\n        +param.name\n      }\n    }\n    +\">\"\n  }\n\n  private fun HtmlBlockTag.renderMethodParameters(method: Method, methodScope: MethodScope) {\n    +\"(\"\n    var first = true\n    val indexOffset = method.typeParameters.size\n    method.parameters.entries.forEachIndexed { idx, (name, type) ->\n      if (first) first = false else +\", \"\n      span {\n        classes = setOf(\"param${indexOffset + idx + 1}\")\n        +name\n      }\n      +\": \"\n      renderType(type, methodScope)\n    }\n    +\")\"\n  }\n\n  protected fun HtmlBlockTag.renderMemberSourceLink(member: Member) {\n    // Prevent churn by setting static line numbers.\n    // This is so our doc generator tests don't break if, say, we change sources in the stdlib.\n    val startLine = if (isTestMode) 123 else member.sourceLocation.startLine()\n    val endLine = if (isTestMode) 456 else member.sourceLocation.endLine()\n    val moduleSourceUrl =\n      pageScope.resolveModuleNameToSourceUrl(\n        member.moduleName,\n        Member.SourceLocation(startLine, endLine),\n      ) ?: return\n    a {\n      classes = setOf(\"member-source-link\")\n      href = moduleSourceUrl.toString()\n      +\"Source\"\n    }\n  }\n\n  protected fun HtmlBlockTag.renderShowInheritedButton() {\n    span {\n      classes = setOf(\"toggle-inherited-members\")\n      +\"(\"\n      span {\n        classes = setOf(\"toggle-inherited-members-link\", \"button-link\")\n        +\"show inherited\"\n      }\n      +\")\"\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/ModulePageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlinx.html.*\n\ninternal class ModulePageGenerator(\n  docsiteInfo: DocsiteInfo,\n  docPackage: DocPackage,\n  docModule: DocModule,\n  pageScope: ModuleScope,\n  isTestMode: Boolean,\n  consoleOut: OutputStream,\n) :\n  ModuleOrClassPageGenerator<ModuleScope>(\n    docsiteInfo,\n    docModule.schema.moduleClass,\n    pageScope,\n    isTestMode,\n    consoleOut,\n  ) {\n  private val module = docModule.schema\n\n  override val html: HTML.() -> Unit = {\n    renderHtmlHead()\n\n    body {\n      onLoad = \"onLoad()\"\n\n      renderPageHeader(docPackage.name, docPackage.version, docModule.name, null)\n\n      main {\n        renderParentLinks()\n\n        h1 {\n          id = \"declaration-title\"\n\n          +docModule.name.asModuleName\n\n          span {\n            id = \"declaration-version\"\n            +docPackage.version\n          }\n        }\n\n        val memberDocs =\n          MemberDocs(\n            clazz.docComment,\n            pageScope,\n            clazz.annotations,\n            isDeclaration = true,\n            collectMemberInfo(docModule),\n          )\n\n        renderMemberGroupLinks(\n          Triple(\"Overview\", \"#_overview\", memberDocs.isExpandable),\n          Triple(\"Properties\", \"#_properties\", clazz.hasListedProperty),\n          Triple(\"Methods\", \"#_methods\", clazz.hasListedMethod),\n          Triple(\"Classes\", \"#_classes\", module.hasListedClass),\n          Triple(\"Type Aliases\", \"#_type-aliases\", module.hasListedTypeAlias),\n        )\n\n        renderAnchor(\"_overview\")\n        div {\n          id = \"_declaration\"\n          classes = setOf(\"member\")\n\n          memberDocs.renderExpandIcon(this)\n\n          div {\n            classes = setOf(\"member-signature\")\n\n            renderModifiers(module.moduleClass.modifiers, \"module\")\n\n            span {\n              classes = setOf(\"name-decl\")\n\n              +docModule.name.asModuleName\n            }\n\n            renderModuleAmendsOrExtendsClause(module)\n          }\n\n          memberDocs.renderDocComment(this)\n        }\n\n        renderProperties()\n        renderMethods()\n        renderClasses()\n        renderTypeAliases()\n      }\n    }\n  }\n\n  // example output:\n  // module PodSpec (pkg.pkl-lang.org/pkl-k8s/k8s:1.0.0) • Package Docs\n  override fun HTMLTag.renderPageTitle() {\n    val moduleScope = pageScope\n    val packageScope = moduleScope.parent!!\n\n    +moduleScope.name.substringAfterLast('.')\n    +\" (\"\n    +packageScope.name\n    +moduleScope.name.drop(packageScope.name.length).substringBeforeLast('.').replace('.', '/')\n    +\":\"\n    +packageScope.version\n    +\") • \"\n    +(docsiteInfo.title ?: \"Pkldoc\")\n  }\n\n  private fun HtmlBlockTag.renderTypeAliases() {\n    if (!module.hasListedTypeAlias) return\n\n    div {\n      classes = setOf(\"member-group\")\n\n      renderAnchor(\"_type-aliases\")\n\n      h2 {\n        classes = setOf(\"member-group-title\")\n\n        +\"Type Aliases\"\n        if (module.supermodule.hasListedTypeAlias) {\n          renderShowInheritedButton()\n        }\n      }\n\n      ul {\n        for ((typeAliasName, typeAlias) in module.allTypeAliases) {\n          if (typeAlias.isUnlisted) continue\n\n          li {\n            renderAnchors(typeAlias)\n\n            div {\n              val isInherited = typeAliasName !in module.typeAliases\n              classes =\n                if (isInherited) {\n                  setOf(\"member\", \"inherited\", \"expandable\", \"hidden\", \"collapsed\")\n                } else setOf(\"member\")\n\n              val typeAliasScope = TypeAliasScope(typeAlias, pageScope.url, pageScope)\n              val memberDocs =\n                MemberDocs(typeAlias.docComment, typeAliasScope, typeAlias.annotations)\n\n              memberDocs.renderExpandIcon(this)\n              renderSelfLink(typeAliasName)\n\n              div {\n                classes = setOf(\"member-left\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-modifiers\", \"member-deprecated\")\n                    } else setOf(\"member-modifiers\")\n\n                  renderModifiers(typeAlias.modifiers, \"typealias\")\n                }\n              }\n\n              div {\n                classes = setOf(\"member-main\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-signature\", \"member-deprecated\")\n                    } else setOf(\"member-signature\")\n\n                  renderTypeAliasName(typeAlias, \"name-decl\")\n                  renderTypeParameters(typeAlias.typeParameters)\n                  +\" = \"\n                  renderType(typeAlias.aliasedType, typeAliasScope)\n\n                  if (isInherited) {\n                    renderModuleContext(typeAlias)\n                  }\n                  renderMemberSourceLink(typeAlias)\n                }\n\n                memberDocs.renderDocComment(this)\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private fun HtmlBlockTag.renderClasses() {\n    if (!module.hasListedClass) return\n\n    div {\n      classes = setOf(\"member-group\")\n\n      renderAnchor(\"_classes\")\n\n      h2 {\n        classes = setOf(\"member-group-title\")\n\n        +\"Classes\"\n        if (module.supermodule.hasListedClass) {\n          renderShowInheritedButton()\n        }\n      }\n\n      ul {\n        for ((className, clazz) in module.allClasses) {\n          if (clazz.isUnlisted) continue\n\n          li {\n            renderAnchor(className)\n\n            div {\n              val isInherited = className !in module.classes\n              classes =\n                if (isInherited) {\n                  setOf(\n                    \"member\",\n                    \"with-page-link\",\n                    \"inherited\",\n                    \"expandable\",\n                    \"hidden\",\n                    \"collapsed\",\n                  )\n                } else setOf(\"member\", \"with-page-link\")\n\n              val classScope = ClassScope(clazz, pageScope.url, pageScope)\n              val memberDocs = MemberDocs(clazz.docComment, classScope, clazz.annotations)\n\n              memberDocs.renderExpandIcon(this)\n              renderSelfLink(className)\n\n              div {\n                classes = setOf(\"member-left\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-modifiers\", \"member-deprecated\")\n                    } else setOf(\"member-modifiers\")\n\n                  renderModifiers(clazz.modifiers, \"class\")\n                }\n              }\n\n              div {\n                classes = setOf(\"member-main\")\n\n                div {\n                  classes =\n                    if (memberDocs.isDeprecatedMember) {\n                      setOf(\"member-signature\", \"member-deprecated\")\n                    } else setOf(\"member-signature\")\n\n                  renderClassName(clazz, \"name-decl\")\n                  renderTypeParameters(clazz.typeParameters)\n                  renderClassExtendsClause(clazz, classScope)\n\n                  if (isInherited) {\n                    renderModuleContext(clazz)\n                  }\n                  renderMemberSourceLink(clazz)\n                }\n\n                memberDocs.renderDocComment(this)\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/PackageDataGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.IOException\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.writer\nimport kotlinx.serialization.*\nimport kotlinx.serialization.json.Json\nimport org.pkl.commons.readString\nimport org.pkl.commons.toUri\nimport org.pkl.core.*\nimport org.pkl.core.packages.PackageUri\nimport org.pkl.core.util.IoUtils\n\n/**\n * Reads and writes package-data.json, which contains enough information to include a package's\n * previously generated docs in a newly generated doc website. This is useful if there's a problem\n * with fetching or evaluating the latest package version.\n */\ninternal class PackageDataGenerator(private val outputDir: Path, consoleOut: OutputStream) :\n  AbstractGenerator(consoleOut) {\n  fun generate(pkg: DocPackage) {\n    val path =\n      outputDir\n        .resolve(pkg.name.pathEncoded)\n        .resolve(pkg.version)\n        .resolve(\"package-data.json\")\n        .apply { createParentDirectories() }\n    PackageData(pkg).write(path)\n  }\n}\n\n/** Uniquely identifies a specific version of a package, module, class, or type alias. */\ninternal sealed class ElementRef<T : ElementRef<T>> {\n  /** The package name. */\n  abstract val pkg: String\n\n  /// The URI of the package, if any\n  abstract val pkgUri: URI?\n\n  /** The package version. */\n  abstract val version: String\n\n  /** The Pkldoc page URL of the element relative to its Pkldoc website root. */\n  val htmlPath: String by lazy { \"$basePath/${version.pathEncoded}/$packageRelativeHtmlPath\" }\n\n  /** The Pkldoc runtime data JSON path for this ref. */\n  val perPackageRuntimeDataPath: String by lazy { \"data/$basePath/_/$packageRelativeDataPath\" }\n\n  /** The Pkldoc runtime data JSON path for this ref at a per-version level. */\n  val perPackageVersionRuntimeDataPath: String by lazy {\n    \"data/$basePath/${version.pathEncoded}/$packageRelativeDataPath\"\n  }\n\n  /** The legacy runtime data path () */\n  val legacyVersionedRuntimeDataPath: String by lazy {\n    \"data/$basePath/${version.pathEncoded}/${packageRelativeDataPath.substringBeforeLast(\".json\") + \".js\"}\"\n  }\n\n  /**\n   * The Pkldoc page URL of the element relative to [other]'s page URL. Assumes that both elements\n   * have the same Pkldoc website root.\n   */\n  fun pageUrlRelativeTo(other: ElementRef<*>): String {\n    return IoUtils.relativize(htmlPath.toUri(), other.htmlPath.toUri()).toString()\n  }\n\n  /** The Pkldoc page URL for my element with a different veresion. */\n  fun pageUrlForVersion(version: String): String {\n    val pathToBasePath = IoUtils.relativize(basePath.toUri(), htmlPath.toUri()).toString()\n    return \"${pathToBasePath}${version.pathEncoded}/${withVersion(version).packageRelativeHtmlPath}\"\n  }\n\n  abstract fun withVersion(version: String): T\n\n  /** The HTML path within the package folder */\n  abstract val packageRelativeHtmlPath: String\n\n  /** The JSON path within the package folder */\n  abstract val packageRelativeDataPath: String\n\n  fun isInSamePackageAs(other: ElementRef<T>): Boolean =\n    pkg == other.pkg && pkgUri == other.pkgUri && version == other.version\n\n  val basePath: String\n    get() =\n      if (pkgUri?.scheme == \"package\")\n        \"${pkgUri!!.authority}${PackageUri(pkgUri!!).pathWithoutVersion}\".pathEncoded\n      else pkg.pathEncoded\n}\n\n/** Uniquely identifies a specific version of a package. */\n@Serializable\ninternal data class PackageRef(\n  /** The package name. */\n  override val pkg: String,\n\n  /** The package's URI, if any. */\n  override val pkgUri: @Contextual URI?,\n\n  /** The package version. */\n  override val version: String,\n) : ElementRef<PackageRef>() {\n  override val packageRelativeHtmlPath: String = \"index.html\"\n\n  override val packageRelativeDataPath: String = \"index.json\"\n\n  override fun withVersion(version: String): PackageRef = copy(version = version)\n}\n\n/** Uniquely identifies a specific version of a module. */\n@Serializable\ninternal data class ModuleRef(\n  /** The package name. */\n  override val pkg: String,\n\n  /** The package's URI, if any. */\n  override val pkgUri: @Contextual URI?,\n\n  /** The package version. */\n  override val version: String,\n\n  /** The module path. */\n  val module: String,\n) : ElementRef<ModuleRef>() {\n  override val packageRelativeHtmlPath: String by lazy { \"${module.pathEncoded}/index.html\" }\n\n  override val packageRelativeDataPath: String\n    get() = \"$module/index.json\".pathEncoded\n\n  override fun withVersion(version: String): ModuleRef = copy(version = version)\n\n  val id: ModuleId by lazy { ModuleId(pkg, module) }\n\n  val fullName: String by lazy { \"$pkg.${module.replace('/', '.')}\" }\n}\n\n/** Uniquely identifies a specific version of a class or type alias. */\n@Serializable\ninternal data class TypeRef(\n  /** The package name. */\n  override val pkg: String,\n\n  /** The package's URI, if any. */\n  override val pkgUri: @Contextual URI?,\n\n  /** The package version. */\n  override val version: String,\n\n  /** The module path. */\n  val module: String,\n\n  /** The simple type name. */\n  val type: String,\n\n  /** Whether this is a type alias rather than a class. */\n  val isTypeAlias: Boolean = false,\n) : ElementRef<TypeRef>() {\n\n  val id: TypeId by lazy { TypeId(pkg, module, type) }\n\n  val displayName: String by lazy { if (isModuleClass) module.substringAfterLast('/') else type }\n\n  override val packageRelativeHtmlPath: String by lazy {\n    when {\n      isTypeAlias -> \"$module/index.html#$type\".pathEncoded\n      isModuleClass -> \"$module/index.html\".pathEncoded\n      else -> \"$module/$type.html\".pathEncoded\n    }\n  }\n\n  override val packageRelativeDataPath: String\n    get() {\n      // typealiases don't have their own runtime data.\n      require(!isTypeAlias) { \"typealiases don't have runtime data\" }\n      return when {\n        isModuleClass -> \"$module/index.json\".pathEncoded\n        else -> \"$module/$type.json\".pathEncoded\n      }\n    }\n\n  override fun withVersion(version: String): TypeRef = copy(version = version)\n\n  private val isModuleClass: Boolean\n    get() = type == PClassInfo.MODULE_CLASS_NAME\n}\n\n/** Uniquely identifies a package (modulo its version). */\ninternal typealias PackageId = String\n\n/** Uniquely identifies a module (modulo its version). */\ninternal data class ModuleId(val pkg: String, val module: String)\n\n/** Uniquely identifies a class or type alias (modulo its version). */\ninternal data class TypeId(val pkg: String, val module: String, val type: String)\n\n/**\n * Persisted data for a package. Used by subsequent Pkldoc runs to generate main page and runtime\n * data (e.g., package versions and usages).\n */\n@Serializable\ninternal class PackageData(\n  /** The ref of this package. */\n  val ref: PackageRef,\n\n  /** The first paragraph of the overview documentation for this package. */\n  val summary: String? = null,\n\n  /** The deprecation message of this package, or `null` if this package isn't deprecated. */\n  val deprecation: String? = null,\n\n  /** The web URL of the source code for this package. */\n  val sourceCode: @Contextual URI?,\n\n  /** The source code pattern, with placeholders (e.g. `%{path}`) */\n  val sourceCodeUrlScheme: String?,\n\n  /** The dependencies of this package. */\n  val dependencies: List<DependencyData> = listOf(),\n\n  /** The modules in this package. */\n  val modules: List<ModuleData> = listOf(),\n) {\n  companion object {\n    val json = Json { serializersModule = serializers }\n\n    fun read(path: Path): PackageData {\n      val jsonStr: String =\n        try {\n          path.readString()\n        } catch (e: IOException) {\n          throw DocGeneratorBugException(\"I/O error reading `${path.toUri()}`.\", e)\n        }\n\n      return try {\n        json.decodeFromString(jsonStr)\n      } catch (e: SerializationException) {\n        throw DocGeneratorBugException(\"Error deserializing `${path.toUri()}`.\", e)\n      }\n    }\n  }\n\n  constructor(\n    pkg: DocPackage\n  ) : this(\n    PackageRef(pkg.name, pkg.uri, pkg.version),\n    getDocCommentSummary(pkg.overview),\n    pkg.docPackageInfo.annotations.deprecation,\n    pkg.docPackageInfo.sourceCode,\n    pkg.docPackageInfo.sourceCodeUrlScheme,\n    pkg.docPackageInfo.dependencies.map { DependencyData(PackageRef(it.name, it.uri, it.version)) },\n    pkg.docModules.mapNotNull { if (it.isUnlisted) null else ModuleData(pkg, it) },\n  )\n\n  fun write(path: Path) {\n    val jsonStr =\n      try {\n        json.encodeToString(this)\n      } catch (e: SerializationException) {\n        throw DocGeneratorBugException(\"Error serializing `$path`.\", e)\n      }\n\n    try {\n      path.createParentDirectories()\n      path.writer().use { it.write(jsonStr) }\n    } catch (e: IOException) {\n      throw DocGeneratorBugException(\"I/O error writing `$path`.\", e)\n    }\n  }\n}\n\n/** A package depended upon by [PackageData]. */\n@Serializable\ninternal class DependencyData(\n  /** The ref of the depended-on package. */\n  val ref: PackageRef\n)\n\n/** Persisted data for a module. */\n@Serializable\ninternal class ModuleData(\n  /** The ref of this module. */\n  val ref: ModuleRef,\n\n  /** The first paragraph of the overview documentation for this module. */\n  @Suppress(\"unused\") val summary: String? = null,\n\n  /** The deprecation message, or `null` if this module isn't deprecated. */\n  val deprecation: String? = null,\n\n  /** The supermodules of this module, starting from the direct supermodule. */\n  @Suppress(\"unused\") val supermodules: List<ModuleRef> = listOf(),\n\n  /** The class of this module, or `null` if this module amends another module. */\n  val moduleClass: ClassData? = null,\n\n  /** The classes declared in this module. */\n  val classes: List<ClassData> = listOf(),\n\n  /** The type aliases declared in this module. */\n  @Suppress(\"unused\") val typeAliases: List<TypeAliasData> = listOf(),\n) {\n  constructor(\n    pkg: DocPackage,\n    module: DocModule,\n  ) : this(\n    ModuleRef(pkg.name, pkg.uri, pkg.version, module.path),\n    getDocCommentSummary(module.overview),\n    module.schema.annotations.deprecation,\n    generateSequence(module.schema.supermodule) { it.supermodule }\n      .map { pkg.docPackageInfo.getModuleRef(module.name) }\n      .filterNotNull()\n      .toList(),\n    if (module.schema.isAmend) null else ClassData(pkg, module, module.schema.moduleClass),\n    module.schema.classes.mapNotNull {\n      if (it.value.isUnlisted) null else ClassData(pkg, module, it.value)\n    },\n    module.schema.typeAliases.mapNotNull {\n      if (it.value.isUnlisted) null else TypeAliasData(pkg, module, it.value)\n    },\n  )\n}\n\n/** Persisted data for a class or type alias. */\n@Serializable\ninternal sealed class TypeData {\n  /** The ref of this type. */\n  abstract val ref: TypeRef\n\n  /**\n   * The classes (including module classes) used in the API of this type. Standard library classes\n   * are not included.\n   */\n  abstract val usedTypes: List<TypeRef>\n}\n\n/** Persisted data for a class. */\n@Serializable\ninternal class ClassData(\n  override val ref: TypeRef,\n\n  /**\n   * The superclasses of this class, starting from the direct superclass. Every class except\n   * `pkl.Any` has a superclass.\n   */\n  val superclasses: List<TypeRef> = listOf(),\n  override val usedTypes: List<TypeRef> = listOf(),\n) : TypeData() {\n  constructor(\n    pkg: DocPackage,\n    module: DocModule,\n    clazz: PClass,\n  ) : this(\n    TypeRef(pkg.name, pkg.uri, pkg.version, module.path, clazz.simpleName),\n    generateSequence(clazz.superclass) { it.superclass }\n      .map { pkg.docPackageInfo.getTypeRef(it) }\n      .filterNotNull()\n      .toList(),\n    findTypesUsedBy(clazz, pkg.docPackageInfo).toList(),\n  )\n}\n\n/** Persisted data for a type alias. */\n@Serializable\ninternal class TypeAliasData(\n  /** The ref of this type alias. */\n  override val ref: TypeRef,\n\n  /** The types used by this type alias. */\n  override val usedTypes: List<TypeRef> = listOf(),\n) : TypeData() {\n  constructor(\n    pkg: DocPackage,\n    module: DocModule,\n    alias: TypeAlias,\n  ) : this(\n    TypeRef(pkg.name, pkg.uri, pkg.version, module.path, alias.simpleName, isTypeAlias = true),\n    findTypesUsedBy(alias, pkg.docPackageInfo).toList(),\n  )\n}\n\nprivate fun findTypesUsedBy(clazz: PClass, enclosingPackage: DocPackageInfo): Set<TypeRef> {\n  val result = mutableSetOf<TypeRef>()\n  clazz.supertype?.let { supertype ->\n    for (typeArgument in supertype.typeArguments) {\n      findTypesUsedBy(typeArgument, clazz, enclosingPackage, result)\n    }\n  }\n  for ((_, property) in clazz.properties) {\n    findTypesUsedBy(property.type, clazz, enclosingPackage, result)\n  }\n  for ((_, method) in clazz.methods) {\n    for ((_, type) in method.parameters) {\n      findTypesUsedBy(type, clazz, enclosingPackage, result)\n    }\n    findTypesUsedBy(method.returnType, clazz, enclosingPackage, result)\n  }\n\n  return result\n}\n\nprivate fun findTypesUsedBy(alias: TypeAlias, enclosingPackage: DocPackageInfo): Set<TypeRef> {\n  val result = mutableSetOf<TypeRef>()\n  findTypesUsedBy(alias.aliasedType, alias, enclosingPackage, result)\n  return result\n}\n\nprivate fun findTypesUsedBy(\n  type: PType,\n  enclosingType: Member /* PClass|TypeAlias */,\n  enclosingPackage: DocPackageInfo,\n  result: MutableSet<TypeRef>,\n) {\n  when (type) {\n    is PType.Class -> {\n      val target = type.pClass\n      if (!target.isStandardLibraryMember && !target.isUnlisted && target != enclosingType) {\n        enclosingPackage.getTypeRef(target)?.let { result.add(it) }\n      }\n      for (typeArgument in type.typeArguments) {\n        findTypesUsedBy(typeArgument, enclosingType, enclosingPackage, result)\n      }\n    }\n    is PType.Alias -> {\n      val target = type.typeAlias\n      if (!target.isStandardLibraryMember && !target.isUnlisted && target != enclosingType) {\n        enclosingPackage.getTypeRef(target)?.let { result.add(it) }\n      }\n    }\n    is PType.Constrained -> {\n      findTypesUsedBy(type.baseType, enclosingType, enclosingPackage, result)\n    }\n    is PType.Function -> {\n      for (parameterType in type.parameterTypes) {\n        findTypesUsedBy(parameterType, enclosingType, enclosingPackage, result)\n      }\n      findTypesUsedBy(type.returnType, enclosingType, enclosingPackage, result)\n    }\n    PType.MODULE -> {\n      if (enclosingType.simpleName != PClassInfo.MODULE_CLASS_NAME) {\n        result.add(\n          TypeRef(\n            enclosingPackage.name,\n            enclosingPackage.uri,\n            enclosingPackage.version,\n            enclosingType.moduleName\n              .substring(enclosingPackage.moduleNamePrefix.length)\n              .replace('.', '/'),\n            PClassInfo.MODULE_CLASS_NAME,\n          )\n        )\n      }\n    }\n    PType.NOTHING -> {}\n    is PType.Nullable -> {\n      findTypesUsedBy(type.baseType, enclosingType, enclosingPackage, result)\n    }\n    is PType.Union -> {\n      for (elementType in type.elementTypes) {\n        findTypesUsedBy(elementType, enclosingType, enclosingPackage, result)\n      }\n    }\n    is PType.StringLiteral -> {}\n    is PType.TypeVariable -> {}\n    PType.UNKNOWN -> {}\n    else -> {\n      throw AssertionError(\"Unknown PType: $type\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/PackagePageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlinx.html.*\n\ninternal class PackagePageGenerator(\n  docsiteInfo: DocsiteInfo,\n  private val docPackage: DocPackage,\n  pageScope: PackageScope,\n  consoleOut: OutputStream,\n) : MainOrPackagePageGenerator<PackageScope>(docsiteInfo, pageScope, consoleOut) {\n  override val html: HTML.() -> Unit = {\n    renderHtmlHead()\n\n    body {\n      onLoad = \"onLoad()\"\n\n      renderPageHeader(docPackage.name, docPackage.version, null, null)\n\n      main {\n        renderParentLinks()\n\n        h1 {\n          id = \"declaration-title\"\n          +docPackage.name\n\n          span {\n            id = \"declaration-version\"\n            +docPackage.version\n          }\n        }\n\n        val packageInfo = docPackage.docPackageInfo\n        val memberDocs =\n          MemberDocs(\n            packageInfo.overview,\n            pageScope,\n            packageInfo.annotations,\n            isDeclaration = true,\n            collectMemberInfoForPackage(docPackage),\n          )\n\n        renderMemberGroupLinks(\n          Triple(\"Overview\", \"#_overview\", memberDocs.isExpandable),\n          Triple(\"Modules\", \"#_modules\", docPackage.hasListedModule),\n        )\n\n        renderAnchor(\"_overview\")\n        div {\n          id = \"_declaration\"\n          classes = setOf(\"member\")\n\n          memberDocs.renderExpandIcon(this)\n\n          div {\n            classes = setOf(\"member-signature\")\n\n            renderModifiers(setOf(), \"package\")\n\n            span {\n              classes = setOf(\"name-decl\")\n\n              +docPackage.name\n            }\n          }\n\n          memberDocs.renderDocComment(this)\n        }\n\n        renderModules()\n      }\n    }\n  }\n\n  // example output:\n  // package pkg.pkl-lang.org/pkl-k8s/k8s (1.0.0) • Package Docs\n  override fun HTMLTag.renderPageTitle() {\n    +pageScope.name\n    +\" (\"\n    +pageScope.version\n    +\") • \"\n    +(docsiteInfo.title ?: \"Pkldoc\")\n  }\n\n  private fun HtmlBlockTag.renderModules() {\n    if (!docPackage.hasListedModule) return\n\n    div {\n      classes = setOf(\"member-group\")\n\n      renderAnchor(\"_modules\")\n\n      h2 {\n        classes = setOf(\"member-group-title\")\n\n        +\"Modules\"\n      }\n\n      ul {\n        for (docModule in docPackage.docModules) {\n          if (docModule.isUnlisted) continue\n\n          val module = docModule.schema\n          val moduleScope = pageScope.getModule(module.moduleName)\n          val memberDocs =\n            MemberDocs(\n              module.docComment,\n              moduleScope,\n              module.annotations,\n              extraMemberInfo = collectMemberInfo(docModule),\n            )\n\n          renderModuleOrPackage(module.moduleName, moduleScope, memberDocs)\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/PageGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport kotlin.io.path.bufferedWriter\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.exists\nimport kotlinx.html.*\nimport kotlinx.html.stream.appendHTML\nimport kotlinx.serialization.json.Json\nimport org.commonmark.ext.gfm.tables.TablesExtension\nimport org.commonmark.parser.Parser\nimport org.commonmark.renderer.html.HtmlRenderer\nimport org.pkl.commons.toPath\nimport org.pkl.core.*\nimport org.pkl.core.util.IoUtils\n\ninternal abstract class PageGenerator<out S>(\n  protected val docsiteInfo: DocsiteInfo,\n  protected val pageScope: S,\n  consoleOut: OutputStream,\n) : AbstractGenerator(consoleOut) where S : PageScope {\n  companion object {\n    private val json = Json {}\n  }\n\n  private val markdownInlineParserFactory = MarkdownParserFactory(pageScope)\n\n  private val markdownParser =\n    Parser.builder()\n      .extensions(listOf(TablesExtension.create()))\n      .inlineParserFactory(markdownInlineParserFactory)\n      .build()\n\n  private val markdownRenderer =\n    HtmlRenderer.builder()\n      .extensions(listOf(TablesExtension.create()))\n      .nodeRendererFactory { MarkdownNodeRenderer(it) }\n      .build()\n\n  fun run() {\n    val path = pageScope.url.toPath()\n    path.createParentDirectories()\n    path.bufferedWriter().use { writer ->\n      writer.appendLine(\"<!DOCTYPE html>\")\n      writer.appendHTML().html(null, html)\n    }\n    writeOutput(\"Wrote file ${pageScope.url}\\r\")\n  }\n\n  protected abstract val html: HTML.() -> Unit\n\n  protected abstract fun HTMLTag.renderPageTitle()\n\n  private fun DocScope?.getVersion(): String? {\n    return when (this) {\n      null -> null\n      is SiteScope -> null\n      is PackageScope -> version\n      else -> parent?.getVersion()\n    }\n  }\n\n  protected fun HTML.renderHtmlHead() {\n    lang = \"en-US\"\n\n    head {\n      meta { charset = \"UTF-8\" }\n      title { renderPageTitle() }\n      script {\n        src = pageScope.relativeSiteUrl.resolve(\"scripts/pkldoc.js\").toString()\n        defer = true\n      }\n      pageScope.getVersion()?.let { version ->\n        script {\n          type = \"module\"\n          unsafe {\n            val packageVersionUrl =\n              IoUtils.relativize(pageScope.perPackageDataUrl, pageScope.url).toString()\n            val perPackageVersionUrl =\n              IoUtils.relativize(pageScope.perPackageVersionDataUrl, pageScope.url).toString()\n\n            raw(\n              \"\"\"\n      import perPackageData from \"$packageVersionUrl\" with { type: \"json\" }\n      import perPackageVersionData from \"$perPackageVersionUrl\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, ${json.encodeToString(version)});\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            \"\"\"\n            )\n          }\n        }\n      }\n      script {\n        src = pageScope.relativeSiteUrl.resolve(\"scripts/scroll-into-view.min.js\").toString()\n        defer = true\n      }\n      link {\n        href = pageScope.relativeSiteUrl.resolve(\"styles/pkldoc.css\").toString()\n        media = \"screen\"\n        type = \"text/css\"\n        rel = \"stylesheet\"\n      }\n      link {\n        rel = \"icon\"\n        type = \"image/svg+xml\"\n        href = pageScope.relativeSiteUrl.resolve(\"images/favicon.svg\").toString()\n      }\n      link {\n        rel = \"apple-touch-icon\"\n        sizes = \"180x180\"\n        href = pageScope.relativeSiteUrl.resolve(\"images/apple-touch-icon.png\").toString()\n      }\n      link {\n        rel = \"icon\"\n        type = \"image/png\"\n        sizes = \"32x32\"\n        href = pageScope.relativeSiteUrl.resolve(\"images/favicon-32x32.png\").toString()\n      }\n      link {\n        rel = \"icon\"\n        type = \"image/png\"\n        sizes = \"16x16\"\n        href = pageScope.relativeSiteUrl.resolve(\"images/favicon-16x16.png\").toString()\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderPageHeader(\n    packageName: String?,\n    packageVersion: String?,\n    moduleName: String?,\n    className: String?,\n  ) {\n    header {\n      if (docsiteInfo.title != null) {\n        div {\n          id = \"doc-title\"\n\n          a {\n            href = pageScope.relativeSiteUrl.toString()\n            +docsiteInfo.title\n          }\n        }\n      }\n\n      div {\n        id = \"search\"\n\n        label {\n          htmlFor = \"search-input\"\n          i {\n            id = \"search-icon\"\n            classes = setOf(\"material-icons\")\n            +\"search\"\n          }\n        }\n\n        input {\n          id = \"search-input\"\n          type = InputType.search\n          placeholder =\n            if (packageName == null) {\n              \"Click or press 'S' to search\"\n            } else {\n              \"Click or press 'S' to search this package\"\n            }\n          autoComplete = false\n          if (packageName != null) {\n            require(packageVersion != null)\n            attributes[\"data-package-name\"] = packageName\n            attributes[\"data-package-version\"] = packageVersion\n            attributes[\"data-package-url-prefix\"] =\n              \"../\".repeat(pageScope.relativePackageUrl.path.count { it == '/' })\n          }\n          if (moduleName != null) {\n            attributes[\"data-module-name\"] = moduleName\n          }\n          if (className != null) {\n            attributes[\"data-class-name\"] = className\n          }\n          attributes[\"data-root-url-prefix\"] =\n            \"../\".repeat(pageScope.relativeSiteUrl.path.count { it == '/' })\n        }\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderParentLinks() {\n    a {\n      classes = setOf(\"declaration-parent-link\")\n      href = pageScope.relativeSiteUrl.toString()\n\n      +(docsiteInfo.title ?: \"Pkldoc\")\n    }\n\n    val packageScope =\n      when (pageScope) {\n        is ClassScope -> pageScope.parent!!.parent\n        is ModuleScope -> pageScope.parent\n        else -> null\n      }\n\n    if (packageScope != null) {\n      +\" > \"\n\n      a {\n        classes = setOf(\"declaration-parent-link\")\n        href = packageScope.urlRelativeTo(pageScope).toString()\n\n        +packageScope.name\n      }\n    }\n\n    val moduleScope =\n      when (pageScope) {\n        is ClassScope -> pageScope.parent\n        else -> null\n      }\n\n    if (moduleScope != null) {\n      +\" > \"\n\n      a {\n        classes = setOf(\"declaration-parent-link\")\n        href = moduleScope.urlRelativeTo(pageScope).toString()\n\n        +moduleScope.name\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderClassExtendsClause(clazz: PClass, currScope: DocScope) {\n    val superclass = clazz.superclass ?: return\n    if (superclass.info != PClassInfo.Typed) {\n      +\" extends \"\n      renderType(clazz.supertype!!, currScope)\n    }\n  }\n\n  protected fun HtmlBlockTag.renderModuleAmendsOrExtendsClause(module: ModuleSchema) {\n    module.supermodule?.let { supermodule ->\n      if (module.isAmend) +\" amends \" else +\" extends \"\n      renderModuleName(supermodule.moduleName)\n    }\n  }\n\n  protected fun HtmlBlockTag.renderMemberGroupLinks(\n    vararg groups: Triple<String, String, Boolean>\n  ) {\n    ul {\n      classes = setOf(\"member-group-links\")\n      for ((name, href, show) in groups) {\n        if (show) {\n          li {\n            a {\n              this.href = href\n              +name\n            }\n          }\n        }\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderModuleName(moduleName: String) {\n    val moduleDocUrl = pageScope.resolveModuleNameToRelativeDocUrl(moduleName)\n\n    if (moduleDocUrl != null) {\n      a {\n        href = moduleDocUrl.toString()\n        classes = setOf(\"name-ref\")\n        +moduleName\n      }\n    } else {\n      span {\n        classes = setOf(\"member-ref\")\n        +moduleName\n      }\n    }\n  }\n\n  private val PClass.simpleDisplayName: String\n    get() = if (isModuleClass) moduleName.substring(moduleName.lastIndexOf('.') + 1) else simpleName\n\n  protected fun HtmlBlockTag.renderClassName(clazz: PClass, cssClass: String = \"name-ref\") {\n    val moduleDocUrl = pageScope.resolveModuleNameToDocUrl(clazz.moduleName)\n\n    if (moduleDocUrl != null) {\n      val targetScope = ClassScope(clazz, moduleDocUrl, null)\n      a {\n        href = targetScope.urlRelativeTo(pageScope).toString()\n        classes = setOf(cssClass)\n        +clazz.simpleDisplayName.asIdentifier\n      }\n    } else {\n      span {\n        classes = setOf(cssClass)\n        +clazz.simpleDisplayName.asIdentifier\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderTypeAliasName(\n    typeAlias: TypeAlias,\n    cssClass: String = \"name-ref\",\n  ) {\n    val moduleDocUrl = pageScope.resolveModuleNameToDocUrl(typeAlias.moduleName)\n\n    if (moduleDocUrl != null) {\n      val targetScope = TypeAliasScope(typeAlias, moduleDocUrl, null)\n      a {\n        href = targetScope.urlRelativeTo(pageScope).toString()\n        classes = setOf(cssClass)\n        +typeAlias.simpleName.asIdentifier\n      }\n    } else {\n      span {\n        classes = setOf(cssClass)\n        +typeAlias.simpleName.asIdentifier\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderType(\n    type: PType,\n    currScope: DocScope,\n    isNested: Boolean = false,\n  ) {\n    when (type) {\n      PType.UNKNOWN -> {\n        +\"unknown\"\n      }\n      PType.NOTHING -> {\n        +\"nothing\"\n      }\n      PType.MODULE -> {\n        +\"module\"\n      }\n      is PType.StringLiteral -> {\n        +\"\\\"${type.literal}\\\"\"\n      }\n      is PType.Class -> {\n        renderClassName(type.pClass)\n        renderTypeArguments(type.typeArguments, currScope)\n      }\n      is PType.Nullable -> {\n        renderType(type.baseType, currScope, true)\n        +\"?\"\n      }\n      is PType.Union -> {\n        if (isNested) +\"(\"\n        var first = true\n        for (elem in type.elementTypes) {\n          if (first) first = false else +\"|\"\n          renderType(elem, currScope, true)\n        }\n        if (isNested) +\")\"\n      }\n      is PType.Function -> {\n        +\"(\"\n        var first = true\n        for (paramType in type.parameterTypes) {\n          if (first) first = false else +\", \"\n          renderType(paramType, currScope, true)\n        }\n        +\")\"\n\n        +\" -> \"\n\n        renderType(type.returnType, currScope, true)\n      }\n      is PType.Constrained -> {\n        renderType(type.baseType, currScope, true)\n        +\"(\"\n        var first = true\n        for (constraint in type.constraints) {\n          if (first) first = false else +\", \"\n          +constraint\n        }\n        +\")\"\n      }\n      is PType.Alias -> {\n        renderTypeAliasName(type.typeAlias)\n        renderTypeArguments(type.typeArguments, currScope)\n      }\n      is PType.TypeVariable -> renderTypeVariable(type, currScope)\n      else -> throw AssertionError(\"Unknown PType: $type\")\n    }\n  }\n\n  private fun HtmlBlockTag.renderTypeArguments(typeArguments: List<PType>, currentScope: DocScope) {\n    if (typeArguments.isEmpty()) return\n\n    +\"<\"\n    var first = true\n    for (typeArg in typeArguments) {\n      if (first) first = false else +\", \"\n      renderType(typeArg, currentScope, true)\n    }\n    +\">\"\n\n    //    method.parameters.entries.forEachIndexed { idx, (name, type) ->\n    //      if (first) first = false else +\", \"\n    //      span {\n    //        classes = setOf(\"param${indexOffset + idx + 1}\")\n    //        +name\n    //      }\n    //      +\": \"\n    //      renderType(type, methodScope)\n    //    }\n  }\n\n  private fun HtmlBlockTag.renderTypeVariable(\n    typeVariable: PType.TypeVariable,\n    currentScope: DocScope,\n  ) {\n    val parameterScope = currentScope.resolveVariable(typeVariable.name) as? ParameterScope\n\n    if (parameterScope != null) {\n      a {\n        href = parameterScope.urlRelativeTo(pageScope).toString()\n        classes = setOf(\"name-ref\")\n        +typeVariable.name\n      }\n    } else {\n      span {\n        classes = setOf(\"name-ref\")\n        +typeVariable.name\n      }\n    }\n  }\n\n  protected fun HtmlBlockTag.renderModifiers(modifiers: Set<Modifier>, vararg additional: String) {\n    for (modifier in modifiers) {\n      +modifier.toString()\n      +\" \"\n    }\n    for (modifier in additional) {\n      +modifier\n      +\" \"\n    }\n  }\n\n  // best way I could find to offset anchors so that they aren't hidden behind fixed header when\n  // navigated to\n  // (tried several other CSS and JS solutions but all of them fell short in one way or another)\n  // this solution works both for same-page and cross-page links, allows :target selector on\n  // anchors, and requires no JS\n  protected fun HtmlBlockTag.renderAnchor(anchorId: String, cssClass: String = \"anchor\") {\n    div {\n      id = anchorId.uriEncodedComponent\n      classes = setOf(cssClass)\n      +\" \" // needs some content to be considered a valid anchor by browsers\n    }\n  }\n\n  protected fun HtmlBlockTag.renderAnchors(clazz: PClass) {\n    clazz.typeParameters.forEachIndexed { idx, param ->\n      renderAnchor(param.name, \"anchor-param${idx + 1}\")\n    }\n  }\n\n  protected fun HtmlBlockTag.renderAnchors(typeAlias: TypeAlias) {\n    val baseId = typeAlias.simpleName\n    renderAnchor(baseId)\n    typeAlias.typeParameters\n      .map { it.name }\n      .forEachIndexed { idx, param -> renderAnchor(\"$baseId.$param\", \"anchor-param${idx + 1}\") }\n  }\n\n  protected fun HtmlBlockTag.renderAnchors(method: PClass.Method) {\n    val baseId = \"${method.simpleName}()\"\n    renderAnchor(baseId)\n    (method.typeParameters.map { it.name } + method.parameters.keys).forEachIndexed { idx, param ->\n      renderAnchor(\"$baseId.$param\", \"anchor-param${idx + 1}\")\n    }\n  }\n\n  protected fun HtmlBlockTag.renderSelfLink(memberName: String) {\n    a {\n      classes = setOf(\"member-selflink\", \"material-icons\")\n      href = \"#${memberName.uriEncodedComponent}\"\n      +\"link\"\n    }\n  }\n\n  protected val runtimeDataClasses: Set<String> = setOf(\"runtime-data\", \"hidden\")\n\n  protected fun collectMemberInfoForPackage(\n    docPackage: DocPackage\n  ): Map<MemberInfoKey, HtmlBlockTag.() -> Unit> {\n    val result: MutableMap<MemberInfoKey, HtmlBlockTag.() -> Unit> = mutableMapOf()\n\n    if (docPackage.minPklVersion != null) {\n      result[MemberInfoKey(\"Pkl version\")] = { +\"${docPackage.minPklVersion} or higher\" }\n    }\n\n    if (docPackage.uri != null) {\n      result[MemberInfoKey(\"URI\")] = {\n        span {\n          classes = setOf(\"import-uri\")\n          +docPackage.uri.toString()\n        }\n        i {\n          classes = setOf(\"copy-uri-button\", \"material-icons\")\n          +\"content_copy\"\n        }\n      }\n    }\n\n    if (docPackage.docPackageInfo.authors?.isNotEmpty() == true) {\n      result[MemberInfoKey(\"Authors\")] = {\n        var first = true\n        for (author in docPackage.docPackageInfo.authors) {\n          if (first) first = false else +\", \"\n          +author\n        }\n      }\n    }\n\n    result[MemberInfoKey(\"Version\")] = { +docPackage.version }\n\n    if (docPackage.docPackageInfo.sourceCode != null) {\n      val sources = docPackage.docPackageInfo.sourceCode.toString()\n      result[MemberInfoKey(\"Source code\")] = {\n        a {\n          href = sources\n          +sources\n        }\n      }\n    }\n\n    if (docPackage.docPackageInfo.issueTracker != null) {\n      val issues = docPackage.docPackageInfo.issueTracker.toString()\n      result[MemberInfoKey(\"Issue tracker\")] = {\n        a {\n          href = issues\n          +issues\n        }\n      }\n    }\n\n    // Every package implicitly depends on `pkl`; omit to reduce noise.\n    val dependencies = docPackage.docPackageInfo.dependencies.filter { it.name != \"pkl\" }\n    if (dependencies.isNotEmpty()) {\n      result[MemberInfoKey(\"Dependencies\")] = {\n        var first = true\n        for (dep in dependencies) {\n          if (first) first = false else +\", \"\n          val link = getDependencyLink(dep)\n          if (link != null) {\n            a {\n              href = link\n              +dep.name\n              +\":\"\n              +dep.version\n            }\n          } else {\n            span { +\"${dep.name}:${dep.version}\" }\n          }\n        }\n      }\n    }\n\n    for ((key, value) in docPackage.docPackageInfo.extraAttributes) {\n      result[MemberInfoKey(key)] = { +value }\n    }\n\n    result[MemberInfoKey(\"Known usages\", runtimeDataClasses)] = {\n      id = HtmlConstants.KNOWN_USAGES\n      classes = runtimeDataClasses\n    }\n\n    result[MemberInfoKey(\"All versions\", runtimeDataClasses)] = {\n      id = HtmlConstants.KNOWN_VERSIONS\n      classes = runtimeDataClasses\n    }\n\n    return result\n  }\n\n  private fun getDependencyLink(dep: DocPackageInfo.PackageDependency): String? {\n    val siteScope = pageScope.siteScope ?: return null\n    return siteScope.packageScopes.values\n      .find { it.name == dep.qualifiedName }\n      ?.urlForVersionRelativeTo(pageScope, dep.version)\n      ?.toString() ?: findAlreadyExistingPackageScope(siteScope, dep.qualifiedName, dep.version)\n  }\n\n  private fun findAlreadyExistingPackageScope(\n    siteScope: SiteScope,\n    name: String,\n    version: String,\n  ): String? {\n    // hack: determine if we know about this dependency just by checking to see if the directory\n    // exists.\n    // we don't need to know if the specific _version_ exists (we assume that the version must be\n    // published by the docsite and tolerate possibly broken links).\n    val pkgPath = siteScope.outputDir.resolve(name.pathEncoded)\n    if (pkgPath.exists()) {\n      val targetPath = pkgPath.resolve(\"$version/index.html\")\n      val myUrl = pageScope.url\n      return IoUtils.relativize(targetPath.toUri(), myUrl).toString()\n    }\n    return null\n  }\n\n  protected class MemberInfoKey(val name: String, val classes: Set<String> = setOf())\n\n  protected fun collectMemberInfo(\n    docModule: DocModule\n  ): Map<MemberInfoKey, HtmlBlockTag.() -> Unit> {\n    val importUri = docModule.importUri\n    val sourceUrl = docModule.sourceUrl\n    val examples = docModule.examples\n\n    val result: MutableMap<MemberInfoKey, HtmlBlockTag.() -> Unit> = mutableMapOf()\n\n    result[MemberInfoKey(\"Module URI\")] = {\n      span {\n        classes = setOf(\"import-uri\")\n        +(importUri.toString())\n      }\n      i {\n        classes = setOf(\"copy-uri-button\", \"material-icons\")\n        +\"content_copy\"\n      }\n    }\n\n    val moduleInfoAnnotation =\n      docModule.schema.annotations.find { it.classInfo == PClassInfo.ModuleInfo }\n    if (moduleInfoAnnotation != null) {\n      val minPklVersion = moduleInfoAnnotation[\"minPklVersion\"] as String\n      result[MemberInfoKey(\"Pkl version\")] = { +\"$minPklVersion or higher\" }\n    }\n\n    if (sourceUrl != null) {\n      result[MemberInfoKey(\"Source code\")] = {\n        a {\n          href = sourceUrl.toString()\n          val path = sourceUrl.path\n          val name = path.substring(path.lastIndexOf(\"/\") + 1)\n          +name\n        }\n      }\n    }\n\n    if (examples.isNotEmpty() && docModule.parent.docPackageInfo.sourceCodeUrlScheme != null) {\n      result[MemberInfoKey(\"Examples\")] = {\n        var first = true\n        for (example in examples) {\n          if (first) first = false else +\", \"\n          a {\n            href =\n              docModule.parent.docPackageInfo.getModuleSourceCode(example.moduleName)!!.toString()\n            +example.shortModuleName\n          }\n        }\n      }\n    }\n\n    result[MemberInfoKey(\"Known subtypes in package\", runtimeDataClasses)] = {\n      id = HtmlConstants.KNOWN_SUBTYPES\n      classes = runtimeDataClasses\n    }\n\n    result[MemberInfoKey(\"Known usages in package\", runtimeDataClasses)] = {\n      id = HtmlConstants.KNOWN_USAGES\n      classes = runtimeDataClasses\n    }\n\n    result[MemberInfoKey(\"All versions\", runtimeDataClasses)] = {\n      id = HtmlConstants.KNOWN_VERSIONS\n      classes = runtimeDataClasses\n    }\n\n    return result\n  }\n\n  protected inner class MemberDocs(\n    docComment: String?,\n    docScope: DocScope,\n    annotations: List<PObject>,\n    /** Whether these member docs are for the main declaration at the top of a page. */\n    private val isDeclaration: Boolean = false,\n    private val extraMemberInfo: Map<MemberInfoKey, HtmlBlockTag.() -> Unit> = mapOf(),\n  ) {\n    init {\n      markdownInlineParserFactory.docScope = docScope\n    }\n\n    private val summary: String? =\n      docComment\n        ?.let { getDocCommentSummary(it) }\n        ?.let { markdownRenderer.render(markdownParser.parse(it)).trim().ifEmpty { null } }\n\n    // whether to only show basic information without the option to expand\n    private val showSummaryOnly: Boolean = !isDeclaration && docScope is PageScope\n\n    private val overflow: String? =\n      if (showSummaryOnly) {\n        null // don't render if not needed\n      } else {\n        docComment\n          ?.let { getDocCommentOverflow(it) }\n          ?.let { markdownRenderer.render(markdownParser.parse(it)).trim().ifEmpty { null } }\n      }\n\n    private val deprecatedAnnotation: PObject? =\n      annotations.find { it.classInfo == PClassInfo.Deprecated }\n\n    private val alsoKnownAsAnnotation: PObject? =\n      annotations.find { it.classInfo == PClassInfo.AlsoKnownAs }\n\n    val isDeprecatedMember: Boolean = deprecatedAnnotation != null\n\n    // whether there is a \"member info\" section consisting of key-value pairs\n    private val hasMemberInfo: Boolean =\n      extraMemberInfo.isNotEmpty() || alsoKnownAsAnnotation != null\n\n    // whether the first paragraph of the user-provided doc comment\n    // needs to give way for other information\n    private val summaryMovesDown: Boolean = summary != null && deprecatedAnnotation != null\n\n    val isExpandable: Boolean =\n      !showSummaryOnly && (overflow != null || summaryMovesDown || hasMemberInfo && !isDeclaration)\n\n    fun renderExpandIcon(tag: HtmlBlockTag) {\n      if (isExpandable) {\n        tag.classes += \"with-expandable-docs\"\n        tag.i {\n          classes = setOf(\"material-icons\", \"expandable-docs-icon\")\n          +\"expand_more\"\n        }\n      }\n    }\n\n    fun renderDocComment(tag: HtmlBlockTag) {\n      if (deprecatedAnnotation != null) {\n        val message = deprecatedAnnotation[\"message\"] as String?\n\n        val replaceWith = deprecatedAnnotation[\"replaceWith\"] as String?\n\n        tag.div {\n          classes = setOf(\"doc-comment\")\n          if (message != null) {\n            +\"Deprecated: \"\n            unsafe { raw(renderInlineMarkdownText(message)) }\n          } else {\n            +\"Deprecated.\"\n          }\n          if (replaceWith != null) {\n            +\" Replace with: \"\n            code { +replaceWith }\n          }\n        }\n      } else if (summary != null) {\n        tag.div {\n          classes = setOf(\"doc-comment\")\n\n          unsafe { raw(summary) }\n        }\n      }\n\n      if (showSummaryOnly) return\n\n      if (hasMemberInfo) {\n        tag.dl {\n          classes =\n            if (isExpandable && !isDeclaration) {\n              setOf(\"member-info\", \"expandable\", \"hidden\", \"collapsed\")\n            } else {\n              setOf(\"member-info\")\n            }\n\n          for ((key, content) in extraMemberInfo) {\n            dt {\n              classes = key.classes\n              +key.name\n              +\":\"\n            }\n            dd { content() }\n          }\n\n          if (alsoKnownAsAnnotation != null) {\n            dt { +\"Also known as:\" }\n            dd {\n              @Suppress(\"UNCHECKED_CAST\") val names = alsoKnownAsAnnotation[\"names\"] as List<String>\n              var first = true\n              for (name in names) {\n                if (first) first = false else +\", \"\n                code { +name }\n              }\n            }\n          }\n        }\n      }\n\n      if (summaryMovesDown || overflow != null) {\n        tag.div {\n          classes = setOf(\"doc-comment\", \"expandable\", \"hidden\", \"collapsed\")\n\n          unsafe {\n            if (summaryMovesDown) raw(summary!!)\n            if (overflow != null) raw(overflow)\n          }\n        }\n      }\n    }\n\n    private fun renderInlineMarkdownText(text: String): String {\n      var node = markdownParser.parse(text.trimIndent().trim())\n\n      // unwrap top-level paragraphs because resulting HTML will be used as inline content\n      while (node.firstChild != null && node.firstChild === node.lastChild) {\n        node = node.firstChild\n      }\n\n      return markdownRenderer.render(node)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/RuntimeData.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.FileNotFoundException\nimport java.nio.file.NoSuchFileException\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.SerializationException\nimport kotlinx.serialization.json.Json\nimport org.pkl.commons.readString\nimport org.pkl.commons.writeString\n\n@Serializable internal data class RuntimeDataLink(val text: String, val href: String?)\n\n@OptIn(ExperimentalSerializationApi::class)\n@Serializable\ninternal data class RuntimeData(\n  val knownVersions: Set<RuntimeDataLink> = setOf(),\n  val knownUsages: Set<RuntimeDataLink> = setOf(),\n  val knownSubtypes: Set<RuntimeDataLink> = setOf(),\n) {\n\n  companion object {\n    val EMPTY = RuntimeData()\n\n    private val json = Json {\n      prettyPrint = true\n      explicitNulls = false\n      ignoreUnknownKeys = true\n      prettyPrintIndent = \"  \"\n    }\n\n    /** Compare two paths, comparing each segment. */\n    private fun segmentComparator(comparator: Comparator<String>): Comparator<RuntimeDataLink> {\n      return Comparator { o1, o2 ->\n        val path1Segments = o1.href!!.split(\"/\")\n        val path2Segments = o2.href!!.split(\"/\")\n        for ((path1, path2) in path1Segments.zip(path2Segments)) {\n          if (path1 == path2) continue\n          try {\n            val comparison = comparator.compare(path1, path2)\n            if (comparison != 0) return@Comparator comparison\n          } catch (_: Throwable) {\n            // possibly happens if the version is invalid.\n            continue\n          }\n        }\n        0\n      }\n    }\n\n    fun readOrEmpty(path: Path): RuntimeData {\n      return try {\n        json.decodeFromString(path.readString())\n      } catch (e: Throwable) {\n        when (e) {\n          is NoSuchFileException,\n          is FileNotFoundException -> EMPTY\n          is SerializationException ->\n            throw DocGeneratorBugException(\"Error deserializing `${path.toUri()}`.\", e)\n          else -> throw e\n        }\n      }\n    }\n  }\n\n  fun <T : ElementRef<*>> addKnownVersions(\n    myRef: T,\n    versions: Set<String>?,\n    comparator: Comparator<String>,\n  ): RuntimeData {\n    if (versions == null) return this\n    val newEffectiveVersions = knownVersions.mapTo(mutableSetOf()) { it.text } + versions\n    val knownVersions =\n      newEffectiveVersions\n        .sortedWith(comparator)\n        .map { version -> RuntimeDataLink(text = version, href = myRef.pageUrlForVersion(version)) }\n        .toSet()\n    if (knownVersions == this.knownVersions) {\n      return this\n    }\n    return copy(knownVersions = knownVersions)\n  }\n\n  fun <T : ElementRef<*>> addKnownUsages(\n    myRef: T,\n    refs: Collection<T>?,\n    text: (T) -> String,\n    comparator: Comparator<String>,\n  ): RuntimeData {\n    if (refs == null) return this\n    val newLinks =\n      refs.mapTo(mutableSetOf()) { ref ->\n        RuntimeDataLink(text = text(ref), href = ref.pageUrlRelativeTo(myRef))\n      }\n    val knownUsages =\n      (this.knownUsages + newLinks).distinctByComparator(comparator).sortedBy { it.text }.toSet()\n    if (knownUsages == this.knownUsages) {\n      return this\n    }\n    return copy(knownUsages = knownUsages)\n  }\n\n  fun addKnownSubtypes(\n    myRef: TypeRef,\n    subtypes: Collection<TypeRef>?,\n    comparator: Comparator<String>,\n  ): RuntimeData {\n    if (subtypes == null) return this\n    val newLinks =\n      subtypes.mapTo(mutableSetOf()) { ref ->\n        RuntimeDataLink(text = ref.displayName, href = ref.pageUrlRelativeTo(myRef))\n      }\n    val knownSubtypes =\n      (this.knownSubtypes + newLinks).distinctByComparator(comparator).sortedBy { it.text }.toSet()\n    if (knownSubtypes == this.knownSubtypes) {\n      return this\n    }\n    return copy(knownSubtypes = knownSubtypes)\n  }\n\n  fun Collection<RuntimeDataLink>.distinctByComparator(\n    comparator: Comparator<String>\n  ): Collection<RuntimeDataLink> {\n    val compareBySegment = segmentComparator(comparator)\n    val highestVersions = mutableMapOf<String, RuntimeDataLink>()\n    for (link in this) {\n      val prev = highestVersions[link.text]\n      if (prev == null || compareBySegment.compare(prev, link) > 0) {\n        highestVersions[link.text] = link\n      }\n    }\n    return highestVersions.values\n  }\n\n  fun writeTo(path: Path) {\n    path.createParentDirectories()\n    path.writeString(json.encodeToString(this))\n  }\n\n  fun perPackage(): RuntimeData = copy(knownUsages = setOf(), knownSubtypes = setOf())\n\n  fun perPackageVersion(): RuntimeData = copy(knownVersions = setOf())\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/RuntimeDataGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport java.nio.file.Path\nimport kotlin.io.path.ExperimentalPathApi\nimport kotlin.io.path.isRegularFile\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.launch\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport org.pkl.commons.lazyWithReceiver\n\n// Note: we don't currently make use of persisted type alias data (needs more thought).\n@OptIn(ExperimentalPathApi::class, ExperimentalSerializationApi::class)\ninternal class RuntimeDataGenerator(\n  private val descendingVersionComparator: Comparator<String>,\n  private val outputDir: Path,\n  consoleOut: OutputStream,\n) : AbstractGenerator(consoleOut) {\n\n  private val packageVersions: MutableMap<PackageId, MutableSet<PackageRef>> = mutableMapOf()\n  private val classVersions: MutableMap<TypeId, MutableSet<String>> = mutableMapOf()\n  private val packageUsages: MutableMap<PackageRef, MutableSet<PackageRef>> = mutableMapOf()\n  private val typeUsages = mutableMapOf<TypeRef, MutableSet<TypeRef>>()\n  private val subtypes: MutableMap<TypeRef, MutableSet<TypeRef>> = mutableMapOf()\n\n  suspend fun generate(packages: List<PackageData>) {\n    collectData(packages)\n    writeData(packages)\n  }\n\n  private fun collectData(packages: List<PackageData>) {\n    for (pkg in packages) {\n      packageVersions.add(pkg.ref.pkg, pkg.ref)\n      for (dependency in pkg.dependencies) {\n        if (dependency.isStdlib()) continue\n        // Every package implicitly depends on the stdlib. Showing this dependency adds unwanted\n        // noise.\n        packageUsages.add(dependency.ref, pkg.ref)\n      }\n      for (module in pkg.modules) {\n        for (clazz in module.effectiveClasses) {\n          collectData(clazz)\n        }\n      }\n    }\n  }\n\n  // only collect type use information when belonging to the same package.\n  private fun collectData(clazz: ClassData) {\n    classVersions.add(clazz.ref.id, clazz.ref.version)\n    for (superclass in clazz.superclasses) {\n      if (superclass.isInSamePackageAs(clazz.ref)) {\n        subtypes.add(superclass, clazz.ref)\n      }\n    }\n    for (type in clazz.usedTypes) {\n      if (type.isInSamePackageAs(clazz.ref)) {\n        typeUsages.add(type, clazz.ref)\n      }\n    }\n  }\n\n  val writtenFiles = mutableSetOf<Path>()\n\n  private suspend fun writeData(packages: List<PackageData>) {\n    coroutineScope {\n      for (pkg in packages) {\n        launch { writePackageFilePerVersion(pkg) }\n        for (module in pkg.modules) {\n          for (clazz in module.effectiveClasses) {\n            launch { writeClassFilePerVersion(clazz) }\n          }\n        }\n      }\n      for (pkg in packages.distinctBy { it.ref.pkg }) {\n        launch { writePackageFile(pkg) }\n        for (module in pkg.modules) {\n          for (clazz in module.effectiveClasses) {\n            launch { writeClassFile(clazz) }\n          }\n        }\n      }\n    }\n    updateKnownUsages(packages)\n  }\n\n  private val ModuleData.effectiveClasses: List<ClassData>\n    get() =\n      when (moduleClass) {\n        null -> classes\n        else ->\n          buildList {\n            add(moduleClass)\n            addAll(classes)\n          }\n      }\n\n  /**\n   * It's possible that a new package uses types/packages from things that are already part of the\n   * docsite.\n   *\n   * If so, update the known usages of those things.\n   */\n  private suspend fun updateKnownUsages(packages: List<PackageData>) = coroutineScope {\n    val newlyWrittenPackageRefs = packages.mapTo(mutableSetOf()) { it.ref }\n    val existingPackagesWithUpdatedKnownUsages =\n      packageUsages.keys.filterNot { newlyWrittenPackageRefs.contains(it) }\n    for (ref in existingPackagesWithUpdatedKnownUsages) {\n      launch {\n        val runtimeDataPath = outputDir.resolve(ref.perPackageVersionRuntimeDataPath)\n        // we must not have this package in our docsite.\n        if (!runtimeDataPath.isRegularFile()) return@launch\n        val usages = packageUsages[ref]\n        val existingData = ref.existingPerPackageVersionRuntimeData\n        val data =\n          existingData.addKnownUsages(ref, usages, PackageRef::pkg, descendingVersionComparator)\n        if (data != existingData) {\n          data.doWriteTo(outputDir.resolve(ref.perPackageVersionRuntimeDataPath))\n        }\n      }\n    }\n  }\n\n  private val ElementRef<*>.existingPerPackageRuntimeData: RuntimeData by lazyWithReceiver {\n    val path = outputDir.resolve(perPackageRuntimeDataPath)\n    RuntimeData.readOrEmpty(path)\n  }\n\n  private val ElementRef<*>.existingPerPackageVersionRuntimeData: RuntimeData by lazyWithReceiver {\n    val path = outputDir.resolve(perPackageVersionRuntimeDataPath)\n    RuntimeData.readOrEmpty(path)\n  }\n\n  private fun RuntimeData.doWriteTo(path: Path) {\n    writeTo(path)\n    consoleOut.write(\"Wrote file ${path.toUri()}\\r\")\n  }\n\n  private fun RuntimeData.writePerPackageVersion(ref: ElementRef<*>) {\n    val path = outputDir.resolve(ref.perPackageVersionRuntimeDataPath)\n    writtenFiles.add(path)\n    perPackageVersion().writeTo(path)\n    consoleOut.write(\"Wrote file ${path.toUri()}\\r\")\n  }\n\n  private fun RuntimeData.writePerPackage(ref: ElementRef<*>) {\n    val path = outputDir.resolve(ref.perPackageRuntimeDataPath)\n    writtenFiles.add(path)\n    perPackage().writeTo(path)\n    consoleOut.write(\"Wrote file ${path.toUri()}\\r\")\n  }\n\n  private fun writePackageFile(packageData: PackageData) {\n    val ref = packageData.ref\n    val newVersions = packageVersions[packageData.ref.pkg]?.mapTo(mutableSetOf()) { it.version }\n    val data =\n      ref.existingPerPackageRuntimeData.addKnownVersions(\n        ref,\n        newVersions,\n        descendingVersionComparator,\n      )\n    data.writePerPackage(ref)\n  }\n\n  private fun writePackageFilePerVersion(packageData: PackageData) {\n    val ref = packageData.ref\n    val data =\n      ref.existingPerPackageVersionRuntimeData.addKnownUsages(\n        ref,\n        packageUsages[ref],\n        { it.pkg },\n        descendingVersionComparator,\n      )\n    data.writePerPackageVersion(ref)\n  }\n\n  private fun writeClassFile(classData: ClassData) {\n    val ref = classData.ref\n    val newVersions = classVersions[ref.id]?.mapTo(mutableSetOf()) { it }\n    val data =\n      ref.existingPerPackageRuntimeData.addKnownVersions(\n        ref,\n        newVersions,\n        descendingVersionComparator,\n      )\n    data.writePerPackage(ref)\n  }\n\n  private fun writeClassFilePerVersion(classData: ClassData) {\n    val ref = classData.ref\n    val newSubtypes = subtypes[ref]\n    val newUsages = typeUsages[ref]\n    val data =\n      ref.existingPerPackageVersionRuntimeData\n        .addKnownSubtypes(ref, newSubtypes, descendingVersionComparator)\n        .addKnownUsages(ref, newUsages, TypeRef::displayName, descendingVersionComparator)\n    data.writePerPackageVersion(ref)\n  }\n\n  private fun <K, V> MutableMap<K, MutableSet<V>>.add(key: K, value: V) {\n    val newValue =\n      when (val oldValue = this[key]) {\n        null -> mutableSetOf(value)\n        else -> oldValue.apply { add(value) }\n      }\n    put(key, newValue)\n  }\n}\n\nprivate fun DependencyData.isStdlib(): Boolean = ref.pkg == \"pkl\"\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/SearchIndexGenerator.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.isRegularFile\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.descriptors.PrimitiveKind\nimport kotlinx.serialization.descriptors.PrimitiveSerialDescriptor\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.json.Json\nimport org.pkl.commons.readString\nimport org.pkl.commons.writeString\nimport org.pkl.core.Member\nimport org.pkl.core.PClass\nimport org.pkl.core.PClass.Method\nimport org.pkl.core.PClass.Property\nimport org.pkl.core.PClassInfo\nimport org.pkl.core.PType\nimport org.pkl.core.TypeAlias\n\n@OptIn(ExperimentalSerializationApi::class)\ninternal class SearchIndexGenerator(private val outputDir: Path, consoleOut: OutputStream) :\n  AbstractGenerator(consoleOut) {\n  companion object {\n    private const val PREFIX = \"searchData='\"\n    private const val POSTFIX = \"';\\n\"\n\n    val json = Json {\n      prettyPrint = false\n      explicitNulls = false\n    }\n  }\n\n  private object KindSerializer : KSerializer<Kind> {\n    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(\"Kind\", PrimitiveKind.INT)\n\n    override fun serialize(encoder: Encoder, value: Kind) {\n      encoder.encodeInt(value.value)\n    }\n\n    override fun deserialize(decoder: Decoder): Kind {\n      val intValue = decoder.decodeInt()\n      return Kind.fromInt(intValue)\n    }\n  }\n\n  @Serializable(with = KindSerializer::class)\n  enum class Kind(val value: Int) {\n    PACKAGE(0),\n    MODULE(1),\n    TYPEALIAS(2),\n    CLASS(3),\n    METHOD(4),\n    PROPERTY(5);\n\n    companion object {\n      fun fromInt(value: Int) =\n        entries.firstOrNull { it.value == value }\n          ?: throw IllegalArgumentException(\"Unknown Kind value: $value\")\n    }\n  }\n\n  private val searchIndexFile = outputDir.resolve(\"search-index.js\")\n\n  @Serializable\n  data class SearchIndexEntry(\n    val name: String,\n    val kind: Kind,\n    val url: String,\n    val sig: String? = null,\n    val parId: Int? = null,\n    val deprecated: Boolean? = null,\n    val aka: List<String>? = null,\n  )\n\n  data class PackageIndexEntry(\n    val packageEntry: SearchIndexEntry,\n    val moduleEntries: List<SearchIndexEntry>,\n  )\n\n  private fun List<SearchIndexEntry>.writeTo(path: Path) {\n    val self = this\n    val text = buildString {\n      append(PREFIX)\n      append(json.encodeToString(self))\n      append(POSTFIX)\n    }\n    path.writeString(text)\n    writeOutput(\"Wrote file ${path.toUri()}\\r\")\n  }\n\n  private fun PackageData.toEntry(): SearchIndexEntry {\n    val pkgPath = \"${ref.pkg.pathEncoded}/current\"\n    return SearchIndexEntry(\n      name = ref.pkg,\n      kind = Kind.PACKAGE,\n      url = \"$pkgPath/${ref.packageRelativeHtmlPath}\",\n      deprecated = deprecation?.let { true },\n    )\n  }\n\n  private fun ModuleData.toEntry(basePath: String): SearchIndexEntry {\n    return SearchIndexEntry(\n      name = ref.fullName,\n      kind = Kind.MODULE,\n      url = \"$basePath/${ref.packageRelativeHtmlPath}\",\n      deprecated = deprecation?.let { true },\n    )\n  }\n\n  private fun DocModule.toEntry(): SearchIndexEntry {\n    val moduleSchema = schema\n    return SearchIndexEntry(\n        name = moduleSchema.moduleName,\n        kind = Kind.MODULE,\n        url = \"$path/index.html\",\n      )\n      .withAnnotations(moduleSchema.moduleClass)\n  }\n\n  private fun Property.toEntry(parentId: Int, basePath: String): SearchIndexEntry {\n    return SearchIndexEntry(\n        name = simpleName,\n        kind = Kind.PROPERTY,\n        url = \"$basePath#$simpleName\",\n        sig = renderSignature(this),\n        parId = parentId,\n      )\n      .withAnnotations(this)\n  }\n\n  private fun Method.toEntry(parentId: Int, basePath: String): SearchIndexEntry {\n    return SearchIndexEntry(\n        name = simpleName,\n        kind = Kind.METHOD,\n        url = \"$basePath#${simpleName.pathEncoded}()\",\n        sig = renderSignature(this),\n        parId = parentId,\n      )\n      .withAnnotations(this)\n  }\n\n  private fun PClass.toEntry(parentId: Int, basePath: String): SearchIndexEntry {\n    return SearchIndexEntry(\n        name = simpleName,\n        kind = Kind.CLASS,\n        url = \"$basePath/${simpleName.pathEncoded}.html\",\n        parId = parentId,\n      )\n      .withAnnotations(this)\n  }\n\n  private fun TypeAlias.toEntry(parentId: Int, basePath: String): SearchIndexEntry {\n    return SearchIndexEntry(\n        name = simpleName,\n        kind = Kind.TYPEALIAS,\n        url = \"$basePath#${simpleName.pathEncoded}\",\n        parId = parentId,\n      )\n      .withAnnotations(this)\n  }\n\n  @Suppress(\"UNCHECKED_CAST\")\n  private fun SearchIndexEntry.withAnnotations(member: Member?): SearchIndexEntry {\n    if (member == null) return this\n    val deprecatedAnnotation = member.annotations.find { it.classInfo == PClassInfo.Deprecated }\n    val alsoKnownAs = member.annotations.find { it.classInfo == PClassInfo.AlsoKnownAs }\n    return copy(\n      deprecated = deprecatedAnnotation?.let { true },\n      aka = alsoKnownAs?.let { it[\"names\"] as List<String> },\n    )\n  }\n\n  internal fun getCurrentSearchIndex(): List<PackageIndexEntry> {\n    if (!searchIndexFile.isRegularFile()) {\n      return emptyList()\n    }\n    val text = searchIndexFile.readString()\n    if (!(text.startsWith(PREFIX) && text.endsWith(POSTFIX))) {\n      writeOutputLine(\n        \"[error] Incorrect existing search-index.js; either doesnt start with prefix '$PREFIX', or end with postfix '$POSTFIX'\"\n      )\n      return emptyList()\n    }\n    val jsonStr = text.substring(PREFIX.length, text.length - POSTFIX.length)\n    val entries = json.decodeFromString<List<SearchIndexEntry>>(jsonStr)\n    return buildList {\n      var i = 0\n\n      while (i < entries.size) {\n        val packageEntry = entries[i]\n        i++\n        val moduleEntries = buildList {\n          while (i < entries.size && entries[i].kind == Kind.MODULE) {\n            add(entries[i])\n            i++\n          }\n        }\n        add(PackageIndexEntry(packageEntry = packageEntry, moduleEntries = moduleEntries))\n      }\n    }\n  }\n\n  fun buildSearchIndex(packages: List<PackageData>): List<PackageIndexEntry> = buildList {\n    for (pkg in packages) {\n      val pkgPath = \"${pkg.ref.pkg.pathEncoded}/current\"\n      add(\n        PackageIndexEntry(\n          packageEntry = pkg.toEntry(),\n          moduleEntries = pkg.modules.map { it.toEntry(basePath = pkgPath) },\n        )\n      )\n    }\n  }\n\n  /** Reads the current site index, and adds the set of newly generated packages to the index. */\n  fun generateSiteIndex(currentPackages: List<PackageData>) {\n    val searchIndex = buildSearchIndex(currentPackages)\n    searchIndexFile.createParentDirectories()\n    val entries = buildList {\n      for (packageIndexEntry in searchIndex) {\n        add(packageIndexEntry.packageEntry)\n        for (module in packageIndexEntry.moduleEntries) {\n          add(module)\n        }\n      }\n    }\n    entries.writeTo(searchIndexFile)\n  }\n\n  fun generate(docPackage: DocPackage) {\n    val path =\n      outputDir\n        .resolve(\"${docPackage.name.pathEncoded}/${docPackage.version}/search-index.js\")\n        .createParentDirectories()\n    val entries = buildList {\n      var nextId = 0\n      for (docModule in docPackage.docModules) {\n        if (docModule.isUnlisted) continue\n\n        val module = docModule.schema\n        val moduleId = nextId\n\n        nextId += 1\n        add(docModule.toEntry())\n        val moduleBasePath = docModule.path\n\n        for ((_, property) in module.moduleClass.properties) {\n          if (property.isUnlisted) continue\n          nextId += 1\n          add(property.toEntry(parentId = moduleId, basePath = \"${moduleBasePath}/index.html\"))\n        }\n        for ((_, method) in module.moduleClass.methods) {\n          if (method.isUnlisted) continue\n\n          nextId += 1\n          add(method.toEntry(parentId = moduleId, basePath = \"${moduleBasePath}/index.html\"))\n        }\n        for ((_, clazz) in module.classes) {\n          if (clazz.isUnlisted) continue\n\n          val classId = nextId\n\n          nextId += 1\n          add(clazz.toEntry(parentId = moduleId, basePath = moduleBasePath))\n          val classBasePath = \"${docModule.path}/${clazz.simpleName}.html\"\n\n          for ((_, property) in clazz.properties) {\n            if (property.isUnlisted) continue\n\n            nextId += 1\n            add(property.toEntry(parentId = classId, basePath = classBasePath))\n          }\n\n          for ((_, method) in clazz.methods) {\n            if (method.isUnlisted) continue\n\n            nextId += 1\n            add(method.toEntry(parentId = classId, basePath = classBasePath))\n          }\n        }\n\n        for ((_, typeAlias) in module.typeAliases) {\n          nextId += 1\n          add(typeAlias.toEntry(parentId = moduleId, basePath = \"${moduleBasePath}/index.html\"))\n        }\n      }\n    }\n    entries.writeTo(path)\n  }\n\n  private fun renderSignature(method: Method): String =\n    StringBuilder()\n      .apply {\n        append('(')\n        var first = true\n        for ((name, _) in method.parameters) {\n          if (first) first = false else append(\", \")\n          append(name)\n        }\n        append(')')\n        append(\": \")\n        appendType(method.returnType)\n      }\n      .toString()\n\n  private fun renderSignature(property: Property): String =\n    StringBuilder()\n      .apply {\n        append(\": \")\n        appendType(property.type)\n      }\n      .toString()\n\n  private fun StringBuilder.appendType(type: PType) {\n    when (type) {\n      PType.UNKNOWN -> {\n        append(\"unknown\")\n      }\n      PType.NOTHING -> {\n        append(\"nothing\")\n      }\n      PType.MODULE -> {\n        append(\"module\")\n      }\n      is PType.StringLiteral -> {\n        append(\"\\\\\\\"${type.literal}\\\\\\\"\")\n      }\n      is PType.Class -> {\n        val pClass = type.pClass\n        val name =\n          if (pClass.isModuleClass) {\n            // use simple module name rather than class name (which is always `ModuleClass`)\n            pClass.moduleName.substring(pClass.moduleName.lastIndexOf('.') + 1)\n          } else {\n            pClass.simpleName\n          }\n        append(name)\n        if (type.typeArguments.isNotEmpty()) {\n          append('<')\n          var first = true\n          for (typeArg in type.typeArguments) {\n            if (first) first = false else append(\", \")\n            appendType(typeArg)\n          }\n          append('>')\n        }\n      }\n      is PType.Constrained -> appendType(type.baseType)\n      is PType.Union -> {\n        var first = true\n        for (elemType in type.elementTypes) {\n          if (first) first = false else append(\"|\")\n          appendType(elemType)\n        }\n      }\n      is PType.Nullable -> {\n        appendType(type.baseType)\n        append(\"?\")\n      }\n      is PType.Function -> {\n        if (type.parameterTypes.size == 1) {\n          appendType(type.parameterTypes[0])\n        } else {\n          append('(')\n          var first = true\n          for (paramType in type.parameterTypes) {\n            if (first) first = false else append(\", \")\n            appendType(paramType)\n          }\n          append(')')\n        }\n\n        append(\" -> \")\n        appendType(type.returnType)\n      }\n      is PType.Alias -> append(type.typeAlias.simpleName)\n      is PType.TypeVariable -> append(type.typeParameter.name)\n      else -> throw AssertionError(\"Unknown PType: $type\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/Serializers.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.net.URI\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.descriptors.*\nimport kotlinx.serialization.encoding.*\nimport kotlinx.serialization.modules.SerializersModule\nimport kotlinx.serialization.modules.contextual\nimport org.pkl.commons.toUri\n\nval serializers: SerializersModule = SerializersModule { contextual(UriSerializer) }\n\nobject UriSerializer : KSerializer<URI> {\n  override val descriptor: SerialDescriptor =\n    PrimitiveSerialDescriptor(\"java.net.URI\", PrimitiveKind.STRING)\n\n  override fun serialize(encoder: Encoder, value: URI) {\n    encoder.encodeString(value.toString())\n  }\n\n  override fun deserialize(decoder: Decoder): URI {\n    return decoder.decodeString().toUri()\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/main/kotlin/org/pkl/doc/Util.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.nio.file.StandardCopyOption\nimport kotlin.io.path.createParentDirectories\nimport org.pkl.core.*\nimport org.pkl.core.util.IoUtils\nimport org.pkl.parser.Lexer\n\n// overwrites any existing file\ninternal fun copyResource(resourceName: String, targetDir: Path) {\n  val targetFile = targetDir.resolve(resourceName).apply { createParentDirectories() }\n  Files.copy(getResourceAsStream(resourceName), targetFile, StandardCopyOption.REPLACE_EXISTING)\n}\n\ninternal fun getResourceAsStreamOrNull(resourceName: String): InputStream? =\n  Thread.currentThread().contextClassLoader.getResourceAsStream(\"org/pkl/doc/$resourceName\")\n\ninternal fun getResourceAsStream(resourceName: String): InputStream =\n  getResourceAsStreamOrNull(resourceName)\n    ?: throw DocGeneratorException(\"Failed to load class path resource `$resourceName`.\")\n\ninternal val ModuleSchema?.hasListedClass: Boolean\n  get() = this != null && allClasses.any { !it.value.isUnlisted }\n\ninternal val ModuleSchema?.hasListedTypeAlias: Boolean\n  get() = this != null && allTypeAliases.any { !it.value.isUnlisted }\n\ninternal val PClass?.hasListedProperty: Boolean\n  get() = this != null && allProperties.any { !it.value.isUnlisted }\n\ninternal val PClass?.hasListedMethod: Boolean\n  get() = this != null && allMethods.any { !it.value.isUnlisted }\n\ninternal val Member.isUnlisted: Boolean\n  get() = annotations.isUnlisted\n\ninternal val List<PObject>.isUnlisted: Boolean\n  get() = any { it.classInfo == PClassInfo.Unlisted }\n\ninternal val List<PObject>.deprecation: String?\n  get() = find { it.classInfo == PClassInfo.Deprecated }?.get(\"message\") as String?\n\n@Suppress(\"UNCHECKED_CAST\", \"unused\")\ninternal val List<PObject>.alsoKnownAs: List<String>?\n  get() = find { it.classInfo == PClassInfo.AlsoKnownAs }?.get(\"names\") as List<String>?\n\ninternal fun createDeprecatedAnnotation(message: String): PObject =\n  PObject(PClassInfo.Deprecated, mapOf(\"message\" to message, \"replaceWith\" to PNull.getInstance()))\n\nprivate val paragraphSeparatorRegex: Regex = Regex(\"(?m:^\\\\s*(`{3,}\\\\w*)?\\\\s*\\n)\")\n\ninternal fun getDocCommentSummary(docComment: String?): String? {\n  if (docComment == null) return null\n\n  return when (val match = paragraphSeparatorRegex.find(docComment)) {\n    null -> docComment.trim().ifEmpty { null }\n    else -> docComment.substring(0, match.range.first).trim().ifEmpty { null }\n  }\n}\n\ninternal fun getDocCommentOverflow(docComment: String?): String? {\n  if (docComment == null) return null\n\n  return when (val match = paragraphSeparatorRegex.find(docComment)) {\n    null -> null\n    else -> {\n      val index = if (match.groups[1] != null) match.range.first else match.range.last + 1\n      docComment.substring(index).trim().ifEmpty { null }\n    }\n  }\n}\n\ninternal fun String.replaceSourceCodePlaceholders(\n  path: String,\n  sourceLocation: Member.SourceLocation,\n): String {\n  return replace(\"%{path}\", path)\n    .replace(\"%{line}\", sourceLocation.startLine().toString())\n    .replace(\"%{endLine}\", sourceLocation.endLine().toString())\n}\n\n/** Encodes a URI string, encoding characters that are part of URI syntax. */\ninternal val String.uriEncodedComponent\n  get(): String {\n    val ret = URI(null, null, this, null)\n    return ret.toString().replace(\"/\", \"%2F\")\n  }\n\n/**\n * Encodes a URI string, preserving characters that are part of URI syntax.\n *\n * Follows `encodeURI` from ECMAScript.\n */\ninternal val String.uriEncoded\n  get(): String = replace(Regex(\"([^;/?:@&=+$,#]+)\")) { it.value.uriEncodedComponent }\n\nfun getModulePath(moduleName: String, packagePrefix: String): String =\n  moduleName.substring(packagePrefix.length).replace('.', '/')\n\n/**\n * Turns `\"foo.bar.baz-biz\"` into ``\"foo.bar.`baz-biz`\"``.\n *\n * There's a chance that this is wrong; a module might look like: ``\"module foo.`bar.baz`.biz\"``.\n * However, we don't keep around enough information to render this faithfully.\n */\ninternal val String.asModuleName: String\n  get() = split(\".\").map(Lexer::maybeQuoteIdentifier).joinToString(\".\") { it }\n\ninternal val String.asIdentifier: String\n  get() = Lexer.maybeQuoteIdentifier(this)\n\ninternal val String.pathEncoded\n  get(): String = IoUtils.encodePath(this)\n\nfun OutputStream.write(str: String) = write(str.toByteArray(Charsets.UTF_8))\n\nfun OutputStream.writeLine(str: String) = write((str + \"\\n\").toByteArray(Charsets.UTF_8))\n\noperator fun <A, B> org.pkl.core.util.Pair<A, B>.component1(): A = first\n\noperator fun <A, B> org.pkl.core.util.Pair<A, B>.component2(): B = second\n"
  },
  {
    "path": "pkl-doc/src/main/resources/org/pkl/doc/scripts/pkldoc.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// Whether the current browser is WebKit.\nlet isWebKitBrowser;\n\n// The lazily initialized worker for running searches, if any.\nlet searchWorker = null;\n\n// Tells whether non-worker search is ready for use.\n// Only relevant if we determined that we can't use a worker.\nlet nonWorkerSearchInitialized = false;\n\n// The search div containing search input and search results.\nlet searchElement;\n\n// The search input element.\nlet searchInput;\n\n// The package name associated with the current page, if any.\nlet packageName;\n\nlet packageVersion;\n\n// The module name associated with the current page, if any.\nlet moduleName;\n\n// The class name associated with the current page, if any.\nlet className;\n\n// Prefix to turn a site-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet rootUrlPrefix;\n\n// Prefix to turn a package-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet packageUrlPrefix;\n\n// The search result currently selected in the search results list.\nlet selectedSearchResult = null;\n\n// Initializes the UI.\n// Wrapped in a function to avoid execution in tests.\n// noinspection JSUnusedGlobalSymbols\nfunction onLoad() {\n  isWebKitBrowser = navigator.userAgent.indexOf('AppleWebKit') !== -1;\n  searchElement = document.getElementById('search');\n  searchInput = document.getElementById('search-input');\n  packageName = searchInput.dataset.packageName || null;\n  packageVersion = searchInput.dataset.packageVersion || null;\n  moduleName = searchInput.dataset.moduleName || null;\n  className = searchInput.dataset.className || null;\n  rootUrlPrefix = searchInput.dataset.rootUrlPrefix;\n  packageUrlPrefix = searchInput.dataset.packageUrlPrefix;\n\n  initExpandTargetMemberDocs();\n  initNavigateToMemberPage();\n  initToggleMemberDocs();\n  initToggleInheritedMembers();\n  initCopyModuleUriToClipboard();\n  initSearchUi();\n}\n\n// If page URL contains a fragment, expand the target member's docs.\n// Handled in JS rather than CSS so that target member can still be manually collapsed.\nfunction initExpandTargetMemberDocs() {\n  const expandTargetDocs = () => {\n    const hash = window.location.hash;\n    if (hash.length === 0) return;\n    \n    const target = document.getElementById(hash.substring(1));\n    if (!target) return;\n\n    const member = target.nextElementSibling;\n    if (!member || !member.classList.contains('with-expandable-docs')) return;\n\n    expandMemberDocs(member);\n  }\n  \n  window.addEventListener('hashchange', expandTargetDocs);\n  expandTargetDocs();\n}\n\n// For members that have their own page, navigate to that page when the member's box is clicked.\nfunction initNavigateToMemberPage() {\n  const elements = document.getElementsByClassName('with-page-link');\n  for (const element of elements) {\n    const memberLink = element.getElementsByClassName('name-decl')[0];\n    // check if this is actually a link\n    // (it isn't if the generator couldn't resolve the link target)\n    if (memberLink.tagName === 'A') {\n      element.addEventListener('click', (e) => {\n        // don't act if user clicked a link\n        if (e.target !== null && e.target.closest('a') !== null) return;\n\n        // don't act if user clicked to select some text\n        if (window.getSelection().toString()) return;\n\n        memberLink.click();\n      });\n    }\n  }\n}\n\n// Expands and collapses member docs.\nfunction initToggleMemberDocs() {\n  const elements = document.getElementsByClassName('with-expandable-docs');\n  for (const element of elements) {\n    element.addEventListener('click', (e) => {\n      // don't act if user clicked a link\n      if (e.target !== null && e.target.closest('a') !== null) return;\n\n      // don't act if user clicked to select some text\n      if (window.getSelection().toString()) return;\n\n      toggleMemberDocs(element);\n    });\n  }\n}\n\n// Shows and hides inherited members.\nfunction initToggleInheritedMembers() {\n  const memberGroups = document.getElementsByClassName('member-group');\n  for (const group of memberGroups) {\n    const button = group.getElementsByClassName('toggle-inherited-members-link')[0];\n    if (button !== undefined) {\n      const members = group.getElementsByClassName('inherited');\n      button.addEventListener('click', () => toggleInheritedMembers(button, members));\n    }\n  }\n}\n\n// Copies the module URI optionally displayed on a module page to the clipboard.\nfunction initCopyModuleUriToClipboard() {\n  const copyUriButtons = document.getElementsByClassName('copy-uri-button');\n\n  for (const button of copyUriButtons) {\n    const moduleUri = button.previousElementSibling;\n\n    button.addEventListener('click', e => {\n      e.stopPropagation();\n      const range = document.createRange();\n      range.selectNodeContents(moduleUri);\n      const selection = getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      try {\n        document.execCommand('copy');\n      } catch (e) {\n      } finally {\n        selection.removeAllRanges();\n      }\n    });\n  }\n}\n\n// Expands or collapses member docs.\nfunction toggleMemberDocs(memberElem) {\n  const comments = memberElem.getElementsByClassName('expandable');\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n\n  if (isCollapsed) {\n    for (const comment of comments) expandElement(comment);\n    icon.textContent = 'expand_less';\n  } else {\n    for (const comment of comments) collapseElement(comment);\n    icon.textContent = 'expand_more';\n  }\n}\n\n// Expands member docs unless they are already expanded.\nfunction expandMemberDocs(memberElem) {\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n  \n  if (!isCollapsed) return;\n  \n  const comments = memberElem.getElementsByClassName('expandable');\n  for (const comment of comments) expandElement(comment);\n  icon.textContent = 'expand_less';\n}\n\n// Shows and hides inherited members.\nfunction toggleInheritedMembers(button, members) {\n  const isCollapsed = button.textContent === 'show inherited';\n\n  if (isCollapsed) {\n    for (const member of members) expandElement(member);\n    button.textContent = 'hide inherited';\n  } else {\n    for (const member of members) collapseElement(member);\n    button.textContent = 'show inherited'\n  }\n}\n\n// Expands an element.\n// Done in two steps to make transition work (can't transition from 'hidden').\n// For some reason (likely related to removing 'hidden') the transition isn't animated in FF.\n// When using timeout() instead of requestAnimationFrame()\n// there is *some* animation in FF but still doesn't look right.\nfunction expandElement(element) {\n  element.classList.remove('hidden');\n\n  requestAnimationFrame(() => {\n    element.classList.remove('collapsed');\n  });\n}\n\n// Collapses an element.\n// Done in two steps to make transition work (can't transition to 'hidden').\nfunction collapseElement(element) {\n  element.classList.add('collapsed');\n\n  const listener = () => {\n    element.removeEventListener('transitionend', listener);\n    element.classList.add('hidden');\n  };\n  element.addEventListener('transitionend', listener);\n}\n\n// Initializes the search UI and sets up delayed initialization of the search engine.\nfunction initSearchUi() {\n  // initialize search engine the first time that search input receives focus\n  const onFocus = () => {\n    searchInput.removeEventListener('focus', onFocus);\n    initSearchWorker();\n  };\n  searchInput.addEventListener('focus', onFocus);\n\n  // clear search when search input loses focus,\n  // except if this happens due to a search result being clicked,\n  // in which case clearSearch() will be called by the link's click handler,\n  // and calling it here would prevent the click handler from firing\n  searchInput.addEventListener('focusout', () => {\n    if (document.querySelector('#search-results:hover') === null) clearSearch();\n  });\n\n  // trigger search when user hasn't typed in a while\n  let timeoutId = null;\n  // Using anything other than `overflow: visible` for `#search-results`\n  // slows down painting significantly in WebKit browsers (at least Safari/Mac).\n  // Compensate by using a higher search delay, which is less annoying than a blocking UI.\n  const delay = isWebKitBrowser ? 200 : 100;\n  searchInput.addEventListener('input', () => {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => triggerSearch(searchInput.value), delay);\n  });\n\n  // keyboard shortcut for entering search\n  document.addEventListener('keyup', e => {\n    // could additionally support '/' like GitHub and Gmail do,\n    // but this would require overriding the default behavior of '/' on Firefox\n    if (e.key === 's') searchInput.focus();\n  });\n\n  // keyboard navigation for search results\n  searchInput.addEventListener('keydown', e => {\n    const results = document.getElementById('search-results');\n    if (results !== null) {\n      if (e.key === 'ArrowDown') {\n        selectNextResult(results.firstElementChild);\n        e.preventDefault();\n      } else if (e.key === 'ArrowUp') {\n        selectPrevResult(results.firstElementChild);\n        e.preventDefault();\n      }\n    }\n  });\n  searchInput.addEventListener('keyup', e => {\n    if (e.key === 'Enter' && selectedSearchResult !== null) {\n      selectedSearchResult.firstElementChild.click();\n      clearSearch();\n    }\n  });\n}\n\n// Initializes the search worker.\nfunction initSearchWorker() {\n  const workerScriptUrl = rootUrlPrefix + 'scripts/search-worker.js';\n\n  try {\n    searchWorker = new Worker(workerScriptUrl, {name: packageName === null ? \"main\" : packageName + '/' + packageVersion});\n    searchWorker.addEventListener('message', e => handleSearchResults(e.data.query, e.data.results));\n  } catch (e) {\n    // could not initialize worker, presumably because we are a file:/// page and content security policy got in the way\n    // fall back to running searches synchronously without a worker\n    // this requires loading search related scripts that would otherwise be loaded by the worker\n\n    searchWorker = null;\n    let pendingScripts = 3;\n\n    const onScriptLoaded = () => {\n      if (--pendingScripts === 0) {\n        initSearchIndex();\n        nonWorkerSearchInitialized = true;\n        if (searchInput.focused) {\n          triggerSearch(searchInput.value);\n        }\n      }\n    };\n    \n    const script1 = document.createElement('script');\n    script1.src = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + 'search-index.js';\n    script1.async = true;\n    script1.onload = onScriptLoaded;\n    document.head.append(script1);\n\n    const script2 = document.createElement('script');\n    script2.src = rootUrlPrefix;\n    script2.async = true;\n    script2.onload = onScriptLoaded;\n    document.head.append(script2);\n\n    const script3 = document.createElement('script');\n    script3.src = workerScriptUrl;\n    script3.async = true;\n    script3.onload = onScriptLoaded;\n    document.head.append(script3);\n  }\n}\n\n// Updates search results unless they are stale.\nfunction handleSearchResults(query, results) {\n  if (query.inputValue !== searchInput.value) return;\n\n  updateSearchResults(renderSearchResults(query, results));\n}\n\n// TODO: Should this (or its callers) use requestAnimationFrame() ?\n// Removes any currently displayed search results, then displays the given results if non-null.\nfunction updateSearchResults(resultsDiv) {\n  selectedSearchResult = null;\n\n  const oldResultsDiv = document.getElementById('search-results');\n  if (oldResultsDiv !== null) {\n    searchElement.removeChild(oldResultsDiv);\n  }\n\n  if (resultsDiv != null) {\n    searchElement.append(resultsDiv);\n    selectNextResult(resultsDiv.firstElementChild);\n  }\n}\n\n// Returns the module of the given member, or `null` if the given member is a module.\nfunction getModule(member) {\n  switch (member.level) {\n    case 0:\n      return null;\n    case 1:\n      return member.parent;\n    case 2:\n      return member.parent.parent;\n  }\n}\n\n// Triggers a search unless search input is invalid or incomplete.\nfunction triggerSearch(inputValue) {\n  const query = parseSearchInput(inputValue);\n  if (!isActionableQuery(query)) {\n    handleSearchResults(query, null);\n    return;\n  }\n\n  if (searchWorker !== null) {\n    searchWorker.postMessage({query, packageName, moduleName, className});\n  } else if (nonWorkerSearchInitialized) {\n    const results = runSearch(query, packageName, moduleName, className);\n    handleSearchResults(query, results);\n  }\n}\n\n// Tells if the given Unicode character is a whitespace character.\nfunction isWhitespace(ch) {\n  const cp = ch.codePointAt(0);\n  if (cp >= 9 && cp <= 13 || cp === 32 || cp === 133 || cp === 160) return true;\n  if (cp < 5760) return false;\n  return cp === 5760 || cp >= 8192 && cp <= 8202\n      || cp === 8232 || cp === 8233 || cp === 8239 || cp === 8287 || cp === 12288;\n}\n\n// Trims the given Unicode characters.\nfunction trim(chars) {\n  const length = chars.length;\n  let startIdx, endIdx;\n\n  for (startIdx = 0; startIdx < length; startIdx += 1) {\n    if (!isWhitespace(chars[startIdx])) break;\n  }\n  for (endIdx = chars.length - 1; endIdx > startIdx; endIdx -= 1) {\n    if (!isWhitespace(chars[endIdx])) break;\n  }\n  return chars.slice(startIdx, endIdx + 1);\n}\n\n// Parses the user provided search input.\n// Preconditions:\n// inputValue !== ''\nfunction parseSearchInput(inputValue) {\n  const chars = trim(Array.from(inputValue));\n  const char0 = chars[0]; // may be undefined\n  const char1 = chars[1]; // may be undefined\n  const prefix = char1 === ':' ? char0 + char1 : null;\n  const kind =\n      prefix === null ? null :\n          char0 === 'm' ? 1 :\n              char0 === 't' ? 2 :\n                  char0 === 'c' ? 3 :\n                      char0 === 'f' ? 4 :\n                          char0 === 'p' ? 5 :\n                              undefined;\n  const unprefixedChars = kind !== null && kind !== undefined ?\n      trim(chars.slice(2, chars.length)) :\n      chars;\n  const normalizedCps = toNormalizedCodePoints(unprefixedChars);\n  return {inputValue, prefix, kind, normalizedCps};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\n// Note: Keep in sync with same function in search-worker.js.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Tells if the given query is valid and long enough to be worth running.\n// Prefixed queries require fewer minimum characters than unprefixed queries.\n// This avoids triggering a search while typing a prefix yet still enables searching for single-character names.\n// For example, `p:e` finds `pkl.math#E`.\nfunction isActionableQuery(query) {\n  const kind = query.kind;\n  const queryCps = query.normalizedCps;\n  return kind !== undefined && (kind !== null && queryCps.length > 0 || queryCps.length > 1);\n}\n\n// Renders the given search results for the given query.\n// Preconditions:\n// isActionableQuery(query) ? results !== null : results === null\nfunction renderSearchResults(query, results) {\n  const resultsDiv = document.createElement('div');\n  resultsDiv.id = 'search-results';\n  const ul = document.createElement('ul');\n  resultsDiv.append(ul);\n\n  if (results === null) {\n    if (query.kind !== undefined) return null;\n\n    const li = document.createElement('li');\n    li.className = 'heading';\n    li.textContent = 'Unknown search prefix. Use one of <b>m:</b> (module), <b>c:</b> (class), <b>f:</b> (function), or <b>p:</b> (property).';\n    ul.append(li);\n    return resultsDiv;\n  }\n\n  const {exactMatches, classMatches, moduleMatches, otherMatches} = results;\n\n  if (exactMatches.length + classMatches.length + moduleMatches.length + otherMatches.length === 0) {\n    renderHeading('No results found', ul);\n    return resultsDiv;\n  }\n\n  if (exactMatches.length > 0) {\n    renderHeading('Top hits', ul);\n    renderMembers(query.normalizedCps, exactMatches, ul);\n  }\n  if (classMatches.length > 0) {\n    renderHeading('Class', ul, className);\n    renderMembers(query.normalizedCps, classMatches, ul);\n  }\n  if (moduleMatches.length > 0) {\n    renderHeading('Module', ul, moduleName);\n    renderMembers(query.normalizedCps, moduleMatches, ul);\n  }\n  if (otherMatches.length > 0) {\n    renderHeading('Other results', ul);\n    renderMembers(query.normalizedCps, otherMatches, ul);\n  }\n\n  return resultsDiv;\n}\n\n// Adds a heading such as `Top matches` to the search results list.\nfunction renderHeading(title, ul, name = null) {\n  const li = document.createElement('li');\n  li.className = 'heading';\n  li.append(title);\n  if (name != null) {\n    li.append(' ');\n    li.append(span('heading-name', name))\n  }\n  ul.append(li);\n}\n\n// Adds matching members to the search results list.\nfunction renderMembers(queryCps, members, ul) {\n  for (const member of members) {\n    ul.append(renderMember(queryCps, member));\n  }\n}\n\n// Renders a member to be added to the search result list.\nfunction renderMember(queryCps, member) {\n  const result = document.createElement('li');\n  result.className = 'result';\n  if (member.deprecated) result.className = 'deprecated';\n\n  const link = document.createElement('a');\n  result.append(link);\n\n  link.href = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + member.url;\n  link.addEventListener('mousedown', () => selectResult(result));\n  link.addEventListener('click', clearSearch);\n\n  const keyword = getKindKeyword(member.kind);\n  // noinspection JSValidateTypes (IntelliJ bug?)\n  if (keyword !== null) {\n    link.append(span('keyword', keyword), ' ');\n  }\n\n  // prefix with class name if a class member\n  if (member.level === 2) {\n    link.append(span(\"context\", member.parent.name + '.'));\n  }\n\n  const name = span('result-name');\n  if (member.matchNameIdx === 0) { // main name matched\n    highlightMatch(queryCps, member.names[0], member.matchStartIdx, name);\n  } else { // aka name matched\n    name.append(member.name);\n  }\n  link.append(name);\n\n  if (member.signature !== null) {\n    link.append(member.signature);\n  }\n\n  if (member.matchNameIdx > 0) { // aka name matched\n    link.append(' ');\n    const aka = span('aka');\n    aka.append('(known as: ');\n    const name = span('aka-name');\n    highlightMatch(queryCps, member.names[member.matchNameIdx], member.matchStartIdx, name);\n    aka.append(name, ')');\n    link.append(aka);\n  }\n\n  // add module name if not a module\n  const module = getModule(member);\n  if (module !== null) {\n    link.append(' ', span('context', '(' + module.name + ')'));\n  }\n\n  return result;\n}\n\n// Returns the keyword for the given member kind.\nfunction getKindKeyword(kind) {\n  switch (kind) {\n    case 0:\n      return \"package\";\n    case 1:\n      return \"module\";\n    case 2:\n      return \"typealias\";\n    case 3:\n      return \"class\";\n    case 4:\n      return \"function\";\n    case 5:\n      // properties have no keyword\n      return null;\n  }\n}\n\n// Highlights the matching characters in a member name.\n// Preconditions:\n// queryCps.length > 0\n// computeMatchFrom(queryCps, name.normalizedCps, name.wordStarts, matchStartIdx)\nfunction highlightMatch(queryCps, name, matchStartIdx, parentElem) {\n  const queryLength = queryCps.length;\n  const codePoints = name.codePoints;\n  const nameCps = name.normalizedCps;\n  const nameLength = nameCps.length;\n  const wordStarts = name.wordStarts;\n\n  let queryIdx = 0;\n  let queryCp = queryCps[0];\n  let startIdx = matchStartIdx;\n\n  if (startIdx > 0) {\n    parentElem.append(String.fromCodePoint(...codePoints.subarray(0, startIdx)));\n  }\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp !== nameCp) {\n      const newNameIdx = wordStarts[nameIdx];\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx))));\n      startIdx = newNameIdx;\n      parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx, newNameIdx)));\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx + 1))));\n      if (nameIdx + 1 < nameLength) {\n        parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx + 1, nameLength)));\n      }\n      return;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  throw 'Precondition violated: `computeMatchFrom()`';\n}\n\n// Creates a span element.\nfunction span(className, text = null) {\n  const result = document.createElement('span');\n  result.className = className;\n  result.textContent = text;\n  return result;\n}\n\n// Creates a text node.\nfunction text(content) {\n  return document.createTextNode(content);\n}\n\n// Navigates to the next member entry in the search results list, skipping headings.\nfunction selectNextResult(ul) {\n  let next = selectedSearchResult === null ? ul.firstElementChild : selectedSearchResult.nextElementSibling;\n  while (next !== null) {\n    if (!next.classList.contains('heading')) {\n      selectResult(next);\n      scrollIntoView(next, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    next = next.nextElementSibling;\n  }\n}\n\n// Navigates to the previous member entry in the search results list, skipping headings.\nfunction selectPrevResult(ul) {\n  let prev = selectedSearchResult === null ? ul.lastElementChild : selectedSearchResult.previousElementSibling;\n  while (prev !== null) {\n    if (!prev.classList.contains('heading')) {\n      selectResult(prev);\n      const prev2 = prev.previousElementSibling;\n      // make any immediately preceding heading visible as well (esp. important for first heading)\n      const scrollTo = prev2 !== null && prev2.classList.contains('heading') ? prev2 : prev;\n      scrollIntoView(scrollTo, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    prev = prev.previousElementSibling;\n  }\n}\n\n// Selects the given entry in the search results list.\nfunction selectResult(li) {\n  if (selectedSearchResult !== null) {\n    selectedSearchResult.classList.remove('selected');\n  }\n  li.classList.add('selected');\n  selectedSearchResult = li;\n}\n\n// Clears the search input and hides/removes the search results list.\nfunction clearSearch() {\n  searchInput.value = '';\n  updateSearchResults(null);\n}\n\nconst updateRuntimeDataWith = (buildAnchor) => (fragmentId, entries) => {\n  if (!entries) return;\n  const fragment = document.createDocumentFragment();\n  let first = true;\n  for (const entry of entries) {\n    const a = document.createElement(\"a\");\n    buildAnchor(entry, a);\n    if (first) {\n      first = false;\n    } else {\n      fragment.append(\", \");\n    }\n    fragment.append(a);\n  }\n\n  const element = document.getElementById(fragmentId);\n  element.append(fragment);\n  element.classList.remove(\"hidden\"); // dd\n  element.previousElementSibling.classList.remove(\"hidden\"); // dt\n}\n\n// Functions called by JS data scripts.\n// noinspection JSUnusedGlobalSymbols\nconst runtimeData = {\n  knownVersions: (versions, myVersion) => {\n    updateRuntimeDataWith((entry, anchor) => {\n      const { text, href } = entry;\n      anchor.textContent = text;\n      // noinspection JSUnresolvedReference\n      if (text === myVersion) {\n        anchor.className = \"current-version\";\n      } else if (href) {\n        anchor.href = href;\n      }\n    })(\"known-versions\", versions);\n  },\n  knownUsagesOrSubtypes: updateRuntimeDataWith((entry, anchor) => {\n    const { text, href } = entry;\n    anchor.textContent = text;\n    // noinspection JSUnresolvedReference\n    anchor.textContent = text;\n    if (href) {\n      anchor.href = href;\n    }\n  }),\n}\n"
  },
  {
    "path": "pkl-doc/src/main/resources/org/pkl/doc/scripts/search-worker.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// populated by `initSearchIndex()`\nlet searchIndex;\n\n// noinspection ThisExpressionReferencesGlobalObjectJS\nconst isWorker = 'DedicatedWorkerGlobalScope' in this;\n\nif (isWorker) {\n  const workerName = self.name;\n  // relative to this file\n  const searchIndexUrl = workerName === \"main\" ?\n      '../search-index.js' :\n      '../' + workerName + '/search-index.js';\n  importScripts(searchIndexUrl);\n  initSearchIndex();\n  addEventListener('message', e => {\n    const {query, packageName, moduleName, className} = e.data;\n    const results = runSearch(query, packageName, moduleName, className);\n    postMessage({query, results});\n  });\n} else {\n  // non-worker environment\n  // `pkldoc.js` loads scripts and calls `initSearchIndex()`\n}\n\n// Initializes the search index.\nfunction initSearchIndex() {\n  // noinspection JSUnresolvedVariable\n  const data = JSON.parse(searchData);\n  const index = Array(data.length);\n  let idx = 0;\n\n  for (const entry of data) {\n    const name = entry.name;\n    const names = toIndexedNames(entry);\n    // 0 -> package, 1 -> module, 2 -> type alias, 3 -> class, 4 -> function, 5 -> property\n    const kind = entry.kind;\n    const url = entry.url;\n    // noinspection JSUnresolvedVariable\n    const signature = entry.sig === undefined ? null : entry.sig;\n    // noinspection JSUnresolvedVariable\n    const parent = entry.parId === undefined ? null : index[entry.parId];\n    const level = parent === null ? 0 : parent.parent === null ? 1 : 2;\n    const deprecated = entry.deprecated !== undefined;\n\n    index[idx++] = {\n      name,\n      names,\n      kind,\n      url,\n      signature,\n      parent,\n      level,\n      deprecated,\n      // remaining attributes are set by `computeMatchFrom` and hence aren't strictly part of the search index\n      matchNameIdx: -1,  // names[matchNameIdx] is the name that matched\n      matchStartIdx: -1, // names[matchNameIdx].codePoints[matchStartIdx] is the first code point that matched\n      similarity: 0 // number of code points matched relative to total number of code points (between 0.0 and 1.0)\n    };\n  }\n\n  searchIndex = index;\n}\n\n// Runs a search and returns its results.\nfunction runSearch(query, packageName, moduleName, className) {\n  const queryCps = query.normalizedCps;\n  const queryKind = query.kind;\n\n  let exactMatches = [];\n  let classMatches = [];\n  let moduleMatches = [];\n  let otherMatches = [];\n\n  for (const member of searchIndex) {\n    if (queryKind !== null && queryKind !== member.kind) continue;\n\n    if (!isMatch(queryCps, member)) continue;\n\n    if (member.similarity === 1) {\n      exactMatches.push(member);\n    } else if (moduleName !== null && member.level === 1 && moduleName === member.parent.name) {\n      moduleMatches.push(member);\n    } else if (moduleName !== null && member.level === 2 && moduleName === member.parent.parent.name) {\n      if (className !== null && className === member.parent.name) {\n        classMatches.push(member);\n      } else {\n        moduleMatches.push(member);\n      }\n    } else {\n      otherMatches.push(member);\n    }\n  }\n\n  // Sorts members best-first.\n  function compareMembers(member1, member2) {\n    const normDiff = member2.similarity - member1.similarity; // higher is better\n    if (normDiff !== 0) return normDiff;\n\n    const lengthDiff = member1.matchNameLength - member2.matchNameLength; // lower is better\n    if (lengthDiff !== 0) return lengthDiff;\n\n    const kindDiff = member2.kind - member1.kind; // higher is better\n    if (kindDiff !== 0) return kindDiff;\n\n    return member1.matchNameIdx - member2.matchNameIdx; // lower is better\n  }\n\n  exactMatches.sort(compareMembers);\n  classMatches.sort(compareMembers);\n  moduleMatches.sort(compareMembers);\n  otherMatches.sort(compareMembers);\n\n  return {exactMatches, classMatches, moduleMatches, otherMatches};\n}\n\n// Indexes a member's names.\nfunction toIndexedNames(entry) {\n  const result = [];\n  result.push(toIndexedName(entry.name));\n  // noinspection JSUnresolvedVariable\n  const alsoKnownAs = entry.aka;\n  if (alsoKnownAs !== undefined) {\n    for (const name of alsoKnownAs) {\n      result.push(toIndexedName(name));\n    }\n  }\n  return result;\n}\n\n// Indexes the given name.\nfunction toIndexedName(name) {\n  const characters = Array.from(name);\n  const codePoints = Uint32Array.from(characters, ch => ch.codePointAt(0));\n  const normalizedCps = toNormalizedCodePoints(characters);\n  const wordStarts = toWordStarts(characters);\n\n  return {codePoints, normalizedCps, wordStarts};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Returns an array of same length as `characters` that for every index, holds the index of the next word start.\n// Preconditions:\n// characters.length > 0\nfunction toWordStarts(characters) {\n  const length = characters.length;\n  // -1 is used as 'no next word start exists' -> use signed int array\n  const result = length <= 128 ? new Int8Array(length) : new Int16Array(length);\n\n  if (length > 1) {\n    let class1 = toCharClass(characters[length - 1]);\n    let class2;\n    let wordStart = -1;\n    for (let idx = length - 1; idx >= 1; idx -= 1) {\n      class2 = class1;\n      class1 = toCharClass(characters[idx - 1]);\n      const diff = class1 - class2;\n      // transitions other than uppercase -> other\n      if (diff !== 0 && diff !== 3) wordStart = idx;\n      result[idx] = wordStart;\n      // uppercase -> other\n      if (diff === 3) wordStart = idx - 1;\n    }\n  }\n\n  // first character is always a word start\n  result[0] = 0;\n\n  return result;\n}\n\n\n// Partitions characters into uppercase, digit, dot, and other.\nfunction toCharClass(ch) {\n  const regexIsUppercase = /\\p{Lu}/u\n  const regexIsNumericCharacter = /\\p{N}/u\n  return regexIsUppercase.test(ch) ? 3 : regexIsNumericCharacter.test(ch) ? 2 : ch === '.' ? 1 : 0;\n}\n\n// Tests if `queryCps` matches any of `member`'s names.\n// If so, records information about the match in `member`.\n// Preconditions:\n// queryCps.length > 0\nfunction isMatch(queryCps, member) {\n  const queryLength = queryCps.length;\n  let nameIdx = 0;\n\n  for (const name of member.names) {\n    const nameCps = name.normalizedCps;\n    const nameLength = nameCps.length;\n    const wordStarts = name.wordStarts;\n    const maxStartIdx = nameLength - queryLength;\n\n    for (let startIdx = 0; startIdx <= maxStartIdx; startIdx += 1) {\n      const matchLength = computeMatchFrom(queryCps, nameCps, wordStarts, startIdx);\n      if (matchLength > 0) {\n        member.matchNameIdx = nameIdx;\n        member.matchStartIdx = startIdx;\n        // Treat exact match of last module name component as exact match (similarity == 1).\n        // For example, treat \"PodSpec\" as exact match for \"io.k8s.api.core.v1.PodSpec\".\n        // Because \"ps\" is considered an exact match for \"PodSpec\",\n        // it is also considered an exact match for \"io.k8s.api.core.v1.PodSpec\".\n        const isExactMatchOfLastModuleNameComponent =\n            startIdx > 0 && nameCps[startIdx - 1] === 46 /* '.' */ && matchLength === nameLength - startIdx;\n        member.similarity = isExactMatchOfLastModuleNameComponent ? 1 : matchLength / nameLength;\n        member.matchNameLength = nameLength;\n        return true;\n      }\n    }\n\n    nameIdx += 1;\n  }\n\n  return false;\n}\n\n// Tests if the given query matches the given name from `startIdx` on.\n// Returns the number of code points matched.\n// Word start matches get special treatment.\n// For example, `sb` is considered to match all code points of `StringBuilder`.\n// Preconditions:\n// queryCps.length > 0\n// nameCps.length > 0\n// wordStarts.length === nameCps.length\n// startIdx < nameCps.length\nfunction computeMatchFrom(queryCps, nameCps, wordStarts, startIdx) {\n  const queryLength = queryCps.length;\n  const nameLength = nameCps.length;\n  const beginsWithWordStart = wordStarts[startIdx] === startIdx;\n\n  let queryIdx = 0;\n  let matchLength = 0;\n  let queryCp = queryCps[0];\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp === nameCp) {\n      matchLength += 1;\n    } else { // check for word start match\n      if (nameIdx === startIdx || !beginsWithWordStart) return 0;\n\n      const newNameIdx = wordStarts[nameIdx];\n      if (newNameIdx === -1) return 0;\n\n      const newNameCp = nameCps[newNameIdx];\n      if (queryCp !== newNameCp) return 0;\n\n      matchLength += newNameIdx - nameIdx + 1;\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      // in case of a word start match, increase matchLength by number of remaining chars of the last matched word\n      const nextIdx = nameIdx + 1;\n      if (beginsWithWordStart && nextIdx < nameLength) {\n        const nextStart = wordStarts[nextIdx];\n        if (nextStart === -1) {\n          matchLength += nameLength - nextIdx;\n        } else {\n          matchLength += nextStart - nextIdx;\n        }\n      }\n\n      return matchLength;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/main/resources/org/pkl/doc/styles/pkldoc.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-Regular'),\n  url('../fonts/lato-v14-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Lato Bold'), local('Lato-Bold'),\n  url('../fonts/lato-v14-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Regular'), local('OpenSans-Regular'),\n  url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Open Sans Italic'), local('OpenSans-Italic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Open Sans Bold'), local('OpenSans-Bold'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Source Code Pro'), local('SourceCodePro-Regular'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Material Icons';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Material Icons'),\n  local('MaterialIcons-Regular'),\n  url(../fonts/MaterialIcons-Regular.woff2) format('woff2');\n}\n\n.material-icons {\n  /*noinspection CssNoGenericFontName*/\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 24px;\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  line-height: 1;\n  text-transform: none;\n  letter-spacing: normal;\n  word-wrap: normal;\n  white-space: nowrap;\n  direction: ltr;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  -moz-osx-font-smoothing: grayscale;\n  font-feature-settings: 'liga';\n}\n\ninput[type=search] {\n  -webkit-appearance: textfield;\n}\n\ninput[type=search]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\ninput::-moz-placeholder {\n  opacity: 1;\n}\n\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n  border: 0;\n  font-family: inherit;\n  font-size: 100%;\n  font-style: inherit;\n  font-weight: inherit;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  vertical-align: baseline;\n}\n\nbody {\n  margin: 0;\n  font-family: Lato, Arial, sans-serif;\n  background-color: #f0f3f6;\n  scroll-behavior: smooth;\n}\n\na, a:visited, a:hover, a:active {\n  color: inherit;\n}\n\na:hover {\n  text-decoration: none;\n  transition: 0s;\n}\n\ncode, .member-modifiers, .member-signature, .doc-comment pre, #search-results li.result, .result-name, .heading-name, .aka-name {\n  font-family: \"Source Code Pro\", monospace;\n  letter-spacing: -0.03em;\n}\n\nheader {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw; /* vw to make sure that positioning is the same whether or not vertical scrollbar is displayed */\n  height: 32px;\n  z-index: 1;\n  background-color: #364550;\n  padding: 7px 0 7px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n}\n\n#doc-title {\n  position: absolute;\n  margin-top: 8px;\n  margin-left: 15px;\n}\n\n#doc-title a {\n  color: #fff;\n  text-decoration: none;\n}\n\n#search {\n  position: relative;\n  width: 50vw;\n  margin: 0 auto;\n}\n\n#search-icon {\n  position: absolute;\n  left: 0;\n  top: 2px;\n  padding: 4px;\n  font-size: 21px;\n  color: #a5a9a9;\n}\n\n#search-input {\n  margin-top: 2px;\n  width: 100%;\n  height: 28px;\n  text-indent: 28px;\n  font-size: 0.85em;\n  background-color: rgba(255, 255, 255, 0.2);\n  border: none;\n  border-radius: 3px;\n  color: #fff;\n}\n\n#search-input:focus {\n  background-color: #6D7880;\n  outline: none;\n}\n\n#search-input::placeholder {\n  text-align: center;\n  color: #A5A9A9;\n}\n\n#search-input:focus::placeholder {\n  color: transparent;\n}\n\n#search-results {\n  position: fixed;\n  box-sizing: border-box;\n  top: 38px;\n  left: 25vw;\n  right: 25vw;\n  width: 50vw;\n  max-height: 80%;\n  color: #103a51;\n  background: white;\n  border: solid 1px #6D7880;\n  border-radius: 3px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n  white-space: nowrap;\n\n  overflow: auto; /* in safari, this slows down painting, blocking the ui */\n  /*noinspection CssUnknownProperty*/\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n}\n\n#search-results a {\n  text-decoration: none;\n}\n\n#search-results a:hover {\n  text-decoration: underline;\n}\n\n#search-results ul {\n  list-style: none;\n  font-size: 0.9em;\n}\n\n#search-results li {\n  padding: 0.2ch 3ch;\n  height: 17px; /* used same height regardless of which fonts are used in content */\n}\n\n#search-results li.heading {\n  background-color: #f0f3f6;\n  padding: 0.4ch 1ch;\n}\n\n#search-results li.result {\n  font-size: 0.9em;\n}\n\n#search-results .keyword {\n  color: #000082;\n}\n\n#search-results .highlight {\n  font-weight: bold;\n}\n\n#search-results .context {\n  color: gray;\n}\n\n#search-results .selected, #search-results .selected .keyword, #search-results .selected .aka, #search-results .selected .context {\n  background: darkblue;\n  color: white;\n}\n\n#search-results .deprecated {\n  text-decoration: line-through;\n}\n\n/* make sure that line-through of highlighted region of selected search result has the right color */\n#search-results .deprecated.selected .highlight {\n  text-decoration: line-through;\n}\n\nmain {\n  width: 70%;\n  margin: 60px auto 20px;\n}\n\n.declaration-parent-link {\n  margin: 0 0 1rem;\n}\n\n#declaration-title {\n  font-size: 2em;\n  font-weight: bold;\n  color: #103a51;\n  margin: 0.5rem 0;\n}\n\n#declaration-version {\n  color: #A5A9A9;\n  font-size: 0.9em;\n  vertical-align: bottom;\n  padding-left: 0.25em;\n}\n\n.member-group-links {\n  margin: 0.75em 0 1em 0;\n}\n\n.member-group-links li {\n  display: inline-block;\n  margin-right: 1em;\n}\n\n.member-info {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  line-height: 1.5;\n  margin-top: 0.5em;\n  font-size: 0.9em;\n}\n\n.member-info dt {\n  grid-column: 1;\n  text-align: right;\n}\n\n.member-info dd {\n  grid-column: 2;\n  margin-left: 0.5em;\n}\n\n.copy-uri-button {\n  cursor: pointer;\n  font-size: inherit;\n  margin-left: 0.5em;\n}\n\n.member-group {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.member-group-title {\n  margin: 1rem;\n  font-weight: bold;\n  color: #103a51;\n}\n\n.toggle-inherited-members {\n  font-size: 0.9em;\n  font-weight: normal;\n  margin-left: 0.5em;\n}\n\n.button-link {\n  text-decoration: underline;\n}\n\n.button-link:hover, .button-link:active {\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.member-group ul {\n  list-style: none;\n}\n\n.member-group li {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.anchor,\n.anchor-param1,\n.anchor-param2,\n.anchor-param3,\n.anchor-param4,\n.anchor-param5,\n.anchor-param6,\n.anchor-param7,\n.anchor-param8,\n.anchor-param9 {\n  position: absolute;\n  top: -60px;\n  left: 0;\n}\n\n.anchor:target ~ .member,\n.anchor-param1:target ~ .member,\n.anchor-param2:target ~ .member,\n.anchor-param3:target ~ .member,\n.anchor-param4:target ~ .member,\n.anchor-param5:target ~ .member,\n.anchor-param6:target ~ .member,\n.anchor-param7:target ~ .member,\n.anchor-param8:target ~ .member,\n.anchor-param9:target ~ .member {\n  border-left: 3px solid #222832;\n}\n\n.anchor:target ~ .member .name-decl,\n.anchor-param1:target ~ .member .param1,\n.anchor-param2:target ~ .member .param2,\n.anchor-param3:target ~ .member .param3,\n.anchor-param4:target ~ .member .param4,\n.anchor-param5:target ~ .member .param5,\n.anchor-param6:target ~ .member .param6,\n.anchor-param7:target ~ .member .param7,\n.anchor-param8:target ~ .member .param8,\n.anchor-param9:target ~ .member .param9 {\n  font-weight: bold;\n}\n\n.member {\n  border-left: 3px solid transparent;\n  margin: 0 auto 0.5rem;\n  background-color: #fff;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n  font-size: 0.9em;\n  padding: 10px;\n  color: #222832;\n}\n\n.member:hover {\n  background-color: #f2f2f2;\n}\n\n.member-left {\n  width: 25%;\n  display: inline;\n  float: left;\n  padding-right: 6px;\n  min-height: 1px;\n  text-align: right;\n}\n\n.member-modifiers {\n  color: #000082;\n}\n\n.member-main {\n  display: block;\n  overflow: hidden;\n}\n\n.member-deprecated {\n  text-decoration: line-through;\n}\n\n.member-selflink {\n  visibility: hidden;\n  display: inline;\n  float: left;\n  padding-right: 20px;\n  color: #222832;\n  text-decoration: none;\n}\n\n.member-source-link {\n  visibility: hidden;\n  color: #fff;\n  background-color: #868e96;\n  display: inline-block;\n  margin-left: 1em;\n  padding: .25em .4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  vertical-align: bottom;\n  border-radius: .25rem\n}\n\n.member-source-link:visited, .member-source-link:hover, .member-source-link:active {\n  color: #fff;\n}\n\n.member:hover .member-source-link, .member:hover .member-selflink {\n  visibility: visible;\n}\n\n.member.inherited, .member.hidden-member {\n  opacity: 0.75;\n}\n\n.member.inherited .context {\n  color: gray;\n}\n\n.member.with-page-link, .member.with-expandable-docs {\n  cursor: pointer;\n}\n\n.member .expandable-docs-icon {\n  float: right;\n}\n\n/*\nDon't style a.name-decl as link\nbecause the entire .member.with-page-link is effectively a link (via JS).\n*/\n.member.with-page-link a.name-decl {\n  text-decoration: none;\n}\n\n.expandable {\n  transform: scaleY(1);\n  transition: transform 0.25s;\n}\n\n.expandable.collapsed {\n  transform: scaleY(0);\n}\n\n.expandable.hidden {\n  display: none;\n}\n\n#_declaration .expandable {\n  transform: none;\n  transition: none;\n}\n\n#_declaration .expandable.collapsed {\n  mask: linear-gradient(rgb(0 0 0), transparent) content-box;\n  height: 100px;\n}\n\n#_declaration .expandable.hidden {\n  display: block;\n}\n\n/* show an otherwise hidden inherited member if it's a link target */\n.anchor:target + .expandable.collapsed.hidden {\n  display: inherit;\n  transform: scaleY(1);\n}\n\n.doc-comment {\n  color: #103a51;\n  margin-top: 0.5rem;\n  font-family: \"Open Sans\", sans-serif;\n  font-size: 0.9em;\n}\n\n.doc-comment p {\n  margin: 0.7em 0;\n}\n\n.doc-comment p:first-child {\n  margin-top: 0;\n}\n\n.doc-comment p:last-child {\n  margin-bottom: 0;\n}\n\n.doc-comment h1,\n.doc-comment h2,\n.doc-comment h3,\n.doc-comment h4,\n.doc-comment h5,\n.doc-comment h6 {\n  margin-bottom: 0.7em;\n  margin-top: 1.4em;\n  display: block;\n  text-align: left;\n  font-weight: bold;\n}\n\n.doc-comment pre {\n  padding: 0.5em;\n  border: 0 solid #ddd;\n  background-color: #364550;\n  color: #ddd;\n  margin: 5px 0;\n  display: block;\n  border-radius: 0.2em;\n  overflow-x: auto;\n}\n\n.doc-comment ul {\n  display: block;\n  list-style: circle;\n  padding-left: 20px;\n}\n\n.doc-comment ol {\n  display: block;\n  padding-left:20px;\n}\n\n.doc-comment ol.decimal {\n  list-style: decimal;\n}\n\n.doc-comment ol.lowerAlpha {\n  list-style: lower-alpha;\n}\n\n.doc-comment ol.upperAlpha {\n  list-style: upper-alpha;\n}\n\n.doc-comment ol.lowerRoman {\n  list-style: lower-roman;\n}\n\n.doc-comment ol.upperRoman {\n  list-style: upper-roman;\n}\n\n.doc-comment li {\n  display: list-item;\n}\n\n.doc-comment code {\n  font-weight: normal;\n}\n\n.doc-comment em, .doc-comment i {\n  font-style: italic;\n}\n\n.doc-comment strong, .doc-comment b {\n  font-weight: bold;\n}\n\n.runtime-data.hidden {\n  display: none;\n}\n\n.runtime-data .current-version {\n  font-weight: bold;\n}\n\n/*\nStyling for Markdown tables in doc comments.\nFrom: https://gist.github.com/andyferra/2554919\n*/\n\ntable {\n  padding: 0;\n}\n\ntable tr {\n  border-top: 1px solid #cccccc;\n  background-color: white;\n  margin: 0;\n  padding: 0;\n}\n\ntable tr:nth-child(2n) {\n  background-color: #f8f8f8;\n}\n\ntable tr th {\n  font-weight: bold;\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr td {\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr th :first-child, table tr td :first-child {\n  margin-top: 0;\n}\n\ntable tr th :last-child, table tr td :last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.externalpackage/doc-package-info.pkl",
    "content": "amends \"pkl:DocPackageInfo\"\n\nname = \"com.externalpackage\"\nversion = \"1.2.3\"\nimportUri = \"https://example.com/\"\nauthors {\n  \"publisher-externalpackage@group.apple.com\"\n}\nsourceCode = \"https://example.com/externalpackage/\"\nsourceCodeUrlScheme = \"https://example.com/blob/\\(version)%{path}#L%{line}-L%{endLine}\"\nissueTracker = \"https://example.com/externalpackage/issues\"\n\ndependencies {\n  new {\n    name = \"pkl\"\n    // use fixed version to avoid churn in expected test outputs\n    version = \"0.24.0\"\n    sourceCode = \"https://github.com/apple/\\(name)/blob/dev/stdlib/\"\n    sourceCodeUrlScheme = \"https://github.com/apple/\\(name)/blob/\\(version)/stdlib%{path}#L%{line}-L%{endLine}\"\n    documentation = \"https://pkl-lang.org/stdlib/\\(name)/\\(version)/\"\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.externalpackage/external1.pkl",
    "content": "module com.externalpackage.external1\n\nclass MyClass\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.externalpackage/external2.pkl",
    "content": "module com.externalpackage.external2\n\nclass MyClass\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/Module Containing Spaces.pkl",
    "content": "/// This is a module that has spaces in its name.\nmodule com.package1.`Module Containing Spaces`\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/baseModule.pkl",
    "content": "open module com.package1.baseModule\n\nbaseProperty = 42\n\nfunction baseMethod() = 42\n\nclass BaseClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classAnnotations.pkl",
    "content": "open module com.package1.classAnnotations\n\n/// This [AnnotatedClss] thought to have a correctly spelled name.\n@Deprecated {\n  message = \"Spelling mistake.\"\n  replaceWith = \"AnnotatedClass\"\n}\n@AlsoKnownAs {\n  names { \"OtherName\" }\n}\nclass AnnotatedClss\n\n/// This [AnnotatedClssWithExpandableComment] thought to have a correctly spelled name.\n///\n/// Unfortunately, it did not, as we explain in this expandable comment.\n@Deprecated {\n  message = \"Spelling mistake.\"\n  replaceWith = \"AnnotatedClass\"\n}\n@AlsoKnownAs {\n  names { \"OtherName\" }\n}\nclass AnnotatedClssWithExpandableComment\n\n// This [AnnotatedClass] indeed has a properly spelled name, but no doc comment.\n@AlsoKnownAs {\n  names { \"OtherName\" }\n}\n@Deprecated // omit optional arguments\nclass AnnotatedClass\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classComments.pkl",
    "content": "/// The greatest breakthrough since ever.\n///\n/// ### Installation\n///\n/// Just follow these simple steps:\n///\n/// 1. Install it\n///     1. I promise it's easy.\n///     2. You'll figure it out.\n/// 1. Install it\n///     ```\n///     name = \"Pigeon\"\n///     age = 42\n///     ```\n/// 1. Install it\n///\n/// Let me **emphasize** how *simple* this is.\n///\n/// 😀😀😀 emoji day 😎😎😎 don't get 😡😡😡\n///\n/// ### Code\n///\n/// The code is beautiful:\n///\n/// ```\n/// /// example module\n/// module foo.bar\n///\n/// person {\n///   name = \"Pigeon\"\n///   age = 42\n/// }\n///\n/// function sing() = \"tra-la-la\"\n///\n/// class Person {\n///   name: String\n///   age: Int\n/// }\n/// ```\n///\n/// ### Random Tips\n///\n/// - don't give up\n///     - just don't\n/// - don't give up\n///\n/// # Level 1\n/// ## Level 2\n/// ### Level 3\n/// #### Level 4\n/// ##### Level 5\n/// ###### Level 6\n///\n/// | Command | Description |\n/// | --- | --- |\n/// | `git status` | List all *new or modified* files |\n/// | `git diff` | Show file differences that **haven't been** staged |\nopen module com.package1.classComments\n\n// Class with single-line code comment.\nclass Comments1\n\n/*\n  Class with\n  multi-line\n  code comment.\n*/\nclass Comments2\n\n/// Class with single-line doc comment.\nclass Comments3\n\n/// Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\n/// Class with multi-line and multi-paragraph doc comment (paragraph1, line2).\n///\n/// Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\n/// Class with multi-line and multi-paragraph doc comment (paragraph2, line2).\nclass Comments4\n\n/// Class with [single-line](https://apple.com) *Markdown* doc comment.\nclass Comments5\n\n/// Class with\n/// [multi-line](https://apple.com)\n/// *Markdown* doc comment.\nclass Comments6\n\n/// 😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡\nclass Comments7\n\n/// The greatest breakthrough since ever.\n///\n/// ## Installation\n///\n/// Just follow these simple steps:\n///\n/// 1. Install it\n///     1. I promise it's easy.\n///     2. You'll figure it out.\n/// 1. Install it\n///     ```\n///     name = \"Pigeon\"\n///     age = 42\n///     ```\n/// 1. Install it\n///\n/// Let me **emphasize** how *simple* this is.\n///\n/// 😀😀😀 emoji day 😎😎😎 don't get 😡😡😡\n///\n/// ## Code\n///\n/// The code is beautiful:\n///\n/// ```\n/// /// example module\n/// module foo.bar\n///\n/// person {\n///   name = \"Pigeon\"\n///   age = 42\n/// }\n///\n/// function sing() = \"tra-la-la\"\n///\n/// class Person {\n///   name: String\n///   age: Int\n/// }\n/// ```\n///\n/// ## Random Tips\n///\n/// - don't give up\n///     - just don't\n/// - don't give up\n///\n/// # Level 1\n/// ## Level 2\n/// ### Level 3\n/// #### Level 4\n/// ##### Level 5\n/// ###### Level 6\nclass Comments8\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classInheritance.pkl",
    "content": "/// Class inheritance involving abstract, open, and final classes.\nmodule com.package1.classInheritance\n\nabstract class MyClass1 {\n  /// Inherited property comment.\n  abstract property1: Boolean\n\n  /// function method1 in class MyClass1.\n  abstract function method1(arg: String): Boolean\n}\n\nopen class MyClass2 extends MyClass1 {\n  property1: Boolean = false\n  property2: String = \"\"\n\n  /// function method1 in class MyClass2.\n  function method1(arg: String): Boolean = Undefined()\n  function method2(arg: String): Boolean = Undefined()\n}\n\nabstract class MyClass3 extends MyClass2 {\n  property1: Boolean = true\n  function method1(arg: String): Boolean = Undefined()\n}\n\nclass MyClass4 extends MyClass2 {\n  property4: String = \"\"\n  function method3(arg: String): Boolean = Undefined()\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classMethodComments.pkl",
    "content": "/// Class methods with different kinds of comments.\nmodule com.package1.classMethodComments\n\nclass Comments {\n  // Method with single-line code comment.\n  function method1(): Float = Undefined()\n\n  /*\n    Method with\n    multi-line\n    code comment.\n  */\n  function method2(): Float = Undefined()\n\n  /// Method with single-line doc comment.\n  function method3(): Float = Undefined()\n\n  /// Method with\n  /// multi-line\n  /// doc comment.\n  function method4(): Float = Undefined()\n\n  /// Method with [single-line](https://apple.com) *Markdown* doc comment.\n  function method5(): Float = Undefined()\n\n  /// Method with\n  /// [multi-line](https://apple.com)\n  /// *Markdown* doc comment.\n  function method6(): Float = Undefined()\n\n  /// 😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡\n  function method7(): Float = Undefined()\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classMethodModifiers.pkl",
    "content": "/// Class methods with different modifiers.\nmodule com.package1.classMethodModifiers\n\nabstract class Modifiers {\n  /// Method with `abstract` modifier.\n  abstract function method1(arg: String): Boolean\n\n  /*\n  /// Method with `external` modifier.\n  external function method2(arg: String): Boolean\n\n  /// Method with multiple modifiers.\n  abstract external function method3(arg: String): Boolean\n  */\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classMethodTypeAnnotations.pkl",
    "content": "/// Class methods with different kinds of type annotations.\nmodule com.package1.classMethodTypeAnnotations\n\nclass TypeAnnotations {\n  /// Zero-arg method without declared types.\n  function method1() = Undefined()\n\n  /// One-arg method without declared types.\n  function method2(arg1) = Undefined()\n\n  /// Two-arg method without declared types.\n  function method3(arg1, arg2) = Undefined()\n\n  /// Zero-arg method with simple types.\n  function method4(): String = Undefined()\n\n  /// One-arg method with simple types.\n  function method5(arg1: Boolean): Int = Undefined()\n\n  /// Two-arg method with simple types.\n  function method6(arg1: Int, arg2: Float): Duration = Undefined()\n\n  /// Two-arg method with list types.\n  function method7(arg1: List<Int>, arg2: List<Float>): List<Duration> = Undefined()\n\n  /// Two-arg method with set types.\n  function method8(arg1: Set<Int>, arg2: Set<Float>): Set<Duration> = Undefined()\n\n  /// Two-arg method with map types.\n  function method9(arg1: Map<Int, Int>, arg2: Map<Float, Float>): Map<Duration, Duration> = Undefined()\n\n  /// Two-arg method with optional types.\n  function method10(arg1: Int?, arg2: Float?): Duration? = Undefined()\n\n  /// Two-arg method with function types.\n  function method11(arg1: () -> Int, arg2: (Int) -> Float): (Int, Float) -> Duration = Undefined()\n\n  /// Two-arg method with partially declared types.\n  function method12(arg1: String, arg2): Boolean = Undefined()\n\n  /// One-arg method with complex types.\n  function method13(arg1: Map<List<String?>?, (Boolean?) -> Map<Int, Float>>): Map<List<Duration?>?, (DataSize?) -> Map<Any, Number>> = Undefined()\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classMethodTypeReferences.pkl",
    "content": "/// Class methods whose types reference classes from\n/// the same module, a different module, and external modules.\nmodule com.package1.classMethodTypeReferences\n\nimport \"shared.pkl\"\n\nimport \"../com.externalpackage/external1.pkl\"\n\nimport \"../com.externalpackage/external2.pkl\"\n\nclass MyClass\n\nclass TypeReferences {\n  /// Method with intra-module types.\n  function method1(arg1: MyClass, arg2: MyClass): MyClass = Undefined()\n\n  /// Method with inter-module types.\n  function method2(arg1: shared.MyClass, arg2: shared.MyClass): shared.MyClass = Undefined()\n\n  /// Method with external-module types.\n  function method3(arg1: external1.MyClass, arg2: external2.MyClass): List<external1.MyClass> = Undefined()\n\n  /// Method with intra-module, inter-module, and external-module types.\n  function method4(arg1: MyClass, arg2: shared.MyClass): external1.MyClass = Undefined()\n\n  /// Method with complex intra-module, inter-module, and external-module types.\n  function method5(arg1: MyClass?, arg2: Map<shared.MyClass, external1.MyClass>): (external1.MyClass) -> external2.MyClass = Undefined()\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classPropertyAnnotations.pkl",
    "content": "module com.package1.classPropertyAnnotations\n\nclass UserDefinedAnnotation extends Annotation {\n  messageOpt: String?\n  messageReq: String\n}\n\nclass ClassWithAnnotatedProperty {\n  @UserDefinedAnnotation {\n    messageReq = \"Hi!\"\n  }\n  propertyUserDefinedAnnotation: Int = 42\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classPropertyComments.pkl",
    "content": "/// Class properties with different kinds of comments.\nmodule com.package1.classPropertyComments\n\nclass Comments {\n  // Property with single-line code comment.\n  property1: Float = 3.14159265359\n\n  /*\n    Property with\n    multi-line\n    code comment.\n  */\n  property2: Float = 3.14159265359\n\n  /// Property with single-line doc comment.\n  property3: Float = 3.14159265359\n\n  /// Property with\n  /// multi-line\n  /// doc comment.\n  property4: Float = 3.14159265359\n\n  /// Property with [single-line](https://apple.com) *Markdown* doc comment.\n  property5: Float = 3.14159265359\n\n  /// Property with\n  /// [multi-line](https://apple.com)\n  /// *Markdown* doc comment.\n  property6: Float = 3.14159265359\n\n  /// 😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡\n  property7: Float = 3.14159265359\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classPropertyModifiers.pkl",
    "content": "/// Class properties with different modifiers.\nmodule com.package1.classPropertyModifiers\n\nabstract class Modifiers {\n  /// Property with `local` modifier.\n  local property1 = 3.14159265359\n\n  /// Property with `hidden` modifier.\n  hidden property2: Float = 3.14159265359\n\n  /// Property with `abstract` modifier.\n  abstract property3: Float\n\n  /// Property with multiple modifiers.\n  abstract hidden property4: Float\n\n  /*\n  /// Property with `external` modifier.\n  external property5: Float\n  */\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classPropertyTypeAnnotations.pkl",
    "content": "/// Class properties with different kinds of type annotations.\nmodule com.package1.classPropertyTypeAnnotations\n\nclass TypeAnnotations {\n  /// Property without declared type.\n  property1 = 3.14159265359\n\n  /// Property with simple type.\n  property2: Float = 3.14159265359\n\n  /// Property with list type.\n  property3: List<String> = List(\"1\", \"2\", \"3\")\n\n  /// Property with set type.\n  property4: Set<String> = Set(\"1\", \"2\", \"3\")\n\n  /// Property with map type.\n  property5: Map<String, Duration> = Map(\"one\", 1.s, \"two\", 2.min, \"three\", 3.h)\n\n  /// Property with optional type.\n  property6: String? = \"string\"\n\n  /// Property with zero-arg function type.\n  property7: () -> String = () -> \"string\"\n\n  /// Property with one-arg function type.\n  property8: (String) -> Int = (str) -> str.length\n\n  /// Property with two-arg function type.\n  property9: (String, String) -> Int = (str1, str2) -> str1.length + str2.length\n\n  /// Property with complex type.\n  property10: Map<List<String?>?, (Boolean?) -> Map<Int, Float>> = Map(List(\"str\"), (b) -> Map(3, 3.0))\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classPropertyTypeReferences.pkl",
    "content": "/// Class properties whose types reference classes from\n/// the same module, a different module, and external modules.\nmodule com.package1.classPropertyTypeReferences\n\nimport \"shared.pkl\"\n\nimport \"../com.externalpackage/external1.pkl\"\n\nclass MyClass\n\nclass TypeReferences {\n  /// Property with intra-module simple type.\n  property1: MyClass = new MyClass {}\n\n  /// Property with inter-module list type.\n  property2: List<shared.MyClass> = List(new shared.MyClass {})\n\n  /// Property with external-module set type.\n  property3: Set<external1.MyClass> = Set(new external1.MyClass {})\n\n  /// Property with intra-module and inter-module map type.\n  property4: Map<MyClass, shared.MyClass> = Map(new MyClass {}, new shared.MyClass {})\n\n  /// Property with external-module optional type.\n  property5: external1.MyClass? = new external1.MyClass {}\n\n  /// Property with zero-arg intra-module function type.\n  property6: () -> MyClass = () -> new MyClass {}\n\n  /// Property with one-arg inter-module and external-module function type.\n  property7: (shared.MyClass) -> external1.MyClass = (myClass) -> new external1.MyClass {}\n\n  /// Property with two-arg intra-module, inter-module, and external-module function type.\n  property8: (MyClass, shared.MyClass) -> external1.MyClass = (myClass1, myClass2) -> new external1.MyClass {}\n\n  /// Property with intra-module mapping type.\n  property9: Mapping<String, MyClass>\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/classTypeConstraints.pkl",
    "content": "module com.package1.classTypeConstraints\n\nclass Person1 {\n  name: String(length >= 3)\n  address: Address(street != city)\n}\n\nemailAddress = (str) -> str.matches(Regex(#\".+@.+\"#))\n\nclass Person2 {\n  email: String(emailAddress)\n}\n\nclass Address {\n  street: String(!isEmpty)\n  city: String = \"San Francisco\"\n}\n\nclass Project {\n  // constraint for element type of optional type\n  type: String(oneOf(List(\"open-source\", \"closed-source\")))?\n  // constraints for map type and its constituent key/value types\n  contacts: Map<String(!isEmpty), String(emailAddress)>(length > 10, length < 20)\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/doc-package-info.pkl",
    "content": "/// Docs for Package 1.\n///\n/// * [docLinks]\n/// * [docLinks.age]\n/// * [docLinks.sing()]\n/// * [docLinks.Person]\n/// * [docLinks.Person.name]\n/// * [docLinks.PersonList]\n///\n/// * [external1]\n/// * [external1.MyClass]\n@Deprecated { message = \"com.package1 is deprecated\" }\namends \"pkl:DocPackageInfo\"\n\nimport \"docLinks.pkl\"\nimport \"../com.externalpackage/external1.pkl\"\n\nname = \"com.package1\"\nversion = \"1.2.3\"\nimportUri = \"https://example.com/\"\nauthors {\n  \"package1-publisher@group.apple.com\"\n}\nsourceCode = \"https://example.com/package1/\"\nsourceCodeUrlScheme = \"https://example.com/package1%{path}#L%{line}-L%{endLine}\"\nissueTracker = \"https://issues.apple.com/package1/\"\n\ndependencies {\n  new {\n    name = \"com.package2\"\n    version = \"4.5.6\"\n    sourceCode = \"https://example.com/package2/\"\n  }\n  new {\n    name = \"com.externalpackage\"\n    version = \"7.8.9\"\n    sourceCode = \"https://example.com/externalpackage/\"\n    documentation = \"https://example.com/docs/externalpackage/\"\n  }\n  new {\n    name = \"pkl\"\n    // use fixed version to avoid churn in expected test outputs\n    version = \"0.24.0\"\n    sourceCode = \"https://github.com/apple/pkl/blob/dev/stdlib/\"\n    sourceCodeUrlScheme = \"https://github.com/apple/pkl/blob/0.24.0/stdlib%{path}#L%{line}-L%{endLine}\"\n    documentation = \"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/\"\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/docExample.pkl",
    "content": "@DocExample {\n  subjects {\n    \"com.package1.docExampleSubject1\"\n    \"com.package1.docExampleSubject2\"\n  }\n}\nmodule com.package1.docExample\n\namends \"docExampleSubject1.pkl\"\n\nimport \"docExampleSubject2.pkl\"\n\nx = docExampleSubject2.y\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/docExample2.pkl",
    "content": "@DocExample { subjects { \"com.package1.docExampleSubject1\" } }\nmodule com.package1.docExample2\n\namends \"docExampleSubject1.pkl\"\n\nx = 42\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/docExampleSubject1.pkl",
    "content": "module com.package1.docExampleSubject1\n\nx: Int\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/docExampleSubject2.pkl",
    "content": "module com.package1.docExampleSubject2\n\ny: Int\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/docLinks.pkl",
    "content": "/// [external1], [external1.MyClass]\n/// [shared], [shared.MyClass]\n/// [age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\n/// [docLinks], [docLinks.age], [docLinks.sing()],\n/// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n/// [custom *link* text][docLinks.sing()]\n/// [module], [module.age], [module.sing()],\n/// [module.Person], [module.Person.name], [module.PersonList],\n/// [custom *link* text][module.sing()]\nmodule com.package1.docLinks\n\nimport \"../com.externalpackage/external1.pkl\"\nimport \"shared.pkl\"\nimport \"docLinks.pkl\"\n\n/// [external1], [external1.MyClass]\n/// [shared], [shared.MyClass]\n/// [age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\n/// [docLinks], [docLinks.age], [docLinks.sing()],\n/// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n/// [custom *link* text][docLinks.sing()]\n/// [module], [module.age], [module.sing()],\n/// [module.Person], [module.Person.name], [module.PersonList],\n/// [custom *link* text][module.sing()]\nage: Int\n\n/// [external1], [external1.MyClass]\n/// [shared], [shared.MyClass]\n/// [age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\n/// [docLinks], [docLinks.age], [docLinks.sing()],\n/// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n/// [custom *link* text][docLinks.sing()]\n/// [module], [module.age], [module.sing()],\n/// [module.Person], [module.Person.name], [module.PersonList],\n/// [custom *link* text][module.sing()]\n/// [song]\nfunction sing(song: String) = \"tra-la-la\"\n\n/// [external1], [external1.MyClass]\n/// [shared], [shared.MyClass]\n/// [age], [sing()], [Person], [Person.name], [Person.call()], [Person.call()], [PersonList]\n/// [docLinks], [docLinks.age], [docLinks.sing()],\n/// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n/// [custom *link* text][docLinks.sing()]\n/// [module], [module.age], [module.sing()],\n/// [module.Person], [module.Person.name], [module.PersonList],\n/// [custom *link* text][module.sing()]\n/// [name], [call()]\nclass Person {\n  /// [external1], [external1.MyClass]\n  /// [age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\n  /// [docLinks], [docLinks.age], [docLinks.sing()],\n  /// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n  /// [custom *link* text][docLinks.sing()]\n  /// [module], [module.age], [module.sing()],\n  /// [module.Person], [module.Person.name], [module.PersonList],\n  /// [custom *link* text][module.sing()]\n  /// [name], [call()]\n  name: String\n\n  /// [external1], [external1.MyClass]\n  /// [shared], [shared.MyClass]\n  /// [age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\n  /// [docLinks], [docLinks.age], [docLinks.sing()],\n  /// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n  /// [custom *link* text][docLinks.sing()]\n  /// [module], [module.age], [module.sing()],\n  /// [module.Person], [module.Person.name], [module.PersonList],\n  /// [custom *link* text][module.sing()]\n  /// [name], [call()]\n  /// [number]\n  function call(number: String) = \"calling $number\"\n}\n\n/// [external1], [external1.MyClass]\n/// [shared], [shared.MyClass]\n/// [age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\n/// [docLinks], [docLinks.age], [docLinks.sing()],\n/// [docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\n/// [custom *link* text][docLinks.sing()]\n/// [module], [module.age], [module.sing()],\n/// [module.Person], [module.Person.name], [module.PersonList],\n/// [custom *link* text][module.sing()]\ntypealias PersonList = List<Person>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/methodAnnotations.pkl",
    "content": "module com.package1.methodAnnotations\n\n/// This [mthod()] thought to have a correctly spelled name.\n@Deprecated {\n  message = \"Spelling mistake.\"\n  replaceWith = \"method()\"\n}\n@AlsoKnownAs {\n  names { \"function\" }\n}\nfunction mthod(): Int = 42\n\n\n/// This [mthod()] thought to have a correctly spelled name.\n///\n/// Unfortunately, it did not, as we explain in this expandable comment.\n@Deprecated {\n  message = \"Spelling mistake.\"\n  replaceWith = \"method()\"\n}\n@AlsoKnownAs {\n  names { \"function\" }\n}\nfunction mthodWithExpandableComment(): Int = 42\n\n\n// This [method()] indeed has a properly spelled name, but no doc comment.\n@AlsoKnownAs {\n  names { \"function\" }\n}\nfunction method(): Int = 42\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleComments.pkl",
    "content": "/// The greatest breakthrough since ever.\n///\n/// ### Installation\n///\n/// Just follow these simple steps:\n///\n/// 1. Install it\n///     1. I promise it's easy.\n///     2. You'll figure it out.\n/// 1. Install it\n///     ```\n///     name = \"Pigeon\"\n///     age = 42\n///     ```\n/// 1. Install it\n///\n/// Let me **emphasize** how *simple* this is.\n///\n/// 😀😀😀 emoji day 😎😎😎 don't get 😡😡😡\n///\n/// ### Code\n///\n/// The code is beautiful:\n///\n/// ```\n/// /// example module\n/// module foo.bar\n///\n/// person {\n///   name = \"Pigeon\"\n///   age = 42\n/// }\n///\n/// function sing() = \"tra-la-la\"\n///\n/// class Person {\n///   name: String\n///   age: Int\n/// }\n/// ```\n///\n/// ### Random Tips\n///\n/// - don't give up\n///     - just don't\n/// - don't give up\n///\n/// # Level 1\n/// ## Level 2\n/// ### Level 3\n/// #### Level 4\n/// ##### Level 5\n/// ###### Level 6\nmodule com.package1.moduleComments\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleExtend.pkl",
    "content": "module com.package1.moduleExtend\n\nextends \"baseModule.pkl\"\n\nextendProperty = 42\n\nfunction extendMethod() = 42\n\nclass ExtendClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleInfoAnnotation.pkl",
    "content": "@ModuleInfo { minPklVersion = \"0.10.0\" }\nmodule com.package1.moduleInfoAnnotation\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodCommentInheritance.pkl",
    "content": "module com.package1.moduleMethodCommentInheritance\n\nextends \"moduleMethodComments.pkl\"\n\nfunction method3(arg: String): Boolean = Undefined()\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodComments.pkl",
    "content": "/// Module methods with different kinds of comments.\nopen module com.package1.moduleMethodComments\n\n// Method with single-line code comment.\nfunction method1(): Float = Undefined()\n\n/*\n  Method with\n  multi-line\n  code comment.\n*/\nfunction method2(): Float = Undefined()\n\n/// Method with single-line doc comment.\nfunction method3(): Float = Undefined()\n\n/// Method with\n/// multi-line\n/// doc comment.\nfunction method4(): Float = Undefined()\n\n/// Method with [single-line](https://apple.com) *Markdown* doc comment.\nfunction method5(): Float = Undefined()\n\n/// Method with\n/// [multi-line](https://apple.com)\n/// *Markdown* doc comment.\nfunction method6(): Float = Undefined()\n\n/// 😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡\nfunction method7(): Float = Undefined()\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodModifiers.pkl",
    "content": "/// Module methods with different modifiers.\nmodule com.package1.moduleMethodModifiers\n\n/// Method with `abstract` modifier.\nabstract function method1(arg: String): Boolean\n\n/*\n/// Method with `external` modifier.\nexternal function method2(arg: String): Boolean\n\n/// Method with multiple modifiers.\nabstract external function method3(arg: String): Boolean\n*/\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodTypeAnnotations.pkl",
    "content": "/// Module methods with different kinds of type annotations.\nmodule com.package1.moduleMethodTypeAnnotations\n\n/// Zero-arg method without declared types.\nfunction method1() = Undefined()\n\n/// One-arg method without declared types.\nfunction method2(arg1) = Undefined()\n\n/// Two-arg method without declared types.\nfunction method3(arg1, arg2) = Undefined()\n\n/// Zero-arg method with simple types.\nfunction method4(): String = Undefined()\n\n/// One-arg method with simple types.\nfunction method5(arg1: Boolean): Int = Undefined()\n\n/// Two-arg method with simple types.\nfunction method6(arg1: Int, arg2: Float): Duration = Undefined()\n\n/// Two-arg method with list types.\nfunction method7(arg1: List<Int>, arg2: List<Float>): List<Duration> = Undefined()\n\n/// Two-arg method with set types.\nfunction method8(arg1: Set<Int>, arg2: Set<Float>): Set<Duration> = Undefined()\n\n/// Two-arg method with map types.\nfunction method9(arg1: Map<Int, Int>, arg2: Map<Float, Float>): Map<Duration, Duration> = Undefined()\n\n/// Two-arg method with optional types.\nfunction method10(arg1: Int?, arg2: Float?): Duration? = Undefined()\n\n/// Two-arg method with function types.\nfunction method11(arg1: () -> Int, arg2: (Int) -> Float): (Int, Float) -> Duration = Undefined()\n\n/// Two-arg method with partially declared types.\nfunction method12(arg1: String, arg2): Boolean = Undefined()\n\n/// One-arg method with complex types.\nfunction method13(arg1: Map<List<String?>?, (Boolean?) -> Map<Int, Float>>): Map<List<Duration?>?, (DataSize?) -> Map<Any, Number>> = Undefined()\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleMethodTypeReferences.pkl",
    "content": "/// Module methods whose types reference classes from\n/// the same module, a different module, and external modules.\nmodule com.package1.moduleMethodTypeReferences\n\nimport \"shared.pkl\"\n\nimport \"../com.externalpackage/external1.pkl\"\n\nimport \"../com.externalpackage/external2.pkl\"\n\nclass MyClass\n\n/// Method with intra-module types.\nfunction method1(arg1: MyClass, arg2: MyClass): MyClass = Undefined()\n\n/// Method with inter-module types.\nfunction method2(arg1: shared.MyClass, arg2: shared.MyClass): shared.MyClass = Undefined()\n\n/// Method with external-module types.\nfunction method3(arg1: external1.MyClass, arg2: external2.MyClass): List<external1.MyClass> = Undefined()\n\n/// Method with intra-module, inter-module, and external-module types.\nfunction method4(arg1: MyClass, arg2: shared.MyClass): external1.MyClass = Undefined()\n\n/// Method with complex intra-module, inter-module, and external-module types.\nfunction method5(arg1: MyClass?, arg2: Map<shared.MyClass, external1.MyClass>): (external1.MyClass) -> external2.MyClass = Undefined()\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyAnnotations.pkl",
    "content": "module com.package1.modulePropertyAnnotations\n\n/// This [prperty] thought to have a correctly spelled name.\n@Deprecated {\n  message = \"Spelling mistake.\"\n  replaceWith = \"property\"\n}\n@AlsoKnownAs {\n  names { \"field\"; \"item\" }\n}\nhidden prperty = 42\n\n\n/// This [prperty] thought to have a correctly spelled name.\n///\n/// Unfortunately, it did not, as we explain in this expandable comment.\n@Deprecated {\n  message = \"Spelling mistake.\"\n  replaceWith = \"property\"\n}\n@AlsoKnownAs {\n  names { \"field\"; \"item\" }\n}\nhidden prpertyWithExpandableComment = 42\n\n\n// This [property] indeed has a properly spelled name, but no doc comment.\n@AlsoKnownAs {\n  names { \"field\"; \"item\" }\n}\nhidden property = 42\n\n\n\n\nclass UserDefinedAnnotation extends Annotation {\n  messageOpt: String?\n  messageReq: String\n}\n\n@UserDefinedAnnotation {\n  messageReq = \"Hi!\"\n}\npropertyUserDefinedAnnotation: Int = 42\n\n\n\n\nclass UserDefinedAnnotation1 extends Annotation {\n  nested: UserDefinedAnnotation\n}\n\n@UserDefinedAnnotation1 {\n  nested = new UserDefinedAnnotation {\n    messageReq = \"Hi!\"\n  }\n}\npropertyUserDefinedAnnotation1: Int = 42\n\n\n\n\nclass UserDefinedAnnotation2 extends Annotation {\n  nested: UserDefinedAnnotation2?\n}\n\n@UserDefinedAnnotation2 {\n  nested = new UserDefinedAnnotation2 {\n    nested = new UserDefinedAnnotation2 {\n      nested = new UserDefinedAnnotation2 {\n        nested = new UserDefinedAnnotation2 {\n        }\n      }\n    }\n  }\n}\npropertyUserDefinedAnnotation2: Int = 42\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyCommentInheritance.pkl",
    "content": "module com.package1.modulePropertyCommentInheritance\n\nextends \"modulePropertyComments.pkl\"\n\nproperty3: Float = 1.23\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyComments.pkl",
    "content": "/// Module properties with different kinds of comments.\nopen module com.package1.modulePropertyComments\n\n// Property with single-line code comment.\nproperty1: Float = 3.14159265359\n\n/*\n  Property with\n  multi-line\n  code comment.\n*/\nproperty2: Float = 3.14159265359\n\n/// Property with single-line doc comment.\nproperty3: Float = 3.14159265359\n\n/// Property with\n/// multi-line\n/// doc comment.\nproperty4: Float = 3.14159265359\n\n/// Property with [single-line](https://apple.com) *Markdown* doc comment.\nproperty5: Float = 3.14159265359\n\n/// Property with\n/// [multi-line](https://apple.com)\n/// *Markdown* doc comment.\nproperty6: Float = 3.14159265359\n\n/// 😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡\nproperty7: Float = 3.14159265359\n\n/// Summary\n/// ```\n/// \n/// code = 4 * 10\n/// ```\n/// Rest of the body\nproperty8: Int = 0\n\n/// Summary\n/// ```java\n/// \n/// code = 0\n/// ```\n/// Rest\nproperty9: Int = 1\n\n/// ```\n/// \n/// code = 2\n/// ```\n/// Rest\nproperty10: Int = 2\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyModifiers.pkl",
    "content": "/// Module properties with different modifiers.\nmodule com.package1.modulePropertyModifiers\n\n/// Property with `local` modifier.\nlocal property1 = 3.14159265359\n\n/// Property with `hidden` modifier.\nhidden property2: Float = 3.14159265359\n\n/*\n/// Property with `external` modifier.\nexternal property3: Float\n\n/// Property with `abstract` modifier.\nabstract property4: Float\n\n/// Property with multiple modifiers.\nabstract external hidden property5: Float\n*/\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyTypeAnnotations.pkl",
    "content": "/// Module properties with different kinds of type annotations.\nmodule com.package1.modulePropertyTypeAnnotations\n\n/// Property without declared type.\nproperty1 = 3.14159265359\n\n/// Property with simple type.\nproperty2: Float = 3.14159265359\n\n/// Property with list type.\nproperty3: List<String> = List(\"1\", \"2\", \"3\")\n\n/// Property with set type.\nproperty4: Set<String> = Set(\"1\", \"2\", \"3\")\n\n/// Property with map type.\nproperty5: Map<String, Duration> = Map(\"one\", 1.s, \"two\", 2.min, \"three\", 3.h)\n\n/// Property with optional type.\nproperty6: String? = \"string\"\n\n/// Property with zero-arg function type.\nproperty7: () -> String = () -> \"string\"\n\n/// Property with one-arg function type.\nproperty8: (String) -> Int = (str) -> str.length\n\n/// Property with two-arg function type.\nproperty9: (String, String) -> Int = (str1, str2) -> str1.length + str2.length\n\n/// Property with complex type.\nproperty10: Map<List<String?>?, (Boolean?) -> Map<Int, Float>> = Map(List(\"str\"), (b) -> Map(3, 3.0))\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/modulePropertyTypeReferences.pkl",
    "content": "/// Module properties whose types reference classes from\n/// the same module, a different module, and external modules.\nmodule com.package1.modulePropertyTypeReferences\n\nimport \"shared.pkl\"\n\nimport \"../com.externalpackage/external1.pkl\"\n\nclass MyClass\n\n/// Property with intra-module simple type.\nproperty1: MyClass = new MyClass {}\n\n/// Property with inter-module list type.\nproperty2: List<shared.MyClass> = List(new shared.MyClass {})\n\n/// Property with external-module set type.\nproperty3: Set<external1.MyClass> = Set(new external1.MyClass {})\n\n/// Property with intra-module and inter-module map type.\nproperty4: Map<MyClass, shared.MyClass> = Map(new MyClass {}, new shared.MyClass {})\n\n/// Property with external-module optional type.\nproperty5: external1.MyClass? = new external1.MyClass {}\n\n/// Property with zero-arg intra-module function type.\nproperty6: () -> MyClass = () -> new MyClass {}\n\n/// Property with one-arg inter-module and external-module function type.\nproperty7: (shared.MyClass) -> external1.MyClass = (myClass) -> new external1.MyClass {}\n\n/// Property with two-arg intra-module, inter-module, and external-module function type.\nproperty8: (MyClass, shared.MyClass) -> external1.MyClass = (myClass1, myClass2) -> new external1.MyClass {}\n\n/// Property with intra-module mapping type.\nproperty9: Mapping<String, MyClass>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleTypes1.pkl",
    "content": "module com.package1.moduleTypes1\n\nn: Int\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/moduleTypes2.pkl",
    "content": "module com.package1.moduleTypes2\n\nimport \"moduleTypes1.pkl\"\n\nx1: moduleTypes1\n\nx2: moduleTypes1?\n\nx3: Listing<moduleTypes1>\n\nx4: Mapping<moduleTypes1, moduleTypes1>\n\nx5: String|moduleTypes1|Int\n\nx6: module\n\nx7: List<module>\n\nx8: String|module|Int\n\nclass Foo {\n  x1: moduleTypes1\n\n  x2: moduleTypes1?\n\n  x3: Listing<moduleTypes1>\n\n  x4: Mapping<moduleTypes1, moduleTypes1>\n\n  x5: String|moduleTypes1|Int\n\n  x6: module\n\n  x7: List<module>\n\n  x8: String|module|Int\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/nested/nested2/nestedModule.pkl",
    "content": "module com.package1.nested.nested2.nestedModule\n\nmyProperty = 42\n\nfunction myMethod() = 42\n\nclass MyClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/referenceToExternalPackage.pkl",
    "content": "import \"../com.package2/Module3.pkl\"\n\n/// Something something [Module3.`property {} four`].\nprop: Module3.`Class Two {}`\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/shared.pkl",
    "content": "module com.package1.shared\n\nclass MyClass\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/typeAliases.pkl",
    "content": "open module com.package1.typealiases\n\n/// A [String] representing an [Email] address.\n@AlsoKnownAs { names { \"OtherName\" } }\ntypealias Email = String(contains(\"@\"))\n\nuint: UInt\n\nuints: List<UInt>\n\n/// My [Email].\nemail: Email\n\nemails: List<Email>\n\n/// Sends an [Email].\nfunction send(email: Email): Email = \"abc\"\n\nopen class Person {\n  uint: UInt\n\n  list: List<UInt>\n\n  /// A person's [Email].\n  email: Email\n\n  emails: List<Email>\n\n  /// Sends an [Email].\n  function send(email: Email): Email = \"abc\"\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/typeAliases2.pkl",
    "content": "module com.package1.typealiases2\n\nclass Person { name: String }\n\ntypealias List2<E> = List<E>\ntypealias Map2<V, K> = Map<K, V>\ntypealias StringMap<V> = Map<String, V>\ntypealias MMap<X> = Map<X, X>\n\nres1: List2<Int>\nres2: List2<List2<String>>\nres3: Map2<String, Int>\nres4: StringMap<Duration>\nres5: MMap<Person?>\n\nres6: List2\nres7: Map2\nres8: StringMap\nres9: MMap\n\nclass Foo {\n  res1: List2<Int>\n  res2: List2<List2<String>>\n  res3: Map2<String, Int>\n  res4: StringMap<Duration>\n  res5: MMap<Person?>\n\n  res6: List2\n  res7: Map2\n  res8: StringMap\n  res9: MMap\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/typeAliasesInheritance.pkl",
    "content": "module com.package1.typeAliasInheritance\n\nextends \"typeAliases.pkl\"\n\nemail2: Email\n\nemails2: List<Email>\n\nclass Person2 extends Person {\n  email2: Email\n\n  emails2: List<Email>\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/unionTypes.pkl",
    "content": "module com.package1.unionTypes\n\nres1: Boolean|Number\n\nres2: \"foo\"|\"bar\"|\"baz\"\n\nres3: Boolean|List<String>\n\nres4: Boolean|List<String>?\n\nres5: (Boolean|List<String>)?\n\nres6: (Boolean|List<String>)?|Number\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/unlistedClass.pkl",
    "content": "module com.package1.unlistedClass\n\nmyProperty = 42\n\nfunction myMethod() = 42\n\n@Unlisted\nclass MyClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/unlistedMethod.pkl",
    "content": "module com.package1.unlistedMethod\n\nmyProperty = 42\n\n@Unlisted\nfunction myMethod() = 42\n\nclass MyClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/unlistedModule.pkl",
    "content": "@Unlisted\nmodule com.package1.unlistedModule\n\nmyProperty = 42\n\nfunction myMethod() = 42\n\nclass MyClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package1/unlistedProperty.pkl",
    "content": "module com.package1.unlistedProperty\n\n@Unlisted\nmyProperty = 42\n\nfunction myMethod() = 42\n\nclass MyClass {}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package2/Module3.pkl",
    "content": "module com.package2.Module3\n\n/// Something something [`property {} <> four`]\nproperty3: String\n\n`property {} <> four`: String\n\nfunction function3(n: Int): String = n.toString()\n\nclass Class3 {\n  property3: String\n\n  function function3(n: Int): String = n.toString()\n}\n\nclass `Class Two {}` {\n  prop: String\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/com.package2/doc-package-info.pkl",
    "content": "/// Docs for Package 2.\namends \"pkl:DocPackageInfo\"\n\nname = \"com.package2\"\nversion = \"4.5.6\"\nimportUri = \"modulepath:/com/package2/\"\nauthors {\n  \"package2-publisher@group.apple.com\"\n}\nsourceCode = \"https://sources.apple.com/package2/\"\nsourceCodeUrlScheme = \"https://example.com/blob/\\(version)%{path}#L%{line}-L%{endLine}\"\nissueTracker = \"https://issues.apple.com/package2/\"\n\ndependencies {\n  new {\n    name = \"pkl\"\n    // use fixed version to avoid churn in expected test outputs\n    version = \"0.24.0\"\n    sourceCode = \"https://github.com/apple/\\(name)/blob/dev/stdlib/\"\n    sourceCodeUrlScheme = \"https://github.com/apple/\\(name)/blob/\\(version)/stdlib%{path}#L%{line}-L%{endLine}\"\n    documentation = \"https://pkl-lang.org/stdlib/\\(name)/\\(version)/\"\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/input/docsite-info.pkl",
    "content": "/// Let the games begin.\n///\n/// ## Great Library\n///\n/// Just follow these simple steps. You'll love it.\n///\n/// 1. Install it\n/// 1. I promise it's easy.\n/// 2. You'll figure it out.\n/// 1. Install it\n/// ```\n/// name = \"Pigeon\"\n/// age = 42\n/// ```\n/// 1. Install it\n///\n/// Let me **emphasize** how *simple* this is.\n///\n/// 😀😀😀 emoji day 😎😎😎 don't get 😡😡😡\n///\n/// ## Code\n///\n/// The code is beautiful:\n///\n/// ```\n/// /// example module\n/// module foo.bar\n///\n/// person {\n/// name = \"Pigeon\"\n/// age = 42\n/// }\n///\n/// function sing() = \"tra-la-la\"\n///\n/// class Person {\n/// name: String\n/// age: Int\n/// }\n/// ```\n///\n/// ## Random Tips\n///\n/// - don't give up\n/// - just don't\n/// - don't give up\n///\n/// # Level 1\n/// ## Level 2\n/// ### Level 3\n/// #### Level 4\n/// ##### Level 5\n/// ###### Level 6\n///\n/// * [docLinks]\n/// * [docLinks.age]\n/// * [docLinks.sing()]\n/// * [docLinks.Person]\n/// * [docLinks.Person.name]\n/// * [docLinks.PersonList]\namends \"pkl:DocsiteInfo\"\n\nimport \"com.package1/docLinks.pkl\"\n\ntitle = \"Docsite Title\"\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/.pkldoc/VERSION",
    "content": "2"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/Module Containing Spaces/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Module Containing Spaces (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.Module Containing Spaces\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.`Module Containing Spaces`<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.`Module Containing Spaces`</span></div>\n        <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/Module%20Containing%20Spaces.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/Module%20Containing%20Spaces.pkl\">Module Containing Spaces.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/baseModule/BaseClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>BaseClass (com.package1/baseModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/BaseClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/BaseClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-class-name=\"BaseClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.baseModule</a>\n      <h1 id=\"declaration-title\">BaseClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">BaseClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/baseModule/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>baseModule (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.baseModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.baseModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/baseModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/baseModule.pkl\">baseModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"BaseClass.html\" class=\"name-decl\">BaseClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classAnnotations/AnnotatedClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>AnnotatedClass (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClass</span></div>\n        <div class=\"doc-comment\">Deprecated.</div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classAnnotations/AnnotatedClss.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>AnnotatedClss (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClss\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClss<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClss</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClss</code> thought to have a correctly spelled name.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>AnnotatedClssWithExpandableComment (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClssWithExpandableComment\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClssWithExpandableComment<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClssWithExpandableComment</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClssWithExpandableComment</code> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classAnnotations.pkl\">classAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"AnnotatedClss\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClss\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClss.html\" class=\"name-decl\">AnnotatedClss</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClssWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClssWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClssWithExpandableComment.html\" class=\"name-decl\">AnnotatedClssWithExpandableComment</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClass.html\" class=\"name-decl\">AnnotatedClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated.</div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments1 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments2 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments3 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments3</span></div>\n        <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments4 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments4</span></div>\n        <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph2, line2).</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments5.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments5 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments5.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments5.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments5\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments5<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments5</span></div>\n        <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments6.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments6 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments6.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments6.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments6\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments6<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments6</span></div>\n        <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments7.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments7 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments7.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments7.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments7\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments7<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments7</span></div>\n        <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/Comments8.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments8 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments8.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments8.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments8\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments8<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments8</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Installation</h2>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classComments.pkl\">classComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>git status</code></td>\n<td>List all <em>new or modified</em> files</td>\n</tr>\n<tr>\n<td><code>git diff</code></td>\n<td>Show file differences that <strong>haven't been</strong> staged</td>\n</tr>\n</tbody>\n</table></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments1.html\" class=\"name-decl\">Comments1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments2.html\" class=\"name-decl\">Comments2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments3.html\" class=\"name-decl\">Comments3</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments4.html\" class=\"name-decl\">Comments4</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments5\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments5.html\" class=\"name-decl\">Comments5</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments6\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments6.html\" class=\"name-decl\">Comments6</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments7\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments7.html\" class=\"name-decl\">Comments7</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments8\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments8.html\" class=\"name-decl\">Comments8</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classInheritance/MyClass1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass1 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass1.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classInheritance/MyClass2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass2 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">MyClass2</span> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classInheritance/MyClass3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass3 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass3</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classInheritance/MyClass4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass4 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass4</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classInheritance</span></div>\n        <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classInheritance.pkl\">classInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass1.html\" class=\"name-decl\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass2.html\" class=\"name-decl\">MyClass2</a> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass3.html\" class=\"name-decl\">MyClass3</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass4.html\" class=\"name-decl\">MyClass4</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments (com.package1/classMethodComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodComments.pkl\">classMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Modifiers (com.package1/classMethodModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodModifiers.pkl\">classMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeAnnotations (com.package1/classMethodTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeAnnotations.pkl\">classMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeReferences (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeReferences.pkl\">classMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>ClassWithAnnotatedProperty (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"ClassWithAnnotatedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">ClassWithAnnotatedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ClassWithAnnotatedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyAnnotations.pkl\">classPropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ClassWithAnnotatedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ClassWithAnnotatedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ClassWithAnnotatedProperty.html\" class=\"name-decl\">ClassWithAnnotatedProperty</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments (com.package1/classPropertyComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyComments.pkl\">classPropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Modifiers (com.package1/classPropertyModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with multiple modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyModifiers.pkl\">classPropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeAnnotations (com.package1/classPropertyTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl\">classPropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeReferences (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classPropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeReferences.pkl\">classPropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classTypeConstraints/Address.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Address (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Address.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Address.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Address\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Address<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Address</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"street\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#street\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">street</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"city\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#city\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">city</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classTypeConstraints/Person1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person1 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(length &gt;= 3)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"address\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">address</span>: <a href=\"Address.html\" class=\"name-ref\">Address</a>(street != city)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classTypeConstraints/Person2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person2 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classTypeConstraints/Project.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Project (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Project.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Project.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Project\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Project<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Project</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"type\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#type\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">type</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(oneOf(List(&quot;open-source&quot;, &quot;closed-source&quot;)))?<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"contacts\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#contacts\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">contacts</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty), <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)&gt;(length &gt; 10, length &lt; 20)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/classTypeConstraints/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classTypeConstraints (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classTypeConstraints<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classTypeConstraints</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classTypeConstraints.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classTypeConstraints.pkl\">classTypeConstraints.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emailAddress\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emailAddress\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emailAddress</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person1.html\" class=\"name-decl\">Person1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Address\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Address.html\" class=\"name-decl\">Address</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Project\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Project\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Project.html\" class=\"name-decl\">Project</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/docExampleSubject1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>docExampleSubject1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject1.pkl\">docExampleSubject1.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a>, <a href=\"https://example.com/package1/docExample2.pkl\">docExample2</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/docExampleSubject2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>docExampleSubject2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject2.pkl\">docExampleSubject2.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"y\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#y\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">y</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/docLinks/Person.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person (com.package1/docLinks:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.docLinks</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <code>Person.name</code>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"call()\" class=\"anchor\"> </div>\n            <div id=\"call().number\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#call()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">call</span>(<span class=\"param1\">number</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code>\n<code>number</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/docLinks/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>docLinks (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docLinks<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docLinks</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docLinks.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docLinks.pkl\">docLinks.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"age\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#age\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">age</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<code>age</code>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"sing()\" class=\"anchor\"> </div>\n            <div id=\"sing().song\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#sing()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">sing</span>(<span class=\"param1\">song</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <code>sing()</code>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>song</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"PersonList\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#PersonList\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#PersonList\" class=\"name-decl\">PersonList</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>PersonList</code>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>com.package1 (1.2.3) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package1/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package1/1.2.3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package1</span></div>\n        <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>package1-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.2.3</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/\">https://example.com/package1/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package1/\">https://issues.apple.com/package1/</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../com.package2/4.5.6/index.html\">com.package2:4.5.6</a>, <span>com.externalpackage:7.8.9</span></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Docs for Package 1.</p><ul>\n<li>\n<p><a href=\"docLinks/index.html\"><code>docLinks</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#age\"><code>docLinks.age</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#sing()\"><code>docLinks.sing()</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html\"><code>docLinks.Person</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html#name\"><code>docLinks.Person.name</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#PersonList\"><code>docLinks.PersonList</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a></p>\n</li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1.Module%20Containing%20Spaces\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.Module%20Containing%20Spaces\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module%20Containing%20Spaces/index.html\">com.package1.`Module Containing Spaces`</a></div>\n                <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.baseModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.baseModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./baseModule/index.html\">com.package1.baseModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classAnnotations/index.html\">com.package1.classAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classComments/index.html\">com.package1.classComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classInheritance/index.html\">com.package1.classInheritance</a></div>\n                <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodComments/index.html\">com.package1.classMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodModifiers/index.html\">com.package1.classMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeAnnotations/index.html\">com.package1.classMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeReferences/index.html\">com.package1.classMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyAnnotations/index.html\">com.package1.classPropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyComments/index.html\">com.package1.classPropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyModifiers/index.html\">com.package1.classPropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeAnnotations/index.html\">com.package1.classPropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeReferences/index.html\">com.package1.classPropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classTypeConstraints\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classTypeConstraints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classTypeConstraints/index.html\">com.package1.classTypeConstraints</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject1/index.html\">com.package1.docExampleSubject1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject2/index.html\">com.package1.docExampleSubject2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docLinks\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docLinks\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docLinks/index.html\">com.package1.docLinks</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"shared/index.html\"><code>shared</code></a>, <a href=\"shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"docLinks/index.html#age\"><code>age</code></a>, <a href=\"docLinks/index.html#sing()\"><code>sing()</code></a>, <a href=\"docLinks/Person.html\"><code>Person</code></a>, <a href=\"docLinks/Person.html#name\"><code>Person.name</code></a>, <a href=\"docLinks/Person.html#call()\"><code>Person.call()</code></a>, <a href=\"docLinks/index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.methodAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.methodAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./methodAnnotations/index.html\">com.package1.methodAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleComments/index.html\">com.package1.moduleComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleExtend\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleExtend\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleExtend/index.html\">com.package1.moduleExtend</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleInfoAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleInfoAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleInfoAnnotation/index.html\">com.package1.moduleInfoAnnotation</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodCommentInheritance/index.html\">com.package1.moduleMethodCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodComments/index.html\">com.package1.moduleMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodModifiers/index.html\">com.package1.moduleMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeAnnotations/index.html\">com.package1.moduleMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeReferences/index.html\">com.package1.moduleMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyAnnotations/index.html\">com.package1.modulePropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyCommentInheritance/index.html\">com.package1.modulePropertyCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyComments/index.html\">com.package1.modulePropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyModifiers/index.html\">com.package1.modulePropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeAnnotations/index.html\">com.package1.modulePropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeReferences/index.html\">com.package1.modulePropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes1/index.html\">com.package1.moduleTypes1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes2/index.html\">com.package1.moduleTypes2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.nested.nested2.nestedModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.nested.nested2.nestedModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./nested/nested2/nestedModule/index.html\">com.package1.nested.nested2.nestedModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"referenceToExternalPackage\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#referenceToExternalPackage\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./ternalPackage/index.html\">referenceToExternalPackage</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.shared\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.shared\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./shared/index.html\">com.package1.shared</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases/index.html\">com.package1.typealiases</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases2/index.html\">com.package1.typealiases2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typeAliasInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typeAliasInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typeAliasInheritance/index.html\">com.package1.typeAliasInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unionTypes\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unionTypes\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unionTypes/index.html\">com.package1.unionTypes</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedClass/index.html\">com.package1.unlistedClass</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedMethod\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedMethod\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedMethod/index.html\">com.package1.unlistedMethod</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedProperty/index.html\">com.package1.unlistedProperty</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/methodAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>methodAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/methodAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/methodAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.methodAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.methodAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.methodAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/methodAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/methodAnnotations.pkl\">methodAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthod()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthod</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>mthod()</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthodWithExpandableComment()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthodWithExpandableComment()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthodWithExpandableComment</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#mthod()\"><code>mthod()</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#method()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleComments.pkl\">moduleComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleExtend/ExtendClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>ExtendClass (com.package1/moduleExtend:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-class-name=\"ExtendClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleExtend</a>\n      <h1 id=\"declaration-title\">ExtendClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ExtendClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleExtend/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleExtend (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleExtend<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleExtend</span> extends <a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleExtend.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleExtend.pkl\">moduleExtend.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../baseModule/BaseClass.html\" class=\"name-decl\">BaseClass</a><span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ExtendClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ExtendClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ExtendClass.html\" class=\"name-decl\">ExtendClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleInfoAnnotation/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleInfoAnnotation (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleInfoAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleInfoAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleInfoAnnotation</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleInfoAnnotation.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleInfoAnnotation.pkl\">moduleInfoAnnotation.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodCommentInheritance</span> extends <a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl\">moduleMethodCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.moduleMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodComments.pkl\">moduleMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodModifiers.pkl\">moduleMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl\">moduleMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/moduleMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeReferences.pkl\">moduleMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation1 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation1</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation.html\" class=\"name-ref\">UserDefinedAnnotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation2 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation2</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation2.html\" class=\"name-ref\">UserDefinedAnnotation2</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyAnnotations.pkl\">modulePropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prperty\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>prperty</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prpertyWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prpertyWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prpertyWithExpandableComment</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#prperty\"><code>prperty</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation1.html\" class=\"name-decl\">UserDefinedAnnotation1</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation2.html\" class=\"name-decl\">UserDefinedAnnotation2</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyCommentInheritance</span> extends <a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl\">modulePropertyCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.modulePropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyComments.pkl\">modulePropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyModifiers.pkl\">modulePropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl\">modulePropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/modulePropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/modulePropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeReferences.pkl\">modulePropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleTypes1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleTypes1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes1.pkl\">moduleTypes1.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"n\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#n\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">n</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleTypes2/Foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Foo (com.package1/moduleTypes2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleTypes2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/moduleTypes2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleTypes2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes2.pkl\">moduleTypes2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/nested/nested2/nestedModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.nested.nested2.nestedModule</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/nested/nested2/nestedModule/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>nestedModule (com.package1/nested/nested2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.nested.nested2.nestedModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.nested.nested2.nestedModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/nested/nested2/nestedModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/nested/nested2/nestedModule.pkl\">nestedModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\"},\"summary\":\"Docs for Package 1.\",\"deprecation\":\"com.package1 is deprecated\",\"sourceCode\":\"https://example.com/package1/\",\"sourceCodeUrlScheme\":\"https://example.com/package1%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"}},{\"ref\":{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\"},\"summary\":\"This is a module that has spaces in its name.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"BaseClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClss\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClssWithExpandableComment\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments4\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments5\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments6\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments7\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments8\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\"},\"summary\":\"Class inheritance involving abstract, open, and final classes.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass3\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass4\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\"},\"summary\":\"Class methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\"},\"summary\":\"Class methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\"},\"summary\":\"Class methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\"},\"summary\":\"Class methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ClassWithAnnotatedProperty\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\"},\"summary\":\"Class properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\"},\"summary\":\"Class properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\"},\"summary\":\"Class properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\"},\"summary\":\"Class properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Project\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\"},\"summary\":\"[external1], [external1.MyClass]\\n[shared], [shared.MyClass]\\n[age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\\n[docLinks], [docLinks.age], [docLinks.sing()],\\n[docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\\n[custom *link* text][docLinks.sing()]\\n[module], [module.age], [module.sing()],\\n[module.Person], [module.Person.name], [module.PersonList],\\n[custom *link* text][module.sing()]\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"PersonList\",\"isTypeAlias\":true},\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ExtendClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\"},\"summary\":\"Module methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\"},\"summary\":\"Module methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\"},\"summary\":\"Module methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\"},\"summary\":\"Module methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\"},\"summary\":\"Module properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\"},\"summary\":\"Module properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\"},\"summary\":\"Module properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\"},\"summary\":\"Module properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"baseModule/index.html\"},{\"name\":\"baseProperty\",\"kind\":5,\"url\":\"baseModule/index.html#baseProperty\",\"sig\":\": unknown\",\"parId\":1},{\"name\":\"baseMethod\",\"kind\":4,\"url\":\"baseModule/index.html#baseMethod()\",\"sig\":\"(): unknown\",\"parId\":1},{\"name\":\"BaseClass\",\"kind\":3,\"url\":\"baseModule/BaseClass.html\",\"parId\":1},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"classAnnotations/index.html\"},{\"name\":\"AnnotatedClss\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClss.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClssWithExpandableComment\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClssWithExpandableComment.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClass\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClass.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"classComments/index.html\"},{\"name\":\"Comments1\",\"kind\":3,\"url\":\"classComments/Comments1.html\",\"parId\":9},{\"name\":\"Comments2\",\"kind\":3,\"url\":\"classComments/Comments2.html\",\"parId\":9},{\"name\":\"Comments3\",\"kind\":3,\"url\":\"classComments/Comments3.html\",\"parId\":9},{\"name\":\"Comments4\",\"kind\":3,\"url\":\"classComments/Comments4.html\",\"parId\":9},{\"name\":\"Comments5\",\"kind\":3,\"url\":\"classComments/Comments5.html\",\"parId\":9},{\"name\":\"Comments6\",\"kind\":3,\"url\":\"classComments/Comments6.html\",\"parId\":9},{\"name\":\"Comments7\",\"kind\":3,\"url\":\"classComments/Comments7.html\",\"parId\":9},{\"name\":\"Comments8\",\"kind\":3,\"url\":\"classComments/Comments8.html\",\"parId\":9},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"classInheritance/index.html\"},{\"name\":\"MyClass1\",\"kind\":3,\"url\":\"classInheritance/MyClass1.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass1.html#property1\",\"sig\":\": Boolean\",\"parId\":19},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass1.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":19},{\"name\":\"MyClass2\",\"kind\":3,\"url\":\"classInheritance/MyClass2.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property1\",\"sig\":\": Boolean\",\"parId\":22},{\"name\":\"property2\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property2\",\"sig\":\": String\",\"parId\":22},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"method2\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method2()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"MyClass3\",\"kind\":3,\"url\":\"classInheritance/MyClass3.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass3.html#property1\",\"sig\":\": Boolean\",\"parId\":27},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass3.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":27},{\"name\":\"MyClass4\",\"kind\":3,\"url\":\"classInheritance/MyClass4.html\",\"parId\":18},{\"name\":\"property4\",\"kind\":5,\"url\":\"classInheritance/MyClass4.html#property4\",\"sig\":\": String\",\"parId\":30},{\"name\":\"method3\",\"kind\":4,\"url\":\"classInheritance/MyClass4.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":30},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"classMethodComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classMethodComments/Comments.html\",\"parId\":33},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method1()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method2()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method3()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method4()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method5()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method6()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method7()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"classMethodModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classMethodModifiers/Modifiers.html\",\"parId\":42},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodModifiers/Modifiers.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":43},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"classMethodTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html\",\"parId\":45},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method1()\",\"sig\":\"(): unknown\",\"parId\":46},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":46},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":46},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method4()\",\"sig\":\"(): String\",\"parId\":46},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":46},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":46},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":46},{\"name\":\"method8\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":46},{\"name\":\"method9\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":46},{\"name\":\"method10\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":46},{\"name\":\"method11\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":46},{\"name\":\"method12\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":46},{\"name\":\"method13\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":46},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"classMethodTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classMethodTypeReferences/MyClass.html\",\"parId\":60},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classMethodTypeReferences/TypeReferences.html\",\"parId\":60},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":62},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":62},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"classPropertyAnnotations/index.html\"},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":68},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":69},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":69},{\"name\":\"ClassWithAnnotatedProperty\",\"kind\":3,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html\",\"parId\":68},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":72},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"classPropertyComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classPropertyComments/Comments.html\",\"parId\":74},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property1\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property2\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property3\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property4\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property5\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property6\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property7\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"classPropertyModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classPropertyModifiers/Modifiers.html\",\"parId\":83},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property2\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property3\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property4\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"classPropertyTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html\",\"parId\":88},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property1\",\"sig\":\": unknown\",\"parId\":89},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property2\",\"sig\":\": Float\",\"parId\":89},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property3\",\"sig\":\": List<String>\",\"parId\":89},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property4\",\"sig\":\": Set<String>\",\"parId\":89},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":89},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property6\",\"sig\":\": String?\",\"parId\":89},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property7\",\"sig\":\": () -> String\",\"parId\":89},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property8\",\"sig\":\": String -> Int\",\"parId\":89},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":89},{\"name\":\"property10\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":89},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"classPropertyTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classPropertyTypeReferences/MyClass.html\",\"parId\":100},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classPropertyTypeReferences/TypeReferences.html\",\"parId\":100},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property1\",\"sig\":\": MyClass\",\"parId\":102},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":102},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":102},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":102},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property5\",\"sig\":\": MyClass?\",\"parId\":102},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":102},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":102},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":102},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":102},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"classTypeConstraints/index.html\"},{\"name\":\"emailAddress\",\"kind\":5,\"url\":\"classTypeConstraints/index.html#emailAddress\",\"sig\":\": unknown\",\"parId\":112},{\"name\":\"Person1\",\"kind\":3,\"url\":\"classTypeConstraints/Person1.html\",\"parId\":112},{\"name\":\"name\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#name\",\"sig\":\": String\",\"parId\":114},{\"name\":\"address\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#address\",\"sig\":\": Address\",\"parId\":114},{\"name\":\"Person2\",\"kind\":3,\"url\":\"classTypeConstraints/Person2.html\",\"parId\":112},{\"name\":\"email\",\"kind\":5,\"url\":\"classTypeConstraints/Person2.html#email\",\"sig\":\": String\",\"parId\":117},{\"name\":\"Address\",\"kind\":3,\"url\":\"classTypeConstraints/Address.html\",\"parId\":112},{\"name\":\"street\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#street\",\"sig\":\": String\",\"parId\":119},{\"name\":\"city\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#city\",\"sig\":\": String\",\"parId\":119},{\"name\":\"Project\",\"kind\":3,\"url\":\"classTypeConstraints/Project.html\",\"parId\":112},{\"name\":\"type\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#type\",\"sig\":\": String?\",\"parId\":122},{\"name\":\"contacts\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#contacts\",\"sig\":\": Map<String, String>\",\"parId\":122},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"docExampleSubject1/index.html\"},{\"name\":\"x\",\"kind\":5,\"url\":\"docExampleSubject1/index.html#x\",\"sig\":\": Int\",\"parId\":125},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"docExampleSubject2/index.html\"},{\"name\":\"y\",\"kind\":5,\"url\":\"docExampleSubject2/index.html#y\",\"sig\":\": Int\",\"parId\":127},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"docLinks/index.html\"},{\"name\":\"age\",\"kind\":5,\"url\":\"docLinks/index.html#age\",\"sig\":\": Int\",\"parId\":129},{\"name\":\"sing\",\"kind\":4,\"url\":\"docLinks/index.html#sing()\",\"sig\":\"(song): unknown\",\"parId\":129},{\"name\":\"Person\",\"kind\":3,\"url\":\"docLinks/Person.html\",\"parId\":129},{\"name\":\"name\",\"kind\":5,\"url\":\"docLinks/Person.html#name\",\"sig\":\": String\",\"parId\":132},{\"name\":\"call\",\"kind\":4,\"url\":\"docLinks/Person.html#call()\",\"sig\":\"(number): unknown\",\"parId\":132},{\"name\":\"PersonList\",\"kind\":2,\"url\":\"docLinks/index.html#PersonList\",\"parId\":129},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"methodAnnotations/index.html\"},{\"name\":\"mthod\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthod()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"mthodWithExpandableComment\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthodWithExpandableComment()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"method\",\"kind\":4,\"url\":\"methodAnnotations/index.html#method()\",\"sig\":\"(): Int\",\"parId\":136,\"aka\":[\"function\"]},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"moduleExtend/index.html\"},{\"name\":\"extendProperty\",\"kind\":5,\"url\":\"moduleExtend/index.html#extendProperty\",\"sig\":\": unknown\",\"parId\":141},{\"name\":\"extendMethod\",\"kind\":4,\"url\":\"moduleExtend/index.html#extendMethod()\",\"sig\":\"(): unknown\",\"parId\":141},{\"name\":\"ExtendClass\",\"kind\":3,\"url\":\"moduleExtend/ExtendClass.html\",\"parId\":141},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"moduleMethodCommentInheritance/index.html\"},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodCommentInheritance/index.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":146},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"moduleMethodComments/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method1()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method2()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method3()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method4()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method5()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method6()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method7()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"moduleMethodModifiers/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodModifiers/index.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":156},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"moduleMethodTypeAnnotations/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method1()\",\"sig\":\"(): unknown\",\"parId\":158},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":158},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":158},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method4()\",\"sig\":\"(): String\",\"parId\":158},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":158},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":158},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":158},{\"name\":\"method8\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":158},{\"name\":\"method9\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":158},{\"name\":\"method10\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":158},{\"name\":\"method11\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":158},{\"name\":\"method12\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":158},{\"name\":\"method13\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":158},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"moduleMethodTypeReferences/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":172},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":172},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"moduleMethodTypeReferences/MyClass.html\",\"parId\":172},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"modulePropertyAnnotations/index.html\"},{\"name\":\"prperty\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prperty\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"prpertyWithExpandableComment\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prpertyWithExpandableComment\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"property\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#property\",\"sig\":\": unknown\",\"parId\":179,\"aka\":[\"field\",\"item\"]},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation1\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation1\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation2\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation2\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":179},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":186},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":186},{\"name\":\"UserDefinedAnnotation1\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html#nested\",\"sig\":\": UserDefinedAnnotation\",\"parId\":189},{\"name\":\"UserDefinedAnnotation2\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html#nested\",\"sig\":\": UserDefinedAnnotation2?\",\"parId\":191},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"modulePropertyCommentInheritance/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyCommentInheritance/index.html#property3\",\"sig\":\": Float\",\"parId\":193},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"modulePropertyComments/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property1\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property2\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property3\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property4\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property5\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property6\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property7\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property8\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property9\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property10\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"modulePropertyModifiers/index.html\"},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyModifiers/index.html#property2\",\"sig\":\": Float\",\"parId\":206},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"modulePropertyTypeAnnotations/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property1\",\"sig\":\": unknown\",\"parId\":208},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property2\",\"sig\":\": Float\",\"parId\":208},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property3\",\"sig\":\": List<String>\",\"parId\":208},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property4\",\"sig\":\": Set<String>\",\"parId\":208},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":208},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property6\",\"sig\":\": String?\",\"parId\":208},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property7\",\"sig\":\": () -> String\",\"parId\":208},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property8\",\"sig\":\": String -> Int\",\"parId\":208},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":208},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":208},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"modulePropertyTypeReferences/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property1\",\"sig\":\": MyClass\",\"parId\":219},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":219},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":219},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":219},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property5\",\"sig\":\": MyClass?\",\"parId\":219},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":219},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":219},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":219},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":219},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"modulePropertyTypeReferences/MyClass.html\",\"parId\":219},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"moduleTypes1/index.html\"},{\"name\":\"n\",\"kind\":5,\"url\":\"moduleTypes1/index.html#n\",\"sig\":\": Int\",\"parId\":230},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"moduleTypes2/index.html\"},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":232},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":232},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":232},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":232},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":232},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x6\",\"sig\":\": module\",\"parId\":232},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x7\",\"sig\":\": List<module>\",\"parId\":232},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x8\",\"sig\":\": String|module|Int\",\"parId\":232},{\"name\":\"Foo\",\"kind\":3,\"url\":\"moduleTypes2/Foo.html\",\"parId\":232},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":241},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":241},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":241},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":241},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":241},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x6\",\"sig\":\": module\",\"parId\":241},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x7\",\"sig\":\": List<module>\",\"parId\":241},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x8\",\"sig\":\": String|module|Int\",\"parId\":241},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"nested/nested2/nestedModule/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"nested/nested2/nestedModule/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":250},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"nested/nested2/nestedModule/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":250},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"nested/nested2/nestedModule/MyClass.html\",\"parId\":250},{\"name\":\"referenceToExternalPackage\",\"kind\":1,\"url\":\"ternalPackage/index.html\"},{\"name\":\"prop\",\"kind\":5,\"url\":\"ternalPackage/index.html#prop\",\"sig\":\": Class Two {}\",\"parId\":254},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"shared/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"shared/MyClass.html\",\"parId\":256},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"typealiases/index.html\"},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/index.html#uint\",\"sig\":\": UInt\",\"parId\":258},{\"name\":\"uints\",\"kind\":5,\"url\":\"typealiases/index.html#uints\",\"sig\":\": List<UInt>\",\"parId\":258},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/index.html#email\",\"sig\":\": Email\",\"parId\":258},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/index.html#emails\",\"sig\":\": List<Email>\",\"parId\":258},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/index.html#send()\",\"sig\":\"(email): Email\",\"parId\":258},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases/Person.html\",\"parId\":258},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/Person.html#uint\",\"sig\":\": UInt\",\"parId\":264},{\"name\":\"list\",\"kind\":5,\"url\":\"typealiases/Person.html#list\",\"sig\":\": List<UInt>\",\"parId\":264},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/Person.html#email\",\"sig\":\": Email\",\"parId\":264},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/Person.html#emails\",\"sig\":\": List<Email>\",\"parId\":264},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/Person.html#send()\",\"sig\":\"(email): Email\",\"parId\":264},{\"name\":\"Email\",\"kind\":2,\"url\":\"typealiases/index.html#Email\",\"parId\":258,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"typealiases2/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/index.html#res1\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/index.html#res2\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/index.html#res3\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/index.html#res4\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/index.html#res5\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/index.html#res6\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/index.html#res7\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/index.html#res8\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/index.html#res9\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases2/Person.html\",\"parId\":271},{\"name\":\"name\",\"kind\":5,\"url\":\"typealiases2/Person.html#name\",\"sig\":\": String\",\"parId\":281},{\"name\":\"Foo\",\"kind\":3,\"url\":\"typealiases2/Foo.html\",\"parId\":271},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res1\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res2\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res3\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res4\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res5\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res6\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res7\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res8\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res9\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"List2\",\"kind\":2,\"url\":\"typealiases2/index.html#List2\",\"parId\":271},{\"name\":\"Map2\",\"kind\":2,\"url\":\"typealiases2/index.html#Map2\",\"parId\":271},{\"name\":\"StringMap\",\"kind\":2,\"url\":\"typealiases2/index.html#StringMap\",\"parId\":271},{\"name\":\"MMap\",\"kind\":2,\"url\":\"typealiases2/index.html#MMap\",\"parId\":271},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"typeAliasInheritance/index.html\"},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#email2\",\"sig\":\": Email\",\"parId\":297},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#emails2\",\"sig\":\": List<Email>\",\"parId\":297},{\"name\":\"Person2\",\"kind\":3,\"url\":\"typeAliasInheritance/Person2.html\",\"parId\":297},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#email2\",\"sig\":\": Email\",\"parId\":300},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#emails2\",\"sig\":\": List<Email>\",\"parId\":300},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"unionTypes/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"unionTypes/index.html#res1\",\"sig\":\": Boolean|Number\",\"parId\":303},{\"name\":\"res2\",\"kind\":5,\"url\":\"unionTypes/index.html#res2\",\"sig\":\": \\\\\\\"foo\\\\\\\"|\\\\\\\"bar\\\\\\\"|\\\\\\\"baz\\\\\\\"\",\"parId\":303},{\"name\":\"res3\",\"kind\":5,\"url\":\"unionTypes/index.html#res3\",\"sig\":\": Boolean|List<String>\",\"parId\":303},{\"name\":\"res4\",\"kind\":5,\"url\":\"unionTypes/index.html#res4\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res5\",\"kind\":5,\"url\":\"unionTypes/index.html#res5\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res6\",\"kind\":5,\"url\":\"unionTypes/index.html#res6\",\"sig\":\": Boolean|List<String>?|Number\",\"parId\":303},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"unlistedClass/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedClass/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":310},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedClass/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":310},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"unlistedMethod/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedMethod/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":313},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedMethod/MyClass.html\",\"parId\":313},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"unlistedProperty/index.html\"},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedProperty/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":316},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedProperty/MyClass.html\",\"parId\":316}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/shared/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/shared:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.shared</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/shared/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>shared (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.shared<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.shared</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/shared.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/shared.pkl\">shared.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/shared.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/ternalPackage/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>referenceToExternalPackage (com.package1xternalPackage:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/ternalPackage/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/ternalPackage/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"referenceToExternalPackage\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">referenceToExternalPackage<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">referenceToExternalPackage</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/ternalPackage.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/ternalPackage.pkl\">ternalPackage.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"../../../com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.html\" class=\"name-ref\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/package1/ternalPackage.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\">Module3.<code>property {} four</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typeAliasInheritance/Person2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person2 (com.package1/typeAliasInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typeAliasInheritance</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typeAliasInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>typeAliasInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typeAliasInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typeAliasInheritance</span> extends <a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typeAliasInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typeAliasInheritance.pkl\">typeAliasInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/Person.html\" class=\"name-decl\">Person</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typealiases/Person.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person (com.package1/typealiases:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typealiases/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>typealiases (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.typealiases</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases.pkl\">typealiases.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typealiases2/Foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Foo (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typealiases2/Person.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/typealiases2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>typealiases2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typealiases2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases2.pkl\">typealiases2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"List2\" class=\"anchor\"> </div>\n            <div id=\"List2.E\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#List2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#List2\" class=\"name-decl\">List2</a>&lt;<a class=\"param1\">E</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<span class=\"name-ref\">E</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Map2\" class=\"anchor\"> </div>\n            <div id=\"Map2.V\" class=\"anchor-param1\"> </div>\n            <div id=\"Map2.K\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#Map2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Map2\" class=\"name-decl\">Map2</a>&lt;<a class=\"param1\">V</a>, <a class=\"param2\">K</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">K</span>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"StringMap\" class=\"anchor\"> </div>\n            <div id=\"StringMap.V\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#StringMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#StringMap\" class=\"name-decl\">StringMap</a>&lt;<a class=\"param1\">V</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MMap\" class=\"anchor\"> </div>\n            <div id=\"MMap.X\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#MMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#MMap\" class=\"name-decl\">MMap</a>&lt;<a class=\"param1\">X</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">X</span>, <span class=\"name-ref\">X</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/unionTypes/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unionTypes (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unionTypes/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unionTypes/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unionTypes\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unionTypes<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unionTypes</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unionTypes.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unionTypes.pkl\">unionTypes.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: &quot;foo&quot;|&quot;bar&quot;|&quot;baz&quot;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/unlistedClass/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unlistedClass (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedClass/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedClass/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedClass.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedClass.pkl\">unlistedClass.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/unlistedMethod/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/unlistedMethod:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedMethod</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/unlistedMethod/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unlistedMethod (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedMethod<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedMethod</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedMethod.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedMethod.pkl\">unlistedMethod.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/unlistedProperty/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/unlistedProperty:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedProperty</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package1/1.2.3/unlistedProperty/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unlistedProperty (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedProperty.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedProperty.pkl\">unlistedProperty.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package2/4.5.6/Module3/Class Two {}.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Class Two {} (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class Two {}\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">`Class Two {}`<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">`Class Two {}`</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package2/4.5.6/Module3/Class3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Class3 (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">Class3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Class3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package2/4.5.6/Module3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Module3 (com.package2:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a>\n      <h1 id=\"declaration-title\">com.package2.Module3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package2.Module3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">modulepath:/com/package2/Module3.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/blob/4.5.6/Module3.pkl\">Module3.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\"><code>property {} &lt;&gt; four</code></a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property%20%7B%7D%20%3C%3E%20four\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property%20%7B%7D%20%3C%3E%20four\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">`property {} &lt;&gt; four`</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Class3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class3.html\" class=\"name-decl\">Class3</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Class%20Two%20%7B%7D\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class%20Two%20%7B%7D\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class%20Two%20%7B%7D.html\" class=\"name-decl\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package2/4.5.6/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>com.package2 (4.5.6) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package2/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package2/4.5.6/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package2<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package2</span></div>\n        <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Authors:</dt>\n          <dd>package2-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>4.5.6</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://sources.apple.com/package2/\">https://sources.apple.com/package2/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package2/\">https://issues.apple.com/package2/</a></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package2.Module3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2.Module3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module3/index.html\">com.package2.Module3</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package2/4.5.6/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"},\"summary\":\"Docs for Package 2.\",\"sourceCode\":\"https://sources.apple.com/package2/\",\"sourceCodeUrlScheme\":\"https://example.com/blob/4.5.6%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/com.package2/4.5.6/search-index.js",
    "content": "searchData='[{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"Module3/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/index.html#property3\",\"sig\":\": String\",\"parId\":0},{\"name\":\"property {} <> four\",\"kind\":5,\"url\":\"Module3/index.html#property {} <> four\",\"sig\":\": String\",\"parId\":0},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/index.html#function3()\",\"sig\":\"(n): String\",\"parId\":0},{\"name\":\"Class3\",\"kind\":3,\"url\":\"Module3/Class3.html\",\"parId\":0},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/Class3.html#property3\",\"sig\":\": String\",\"parId\":4},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/Class3.html#function3()\",\"sig\":\"(n): String\",\"parId\":4},{\"name\":\"Class Two {}\",\"kind\":3,\"url\":\"Module3/Class Two {}.html\",\"parId\":0},{\"name\":\"prop\",\"kind\":5,\"url\":\"Module3/Class Two {}.html#prop\",\"sig\":\": String\",\"parId\":7}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/Module Containing Spaces/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/baseModule/BaseClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/baseModule/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"moduleExtend\",\n      \"href\": \"../moduleExtend/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments4.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments5.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments6.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments7.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/Comments8.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classInheritance/MyClass1.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"MyClass2\",\n      \"href\": \"MyClass2.html\"\n    },\n    {\n      \"text\": \"MyClass3\",\n      \"href\": \"MyClass3.html\"\n    },\n    {\n      \"text\": \"MyClass4\",\n      \"href\": \"MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classInheritance/MyClass2.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"MyClass3\",\n      \"href\": \"MyClass3.html\"\n    },\n    {\n      \"text\": \"MyClass4\",\n      \"href\": \"MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classInheritance/MyClass3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classInheritance/MyClass4.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodComments/Comments.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodModifiers/Modifiers.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classMethodTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyComments/Comments.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classPropertyTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classTypeConstraints/Address.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Person1\",\n      \"href\": \"Person1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classTypeConstraints/Person1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classTypeConstraints/Person2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classTypeConstraints/Project.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/classTypeConstraints/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/docExampleSubject1/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/docExampleSubject2/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/docLinks/Person.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/docLinks/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/methodAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleExtend/ExtendClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleExtend/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleInfoAnnotation/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleMethodComments/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"moduleMethodCommentInheritance\",\n      \"href\": \"../moduleMethodCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleMethodModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"moduleMethodTypeReferences\",\n      \"href\": \"index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleMethodTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"UserDefinedAnnotation1\",\n      \"href\": \"UserDefinedAnnotation1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyComments/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"modulePropertyCommentInheritance\",\n      \"href\": \"../modulePropertyCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"modulePropertyTypeReferences\",\n      \"href\": \"index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/modulePropertyTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleTypes1/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Foo\",\n      \"href\": \"../moduleTypes2/Foo.html\"\n    },\n    {\n      \"text\": \"moduleTypes2\",\n      \"href\": \"../moduleTypes2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleTypes2/Foo.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/moduleTypes2/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Foo\",\n      \"href\": \"Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/nested/nested2/nestedModule/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/shared/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"../classMethodTypeReferences/TypeReferences.html\"\n    },\n    {\n      \"text\": \"moduleMethodTypeReferences\",\n      \"href\": \"../moduleMethodTypeReferences/index.html\"\n    },\n    {\n      \"text\": \"modulePropertyTypeReferences\",\n      \"href\": \"../modulePropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/shared/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/ternalPackage/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typeAliasInheritance/Person2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typeAliasInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typealiases/Person.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"Person2\",\n      \"href\": \"../typeAliasInheritance/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typealiases/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"typeAliasInheritance\",\n      \"href\": \"../typeAliasInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typealiases2/Foo.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typealiases2/Person.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/typealiases2/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/unionTypes/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/unlistedClass/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/unlistedMethod/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/unlistedMethod/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/unlistedProperty/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/1.2.3/unlistedProperty/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/Module Containing Spaces/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/Module Containing Spaces/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/baseModule/BaseClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/baseModule/BaseClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/baseModule/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/baseModule/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classAnnotations/AnnotatedClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classAnnotations/AnnotatedClss.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClss.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments4.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments5.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments5.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments6.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments6.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments7.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments7.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/Comments8.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments8.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classInheritance/MyClass1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classInheritance/MyClass2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classInheritance/MyClass3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classInheritance/MyClass4.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodComments/Comments.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodComments/Comments.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodModifiers/Modifiers.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodModifiers/Modifiers.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeAnnotations/TypeAnnotations.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodTypeReferences/TypeReferences.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classMethodTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyComments/Comments.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyComments/Comments.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyModifiers/Modifiers.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyModifiers/Modifiers.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyTypeReferences/TypeReferences.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classPropertyTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classTypeConstraints/Address.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Address.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classTypeConstraints/Person1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Person1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classTypeConstraints/Person2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classTypeConstraints/Project.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Project.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/classTypeConstraints/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/docExampleSubject1/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docExampleSubject1/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/docExampleSubject2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docExampleSubject2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/docLinks/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docLinks/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/docLinks/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docLinks/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../1.2.3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/methodAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/methodAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleExtend/ExtendClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleExtend/ExtendClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleExtend/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleExtend/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleInfoAnnotation/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleInfoAnnotation/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleMethodCommentInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleMethodComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleMethodModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleMethodTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleMethodTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyCommentInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/modulePropertyTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleTypes1/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes1/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleTypes2/Foo.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes2/Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/moduleTypes2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/nested/nested2/nestedModule/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../../../1.2.3/nested/nested2/nestedModule/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/nested/nested2/nestedModule/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../../../1.2.3/nested/nested2/nestedModule/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/shared/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/shared/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/shared/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/shared/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/ternalPackage/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/ternalPackage/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typeAliasInheritance/Person2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typeAliasInheritance/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typeAliasInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typeAliasInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typealiases/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typealiases/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typealiases2/Foo.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typealiases2/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/typealiases2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/unionTypes/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unionTypes/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/unlistedClass/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedClass/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/unlistedMethod/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedMethod/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/unlistedMethod/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedMethod/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/unlistedProperty/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedProperty/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package1/_/unlistedProperty/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedProperty/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/4.5.6/Module3/Class Two {}.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/4.5.6/Module3/Class3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/4.5.6/Module3/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/4.5.6/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"com.package1\",\n      \"href\": \"../../com.package1/1.2.3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/_/Module3/Class Two {}.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/Class Two {}.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/_/Module3/Class3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/Class3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/_/Module3/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/com.package2/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../4.5.6/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/0.5.0/Bird/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/0.5.0/allFruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/0.5.0/catalog/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/0.5.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/_/Bird/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/Bird/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/_/allFruit/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/allFruit/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/_/catalog/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/catalog/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/birds/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../0.5.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/deprecated/1.0.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/deprecated/_/deprecated/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.0.0\",\n      \"href\": \"../../1.0.0/deprecated/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/deprecated/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.0.0\",\n      \"href\": \"../1.0.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/fruit/1.1.0/Fruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/fruit/1.1.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/fruit/_/Fruit/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.1.0\",\n      \"href\": \"../../1.1.0/Fruit/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/data/localhost(3a)0/fruit/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.1.0\",\n      \"href\": \"../1.1.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Docsite Title</title>\n    <script src=\"scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search\" autocomplete=\"off\" data-root-url-prefix=\"\"></div>\n    </header>\n    <main>\n      <h1 id=\"declaration-title\">Docsite Title</h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_packages\">Packages</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"doc-comment\"><p>Let the games begin.</p></div>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Great Library</h2>\n<p>Just follow these simple steps. You'll love it.</p>\n<ol>\n<li>Install it</li>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n<li>Install it</li>\n</ol>\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n<ol>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\nname = &quot;Pigeon&quot;\nage = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\nname: String\nage: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up</li>\n<li>just don't</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<ul>\n<li><a href=\"not_found\"><code>docLinks</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.age</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.sing()</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person.name</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.PersonList</code></a></li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_packages\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Packages</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./com.package1/current/index.html\">com.package1</a></div>\n                <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./com.package2/current/index.html\">com.package2</a></div>\n                <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fbirds\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fbirds\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/birds/current/index.html\">localhost:0/birds</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fdeprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fdeprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./localhost(3a)0/deprecated/current/index.html\">localhost:0/deprecated</a></div>\n                <div class=\"doc-comment\">Deprecated: don't use</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Ffruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Ffruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/fruit/current/index.html\">localhost:0/fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/birds/0.5.0/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Bird (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/Bird/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/Bird/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"../../../../fruit/1.0.5/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/birds/0.5.0/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>allFruit (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/allFruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/allFruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/birds/0.5.0/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>catalog (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/catalog/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/catalog/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/birds/0.5.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/birds (0.5.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/birds/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/birds/0.5.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.5.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.0.5/index.html\">fruit:1.0.5</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/birds/0.5.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/birds/0.5.0/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/deprecated/1.0.0/deprecated/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>deprecated (localhost:0/deprecated:1.0.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/deprecated/_/deprecated/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"../\" data-module-name=\"deprecated.deprecated\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/deprecated</a>\n      <h1 id=\"declaration-title\">deprecated.deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">deprecated.deprecated</span></div>\n        <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0#/deprecated.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"foo\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">foo</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\">Deprecated. Replace with: <code>bar</code></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Old foo</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"bar\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#bar\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">bar</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\"><p>New bar</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/deprecated/1.0.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/deprecated (1.0.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/deprecated/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/deprecated/1.0.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/deprecated</span></div>\n        <div class=\"doc-comment\">Deprecated: don't use</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>deprecated@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.0.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/deprecated\">https://example.com/deprecated</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/deprecated/issues\">https://example.com/deprecated/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>7589f1b802d6b5b93c468fb6399d2235d44d83f27409da2b036455ccb6e07ce5</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"deprecated.deprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#deprecated.deprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./deprecated/index.html\">deprecated.deprecated</a></div>\n                <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/deprecated/1.0.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\"},\"deprecation\":\"don't use\",\"sourceCode\":\"https://example.com/deprecated\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\"},\"summary\":\"A module from a deprecated package\",\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/deprecated/1.0.0/search-index.js",
    "content": "searchData='[{\"name\":\"deprecated.deprecated\",\"kind\":1,\"url\":\"deprecated/index.html\"},{\"name\":\"foo\",\"kind\":5,\"url\":\"deprecated/index.html#foo\",\"sig\":\": Int\",\"parId\":0,\"deprecated\":true},{\"name\":\"bar\",\"kind\":5,\"url\":\"deprecated/index.html#bar\",\"sig\":\": Int\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/fruit/1.1.0/Fruit/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Fruit (localhost:0/fruit:1.1.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/fruit/_/Fruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/fruit/1.1.0/Fruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"../\" data-module-name=\"fruit.Fruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/fruit</a>\n      <h1 id=\"declaration-title\">fruit.Fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">fruit.Fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0#/Fruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/fruit/1.1.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/fruit (1.1.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/fruit/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/fruit/1.1.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>apple-1@example.com, banana-2@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.1.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/fruit\">https://example.com/fruit</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/fruit/issues\">https://example.com/fruit/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"fruit.Fruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#fruit.Fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Fruit/index.html\">fruit.Fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/fruit/1.1.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"},\"sourceCode\":\"https://example.com/fruit\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/localhost(3a)0/fruit/1.1.0/search-index.js",
    "content": "searchData='[{\"name\":\"fruit.Fruit\",\"kind\":1,\"url\":\"Fruit/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Fruit/index.html#name\",\"sig\":\": String\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/scripts/pkldoc.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// Whether the current browser is WebKit.\nlet isWebKitBrowser;\n\n// The lazily initialized worker for running searches, if any.\nlet searchWorker = null;\n\n// Tells whether non-worker search is ready for use.\n// Only relevant if we determined that we can't use a worker.\nlet nonWorkerSearchInitialized = false;\n\n// The search div containing search input and search results.\nlet searchElement;\n\n// The search input element.\nlet searchInput;\n\n// The package name associated with the current page, if any.\nlet packageName;\n\nlet packageVersion;\n\n// The module name associated with the current page, if any.\nlet moduleName;\n\n// The class name associated with the current page, if any.\nlet className;\n\n// Prefix to turn a site-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet rootUrlPrefix;\n\n// Prefix to turn a package-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet packageUrlPrefix;\n\n// The search result currently selected in the search results list.\nlet selectedSearchResult = null;\n\n// Initializes the UI.\n// Wrapped in a function to avoid execution in tests.\n// noinspection JSUnusedGlobalSymbols\nfunction onLoad() {\n  isWebKitBrowser = navigator.userAgent.indexOf('AppleWebKit') !== -1;\n  searchElement = document.getElementById('search');\n  searchInput = document.getElementById('search-input');\n  packageName = searchInput.dataset.packageName || null;\n  packageVersion = searchInput.dataset.packageVersion || null;\n  moduleName = searchInput.dataset.moduleName || null;\n  className = searchInput.dataset.className || null;\n  rootUrlPrefix = searchInput.dataset.rootUrlPrefix;\n  packageUrlPrefix = searchInput.dataset.packageUrlPrefix;\n\n  initExpandTargetMemberDocs();\n  initNavigateToMemberPage();\n  initToggleMemberDocs();\n  initToggleInheritedMembers();\n  initCopyModuleUriToClipboard();\n  initSearchUi();\n}\n\n// If page URL contains a fragment, expand the target member's docs.\n// Handled in JS rather than CSS so that target member can still be manually collapsed.\nfunction initExpandTargetMemberDocs() {\n  const expandTargetDocs = () => {\n    const hash = window.location.hash;\n    if (hash.length === 0) return;\n    \n    const target = document.getElementById(hash.substring(1));\n    if (!target) return;\n\n    const member = target.nextElementSibling;\n    if (!member || !member.classList.contains('with-expandable-docs')) return;\n\n    expandMemberDocs(member);\n  }\n  \n  window.addEventListener('hashchange', expandTargetDocs);\n  expandTargetDocs();\n}\n\n// For members that have their own page, navigate to that page when the member's box is clicked.\nfunction initNavigateToMemberPage() {\n  const elements = document.getElementsByClassName('with-page-link');\n  for (const element of elements) {\n    const memberLink = element.getElementsByClassName('name-decl')[0];\n    // check if this is actually a link\n    // (it isn't if the generator couldn't resolve the link target)\n    if (memberLink.tagName === 'A') {\n      element.addEventListener('click', (e) => {\n        // don't act if user clicked a link\n        if (e.target !== null && e.target.closest('a') !== null) return;\n\n        // don't act if user clicked to select some text\n        if (window.getSelection().toString()) return;\n\n        memberLink.click();\n      });\n    }\n  }\n}\n\n// Expands and collapses member docs.\nfunction initToggleMemberDocs() {\n  const elements = document.getElementsByClassName('with-expandable-docs');\n  for (const element of elements) {\n    element.addEventListener('click', (e) => {\n      // don't act if user clicked a link\n      if (e.target !== null && e.target.closest('a') !== null) return;\n\n      // don't act if user clicked to select some text\n      if (window.getSelection().toString()) return;\n\n      toggleMemberDocs(element);\n    });\n  }\n}\n\n// Shows and hides inherited members.\nfunction initToggleInheritedMembers() {\n  const memberGroups = document.getElementsByClassName('member-group');\n  for (const group of memberGroups) {\n    const button = group.getElementsByClassName('toggle-inherited-members-link')[0];\n    if (button !== undefined) {\n      const members = group.getElementsByClassName('inherited');\n      button.addEventListener('click', () => toggleInheritedMembers(button, members));\n    }\n  }\n}\n\n// Copies the module URI optionally displayed on a module page to the clipboard.\nfunction initCopyModuleUriToClipboard() {\n  const copyUriButtons = document.getElementsByClassName('copy-uri-button');\n\n  for (const button of copyUriButtons) {\n    const moduleUri = button.previousElementSibling;\n\n    button.addEventListener('click', e => {\n      e.stopPropagation();\n      const range = document.createRange();\n      range.selectNodeContents(moduleUri);\n      const selection = getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      try {\n        document.execCommand('copy');\n      } catch (e) {\n      } finally {\n        selection.removeAllRanges();\n      }\n    });\n  }\n}\n\n// Expands or collapses member docs.\nfunction toggleMemberDocs(memberElem) {\n  const comments = memberElem.getElementsByClassName('expandable');\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n\n  if (isCollapsed) {\n    for (const comment of comments) expandElement(comment);\n    icon.textContent = 'expand_less';\n  } else {\n    for (const comment of comments) collapseElement(comment);\n    icon.textContent = 'expand_more';\n  }\n}\n\n// Expands member docs unless they are already expanded.\nfunction expandMemberDocs(memberElem) {\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n  \n  if (!isCollapsed) return;\n  \n  const comments = memberElem.getElementsByClassName('expandable');\n  for (const comment of comments) expandElement(comment);\n  icon.textContent = 'expand_less';\n}\n\n// Shows and hides inherited members.\nfunction toggleInheritedMembers(button, members) {\n  const isCollapsed = button.textContent === 'show inherited';\n\n  if (isCollapsed) {\n    for (const member of members) expandElement(member);\n    button.textContent = 'hide inherited';\n  } else {\n    for (const member of members) collapseElement(member);\n    button.textContent = 'show inherited'\n  }\n}\n\n// Expands an element.\n// Done in two steps to make transition work (can't transition from 'hidden').\n// For some reason (likely related to removing 'hidden') the transition isn't animated in FF.\n// When using timeout() instead of requestAnimationFrame()\n// there is *some* animation in FF but still doesn't look right.\nfunction expandElement(element) {\n  element.classList.remove('hidden');\n\n  requestAnimationFrame(() => {\n    element.classList.remove('collapsed');\n  });\n}\n\n// Collapses an element.\n// Done in two steps to make transition work (can't transition to 'hidden').\nfunction collapseElement(element) {\n  element.classList.add('collapsed');\n\n  const listener = () => {\n    element.removeEventListener('transitionend', listener);\n    element.classList.add('hidden');\n  };\n  element.addEventListener('transitionend', listener);\n}\n\n// Initializes the search UI and sets up delayed initialization of the search engine.\nfunction initSearchUi() {\n  // initialize search engine the first time that search input receives focus\n  const onFocus = () => {\n    searchInput.removeEventListener('focus', onFocus);\n    initSearchWorker();\n  };\n  searchInput.addEventListener('focus', onFocus);\n\n  // clear search when search input loses focus,\n  // except if this happens due to a search result being clicked,\n  // in which case clearSearch() will be called by the link's click handler,\n  // and calling it here would prevent the click handler from firing\n  searchInput.addEventListener('focusout', () => {\n    if (document.querySelector('#search-results:hover') === null) clearSearch();\n  });\n\n  // trigger search when user hasn't typed in a while\n  let timeoutId = null;\n  // Using anything other than `overflow: visible` for `#search-results`\n  // slows down painting significantly in WebKit browsers (at least Safari/Mac).\n  // Compensate by using a higher search delay, which is less annoying than a blocking UI.\n  const delay = isWebKitBrowser ? 200 : 100;\n  searchInput.addEventListener('input', () => {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => triggerSearch(searchInput.value), delay);\n  });\n\n  // keyboard shortcut for entering search\n  document.addEventListener('keyup', e => {\n    // could additionally support '/' like GitHub and Gmail do,\n    // but this would require overriding the default behavior of '/' on Firefox\n    if (e.key === 's') searchInput.focus();\n  });\n\n  // keyboard navigation for search results\n  searchInput.addEventListener('keydown', e => {\n    const results = document.getElementById('search-results');\n    if (results !== null) {\n      if (e.key === 'ArrowDown') {\n        selectNextResult(results.firstElementChild);\n        e.preventDefault();\n      } else if (e.key === 'ArrowUp') {\n        selectPrevResult(results.firstElementChild);\n        e.preventDefault();\n      }\n    }\n  });\n  searchInput.addEventListener('keyup', e => {\n    if (e.key === 'Enter' && selectedSearchResult !== null) {\n      selectedSearchResult.firstElementChild.click();\n      clearSearch();\n    }\n  });\n}\n\n// Initializes the search worker.\nfunction initSearchWorker() {\n  const workerScriptUrl = rootUrlPrefix + 'scripts/search-worker.js';\n\n  try {\n    searchWorker = new Worker(workerScriptUrl, {name: packageName === null ? \"main\" : packageName + '/' + packageVersion});\n    searchWorker.addEventListener('message', e => handleSearchResults(e.data.query, e.data.results));\n  } catch (e) {\n    // could not initialize worker, presumably because we are a file:/// page and content security policy got in the way\n    // fall back to running searches synchronously without a worker\n    // this requires loading search related scripts that would otherwise be loaded by the worker\n\n    searchWorker = null;\n    let pendingScripts = 3;\n\n    const onScriptLoaded = () => {\n      if (--pendingScripts === 0) {\n        initSearchIndex();\n        nonWorkerSearchInitialized = true;\n        if (searchInput.focused) {\n          triggerSearch(searchInput.value);\n        }\n      }\n    };\n    \n    const script1 = document.createElement('script');\n    script1.src = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + 'search-index.js';\n    script1.async = true;\n    script1.onload = onScriptLoaded;\n    document.head.append(script1);\n\n    const script2 = document.createElement('script');\n    script2.src = rootUrlPrefix;\n    script2.async = true;\n    script2.onload = onScriptLoaded;\n    document.head.append(script2);\n\n    const script3 = document.createElement('script');\n    script3.src = workerScriptUrl;\n    script3.async = true;\n    script3.onload = onScriptLoaded;\n    document.head.append(script3);\n  }\n}\n\n// Updates search results unless they are stale.\nfunction handleSearchResults(query, results) {\n  if (query.inputValue !== searchInput.value) return;\n\n  updateSearchResults(renderSearchResults(query, results));\n}\n\n// TODO: Should this (or its callers) use requestAnimationFrame() ?\n// Removes any currently displayed search results, then displays the given results if non-null.\nfunction updateSearchResults(resultsDiv) {\n  selectedSearchResult = null;\n\n  const oldResultsDiv = document.getElementById('search-results');\n  if (oldResultsDiv !== null) {\n    searchElement.removeChild(oldResultsDiv);\n  }\n\n  if (resultsDiv != null) {\n    searchElement.append(resultsDiv);\n    selectNextResult(resultsDiv.firstElementChild);\n  }\n}\n\n// Returns the module of the given member, or `null` if the given member is a module.\nfunction getModule(member) {\n  switch (member.level) {\n    case 0:\n      return null;\n    case 1:\n      return member.parent;\n    case 2:\n      return member.parent.parent;\n  }\n}\n\n// Triggers a search unless search input is invalid or incomplete.\nfunction triggerSearch(inputValue) {\n  const query = parseSearchInput(inputValue);\n  if (!isActionableQuery(query)) {\n    handleSearchResults(query, null);\n    return;\n  }\n\n  if (searchWorker !== null) {\n    searchWorker.postMessage({query, packageName, moduleName, className});\n  } else if (nonWorkerSearchInitialized) {\n    const results = runSearch(query, packageName, moduleName, className);\n    handleSearchResults(query, results);\n  }\n}\n\n// Tells if the given Unicode character is a whitespace character.\nfunction isWhitespace(ch) {\n  const cp = ch.codePointAt(0);\n  if (cp >= 9 && cp <= 13 || cp === 32 || cp === 133 || cp === 160) return true;\n  if (cp < 5760) return false;\n  return cp === 5760 || cp >= 8192 && cp <= 8202\n      || cp === 8232 || cp === 8233 || cp === 8239 || cp === 8287 || cp === 12288;\n}\n\n// Trims the given Unicode characters.\nfunction trim(chars) {\n  const length = chars.length;\n  let startIdx, endIdx;\n\n  for (startIdx = 0; startIdx < length; startIdx += 1) {\n    if (!isWhitespace(chars[startIdx])) break;\n  }\n  for (endIdx = chars.length - 1; endIdx > startIdx; endIdx -= 1) {\n    if (!isWhitespace(chars[endIdx])) break;\n  }\n  return chars.slice(startIdx, endIdx + 1);\n}\n\n// Parses the user provided search input.\n// Preconditions:\n// inputValue !== ''\nfunction parseSearchInput(inputValue) {\n  const chars = trim(Array.from(inputValue));\n  const char0 = chars[0]; // may be undefined\n  const char1 = chars[1]; // may be undefined\n  const prefix = char1 === ':' ? char0 + char1 : null;\n  const kind =\n      prefix === null ? null :\n          char0 === 'm' ? 1 :\n              char0 === 't' ? 2 :\n                  char0 === 'c' ? 3 :\n                      char0 === 'f' ? 4 :\n                          char0 === 'p' ? 5 :\n                              undefined;\n  const unprefixedChars = kind !== null && kind !== undefined ?\n      trim(chars.slice(2, chars.length)) :\n      chars;\n  const normalizedCps = toNormalizedCodePoints(unprefixedChars);\n  return {inputValue, prefix, kind, normalizedCps};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\n// Note: Keep in sync with same function in search-worker.js.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Tells if the given query is valid and long enough to be worth running.\n// Prefixed queries require fewer minimum characters than unprefixed queries.\n// This avoids triggering a search while typing a prefix yet still enables searching for single-character names.\n// For example, `p:e` finds `pkl.math#E`.\nfunction isActionableQuery(query) {\n  const kind = query.kind;\n  const queryCps = query.normalizedCps;\n  return kind !== undefined && (kind !== null && queryCps.length > 0 || queryCps.length > 1);\n}\n\n// Renders the given search results for the given query.\n// Preconditions:\n// isActionableQuery(query) ? results !== null : results === null\nfunction renderSearchResults(query, results) {\n  const resultsDiv = document.createElement('div');\n  resultsDiv.id = 'search-results';\n  const ul = document.createElement('ul');\n  resultsDiv.append(ul);\n\n  if (results === null) {\n    if (query.kind !== undefined) return null;\n\n    const li = document.createElement('li');\n    li.className = 'heading';\n    li.textContent = 'Unknown search prefix. Use one of <b>m:</b> (module), <b>c:</b> (class), <b>f:</b> (function), or <b>p:</b> (property).';\n    ul.append(li);\n    return resultsDiv;\n  }\n\n  const {exactMatches, classMatches, moduleMatches, otherMatches} = results;\n\n  if (exactMatches.length + classMatches.length + moduleMatches.length + otherMatches.length === 0) {\n    renderHeading('No results found', ul);\n    return resultsDiv;\n  }\n\n  if (exactMatches.length > 0) {\n    renderHeading('Top hits', ul);\n    renderMembers(query.normalizedCps, exactMatches, ul);\n  }\n  if (classMatches.length > 0) {\n    renderHeading('Class', ul, className);\n    renderMembers(query.normalizedCps, classMatches, ul);\n  }\n  if (moduleMatches.length > 0) {\n    renderHeading('Module', ul, moduleName);\n    renderMembers(query.normalizedCps, moduleMatches, ul);\n  }\n  if (otherMatches.length > 0) {\n    renderHeading('Other results', ul);\n    renderMembers(query.normalizedCps, otherMatches, ul);\n  }\n\n  return resultsDiv;\n}\n\n// Adds a heading such as `Top matches` to the search results list.\nfunction renderHeading(title, ul, name = null) {\n  const li = document.createElement('li');\n  li.className = 'heading';\n  li.append(title);\n  if (name != null) {\n    li.append(' ');\n    li.append(span('heading-name', name))\n  }\n  ul.append(li);\n}\n\n// Adds matching members to the search results list.\nfunction renderMembers(queryCps, members, ul) {\n  for (const member of members) {\n    ul.append(renderMember(queryCps, member));\n  }\n}\n\n// Renders a member to be added to the search result list.\nfunction renderMember(queryCps, member) {\n  const result = document.createElement('li');\n  result.className = 'result';\n  if (member.deprecated) result.className = 'deprecated';\n\n  const link = document.createElement('a');\n  result.append(link);\n\n  link.href = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + member.url;\n  link.addEventListener('mousedown', () => selectResult(result));\n  link.addEventListener('click', clearSearch);\n\n  const keyword = getKindKeyword(member.kind);\n  // noinspection JSValidateTypes (IntelliJ bug?)\n  if (keyword !== null) {\n    link.append(span('keyword', keyword), ' ');\n  }\n\n  // prefix with class name if a class member\n  if (member.level === 2) {\n    link.append(span(\"context\", member.parent.name + '.'));\n  }\n\n  const name = span('result-name');\n  if (member.matchNameIdx === 0) { // main name matched\n    highlightMatch(queryCps, member.names[0], member.matchStartIdx, name);\n  } else { // aka name matched\n    name.append(member.name);\n  }\n  link.append(name);\n\n  if (member.signature !== null) {\n    link.append(member.signature);\n  }\n\n  if (member.matchNameIdx > 0) { // aka name matched\n    link.append(' ');\n    const aka = span('aka');\n    aka.append('(known as: ');\n    const name = span('aka-name');\n    highlightMatch(queryCps, member.names[member.matchNameIdx], member.matchStartIdx, name);\n    aka.append(name, ')');\n    link.append(aka);\n  }\n\n  // add module name if not a module\n  const module = getModule(member);\n  if (module !== null) {\n    link.append(' ', span('context', '(' + module.name + ')'));\n  }\n\n  return result;\n}\n\n// Returns the keyword for the given member kind.\nfunction getKindKeyword(kind) {\n  switch (kind) {\n    case 0:\n      return \"package\";\n    case 1:\n      return \"module\";\n    case 2:\n      return \"typealias\";\n    case 3:\n      return \"class\";\n    case 4:\n      return \"function\";\n    case 5:\n      // properties have no keyword\n      return null;\n  }\n}\n\n// Highlights the matching characters in a member name.\n// Preconditions:\n// queryCps.length > 0\n// computeMatchFrom(queryCps, name.normalizedCps, name.wordStarts, matchStartIdx)\nfunction highlightMatch(queryCps, name, matchStartIdx, parentElem) {\n  const queryLength = queryCps.length;\n  const codePoints = name.codePoints;\n  const nameCps = name.normalizedCps;\n  const nameLength = nameCps.length;\n  const wordStarts = name.wordStarts;\n\n  let queryIdx = 0;\n  let queryCp = queryCps[0];\n  let startIdx = matchStartIdx;\n\n  if (startIdx > 0) {\n    parentElem.append(String.fromCodePoint(...codePoints.subarray(0, startIdx)));\n  }\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp !== nameCp) {\n      const newNameIdx = wordStarts[nameIdx];\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx))));\n      startIdx = newNameIdx;\n      parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx, newNameIdx)));\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx + 1))));\n      if (nameIdx + 1 < nameLength) {\n        parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx + 1, nameLength)));\n      }\n      return;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  throw 'Precondition violated: `computeMatchFrom()`';\n}\n\n// Creates a span element.\nfunction span(className, text = null) {\n  const result = document.createElement('span');\n  result.className = className;\n  result.textContent = text;\n  return result;\n}\n\n// Creates a text node.\nfunction text(content) {\n  return document.createTextNode(content);\n}\n\n// Navigates to the next member entry in the search results list, skipping headings.\nfunction selectNextResult(ul) {\n  let next = selectedSearchResult === null ? ul.firstElementChild : selectedSearchResult.nextElementSibling;\n  while (next !== null) {\n    if (!next.classList.contains('heading')) {\n      selectResult(next);\n      scrollIntoView(next, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    next = next.nextElementSibling;\n  }\n}\n\n// Navigates to the previous member entry in the search results list, skipping headings.\nfunction selectPrevResult(ul) {\n  let prev = selectedSearchResult === null ? ul.lastElementChild : selectedSearchResult.previousElementSibling;\n  while (prev !== null) {\n    if (!prev.classList.contains('heading')) {\n      selectResult(prev);\n      const prev2 = prev.previousElementSibling;\n      // make any immediately preceding heading visible as well (esp. important for first heading)\n      const scrollTo = prev2 !== null && prev2.classList.contains('heading') ? prev2 : prev;\n      scrollIntoView(scrollTo, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    prev = prev.previousElementSibling;\n  }\n}\n\n// Selects the given entry in the search results list.\nfunction selectResult(li) {\n  if (selectedSearchResult !== null) {\n    selectedSearchResult.classList.remove('selected');\n  }\n  li.classList.add('selected');\n  selectedSearchResult = li;\n}\n\n// Clears the search input and hides/removes the search results list.\nfunction clearSearch() {\n  searchInput.value = '';\n  updateSearchResults(null);\n}\n\nconst updateRuntimeDataWith = (buildAnchor) => (fragmentId, entries) => {\n  if (!entries) return;\n  const fragment = document.createDocumentFragment();\n  let first = true;\n  for (const entry of entries) {\n    const a = document.createElement(\"a\");\n    buildAnchor(entry, a);\n    if (first) {\n      first = false;\n    } else {\n      fragment.append(\", \");\n    }\n    fragment.append(a);\n  }\n\n  const element = document.getElementById(fragmentId);\n  element.append(fragment);\n  element.classList.remove(\"hidden\"); // dd\n  element.previousElementSibling.classList.remove(\"hidden\"); // dt\n}\n\n// Functions called by JS data scripts.\n// noinspection JSUnusedGlobalSymbols\nconst runtimeData = {\n  knownVersions: (versions, myVersion) => {\n    updateRuntimeDataWith((entry, anchor) => {\n      const { text, href } = entry;\n      anchor.textContent = text;\n      // noinspection JSUnresolvedReference\n      if (text === myVersion) {\n        anchor.className = \"current-version\";\n      } else if (href) {\n        anchor.href = href;\n      }\n    })(\"known-versions\", versions);\n  },\n  knownUsagesOrSubtypes: updateRuntimeDataWith((entry, anchor) => {\n    const { text, href } = entry;\n    anchor.textContent = text;\n    // noinspection JSUnresolvedReference\n    anchor.textContent = text;\n    if (href) {\n      anchor.href = href;\n    }\n  }),\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/scripts/search-worker.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// populated by `initSearchIndex()`\nlet searchIndex;\n\n// noinspection ThisExpressionReferencesGlobalObjectJS\nconst isWorker = 'DedicatedWorkerGlobalScope' in this;\n\nif (isWorker) {\n  const workerName = self.name;\n  // relative to this file\n  const searchIndexUrl = workerName === \"main\" ?\n      '../search-index.js' :\n      '../' + workerName + '/search-index.js';\n  importScripts(searchIndexUrl);\n  initSearchIndex();\n  addEventListener('message', e => {\n    const {query, packageName, moduleName, className} = e.data;\n    const results = runSearch(query, packageName, moduleName, className);\n    postMessage({query, results});\n  });\n} else {\n  // non-worker environment\n  // `pkldoc.js` loads scripts and calls `initSearchIndex()`\n}\n\n// Initializes the search index.\nfunction initSearchIndex() {\n  // noinspection JSUnresolvedVariable\n  const data = JSON.parse(searchData);\n  const index = Array(data.length);\n  let idx = 0;\n\n  for (const entry of data) {\n    const name = entry.name;\n    const names = toIndexedNames(entry);\n    // 0 -> package, 1 -> module, 2 -> type alias, 3 -> class, 4 -> function, 5 -> property\n    const kind = entry.kind;\n    const url = entry.url;\n    // noinspection JSUnresolvedVariable\n    const signature = entry.sig === undefined ? null : entry.sig;\n    // noinspection JSUnresolvedVariable\n    const parent = entry.parId === undefined ? null : index[entry.parId];\n    const level = parent === null ? 0 : parent.parent === null ? 1 : 2;\n    const deprecated = entry.deprecated !== undefined;\n\n    index[idx++] = {\n      name,\n      names,\n      kind,\n      url,\n      signature,\n      parent,\n      level,\n      deprecated,\n      // remaining attributes are set by `computeMatchFrom` and hence aren't strictly part of the search index\n      matchNameIdx: -1,  // names[matchNameIdx] is the name that matched\n      matchStartIdx: -1, // names[matchNameIdx].codePoints[matchStartIdx] is the first code point that matched\n      similarity: 0 // number of code points matched relative to total number of code points (between 0.0 and 1.0)\n    };\n  }\n\n  searchIndex = index;\n}\n\n// Runs a search and returns its results.\nfunction runSearch(query, packageName, moduleName, className) {\n  const queryCps = query.normalizedCps;\n  const queryKind = query.kind;\n\n  let exactMatches = [];\n  let classMatches = [];\n  let moduleMatches = [];\n  let otherMatches = [];\n\n  for (const member of searchIndex) {\n    if (queryKind !== null && queryKind !== member.kind) continue;\n\n    if (!isMatch(queryCps, member)) continue;\n\n    if (member.similarity === 1) {\n      exactMatches.push(member);\n    } else if (moduleName !== null && member.level === 1 && moduleName === member.parent.name) {\n      moduleMatches.push(member);\n    } else if (moduleName !== null && member.level === 2 && moduleName === member.parent.parent.name) {\n      if (className !== null && className === member.parent.name) {\n        classMatches.push(member);\n      } else {\n        moduleMatches.push(member);\n      }\n    } else {\n      otherMatches.push(member);\n    }\n  }\n\n  // Sorts members best-first.\n  function compareMembers(member1, member2) {\n    const normDiff = member2.similarity - member1.similarity; // higher is better\n    if (normDiff !== 0) return normDiff;\n\n    const lengthDiff = member1.matchNameLength - member2.matchNameLength; // lower is better\n    if (lengthDiff !== 0) return lengthDiff;\n\n    const kindDiff = member2.kind - member1.kind; // higher is better\n    if (kindDiff !== 0) return kindDiff;\n\n    return member1.matchNameIdx - member2.matchNameIdx; // lower is better\n  }\n\n  exactMatches.sort(compareMembers);\n  classMatches.sort(compareMembers);\n  moduleMatches.sort(compareMembers);\n  otherMatches.sort(compareMembers);\n\n  return {exactMatches, classMatches, moduleMatches, otherMatches};\n}\n\n// Indexes a member's names.\nfunction toIndexedNames(entry) {\n  const result = [];\n  result.push(toIndexedName(entry.name));\n  // noinspection JSUnresolvedVariable\n  const alsoKnownAs = entry.aka;\n  if (alsoKnownAs !== undefined) {\n    for (const name of alsoKnownAs) {\n      result.push(toIndexedName(name));\n    }\n  }\n  return result;\n}\n\n// Indexes the given name.\nfunction toIndexedName(name) {\n  const characters = Array.from(name);\n  const codePoints = Uint32Array.from(characters, ch => ch.codePointAt(0));\n  const normalizedCps = toNormalizedCodePoints(characters);\n  const wordStarts = toWordStarts(characters);\n\n  return {codePoints, normalizedCps, wordStarts};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Returns an array of same length as `characters` that for every index, holds the index of the next word start.\n// Preconditions:\n// characters.length > 0\nfunction toWordStarts(characters) {\n  const length = characters.length;\n  // -1 is used as 'no next word start exists' -> use signed int array\n  const result = length <= 128 ? new Int8Array(length) : new Int16Array(length);\n\n  if (length > 1) {\n    let class1 = toCharClass(characters[length - 1]);\n    let class2;\n    let wordStart = -1;\n    for (let idx = length - 1; idx >= 1; idx -= 1) {\n      class2 = class1;\n      class1 = toCharClass(characters[idx - 1]);\n      const diff = class1 - class2;\n      // transitions other than uppercase -> other\n      if (diff !== 0 && diff !== 3) wordStart = idx;\n      result[idx] = wordStart;\n      // uppercase -> other\n      if (diff === 3) wordStart = idx - 1;\n    }\n  }\n\n  // first character is always a word start\n  result[0] = 0;\n\n  return result;\n}\n\n\n// Partitions characters into uppercase, digit, dot, and other.\nfunction toCharClass(ch) {\n  const regexIsUppercase = /\\p{Lu}/u\n  const regexIsNumericCharacter = /\\p{N}/u\n  return regexIsUppercase.test(ch) ? 3 : regexIsNumericCharacter.test(ch) ? 2 : ch === '.' ? 1 : 0;\n}\n\n// Tests if `queryCps` matches any of `member`'s names.\n// If so, records information about the match in `member`.\n// Preconditions:\n// queryCps.length > 0\nfunction isMatch(queryCps, member) {\n  const queryLength = queryCps.length;\n  let nameIdx = 0;\n\n  for (const name of member.names) {\n    const nameCps = name.normalizedCps;\n    const nameLength = nameCps.length;\n    const wordStarts = name.wordStarts;\n    const maxStartIdx = nameLength - queryLength;\n\n    for (let startIdx = 0; startIdx <= maxStartIdx; startIdx += 1) {\n      const matchLength = computeMatchFrom(queryCps, nameCps, wordStarts, startIdx);\n      if (matchLength > 0) {\n        member.matchNameIdx = nameIdx;\n        member.matchStartIdx = startIdx;\n        // Treat exact match of last module name component as exact match (similarity == 1).\n        // For example, treat \"PodSpec\" as exact match for \"io.k8s.api.core.v1.PodSpec\".\n        // Because \"ps\" is considered an exact match for \"PodSpec\",\n        // it is also considered an exact match for \"io.k8s.api.core.v1.PodSpec\".\n        const isExactMatchOfLastModuleNameComponent =\n            startIdx > 0 && nameCps[startIdx - 1] === 46 /* '.' */ && matchLength === nameLength - startIdx;\n        member.similarity = isExactMatchOfLastModuleNameComponent ? 1 : matchLength / nameLength;\n        member.matchNameLength = nameLength;\n        return true;\n      }\n    }\n\n    nameIdx += 1;\n  }\n\n  return false;\n}\n\n// Tests if the given query matches the given name from `startIdx` on.\n// Returns the number of code points matched.\n// Word start matches get special treatment.\n// For example, `sb` is considered to match all code points of `StringBuilder`.\n// Preconditions:\n// queryCps.length > 0\n// nameCps.length > 0\n// wordStarts.length === nameCps.length\n// startIdx < nameCps.length\nfunction computeMatchFrom(queryCps, nameCps, wordStarts, startIdx) {\n  const queryLength = queryCps.length;\n  const nameLength = nameCps.length;\n  const beginsWithWordStart = wordStarts[startIdx] === startIdx;\n\n  let queryIdx = 0;\n  let matchLength = 0;\n  let queryCp = queryCps[0];\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp === nameCp) {\n      matchLength += 1;\n    } else { // check for word start match\n      if (nameIdx === startIdx || !beginsWithWordStart) return 0;\n\n      const newNameIdx = wordStarts[nameIdx];\n      if (newNameIdx === -1) return 0;\n\n      const newNameCp = nameCps[newNameIdx];\n      if (queryCp !== newNameCp) return 0;\n\n      matchLength += newNameIdx - nameIdx + 1;\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      // in case of a word start match, increase matchLength by number of remaining chars of the last matched word\n      const nextIdx = nameIdx + 1;\n      if (beginsWithWordStart && nextIdx < nameLength) {\n        const nextStart = wordStarts[nextIdx];\n        if (nextStart === -1) {\n          matchLength += nameLength - nextIdx;\n        } else {\n          matchLength += nextStart - nextIdx;\n        }\n      }\n\n      return matchLength;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1\",\"kind\":0,\"url\":\"com.package1/current/index.html\",\"deprecated\":true},{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"com.package1/current/Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"com.package1/current/baseModule/index.html\"},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classAnnotations/index.html\"},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"com.package1/current/classComments/index.html\"},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"com.package1/current/classInheritance/index.html\"},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"com.package1/current/classMethodComments/index.html\"},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/classMethodModifiers/index.html\"},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeReferences/index.html\"},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"com.package1/current/classPropertyComments/index.html\"},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/classPropertyModifiers/index.html\"},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeReferences/index.html\"},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"com.package1/current/classTypeConstraints/index.html\"},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject1/index.html\"},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject2/index.html\"},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"com.package1/current/docLinks/index.html\"},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"com.package1/current/methodAnnotations/index.html\"},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"com.package1/current/moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"com.package1/current/moduleExtend/index.html\"},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"com.package1/current/moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodCommentInheritance/index.html\"},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodComments/index.html\"},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodModifiers/index.html\"},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeReferences/index.html\"},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyCommentInheritance/index.html\"},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyComments/index.html\"},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyModifiers/index.html\"},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeReferences/index.html\"},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes1/index.html\"},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes2/index.html\"},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"com.package1/current/nested/nested2/nestedModule/index.html\"},{\"name\":\"com.package1.ternalPackage\",\"kind\":1,\"url\":\"com.package1/current/ternalPackage/index.html\"},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"com.package1/current/shared/index.html\"},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"com.package1/current/typealiases/index.html\"},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"com.package1/current/typealiases2/index.html\"},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"com.package1/current/typeAliasInheritance/index.html\"},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"com.package1/current/unionTypes/index.html\"},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"com.package1/current/unlistedClass/index.html\"},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"com.package1/current/unlistedMethod/index.html\"},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"com.package1/current/unlistedProperty/index.html\"},{\"name\":\"com.package2\",\"kind\":0,\"url\":\"com.package2/current/index.html\"},{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"com.package2/current/Module3/index.html\"},{\"name\":\"localhost:0/birds\",\"kind\":0,\"url\":\"localhost(3a)0/birds/current/index.html\"},{\"name\":\"localhost:0/birds.catalog\",\"kind\":1,\"url\":\"localhost(3a)0/birds/current/catalog/index.html\"},{\"name\":\"localhost:0/birds.allFruit\",\"kind\":1,\"url\":\"localhost(3a)0/birds/current/allFruit/index.html\"},{\"name\":\"localhost:0/birds.Bird\",\"kind\":1,\"url\":\"localhost(3a)0/birds/current/Bird/index.html\"},{\"name\":\"localhost:0/deprecated\",\"kind\":0,\"url\":\"localhost(3a)0/deprecated/current/index.html\",\"deprecated\":true},{\"name\":\"localhost:0/deprecated.deprecated\",\"kind\":1,\"url\":\"localhost(3a)0/deprecated/current/deprecated/index.html\"},{\"name\":\"localhost:0/fruit\",\"kind\":0,\"url\":\"localhost(3a)0/fruit/current/index.html\"},{\"name\":\"localhost:0/fruit.Fruit\",\"kind\":1,\"url\":\"localhost(3a)0/fruit/current/Fruit/index.html\"}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-1/styles/pkldoc.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-Regular'),\n  url('../fonts/lato-v14-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Lato Bold'), local('Lato-Bold'),\n  url('../fonts/lato-v14-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Regular'), local('OpenSans-Regular'),\n  url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Open Sans Italic'), local('OpenSans-Italic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Open Sans Bold'), local('OpenSans-Bold'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Source Code Pro'), local('SourceCodePro-Regular'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Material Icons';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Material Icons'),\n  local('MaterialIcons-Regular'),\n  url(../fonts/MaterialIcons-Regular.woff2) format('woff2');\n}\n\n.material-icons {\n  /*noinspection CssNoGenericFontName*/\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 24px;\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  line-height: 1;\n  text-transform: none;\n  letter-spacing: normal;\n  word-wrap: normal;\n  white-space: nowrap;\n  direction: ltr;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  -moz-osx-font-smoothing: grayscale;\n  font-feature-settings: 'liga';\n}\n\ninput[type=search] {\n  -webkit-appearance: textfield;\n}\n\ninput[type=search]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\ninput::-moz-placeholder {\n  opacity: 1;\n}\n\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n  border: 0;\n  font-family: inherit;\n  font-size: 100%;\n  font-style: inherit;\n  font-weight: inherit;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  vertical-align: baseline;\n}\n\nbody {\n  margin: 0;\n  font-family: Lato, Arial, sans-serif;\n  background-color: #f0f3f6;\n  scroll-behavior: smooth;\n}\n\na, a:visited, a:hover, a:active {\n  color: inherit;\n}\n\na:hover {\n  text-decoration: none;\n  transition: 0s;\n}\n\ncode, .member-modifiers, .member-signature, .doc-comment pre, #search-results li.result, .result-name, .heading-name, .aka-name {\n  font-family: \"Source Code Pro\", monospace;\n  letter-spacing: -0.03em;\n}\n\nheader {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw; /* vw to make sure that positioning is the same whether or not vertical scrollbar is displayed */\n  height: 32px;\n  z-index: 1;\n  background-color: #364550;\n  padding: 7px 0 7px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n}\n\n#doc-title {\n  position: absolute;\n  margin-top: 8px;\n  margin-left: 15px;\n}\n\n#doc-title a {\n  color: #fff;\n  text-decoration: none;\n}\n\n#search {\n  position: relative;\n  width: 50vw;\n  margin: 0 auto;\n}\n\n#search-icon {\n  position: absolute;\n  left: 0;\n  top: 2px;\n  padding: 4px;\n  font-size: 21px;\n  color: #a5a9a9;\n}\n\n#search-input {\n  margin-top: 2px;\n  width: 100%;\n  height: 28px;\n  text-indent: 28px;\n  font-size: 0.85em;\n  background-color: rgba(255, 255, 255, 0.2);\n  border: none;\n  border-radius: 3px;\n  color: #fff;\n}\n\n#search-input:focus {\n  background-color: #6D7880;\n  outline: none;\n}\n\n#search-input::placeholder {\n  text-align: center;\n  color: #A5A9A9;\n}\n\n#search-input:focus::placeholder {\n  color: transparent;\n}\n\n#search-results {\n  position: fixed;\n  box-sizing: border-box;\n  top: 38px;\n  left: 25vw;\n  right: 25vw;\n  width: 50vw;\n  max-height: 80%;\n  color: #103a51;\n  background: white;\n  border: solid 1px #6D7880;\n  border-radius: 3px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n  white-space: nowrap;\n\n  overflow: auto; /* in safari, this slows down painting, blocking the ui */\n  /*noinspection CssUnknownProperty*/\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n}\n\n#search-results a {\n  text-decoration: none;\n}\n\n#search-results a:hover {\n  text-decoration: underline;\n}\n\n#search-results ul {\n  list-style: none;\n  font-size: 0.9em;\n}\n\n#search-results li {\n  padding: 0.2ch 3ch;\n  height: 17px; /* used same height regardless of which fonts are used in content */\n}\n\n#search-results li.heading {\n  background-color: #f0f3f6;\n  padding: 0.4ch 1ch;\n}\n\n#search-results li.result {\n  font-size: 0.9em;\n}\n\n#search-results .keyword {\n  color: #000082;\n}\n\n#search-results .highlight {\n  font-weight: bold;\n}\n\n#search-results .context {\n  color: gray;\n}\n\n#search-results .selected, #search-results .selected .keyword, #search-results .selected .aka, #search-results .selected .context {\n  background: darkblue;\n  color: white;\n}\n\n#search-results .deprecated {\n  text-decoration: line-through;\n}\n\n/* make sure that line-through of highlighted region of selected search result has the right color */\n#search-results .deprecated.selected .highlight {\n  text-decoration: line-through;\n}\n\nmain {\n  width: 70%;\n  margin: 60px auto 20px;\n}\n\n.declaration-parent-link {\n  margin: 0 0 1rem;\n}\n\n#declaration-title {\n  font-size: 2em;\n  font-weight: bold;\n  color: #103a51;\n  margin: 0.5rem 0;\n}\n\n#declaration-version {\n  color: #A5A9A9;\n  font-size: 0.9em;\n  vertical-align: bottom;\n  padding-left: 0.25em;\n}\n\n.member-group-links {\n  margin: 0.75em 0 1em 0;\n}\n\n.member-group-links li {\n  display: inline-block;\n  margin-right: 1em;\n}\n\n.member-info {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  line-height: 1.5;\n  margin-top: 0.5em;\n  font-size: 0.9em;\n}\n\n.member-info dt {\n  grid-column: 1;\n  text-align: right;\n}\n\n.member-info dd {\n  grid-column: 2;\n  margin-left: 0.5em;\n}\n\n.copy-uri-button {\n  cursor: pointer;\n  font-size: inherit;\n  margin-left: 0.5em;\n}\n\n.member-group {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.member-group-title {\n  margin: 1rem;\n  font-weight: bold;\n  color: #103a51;\n}\n\n.toggle-inherited-members {\n  font-size: 0.9em;\n  font-weight: normal;\n  margin-left: 0.5em;\n}\n\n.button-link {\n  text-decoration: underline;\n}\n\n.button-link:hover, .button-link:active {\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.member-group ul {\n  list-style: none;\n}\n\n.member-group li {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.anchor,\n.anchor-param1,\n.anchor-param2,\n.anchor-param3,\n.anchor-param4,\n.anchor-param5,\n.anchor-param6,\n.anchor-param7,\n.anchor-param8,\n.anchor-param9 {\n  position: absolute;\n  top: -60px;\n  left: 0;\n}\n\n.anchor:target ~ .member,\n.anchor-param1:target ~ .member,\n.anchor-param2:target ~ .member,\n.anchor-param3:target ~ .member,\n.anchor-param4:target ~ .member,\n.anchor-param5:target ~ .member,\n.anchor-param6:target ~ .member,\n.anchor-param7:target ~ .member,\n.anchor-param8:target ~ .member,\n.anchor-param9:target ~ .member {\n  border-left: 3px solid #222832;\n}\n\n.anchor:target ~ .member .name-decl,\n.anchor-param1:target ~ .member .param1,\n.anchor-param2:target ~ .member .param2,\n.anchor-param3:target ~ .member .param3,\n.anchor-param4:target ~ .member .param4,\n.anchor-param5:target ~ .member .param5,\n.anchor-param6:target ~ .member .param6,\n.anchor-param7:target ~ .member .param7,\n.anchor-param8:target ~ .member .param8,\n.anchor-param9:target ~ .member .param9 {\n  font-weight: bold;\n}\n\n.member {\n  border-left: 3px solid transparent;\n  margin: 0 auto 0.5rem;\n  background-color: #fff;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n  font-size: 0.9em;\n  padding: 10px;\n  color: #222832;\n}\n\n.member:hover {\n  background-color: #f2f2f2;\n}\n\n.member-left {\n  width: 25%;\n  display: inline;\n  float: left;\n  padding-right: 6px;\n  min-height: 1px;\n  text-align: right;\n}\n\n.member-modifiers {\n  color: #000082;\n}\n\n.member-main {\n  display: block;\n  overflow: hidden;\n}\n\n.member-deprecated {\n  text-decoration: line-through;\n}\n\n.member-selflink {\n  visibility: hidden;\n  display: inline;\n  float: left;\n  padding-right: 20px;\n  color: #222832;\n  text-decoration: none;\n}\n\n.member-source-link {\n  visibility: hidden;\n  color: #fff;\n  background-color: #868e96;\n  display: inline-block;\n  margin-left: 1em;\n  padding: .25em .4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  vertical-align: bottom;\n  border-radius: .25rem\n}\n\n.member-source-link:visited, .member-source-link:hover, .member-source-link:active {\n  color: #fff;\n}\n\n.member:hover .member-source-link, .member:hover .member-selflink {\n  visibility: visible;\n}\n\n.member.inherited, .member.hidden-member {\n  opacity: 0.75;\n}\n\n.member.inherited .context {\n  color: gray;\n}\n\n.member.with-page-link, .member.with-expandable-docs {\n  cursor: pointer;\n}\n\n.member .expandable-docs-icon {\n  float: right;\n}\n\n/*\nDon't style a.name-decl as link\nbecause the entire .member.with-page-link is effectively a link (via JS).\n*/\n.member.with-page-link a.name-decl {\n  text-decoration: none;\n}\n\n.expandable {\n  transform: scaleY(1);\n  transition: transform 0.25s;\n}\n\n.expandable.collapsed {\n  transform: scaleY(0);\n}\n\n.expandable.hidden {\n  display: none;\n}\n\n#_declaration .expandable {\n  transform: none;\n  transition: none;\n}\n\n#_declaration .expandable.collapsed {\n  mask: linear-gradient(rgb(0 0 0), transparent) content-box;\n  height: 100px;\n}\n\n#_declaration .expandable.hidden {\n  display: block;\n}\n\n/* show an otherwise hidden inherited member if it's a link target */\n.anchor:target + .expandable.collapsed.hidden {\n  display: inherit;\n  transform: scaleY(1);\n}\n\n.doc-comment {\n  color: #103a51;\n  margin-top: 0.5rem;\n  font-family: \"Open Sans\", sans-serif;\n  font-size: 0.9em;\n}\n\n.doc-comment p {\n  margin: 0.7em 0;\n}\n\n.doc-comment p:first-child {\n  margin-top: 0;\n}\n\n.doc-comment p:last-child {\n  margin-bottom: 0;\n}\n\n.doc-comment h1,\n.doc-comment h2,\n.doc-comment h3,\n.doc-comment h4,\n.doc-comment h5,\n.doc-comment h6 {\n  margin-bottom: 0.7em;\n  margin-top: 1.4em;\n  display: block;\n  text-align: left;\n  font-weight: bold;\n}\n\n.doc-comment pre {\n  padding: 0.5em;\n  border: 0 solid #ddd;\n  background-color: #364550;\n  color: #ddd;\n  margin: 5px 0;\n  display: block;\n  border-radius: 0.2em;\n  overflow-x: auto;\n}\n\n.doc-comment ul {\n  display: block;\n  list-style: circle;\n  padding-left: 20px;\n}\n\n.doc-comment ol {\n  display: block;\n  padding-left:20px;\n}\n\n.doc-comment ol.decimal {\n  list-style: decimal;\n}\n\n.doc-comment ol.lowerAlpha {\n  list-style: lower-alpha;\n}\n\n.doc-comment ol.upperAlpha {\n  list-style: upper-alpha;\n}\n\n.doc-comment ol.lowerRoman {\n  list-style: lower-roman;\n}\n\n.doc-comment ol.upperRoman {\n  list-style: upper-roman;\n}\n\n.doc-comment li {\n  display: list-item;\n}\n\n.doc-comment code {\n  font-weight: normal;\n}\n\n.doc-comment em, .doc-comment i {\n  font-style: italic;\n}\n\n.doc-comment strong, .doc-comment b {\n  font-weight: bold;\n}\n\n.runtime-data.hidden {\n  display: none;\n}\n\n.runtime-data .current-version {\n  font-weight: bold;\n}\n\n/*\nStyling for Markdown tables in doc comments.\nFrom: https://gist.github.com/andyferra/2554919\n*/\n\ntable {\n  padding: 0;\n}\n\ntable tr {\n  border-top: 1px solid #cccccc;\n  background-color: white;\n  margin: 0;\n  padding: 0;\n}\n\ntable tr:nth-child(2n) {\n  background-color: #f8f8f8;\n}\n\ntable tr th {\n  font-weight: bold;\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr td {\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr th :first-child, table tr td :first-child {\n  margin-top: 0;\n}\n\ntable tr th :last-child, table tr td :last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/.pkldoc/VERSION",
    "content": "2"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/Module Containing Spaces/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Module Containing Spaces (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.Module Containing Spaces\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.`Module Containing Spaces`<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.`Module Containing Spaces`</span></div>\n        <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/Module%20Containing%20Spaces.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/Module%20Containing%20Spaces.pkl\">Module Containing Spaces.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/baseModule/BaseClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>BaseClass (com.package1/baseModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/BaseClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/BaseClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-class-name=\"BaseClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.baseModule</a>\n      <h1 id=\"declaration-title\">BaseClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">BaseClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/baseModule/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>baseModule (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.baseModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.baseModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/baseModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/baseModule.pkl\">baseModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"BaseClass.html\" class=\"name-decl\">BaseClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classAnnotations/AnnotatedClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>AnnotatedClass (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClass</span></div>\n        <div class=\"doc-comment\">Deprecated.</div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classAnnotations/AnnotatedClss.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>AnnotatedClss (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClss\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClss<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClss</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClss</code> thought to have a correctly spelled name.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>AnnotatedClssWithExpandableComment (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClssWithExpandableComment\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClssWithExpandableComment<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClssWithExpandableComment</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClssWithExpandableComment</code> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classAnnotations.pkl\">classAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"AnnotatedClss\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClss\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClss.html\" class=\"name-decl\">AnnotatedClss</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClssWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClssWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClssWithExpandableComment.html\" class=\"name-decl\">AnnotatedClssWithExpandableComment</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClass.html\" class=\"name-decl\">AnnotatedClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated.</div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments1 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments2 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments3 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments3</span></div>\n        <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments4 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments4</span></div>\n        <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph2, line2).</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments5.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments5 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments5.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments5.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments5\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments5<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments5</span></div>\n        <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments6.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments6 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments6.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments6.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments6\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments6<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments6</span></div>\n        <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments7.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments7 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments7.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments7.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments7\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments7<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments7</span></div>\n        <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/Comments8.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments8 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments8.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments8.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments8\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments8<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments8</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Installation</h2>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classComments.pkl\">classComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>git status</code></td>\n<td>List all <em>new or modified</em> files</td>\n</tr>\n<tr>\n<td><code>git diff</code></td>\n<td>Show file differences that <strong>haven't been</strong> staged</td>\n</tr>\n</tbody>\n</table></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments1.html\" class=\"name-decl\">Comments1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments2.html\" class=\"name-decl\">Comments2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments3.html\" class=\"name-decl\">Comments3</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments4.html\" class=\"name-decl\">Comments4</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments5\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments5.html\" class=\"name-decl\">Comments5</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments6\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments6.html\" class=\"name-decl\">Comments6</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments7\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments7.html\" class=\"name-decl\">Comments7</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments8\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments8.html\" class=\"name-decl\">Comments8</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classInheritance/MyClass1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass1 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass1.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classInheritance/MyClass2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass2 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">MyClass2</span> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classInheritance/MyClass3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass3 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass3</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classInheritance/MyClass4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass4 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass4</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classInheritance</span></div>\n        <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classInheritance.pkl\">classInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass1.html\" class=\"name-decl\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass2.html\" class=\"name-decl\">MyClass2</a> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass3.html\" class=\"name-decl\">MyClass3</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass4.html\" class=\"name-decl\">MyClass4</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments (com.package1/classMethodComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodComments.pkl\">classMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Modifiers (com.package1/classMethodModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodModifiers.pkl\">classMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeAnnotations (com.package1/classMethodTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeAnnotations.pkl\">classMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeReferences (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeReferences.pkl\">classMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>ClassWithAnnotatedProperty (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"ClassWithAnnotatedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">ClassWithAnnotatedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ClassWithAnnotatedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyAnnotations.pkl\">classPropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ClassWithAnnotatedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ClassWithAnnotatedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ClassWithAnnotatedProperty.html\" class=\"name-decl\">ClassWithAnnotatedProperty</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Comments (com.package1/classPropertyComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyComments.pkl\">classPropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Modifiers (com.package1/classPropertyModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with multiple modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyModifiers.pkl\">classPropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeAnnotations (com.package1/classPropertyTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl\">classPropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>TypeReferences (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classPropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classPropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeReferences.pkl\">classPropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classTypeConstraints/Address.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Address (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Address.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Address.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Address\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Address<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Address</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"street\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#street\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">street</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"city\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#city\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">city</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classTypeConstraints/Person1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person1 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(length &gt;= 3)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"address\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">address</span>: <a href=\"Address.html\" class=\"name-ref\">Address</a>(street != city)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classTypeConstraints/Person2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person2 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classTypeConstraints/Project.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Project (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Project.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Project.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Project\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Project<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Project</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"type\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#type\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">type</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(oneOf(List(&quot;open-source&quot;, &quot;closed-source&quot;)))?<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"contacts\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#contacts\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">contacts</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty), <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)&gt;(length &gt; 10, length &lt; 20)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/classTypeConstraints/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>classTypeConstraints (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classTypeConstraints<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classTypeConstraints</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classTypeConstraints.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classTypeConstraints.pkl\">classTypeConstraints.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emailAddress\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emailAddress\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emailAddress</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person1.html\" class=\"name-decl\">Person1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Address\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Address.html\" class=\"name-decl\">Address</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Project\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Project\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Project.html\" class=\"name-decl\">Project</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/docExampleSubject1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>docExampleSubject1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject1.pkl\">docExampleSubject1.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a>, <a href=\"https://example.com/package1/docExample2.pkl\">docExample2</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/docExampleSubject2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>docExampleSubject2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject2.pkl\">docExampleSubject2.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"y\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#y\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">y</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/docLinks/Person.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person (com.package1/docLinks:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.docLinks</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <code>Person.name</code>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"call()\" class=\"anchor\"> </div>\n            <div id=\"call().number\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#call()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">call</span>(<span class=\"param1\">number</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code>\n<code>number</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/docLinks/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>docLinks (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docLinks<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docLinks</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docLinks.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docLinks.pkl\">docLinks.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"age\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#age\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">age</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<code>age</code>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"sing()\" class=\"anchor\"> </div>\n            <div id=\"sing().song\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#sing()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">sing</span>(<span class=\"param1\">song</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <code>sing()</code>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>song</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"PersonList\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#PersonList\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#PersonList\" class=\"name-decl\">PersonList</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>PersonList</code>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>com.package1 (1.2.3) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package1/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package1/1.2.3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package1</span></div>\n        <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>package1-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.2.3</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/\">https://example.com/package1/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package1/\">https://issues.apple.com/package1/</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../com.package2/4.5.6/index.html\">com.package2:4.5.6</a>, <span>com.externalpackage:7.8.9</span></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Docs for Package 1.</p><ul>\n<li>\n<p><a href=\"docLinks/index.html\"><code>docLinks</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#age\"><code>docLinks.age</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#sing()\"><code>docLinks.sing()</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html\"><code>docLinks.Person</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html#name\"><code>docLinks.Person.name</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#PersonList\"><code>docLinks.PersonList</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a></p>\n</li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1.Module%20Containing%20Spaces\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.Module%20Containing%20Spaces\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module%20Containing%20Spaces/index.html\">com.package1.`Module Containing Spaces`</a></div>\n                <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.baseModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.baseModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./baseModule/index.html\">com.package1.baseModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classAnnotations/index.html\">com.package1.classAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classComments/index.html\">com.package1.classComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classInheritance/index.html\">com.package1.classInheritance</a></div>\n                <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodComments/index.html\">com.package1.classMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodModifiers/index.html\">com.package1.classMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeAnnotations/index.html\">com.package1.classMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeReferences/index.html\">com.package1.classMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyAnnotations/index.html\">com.package1.classPropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyComments/index.html\">com.package1.classPropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyModifiers/index.html\">com.package1.classPropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeAnnotations/index.html\">com.package1.classPropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeReferences/index.html\">com.package1.classPropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classTypeConstraints\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classTypeConstraints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classTypeConstraints/index.html\">com.package1.classTypeConstraints</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject1/index.html\">com.package1.docExampleSubject1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject2/index.html\">com.package1.docExampleSubject2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docLinks\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docLinks\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docLinks/index.html\">com.package1.docLinks</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"shared/index.html\"><code>shared</code></a>, <a href=\"shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"docLinks/index.html#age\"><code>age</code></a>, <a href=\"docLinks/index.html#sing()\"><code>sing()</code></a>, <a href=\"docLinks/Person.html\"><code>Person</code></a>, <a href=\"docLinks/Person.html#name\"><code>Person.name</code></a>, <a href=\"docLinks/Person.html#call()\"><code>Person.call()</code></a>, <a href=\"docLinks/index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.methodAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.methodAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./methodAnnotations/index.html\">com.package1.methodAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleComments/index.html\">com.package1.moduleComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleExtend\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleExtend\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleExtend/index.html\">com.package1.moduleExtend</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleInfoAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleInfoAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleInfoAnnotation/index.html\">com.package1.moduleInfoAnnotation</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodCommentInheritance/index.html\">com.package1.moduleMethodCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodComments/index.html\">com.package1.moduleMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodModifiers/index.html\">com.package1.moduleMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeAnnotations/index.html\">com.package1.moduleMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeReferences/index.html\">com.package1.moduleMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyAnnotations/index.html\">com.package1.modulePropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyCommentInheritance/index.html\">com.package1.modulePropertyCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyComments/index.html\">com.package1.modulePropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyModifiers/index.html\">com.package1.modulePropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeAnnotations/index.html\">com.package1.modulePropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeReferences/index.html\">com.package1.modulePropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes1/index.html\">com.package1.moduleTypes1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes2/index.html\">com.package1.moduleTypes2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.nested.nested2.nestedModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.nested.nested2.nestedModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./nested/nested2/nestedModule/index.html\">com.package1.nested.nested2.nestedModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"referenceToExternalPackage\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#referenceToExternalPackage\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./ternalPackage/index.html\">referenceToExternalPackage</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.shared\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.shared\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./shared/index.html\">com.package1.shared</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases/index.html\">com.package1.typealiases</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases2/index.html\">com.package1.typealiases2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typeAliasInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typeAliasInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typeAliasInheritance/index.html\">com.package1.typeAliasInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unionTypes\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unionTypes\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unionTypes/index.html\">com.package1.unionTypes</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedClass/index.html\">com.package1.unlistedClass</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedMethod\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedMethod\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedMethod/index.html\">com.package1.unlistedMethod</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedProperty/index.html\">com.package1.unlistedProperty</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/methodAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>methodAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/methodAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/methodAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.methodAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.methodAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.methodAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/methodAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/methodAnnotations.pkl\">methodAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthod()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthod</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>mthod()</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthodWithExpandableComment()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthodWithExpandableComment()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthodWithExpandableComment</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#mthod()\"><code>mthod()</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#method()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleComments.pkl\">moduleComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleExtend/ExtendClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>ExtendClass (com.package1/moduleExtend:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-class-name=\"ExtendClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleExtend</a>\n      <h1 id=\"declaration-title\">ExtendClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ExtendClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleExtend/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleExtend (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleExtend<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleExtend</span> extends <a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleExtend.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleExtend.pkl\">moduleExtend.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../baseModule/BaseClass.html\" class=\"name-decl\">BaseClass</a><span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ExtendClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ExtendClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ExtendClass.html\" class=\"name-decl\">ExtendClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleInfoAnnotation/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleInfoAnnotation (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleInfoAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleInfoAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleInfoAnnotation</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleInfoAnnotation.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleInfoAnnotation.pkl\">moduleInfoAnnotation.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodCommentInheritance</span> extends <a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl\">moduleMethodCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.moduleMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodComments.pkl\">moduleMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodModifiers.pkl\">moduleMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl\">moduleMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/moduleMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeReferences.pkl\">moduleMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation1 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation1</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation.html\" class=\"name-ref\">UserDefinedAnnotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>UserDefinedAnnotation2 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation2</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation2.html\" class=\"name-ref\">UserDefinedAnnotation2</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyAnnotations.pkl\">modulePropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prperty\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>prperty</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prpertyWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prpertyWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prpertyWithExpandableComment</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#prperty\"><code>prperty</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation1.html\" class=\"name-decl\">UserDefinedAnnotation1</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation2.html\" class=\"name-decl\">UserDefinedAnnotation2</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyCommentInheritance</span> extends <a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl\">modulePropertyCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.modulePropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyComments.pkl\">modulePropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyModifiers.pkl\">modulePropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl\">modulePropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/modulePropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/modulePropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>modulePropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeReferences.pkl\">modulePropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleTypes1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleTypes1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes1.pkl\">moduleTypes1.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"n\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#n\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">n</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleTypes2/Foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Foo (com.package1/moduleTypes2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleTypes2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/moduleTypes2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>moduleTypes2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes2.pkl\">moduleTypes2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/nested/nested2/nestedModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.nested.nested2.nestedModule</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/nested/nested2/nestedModule/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>nestedModule (com.package1/nested/nested2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.nested.nested2.nestedModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.nested.nested2.nestedModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/nested/nested2/nestedModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/nested/nested2/nestedModule.pkl\">nestedModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\"},\"summary\":\"Docs for Package 1.\",\"deprecation\":\"com.package1 is deprecated\",\"sourceCode\":\"https://example.com/package1/\",\"sourceCodeUrlScheme\":\"https://example.com/package1%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"}},{\"ref\":{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\"},\"summary\":\"This is a module that has spaces in its name.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"BaseClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClss\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClssWithExpandableComment\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments4\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments5\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments6\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments7\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments8\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\"},\"summary\":\"Class inheritance involving abstract, open, and final classes.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass3\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass4\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\"},\"summary\":\"Class methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\"},\"summary\":\"Class methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\"},\"summary\":\"Class methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\"},\"summary\":\"Class methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ClassWithAnnotatedProperty\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\"},\"summary\":\"Class properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\"},\"summary\":\"Class properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\"},\"summary\":\"Class properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\"},\"summary\":\"Class properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Project\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\"},\"summary\":\"[external1], [external1.MyClass]\\n[shared], [shared.MyClass]\\n[age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\\n[docLinks], [docLinks.age], [docLinks.sing()],\\n[docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\\n[custom *link* text][docLinks.sing()]\\n[module], [module.age], [module.sing()],\\n[module.Person], [module.Person.name], [module.PersonList],\\n[custom *link* text][module.sing()]\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"PersonList\",\"isTypeAlias\":true},\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ExtendClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\"},\"summary\":\"Module methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\"},\"summary\":\"Module methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\"},\"summary\":\"Module methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\"},\"summary\":\"Module methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\"},\"summary\":\"Module properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\"},\"summary\":\"Module properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\"},\"summary\":\"Module properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\"},\"summary\":\"Module properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"baseModule/index.html\"},{\"name\":\"baseProperty\",\"kind\":5,\"url\":\"baseModule/index.html#baseProperty\",\"sig\":\": unknown\",\"parId\":1},{\"name\":\"baseMethod\",\"kind\":4,\"url\":\"baseModule/index.html#baseMethod()\",\"sig\":\"(): unknown\",\"parId\":1},{\"name\":\"BaseClass\",\"kind\":3,\"url\":\"baseModule/BaseClass.html\",\"parId\":1},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"classAnnotations/index.html\"},{\"name\":\"AnnotatedClss\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClss.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClssWithExpandableComment\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClssWithExpandableComment.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClass\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClass.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"classComments/index.html\"},{\"name\":\"Comments1\",\"kind\":3,\"url\":\"classComments/Comments1.html\",\"parId\":9},{\"name\":\"Comments2\",\"kind\":3,\"url\":\"classComments/Comments2.html\",\"parId\":9},{\"name\":\"Comments3\",\"kind\":3,\"url\":\"classComments/Comments3.html\",\"parId\":9},{\"name\":\"Comments4\",\"kind\":3,\"url\":\"classComments/Comments4.html\",\"parId\":9},{\"name\":\"Comments5\",\"kind\":3,\"url\":\"classComments/Comments5.html\",\"parId\":9},{\"name\":\"Comments6\",\"kind\":3,\"url\":\"classComments/Comments6.html\",\"parId\":9},{\"name\":\"Comments7\",\"kind\":3,\"url\":\"classComments/Comments7.html\",\"parId\":9},{\"name\":\"Comments8\",\"kind\":3,\"url\":\"classComments/Comments8.html\",\"parId\":9},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"classInheritance/index.html\"},{\"name\":\"MyClass1\",\"kind\":3,\"url\":\"classInheritance/MyClass1.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass1.html#property1\",\"sig\":\": Boolean\",\"parId\":19},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass1.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":19},{\"name\":\"MyClass2\",\"kind\":3,\"url\":\"classInheritance/MyClass2.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property1\",\"sig\":\": Boolean\",\"parId\":22},{\"name\":\"property2\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property2\",\"sig\":\": String\",\"parId\":22},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"method2\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method2()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"MyClass3\",\"kind\":3,\"url\":\"classInheritance/MyClass3.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass3.html#property1\",\"sig\":\": Boolean\",\"parId\":27},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass3.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":27},{\"name\":\"MyClass4\",\"kind\":3,\"url\":\"classInheritance/MyClass4.html\",\"parId\":18},{\"name\":\"property4\",\"kind\":5,\"url\":\"classInheritance/MyClass4.html#property4\",\"sig\":\": String\",\"parId\":30},{\"name\":\"method3\",\"kind\":4,\"url\":\"classInheritance/MyClass4.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":30},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"classMethodComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classMethodComments/Comments.html\",\"parId\":33},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method1()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method2()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method3()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method4()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method5()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method6()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method7()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"classMethodModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classMethodModifiers/Modifiers.html\",\"parId\":42},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodModifiers/Modifiers.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":43},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"classMethodTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html\",\"parId\":45},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method1()\",\"sig\":\"(): unknown\",\"parId\":46},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":46},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":46},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method4()\",\"sig\":\"(): String\",\"parId\":46},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":46},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":46},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":46},{\"name\":\"method8\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":46},{\"name\":\"method9\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":46},{\"name\":\"method10\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":46},{\"name\":\"method11\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":46},{\"name\":\"method12\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":46},{\"name\":\"method13\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":46},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"classMethodTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classMethodTypeReferences/MyClass.html\",\"parId\":60},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classMethodTypeReferences/TypeReferences.html\",\"parId\":60},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":62},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":62},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"classPropertyAnnotations/index.html\"},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":68},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":69},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":69},{\"name\":\"ClassWithAnnotatedProperty\",\"kind\":3,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html\",\"parId\":68},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":72},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"classPropertyComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classPropertyComments/Comments.html\",\"parId\":74},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property1\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property2\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property3\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property4\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property5\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property6\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property7\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"classPropertyModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classPropertyModifiers/Modifiers.html\",\"parId\":83},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property2\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property3\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property4\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"classPropertyTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html\",\"parId\":88},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property1\",\"sig\":\": unknown\",\"parId\":89},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property2\",\"sig\":\": Float\",\"parId\":89},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property3\",\"sig\":\": List<String>\",\"parId\":89},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property4\",\"sig\":\": Set<String>\",\"parId\":89},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":89},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property6\",\"sig\":\": String?\",\"parId\":89},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property7\",\"sig\":\": () -> String\",\"parId\":89},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property8\",\"sig\":\": String -> Int\",\"parId\":89},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":89},{\"name\":\"property10\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":89},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"classPropertyTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classPropertyTypeReferences/MyClass.html\",\"parId\":100},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classPropertyTypeReferences/TypeReferences.html\",\"parId\":100},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property1\",\"sig\":\": MyClass\",\"parId\":102},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":102},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":102},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":102},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property5\",\"sig\":\": MyClass?\",\"parId\":102},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":102},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":102},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":102},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":102},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"classTypeConstraints/index.html\"},{\"name\":\"emailAddress\",\"kind\":5,\"url\":\"classTypeConstraints/index.html#emailAddress\",\"sig\":\": unknown\",\"parId\":112},{\"name\":\"Person1\",\"kind\":3,\"url\":\"classTypeConstraints/Person1.html\",\"parId\":112},{\"name\":\"name\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#name\",\"sig\":\": String\",\"parId\":114},{\"name\":\"address\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#address\",\"sig\":\": Address\",\"parId\":114},{\"name\":\"Person2\",\"kind\":3,\"url\":\"classTypeConstraints/Person2.html\",\"parId\":112},{\"name\":\"email\",\"kind\":5,\"url\":\"classTypeConstraints/Person2.html#email\",\"sig\":\": String\",\"parId\":117},{\"name\":\"Address\",\"kind\":3,\"url\":\"classTypeConstraints/Address.html\",\"parId\":112},{\"name\":\"street\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#street\",\"sig\":\": String\",\"parId\":119},{\"name\":\"city\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#city\",\"sig\":\": String\",\"parId\":119},{\"name\":\"Project\",\"kind\":3,\"url\":\"classTypeConstraints/Project.html\",\"parId\":112},{\"name\":\"type\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#type\",\"sig\":\": String?\",\"parId\":122},{\"name\":\"contacts\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#contacts\",\"sig\":\": Map<String, String>\",\"parId\":122},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"docExampleSubject1/index.html\"},{\"name\":\"x\",\"kind\":5,\"url\":\"docExampleSubject1/index.html#x\",\"sig\":\": Int\",\"parId\":125},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"docExampleSubject2/index.html\"},{\"name\":\"y\",\"kind\":5,\"url\":\"docExampleSubject2/index.html#y\",\"sig\":\": Int\",\"parId\":127},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"docLinks/index.html\"},{\"name\":\"age\",\"kind\":5,\"url\":\"docLinks/index.html#age\",\"sig\":\": Int\",\"parId\":129},{\"name\":\"sing\",\"kind\":4,\"url\":\"docLinks/index.html#sing()\",\"sig\":\"(song): unknown\",\"parId\":129},{\"name\":\"Person\",\"kind\":3,\"url\":\"docLinks/Person.html\",\"parId\":129},{\"name\":\"name\",\"kind\":5,\"url\":\"docLinks/Person.html#name\",\"sig\":\": String\",\"parId\":132},{\"name\":\"call\",\"kind\":4,\"url\":\"docLinks/Person.html#call()\",\"sig\":\"(number): unknown\",\"parId\":132},{\"name\":\"PersonList\",\"kind\":2,\"url\":\"docLinks/index.html#PersonList\",\"parId\":129},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"methodAnnotations/index.html\"},{\"name\":\"mthod\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthod()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"mthodWithExpandableComment\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthodWithExpandableComment()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"method\",\"kind\":4,\"url\":\"methodAnnotations/index.html#method()\",\"sig\":\"(): Int\",\"parId\":136,\"aka\":[\"function\"]},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"moduleExtend/index.html\"},{\"name\":\"extendProperty\",\"kind\":5,\"url\":\"moduleExtend/index.html#extendProperty\",\"sig\":\": unknown\",\"parId\":141},{\"name\":\"extendMethod\",\"kind\":4,\"url\":\"moduleExtend/index.html#extendMethod()\",\"sig\":\"(): unknown\",\"parId\":141},{\"name\":\"ExtendClass\",\"kind\":3,\"url\":\"moduleExtend/ExtendClass.html\",\"parId\":141},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"moduleMethodCommentInheritance/index.html\"},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodCommentInheritance/index.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":146},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"moduleMethodComments/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method1()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method2()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method3()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method4()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method5()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method6()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method7()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"moduleMethodModifiers/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodModifiers/index.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":156},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"moduleMethodTypeAnnotations/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method1()\",\"sig\":\"(): unknown\",\"parId\":158},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":158},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":158},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method4()\",\"sig\":\"(): String\",\"parId\":158},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":158},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":158},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":158},{\"name\":\"method8\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":158},{\"name\":\"method9\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":158},{\"name\":\"method10\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":158},{\"name\":\"method11\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":158},{\"name\":\"method12\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":158},{\"name\":\"method13\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":158},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"moduleMethodTypeReferences/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":172},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":172},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"moduleMethodTypeReferences/MyClass.html\",\"parId\":172},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"modulePropertyAnnotations/index.html\"},{\"name\":\"prperty\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prperty\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"prpertyWithExpandableComment\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prpertyWithExpandableComment\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"property\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#property\",\"sig\":\": unknown\",\"parId\":179,\"aka\":[\"field\",\"item\"]},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation1\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation1\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation2\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation2\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":179},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":186},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":186},{\"name\":\"UserDefinedAnnotation1\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html#nested\",\"sig\":\": UserDefinedAnnotation\",\"parId\":189},{\"name\":\"UserDefinedAnnotation2\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html#nested\",\"sig\":\": UserDefinedAnnotation2?\",\"parId\":191},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"modulePropertyCommentInheritance/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyCommentInheritance/index.html#property3\",\"sig\":\": Float\",\"parId\":193},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"modulePropertyComments/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property1\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property2\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property3\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property4\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property5\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property6\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property7\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property8\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property9\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property10\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"modulePropertyModifiers/index.html\"},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyModifiers/index.html#property2\",\"sig\":\": Float\",\"parId\":206},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"modulePropertyTypeAnnotations/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property1\",\"sig\":\": unknown\",\"parId\":208},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property2\",\"sig\":\": Float\",\"parId\":208},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property3\",\"sig\":\": List<String>\",\"parId\":208},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property4\",\"sig\":\": Set<String>\",\"parId\":208},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":208},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property6\",\"sig\":\": String?\",\"parId\":208},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property7\",\"sig\":\": () -> String\",\"parId\":208},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property8\",\"sig\":\": String -> Int\",\"parId\":208},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":208},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":208},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"modulePropertyTypeReferences/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property1\",\"sig\":\": MyClass\",\"parId\":219},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":219},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":219},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":219},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property5\",\"sig\":\": MyClass?\",\"parId\":219},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":219},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":219},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":219},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":219},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"modulePropertyTypeReferences/MyClass.html\",\"parId\":219},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"moduleTypes1/index.html\"},{\"name\":\"n\",\"kind\":5,\"url\":\"moduleTypes1/index.html#n\",\"sig\":\": Int\",\"parId\":230},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"moduleTypes2/index.html\"},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":232},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":232},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":232},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":232},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":232},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x6\",\"sig\":\": module\",\"parId\":232},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x7\",\"sig\":\": List<module>\",\"parId\":232},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x8\",\"sig\":\": String|module|Int\",\"parId\":232},{\"name\":\"Foo\",\"kind\":3,\"url\":\"moduleTypes2/Foo.html\",\"parId\":232},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":241},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":241},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":241},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":241},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":241},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x6\",\"sig\":\": module\",\"parId\":241},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x7\",\"sig\":\": List<module>\",\"parId\":241},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x8\",\"sig\":\": String|module|Int\",\"parId\":241},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"nested/nested2/nestedModule/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"nested/nested2/nestedModule/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":250},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"nested/nested2/nestedModule/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":250},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"nested/nested2/nestedModule/MyClass.html\",\"parId\":250},{\"name\":\"referenceToExternalPackage\",\"kind\":1,\"url\":\"ternalPackage/index.html\"},{\"name\":\"prop\",\"kind\":5,\"url\":\"ternalPackage/index.html#prop\",\"sig\":\": Class Two {}\",\"parId\":254},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"shared/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"shared/MyClass.html\",\"parId\":256},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"typealiases/index.html\"},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/index.html#uint\",\"sig\":\": UInt\",\"parId\":258},{\"name\":\"uints\",\"kind\":5,\"url\":\"typealiases/index.html#uints\",\"sig\":\": List<UInt>\",\"parId\":258},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/index.html#email\",\"sig\":\": Email\",\"parId\":258},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/index.html#emails\",\"sig\":\": List<Email>\",\"parId\":258},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/index.html#send()\",\"sig\":\"(email): Email\",\"parId\":258},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases/Person.html\",\"parId\":258},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/Person.html#uint\",\"sig\":\": UInt\",\"parId\":264},{\"name\":\"list\",\"kind\":5,\"url\":\"typealiases/Person.html#list\",\"sig\":\": List<UInt>\",\"parId\":264},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/Person.html#email\",\"sig\":\": Email\",\"parId\":264},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/Person.html#emails\",\"sig\":\": List<Email>\",\"parId\":264},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/Person.html#send()\",\"sig\":\"(email): Email\",\"parId\":264},{\"name\":\"Email\",\"kind\":2,\"url\":\"typealiases/index.html#Email\",\"parId\":258,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"typealiases2/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/index.html#res1\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/index.html#res2\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/index.html#res3\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/index.html#res4\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/index.html#res5\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/index.html#res6\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/index.html#res7\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/index.html#res8\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/index.html#res9\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases2/Person.html\",\"parId\":271},{\"name\":\"name\",\"kind\":5,\"url\":\"typealiases2/Person.html#name\",\"sig\":\": String\",\"parId\":281},{\"name\":\"Foo\",\"kind\":3,\"url\":\"typealiases2/Foo.html\",\"parId\":271},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res1\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res2\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res3\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res4\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res5\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res6\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res7\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res8\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res9\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"List2\",\"kind\":2,\"url\":\"typealiases2/index.html#List2\",\"parId\":271},{\"name\":\"Map2\",\"kind\":2,\"url\":\"typealiases2/index.html#Map2\",\"parId\":271},{\"name\":\"StringMap\",\"kind\":2,\"url\":\"typealiases2/index.html#StringMap\",\"parId\":271},{\"name\":\"MMap\",\"kind\":2,\"url\":\"typealiases2/index.html#MMap\",\"parId\":271},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"typeAliasInheritance/index.html\"},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#email2\",\"sig\":\": Email\",\"parId\":297},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#emails2\",\"sig\":\": List<Email>\",\"parId\":297},{\"name\":\"Person2\",\"kind\":3,\"url\":\"typeAliasInheritance/Person2.html\",\"parId\":297},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#email2\",\"sig\":\": Email\",\"parId\":300},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#emails2\",\"sig\":\": List<Email>\",\"parId\":300},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"unionTypes/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"unionTypes/index.html#res1\",\"sig\":\": Boolean|Number\",\"parId\":303},{\"name\":\"res2\",\"kind\":5,\"url\":\"unionTypes/index.html#res2\",\"sig\":\": \\\\\\\"foo\\\\\\\"|\\\\\\\"bar\\\\\\\"|\\\\\\\"baz\\\\\\\"\",\"parId\":303},{\"name\":\"res3\",\"kind\":5,\"url\":\"unionTypes/index.html#res3\",\"sig\":\": Boolean|List<String>\",\"parId\":303},{\"name\":\"res4\",\"kind\":5,\"url\":\"unionTypes/index.html#res4\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res5\",\"kind\":5,\"url\":\"unionTypes/index.html#res5\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res6\",\"kind\":5,\"url\":\"unionTypes/index.html#res6\",\"sig\":\": Boolean|List<String>?|Number\",\"parId\":303},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"unlistedClass/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedClass/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":310},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedClass/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":310},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"unlistedMethod/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedMethod/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":313},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedMethod/MyClass.html\",\"parId\":313},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"unlistedProperty/index.html\"},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedProperty/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":316},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedProperty/MyClass.html\",\"parId\":316}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/shared/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/shared:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.shared</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/shared/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>shared (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.shared<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.shared</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/shared.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/shared.pkl\">shared.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/shared.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/ternalPackage/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>referenceToExternalPackage (com.package1xternalPackage:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/ternalPackage/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/ternalPackage/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"referenceToExternalPackage\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">referenceToExternalPackage<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">referenceToExternalPackage</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/ternalPackage.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/ternalPackage.pkl\">ternalPackage.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"../../../com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.html\" class=\"name-ref\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/package1/ternalPackage.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\">Module3.<code>property {} four</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typeAliasInheritance/Person2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person2 (com.package1/typeAliasInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typeAliasInheritance</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typeAliasInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>typeAliasInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typeAliasInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typeAliasInheritance</span> extends <a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typeAliasInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typeAliasInheritance.pkl\">typeAliasInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/Person.html\" class=\"name-decl\">Person</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typealiases/Person.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person (com.package1/typealiases:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typealiases/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>typealiases (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.typealiases</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases.pkl\">typealiases.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typealiases2/Foo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Foo (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typealiases2/Person.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Person (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/typealiases2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>typealiases2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typealiases2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases2.pkl\">typealiases2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"List2\" class=\"anchor\"> </div>\n            <div id=\"List2.E\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#List2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#List2\" class=\"name-decl\">List2</a>&lt;<a class=\"param1\">E</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<span class=\"name-ref\">E</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Map2\" class=\"anchor\"> </div>\n            <div id=\"Map2.V\" class=\"anchor-param1\"> </div>\n            <div id=\"Map2.K\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#Map2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Map2\" class=\"name-decl\">Map2</a>&lt;<a class=\"param1\">V</a>, <a class=\"param2\">K</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">K</span>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"StringMap\" class=\"anchor\"> </div>\n            <div id=\"StringMap.V\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#StringMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#StringMap\" class=\"name-decl\">StringMap</a>&lt;<a class=\"param1\">V</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MMap\" class=\"anchor\"> </div>\n            <div id=\"MMap.X\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#MMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#MMap\" class=\"name-decl\">MMap</a>&lt;<a class=\"param1\">X</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">X</span>, <span class=\"name-ref\">X</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/unionTypes/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unionTypes (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unionTypes/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unionTypes/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unionTypes\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unionTypes<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unionTypes</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unionTypes.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unionTypes.pkl\">unionTypes.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: &quot;foo&quot;|&quot;bar&quot;|&quot;baz&quot;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/unlistedClass/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unlistedClass (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedClass/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedClass/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedClass.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedClass.pkl\">unlistedClass.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/unlistedMethod/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/unlistedMethod:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedMethod</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/unlistedMethod/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unlistedMethod (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedMethod<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedMethod</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedMethod.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedMethod.pkl\">unlistedMethod.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/unlistedProperty/MyClass.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>MyClass (com.package1/unlistedProperty:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedProperty</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package1/1.2.3/unlistedProperty/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>unlistedProperty (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedProperty.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedProperty.pkl\">unlistedProperty.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package2/4.5.6/Module3/Class Two {}.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Class Two {} (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class Two {}\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">`Class Two {}`<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">`Class Two {}`</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package2/4.5.6/Module3/Class3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Class3 (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">Class3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Class3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package2/4.5.6/Module3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Module3 (com.package2:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a>\n      <h1 id=\"declaration-title\">com.package2.Module3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package2.Module3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">modulepath:/com/package2/Module3.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/blob/4.5.6/Module3.pkl\">Module3.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\"><code>property {} &lt;&gt; four</code></a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property%20%7B%7D%20%3C%3E%20four\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property%20%7B%7D%20%3C%3E%20four\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">`property {} &lt;&gt; four`</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Class3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class3.html\" class=\"name-decl\">Class3</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Class%20Two%20%7B%7D\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class%20Two%20%7B%7D\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class%20Two%20%7B%7D.html\" class=\"name-decl\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package2/4.5.6/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>com.package2 (4.5.6) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package2/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package2/4.5.6/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package2<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package2</span></div>\n        <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Authors:</dt>\n          <dd>package2-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>4.5.6</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://sources.apple.com/package2/\">https://sources.apple.com/package2/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package2/\">https://issues.apple.com/package2/</a></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package2.Module3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2.Module3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module3/index.html\">com.package2.Module3</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package2/4.5.6/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"},\"summary\":\"Docs for Package 2.\",\"sourceCode\":\"https://sources.apple.com/package2/\",\"sourceCodeUrlScheme\":\"https://example.com/blob/4.5.6%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/com.package2/4.5.6/search-index.js",
    "content": "searchData='[{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"Module3/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/index.html#property3\",\"sig\":\": String\",\"parId\":0},{\"name\":\"property {} <> four\",\"kind\":5,\"url\":\"Module3/index.html#property {} <> four\",\"sig\":\": String\",\"parId\":0},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/index.html#function3()\",\"sig\":\"(n): String\",\"parId\":0},{\"name\":\"Class3\",\"kind\":3,\"url\":\"Module3/Class3.html\",\"parId\":0},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/Class3.html#property3\",\"sig\":\": String\",\"parId\":4},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/Class3.html#function3()\",\"sig\":\"(n): String\",\"parId\":4},{\"name\":\"Class Two {}\",\"kind\":3,\"url\":\"Module3/Class Two {}.html\",\"parId\":0},{\"name\":\"prop\",\"kind\":5,\"url\":\"Module3/Class Two {}.html#prop\",\"sig\":\": String\",\"parId\":7}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/Module Containing Spaces/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/baseModule/BaseClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/baseModule/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"moduleExtend\",\n      \"href\": \"../moduleExtend/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments4.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments5.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments6.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments7.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/Comments8.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classInheritance/MyClass1.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"MyClass2\",\n      \"href\": \"MyClass2.html\"\n    },\n    {\n      \"text\": \"MyClass3\",\n      \"href\": \"MyClass3.html\"\n    },\n    {\n      \"text\": \"MyClass4\",\n      \"href\": \"MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classInheritance/MyClass2.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"MyClass3\",\n      \"href\": \"MyClass3.html\"\n    },\n    {\n      \"text\": \"MyClass4\",\n      \"href\": \"MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classInheritance/MyClass3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classInheritance/MyClass4.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodComments/Comments.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodModifiers/Modifiers.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classMethodTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyComments/Comments.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classPropertyTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classTypeConstraints/Address.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Person1\",\n      \"href\": \"Person1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classTypeConstraints/Person1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classTypeConstraints/Person2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classTypeConstraints/Project.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/classTypeConstraints/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/docExampleSubject1/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/docExampleSubject2/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/docLinks/Person.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/docLinks/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/methodAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleExtend/ExtendClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleExtend/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleInfoAnnotation/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleMethodComments/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"moduleMethodCommentInheritance\",\n      \"href\": \"../moduleMethodCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleMethodModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"moduleMethodTypeReferences\",\n      \"href\": \"index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleMethodTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"UserDefinedAnnotation1\",\n      \"href\": \"UserDefinedAnnotation1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyComments/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"modulePropertyCommentInheritance\",\n      \"href\": \"../modulePropertyCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"modulePropertyTypeReferences\",\n      \"href\": \"index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/modulePropertyTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleTypes1/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Foo\",\n      \"href\": \"../moduleTypes2/Foo.html\"\n    },\n    {\n      \"text\": \"moduleTypes2\",\n      \"href\": \"../moduleTypes2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleTypes2/Foo.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/moduleTypes2/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Foo\",\n      \"href\": \"Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/nested/nested2/nestedModule/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/shared/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"../classMethodTypeReferences/TypeReferences.html\"\n    },\n    {\n      \"text\": \"moduleMethodTypeReferences\",\n      \"href\": \"../moduleMethodTypeReferences/index.html\"\n    },\n    {\n      \"text\": \"modulePropertyTypeReferences\",\n      \"href\": \"../modulePropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/shared/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/ternalPackage/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typeAliasInheritance/Person2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typeAliasInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typealiases/Person.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"Person2\",\n      \"href\": \"../typeAliasInheritance/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typealiases/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"typeAliasInheritance\",\n      \"href\": \"../typeAliasInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typealiases2/Foo.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typealiases2/Person.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/typealiases2/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/unionTypes/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/unlistedClass/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/unlistedMethod/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/unlistedMethod/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/unlistedProperty/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/1.2.3/unlistedProperty/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/Module Containing Spaces/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/Module Containing Spaces/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/baseModule/BaseClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/baseModule/BaseClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/baseModule/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/baseModule/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classAnnotations/AnnotatedClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classAnnotations/AnnotatedClss.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClss.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments4.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments5.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments5.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments6.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments6.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments7.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments7.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/Comments8.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments8.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classInheritance/MyClass1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classInheritance/MyClass2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classInheritance/MyClass3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classInheritance/MyClass4.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodComments/Comments.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodComments/Comments.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodModifiers/Modifiers.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodModifiers/Modifiers.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeAnnotations/TypeAnnotations.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodTypeReferences/TypeReferences.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classMethodTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyComments/Comments.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyComments/Comments.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyModifiers/Modifiers.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyModifiers/Modifiers.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyTypeReferences/TypeReferences.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classPropertyTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classTypeConstraints/Address.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Address.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classTypeConstraints/Person1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Person1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classTypeConstraints/Person2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classTypeConstraints/Project.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Project.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/classTypeConstraints/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/docExampleSubject1/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docExampleSubject1/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/docExampleSubject2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docExampleSubject2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/docLinks/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docLinks/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/docLinks/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docLinks/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../1.2.3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/methodAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/methodAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleExtend/ExtendClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleExtend/ExtendClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleExtend/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleExtend/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleInfoAnnotation/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleInfoAnnotation/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleMethodCommentInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleMethodComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleMethodModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleMethodTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleMethodTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyCommentInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/modulePropertyTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleTypes1/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes1/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleTypes2/Foo.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes2/Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/moduleTypes2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/nested/nested2/nestedModule/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../../../1.2.3/nested/nested2/nestedModule/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/nested/nested2/nestedModule/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../../../1.2.3/nested/nested2/nestedModule/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/shared/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/shared/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/shared/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/shared/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/ternalPackage/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/ternalPackage/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typeAliasInheritance/Person2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typeAliasInheritance/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typeAliasInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typeAliasInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typealiases/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typealiases/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typealiases2/Foo.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typealiases2/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/typealiases2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/unionTypes/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unionTypes/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/unlistedClass/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedClass/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/unlistedMethod/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedMethod/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/unlistedMethod/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedMethod/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/unlistedProperty/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedProperty/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package1/_/unlistedProperty/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedProperty/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/4.5.6/Module3/Class Two {}.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/4.5.6/Module3/Class3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/4.5.6/Module3/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/4.5.6/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"com.package1\",\n      \"href\": \"../../com.package1/1.2.3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/_/Module3/Class Two {}.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/Class Two {}.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/_/Module3/Class3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/Class3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/_/Module3/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/com.package2/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../4.5.6/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.5.0/Bird/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.5.0/allFruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.5.0/catalog/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.5.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.6.0/Bird/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.6.0/allFruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.6.0/catalog/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.6.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.7.0/Bird/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.7.0/allFruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.7.0/catalog/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/0.7.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/_/Bird/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.7.0\",\n      \"href\": \"../../0.7.0/Bird/index.html\"\n    },\n    {\n      \"text\": \"0.6.0\",\n      \"href\": \"../../0.6.0/Bird/index.html\"\n    },\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/Bird/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/_/allFruit/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.7.0\",\n      \"href\": \"../../0.7.0/allFruit/index.html\"\n    },\n    {\n      \"text\": \"0.6.0\",\n      \"href\": \"../../0.6.0/allFruit/index.html\"\n    },\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/allFruit/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/_/catalog/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.7.0\",\n      \"href\": \"../../0.7.0/catalog/index.html\"\n    },\n    {\n      \"text\": \"0.6.0\",\n      \"href\": \"../../0.6.0/catalog/index.html\"\n    },\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/catalog/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/birds/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.7.0\",\n      \"href\": \"../0.7.0/index.html\"\n    },\n    {\n      \"text\": \"0.6.0\",\n      \"href\": \"../0.6.0/index.html\"\n    },\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../0.5.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/deprecated/1.0.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/deprecated/_/deprecated/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.0.0\",\n      \"href\": \"../../1.0.0/deprecated/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/deprecated/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.0.0\",\n      \"href\": \"../1.0.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/fruit/1.1.0/Fruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/fruit/1.1.0/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"localhost:0/birds\",\n      \"href\": \"../../birds/0.7.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/fruit/_/Fruit/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.1.0\",\n      \"href\": \"../../1.1.0/Fruit/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/data/localhost(3a)0/fruit/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.1.0\",\n      \"href\": \"../1.1.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Docsite Title</title>\n    <script src=\"scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search\" autocomplete=\"off\" data-root-url-prefix=\"\"></div>\n    </header>\n    <main>\n      <h1 id=\"declaration-title\">Docsite Title</h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_packages\">Packages</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"doc-comment\"><p>Let the games begin.</p></div>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Great Library</h2>\n<p>Just follow these simple steps. You'll love it.</p>\n<ol>\n<li>Install it</li>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n<li>Install it</li>\n</ol>\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n<ol>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\nname = &quot;Pigeon&quot;\nage = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\nname: String\nage: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up</li>\n<li>just don't</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<ul>\n<li><a href=\"not_found\"><code>docLinks</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.age</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.sing()</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person.name</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.PersonList</code></a></li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_packages\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Packages</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./com.package1/current/index.html\">com.package1</a></div>\n                <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./com.package2/current/index.html\">com.package2</a></div>\n                <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fbirds\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fbirds\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/birds/current/index.html\">localhost:0/birds</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fdeprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fdeprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./localhost(3a)0/deprecated/current/index.html\">localhost:0/deprecated</a></div>\n                <div class=\"doc-comment\">Deprecated: don't use</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Ffruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Ffruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/fruit/current/index.html\">localhost:0/fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.5.0/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Bird (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/Bird/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/Bird/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"../../../../fruit/1.0.5/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.5.0/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>allFruit (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/allFruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/allFruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.5.0/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>catalog (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/catalog/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/catalog/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.5.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/birds (0.5.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/birds/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/birds/0.5.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.5.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.0.5/index.html\">fruit:1.0.5</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.5.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.5.0/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.6.0/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Bird (localhost:0/birds:0.6.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/Bird/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.6.0/Bird/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.6.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.6.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.6.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.6.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.6.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.6.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"https://example.com/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.6.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.6.0/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>allFruit (localhost:0/birds:0.6.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/allFruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.6.0/allFruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.6.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.6.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.6.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.6.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.6.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.6.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.6.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.6.0/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>catalog (localhost:0/birds:0.6.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/catalog/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.6.0/catalog/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.6.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.6.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.6.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.6.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.6.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.6.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.6.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.6.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/birds (0.6.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/birds/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/birds/0.6.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.6.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.6.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.6.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.6.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.6.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.1.0/index.html\">fruit:1.1.0</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>d18c8c248a64adf4ca77631b713e6a77782b62bc8faf02aa44558676de7c8149</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.6.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.6.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.6.0\",\"version\":\"0.6.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.6.0/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.7.0/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Bird (localhost:0/birds:0.7.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/Bird/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.7.0/Bird/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.7.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.7.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.7.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.7.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.7.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.7.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"https://example.com/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.7.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.7.0/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>allFruit (localhost:0/birds:0.7.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/allFruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.7.0/allFruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.7.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.7.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.7.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.7.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.7.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.7.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.7.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.7.0/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>catalog (localhost:0/birds:0.7.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/catalog/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.7.0/catalog/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.7.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.7.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.7.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.7.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.7.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.7.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.7.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.7.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/birds (0.7.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/birds/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/birds/0.7.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.7.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.7.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.7.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.7.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.7.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.1.0/index.html\">fruit:1.1.0</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>bf920484106d197c27c558efc75c67db3da33ccb06d7141605dcfc73c2789ec4</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.7.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.7.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.7.0\",\"version\":\"0.7.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/birds/0.7.0/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/deprecated/1.0.0/deprecated/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>deprecated (localhost:0/deprecated:1.0.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/deprecated/_/deprecated/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"../\" data-module-name=\"deprecated.deprecated\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/deprecated</a>\n      <h1 id=\"declaration-title\">deprecated.deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">deprecated.deprecated</span></div>\n        <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0#/deprecated.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"foo\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">foo</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\">Deprecated. Replace with: <code>bar</code></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Old foo</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"bar\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#bar\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">bar</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\"><p>New bar</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/deprecated/1.0.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/deprecated (1.0.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/deprecated/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/deprecated/1.0.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/deprecated</span></div>\n        <div class=\"doc-comment\">Deprecated: don't use</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>deprecated@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.0.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/deprecated\">https://example.com/deprecated</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/deprecated/issues\">https://example.com/deprecated/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>7589f1b802d6b5b93c468fb6399d2235d44d83f27409da2b036455ccb6e07ce5</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"deprecated.deprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#deprecated.deprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./deprecated/index.html\">deprecated.deprecated</a></div>\n                <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/deprecated/1.0.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\"},\"deprecation\":\"don't use\",\"sourceCode\":\"https://example.com/deprecated\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\"},\"summary\":\"A module from a deprecated package\",\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/deprecated/1.0.0/search-index.js",
    "content": "searchData='[{\"name\":\"deprecated.deprecated\",\"kind\":1,\"url\":\"deprecated/index.html\"},{\"name\":\"foo\",\"kind\":5,\"url\":\"deprecated/index.html#foo\",\"sig\":\": Int\",\"parId\":0,\"deprecated\":true},{\"name\":\"bar\",\"kind\":5,\"url\":\"deprecated/index.html#bar\",\"sig\":\": Int\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/fruit/1.1.0/Fruit/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Fruit (localhost:0/fruit:1.1.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/fruit/_/Fruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/fruit/1.1.0/Fruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"../\" data-module-name=\"fruit.Fruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/fruit</a>\n      <h1 id=\"declaration-title\">fruit.Fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">fruit.Fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0#/Fruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes in package:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages in package:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the\ncommand line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's\n<code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path\n<code>/dir1/dir2/dir3/mod2.pkl</code>, then <code>mod1.relativePathTo(mod2)</code> will return\n<code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a\nhierarchy (say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the\n<code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/fruit/1.1.0/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>localhost:0/fruit (1.1.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/fruit/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/fruit/1.1.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n            </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><label for=\"search-input\"><i id=\"search-icon\" class=\"material-icons\">search</i></label><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>apple-1@example.com, banana-2@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.1.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/fruit\">https://example.com/fruit</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/fruit/issues\">https://example.com/fruit/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"fruit.Fruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#fruit.Fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Fruit/index.html\">fruit.Fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/fruit/1.1.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"},\"sourceCode\":\"https://example.com/fruit\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/localhost(3a)0/fruit/1.1.0/search-index.js",
    "content": "searchData='[{\"name\":\"fruit.Fruit\",\"kind\":1,\"url\":\"Fruit/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Fruit/index.html#name\",\"sig\":\": String\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/scripts/pkldoc.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// Whether the current browser is WebKit.\nlet isWebKitBrowser;\n\n// The lazily initialized worker for running searches, if any.\nlet searchWorker = null;\n\n// Tells whether non-worker search is ready for use.\n// Only relevant if we determined that we can't use a worker.\nlet nonWorkerSearchInitialized = false;\n\n// The search div containing search input and search results.\nlet searchElement;\n\n// The search input element.\nlet searchInput;\n\n// The package name associated with the current page, if any.\nlet packageName;\n\nlet packageVersion;\n\n// The module name associated with the current page, if any.\nlet moduleName;\n\n// The class name associated with the current page, if any.\nlet className;\n\n// Prefix to turn a site-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet rootUrlPrefix;\n\n// Prefix to turn a package-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet packageUrlPrefix;\n\n// The search result currently selected in the search results list.\nlet selectedSearchResult = null;\n\n// Initializes the UI.\n// Wrapped in a function to avoid execution in tests.\n// noinspection JSUnusedGlobalSymbols\nfunction onLoad() {\n  isWebKitBrowser = navigator.userAgent.indexOf('AppleWebKit') !== -1;\n  searchElement = document.getElementById('search');\n  searchInput = document.getElementById('search-input');\n  packageName = searchInput.dataset.packageName || null;\n  packageVersion = searchInput.dataset.packageVersion || null;\n  moduleName = searchInput.dataset.moduleName || null;\n  className = searchInput.dataset.className || null;\n  rootUrlPrefix = searchInput.dataset.rootUrlPrefix;\n  packageUrlPrefix = searchInput.dataset.packageUrlPrefix;\n\n  initExpandTargetMemberDocs();\n  initNavigateToMemberPage();\n  initToggleMemberDocs();\n  initToggleInheritedMembers();\n  initCopyModuleUriToClipboard();\n  initSearchUi();\n}\n\n// If page URL contains a fragment, expand the target member's docs.\n// Handled in JS rather than CSS so that target member can still be manually collapsed.\nfunction initExpandTargetMemberDocs() {\n  const expandTargetDocs = () => {\n    const hash = window.location.hash;\n    if (hash.length === 0) return;\n    \n    const target = document.getElementById(hash.substring(1));\n    if (!target) return;\n\n    const member = target.nextElementSibling;\n    if (!member || !member.classList.contains('with-expandable-docs')) return;\n\n    expandMemberDocs(member);\n  }\n  \n  window.addEventListener('hashchange', expandTargetDocs);\n  expandTargetDocs();\n}\n\n// For members that have their own page, navigate to that page when the member's box is clicked.\nfunction initNavigateToMemberPage() {\n  const elements = document.getElementsByClassName('with-page-link');\n  for (const element of elements) {\n    const memberLink = element.getElementsByClassName('name-decl')[0];\n    // check if this is actually a link\n    // (it isn't if the generator couldn't resolve the link target)\n    if (memberLink.tagName === 'A') {\n      element.addEventListener('click', (e) => {\n        // don't act if user clicked a link\n        if (e.target !== null && e.target.closest('a') !== null) return;\n\n        // don't act if user clicked to select some text\n        if (window.getSelection().toString()) return;\n\n        memberLink.click();\n      });\n    }\n  }\n}\n\n// Expands and collapses member docs.\nfunction initToggleMemberDocs() {\n  const elements = document.getElementsByClassName('with-expandable-docs');\n  for (const element of elements) {\n    element.addEventListener('click', (e) => {\n      // don't act if user clicked a link\n      if (e.target !== null && e.target.closest('a') !== null) return;\n\n      // don't act if user clicked to select some text\n      if (window.getSelection().toString()) return;\n\n      toggleMemberDocs(element);\n    });\n  }\n}\n\n// Shows and hides inherited members.\nfunction initToggleInheritedMembers() {\n  const memberGroups = document.getElementsByClassName('member-group');\n  for (const group of memberGroups) {\n    const button = group.getElementsByClassName('toggle-inherited-members-link')[0];\n    if (button !== undefined) {\n      const members = group.getElementsByClassName('inherited');\n      button.addEventListener('click', () => toggleInheritedMembers(button, members));\n    }\n  }\n}\n\n// Copies the module URI optionally displayed on a module page to the clipboard.\nfunction initCopyModuleUriToClipboard() {\n  const copyUriButtons = document.getElementsByClassName('copy-uri-button');\n\n  for (const button of copyUriButtons) {\n    const moduleUri = button.previousElementSibling;\n\n    button.addEventListener('click', e => {\n      e.stopPropagation();\n      const range = document.createRange();\n      range.selectNodeContents(moduleUri);\n      const selection = getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      try {\n        document.execCommand('copy');\n      } catch (e) {\n      } finally {\n        selection.removeAllRanges();\n      }\n    });\n  }\n}\n\n// Expands or collapses member docs.\nfunction toggleMemberDocs(memberElem) {\n  const comments = memberElem.getElementsByClassName('expandable');\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n\n  if (isCollapsed) {\n    for (const comment of comments) expandElement(comment);\n    icon.textContent = 'expand_less';\n  } else {\n    for (const comment of comments) collapseElement(comment);\n    icon.textContent = 'expand_more';\n  }\n}\n\n// Expands member docs unless they are already expanded.\nfunction expandMemberDocs(memberElem) {\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n  \n  if (!isCollapsed) return;\n  \n  const comments = memberElem.getElementsByClassName('expandable');\n  for (const comment of comments) expandElement(comment);\n  icon.textContent = 'expand_less';\n}\n\n// Shows and hides inherited members.\nfunction toggleInheritedMembers(button, members) {\n  const isCollapsed = button.textContent === 'show inherited';\n\n  if (isCollapsed) {\n    for (const member of members) expandElement(member);\n    button.textContent = 'hide inherited';\n  } else {\n    for (const member of members) collapseElement(member);\n    button.textContent = 'show inherited'\n  }\n}\n\n// Expands an element.\n// Done in two steps to make transition work (can't transition from 'hidden').\n// For some reason (likely related to removing 'hidden') the transition isn't animated in FF.\n// When using timeout() instead of requestAnimationFrame()\n// there is *some* animation in FF but still doesn't look right.\nfunction expandElement(element) {\n  element.classList.remove('hidden');\n\n  requestAnimationFrame(() => {\n    element.classList.remove('collapsed');\n  });\n}\n\n// Collapses an element.\n// Done in two steps to make transition work (can't transition to 'hidden').\nfunction collapseElement(element) {\n  element.classList.add('collapsed');\n\n  const listener = () => {\n    element.removeEventListener('transitionend', listener);\n    element.classList.add('hidden');\n  };\n  element.addEventListener('transitionend', listener);\n}\n\n// Initializes the search UI and sets up delayed initialization of the search engine.\nfunction initSearchUi() {\n  // initialize search engine the first time that search input receives focus\n  const onFocus = () => {\n    searchInput.removeEventListener('focus', onFocus);\n    initSearchWorker();\n  };\n  searchInput.addEventListener('focus', onFocus);\n\n  // clear search when search input loses focus,\n  // except if this happens due to a search result being clicked,\n  // in which case clearSearch() will be called by the link's click handler,\n  // and calling it here would prevent the click handler from firing\n  searchInput.addEventListener('focusout', () => {\n    if (document.querySelector('#search-results:hover') === null) clearSearch();\n  });\n\n  // trigger search when user hasn't typed in a while\n  let timeoutId = null;\n  // Using anything other than `overflow: visible` for `#search-results`\n  // slows down painting significantly in WebKit browsers (at least Safari/Mac).\n  // Compensate by using a higher search delay, which is less annoying than a blocking UI.\n  const delay = isWebKitBrowser ? 200 : 100;\n  searchInput.addEventListener('input', () => {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => triggerSearch(searchInput.value), delay);\n  });\n\n  // keyboard shortcut for entering search\n  document.addEventListener('keyup', e => {\n    // could additionally support '/' like GitHub and Gmail do,\n    // but this would require overriding the default behavior of '/' on Firefox\n    if (e.key === 's') searchInput.focus();\n  });\n\n  // keyboard navigation for search results\n  searchInput.addEventListener('keydown', e => {\n    const results = document.getElementById('search-results');\n    if (results !== null) {\n      if (e.key === 'ArrowDown') {\n        selectNextResult(results.firstElementChild);\n        e.preventDefault();\n      } else if (e.key === 'ArrowUp') {\n        selectPrevResult(results.firstElementChild);\n        e.preventDefault();\n      }\n    }\n  });\n  searchInput.addEventListener('keyup', e => {\n    if (e.key === 'Enter' && selectedSearchResult !== null) {\n      selectedSearchResult.firstElementChild.click();\n      clearSearch();\n    }\n  });\n}\n\n// Initializes the search worker.\nfunction initSearchWorker() {\n  const workerScriptUrl = rootUrlPrefix + 'scripts/search-worker.js';\n\n  try {\n    searchWorker = new Worker(workerScriptUrl, {name: packageName === null ? \"main\" : packageName + '/' + packageVersion});\n    searchWorker.addEventListener('message', e => handleSearchResults(e.data.query, e.data.results));\n  } catch (e) {\n    // could not initialize worker, presumably because we are a file:/// page and content security policy got in the way\n    // fall back to running searches synchronously without a worker\n    // this requires loading search related scripts that would otherwise be loaded by the worker\n\n    searchWorker = null;\n    let pendingScripts = 3;\n\n    const onScriptLoaded = () => {\n      if (--pendingScripts === 0) {\n        initSearchIndex();\n        nonWorkerSearchInitialized = true;\n        if (searchInput.focused) {\n          triggerSearch(searchInput.value);\n        }\n      }\n    };\n    \n    const script1 = document.createElement('script');\n    script1.src = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + 'search-index.js';\n    script1.async = true;\n    script1.onload = onScriptLoaded;\n    document.head.append(script1);\n\n    const script2 = document.createElement('script');\n    script2.src = rootUrlPrefix;\n    script2.async = true;\n    script2.onload = onScriptLoaded;\n    document.head.append(script2);\n\n    const script3 = document.createElement('script');\n    script3.src = workerScriptUrl;\n    script3.async = true;\n    script3.onload = onScriptLoaded;\n    document.head.append(script3);\n  }\n}\n\n// Updates search results unless they are stale.\nfunction handleSearchResults(query, results) {\n  if (query.inputValue !== searchInput.value) return;\n\n  updateSearchResults(renderSearchResults(query, results));\n}\n\n// TODO: Should this (or its callers) use requestAnimationFrame() ?\n// Removes any currently displayed search results, then displays the given results if non-null.\nfunction updateSearchResults(resultsDiv) {\n  selectedSearchResult = null;\n\n  const oldResultsDiv = document.getElementById('search-results');\n  if (oldResultsDiv !== null) {\n    searchElement.removeChild(oldResultsDiv);\n  }\n\n  if (resultsDiv != null) {\n    searchElement.append(resultsDiv);\n    selectNextResult(resultsDiv.firstElementChild);\n  }\n}\n\n// Returns the module of the given member, or `null` if the given member is a module.\nfunction getModule(member) {\n  switch (member.level) {\n    case 0:\n      return null;\n    case 1:\n      return member.parent;\n    case 2:\n      return member.parent.parent;\n  }\n}\n\n// Triggers a search unless search input is invalid or incomplete.\nfunction triggerSearch(inputValue) {\n  const query = parseSearchInput(inputValue);\n  if (!isActionableQuery(query)) {\n    handleSearchResults(query, null);\n    return;\n  }\n\n  if (searchWorker !== null) {\n    searchWorker.postMessage({query, packageName, moduleName, className});\n  } else if (nonWorkerSearchInitialized) {\n    const results = runSearch(query, packageName, moduleName, className);\n    handleSearchResults(query, results);\n  }\n}\n\n// Tells if the given Unicode character is a whitespace character.\nfunction isWhitespace(ch) {\n  const cp = ch.codePointAt(0);\n  if (cp >= 9 && cp <= 13 || cp === 32 || cp === 133 || cp === 160) return true;\n  if (cp < 5760) return false;\n  return cp === 5760 || cp >= 8192 && cp <= 8202\n      || cp === 8232 || cp === 8233 || cp === 8239 || cp === 8287 || cp === 12288;\n}\n\n// Trims the given Unicode characters.\nfunction trim(chars) {\n  const length = chars.length;\n  let startIdx, endIdx;\n\n  for (startIdx = 0; startIdx < length; startIdx += 1) {\n    if (!isWhitespace(chars[startIdx])) break;\n  }\n  for (endIdx = chars.length - 1; endIdx > startIdx; endIdx -= 1) {\n    if (!isWhitespace(chars[endIdx])) break;\n  }\n  return chars.slice(startIdx, endIdx + 1);\n}\n\n// Parses the user provided search input.\n// Preconditions:\n// inputValue !== ''\nfunction parseSearchInput(inputValue) {\n  const chars = trim(Array.from(inputValue));\n  const char0 = chars[0]; // may be undefined\n  const char1 = chars[1]; // may be undefined\n  const prefix = char1 === ':' ? char0 + char1 : null;\n  const kind =\n      prefix === null ? null :\n          char0 === 'm' ? 1 :\n              char0 === 't' ? 2 :\n                  char0 === 'c' ? 3 :\n                      char0 === 'f' ? 4 :\n                          char0 === 'p' ? 5 :\n                              undefined;\n  const unprefixedChars = kind !== null && kind !== undefined ?\n      trim(chars.slice(2, chars.length)) :\n      chars;\n  const normalizedCps = toNormalizedCodePoints(unprefixedChars);\n  return {inputValue, prefix, kind, normalizedCps};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\n// Note: Keep in sync with same function in search-worker.js.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Tells if the given query is valid and long enough to be worth running.\n// Prefixed queries require fewer minimum characters than unprefixed queries.\n// This avoids triggering a search while typing a prefix yet still enables searching for single-character names.\n// For example, `p:e` finds `pkl.math#E`.\nfunction isActionableQuery(query) {\n  const kind = query.kind;\n  const queryCps = query.normalizedCps;\n  return kind !== undefined && (kind !== null && queryCps.length > 0 || queryCps.length > 1);\n}\n\n// Renders the given search results for the given query.\n// Preconditions:\n// isActionableQuery(query) ? results !== null : results === null\nfunction renderSearchResults(query, results) {\n  const resultsDiv = document.createElement('div');\n  resultsDiv.id = 'search-results';\n  const ul = document.createElement('ul');\n  resultsDiv.append(ul);\n\n  if (results === null) {\n    if (query.kind !== undefined) return null;\n\n    const li = document.createElement('li');\n    li.className = 'heading';\n    li.textContent = 'Unknown search prefix. Use one of <b>m:</b> (module), <b>c:</b> (class), <b>f:</b> (function), or <b>p:</b> (property).';\n    ul.append(li);\n    return resultsDiv;\n  }\n\n  const {exactMatches, classMatches, moduleMatches, otherMatches} = results;\n\n  if (exactMatches.length + classMatches.length + moduleMatches.length + otherMatches.length === 0) {\n    renderHeading('No results found', ul);\n    return resultsDiv;\n  }\n\n  if (exactMatches.length > 0) {\n    renderHeading('Top hits', ul);\n    renderMembers(query.normalizedCps, exactMatches, ul);\n  }\n  if (classMatches.length > 0) {\n    renderHeading('Class', ul, className);\n    renderMembers(query.normalizedCps, classMatches, ul);\n  }\n  if (moduleMatches.length > 0) {\n    renderHeading('Module', ul, moduleName);\n    renderMembers(query.normalizedCps, moduleMatches, ul);\n  }\n  if (otherMatches.length > 0) {\n    renderHeading('Other results', ul);\n    renderMembers(query.normalizedCps, otherMatches, ul);\n  }\n\n  return resultsDiv;\n}\n\n// Adds a heading such as `Top matches` to the search results list.\nfunction renderHeading(title, ul, name = null) {\n  const li = document.createElement('li');\n  li.className = 'heading';\n  li.append(title);\n  if (name != null) {\n    li.append(' ');\n    li.append(span('heading-name', name))\n  }\n  ul.append(li);\n}\n\n// Adds matching members to the search results list.\nfunction renderMembers(queryCps, members, ul) {\n  for (const member of members) {\n    ul.append(renderMember(queryCps, member));\n  }\n}\n\n// Renders a member to be added to the search result list.\nfunction renderMember(queryCps, member) {\n  const result = document.createElement('li');\n  result.className = 'result';\n  if (member.deprecated) result.className = 'deprecated';\n\n  const link = document.createElement('a');\n  result.append(link);\n\n  link.href = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + member.url;\n  link.addEventListener('mousedown', () => selectResult(result));\n  link.addEventListener('click', clearSearch);\n\n  const keyword = getKindKeyword(member.kind);\n  // noinspection JSValidateTypes (IntelliJ bug?)\n  if (keyword !== null) {\n    link.append(span('keyword', keyword), ' ');\n  }\n\n  // prefix with class name if a class member\n  if (member.level === 2) {\n    link.append(span(\"context\", member.parent.name + '.'));\n  }\n\n  const name = span('result-name');\n  if (member.matchNameIdx === 0) { // main name matched\n    highlightMatch(queryCps, member.names[0], member.matchStartIdx, name);\n  } else { // aka name matched\n    name.append(member.name);\n  }\n  link.append(name);\n\n  if (member.signature !== null) {\n    link.append(member.signature);\n  }\n\n  if (member.matchNameIdx > 0) { // aka name matched\n    link.append(' ');\n    const aka = span('aka');\n    aka.append('(known as: ');\n    const name = span('aka-name');\n    highlightMatch(queryCps, member.names[member.matchNameIdx], member.matchStartIdx, name);\n    aka.append(name, ')');\n    link.append(aka);\n  }\n\n  // add module name if not a module\n  const module = getModule(member);\n  if (module !== null) {\n    link.append(' ', span('context', '(' + module.name + ')'));\n  }\n\n  return result;\n}\n\n// Returns the keyword for the given member kind.\nfunction getKindKeyword(kind) {\n  switch (kind) {\n    case 0:\n      return \"package\";\n    case 1:\n      return \"module\";\n    case 2:\n      return \"typealias\";\n    case 3:\n      return \"class\";\n    case 4:\n      return \"function\";\n    case 5:\n      // properties have no keyword\n      return null;\n  }\n}\n\n// Highlights the matching characters in a member name.\n// Preconditions:\n// queryCps.length > 0\n// computeMatchFrom(queryCps, name.normalizedCps, name.wordStarts, matchStartIdx)\nfunction highlightMatch(queryCps, name, matchStartIdx, parentElem) {\n  const queryLength = queryCps.length;\n  const codePoints = name.codePoints;\n  const nameCps = name.normalizedCps;\n  const nameLength = nameCps.length;\n  const wordStarts = name.wordStarts;\n\n  let queryIdx = 0;\n  let queryCp = queryCps[0];\n  let startIdx = matchStartIdx;\n\n  if (startIdx > 0) {\n    parentElem.append(String.fromCodePoint(...codePoints.subarray(0, startIdx)));\n  }\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp !== nameCp) {\n      const newNameIdx = wordStarts[nameIdx];\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx))));\n      startIdx = newNameIdx;\n      parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx, newNameIdx)));\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx + 1))));\n      if (nameIdx + 1 < nameLength) {\n        parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx + 1, nameLength)));\n      }\n      return;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  throw 'Precondition violated: `computeMatchFrom()`';\n}\n\n// Creates a span element.\nfunction span(className, text = null) {\n  const result = document.createElement('span');\n  result.className = className;\n  result.textContent = text;\n  return result;\n}\n\n// Creates a text node.\nfunction text(content) {\n  return document.createTextNode(content);\n}\n\n// Navigates to the next member entry in the search results list, skipping headings.\nfunction selectNextResult(ul) {\n  let next = selectedSearchResult === null ? ul.firstElementChild : selectedSearchResult.nextElementSibling;\n  while (next !== null) {\n    if (!next.classList.contains('heading')) {\n      selectResult(next);\n      scrollIntoView(next, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    next = next.nextElementSibling;\n  }\n}\n\n// Navigates to the previous member entry in the search results list, skipping headings.\nfunction selectPrevResult(ul) {\n  let prev = selectedSearchResult === null ? ul.lastElementChild : selectedSearchResult.previousElementSibling;\n  while (prev !== null) {\n    if (!prev.classList.contains('heading')) {\n      selectResult(prev);\n      const prev2 = prev.previousElementSibling;\n      // make any immediately preceding heading visible as well (esp. important for first heading)\n      const scrollTo = prev2 !== null && prev2.classList.contains('heading') ? prev2 : prev;\n      scrollIntoView(scrollTo, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    prev = prev.previousElementSibling;\n  }\n}\n\n// Selects the given entry in the search results list.\nfunction selectResult(li) {\n  if (selectedSearchResult !== null) {\n    selectedSearchResult.classList.remove('selected');\n  }\n  li.classList.add('selected');\n  selectedSearchResult = li;\n}\n\n// Clears the search input and hides/removes the search results list.\nfunction clearSearch() {\n  searchInput.value = '';\n  updateSearchResults(null);\n}\n\nconst updateRuntimeDataWith = (buildAnchor) => (fragmentId, entries) => {\n  if (!entries) return;\n  const fragment = document.createDocumentFragment();\n  let first = true;\n  for (const entry of entries) {\n    const a = document.createElement(\"a\");\n    buildAnchor(entry, a);\n    if (first) {\n      first = false;\n    } else {\n      fragment.append(\", \");\n    }\n    fragment.append(a);\n  }\n\n  const element = document.getElementById(fragmentId);\n  element.append(fragment);\n  element.classList.remove(\"hidden\"); // dd\n  element.previousElementSibling.classList.remove(\"hidden\"); // dt\n}\n\n// Functions called by JS data scripts.\n// noinspection JSUnusedGlobalSymbols\nconst runtimeData = {\n  knownVersions: (versions, myVersion) => {\n    updateRuntimeDataWith((entry, anchor) => {\n      const { text, href } = entry;\n      anchor.textContent = text;\n      // noinspection JSUnresolvedReference\n      if (text === myVersion) {\n        anchor.className = \"current-version\";\n      } else if (href) {\n        anchor.href = href;\n      }\n    })(\"known-versions\", versions);\n  },\n  knownUsagesOrSubtypes: updateRuntimeDataWith((entry, anchor) => {\n    const { text, href } = entry;\n    anchor.textContent = text;\n    // noinspection JSUnresolvedReference\n    anchor.textContent = text;\n    if (href) {\n      anchor.href = href;\n    }\n  }),\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/scripts/search-worker.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// populated by `initSearchIndex()`\nlet searchIndex;\n\n// noinspection ThisExpressionReferencesGlobalObjectJS\nconst isWorker = 'DedicatedWorkerGlobalScope' in this;\n\nif (isWorker) {\n  const workerName = self.name;\n  // relative to this file\n  const searchIndexUrl = workerName === \"main\" ?\n      '../search-index.js' :\n      '../' + workerName + '/search-index.js';\n  importScripts(searchIndexUrl);\n  initSearchIndex();\n  addEventListener('message', e => {\n    const {query, packageName, moduleName, className} = e.data;\n    const results = runSearch(query, packageName, moduleName, className);\n    postMessage({query, results});\n  });\n} else {\n  // non-worker environment\n  // `pkldoc.js` loads scripts and calls `initSearchIndex()`\n}\n\n// Initializes the search index.\nfunction initSearchIndex() {\n  // noinspection JSUnresolvedVariable\n  const data = JSON.parse(searchData);\n  const index = Array(data.length);\n  let idx = 0;\n\n  for (const entry of data) {\n    const name = entry.name;\n    const names = toIndexedNames(entry);\n    // 0 -> package, 1 -> module, 2 -> type alias, 3 -> class, 4 -> function, 5 -> property\n    const kind = entry.kind;\n    const url = entry.url;\n    // noinspection JSUnresolvedVariable\n    const signature = entry.sig === undefined ? null : entry.sig;\n    // noinspection JSUnresolvedVariable\n    const parent = entry.parId === undefined ? null : index[entry.parId];\n    const level = parent === null ? 0 : parent.parent === null ? 1 : 2;\n    const deprecated = entry.deprecated !== undefined;\n\n    index[idx++] = {\n      name,\n      names,\n      kind,\n      url,\n      signature,\n      parent,\n      level,\n      deprecated,\n      // remaining attributes are set by `computeMatchFrom` and hence aren't strictly part of the search index\n      matchNameIdx: -1,  // names[matchNameIdx] is the name that matched\n      matchStartIdx: -1, // names[matchNameIdx].codePoints[matchStartIdx] is the first code point that matched\n      similarity: 0 // number of code points matched relative to total number of code points (between 0.0 and 1.0)\n    };\n  }\n\n  searchIndex = index;\n}\n\n// Runs a search and returns its results.\nfunction runSearch(query, packageName, moduleName, className) {\n  const queryCps = query.normalizedCps;\n  const queryKind = query.kind;\n\n  let exactMatches = [];\n  let classMatches = [];\n  let moduleMatches = [];\n  let otherMatches = [];\n\n  for (const member of searchIndex) {\n    if (queryKind !== null && queryKind !== member.kind) continue;\n\n    if (!isMatch(queryCps, member)) continue;\n\n    if (member.similarity === 1) {\n      exactMatches.push(member);\n    } else if (moduleName !== null && member.level === 1 && moduleName === member.parent.name) {\n      moduleMatches.push(member);\n    } else if (moduleName !== null && member.level === 2 && moduleName === member.parent.parent.name) {\n      if (className !== null && className === member.parent.name) {\n        classMatches.push(member);\n      } else {\n        moduleMatches.push(member);\n      }\n    } else {\n      otherMatches.push(member);\n    }\n  }\n\n  // Sorts members best-first.\n  function compareMembers(member1, member2) {\n    const normDiff = member2.similarity - member1.similarity; // higher is better\n    if (normDiff !== 0) return normDiff;\n\n    const lengthDiff = member1.matchNameLength - member2.matchNameLength; // lower is better\n    if (lengthDiff !== 0) return lengthDiff;\n\n    const kindDiff = member2.kind - member1.kind; // higher is better\n    if (kindDiff !== 0) return kindDiff;\n\n    return member1.matchNameIdx - member2.matchNameIdx; // lower is better\n  }\n\n  exactMatches.sort(compareMembers);\n  classMatches.sort(compareMembers);\n  moduleMatches.sort(compareMembers);\n  otherMatches.sort(compareMembers);\n\n  return {exactMatches, classMatches, moduleMatches, otherMatches};\n}\n\n// Indexes a member's names.\nfunction toIndexedNames(entry) {\n  const result = [];\n  result.push(toIndexedName(entry.name));\n  // noinspection JSUnresolvedVariable\n  const alsoKnownAs = entry.aka;\n  if (alsoKnownAs !== undefined) {\n    for (const name of alsoKnownAs) {\n      result.push(toIndexedName(name));\n    }\n  }\n  return result;\n}\n\n// Indexes the given name.\nfunction toIndexedName(name) {\n  const characters = Array.from(name);\n  const codePoints = Uint32Array.from(characters, ch => ch.codePointAt(0));\n  const normalizedCps = toNormalizedCodePoints(characters);\n  const wordStarts = toWordStarts(characters);\n\n  return {codePoints, normalizedCps, wordStarts};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Returns an array of same length as `characters` that for every index, holds the index of the next word start.\n// Preconditions:\n// characters.length > 0\nfunction toWordStarts(characters) {\n  const length = characters.length;\n  // -1 is used as 'no next word start exists' -> use signed int array\n  const result = length <= 128 ? new Int8Array(length) : new Int16Array(length);\n\n  if (length > 1) {\n    let class1 = toCharClass(characters[length - 1]);\n    let class2;\n    let wordStart = -1;\n    for (let idx = length - 1; idx >= 1; idx -= 1) {\n      class2 = class1;\n      class1 = toCharClass(characters[idx - 1]);\n      const diff = class1 - class2;\n      // transitions other than uppercase -> other\n      if (diff !== 0 && diff !== 3) wordStart = idx;\n      result[idx] = wordStart;\n      // uppercase -> other\n      if (diff === 3) wordStart = idx - 1;\n    }\n  }\n\n  // first character is always a word start\n  result[0] = 0;\n\n  return result;\n}\n\n\n// Partitions characters into uppercase, digit, dot, and other.\nfunction toCharClass(ch) {\n  const regexIsUppercase = /\\p{Lu}/u\n  const regexIsNumericCharacter = /\\p{N}/u\n  return regexIsUppercase.test(ch) ? 3 : regexIsNumericCharacter.test(ch) ? 2 : ch === '.' ? 1 : 0;\n}\n\n// Tests if `queryCps` matches any of `member`'s names.\n// If so, records information about the match in `member`.\n// Preconditions:\n// queryCps.length > 0\nfunction isMatch(queryCps, member) {\n  const queryLength = queryCps.length;\n  let nameIdx = 0;\n\n  for (const name of member.names) {\n    const nameCps = name.normalizedCps;\n    const nameLength = nameCps.length;\n    const wordStarts = name.wordStarts;\n    const maxStartIdx = nameLength - queryLength;\n\n    for (let startIdx = 0; startIdx <= maxStartIdx; startIdx += 1) {\n      const matchLength = computeMatchFrom(queryCps, nameCps, wordStarts, startIdx);\n      if (matchLength > 0) {\n        member.matchNameIdx = nameIdx;\n        member.matchStartIdx = startIdx;\n        // Treat exact match of last module name component as exact match (similarity == 1).\n        // For example, treat \"PodSpec\" as exact match for \"io.k8s.api.core.v1.PodSpec\".\n        // Because \"ps\" is considered an exact match for \"PodSpec\",\n        // it is also considered an exact match for \"io.k8s.api.core.v1.PodSpec\".\n        const isExactMatchOfLastModuleNameComponent =\n            startIdx > 0 && nameCps[startIdx - 1] === 46 /* '.' */ && matchLength === nameLength - startIdx;\n        member.similarity = isExactMatchOfLastModuleNameComponent ? 1 : matchLength / nameLength;\n        member.matchNameLength = nameLength;\n        return true;\n      }\n    }\n\n    nameIdx += 1;\n  }\n\n  return false;\n}\n\n// Tests if the given query matches the given name from `startIdx` on.\n// Returns the number of code points matched.\n// Word start matches get special treatment.\n// For example, `sb` is considered to match all code points of `StringBuilder`.\n// Preconditions:\n// queryCps.length > 0\n// nameCps.length > 0\n// wordStarts.length === nameCps.length\n// startIdx < nameCps.length\nfunction computeMatchFrom(queryCps, nameCps, wordStarts, startIdx) {\n  const queryLength = queryCps.length;\n  const nameLength = nameCps.length;\n  const beginsWithWordStart = wordStarts[startIdx] === startIdx;\n\n  let queryIdx = 0;\n  let matchLength = 0;\n  let queryCp = queryCps[0];\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp === nameCp) {\n      matchLength += 1;\n    } else { // check for word start match\n      if (nameIdx === startIdx || !beginsWithWordStart) return 0;\n\n      const newNameIdx = wordStarts[nameIdx];\n      if (newNameIdx === -1) return 0;\n\n      const newNameCp = nameCps[newNameIdx];\n      if (queryCp !== newNameCp) return 0;\n\n      matchLength += newNameIdx - nameIdx + 1;\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      // in case of a word start match, increase matchLength by number of remaining chars of the last matched word\n      const nextIdx = nameIdx + 1;\n      if (beginsWithWordStart && nextIdx < nameLength) {\n        const nextStart = wordStarts[nextIdx];\n        if (nextStart === -1) {\n          matchLength += nameLength - nextIdx;\n        } else {\n          matchLength += nextStart - nextIdx;\n        }\n      }\n\n      return matchLength;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1\",\"kind\":0,\"url\":\"com.package1/current/index.html\",\"deprecated\":true},{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"com.package1/current/Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"com.package1/current/baseModule/index.html\"},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classAnnotations/index.html\"},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"com.package1/current/classComments/index.html\"},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"com.package1/current/classInheritance/index.html\"},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"com.package1/current/classMethodComments/index.html\"},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/classMethodModifiers/index.html\"},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeReferences/index.html\"},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"com.package1/current/classPropertyComments/index.html\"},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/classPropertyModifiers/index.html\"},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeReferences/index.html\"},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"com.package1/current/classTypeConstraints/index.html\"},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject1/index.html\"},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject2/index.html\"},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"com.package1/current/docLinks/index.html\"},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"com.package1/current/methodAnnotations/index.html\"},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"com.package1/current/moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"com.package1/current/moduleExtend/index.html\"},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"com.package1/current/moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodCommentInheritance/index.html\"},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodComments/index.html\"},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodModifiers/index.html\"},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeReferences/index.html\"},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyCommentInheritance/index.html\"},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyComments/index.html\"},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyModifiers/index.html\"},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeReferences/index.html\"},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes1/index.html\"},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes2/index.html\"},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"com.package1/current/nested/nested2/nestedModule/index.html\"},{\"name\":\"com.package1.ternalPackage\",\"kind\":1,\"url\":\"com.package1/current/ternalPackage/index.html\"},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"com.package1/current/shared/index.html\"},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"com.package1/current/typealiases/index.html\"},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"com.package1/current/typealiases2/index.html\"},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"com.package1/current/typeAliasInheritance/index.html\"},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"com.package1/current/unionTypes/index.html\"},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"com.package1/current/unlistedClass/index.html\"},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"com.package1/current/unlistedMethod/index.html\"},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"com.package1/current/unlistedProperty/index.html\"},{\"name\":\"com.package2\",\"kind\":0,\"url\":\"com.package2/current/index.html\"},{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"com.package2/current/Module3/index.html\"},{\"name\":\"localhost:0/birds\",\"kind\":0,\"url\":\"localhost(3a)0/birds/current/index.html\"},{\"name\":\"localhost:0/birds.catalog\",\"kind\":1,\"url\":\"localhost(3a)0/birds/current/catalog/index.html\"},{\"name\":\"localhost:0/birds.allFruit\",\"kind\":1,\"url\":\"localhost(3a)0/birds/current/allFruit/index.html\"},{\"name\":\"localhost:0/birds.Bird\",\"kind\":1,\"url\":\"localhost(3a)0/birds/current/Bird/index.html\"},{\"name\":\"localhost:0/deprecated\",\"kind\":0,\"url\":\"localhost(3a)0/deprecated/current/index.html\",\"deprecated\":true},{\"name\":\"localhost:0/deprecated.deprecated\",\"kind\":1,\"url\":\"localhost(3a)0/deprecated/current/deprecated/index.html\"},{\"name\":\"localhost:0/fruit\",\"kind\":0,\"url\":\"localhost(3a)0/fruit/current/index.html\"},{\"name\":\"localhost:0/fruit.Fruit\",\"kind\":1,\"url\":\"localhost(3a)0/fruit/current/Fruit/index.html\"}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocGeneratorTest/output/run-2/styles/pkldoc.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-Regular'),\n  url('../fonts/lato-v14-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Lato Bold'), local('Lato-Bold'),\n  url('../fonts/lato-v14-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Regular'), local('OpenSans-Regular'),\n  url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Open Sans Italic'), local('OpenSans-Italic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Open Sans Bold'), local('OpenSans-Bold'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Source Code Pro'), local('SourceCodePro-Regular'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Material Icons';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Material Icons'),\n  local('MaterialIcons-Regular'),\n  url(../fonts/MaterialIcons-Regular.woff2) format('woff2');\n}\n\n.material-icons {\n  /*noinspection CssNoGenericFontName*/\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 24px;\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  line-height: 1;\n  text-transform: none;\n  letter-spacing: normal;\n  word-wrap: normal;\n  white-space: nowrap;\n  direction: ltr;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  -moz-osx-font-smoothing: grayscale;\n  font-feature-settings: 'liga';\n}\n\ninput[type=search] {\n  -webkit-appearance: textfield;\n}\n\ninput[type=search]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\ninput::-moz-placeholder {\n  opacity: 1;\n}\n\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n  border: 0;\n  font-family: inherit;\n  font-size: 100%;\n  font-style: inherit;\n  font-weight: inherit;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  vertical-align: baseline;\n}\n\nbody {\n  margin: 0;\n  font-family: Lato, Arial, sans-serif;\n  background-color: #f0f3f6;\n  scroll-behavior: smooth;\n}\n\na, a:visited, a:hover, a:active {\n  color: inherit;\n}\n\na:hover {\n  text-decoration: none;\n  transition: 0s;\n}\n\ncode, .member-modifiers, .member-signature, .doc-comment pre, #search-results li.result, .result-name, .heading-name, .aka-name {\n  font-family: \"Source Code Pro\", monospace;\n  letter-spacing: -0.03em;\n}\n\nheader {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw; /* vw to make sure that positioning is the same whether or not vertical scrollbar is displayed */\n  height: 32px;\n  z-index: 1;\n  background-color: #364550;\n  padding: 7px 0 7px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n}\n\n#doc-title {\n  position: absolute;\n  margin-top: 8px;\n  margin-left: 15px;\n}\n\n#doc-title a {\n  color: #fff;\n  text-decoration: none;\n}\n\n#search {\n  position: relative;\n  width: 50vw;\n  margin: 0 auto;\n}\n\n#search-icon {\n  position: absolute;\n  left: 0;\n  top: 2px;\n  padding: 4px;\n  font-size: 21px;\n  color: #a5a9a9;\n}\n\n#search-input {\n  margin-top: 2px;\n  width: 100%;\n  height: 28px;\n  text-indent: 28px;\n  font-size: 0.85em;\n  background-color: rgba(255, 255, 255, 0.2);\n  border: none;\n  border-radius: 3px;\n  color: #fff;\n}\n\n#search-input:focus {\n  background-color: #6D7880;\n  outline: none;\n}\n\n#search-input::placeholder {\n  text-align: center;\n  color: #A5A9A9;\n}\n\n#search-input:focus::placeholder {\n  color: transparent;\n}\n\n#search-results {\n  position: fixed;\n  box-sizing: border-box;\n  top: 38px;\n  left: 25vw;\n  right: 25vw;\n  width: 50vw;\n  max-height: 80%;\n  color: #103a51;\n  background: white;\n  border: solid 1px #6D7880;\n  border-radius: 3px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n  white-space: nowrap;\n\n  overflow: auto; /* in safari, this slows down painting, blocking the ui */\n  /*noinspection CssUnknownProperty*/\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n}\n\n#search-results a {\n  text-decoration: none;\n}\n\n#search-results a:hover {\n  text-decoration: underline;\n}\n\n#search-results ul {\n  list-style: none;\n  font-size: 0.9em;\n}\n\n#search-results li {\n  padding: 0.2ch 3ch;\n  height: 17px; /* used same height regardless of which fonts are used in content */\n}\n\n#search-results li.heading {\n  background-color: #f0f3f6;\n  padding: 0.4ch 1ch;\n}\n\n#search-results li.result {\n  font-size: 0.9em;\n}\n\n#search-results .keyword {\n  color: #000082;\n}\n\n#search-results .highlight {\n  font-weight: bold;\n}\n\n#search-results .context {\n  color: gray;\n}\n\n#search-results .selected, #search-results .selected .keyword, #search-results .selected .aka, #search-results .selected .context {\n  background: darkblue;\n  color: white;\n}\n\n#search-results .deprecated {\n  text-decoration: line-through;\n}\n\n/* make sure that line-through of highlighted region of selected search result has the right color */\n#search-results .deprecated.selected .highlight {\n  text-decoration: line-through;\n}\n\nmain {\n  width: 70%;\n  margin: 60px auto 20px;\n}\n\n.declaration-parent-link {\n  margin: 0 0 1rem;\n}\n\n#declaration-title {\n  font-size: 2em;\n  font-weight: bold;\n  color: #103a51;\n  margin: 0.5rem 0;\n}\n\n#declaration-version {\n  color: #A5A9A9;\n  font-size: 0.9em;\n  vertical-align: bottom;\n  padding-left: 0.25em;\n}\n\n.member-group-links {\n  margin: 0.75em 0 1em 0;\n}\n\n.member-group-links li {\n  display: inline-block;\n  margin-right: 1em;\n}\n\n.member-info {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  line-height: 1.5;\n  margin-top: 0.5em;\n  font-size: 0.9em;\n}\n\n.member-info dt {\n  grid-column: 1;\n  text-align: right;\n}\n\n.member-info dd {\n  grid-column: 2;\n  margin-left: 0.5em;\n}\n\n.copy-uri-button {\n  cursor: pointer;\n  font-size: inherit;\n  margin-left: 0.5em;\n}\n\n.member-group {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.member-group-title {\n  margin: 1rem;\n  font-weight: bold;\n  color: #103a51;\n}\n\n.toggle-inherited-members {\n  font-size: 0.9em;\n  font-weight: normal;\n  margin-left: 0.5em;\n}\n\n.button-link {\n  text-decoration: underline;\n}\n\n.button-link:hover, .button-link:active {\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.member-group ul {\n  list-style: none;\n}\n\n.member-group li {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.anchor,\n.anchor-param1,\n.anchor-param2,\n.anchor-param3,\n.anchor-param4,\n.anchor-param5,\n.anchor-param6,\n.anchor-param7,\n.anchor-param8,\n.anchor-param9 {\n  position: absolute;\n  top: -60px;\n  left: 0;\n}\n\n.anchor:target ~ .member,\n.anchor-param1:target ~ .member,\n.anchor-param2:target ~ .member,\n.anchor-param3:target ~ .member,\n.anchor-param4:target ~ .member,\n.anchor-param5:target ~ .member,\n.anchor-param6:target ~ .member,\n.anchor-param7:target ~ .member,\n.anchor-param8:target ~ .member,\n.anchor-param9:target ~ .member {\n  border-left: 3px solid #222832;\n}\n\n.anchor:target ~ .member .name-decl,\n.anchor-param1:target ~ .member .param1,\n.anchor-param2:target ~ .member .param2,\n.anchor-param3:target ~ .member .param3,\n.anchor-param4:target ~ .member .param4,\n.anchor-param5:target ~ .member .param5,\n.anchor-param6:target ~ .member .param6,\n.anchor-param7:target ~ .member .param7,\n.anchor-param8:target ~ .member .param8,\n.anchor-param9:target ~ .member .param9 {\n  font-weight: bold;\n}\n\n.member {\n  border-left: 3px solid transparent;\n  margin: 0 auto 0.5rem;\n  background-color: #fff;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n  font-size: 0.9em;\n  padding: 10px;\n  color: #222832;\n}\n\n.member:hover {\n  background-color: #f2f2f2;\n}\n\n.member-left {\n  width: 25%;\n  display: inline;\n  float: left;\n  padding-right: 6px;\n  min-height: 1px;\n  text-align: right;\n}\n\n.member-modifiers {\n  color: #000082;\n}\n\n.member-main {\n  display: block;\n  overflow: hidden;\n}\n\n.member-deprecated {\n  text-decoration: line-through;\n}\n\n.member-selflink {\n  visibility: hidden;\n  display: inline;\n  float: left;\n  padding-right: 20px;\n  color: #222832;\n  text-decoration: none;\n}\n\n.member-source-link {\n  visibility: hidden;\n  color: #fff;\n  background-color: #868e96;\n  display: inline-block;\n  margin-left: 1em;\n  padding: .25em .4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  vertical-align: bottom;\n  border-radius: .25rem\n}\n\n.member-source-link:visited, .member-source-link:hover, .member-source-link:active {\n  color: #fff;\n}\n\n.member:hover .member-source-link, .member:hover .member-selflink {\n  visibility: visible;\n}\n\n.member.inherited, .member.hidden-member {\n  opacity: 0.75;\n}\n\n.member.inherited .context {\n  color: gray;\n}\n\n.member.with-page-link, .member.with-expandable-docs {\n  cursor: pointer;\n}\n\n.member .expandable-docs-icon {\n  float: right;\n}\n\n/*\nDon't style a.name-decl as link\nbecause the entire .member.with-page-link is effectively a link (via JS).\n*/\n.member.with-page-link a.name-decl {\n  text-decoration: none;\n}\n\n.expandable {\n  transform: scaleY(1);\n  transition: transform 0.25s;\n}\n\n.expandable.collapsed {\n  transform: scaleY(0);\n}\n\n.expandable.hidden {\n  display: none;\n}\n\n#_declaration .expandable {\n  transform: none;\n  transition: none;\n}\n\n#_declaration .expandable.collapsed {\n  mask: linear-gradient(rgb(0 0 0), transparent) content-box;\n  height: 100px;\n}\n\n#_declaration .expandable.hidden {\n  display: block;\n}\n\n/* show an otherwise hidden inherited member if it's a link target */\n.anchor:target + .expandable.collapsed.hidden {\n  display: inherit;\n  transform: scaleY(1);\n}\n\n.doc-comment {\n  color: #103a51;\n  margin-top: 0.5rem;\n  font-family: \"Open Sans\", sans-serif;\n  font-size: 0.9em;\n}\n\n.doc-comment p {\n  margin: 0.7em 0;\n}\n\n.doc-comment p:first-child {\n  margin-top: 0;\n}\n\n.doc-comment p:last-child {\n  margin-bottom: 0;\n}\n\n.doc-comment h1,\n.doc-comment h2,\n.doc-comment h3,\n.doc-comment h4,\n.doc-comment h5,\n.doc-comment h6 {\n  margin-bottom: 0.7em;\n  margin-top: 1.4em;\n  display: block;\n  text-align: left;\n  font-weight: bold;\n}\n\n.doc-comment pre {\n  padding: 0.5em;\n  border: 0 solid #ddd;\n  background-color: #364550;\n  color: #ddd;\n  margin: 5px 0;\n  display: block;\n  border-radius: 0.2em;\n  overflow-x: auto;\n}\n\n.doc-comment ul {\n  display: block;\n  list-style: circle;\n  padding-left: 20px;\n}\n\n.doc-comment ol {\n  display: block;\n  padding-left:20px;\n}\n\n.doc-comment ol.decimal {\n  list-style: decimal;\n}\n\n.doc-comment ol.lowerAlpha {\n  list-style: lower-alpha;\n}\n\n.doc-comment ol.upperAlpha {\n  list-style: upper-alpha;\n}\n\n.doc-comment ol.lowerRoman {\n  list-style: lower-roman;\n}\n\n.doc-comment ol.upperRoman {\n  list-style: upper-roman;\n}\n\n.doc-comment li {\n  display: list-item;\n}\n\n.doc-comment code {\n  font-weight: normal;\n}\n\n.doc-comment em, .doc-comment i {\n  font-style: italic;\n}\n\n.doc-comment strong, .doc-comment b {\n  font-weight: bold;\n}\n\n.runtime-data.hidden {\n  display: none;\n}\n\n.runtime-data .current-version {\n  font-weight: bold;\n}\n\n/*\nStyling for Markdown tables in doc comments.\nFrom: https://gist.github.com/andyferra/2554919\n*/\n\ntable {\n  padding: 0;\n}\n\ntable tr {\n  border-top: 1px solid #cccccc;\n  background-color: white;\n  margin: 0;\n  padding: 0;\n}\n\ntable tr:nth-child(2n) {\n  background-color: #f8f8f8;\n}\n\ntable tr th {\n  font-weight: bold;\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr td {\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr th :first-child, table tr td :first-child {\n  margin-top: 0;\n}\n\ntable tr th :last-child, table tr td :last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/Module Containing Spaces/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module Containing Spaces (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.Module Containing Spaces\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.`Module Containing Spaces`<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.`Module Containing Spaces`</span></div>\n        <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/Module%20Containing%20Spaces.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/Module%20Containing%20Spaces.pkl\">Module Containing Spaces.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/baseModule/BaseClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>BaseClass (com.package1/baseModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/baseModule/BaseClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-class-name=\"BaseClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.baseModule</a>\n      <h1 id=\"declaration-title\">BaseClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">BaseClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/baseModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>baseModule (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/baseModule/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.baseModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.baseModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/baseModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/baseModule.pkl\">baseModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"BaseClass.html\" class=\"name-decl\">BaseClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classAnnotations/AnnotatedClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClass (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClass</span></div>\n        <div class=\"doc-comment\">Deprecated.</div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classAnnotations/AnnotatedClss.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClss (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClss.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClss\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClss<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClss</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClss</code> thought to have a correctly spelled name.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClssWithExpandableComment (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClssWithExpandableComment\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClssWithExpandableComment<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClssWithExpandableComment</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClssWithExpandableComment</code> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classAnnotations.pkl\">classAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"AnnotatedClss\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClss\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClss.html\" class=\"name-decl\">AnnotatedClss</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClssWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClssWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClssWithExpandableComment.html\" class=\"name-decl\">AnnotatedClssWithExpandableComment</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClass.html\" class=\"name-decl\">AnnotatedClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated.</div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments1 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments2 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments3 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments3.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments3</span></div>\n        <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments4 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments4.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments4</span></div>\n        <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph2, line2).</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments5.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments5 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments5.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments5\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments5<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments5</span></div>\n        <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments6.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments6 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments6.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments6\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments6<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments6</span></div>\n        <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments7.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments7 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments7.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments7\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments7<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments7</span></div>\n        <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/Comments8.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments8 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments8.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments8\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments8<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments8</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Installation</h2>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classComments.pkl\">classComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>git status</code></td>\n<td>List all <em>new or modified</em> files</td>\n</tr>\n<tr>\n<td><code>git diff</code></td>\n<td>Show file differences that <strong>haven't been</strong> staged</td>\n</tr>\n</tbody>\n</table></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments1.html\" class=\"name-decl\">Comments1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments2.html\" class=\"name-decl\">Comments2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments3.html\" class=\"name-decl\">Comments3</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments4.html\" class=\"name-decl\">Comments4</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments5\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments5.html\" class=\"name-decl\">Comments5</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments6\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments6.html\" class=\"name-decl\">Comments6</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments7\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments7.html\" class=\"name-decl\">Comments7</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments8\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments8.html\" class=\"name-decl\">Comments8</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classInheritance/MyClass1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass1 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass1.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classInheritance/MyClass2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass2 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">MyClass2</span> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classInheritance/MyClass3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass3 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass3.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass3</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classInheritance/MyClass4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass4 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass4.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass4</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classInheritance</span></div>\n        <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classInheritance.pkl\">classInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass1.html\" class=\"name-decl\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass2.html\" class=\"name-decl\">MyClass2</a> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass3.html\" class=\"name-decl\">MyClass3</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass4.html\" class=\"name-decl\">MyClass4</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classMethodComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodComments/Comments.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodComments.pkl\">classMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classMethodModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodModifiers/Modifiers.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodModifiers.pkl\">classMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classMethodTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeAnnotations.pkl\">classMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeReferences.pkl\">classMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ClassWithAnnotatedProperty (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"ClassWithAnnotatedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">ClassWithAnnotatedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ClassWithAnnotatedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyAnnotations.pkl\">classPropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ClassWithAnnotatedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ClassWithAnnotatedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ClassWithAnnotatedProperty.html\" class=\"name-decl\">ClassWithAnnotatedProperty</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classPropertyComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyComments/Comments.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyComments.pkl\">classPropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classPropertyModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyModifiers/Modifiers.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with multiple modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyModifiers.pkl\">classPropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classPropertyTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl\">classPropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classPropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeReferences.pkl\">classPropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classTypeConstraints/Address.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Address (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Address.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Address\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Address<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Address</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"street\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#street\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">street</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"city\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#city\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">city</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classTypeConstraints/Person1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person1 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Person1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(length &gt;= 3)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"address\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">address</span>: <a href=\"Address.html\" class=\"name-ref\">Address</a>(street != city)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classTypeConstraints/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Person2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classTypeConstraints/Project.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Project (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Project.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Project\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Project<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Project</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"type\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#type\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">type</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(oneOf(List(&quot;open-source&quot;, &quot;closed-source&quot;)))?<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"contacts\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#contacts\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">contacts</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty), <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)&gt;(length &gt; 10, length &lt; 20)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/classTypeConstraints/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classTypeConstraints (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classTypeConstraints<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classTypeConstraints</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classTypeConstraints.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classTypeConstraints.pkl\">classTypeConstraints.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emailAddress\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emailAddress\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emailAddress</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person1.html\" class=\"name-decl\">Person1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Address\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Address.html\" class=\"name-decl\">Address</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Project\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Project\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Project.html\" class=\"name-decl\">Project</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/docExampleSubject1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docExampleSubject1/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject1.pkl\">docExampleSubject1.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a>, <a href=\"https://example.com/package1/docExample2.pkl\">docExample2</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/docExampleSubject2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docExampleSubject2/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject2.pkl\">docExampleSubject2.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"y\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#y\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">y</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/docLinks/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/docLinks:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docLinks/Person.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.docLinks</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <code>Person.name</code>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"call()\" class=\"anchor\"> </div>\n            <div id=\"call().number\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#call()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">call</span>(<span class=\"param1\">number</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code>\n<code>number</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/docLinks/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docLinks (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docLinks/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docLinks<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docLinks</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docLinks.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docLinks.pkl\">docLinks.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"age\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#age\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">age</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<code>age</code>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"sing()\" class=\"anchor\"> </div>\n            <div id=\"sing().song\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#sing()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">sing</span>(<span class=\"param1\">song</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <code>sing()</code>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>song</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"PersonList\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#PersonList\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#PersonList\" class=\"name-decl\">PersonList</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>PersonList</code>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package1 (1.2.3) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../data/com.package1/1.2.3/index.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package1</span></div>\n        <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>package1-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.2.3</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/\">https://example.com/package1/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package1/\">https://issues.apple.com/package1/</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../com.package2/4.5.6/index.html\">com.package2:4.5.6</a>, <span>com.externalpackage:7.8.9</span></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Docs for Package 1.</p><ul>\n<li>\n<p><a href=\"docLinks/index.html\"><code>docLinks</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#age\"><code>docLinks.age</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#sing()\"><code>docLinks.sing()</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html\"><code>docLinks.Person</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html#name\"><code>docLinks.Person.name</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#PersonList\"><code>docLinks.PersonList</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a></p>\n</li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1.Module%20Containing%20Spaces\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.Module%20Containing%20Spaces\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module%20Containing%20Spaces/index.html\">com.package1.`Module Containing Spaces`</a></div>\n                <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.baseModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.baseModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./baseModule/index.html\">com.package1.baseModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classAnnotations/index.html\">com.package1.classAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classComments/index.html\">com.package1.classComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classInheritance/index.html\">com.package1.classInheritance</a></div>\n                <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodComments/index.html\">com.package1.classMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodModifiers/index.html\">com.package1.classMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeAnnotations/index.html\">com.package1.classMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeReferences/index.html\">com.package1.classMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyAnnotations/index.html\">com.package1.classPropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyComments/index.html\">com.package1.classPropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyModifiers/index.html\">com.package1.classPropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeAnnotations/index.html\">com.package1.classPropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeReferences/index.html\">com.package1.classPropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classTypeConstraints\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classTypeConstraints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classTypeConstraints/index.html\">com.package1.classTypeConstraints</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject1/index.html\">com.package1.docExampleSubject1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject2/index.html\">com.package1.docExampleSubject2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docLinks\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docLinks\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docLinks/index.html\">com.package1.docLinks</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"shared/index.html\"><code>shared</code></a>, <a href=\"shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"docLinks/index.html#age\"><code>age</code></a>, <a href=\"docLinks/index.html#sing()\"><code>sing()</code></a>, <a href=\"docLinks/Person.html\"><code>Person</code></a>, <a href=\"docLinks/Person.html#name\"><code>Person.name</code></a>, <a href=\"docLinks/Person.html#call()\"><code>Person.call()</code></a>, <a href=\"docLinks/index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.methodAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.methodAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./methodAnnotations/index.html\">com.package1.methodAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleComments/index.html\">com.package1.moduleComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleExtend\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleExtend\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleExtend/index.html\">com.package1.moduleExtend</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleInfoAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleInfoAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleInfoAnnotation/index.html\">com.package1.moduleInfoAnnotation</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodCommentInheritance/index.html\">com.package1.moduleMethodCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodComments/index.html\">com.package1.moduleMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodModifiers/index.html\">com.package1.moduleMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeAnnotations/index.html\">com.package1.moduleMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeReferences/index.html\">com.package1.moduleMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyAnnotations/index.html\">com.package1.modulePropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyCommentInheritance/index.html\">com.package1.modulePropertyCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyComments/index.html\">com.package1.modulePropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyModifiers/index.html\">com.package1.modulePropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeAnnotations/index.html\">com.package1.modulePropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeReferences/index.html\">com.package1.modulePropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes1/index.html\">com.package1.moduleTypes1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes2/index.html\">com.package1.moduleTypes2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.nested.nested2.nestedModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.nested.nested2.nestedModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./nested/nested2/nestedModule/index.html\">com.package1.nested.nested2.nestedModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"referenceToExternalPackage\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#referenceToExternalPackage\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./ternalPackage/index.html\">referenceToExternalPackage</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.shared\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.shared\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./shared/index.html\">com.package1.shared</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases/index.html\">com.package1.typealiases</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases2/index.html\">com.package1.typealiases2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typeAliasInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typeAliasInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typeAliasInheritance/index.html\">com.package1.typeAliasInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unionTypes\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unionTypes\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unionTypes/index.html\">com.package1.unionTypes</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedClass/index.html\">com.package1.unlistedClass</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedMethod\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedMethod\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedMethod/index.html\">com.package1.unlistedMethod</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedProperty/index.html\">com.package1.unlistedProperty</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/methodAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>methodAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/methodAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.methodAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.methodAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.methodAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/methodAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/methodAnnotations.pkl\">methodAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthod()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthod</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>mthod()</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthodWithExpandableComment()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthodWithExpandableComment()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthodWithExpandableComment</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#mthod()\"><code>mthod()</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#method()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleComments.pkl\">moduleComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleExtend/ExtendClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ExtendClass (com.package1/moduleExtend:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleExtend/ExtendClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-class-name=\"ExtendClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleExtend</a>\n      <h1 id=\"declaration-title\">ExtendClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ExtendClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleExtend/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleExtend (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleExtend/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleExtend<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleExtend</span> extends <a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleExtend.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleExtend.pkl\">moduleExtend.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../baseModule/BaseClass.html\" class=\"name-decl\">BaseClass</a><span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ExtendClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ExtendClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ExtendClass.html\" class=\"name-decl\">ExtendClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleInfoAnnotation/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleInfoAnnotation (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleInfoAnnotation/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleInfoAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleInfoAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleInfoAnnotation</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleInfoAnnotation.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleInfoAnnotation.pkl\">moduleInfoAnnotation.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleMethodCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodCommentInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodCommentInheritance</span> extends <a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl\">moduleMethodCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.moduleMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodComments.pkl\">moduleMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodModifiers.pkl\">moduleMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl\">moduleMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/moduleMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeReferences.pkl\">moduleMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation1 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation1</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation.html\" class=\"name-ref\">UserDefinedAnnotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation2 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation2</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation2.html\" class=\"name-ref\">UserDefinedAnnotation2</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyAnnotations.pkl\">modulePropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prperty\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>prperty</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prpertyWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prpertyWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prpertyWithExpandableComment</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#prperty\"><code>prperty</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation1.html\" class=\"name-decl\">UserDefinedAnnotation1</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation2.html\" class=\"name-decl\">UserDefinedAnnotation2</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyCommentInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyCommentInheritance</span> extends <a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl\">modulePropertyCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.modulePropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyComments.pkl\">modulePropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyModifiers.pkl\">modulePropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl\">modulePropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/modulePropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/modulePropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeReferences.pkl\">modulePropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleTypes1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleTypes1/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes1.pkl\">moduleTypes1.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"n\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#n\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">n</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleTypes2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/moduleTypes2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleTypes2/Foo.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleTypes2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/moduleTypes2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleTypes2/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes2.pkl\">moduleTypes2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/nested/nested2/nestedModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.nested.nested2.nestedModule</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/nested/nested2/nestedModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>nestedModule (com.package1/nested/nested2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.nested.nested2.nestedModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.nested.nested2.nestedModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/nested/nested2/nestedModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/nested/nested2/nestedModule.pkl\">nestedModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\"},\"summary\":\"Docs for Package 1.\",\"deprecation\":\"com.package1 is deprecated\",\"sourceCode\":\"https://example.com/package1/\",\"sourceCodeUrlScheme\":\"https://example.com/package1%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"}},{\"ref\":{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\"},\"summary\":\"This is a module that has spaces in its name.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"BaseClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClss\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClssWithExpandableComment\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments4\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments5\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments6\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments7\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments8\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\"},\"summary\":\"Class inheritance involving abstract, open, and final classes.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass3\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass4\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\"},\"summary\":\"Class methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\"},\"summary\":\"Class methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\"},\"summary\":\"Class methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\"},\"summary\":\"Class methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ClassWithAnnotatedProperty\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\"},\"summary\":\"Class properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\"},\"summary\":\"Class properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\"},\"summary\":\"Class properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\"},\"summary\":\"Class properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Project\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\"},\"summary\":\"[external1], [external1.MyClass]\\n[shared], [shared.MyClass]\\n[age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\\n[docLinks], [docLinks.age], [docLinks.sing()],\\n[docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\\n[custom *link* text][docLinks.sing()]\\n[module], [module.age], [module.sing()],\\n[module.Person], [module.Person.name], [module.PersonList],\\n[custom *link* text][module.sing()]\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"PersonList\",\"isTypeAlias\":true},\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ExtendClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\"},\"summary\":\"Module methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\"},\"summary\":\"Module methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\"},\"summary\":\"Module methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\"},\"summary\":\"Module methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\"},\"summary\":\"Module properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\"},\"summary\":\"Module properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\"},\"summary\":\"Module properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\"},\"summary\":\"Module properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"baseModule/index.html\"},{\"name\":\"baseProperty\",\"kind\":5,\"url\":\"baseModule/index.html#baseProperty\",\"sig\":\": unknown\",\"parId\":1},{\"name\":\"baseMethod\",\"kind\":4,\"url\":\"baseModule/index.html#baseMethod()\",\"sig\":\"(): unknown\",\"parId\":1},{\"name\":\"BaseClass\",\"kind\":3,\"url\":\"baseModule/BaseClass.html\",\"parId\":1},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"classAnnotations/index.html\"},{\"name\":\"AnnotatedClss\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClss.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClssWithExpandableComment\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClssWithExpandableComment.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClass\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClass.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"classComments/index.html\"},{\"name\":\"Comments1\",\"kind\":3,\"url\":\"classComments/Comments1.html\",\"parId\":9},{\"name\":\"Comments2\",\"kind\":3,\"url\":\"classComments/Comments2.html\",\"parId\":9},{\"name\":\"Comments3\",\"kind\":3,\"url\":\"classComments/Comments3.html\",\"parId\":9},{\"name\":\"Comments4\",\"kind\":3,\"url\":\"classComments/Comments4.html\",\"parId\":9},{\"name\":\"Comments5\",\"kind\":3,\"url\":\"classComments/Comments5.html\",\"parId\":9},{\"name\":\"Comments6\",\"kind\":3,\"url\":\"classComments/Comments6.html\",\"parId\":9},{\"name\":\"Comments7\",\"kind\":3,\"url\":\"classComments/Comments7.html\",\"parId\":9},{\"name\":\"Comments8\",\"kind\":3,\"url\":\"classComments/Comments8.html\",\"parId\":9},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"classInheritance/index.html\"},{\"name\":\"MyClass1\",\"kind\":3,\"url\":\"classInheritance/MyClass1.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass1.html#property1\",\"sig\":\": Boolean\",\"parId\":19},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass1.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":19},{\"name\":\"MyClass2\",\"kind\":3,\"url\":\"classInheritance/MyClass2.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property1\",\"sig\":\": Boolean\",\"parId\":22},{\"name\":\"property2\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property2\",\"sig\":\": String\",\"parId\":22},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"method2\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method2()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"MyClass3\",\"kind\":3,\"url\":\"classInheritance/MyClass3.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass3.html#property1\",\"sig\":\": Boolean\",\"parId\":27},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass3.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":27},{\"name\":\"MyClass4\",\"kind\":3,\"url\":\"classInheritance/MyClass4.html\",\"parId\":18},{\"name\":\"property4\",\"kind\":5,\"url\":\"classInheritance/MyClass4.html#property4\",\"sig\":\": String\",\"parId\":30},{\"name\":\"method3\",\"kind\":4,\"url\":\"classInheritance/MyClass4.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":30},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"classMethodComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classMethodComments/Comments.html\",\"parId\":33},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method1()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method2()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method3()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method4()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method5()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method6()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method7()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"classMethodModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classMethodModifiers/Modifiers.html\",\"parId\":42},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodModifiers/Modifiers.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":43},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"classMethodTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html\",\"parId\":45},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method1()\",\"sig\":\"(): unknown\",\"parId\":46},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":46},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":46},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method4()\",\"sig\":\"(): String\",\"parId\":46},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":46},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":46},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":46},{\"name\":\"method8\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":46},{\"name\":\"method9\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":46},{\"name\":\"method10\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":46},{\"name\":\"method11\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":46},{\"name\":\"method12\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":46},{\"name\":\"method13\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":46},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"classMethodTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classMethodTypeReferences/MyClass.html\",\"parId\":60},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classMethodTypeReferences/TypeReferences.html\",\"parId\":60},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":62},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":62},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"classPropertyAnnotations/index.html\"},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":68},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":69},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":69},{\"name\":\"ClassWithAnnotatedProperty\",\"kind\":3,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html\",\"parId\":68},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":72},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"classPropertyComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classPropertyComments/Comments.html\",\"parId\":74},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property1\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property2\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property3\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property4\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property5\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property6\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property7\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"classPropertyModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classPropertyModifiers/Modifiers.html\",\"parId\":83},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property2\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property3\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property4\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"classPropertyTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html\",\"parId\":88},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property1\",\"sig\":\": unknown\",\"parId\":89},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property2\",\"sig\":\": Float\",\"parId\":89},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property3\",\"sig\":\": List<String>\",\"parId\":89},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property4\",\"sig\":\": Set<String>\",\"parId\":89},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":89},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property6\",\"sig\":\": String?\",\"parId\":89},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property7\",\"sig\":\": () -> String\",\"parId\":89},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property8\",\"sig\":\": String -> Int\",\"parId\":89},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":89},{\"name\":\"property10\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":89},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"classPropertyTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classPropertyTypeReferences/MyClass.html\",\"parId\":100},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classPropertyTypeReferences/TypeReferences.html\",\"parId\":100},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property1\",\"sig\":\": MyClass\",\"parId\":102},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":102},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":102},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":102},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property5\",\"sig\":\": MyClass?\",\"parId\":102},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":102},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":102},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":102},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":102},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"classTypeConstraints/index.html\"},{\"name\":\"emailAddress\",\"kind\":5,\"url\":\"classTypeConstraints/index.html#emailAddress\",\"sig\":\": unknown\",\"parId\":112},{\"name\":\"Person1\",\"kind\":3,\"url\":\"classTypeConstraints/Person1.html\",\"parId\":112},{\"name\":\"name\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#name\",\"sig\":\": String\",\"parId\":114},{\"name\":\"address\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#address\",\"sig\":\": Address\",\"parId\":114},{\"name\":\"Person2\",\"kind\":3,\"url\":\"classTypeConstraints/Person2.html\",\"parId\":112},{\"name\":\"email\",\"kind\":5,\"url\":\"classTypeConstraints/Person2.html#email\",\"sig\":\": String\",\"parId\":117},{\"name\":\"Address\",\"kind\":3,\"url\":\"classTypeConstraints/Address.html\",\"parId\":112},{\"name\":\"street\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#street\",\"sig\":\": String\",\"parId\":119},{\"name\":\"city\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#city\",\"sig\":\": String\",\"parId\":119},{\"name\":\"Project\",\"kind\":3,\"url\":\"classTypeConstraints/Project.html\",\"parId\":112},{\"name\":\"type\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#type\",\"sig\":\": String?\",\"parId\":122},{\"name\":\"contacts\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#contacts\",\"sig\":\": Map<String, String>\",\"parId\":122},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"docExampleSubject1/index.html\"},{\"name\":\"x\",\"kind\":5,\"url\":\"docExampleSubject1/index.html#x\",\"sig\":\": Int\",\"parId\":125},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"docExampleSubject2/index.html\"},{\"name\":\"y\",\"kind\":5,\"url\":\"docExampleSubject2/index.html#y\",\"sig\":\": Int\",\"parId\":127},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"docLinks/index.html\"},{\"name\":\"age\",\"kind\":5,\"url\":\"docLinks/index.html#age\",\"sig\":\": Int\",\"parId\":129},{\"name\":\"sing\",\"kind\":4,\"url\":\"docLinks/index.html#sing()\",\"sig\":\"(song): unknown\",\"parId\":129},{\"name\":\"Person\",\"kind\":3,\"url\":\"docLinks/Person.html\",\"parId\":129},{\"name\":\"name\",\"kind\":5,\"url\":\"docLinks/Person.html#name\",\"sig\":\": String\",\"parId\":132},{\"name\":\"call\",\"kind\":4,\"url\":\"docLinks/Person.html#call()\",\"sig\":\"(number): unknown\",\"parId\":132},{\"name\":\"PersonList\",\"kind\":2,\"url\":\"docLinks/index.html#PersonList\",\"parId\":129},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"methodAnnotations/index.html\"},{\"name\":\"mthod\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthod()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"mthodWithExpandableComment\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthodWithExpandableComment()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"method\",\"kind\":4,\"url\":\"methodAnnotations/index.html#method()\",\"sig\":\"(): Int\",\"parId\":136,\"aka\":[\"function\"]},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"moduleExtend/index.html\"},{\"name\":\"extendProperty\",\"kind\":5,\"url\":\"moduleExtend/index.html#extendProperty\",\"sig\":\": unknown\",\"parId\":141},{\"name\":\"extendMethod\",\"kind\":4,\"url\":\"moduleExtend/index.html#extendMethod()\",\"sig\":\"(): unknown\",\"parId\":141},{\"name\":\"ExtendClass\",\"kind\":3,\"url\":\"moduleExtend/ExtendClass.html\",\"parId\":141},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"moduleMethodCommentInheritance/index.html\"},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodCommentInheritance/index.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":146},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"moduleMethodComments/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method1()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method2()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method3()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method4()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method5()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method6()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method7()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"moduleMethodModifiers/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodModifiers/index.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":156},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"moduleMethodTypeAnnotations/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method1()\",\"sig\":\"(): unknown\",\"parId\":158},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":158},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":158},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method4()\",\"sig\":\"(): String\",\"parId\":158},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":158},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":158},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":158},{\"name\":\"method8\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":158},{\"name\":\"method9\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":158},{\"name\":\"method10\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":158},{\"name\":\"method11\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":158},{\"name\":\"method12\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":158},{\"name\":\"method13\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":158},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"moduleMethodTypeReferences/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":172},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":172},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"moduleMethodTypeReferences/MyClass.html\",\"parId\":172},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"modulePropertyAnnotations/index.html\"},{\"name\":\"prperty\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prperty\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"prpertyWithExpandableComment\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prpertyWithExpandableComment\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"property\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#property\",\"sig\":\": unknown\",\"parId\":179,\"aka\":[\"field\",\"item\"]},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation1\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation1\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation2\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation2\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":179},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":186},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":186},{\"name\":\"UserDefinedAnnotation1\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html#nested\",\"sig\":\": UserDefinedAnnotation\",\"parId\":189},{\"name\":\"UserDefinedAnnotation2\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html#nested\",\"sig\":\": UserDefinedAnnotation2?\",\"parId\":191},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"modulePropertyCommentInheritance/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyCommentInheritance/index.html#property3\",\"sig\":\": Float\",\"parId\":193},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"modulePropertyComments/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property1\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property2\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property3\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property4\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property5\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property6\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property7\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property8\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property9\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property10\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"modulePropertyModifiers/index.html\"},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyModifiers/index.html#property2\",\"sig\":\": Float\",\"parId\":206},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"modulePropertyTypeAnnotations/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property1\",\"sig\":\": unknown\",\"parId\":208},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property2\",\"sig\":\": Float\",\"parId\":208},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property3\",\"sig\":\": List<String>\",\"parId\":208},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property4\",\"sig\":\": Set<String>\",\"parId\":208},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":208},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property6\",\"sig\":\": String?\",\"parId\":208},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property7\",\"sig\":\": () -> String\",\"parId\":208},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property8\",\"sig\":\": String -> Int\",\"parId\":208},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":208},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":208},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"modulePropertyTypeReferences/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property1\",\"sig\":\": MyClass\",\"parId\":219},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":219},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":219},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":219},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property5\",\"sig\":\": MyClass?\",\"parId\":219},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":219},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":219},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":219},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":219},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"modulePropertyTypeReferences/MyClass.html\",\"parId\":219},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"moduleTypes1/index.html\"},{\"name\":\"n\",\"kind\":5,\"url\":\"moduleTypes1/index.html#n\",\"sig\":\": Int\",\"parId\":230},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"moduleTypes2/index.html\"},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":232},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":232},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":232},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":232},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":232},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x6\",\"sig\":\": module\",\"parId\":232},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x7\",\"sig\":\": List<module>\",\"parId\":232},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x8\",\"sig\":\": String|module|Int\",\"parId\":232},{\"name\":\"Foo\",\"kind\":3,\"url\":\"moduleTypes2/Foo.html\",\"parId\":232},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":241},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":241},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":241},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":241},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":241},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x6\",\"sig\":\": module\",\"parId\":241},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x7\",\"sig\":\": List<module>\",\"parId\":241},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x8\",\"sig\":\": String|module|Int\",\"parId\":241},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"nested/nested2/nestedModule/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"nested/nested2/nestedModule/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":250},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"nested/nested2/nestedModule/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":250},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"nested/nested2/nestedModule/MyClass.html\",\"parId\":250},{\"name\":\"referenceToExternalPackage\",\"kind\":1,\"url\":\"ternalPackage/index.html\"},{\"name\":\"prop\",\"kind\":5,\"url\":\"ternalPackage/index.html#prop\",\"sig\":\": Class Two {}\",\"parId\":254},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"shared/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"shared/MyClass.html\",\"parId\":256},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"typealiases/index.html\"},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/index.html#uint\",\"sig\":\": UInt\",\"parId\":258},{\"name\":\"uints\",\"kind\":5,\"url\":\"typealiases/index.html#uints\",\"sig\":\": List<UInt>\",\"parId\":258},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/index.html#email\",\"sig\":\": Email\",\"parId\":258},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/index.html#emails\",\"sig\":\": List<Email>\",\"parId\":258},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/index.html#send()\",\"sig\":\"(email): Email\",\"parId\":258},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases/Person.html\",\"parId\":258},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/Person.html#uint\",\"sig\":\": UInt\",\"parId\":264},{\"name\":\"list\",\"kind\":5,\"url\":\"typealiases/Person.html#list\",\"sig\":\": List<UInt>\",\"parId\":264},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/Person.html#email\",\"sig\":\": Email\",\"parId\":264},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/Person.html#emails\",\"sig\":\": List<Email>\",\"parId\":264},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/Person.html#send()\",\"sig\":\"(email): Email\",\"parId\":264},{\"name\":\"Email\",\"kind\":2,\"url\":\"typealiases/index.html#Email\",\"parId\":258,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"typealiases2/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/index.html#res1\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/index.html#res2\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/index.html#res3\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/index.html#res4\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/index.html#res5\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/index.html#res6\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/index.html#res7\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/index.html#res8\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/index.html#res9\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases2/Person.html\",\"parId\":271},{\"name\":\"name\",\"kind\":5,\"url\":\"typealiases2/Person.html#name\",\"sig\":\": String\",\"parId\":281},{\"name\":\"Foo\",\"kind\":3,\"url\":\"typealiases2/Foo.html\",\"parId\":271},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res1\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res2\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res3\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res4\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res5\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res6\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res7\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res8\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res9\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"List2\",\"kind\":2,\"url\":\"typealiases2/index.html#List2\",\"parId\":271},{\"name\":\"Map2\",\"kind\":2,\"url\":\"typealiases2/index.html#Map2\",\"parId\":271},{\"name\":\"StringMap\",\"kind\":2,\"url\":\"typealiases2/index.html#StringMap\",\"parId\":271},{\"name\":\"MMap\",\"kind\":2,\"url\":\"typealiases2/index.html#MMap\",\"parId\":271},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"typeAliasInheritance/index.html\"},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#email2\",\"sig\":\": Email\",\"parId\":297},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#emails2\",\"sig\":\": List<Email>\",\"parId\":297},{\"name\":\"Person2\",\"kind\":3,\"url\":\"typeAliasInheritance/Person2.html\",\"parId\":297},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#email2\",\"sig\":\": Email\",\"parId\":300},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#emails2\",\"sig\":\": List<Email>\",\"parId\":300},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"unionTypes/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"unionTypes/index.html#res1\",\"sig\":\": Boolean|Number\",\"parId\":303},{\"name\":\"res2\",\"kind\":5,\"url\":\"unionTypes/index.html#res2\",\"sig\":\": \\\\\\\"foo\\\\\\\"|\\\\\\\"bar\\\\\\\"|\\\\\\\"baz\\\\\\\"\",\"parId\":303},{\"name\":\"res3\",\"kind\":5,\"url\":\"unionTypes/index.html#res3\",\"sig\":\": Boolean|List<String>\",\"parId\":303},{\"name\":\"res4\",\"kind\":5,\"url\":\"unionTypes/index.html#res4\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res5\",\"kind\":5,\"url\":\"unionTypes/index.html#res5\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res6\",\"kind\":5,\"url\":\"unionTypes/index.html#res6\",\"sig\":\": Boolean|List<String>?|Number\",\"parId\":303},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"unlistedClass/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedClass/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":310},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedClass/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":310},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"unlistedMethod/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedMethod/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":313},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedMethod/MyClass.html\",\"parId\":313},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"unlistedProperty/index.html\"},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedProperty/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":316},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedProperty/MyClass.html\",\"parId\":316}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/shared/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/shared:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/shared/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.shared</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/shared/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>shared (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/shared/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.shared<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.shared</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/shared.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/shared.pkl\">shared.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/shared.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/ternalPackage/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>referenceToExternalPackage (com.package1xternalPackage:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/ternalPackage/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"referenceToExternalPackage\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">referenceToExternalPackage<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">referenceToExternalPackage</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/ternalPackage.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/ternalPackage.pkl\">ternalPackage.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"../../../com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.html\" class=\"name-ref\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/package1/ternalPackage.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\">Module3.<code>property {} four</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typeAliasInheritance/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/typeAliasInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typeAliasInheritance/Person2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typeAliasInheritance</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typeAliasInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typeAliasInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typeAliasInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typeAliasInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typeAliasInheritance</span> extends <a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typeAliasInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typeAliasInheritance.pkl\">typeAliasInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/Person.html\" class=\"name-decl\">Person</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typealiases/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases/Person.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typealiases/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.typealiases</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases.pkl\">typealiases.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typealiases2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases2/Foo.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typealiases2/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases2/Person.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/typealiases2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases2/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typealiases2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases2.pkl\">typealiases2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"List2\" class=\"anchor\"> </div>\n            <div id=\"List2.E\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#List2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#List2\" class=\"name-decl\">List2</a>&lt;<a class=\"param1\">E</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<span class=\"name-ref\">E</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Map2\" class=\"anchor\"> </div>\n            <div id=\"Map2.V\" class=\"anchor-param1\"> </div>\n            <div id=\"Map2.K\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#Map2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Map2\" class=\"name-decl\">Map2</a>&lt;<a class=\"param1\">V</a>, <a class=\"param2\">K</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">K</span>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"StringMap\" class=\"anchor\"> </div>\n            <div id=\"StringMap.V\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#StringMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#StringMap\" class=\"name-decl\">StringMap</a>&lt;<a class=\"param1\">V</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MMap\" class=\"anchor\"> </div>\n            <div id=\"MMap.X\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#MMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#MMap\" class=\"name-decl\">MMap</a>&lt;<a class=\"param1\">X</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">X</span>, <span class=\"name-ref\">X</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/unionTypes/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unionTypes (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unionTypes/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unionTypes\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unionTypes<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unionTypes</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unionTypes.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unionTypes.pkl\">unionTypes.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: &quot;foo&quot;|&quot;bar&quot;|&quot;baz&quot;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/unlistedClass/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedClass (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedClass/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedClass.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedClass.pkl\">unlistedClass.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/unlistedMethod/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedMethod:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedMethod/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedMethod</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/unlistedMethod/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedMethod (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedMethod/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedMethod<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedMethod</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedMethod.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedMethod.pkl\">unlistedMethod.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/unlistedProperty/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedProperty:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedProperty/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedProperty</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/1.2.3/unlistedProperty/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedProperty (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedProperty/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedProperty.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedProperty.pkl\">unlistedProperty.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/Module Containing Spaces/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module Containing Spaces (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.Module Containing Spaces\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.`Module Containing Spaces`<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.`Module Containing Spaces`</span></div>\n        <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/Module%20Containing%20Spaces.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/Module%20Containing%20Spaces.pkl\">Module Containing Spaces.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/baseModule/BaseClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>BaseClass (com.package1/baseModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/baseModule/BaseClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-class-name=\"BaseClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.baseModule</a>\n      <h1 id=\"declaration-title\">BaseClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">BaseClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/baseModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>baseModule (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/baseModule/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.baseModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.baseModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/baseModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/baseModule.pkl\">baseModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"BaseClass.html\" class=\"name-decl\">BaseClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classAnnotations/AnnotatedClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClass (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClass</span></div>\n        <div class=\"doc-comment\">Deprecated.</div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classAnnotations/AnnotatedClss.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClss (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClss.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClss\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClss<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClss</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClss</code> thought to have a correctly spelled name.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classAnnotations/AnnotatedClssWithExpandableComment.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClssWithExpandableComment (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClssWithExpandableComment\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClssWithExpandableComment<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClssWithExpandableComment</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClssWithExpandableComment</code> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classAnnotations.pkl\">classAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"AnnotatedClss\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClss\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClss.html\" class=\"name-decl\">AnnotatedClss</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClssWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClssWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClssWithExpandableComment.html\" class=\"name-decl\">AnnotatedClssWithExpandableComment</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClass.html\" class=\"name-decl\">AnnotatedClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated.</div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments1 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments2 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments3 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments3.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments3</span></div>\n        <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments4 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments4.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments4</span></div>\n        <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph2, line2).</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments5.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments5 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments5.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments5\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments5<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments5</span></div>\n        <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments6.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments6 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments6.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments6\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments6<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments6</span></div>\n        <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments7.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments7 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments7.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments7\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments7<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments7</span></div>\n        <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/Comments8.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments8 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/Comments8.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments8\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments8<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments8</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Installation</h2>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classComments.pkl\">classComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>git status</code></td>\n<td>List all <em>new or modified</em> files</td>\n</tr>\n<tr>\n<td><code>git diff</code></td>\n<td>Show file differences that <strong>haven't been</strong> staged</td>\n</tr>\n</tbody>\n</table></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments1.html\" class=\"name-decl\">Comments1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments2.html\" class=\"name-decl\">Comments2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments3.html\" class=\"name-decl\">Comments3</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments4.html\" class=\"name-decl\">Comments4</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments5\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments5.html\" class=\"name-decl\">Comments5</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments6\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments6.html\" class=\"name-decl\">Comments6</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments7\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments7.html\" class=\"name-decl\">Comments7</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments8\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments8.html\" class=\"name-decl\">Comments8</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classInheritance/MyClass1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass1 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass1.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classInheritance/MyClass2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass2 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">MyClass2</span> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classInheritance/MyClass3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass3 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass3.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass3</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classInheritance/MyClass4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass4 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/MyClass4.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass4</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classInheritance</span></div>\n        <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classInheritance.pkl\">classInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass1.html\" class=\"name-decl\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass2.html\" class=\"name-decl\">MyClass2</a> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass3.html\" class=\"name-decl\">MyClass3</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass4.html\" class=\"name-decl\">MyClass4</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classMethodComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodComments/Comments.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodComments.pkl\">classMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classMethodModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodModifiers/Modifiers.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodModifiers.pkl\">classMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classMethodTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeAnnotations.pkl\">classMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classMethodTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeReferences.pkl\">classMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyAnnotations/ClassWithAnnotatedProperty.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ClassWithAnnotatedProperty (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"ClassWithAnnotatedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">ClassWithAnnotatedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ClassWithAnnotatedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyAnnotations.pkl\">classPropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ClassWithAnnotatedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ClassWithAnnotatedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ClassWithAnnotatedProperty.html\" class=\"name-decl\">ClassWithAnnotatedProperty</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classPropertyComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyComments/Comments.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyComments.pkl\">classPropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classPropertyModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyModifiers/Modifiers.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with multiple modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyModifiers.pkl\">classPropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classPropertyTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl\">classPropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classPropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classPropertyTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeReferences.pkl\">classPropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classTypeConstraints/Address.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Address (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Address.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Address\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Address<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Address</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"street\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#street\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">street</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"city\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#city\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">city</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classTypeConstraints/Person1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person1 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Person1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(length &gt;= 3)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"address\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">address</span>: <a href=\"Address.html\" class=\"name-ref\">Address</a>(street != city)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classTypeConstraints/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Person2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classTypeConstraints/Project.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Project (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/Project.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Project\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Project<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Project</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"type\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#type\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">type</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(oneOf(List(&quot;open-source&quot;, &quot;closed-source&quot;)))?<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"contacts\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#contacts\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">contacts</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty), <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)&gt;(length &gt; 10, length &lt; 20)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/classTypeConstraints/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classTypeConstraints (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/classTypeConstraints/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classTypeConstraints<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classTypeConstraints</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classTypeConstraints.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classTypeConstraints.pkl\">classTypeConstraints.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emailAddress\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emailAddress\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emailAddress</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person1.html\" class=\"name-decl\">Person1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Address\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Address.html\" class=\"name-decl\">Address</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Project\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Project\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Project.html\" class=\"name-decl\">Project</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/docExampleSubject1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docExampleSubject1/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject1.pkl\">docExampleSubject1.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a>, <a href=\"https://example.com/package1/docExample2.pkl\">docExample2</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/docExampleSubject2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docExampleSubject2/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject2.pkl\">docExampleSubject2.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"y\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#y\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">y</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/docLinks/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/docLinks:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docLinks/Person.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.docLinks</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <code>Person.name</code>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"call()\" class=\"anchor\"> </div>\n            <div id=\"call().number\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#call()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">call</span>(<span class=\"param1\">number</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code>\n<code>number</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/docLinks/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docLinks (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/docLinks/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docLinks<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docLinks</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docLinks.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docLinks.pkl\">docLinks.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"age\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#age\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">age</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<code>age</code>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"sing()\" class=\"anchor\"> </div>\n            <div id=\"sing().song\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#sing()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">sing</span>(<span class=\"param1\">song</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <code>sing()</code>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>song</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"PersonList\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#PersonList\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#PersonList\" class=\"name-decl\">PersonList</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>PersonList</code>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package1 (1.2.3) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../data/com.package1/1.2.3/index.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package1</span></div>\n        <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>package1-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.2.3</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/\">https://example.com/package1/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package1/\">https://issues.apple.com/package1/</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../com.package2/4.5.6/index.html\">com.package2:4.5.6</a>, <span>com.externalpackage:7.8.9</span></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Docs for Package 1.</p><ul>\n<li>\n<p><a href=\"docLinks/index.html\"><code>docLinks</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#age\"><code>docLinks.age</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#sing()\"><code>docLinks.sing()</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html\"><code>docLinks.Person</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html#name\"><code>docLinks.Person.name</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#PersonList\"><code>docLinks.PersonList</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a></p>\n</li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1.Module%20Containing%20Spaces\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.Module%20Containing%20Spaces\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module%20Containing%20Spaces/index.html\">com.package1.`Module Containing Spaces`</a></div>\n                <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.baseModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.baseModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./baseModule/index.html\">com.package1.baseModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classAnnotations/index.html\">com.package1.classAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classComments/index.html\">com.package1.classComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classInheritance/index.html\">com.package1.classInheritance</a></div>\n                <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodComments/index.html\">com.package1.classMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodModifiers/index.html\">com.package1.classMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeAnnotations/index.html\">com.package1.classMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeReferences/index.html\">com.package1.classMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyAnnotations/index.html\">com.package1.classPropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyComments/index.html\">com.package1.classPropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyModifiers/index.html\">com.package1.classPropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeAnnotations/index.html\">com.package1.classPropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeReferences/index.html\">com.package1.classPropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classTypeConstraints\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classTypeConstraints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classTypeConstraints/index.html\">com.package1.classTypeConstraints</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject1/index.html\">com.package1.docExampleSubject1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject2/index.html\">com.package1.docExampleSubject2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docLinks\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docLinks\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docLinks/index.html\">com.package1.docLinks</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"shared/index.html\"><code>shared</code></a>, <a href=\"shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"docLinks/index.html#age\"><code>age</code></a>, <a href=\"docLinks/index.html#sing()\"><code>sing()</code></a>, <a href=\"docLinks/Person.html\"><code>Person</code></a>, <a href=\"docLinks/Person.html#name\"><code>Person.name</code></a>, <a href=\"docLinks/Person.html#call()\"><code>Person.call()</code></a>, <a href=\"docLinks/index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.methodAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.methodAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./methodAnnotations/index.html\">com.package1.methodAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleComments/index.html\">com.package1.moduleComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleExtend\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleExtend\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleExtend/index.html\">com.package1.moduleExtend</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleInfoAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleInfoAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleInfoAnnotation/index.html\">com.package1.moduleInfoAnnotation</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodCommentInheritance/index.html\">com.package1.moduleMethodCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodComments/index.html\">com.package1.moduleMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodModifiers/index.html\">com.package1.moduleMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeAnnotations/index.html\">com.package1.moduleMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeReferences/index.html\">com.package1.moduleMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyAnnotations/index.html\">com.package1.modulePropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyCommentInheritance/index.html\">com.package1.modulePropertyCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyComments/index.html\">com.package1.modulePropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyModifiers/index.html\">com.package1.modulePropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeAnnotations/index.html\">com.package1.modulePropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeReferences/index.html\">com.package1.modulePropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes1/index.html\">com.package1.moduleTypes1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes2/index.html\">com.package1.moduleTypes2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.nested.nested2.nestedModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.nested.nested2.nestedModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./nested/nested2/nestedModule/index.html\">com.package1.nested.nested2.nestedModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"referenceToExternalPackage\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#referenceToExternalPackage\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./ternalPackage/index.html\">referenceToExternalPackage</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.shared\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.shared\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./shared/index.html\">com.package1.shared</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases/index.html\">com.package1.typealiases</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases2/index.html\">com.package1.typealiases2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typeAliasInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typeAliasInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typeAliasInheritance/index.html\">com.package1.typeAliasInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unionTypes\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unionTypes\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unionTypes/index.html\">com.package1.unionTypes</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedClass/index.html\">com.package1.unlistedClass</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedMethod\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedMethod\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedMethod/index.html\">com.package1.unlistedMethod</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedProperty/index.html\">com.package1.unlistedProperty</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/methodAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>methodAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/methodAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.methodAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.methodAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.methodAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/methodAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/methodAnnotations.pkl\">methodAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthod()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthod</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>mthod()</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthodWithExpandableComment()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthodWithExpandableComment()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthodWithExpandableComment</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#mthod()\"><code>mthod()</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#method()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleComments.pkl\">moduleComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleExtend/ExtendClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ExtendClass (com.package1/moduleExtend:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleExtend/ExtendClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-class-name=\"ExtendClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleExtend</a>\n      <h1 id=\"declaration-title\">ExtendClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ExtendClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleExtend/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleExtend (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleExtend/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleExtend<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleExtend</span> extends <a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleExtend.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleExtend.pkl\">moduleExtend.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../baseModule/BaseClass.html\" class=\"name-decl\">BaseClass</a><span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ExtendClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ExtendClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ExtendClass.html\" class=\"name-decl\">ExtendClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleInfoAnnotation/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleInfoAnnotation (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleInfoAnnotation/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleInfoAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleInfoAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleInfoAnnotation</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleInfoAnnotation.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleInfoAnnotation.pkl\">moduleInfoAnnotation.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleMethodCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodCommentInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodCommentInheritance</span> extends <a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl\">moduleMethodCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.moduleMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodComments.pkl\">moduleMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodModifiers.pkl\">moduleMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl\">moduleMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/moduleMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeReferences.pkl\">moduleMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyAnnotations/UserDefinedAnnotation1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation1 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation1</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation.html\" class=\"name-ref\">UserDefinedAnnotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyAnnotations/UserDefinedAnnotation2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation2 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation2</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation2.html\" class=\"name-ref\">UserDefinedAnnotation2</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyAnnotations.pkl\">modulePropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prperty\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>prperty</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prpertyWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prpertyWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prpertyWithExpandableComment</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#prperty\"><code>prperty</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation1.html\" class=\"name-decl\">UserDefinedAnnotation1</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation2.html\" class=\"name-decl\">UserDefinedAnnotation2</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyCommentInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyCommentInheritance</span> extends <a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl\">modulePropertyCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyComments/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.modulePropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyComments.pkl\">modulePropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyModifiers/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyModifiers.pkl\">modulePropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl\">modulePropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/modulePropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/modulePropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeReferences.pkl\">modulePropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleTypes1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleTypes1/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes1.pkl\">moduleTypes1.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"n\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#n\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">n</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleTypes2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/moduleTypes2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleTypes2/Foo.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleTypes2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/moduleTypes2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/moduleTypes2/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes2.pkl\">moduleTypes2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/nested/nested2/nestedModule/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/nested/nested2/nestedModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.nested.nested2.nestedModule</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/nested/nested2/nestedModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>nestedModule (com.package1/nested/nested2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.nested.nested2.nestedModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.nested.nested2.nestedModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/nested/nested2/nestedModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/nested/nested2/nestedModule.pkl\">nestedModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\"},\"summary\":\"Docs for Package 1.\",\"deprecation\":\"com.package1 is deprecated\",\"sourceCode\":\"https://example.com/package1/\",\"sourceCodeUrlScheme\":\"https://example.com/package1%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"}},{\"ref\":{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\"},\"summary\":\"This is a module that has spaces in its name.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"BaseClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClss\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClssWithExpandableComment\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments4\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments5\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments6\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments7\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments8\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\"},\"summary\":\"Class inheritance involving abstract, open, and final classes.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass3\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass4\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\"},\"summary\":\"Class methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\"},\"summary\":\"Class methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\"},\"summary\":\"Class methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\"},\"summary\":\"Class methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ClassWithAnnotatedProperty\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\"},\"summary\":\"Class properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\"},\"summary\":\"Class properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\"},\"summary\":\"Class properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\"},\"summary\":\"Class properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Project\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\"},\"summary\":\"[external1], [external1.MyClass]\\n[shared], [shared.MyClass]\\n[age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\\n[docLinks], [docLinks.age], [docLinks.sing()],\\n[docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\\n[custom *link* text][docLinks.sing()]\\n[module], [module.age], [module.sing()],\\n[module.Person], [module.Person.name], [module.PersonList],\\n[custom *link* text][module.sing()]\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"PersonList\",\"isTypeAlias\":true},\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ExtendClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\"},\"summary\":\"Module methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\"},\"summary\":\"Module methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\"},\"summary\":\"Module methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\"},\"summary\":\"Module methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\"},\"summary\":\"Module properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\"},\"summary\":\"Module properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\"},\"summary\":\"Module properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\"},\"summary\":\"Module properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"baseModule/index.html\"},{\"name\":\"baseProperty\",\"kind\":5,\"url\":\"baseModule/index.html#baseProperty\",\"sig\":\": unknown\",\"parId\":1},{\"name\":\"baseMethod\",\"kind\":4,\"url\":\"baseModule/index.html#baseMethod()\",\"sig\":\"(): unknown\",\"parId\":1},{\"name\":\"BaseClass\",\"kind\":3,\"url\":\"baseModule/BaseClass.html\",\"parId\":1},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"classAnnotations/index.html\"},{\"name\":\"AnnotatedClss\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClss.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClssWithExpandableComment\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClssWithExpandableComment.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClass\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClass.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"classComments/index.html\"},{\"name\":\"Comments1\",\"kind\":3,\"url\":\"classComments/Comments1.html\",\"parId\":9},{\"name\":\"Comments2\",\"kind\":3,\"url\":\"classComments/Comments2.html\",\"parId\":9},{\"name\":\"Comments3\",\"kind\":3,\"url\":\"classComments/Comments3.html\",\"parId\":9},{\"name\":\"Comments4\",\"kind\":3,\"url\":\"classComments/Comments4.html\",\"parId\":9},{\"name\":\"Comments5\",\"kind\":3,\"url\":\"classComments/Comments5.html\",\"parId\":9},{\"name\":\"Comments6\",\"kind\":3,\"url\":\"classComments/Comments6.html\",\"parId\":9},{\"name\":\"Comments7\",\"kind\":3,\"url\":\"classComments/Comments7.html\",\"parId\":9},{\"name\":\"Comments8\",\"kind\":3,\"url\":\"classComments/Comments8.html\",\"parId\":9},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"classInheritance/index.html\"},{\"name\":\"MyClass1\",\"kind\":3,\"url\":\"classInheritance/MyClass1.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass1.html#property1\",\"sig\":\": Boolean\",\"parId\":19},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass1.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":19},{\"name\":\"MyClass2\",\"kind\":3,\"url\":\"classInheritance/MyClass2.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property1\",\"sig\":\": Boolean\",\"parId\":22},{\"name\":\"property2\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property2\",\"sig\":\": String\",\"parId\":22},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"method2\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method2()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"MyClass3\",\"kind\":3,\"url\":\"classInheritance/MyClass3.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass3.html#property1\",\"sig\":\": Boolean\",\"parId\":27},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass3.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":27},{\"name\":\"MyClass4\",\"kind\":3,\"url\":\"classInheritance/MyClass4.html\",\"parId\":18},{\"name\":\"property4\",\"kind\":5,\"url\":\"classInheritance/MyClass4.html#property4\",\"sig\":\": String\",\"parId\":30},{\"name\":\"method3\",\"kind\":4,\"url\":\"classInheritance/MyClass4.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":30},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"classMethodComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classMethodComments/Comments.html\",\"parId\":33},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method1()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method2()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method3()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method4()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method5()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method6()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method7()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"classMethodModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classMethodModifiers/Modifiers.html\",\"parId\":42},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodModifiers/Modifiers.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":43},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"classMethodTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html\",\"parId\":45},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method1()\",\"sig\":\"(): unknown\",\"parId\":46},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":46},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":46},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method4()\",\"sig\":\"(): String\",\"parId\":46},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":46},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":46},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":46},{\"name\":\"method8\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":46},{\"name\":\"method9\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":46},{\"name\":\"method10\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":46},{\"name\":\"method11\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":46},{\"name\":\"method12\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":46},{\"name\":\"method13\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":46},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"classMethodTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classMethodTypeReferences/MyClass.html\",\"parId\":60},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classMethodTypeReferences/TypeReferences.html\",\"parId\":60},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":62},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":62},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"classPropertyAnnotations/index.html\"},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":68},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":69},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":69},{\"name\":\"ClassWithAnnotatedProperty\",\"kind\":3,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html\",\"parId\":68},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":72},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"classPropertyComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classPropertyComments/Comments.html\",\"parId\":74},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property1\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property2\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property3\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property4\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property5\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property6\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property7\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"classPropertyModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classPropertyModifiers/Modifiers.html\",\"parId\":83},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property2\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property3\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property4\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"classPropertyTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html\",\"parId\":88},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property1\",\"sig\":\": unknown\",\"parId\":89},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property2\",\"sig\":\": Float\",\"parId\":89},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property3\",\"sig\":\": List<String>\",\"parId\":89},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property4\",\"sig\":\": Set<String>\",\"parId\":89},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":89},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property6\",\"sig\":\": String?\",\"parId\":89},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property7\",\"sig\":\": () -> String\",\"parId\":89},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property8\",\"sig\":\": String -> Int\",\"parId\":89},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":89},{\"name\":\"property10\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":89},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"classPropertyTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classPropertyTypeReferences/MyClass.html\",\"parId\":100},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classPropertyTypeReferences/TypeReferences.html\",\"parId\":100},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property1\",\"sig\":\": MyClass\",\"parId\":102},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":102},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":102},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":102},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property5\",\"sig\":\": MyClass?\",\"parId\":102},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":102},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":102},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":102},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":102},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"classTypeConstraints/index.html\"},{\"name\":\"emailAddress\",\"kind\":5,\"url\":\"classTypeConstraints/index.html#emailAddress\",\"sig\":\": unknown\",\"parId\":112},{\"name\":\"Person1\",\"kind\":3,\"url\":\"classTypeConstraints/Person1.html\",\"parId\":112},{\"name\":\"name\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#name\",\"sig\":\": String\",\"parId\":114},{\"name\":\"address\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#address\",\"sig\":\": Address\",\"parId\":114},{\"name\":\"Person2\",\"kind\":3,\"url\":\"classTypeConstraints/Person2.html\",\"parId\":112},{\"name\":\"email\",\"kind\":5,\"url\":\"classTypeConstraints/Person2.html#email\",\"sig\":\": String\",\"parId\":117},{\"name\":\"Address\",\"kind\":3,\"url\":\"classTypeConstraints/Address.html\",\"parId\":112},{\"name\":\"street\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#street\",\"sig\":\": String\",\"parId\":119},{\"name\":\"city\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#city\",\"sig\":\": String\",\"parId\":119},{\"name\":\"Project\",\"kind\":3,\"url\":\"classTypeConstraints/Project.html\",\"parId\":112},{\"name\":\"type\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#type\",\"sig\":\": String?\",\"parId\":122},{\"name\":\"contacts\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#contacts\",\"sig\":\": Map<String, String>\",\"parId\":122},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"docExampleSubject1/index.html\"},{\"name\":\"x\",\"kind\":5,\"url\":\"docExampleSubject1/index.html#x\",\"sig\":\": Int\",\"parId\":125},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"docExampleSubject2/index.html\"},{\"name\":\"y\",\"kind\":5,\"url\":\"docExampleSubject2/index.html#y\",\"sig\":\": Int\",\"parId\":127},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"docLinks/index.html\"},{\"name\":\"age\",\"kind\":5,\"url\":\"docLinks/index.html#age\",\"sig\":\": Int\",\"parId\":129},{\"name\":\"sing\",\"kind\":4,\"url\":\"docLinks/index.html#sing()\",\"sig\":\"(song): unknown\",\"parId\":129},{\"name\":\"Person\",\"kind\":3,\"url\":\"docLinks/Person.html\",\"parId\":129},{\"name\":\"name\",\"kind\":5,\"url\":\"docLinks/Person.html#name\",\"sig\":\": String\",\"parId\":132},{\"name\":\"call\",\"kind\":4,\"url\":\"docLinks/Person.html#call()\",\"sig\":\"(number): unknown\",\"parId\":132},{\"name\":\"PersonList\",\"kind\":2,\"url\":\"docLinks/index.html#PersonList\",\"parId\":129},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"methodAnnotations/index.html\"},{\"name\":\"mthod\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthod()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"mthodWithExpandableComment\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthodWithExpandableComment()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"method\",\"kind\":4,\"url\":\"methodAnnotations/index.html#method()\",\"sig\":\"(): Int\",\"parId\":136,\"aka\":[\"function\"]},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"moduleExtend/index.html\"},{\"name\":\"extendProperty\",\"kind\":5,\"url\":\"moduleExtend/index.html#extendProperty\",\"sig\":\": unknown\",\"parId\":141},{\"name\":\"extendMethod\",\"kind\":4,\"url\":\"moduleExtend/index.html#extendMethod()\",\"sig\":\"(): unknown\",\"parId\":141},{\"name\":\"ExtendClass\",\"kind\":3,\"url\":\"moduleExtend/ExtendClass.html\",\"parId\":141},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"moduleMethodCommentInheritance/index.html\"},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodCommentInheritance/index.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":146},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"moduleMethodComments/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method1()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method2()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method3()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method4()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method5()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method6()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method7()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"moduleMethodModifiers/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodModifiers/index.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":156},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"moduleMethodTypeAnnotations/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method1()\",\"sig\":\"(): unknown\",\"parId\":158},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":158},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":158},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method4()\",\"sig\":\"(): String\",\"parId\":158},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":158},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":158},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":158},{\"name\":\"method8\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":158},{\"name\":\"method9\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":158},{\"name\":\"method10\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":158},{\"name\":\"method11\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":158},{\"name\":\"method12\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":158},{\"name\":\"method13\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":158},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"moduleMethodTypeReferences/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":172},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":172},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"moduleMethodTypeReferences/MyClass.html\",\"parId\":172},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"modulePropertyAnnotations/index.html\"},{\"name\":\"prperty\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prperty\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"prpertyWithExpandableComment\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prpertyWithExpandableComment\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"property\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#property\",\"sig\":\": unknown\",\"parId\":179,\"aka\":[\"field\",\"item\"]},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation1\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation1\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation2\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation2\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":179},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":186},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":186},{\"name\":\"UserDefinedAnnotation1\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html#nested\",\"sig\":\": UserDefinedAnnotation\",\"parId\":189},{\"name\":\"UserDefinedAnnotation2\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html#nested\",\"sig\":\": UserDefinedAnnotation2?\",\"parId\":191},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"modulePropertyCommentInheritance/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyCommentInheritance/index.html#property3\",\"sig\":\": Float\",\"parId\":193},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"modulePropertyComments/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property1\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property2\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property3\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property4\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property5\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property6\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property7\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property8\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property9\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property10\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"modulePropertyModifiers/index.html\"},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyModifiers/index.html#property2\",\"sig\":\": Float\",\"parId\":206},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"modulePropertyTypeAnnotations/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property1\",\"sig\":\": unknown\",\"parId\":208},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property2\",\"sig\":\": Float\",\"parId\":208},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property3\",\"sig\":\": List<String>\",\"parId\":208},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property4\",\"sig\":\": Set<String>\",\"parId\":208},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":208},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property6\",\"sig\":\": String?\",\"parId\":208},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property7\",\"sig\":\": () -> String\",\"parId\":208},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property8\",\"sig\":\": String -> Int\",\"parId\":208},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":208},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":208},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"modulePropertyTypeReferences/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property1\",\"sig\":\": MyClass\",\"parId\":219},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":219},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":219},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":219},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property5\",\"sig\":\": MyClass?\",\"parId\":219},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":219},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":219},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":219},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":219},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"modulePropertyTypeReferences/MyClass.html\",\"parId\":219},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"moduleTypes1/index.html\"},{\"name\":\"n\",\"kind\":5,\"url\":\"moduleTypes1/index.html#n\",\"sig\":\": Int\",\"parId\":230},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"moduleTypes2/index.html\"},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":232},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":232},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":232},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":232},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":232},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x6\",\"sig\":\": module\",\"parId\":232},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x7\",\"sig\":\": List<module>\",\"parId\":232},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x8\",\"sig\":\": String|module|Int\",\"parId\":232},{\"name\":\"Foo\",\"kind\":3,\"url\":\"moduleTypes2/Foo.html\",\"parId\":232},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":241},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":241},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":241},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":241},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":241},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x6\",\"sig\":\": module\",\"parId\":241},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x7\",\"sig\":\": List<module>\",\"parId\":241},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x8\",\"sig\":\": String|module|Int\",\"parId\":241},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"nested/nested2/nestedModule/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"nested/nested2/nestedModule/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":250},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"nested/nested2/nestedModule/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":250},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"nested/nested2/nestedModule/MyClass.html\",\"parId\":250},{\"name\":\"referenceToExternalPackage\",\"kind\":1,\"url\":\"ternalPackage/index.html\"},{\"name\":\"prop\",\"kind\":5,\"url\":\"ternalPackage/index.html#prop\",\"sig\":\": Class Two {}\",\"parId\":254},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"shared/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"shared/MyClass.html\",\"parId\":256},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"typealiases/index.html\"},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/index.html#uint\",\"sig\":\": UInt\",\"parId\":258},{\"name\":\"uints\",\"kind\":5,\"url\":\"typealiases/index.html#uints\",\"sig\":\": List<UInt>\",\"parId\":258},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/index.html#email\",\"sig\":\": Email\",\"parId\":258},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/index.html#emails\",\"sig\":\": List<Email>\",\"parId\":258},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/index.html#send()\",\"sig\":\"(email): Email\",\"parId\":258},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases/Person.html\",\"parId\":258},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/Person.html#uint\",\"sig\":\": UInt\",\"parId\":264},{\"name\":\"list\",\"kind\":5,\"url\":\"typealiases/Person.html#list\",\"sig\":\": List<UInt>\",\"parId\":264},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/Person.html#email\",\"sig\":\": Email\",\"parId\":264},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/Person.html#emails\",\"sig\":\": List<Email>\",\"parId\":264},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/Person.html#send()\",\"sig\":\"(email): Email\",\"parId\":264},{\"name\":\"Email\",\"kind\":2,\"url\":\"typealiases/index.html#Email\",\"parId\":258,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"typealiases2/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/index.html#res1\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/index.html#res2\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/index.html#res3\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/index.html#res4\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/index.html#res5\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/index.html#res6\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/index.html#res7\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/index.html#res8\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/index.html#res9\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases2/Person.html\",\"parId\":271},{\"name\":\"name\",\"kind\":5,\"url\":\"typealiases2/Person.html#name\",\"sig\":\": String\",\"parId\":281},{\"name\":\"Foo\",\"kind\":3,\"url\":\"typealiases2/Foo.html\",\"parId\":271},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res1\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res2\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res3\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res4\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res5\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res6\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res7\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res8\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res9\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"List2\",\"kind\":2,\"url\":\"typealiases2/index.html#List2\",\"parId\":271},{\"name\":\"Map2\",\"kind\":2,\"url\":\"typealiases2/index.html#Map2\",\"parId\":271},{\"name\":\"StringMap\",\"kind\":2,\"url\":\"typealiases2/index.html#StringMap\",\"parId\":271},{\"name\":\"MMap\",\"kind\":2,\"url\":\"typealiases2/index.html#MMap\",\"parId\":271},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"typeAliasInheritance/index.html\"},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#email2\",\"sig\":\": Email\",\"parId\":297},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#emails2\",\"sig\":\": List<Email>\",\"parId\":297},{\"name\":\"Person2\",\"kind\":3,\"url\":\"typeAliasInheritance/Person2.html\",\"parId\":297},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#email2\",\"sig\":\": Email\",\"parId\":300},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#emails2\",\"sig\":\": List<Email>\",\"parId\":300},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"unionTypes/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"unionTypes/index.html#res1\",\"sig\":\": Boolean|Number\",\"parId\":303},{\"name\":\"res2\",\"kind\":5,\"url\":\"unionTypes/index.html#res2\",\"sig\":\": \\\\\\\"foo\\\\\\\"|\\\\\\\"bar\\\\\\\"|\\\\\\\"baz\\\\\\\"\",\"parId\":303},{\"name\":\"res3\",\"kind\":5,\"url\":\"unionTypes/index.html#res3\",\"sig\":\": Boolean|List<String>\",\"parId\":303},{\"name\":\"res4\",\"kind\":5,\"url\":\"unionTypes/index.html#res4\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res5\",\"kind\":5,\"url\":\"unionTypes/index.html#res5\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res6\",\"kind\":5,\"url\":\"unionTypes/index.html#res6\",\"sig\":\": Boolean|List<String>?|Number\",\"parId\":303},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"unlistedClass/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedClass/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":310},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedClass/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":310},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"unlistedMethod/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedMethod/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":313},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedMethod/MyClass.html\",\"parId\":313},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"unlistedProperty/index.html\"},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedProperty/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":316},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedProperty/MyClass.html\",\"parId\":316}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/shared/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/shared:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/shared/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.shared</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/shared/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>shared (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/shared/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.shared<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.shared</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/shared.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/shared.pkl\">shared.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/shared.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/ternalPackage/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>referenceToExternalPackage (com.package1xternalPackage:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/ternalPackage/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"referenceToExternalPackage\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">referenceToExternalPackage<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">referenceToExternalPackage</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/ternalPackage.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/ternalPackage.pkl\">ternalPackage.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"../../../com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.html\" class=\"name-ref\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/package1/ternalPackage.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\">Module3.<code>property {} four</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typeAliasInheritance/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/typeAliasInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typeAliasInheritance/Person2.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typeAliasInheritance</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typeAliasInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typeAliasInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typeAliasInheritance/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typeAliasInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typeAliasInheritance</span> extends <a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typeAliasInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typeAliasInheritance.pkl\">typeAliasInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/Person.html\" class=\"name-decl\">Person</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typealiases/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases/Person.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typealiases/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.typealiases</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases.pkl\">typealiases.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typealiases2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases2/Foo.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typealiases2/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases2/Person.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/typealiases2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/typealiases2/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typealiases2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases2.pkl\">typealiases2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"List2\" class=\"anchor\"> </div>\n            <div id=\"List2.E\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#List2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#List2\" class=\"name-decl\">List2</a>&lt;<a class=\"param1\">E</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<span class=\"name-ref\">E</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Map2\" class=\"anchor\"> </div>\n            <div id=\"Map2.V\" class=\"anchor-param1\"> </div>\n            <div id=\"Map2.K\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#Map2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Map2\" class=\"name-decl\">Map2</a>&lt;<a class=\"param1\">V</a>, <a class=\"param2\">K</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">K</span>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"StringMap\" class=\"anchor\"> </div>\n            <div id=\"StringMap.V\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#StringMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#StringMap\" class=\"name-decl\">StringMap</a>&lt;<a class=\"param1\">V</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MMap\" class=\"anchor\"> </div>\n            <div id=\"MMap.X\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#MMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#MMap\" class=\"name-decl\">MMap</a>&lt;<a class=\"param1\">X</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">X</span>, <span class=\"name-ref\">X</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/unionTypes/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unionTypes (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unionTypes/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unionTypes\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unionTypes<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unionTypes</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unionTypes.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unionTypes.pkl\">unionTypes.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: &quot;foo&quot;|&quot;bar&quot;|&quot;baz&quot;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/unlistedClass/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedClass (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedClass/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedClass.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedClass.pkl\">unlistedClass.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/unlistedMethod/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedMethod:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedMethod/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedMethod</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/unlistedMethod/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedMethod (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedMethod/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedMethod<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedMethod</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedMethod.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedMethod.pkl\">unlistedMethod.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/unlistedProperty/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedProperty:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedProperty/MyClass.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedProperty</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package1/current/unlistedProperty/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedProperty (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/unlistedProperty/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedProperty.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedProperty.pkl\">unlistedProperty.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/4.5.6/Module3/Class Two {}.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class Two {} (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class Two {}\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">`Class Two {}`<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">`Class Two {}`</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/4.5.6/Module3/Class3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class3 (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/Class3.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">Class3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Class3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/4.5.6/Module3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module3 (com.package2:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a>\n      <h1 id=\"declaration-title\">com.package2.Module3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package2.Module3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">modulepath:/com/package2/Module3.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/blob/4.5.6/Module3.pkl\">Module3.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\"><code>property {} &lt;&gt; four</code></a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property%20%7B%7D%20%3C%3E%20four\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property%20%7B%7D%20%3C%3E%20four\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">`property {} &lt;&gt; four`</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Class3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class3.html\" class=\"name-decl\">Class3</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Class%20Two%20%7B%7D\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class%20Two%20%7B%7D\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class%20Two%20%7B%7D.html\" class=\"name-decl\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/4.5.6/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package2 (4.5.6) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../data/com.package2/4.5.6/index.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package2<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package2</span></div>\n        <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Authors:</dt>\n          <dd>package2-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>4.5.6</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://sources.apple.com/package2/\">https://sources.apple.com/package2/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package2/\">https://issues.apple.com/package2/</a></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package2.Module3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2.Module3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module3/index.html\">com.package2.Module3</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/4.5.6/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"},\"summary\":\"Docs for Package 2.\",\"sourceCode\":\"https://sources.apple.com/package2/\",\"sourceCodeUrlScheme\":\"https://example.com/blob/4.5.6%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/4.5.6/search-index.js",
    "content": "searchData='[{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"Module3/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/index.html#property3\",\"sig\":\": String\",\"parId\":0},{\"name\":\"property {} <> four\",\"kind\":5,\"url\":\"Module3/index.html#property {} <> four\",\"sig\":\": String\",\"parId\":0},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/index.html#function3()\",\"sig\":\"(n): String\",\"parId\":0},{\"name\":\"Class3\",\"kind\":3,\"url\":\"Module3/Class3.html\",\"parId\":0},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/Class3.html#property3\",\"sig\":\": String\",\"parId\":4},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/Class3.html#function3()\",\"sig\":\"(n): String\",\"parId\":4},{\"name\":\"Class Two {}\",\"kind\":3,\"url\":\"Module3/Class Two {}.html\",\"parId\":0},{\"name\":\"prop\",\"kind\":5,\"url\":\"Module3/Class Two {}.html#prop\",\"sig\":\": String\",\"parId\":7}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/current/Module3/Class Two {}.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class Two {} (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class Two {}\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">`Class Two {}`<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">`Class Two {}`</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/current/Module3/Class3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class3 (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/Class3.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">Class3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Class3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/current/Module3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module3 (com.package2:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a>\n      <h1 id=\"declaration-title\">com.package2.Module3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package2.Module3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">modulepath:/com/package2/Module3.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/blob/4.5.6/Module3.pkl\">Module3.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\"><code>property {} &lt;&gt; four</code></a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property%20%7B%7D%20%3C%3E%20four\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property%20%7B%7D%20%3C%3E%20four\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">`property {} &lt;&gt; four`</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Class3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class3.html\" class=\"name-decl\">Class3</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Class%20Two%20%7B%7D\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class%20Two%20%7B%7D\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class%20Two%20%7B%7D.html\" class=\"name-decl\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package2 (4.5.6) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../data/com.package2/4.5.6/index.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package2<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package2</span></div>\n        <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Authors:</dt>\n          <dd>package2-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>4.5.6</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://sources.apple.com/package2/\">https://sources.apple.com/package2/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package2/\">https://issues.apple.com/package2/</a></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package2.Module3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2.Module3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module3/index.html\">com.package2.Module3</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"},\"summary\":\"Docs for Package 2.\",\"sourceCode\":\"https://sources.apple.com/package2/\",\"sourceCodeUrlScheme\":\"https://example.com/blob/4.5.6%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/com.package2/current/search-index.js",
    "content": "searchData='[{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"Module3/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/index.html#property3\",\"sig\":\": String\",\"parId\":0},{\"name\":\"property {} <> four\",\"kind\":5,\"url\":\"Module3/index.html#property {} <> four\",\"sig\":\": String\",\"parId\":0},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/index.html#function3()\",\"sig\":\"(n): String\",\"parId\":0},{\"name\":\"Class3\",\"kind\":3,\"url\":\"Module3/Class3.html\",\"parId\":0},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/Class3.html#property3\",\"sig\":\": String\",\"parId\":4},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/Class3.html#function3()\",\"sig\":\"(n): String\",\"parId\":4},{\"name\":\"Class Two {}\",\"kind\":3,\"url\":\"Module3/Class Two {}.html\",\"parId\":0},{\"name\":\"prop\",\"kind\":5,\"url\":\"Module3/Class Two {}.html#prop\",\"sig\":\": String\",\"parId\":7}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/Module Containing Spaces/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/baseModule/BaseClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/baseModule/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"moduleExtend\",\"href\":\"../moduleExtend/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classAnnotations/AnnotatedClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classAnnotations/AnnotatedClss.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments1.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments2.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments3.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments4.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments5.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments6.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments7.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/Comments8.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classComments/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classInheritance/MyClass1.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"MyClass2\",\"href\":\"MyClass2.html\"},{\"text\":\"MyClass3\",\"href\":\"MyClass3.html\"},{\"text\":\"MyClass4\",\"href\":\"MyClass4.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classInheritance/MyClass2.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"MyClass3\",\"href\":\"MyClass3.html\"},{\"text\":\"MyClass4\",\"href\":\"MyClass4.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classInheritance/MyClass3.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classInheritance/MyClass4.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classInheritance/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodComments/Comments.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodComments/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodModifiers/Modifiers.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodModifiers/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodTypeAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodTypeReferences/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"TypeReferences\",\"href\":\"TypeReferences.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classMethodTypeReferences/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyComments/Comments.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyComments/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyModifiers/Modifiers.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyModifiers/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyTypeAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"TypeReferences\",\"href\":\"TypeReferences.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classPropertyTypeReferences/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classTypeConstraints/Address.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"Person1\",\"href\":\"Person1.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classTypeConstraints/Person1.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classTypeConstraints/Person2.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classTypeConstraints/Project.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/classTypeConstraints/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/docExampleSubject1/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/docExampleSubject2/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/docLinks/Person.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/docLinks/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/methodAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleComments/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleExtend/ExtendClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleExtend/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleInfoAnnotation/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleMethodCommentInheritance/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleMethodComments/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"moduleMethodCommentInheritance\",\"href\":\"../moduleMethodCommentInheritance/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleMethodModifiers/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"moduleMethodTypeReferences\",\"href\":\"index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleMethodTypeReferences/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"UserDefinedAnnotation1\",\"href\":\"UserDefinedAnnotation1.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyCommentInheritance/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyComments/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"modulePropertyCommentInheritance\",\"href\":\"../modulePropertyCommentInheritance/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyModifiers/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"modulePropertyTypeReferences\",\"href\":\"index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/modulePropertyTypeReferences/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleTypes1/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"Foo\",\"href\":\"../moduleTypes2/Foo.html\"},{\"text\":\"moduleTypes2\",\"href\":\"../moduleTypes2/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleTypes2/Foo.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/moduleTypes2/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"Foo\",\"href\":\"Foo.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/nested/nested2/nestedModule/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/shared/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"TypeReferences\",\"href\":\"../classMethodTypeReferences/TypeReferences.html\"},{\"text\":\"TypeReferences\",\"href\":\"../classPropertyTypeReferences/TypeReferences.html\"},{\"text\":\"moduleMethodTypeReferences\",\"href\":\"../moduleMethodTypeReferences/index.html\"},{\"text\":\"modulePropertyTypeReferences\",\"href\":\"../modulePropertyTypeReferences/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/shared/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/ternalPackage/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typeAliasInheritance/Person2.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typeAliasInheritance/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typealiases/Person.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"Person2\",\"href\":\"../typeAliasInheritance/Person2.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typealiases/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-subtypes','[{\"text\":\"typeAliasInheritance\",\"href\":\"../typeAliasInheritance/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typealiases2/Foo.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typealiases2/Person.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/typealiases2/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/unionTypes/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/unlistedClass/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/unlistedMethod/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/unlistedMethod/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/unlistedProperty/MyClass.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package1/1.2.3/unlistedProperty/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package2/4.5.6/Module3/Class Two {}.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"4.5.6\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"ternalPackage\",\"href\":\"../../../com.package1/1.2.3/ternalPackage/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package2/4.5.6/Module3/Class3.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"4.5.6\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package2/4.5.6/Module3/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"4.5.6\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/com.package2/4.5.6/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"4.5.6\",\"classes\":\"current-version\"}]');\nruntimeData.links('known-usages','[{\"text\":\"com.package1\",\"href\":\"../../com.package1/1.2.3/index.html\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/birds/0.5.0/Bird/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"0.5.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/birds/0.5.0/allFruit/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"0.5.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/birds/0.5.0/catalog/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"0.5.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/birds/0.5.0/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"0.5.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/deprecated/1.0.0/deprecated/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.0.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/deprecated/1.0.0/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.0.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/fruit/1.1.0/Fruit/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.1.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/data/localhost(3a)0/fruit/1.1.0/index.js",
    "content": "runtimeData.links('known-versions','[{\"text\":\"1.1.0\",\"classes\":\"current-version\"}]');\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Docsite Title</title>\n    <script src=\"scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search\" autocomplete=\"off\" data-root-url-prefix=\"\"></div>\n    </header>\n    <main>\n      <h1 id=\"declaration-title\">Docsite Title</h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_packages\">Packages</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"doc-comment\"><p>Let the games begin.</p></div>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Great Library</h2>\n<p>Just follow these simple steps. You'll love it.</p>\n<ol>\n<li>Install it</li>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n<li>Install it</li>\n</ol>\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n<ol>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\nname = &quot;Pigeon&quot;\nage = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\nname: String\nage: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up</li>\n<li>just don't</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<ul>\n<li><a href=\"not_found\"><code>docLinks</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.age</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.sing()</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person.name</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.PersonList</code></a></li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_packages\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Packages</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./com.package1/current/index.html\">com.package1</a></div>\n                <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./com.package2/current/index.html\">com.package2</a></div>\n                <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fbirds\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fbirds\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/birds/current/index.html\">localhost:0/birds</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fdeprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fdeprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./localhost(3a)0/deprecated/current/index.html\">localhost:0/deprecated</a></div>\n                <div class=\"doc-comment\">Deprecated: don't use</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Ffruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Ffruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/fruit/current/index.html\">localhost:0/fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/0.5.0/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Bird (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/birds/0.5.0/Bird/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"../../../../fruit/1.0.5/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/0.5.0/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>allFruit (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/birds/0.5.0/allFruit/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/0.5.0/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>catalog (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/birds/0.5.0/catalog/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/0.5.0/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/birds (0.5.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/localhost(3a)0/birds/0.5.0/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.5.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.0.5/index.html\">fruit:1.0.5</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/0.5.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/0.5.0/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/current/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Bird (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/birds/0.5.0/Bird/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"../../../../fruit/1.0.5/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/current/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>allFruit (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/birds/0.5.0/allFruit/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/current/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>catalog (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/birds/0.5.0/catalog/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/birds (0.5.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/localhost(3a)0/birds/0.5.0/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.5.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.0.5/index.html\">fruit:1.0.5</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/birds/current/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/1.0.0/deprecated/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>deprecated (localhost:0/deprecated:1.0.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/deprecated/1.0.0/deprecated/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"../\" data-module-name=\"deprecated.deprecated\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/deprecated</a>\n      <h1 id=\"declaration-title\">deprecated.deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">deprecated.deprecated</span></div>\n        <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0#/deprecated.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"foo\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">foo</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\">Deprecated. Replace with: <code>bar</code></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Old foo</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"bar\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#bar\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">bar</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\"><p>New bar</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/1.0.0/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/deprecated (1.0.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/localhost(3a)0/deprecated/1.0.0/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/deprecated</span></div>\n        <div class=\"doc-comment\">Deprecated: don't use</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>deprecated@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.0.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/deprecated\">https://example.com/deprecated</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/deprecated/issues\">https://example.com/deprecated/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>7589f1b802d6b5b93c468fb6399d2235d44d83f27409da2b036455ccb6e07ce5</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"deprecated.deprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#deprecated.deprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./deprecated/index.html\">deprecated.deprecated</a></div>\n                <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/1.0.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\"},\"deprecation\":\"don't use\",\"sourceCode\":\"https://example.com/deprecated\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\"},\"summary\":\"A module from a deprecated package\",\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/1.0.0/search-index.js",
    "content": "searchData='[{\"name\":\"deprecated.deprecated\",\"kind\":1,\"url\":\"deprecated/index.html\"},{\"name\":\"foo\",\"kind\":5,\"url\":\"deprecated/index.html#foo\",\"sig\":\": Int\",\"parId\":0,\"deprecated\":true},{\"name\":\"bar\",\"kind\":5,\"url\":\"deprecated/index.html#bar\",\"sig\":\": Int\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/current/deprecated/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>deprecated (localhost:0/deprecated:1.0.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/deprecated/1.0.0/deprecated/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"../\" data-module-name=\"deprecated.deprecated\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/deprecated</a>\n      <h1 id=\"declaration-title\">deprecated.deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">deprecated.deprecated</span></div>\n        <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0#/deprecated.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"foo\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">foo</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\">Deprecated. Replace with: <code>bar</code></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Old foo</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"bar\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#bar\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">bar</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\"><p>New bar</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/deprecated (1.0.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/localhost(3a)0/deprecated/1.0.0/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/deprecated</span></div>\n        <div class=\"doc-comment\">Deprecated: don't use</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>deprecated@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.0.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/deprecated\">https://example.com/deprecated</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/deprecated/issues\">https://example.com/deprecated/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>7589f1b802d6b5b93c468fb6399d2235d44d83f27409da2b036455ccb6e07ce5</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"deprecated.deprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#deprecated.deprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./deprecated/index.html\">deprecated.deprecated</a></div>\n                <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\"},\"deprecation\":\"don't use\",\"sourceCode\":\"https://example.com/deprecated\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\"},\"summary\":\"A module from a deprecated package\",\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/deprecated/current/search-index.js",
    "content": "searchData='[{\"name\":\"deprecated.deprecated\",\"kind\":1,\"url\":\"deprecated/index.html\"},{\"name\":\"foo\",\"kind\":5,\"url\":\"deprecated/index.html#foo\",\"sig\":\": Int\",\"parId\":0,\"deprecated\":true},{\"name\":\"bar\",\"kind\":5,\"url\":\"deprecated/index.html#bar\",\"sig\":\": Int\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/1.1.0/Fruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Fruit (localhost:0/fruit:1.1.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/fruit/1.1.0/Fruit/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"../\" data-module-name=\"fruit.Fruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/fruit</a>\n      <h1 id=\"declaration-title\">fruit.Fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">fruit.Fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0#/Fruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/1.1.0/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/fruit (1.1.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/localhost(3a)0/fruit/1.1.0/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>apple-1@example.com, banana-2@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.1.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/fruit\">https://example.com/fruit</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/fruit/issues\">https://example.com/fruit/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"fruit.Fruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#fruit.Fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Fruit/index.html\">fruit.Fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/1.1.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"},\"sourceCode\":\"https://example.com/fruit\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/1.1.0/search-index.js",
    "content": "searchData='[{\"name\":\"fruit.Fruit\",\"kind\":1,\"url\":\"Fruit/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Fruit/index.html#name\",\"sig\":\": String\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/current/Fruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Fruit (localhost:0/fruit:1.1.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../../data/localhost(3a)0/fruit/1.1.0/Fruit/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"../\" data-module-name=\"fruit.Fruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/fruit</a>\n      <h1 id=\"declaration-title\">fruit.Fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">fruit.Fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0#/Fruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/fruit (1.1.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/localhost(3a)0/fruit/1.1.0/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>apple-1@example.com, banana-2@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.1.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/fruit\">https://example.com/fruit</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/fruit/issues\">https://example.com/fruit/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"fruit.Fruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#fruit.Fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Fruit/index.html\">fruit.Fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"},\"sourceCode\":\"https://example.com/fruit\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/localhost(3a)0/fruit/current/search-index.js",
    "content": "searchData='[{\"name\":\"fruit.Fruit\",\"kind\":1,\"url\":\"Fruit/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Fruit/index.html#name\",\"sig\":\": String\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/scripts/pkldoc.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// Whether the current browser is WebKit.\nlet isWebKitBrowser;\n\n// The lazily initialized worker for running searches, if any.\nlet searchWorker = null;\n\n// Tells whether non-worker search is ready for use.\n// Only relevant if we determined that we can't use a worker.\nlet nonWorkerSearchInitialized = false;\n\n// The search div containing search input and search results.\nlet searchElement;\n\n// The search input element.\nlet searchInput;\n\n// The package name associated with the current page, if any.\nlet packageName;\n\nlet packageVersion;\n\n// The module name associated with the current page, if any.\nlet moduleName;\n\n// The class name associated with the current page, if any.\nlet className;\n\n// Prefix to turn a site-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet rootUrlPrefix;\n\n// Prefix to turn a package-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet packageUrlPrefix;\n\n// The search result currently selected in the search results list.\nlet selectedSearchResult = null;\n\n// Initializes the UI.\n// Wrapped in a function to avoid execution in tests.\n// noinspection JSUnusedGlobalSymbols\nfunction onLoad() {\n  isWebKitBrowser = navigator.userAgent.indexOf('AppleWebKit') !== -1;\n  searchElement = document.getElementById('search');\n  searchInput = document.getElementById('search-input');\n  packageName = searchInput.dataset.packageName || null;\n  packageVersion = searchInput.dataset.packageVersion || null;\n  moduleName = searchInput.dataset.moduleName || null;\n  className = searchInput.dataset.className || null;\n  rootUrlPrefix = searchInput.dataset.rootUrlPrefix;\n  packageUrlPrefix = searchInput.dataset.packageUrlPrefix;\n\n  initExpandTargetMemberDocs();\n  initNavigateToMemberPage();\n  initToggleMemberDocs();\n  initToggleInheritedMembers();\n  initCopyModuleUriToClipboard();\n  initSearchUi();\n}\n\n// If page URL contains a fragment, expand the target member's docs.\n// Handled in JS rather than CSS so that target member can still be manually collapsed.\nfunction initExpandTargetMemberDocs() {\n  const expandTargetDocs = () => {\n    const hash = window.location.hash;\n    if (hash.length === 0) return;\n    \n    const target = document.getElementById(hash.substring(1));\n    if (!target) return;\n\n    const member = target.nextElementSibling;\n    if (!member || !member.classList.contains('with-expandable-docs')) return;\n\n    expandMemberDocs(member);\n  }\n  \n  window.addEventListener('hashchange', expandTargetDocs);\n  expandTargetDocs();\n}\n\n// For members that have their own page, navigate to that page when the member's box is clicked.\nfunction initNavigateToMemberPage() {\n  const elements = document.getElementsByClassName('with-page-link');\n  for (const element of elements) {\n    const memberLink = element.getElementsByClassName('name-decl')[0];\n    // check if this is actually a link\n    // (it isn't if the generator couldn't resolve the link target)\n    if (memberLink.tagName === 'A') {\n      element.addEventListener('click', (e) => {\n        // don't act if user clicked a link\n        if (e.target !== null && e.target.closest('a') !== null) return;\n\n        // don't act if user clicked to select some text\n        if (window.getSelection().toString()) return;\n\n        memberLink.click();\n      });\n    }\n  }\n}\n\n// Expands and collapses member docs.\nfunction initToggleMemberDocs() {\n  const elements = document.getElementsByClassName('with-expandable-docs');\n  for (const element of elements) {\n    element.addEventListener('click', (e) => {\n      // don't act if user clicked a link\n      if (e.target !== null && e.target.closest('a') !== null) return;\n\n      // don't act if user clicked to select some text\n      if (window.getSelection().toString()) return;\n\n      toggleMemberDocs(element);\n    });\n  }\n}\n\n// Shows and hides inherited members.\nfunction initToggleInheritedMembers() {\n  const memberGroups = document.getElementsByClassName('member-group');\n  for (const group of memberGroups) {\n    const button = group.getElementsByClassName('toggle-inherited-members-link')[0];\n    if (button !== undefined) {\n      const members = group.getElementsByClassName('inherited');\n      button.addEventListener('click', () => toggleInheritedMembers(button, members));\n    }\n  }\n}\n\n// Copies the module URI optionally displayed on a module page to the clipboard.\nfunction initCopyModuleUriToClipboard() {\n  const copyUriButtons = document.getElementsByClassName('copy-uri-button');\n\n  for (const button of copyUriButtons) {\n    const moduleUri = button.previousElementSibling;\n\n    button.addEventListener('click', e => {\n      e.stopPropagation();\n      const range = document.createRange();\n      range.selectNodeContents(moduleUri);\n      const selection = getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      try {\n        document.execCommand('copy');\n      } catch (e) {\n      } finally {\n        selection.removeAllRanges();\n      }\n    });\n  }\n}\n\n// Expands or collapses member docs.\nfunction toggleMemberDocs(memberElem) {\n  const comments = memberElem.getElementsByClassName('expandable');\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n\n  if (isCollapsed) {\n    for (const comment of comments) expandElement(comment);\n    icon.textContent = 'expand_less';\n  } else {\n    for (const comment of comments) collapseElement(comment);\n    icon.textContent = 'expand_more';\n  }\n}\n\n// Expands member docs unless they are already expanded.\nfunction expandMemberDocs(memberElem) {\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n  \n  if (!isCollapsed) return;\n  \n  const comments = memberElem.getElementsByClassName('expandable');\n  for (const comment of comments) expandElement(comment);\n  icon.textContent = 'expand_less';\n}\n\n// Shows and hides inherited members.\nfunction toggleInheritedMembers(button, members) {\n  const isCollapsed = button.textContent === 'show inherited';\n\n  if (isCollapsed) {\n    for (const member of members) expandElement(member);\n    button.textContent = 'hide inherited';\n  } else {\n    for (const member of members) collapseElement(member);\n    button.textContent = 'show inherited'\n  }\n}\n\n// Expands an element.\n// Done in two steps to make transition work (can't transition from 'hidden').\n// For some reason (likely related to removing 'hidden') the transition isn't animated in FF.\n// When using timeout() instead of requestAnimationFrame()\n// there is *some* animation in FF but still doesn't look right.\nfunction expandElement(element) {\n  element.classList.remove('hidden');\n\n  requestAnimationFrame(() => {\n    element.classList.remove('collapsed');\n  });\n}\n\n// Collapses an element.\n// Done in two steps to make transition work (can't transition to 'hidden').\nfunction collapseElement(element) {\n  element.classList.add('collapsed');\n\n  const listener = () => {\n    element.removeEventListener('transitionend', listener);\n    element.classList.add('hidden');\n  };\n  element.addEventListener('transitionend', listener);\n}\n\n// Initializes the search UI and sets up delayed initialization of the search engine.\nfunction initSearchUi() {\n  // initialize search engine the first time that search input receives focus\n  const onFocus = () => {\n    searchInput.removeEventListener('focus', onFocus);\n    initSearchWorker();\n  };\n  searchInput.addEventListener('focus', onFocus);\n\n  // clear search when search input loses focus,\n  // except if this happens due to a search result being clicked,\n  // in which case clearSearch() will be called by the link's click handler,\n  // and calling it here would prevent the click handler from firing\n  searchInput.addEventListener('focusout', () => {\n    if (document.querySelector('#search-results:hover') === null) clearSearch();\n  });\n\n  // trigger search when user hasn't typed in a while\n  let timeoutId = null;\n  // Using anything other than `overflow: visible` for `#search-results`\n  // slows down painting significantly in WebKit browsers (at least Safari/Mac).\n  // Compensate by using a higher search delay, which is less annoying than a blocking UI.\n  const delay = isWebKitBrowser ? 200 : 100;\n  searchInput.addEventListener('input', () => {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => triggerSearch(searchInput.value), delay);\n  });\n\n  // keyboard shortcut for entering search\n  document.addEventListener('keyup', e => {\n    // could additionally support '/' like GitHub and Gmail do,\n    // but this would require overriding the default behavior of '/' on Firefox\n    if (e.key === 's') searchInput.focus();\n  });\n\n  // keyboard navigation for search results\n  searchInput.addEventListener('keydown', e => {\n    const results = document.getElementById('search-results');\n    if (results !== null) {\n      if (e.key === 'ArrowDown') {\n        selectNextResult(results.firstElementChild);\n        e.preventDefault();\n      } else if (e.key === 'ArrowUp') {\n        selectPrevResult(results.firstElementChild);\n        e.preventDefault();\n      }\n    }\n  });\n  searchInput.addEventListener('keyup', e => {\n    if (e.key === 'Enter' && selectedSearchResult !== null) {\n      selectedSearchResult.firstElementChild.click();\n      clearSearch();\n    }\n  });\n}\n\n// Initializes the search worker.\nfunction initSearchWorker() {\n  const workerScriptUrl = rootUrlPrefix + 'scripts/search-worker.js';\n\n  try {\n    searchWorker = new Worker(workerScriptUrl, {name: packageName === null ? \"main\" : packageName + '/' + packageVersion});\n    searchWorker.addEventListener('message', e => handleSearchResults(e.data.query, e.data.results));\n  } catch (e) {\n    // could not initialize worker, presumably because we are a file:/// page and content security policy got in the way\n    // fall back to running searches synchronously without a worker\n    // this requires loading search related scripts that would otherwise be loaded by the worker\n\n    searchWorker = null;\n    let pendingScripts = 3;\n\n    const onScriptLoaded = () => {\n      if (--pendingScripts === 0) {\n        initSearchIndex();\n        nonWorkerSearchInitialized = true;\n        if (searchInput.focused) {\n          triggerSearch(searchInput.value);\n        }\n      }\n    };\n    \n    const script1 = document.createElement('script');\n    script1.src = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + 'search-index.js';\n    script1.async = true;\n    script1.onload = onScriptLoaded;\n    document.head.append(script1);\n\n    const script2 = document.createElement('script');\n    script2.src = rootUrlPrefix;\n    script2.async = true;\n    script2.onload = onScriptLoaded;\n    document.head.append(script2);\n\n    const script3 = document.createElement('script');\n    script3.src = workerScriptUrl;\n    script3.async = true;\n    script3.onload = onScriptLoaded;\n    document.head.append(script3);\n  }\n}\n\n// Updates search results unless they are stale.\nfunction handleSearchResults(query, results) {\n  if (query.inputValue !== searchInput.value) return;\n\n  updateSearchResults(renderSearchResults(query, results));\n}\n\n// TODO: Should this (or its callers) use requestAnimationFrame() ?\n// Removes any currently displayed search results, then displays the given results if non-null.\nfunction updateSearchResults(resultsDiv) {\n  selectedSearchResult = null;\n\n  const oldResultsDiv = document.getElementById('search-results');\n  if (oldResultsDiv !== null) {\n    searchElement.removeChild(oldResultsDiv);\n  }\n\n  if (resultsDiv != null) {\n    searchElement.append(resultsDiv);\n    selectNextResult(resultsDiv.firstElementChild);\n  }\n}\n\n// Returns the module of the given member, or `null` if the given member is a module.\nfunction getModule(member) {\n  switch (member.level) {\n    case 0:\n      return null;\n    case 1:\n      return member.parent;\n    case 2:\n      return member.parent.parent;\n  }\n}\n\n// Triggers a search unless search input is invalid or incomplete.\nfunction triggerSearch(inputValue) {\n  const query = parseSearchInput(inputValue);\n  if (!isActionableQuery(query)) {\n    handleSearchResults(query, null);\n    return;\n  }\n\n  if (searchWorker !== null) {\n    searchWorker.postMessage({query, packageName, moduleName, className});\n  } else if (nonWorkerSearchInitialized) {\n    const results = runSearch(query, packageName, moduleName, className);\n    handleSearchResults(query, results);\n  }\n}\n\n// Tells if the given Unicode character is a whitespace character.\nfunction isWhitespace(ch) {\n  const cp = ch.codePointAt(0);\n  if (cp >= 9 && cp <= 13 || cp === 32 || cp === 133 || cp === 160) return true;\n  if (cp < 5760) return false;\n  return cp === 5760 || cp >= 8192 && cp <= 8202\n      || cp === 8232 || cp === 8233 || cp === 8239 || cp === 8287 || cp === 12288;\n}\n\n// Trims the given Unicode characters.\nfunction trim(chars) {\n  const length = chars.length;\n  let startIdx, endIdx;\n\n  for (startIdx = 0; startIdx < length; startIdx += 1) {\n    if (!isWhitespace(chars[startIdx])) break;\n  }\n  for (endIdx = chars.length - 1; endIdx > startIdx; endIdx -= 1) {\n    if (!isWhitespace(chars[endIdx])) break;\n  }\n  return chars.slice(startIdx, endIdx + 1);\n}\n\n// Parses the user provided search input.\n// Preconditions:\n// inputValue !== ''\nfunction parseSearchInput(inputValue) {\n  const chars = trim(Array.from(inputValue));\n  const char0 = chars[0]; // may be undefined\n  const char1 = chars[1]; // may be undefined\n  const prefix = char1 === ':' ? char0 + char1 : null;\n  const kind =\n      prefix === null ? null :\n          char0 === 'm' ? 1 :\n              char0 === 't' ? 2 :\n                  char0 === 'c' ? 3 :\n                      char0 === 'f' ? 4 :\n                          char0 === 'p' ? 5 :\n                              undefined;\n  const unprefixedChars = kind !== null && kind !== undefined ?\n      trim(chars.slice(2, chars.length)) :\n      chars;\n  const normalizedCps = toNormalizedCodePoints(unprefixedChars);\n  return {inputValue, prefix, kind, normalizedCps};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\n// Note: Keep in sync with same function in search-worker.js.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Tells if the given query is valid and long enough to be worth running.\n// Prefixed queries require fewer minimum characters than unprefixed queries.\n// This avoids triggering a search while typing a prefix yet still enables searching for single-character names.\n// For example, `p:e` finds `pkl.math#E`.\nfunction isActionableQuery(query) {\n  const kind = query.kind;\n  const queryCps = query.normalizedCps;\n  return kind !== undefined && (kind !== null && queryCps.length > 0 || queryCps.length > 1);\n}\n\n// Renders the given search results for the given query.\n// Preconditions:\n// isActionableQuery(query) ? results !== null : results === null\nfunction renderSearchResults(query, results) {\n  const resultsDiv = document.createElement('div');\n  resultsDiv.id = 'search-results';\n  const ul = document.createElement('ul');\n  resultsDiv.append(ul);\n\n  if (results === null) {\n    if (query.kind !== undefined) return null;\n\n    const li = document.createElement('li');\n    li.className = 'heading';\n    li.textContent = 'Unknown search prefix. Use one of <b>m:</b> (module), <b>c:</b> (class), <b>f:</b> (function), or <b>p:</b> (property).';\n    ul.append(li);\n    return resultsDiv;\n  }\n\n  const {exactMatches, classMatches, moduleMatches, otherMatches} = results;\n\n  if (exactMatches.length + classMatches.length + moduleMatches.length + otherMatches.length === 0) {\n    renderHeading('No results found', ul);\n    return resultsDiv;\n  }\n\n  if (exactMatches.length > 0) {\n    renderHeading('Top hits', ul);\n    renderMembers(query.normalizedCps, exactMatches, ul);\n  }\n  if (classMatches.length > 0) {\n    renderHeading('Class', ul, className);\n    renderMembers(query.normalizedCps, classMatches, ul);\n  }\n  if (moduleMatches.length > 0) {\n    renderHeading('Module', ul, moduleName);\n    renderMembers(query.normalizedCps, moduleMatches, ul);\n  }\n  if (otherMatches.length > 0) {\n    renderHeading('Other results', ul);\n    renderMembers(query.normalizedCps, otherMatches, ul);\n  }\n\n  return resultsDiv;\n}\n\n// Adds a heading such as `Top matches` to the search results list.\nfunction renderHeading(title, ul, name = null) {\n  const li = document.createElement('li');\n  li.className = 'heading';\n  li.append(title);\n  if (name != null) {\n    li.append(' ');\n    li.append(span('heading-name', name))\n  }\n  ul.append(li);\n}\n\n// Adds matching members to the search results list.\nfunction renderMembers(queryCps, members, ul) {\n  for (const member of members) {\n    ul.append(renderMember(queryCps, member));\n  }\n}\n\n// Renders a member to be added to the search result list.\nfunction renderMember(queryCps, member) {\n  const result = document.createElement('li');\n  result.className = 'result';\n  if (member.deprecated) result.className = 'deprecated';\n\n  const link = document.createElement('a');\n  result.append(link);\n\n  link.href = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + member.url;\n  link.addEventListener('mousedown', () => selectResult(result));\n  link.addEventListener('click', clearSearch);\n\n  const keyword = getKindKeyword(member.kind);\n  // noinspection JSValidateTypes (IntelliJ bug?)\n  if (keyword !== null) {\n    link.append(span('keyword', keyword), ' ');\n  }\n\n  // prefix with class name if a class member\n  if (member.level === 2) {\n    link.append(span(\"context\", member.parent.name + '.'));\n  }\n\n  const name = span('result-name');\n  if (member.matchNameIdx === 0) { // main name matched\n    highlightMatch(queryCps, member.names[0], member.matchStartIdx, name);\n  } else { // aka name matched\n    name.append(member.name);\n  }\n  link.append(name);\n\n  if (member.signature !== null) {\n    link.append(member.signature);\n  }\n\n  if (member.matchNameIdx > 0) { // aka name matched\n    link.append(' ');\n    const aka = span('aka');\n    aka.append('(known as: ');\n    const name = span('aka-name');\n    highlightMatch(queryCps, member.names[member.matchNameIdx], member.matchStartIdx, name);\n    aka.append(name, ')');\n    link.append(aka);\n  }\n\n  // add module name if not a module\n  const module = getModule(member);\n  if (module !== null) {\n    link.append(' ', span('context', '(' + module.name + ')'));\n  }\n\n  return result;\n}\n\n// Returns the keyword for the given member kind.\nfunction getKindKeyword(kind) {\n  switch (kind) {\n    case 0:\n      return \"package\";\n    case 1:\n      return \"module\";\n    case 2:\n      return \"typealias\";\n    case 3:\n      return \"class\";\n    case 4:\n      return \"function\";\n    case 5:\n      // properties have no keyword\n      return null;\n  }\n}\n\n// Highlights the matching characters in a member name.\n// Preconditions:\n// queryCps.length > 0\n// computeMatchFrom(queryCps, name.normalizedCps, name.wordStarts, matchStartIdx)\nfunction highlightMatch(queryCps, name, matchStartIdx, parentElem) {\n  const queryLength = queryCps.length;\n  const codePoints = name.codePoints;\n  const nameCps = name.normalizedCps;\n  const nameLength = nameCps.length;\n  const wordStarts = name.wordStarts;\n\n  let queryIdx = 0;\n  let queryCp = queryCps[0];\n  let startIdx = matchStartIdx;\n\n  if (startIdx > 0) {\n    parentElem.append(String.fromCodePoint(...codePoints.subarray(0, startIdx)));\n  }\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp !== nameCp) {\n      const newNameIdx = wordStarts[nameIdx];\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx))));\n      startIdx = newNameIdx;\n      parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx, newNameIdx)));\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx + 1))));\n      if (nameIdx + 1 < nameLength) {\n        parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx + 1, nameLength)));\n      }\n      return;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  throw 'Precondition violated: `computeMatchFrom()`';\n}\n\n// Creates a span element.\nfunction span(className, text = null) {\n  const result = document.createElement('span');\n  result.className = className;\n  result.textContent = text;\n  return result;\n}\n\n// Creates a text node.\nfunction text(content) {\n  return document.createTextNode(content);\n}\n\n// Navigates to the next member entry in the search results list, skipping headings.\nfunction selectNextResult(ul) {\n  let next = selectedSearchResult === null ? ul.firstElementChild : selectedSearchResult.nextElementSibling;\n  while (next !== null) {\n    if (!next.classList.contains('heading')) {\n      selectResult(next);\n      scrollIntoView(next, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    next = next.nextElementSibling;\n  }\n}\n\n// Navigates to the previous member entry in the search results list, skipping headings.\nfunction selectPrevResult(ul) {\n  let prev = selectedSearchResult === null ? ul.lastElementChild : selectedSearchResult.previousElementSibling;\n  while (prev !== null) {\n    if (!prev.classList.contains('heading')) {\n      selectResult(prev);\n      const prev2 = prev.previousElementSibling;\n      // make any immediately preceding heading visible as well (esp. important for first heading)\n      const scrollTo = prev2 !== null && prev2.classList.contains('heading') ? prev2 : prev;\n      scrollIntoView(scrollTo, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    prev = prev.previousElementSibling;\n  }\n}\n\n// Selects the given entry in the search results list.\nfunction selectResult(li) {\n  if (selectedSearchResult !== null) {\n    selectedSearchResult.classList.remove('selected');\n  }\n  li.classList.add('selected');\n  selectedSearchResult = li;\n}\n\n// Clears the search input and hides/removes the search results list.\nfunction clearSearch() {\n  searchInput.value = '';\n  updateSearchResults(null);\n}\n\n// Functions called by JS data scripts.\n// noinspection JSUnusedGlobalSymbols\nconst runtimeData = {\n  links: (id, linksJson) => {\n    const links = JSON.parse(linksJson);\n    const fragment = document.createDocumentFragment();\n    let first = true;\n    for (const link of links) {\n      const {text, href, classes} = link\n      const a = document.createElement(\"a\");\n      a.textContent = text;\n      if (href) a.href = href;\n      if (classes) a.className = classes;\n      if (first) {\n        first = false;\n      } else {\n        fragment.append(\", \");\n      }\n      fragment.append(a);\n    }\n\n    const element = document.getElementById(id);\n    element.append(fragment);\n    element.classList.remove(\"hidden\"); // dd\n    element.previousElementSibling.classList.remove(\"hidden\"); // dt\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/scripts/search-worker.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// populated by `initSearchIndex()`\nlet searchIndex;\n\n// noinspection ThisExpressionReferencesGlobalObjectJS\nconst isWorker = 'DedicatedWorkerGlobalScope' in this;\n\nif (isWorker) {\n  const workerName = self.name;\n  // relative to this file\n  const searchIndexUrl = workerName === \"main\" ?\n      '../search-index.js' :\n      '../' + workerName + '/search-index.js';\n  importScripts(searchIndexUrl);\n  initSearchIndex();\n  addEventListener('message', e => {\n    const {query, packageName, moduleName, className} = e.data;\n    const results = runSearch(query, packageName, moduleName, className);\n    postMessage({query, results});\n  });\n} else {\n  // non-worker environment\n  // `pkldoc.js` loads scripts and calls `initSearchIndex()`\n}\n\n// Initializes the search index.\nfunction initSearchIndex() {\n  // noinspection JSUnresolvedVariable\n  const data = JSON.parse(searchData);\n  const index = Array(data.length);\n  let idx = 0;\n\n  for (const entry of data) {\n    const name = entry.name;\n    const names = toIndexedNames(entry);\n    // 0 -> package, 1 -> module, 2 -> type alias, 3 -> class, 4 -> function, 5 -> property\n    const kind = entry.kind;\n    const url = entry.url;\n    // noinspection JSUnresolvedVariable\n    const signature = entry.sig === undefined ? null : entry.sig;\n    // noinspection JSUnresolvedVariable\n    const parent = entry.parId === undefined ? null : index[entry.parId];\n    const level = parent === null ? 0 : parent.parent === null ? 1 : 2;\n    const deprecated = entry.deprecated !== undefined;\n\n    index[idx++] = {\n      name,\n      names,\n      kind,\n      url,\n      signature,\n      parent,\n      level,\n      deprecated,\n      // remaining attributes are set by `computeMatchFrom` and hence aren't strictly part of the search index\n      matchNameIdx: -1,  // names[matchNameIdx] is the name that matched\n      matchStartIdx: -1, // names[matchNameIdx].codePoints[matchStartIdx] is the first code point that matched\n      similarity: 0 // number of code points matched relative to total number of code points (between 0.0 and 1.0)\n    };\n  }\n\n  searchIndex = index;\n}\n\n// Runs a search and returns its results.\nfunction runSearch(query, packageName, moduleName, className) {\n  const queryCps = query.normalizedCps;\n  const queryKind = query.kind;\n\n  let exactMatches = [];\n  let classMatches = [];\n  let moduleMatches = [];\n  let otherMatches = [];\n\n  for (const member of searchIndex) {\n    if (queryKind !== null && queryKind !== member.kind) continue;\n\n    if (!isMatch(queryCps, member)) continue;\n\n    if (member.similarity === 1) {\n      exactMatches.push(member);\n    } else if (moduleName !== null && member.level === 1 && moduleName === member.parent.name) {\n      moduleMatches.push(member);\n    } else if (moduleName !== null && member.level === 2 && moduleName === member.parent.parent.name) {\n      if (className !== null && className === member.parent.name) {\n        classMatches.push(member);\n      } else {\n        moduleMatches.push(member);\n      }\n    } else {\n      otherMatches.push(member);\n    }\n  }\n\n  // Sorts members best-first.\n  function compareMembers(member1, member2) {\n    const normDiff = member2.similarity - member1.similarity; // higher is better\n    if (normDiff !== 0) return normDiff;\n\n    const lengthDiff = member1.matchNameLength - member2.matchNameLength; // lower is better\n    if (lengthDiff !== 0) return lengthDiff;\n\n    const kindDiff = member2.kind - member1.kind; // higher is better\n    if (kindDiff !== 0) return kindDiff;\n\n    return member1.matchNameIdx - member2.matchNameIdx; // lower is better\n  }\n\n  exactMatches.sort(compareMembers);\n  classMatches.sort(compareMembers);\n  moduleMatches.sort(compareMembers);\n  otherMatches.sort(compareMembers);\n\n  return {exactMatches, classMatches, moduleMatches, otherMatches};\n}\n\n// Indexes a member's names.\nfunction toIndexedNames(entry) {\n  const result = [];\n  result.push(toIndexedName(entry.name));\n  // noinspection JSUnresolvedVariable\n  const alsoKnownAs = entry.aka;\n  if (alsoKnownAs !== undefined) {\n    for (const name of alsoKnownAs) {\n      result.push(toIndexedName(name));\n    }\n  }\n  return result;\n}\n\n// Indexes the given name.\nfunction toIndexedName(name) {\n  const characters = Array.from(name);\n  const codePoints = Uint32Array.from(characters, ch => ch.codePointAt(0));\n  const normalizedCps = toNormalizedCodePoints(characters);\n  const wordStarts = toWordStarts(characters);\n\n  return {codePoints, normalizedCps, wordStarts};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Returns an array of same length as `characters` that for every index, holds the index of the next word start.\n// Preconditions:\n// characters.length > 0\nfunction toWordStarts(characters) {\n  const length = characters.length;\n  // -1 is used as 'no next word start exists' -> use signed int array\n  const result = length <= 128 ? new Int8Array(length) : new Int16Array(length);\n\n  if (length > 1) {\n    let class1 = toCharClass(characters[length - 1]);\n    let class2;\n    let wordStart = -1;\n    for (let idx = length - 1; idx >= 1; idx -= 1) {\n      class2 = class1;\n      class1 = toCharClass(characters[idx - 1]);\n      const diff = class1 - class2;\n      // transitions other than uppercase -> other\n      if (diff !== 0 && diff !== 3) wordStart = idx;\n      result[idx] = wordStart;\n      // uppercase -> other\n      if (diff === 3) wordStart = idx - 1;\n    }\n  }\n\n  // first character is always a word start\n  result[0] = 0;\n\n  return result;\n}\n\n\n// Partitions characters into uppercase, digit, dot, and other.\nfunction toCharClass(ch) {\n  const regexIsUppercase = /\\p{Lu}/u\n  const regexIsNumericCharacter = /\\p{N}/u\n  return regexIsUppercase.test(ch) ? 3 : regexIsNumericCharacter.test(ch) ? 2 : ch === '.' ? 1 : 0;\n}\n\n// Tests if `queryCps` matches any of `member`'s names.\n// If so, records information about the match in `member`.\n// Preconditions:\n// queryCps.length > 0\nfunction isMatch(queryCps, member) {\n  const queryLength = queryCps.length;\n  let nameIdx = 0;\n\n  for (const name of member.names) {\n    const nameCps = name.normalizedCps;\n    const nameLength = nameCps.length;\n    const wordStarts = name.wordStarts;\n    const maxStartIdx = nameLength - queryLength;\n\n    for (let startIdx = 0; startIdx <= maxStartIdx; startIdx += 1) {\n      const matchLength = computeMatchFrom(queryCps, nameCps, wordStarts, startIdx);\n      if (matchLength > 0) {\n        member.matchNameIdx = nameIdx;\n        member.matchStartIdx = startIdx;\n        // Treat exact match of last module name component as exact match (similarity == 1).\n        // For example, treat \"PodSpec\" as exact match for \"io.k8s.api.core.v1.PodSpec\".\n        // Because \"ps\" is considered an exact match for \"PodSpec\",\n        // it is also considered an exact match for \"io.k8s.api.core.v1.PodSpec\".\n        const isExactMatchOfLastModuleNameComponent =\n            startIdx > 0 && nameCps[startIdx - 1] === 46 /* '.' */ && matchLength === nameLength - startIdx;\n        member.similarity = isExactMatchOfLastModuleNameComponent ? 1 : matchLength / nameLength;\n        member.matchNameLength = nameLength;\n        return true;\n      }\n    }\n\n    nameIdx += 1;\n  }\n\n  return false;\n}\n\n// Tests if the given query matches the given name from `startIdx` on.\n// Returns the number of code points matched.\n// Word start matches get special treatment.\n// For example, `sb` is considered to match all code points of `StringBuilder`.\n// Preconditions:\n// queryCps.length > 0\n// nameCps.length > 0\n// wordStarts.length === nameCps.length\n// startIdx < nameCps.length\nfunction computeMatchFrom(queryCps, nameCps, wordStarts, startIdx) {\n  const queryLength = queryCps.length;\n  const nameLength = nameCps.length;\n  const beginsWithWordStart = wordStarts[startIdx] === startIdx;\n\n  let queryIdx = 0;\n  let matchLength = 0;\n  let queryCp = queryCps[0];\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp === nameCp) {\n      matchLength += 1;\n    } else { // check for word start match\n      if (nameIdx === startIdx || !beginsWithWordStart) return 0;\n\n      const newNameIdx = wordStarts[nameIdx];\n      if (newNameIdx === -1) return 0;\n\n      const newNameCp = nameCps[newNameIdx];\n      if (queryCp !== newNameCp) return 0;\n\n      matchLength += newNameIdx - nameIdx + 1;\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      // in case of a word start match, increase matchLength by number of remaining chars of the last matched word\n      const nextIdx = nameIdx + 1;\n      if (beginsWithWordStart && nextIdx < nameLength) {\n        const nextStart = wordStarts[nextIdx];\n        if (nextStart === -1) {\n          matchLength += nameLength - nextIdx;\n        } else {\n          matchLength += nextStart - nextIdx;\n        }\n      }\n\n      return matchLength;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1\",\"kind\":0,\"url\":\"com.package1/current/index.html\",\"deprecated\":true},{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"com.package1/current/Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"com.package1/current/baseModule/index.html\"},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classAnnotations/index.html\"},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"com.package1/current/classComments/index.html\"},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"com.package1/current/classInheritance/index.html\"},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"com.package1/current/classMethodComments/index.html\"},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/classMethodModifiers/index.html\"},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeReferences/index.html\"},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"com.package1/current/classPropertyComments/index.html\"},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/classPropertyModifiers/index.html\"},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeReferences/index.html\"},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"com.package1/current/classTypeConstraints/index.html\"},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject1/index.html\"},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject2/index.html\"},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"com.package1/current/docLinks/index.html\"},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"com.package1/current/methodAnnotations/index.html\"},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"com.package1/current/moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"com.package1/current/moduleExtend/index.html\"},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"com.package1/current/moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodCommentInheritance/index.html\"},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodComments/index.html\"},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodModifiers/index.html\"},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeReferences/index.html\"},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyCommentInheritance/index.html\"},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyComments/index.html\"},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyModifiers/index.html\"},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeReferences/index.html\"},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes1/index.html\"},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes2/index.html\"},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"com.package1/current/nested/nested2/nestedModule/index.html\"},{\"name\":\"com.package1.ternalPackage\",\"kind\":1,\"url\":\"com.package1/current/ternalPackage/index.html\"},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"com.package1/current/shared/index.html\"},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"com.package1/current/typealiases/index.html\"},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"com.package1/current/typealiases2/index.html\"},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"com.package1/current/typeAliasInheritance/index.html\"},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"com.package1/current/unionTypes/index.html\"},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"com.package1/current/unlistedClass/index.html\"},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"com.package1/current/unlistedMethod/index.html\"},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"com.package1/current/unlistedProperty/index.html\"},{\"name\":\"com.package2\",\"kind\":0,\"url\":\"com.package2/current/index.html\"},{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"com.package2/current/Module3/index.html\"},{\"name\":\"localhost:0/birds\",\"kind\":0,\"url\":\"localhost:0/birds/current/index.html\"},{\"name\":\"localhost:0/birds.catalog\",\"kind\":1,\"url\":\"localhost:0/birds/current/catalog/index.html\"},{\"name\":\"localhost:0/birds.allFruit\",\"kind\":1,\"url\":\"localhost:0/birds/current/allFruit/index.html\"},{\"name\":\"localhost:0/birds.Bird\",\"kind\":1,\"url\":\"localhost:0/birds/current/Bird/index.html\"},{\"name\":\"localhost:0/deprecated\",\"kind\":0,\"url\":\"localhost:0/deprecated/current/index.html\",\"deprecated\":true},{\"name\":\"localhost:0/deprecated.deprecated\",\"kind\":1,\"url\":\"localhost:0/deprecated/current/deprecated/index.html\"},{\"name\":\"localhost:0/fruit\",\"kind\":0,\"url\":\"localhost:0/fruit/current/index.html\"},{\"name\":\"localhost:0/fruit.Fruit\",\"kind\":1,\"url\":\"localhost:0/fruit/current/Fruit/index.html\"}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/input/version-1/styles/pkldoc.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-Regular'),\n  url('../fonts/lato-v14-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Lato Bold'), local('Lato-Bold'),\n  url('../fonts/lato-v14-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Regular'), local('OpenSans-Regular'),\n  url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Open Sans Italic'), local('OpenSans-Italic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Open Sans Bold'), local('OpenSans-Bold'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Source Code Pro'), local('SourceCodePro-Regular'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Material Icons';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Material Icons'),\n  local('MaterialIcons-Regular'),\n  url(../fonts/MaterialIcons-Regular.woff2) format('woff2');\n}\n\n.material-icons {\n  /*noinspection CssNoGenericFontName*/\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 24px;\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  line-height: 1;\n  text-transform: none;\n  letter-spacing: normal;\n  word-wrap: normal;\n  white-space: nowrap;\n  direction: ltr;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  -moz-osx-font-smoothing: grayscale;\n  font-feature-settings: 'liga';\n}\n\ninput[type=search] {\n  -webkit-appearance: textfield;\n}\n\ninput[type=search]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\ninput::-moz-placeholder {\n  opacity: 1;\n}\n\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n  border: 0;\n  font-family: inherit;\n  font-size: 100%;\n  font-style: inherit;\n  font-weight: inherit;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  vertical-align: baseline;\n}\n\nbody {\n  margin: 0;\n  font-family: Lato, Arial, sans-serif;\n  background-color: #f0f3f6;\n  scroll-behavior: smooth;\n}\n\na, a:visited, a:hover, a:active {\n  color: inherit;\n}\n\na:hover {\n  text-decoration: none;\n  transition: 0s;\n}\n\ncode, .member-modifiers, .member-signature, .doc-comment pre, #search-results li.result, .result-name, .heading-name, .aka-name {\n  font-family: \"Source Code Pro\", monospace;\n  letter-spacing: -0.03em;\n}\n\nheader {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw; /* vw to make sure that positioning is the same whether or not vertical scrollbar is displayed */\n  height: 32px;\n  z-index: 1;\n  background-color: #364550;\n  padding: 7px 0 7px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n}\n\n#doc-title {\n  position: absolute;\n  margin-top: 8px;\n  margin-left: 15px;\n}\n\n#doc-title a {\n  color: #fff;\n  text-decoration: none;\n}\n\n#search {\n  position: relative;\n  width: 50vw;\n  margin: 0 auto;\n}\n\n#search-icon {\n  position: absolute;\n  left: 0;\n  top: 2px;\n  padding: 4px;\n  font-size: 21px;\n  color: #a5a9a9;\n}\n\n#search-input {\n  margin-top: 2px;\n  width: 100%;\n  height: 28px;\n  text-indent: 28px;\n  font-size: 0.85em;\n  background-color: rgba(255, 255, 255, 0.2);\n  border: none;\n  border-radius: 3px;\n  color: #fff;\n}\n\n#search-input:focus {\n  background-color: #6D7880;\n  outline: none;\n}\n\n#search-input::placeholder {\n  text-align: center;\n  color: #A5A9A9;\n}\n\n#search-input:focus::placeholder {\n  color: transparent;\n}\n\n#search-results {\n  position: fixed;\n  box-sizing: border-box;\n  top: 38px;\n  left: 25vw;\n  right: 25vw;\n  width: 50vw;\n  max-height: 80%;\n  color: #103a51;\n  background: white;\n  border: solid 1px #6D7880;\n  border-radius: 3px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n  white-space: nowrap;\n\n  overflow: auto; /* in safari, this slows down painting, blocking the ui */\n  /*noinspection CssUnknownProperty*/\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n}\n\n#search-results a {\n  text-decoration: none;\n}\n\n#search-results a:hover {\n  text-decoration: underline;\n}\n\n#search-results ul {\n  list-style: none;\n  font-size: 0.9em;\n}\n\n#search-results li {\n  padding: 0.2ch 3ch;\n  height: 17px; /* used same height regardless of which fonts are used in content */\n}\n\n#search-results li.heading {\n  background-color: #f0f3f6;\n  padding: 0.4ch 1ch;\n}\n\n#search-results li.result {\n  font-size: 0.9em;\n}\n\n#search-results .keyword {\n  color: #000082;\n}\n\n#search-results .highlight {\n  font-weight: bold;\n}\n\n#search-results .context {\n  color: gray;\n}\n\n#search-results .selected, #search-results .selected .keyword, #search-results .selected .aka, #search-results .selected .context {\n  background: darkblue;\n  color: white;\n}\n\n#search-results .deprecated {\n  text-decoration: line-through;\n}\n\n/* make sure that line-through of highlighted region of selected search result has the right color */\n#search-results .deprecated.selected .highlight {\n  text-decoration: line-through;\n}\n\nmain {\n  width: 70%;\n  margin: 60px auto 20px;\n}\n\n.declaration-parent-link {\n  margin: 0 0 1rem;\n}\n\n#declaration-title {\n  font-size: 2em;\n  font-weight: bold;\n  color: #103a51;\n  margin: 0.5rem 0;\n}\n\n#declaration-version {\n  color: #A5A9A9;\n  font-size: 0.9em;\n  vertical-align: bottom;\n  padding-left: 0.25em;\n}\n\n.member-group-links {\n  margin: 0.75em 0 1em 0;\n}\n\n.member-group-links li {\n  display: inline-block;\n  margin-right: 1em;\n}\n\n.member-info {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  line-height: 1.5;\n  margin-top: 0.5em;\n  font-size: 0.9em;\n}\n\n.member-info dt {\n  grid-column: 1;\n  text-align: right;\n}\n\n.member-info dd {\n  grid-column: 2;\n  margin-left: 0.5em;\n}\n\n.copy-uri-button {\n  cursor: pointer;\n  font-size: inherit;\n  margin-left: 0.5em;\n}\n\n.member-group {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.member-group-title {\n  margin: 1rem;\n  font-weight: bold;\n  color: #103a51;\n}\n\n.toggle-inherited-members {\n  font-size: 0.9em;\n  font-weight: normal;\n  margin-left: 0.5em;\n}\n\n.button-link {\n  text-decoration: underline;\n}\n\n.button-link:hover, .button-link:active {\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.member-group ul {\n  list-style: none;\n}\n\n.member-group li {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.anchor,\n.anchor-param1,\n.anchor-param2,\n.anchor-param3,\n.anchor-param4,\n.anchor-param5,\n.anchor-param6,\n.anchor-param7,\n.anchor-param8,\n.anchor-param9 {\n  position: absolute;\n  top: -60px;\n  left: 0;\n}\n\n.anchor:target ~ .member,\n.anchor-param1:target ~ .member,\n.anchor-param2:target ~ .member,\n.anchor-param3:target ~ .member,\n.anchor-param4:target ~ .member,\n.anchor-param5:target ~ .member,\n.anchor-param6:target ~ .member,\n.anchor-param7:target ~ .member,\n.anchor-param8:target ~ .member,\n.anchor-param9:target ~ .member {\n  border-left: 3px solid #222832;\n}\n\n.anchor:target ~ .member .name-decl,\n.anchor-param1:target ~ .member .param1,\n.anchor-param2:target ~ .member .param2,\n.anchor-param3:target ~ .member .param3,\n.anchor-param4:target ~ .member .param4,\n.anchor-param5:target ~ .member .param5,\n.anchor-param6:target ~ .member .param6,\n.anchor-param7:target ~ .member .param7,\n.anchor-param8:target ~ .member .param8,\n.anchor-param9:target ~ .member .param9 {\n  font-weight: bold;\n}\n\n.member {\n  border-left: 3px solid transparent;\n  margin: 0 auto 0.5rem;\n  background-color: #fff;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n  font-size: 0.9em;\n  padding: 10px;\n  color: #222832;\n}\n\n.member:hover {\n  background-color: #f2f2f2;\n}\n\n.member-left {\n  width: 25%;\n  display: inline;\n  float: left;\n  padding-right: 6px;\n  min-height: 1px;\n  text-align: right;\n}\n\n.member-modifiers {\n  color: #000082;\n}\n\n.member-main {\n  display: block;\n  overflow: hidden;\n}\n\n.member-deprecated {\n  text-decoration: line-through;\n}\n\n.member-selflink {\n  visibility: hidden;\n  display: inline;\n  float: left;\n  padding-right: 20px;\n  color: #222832;\n  text-decoration: none;\n}\n\n.member-source-link {\n  visibility: hidden;\n  color: #fff;\n  background-color: #868e96;\n  display: inline-block;\n  margin-left: 1em;\n  padding: .25em .4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  vertical-align: bottom;\n  border-radius: .25rem\n}\n\n.member-source-link:visited, .member-source-link:hover, .member-source-link:active {\n  color: #fff;\n}\n\n.member:hover .member-source-link, .member:hover .member-selflink {\n  visibility: visible;\n}\n\n.member.inherited, .member.hidden-member {\n  opacity: 0.75;\n}\n\n.member.inherited .context {\n  color: gray;\n}\n\n.member.with-page-link, .member.with-expandable-docs {\n  cursor: pointer;\n}\n\n.member .expandable-docs-icon {\n  float: right;\n}\n\n/*\nDon't style a.name-decl as link\nbecause the entire .member.with-page-link is effectively a link (via JS).\n*/\n.member.with-page-link a.name-decl {\n  text-decoration: none;\n}\n\n.expandable {\n  transform: scaleY(1);\n  transition: transform 0.25s;\n}\n\n.expandable.collapsed {\n  transform: scaleY(0);\n}\n\n.expandable.hidden {\n  display: none;\n}\n\n#_declaration .expandable {\n  transform: none;\n  transition: none;\n}\n\n#_declaration .expandable.collapsed {\n  mask: linear-gradient(rgb(0 0 0), transparent) content-box;\n  height: 100px;\n}\n\n#_declaration .expandable.hidden {\n  display: block;\n}\n\n/* show an otherwise hidden inherited member if it's a link target */\n.anchor:target + .expandable.collapsed.hidden {\n  display: inherit;\n  transform: scaleY(1);\n}\n\n.doc-comment {\n  color: #103a51;\n  margin-top: 0.5rem;\n  font-family: \"Open Sans\", sans-serif;\n  font-size: 0.9em;\n}\n\n.doc-comment p {\n  margin: 0.7em 0;\n}\n\n.doc-comment p:first-child {\n  margin-top: 0;\n}\n\n.doc-comment p:last-child {\n  margin-bottom: 0;\n}\n\n.doc-comment h1,\n.doc-comment h2,\n.doc-comment h3,\n.doc-comment h4,\n.doc-comment h5,\n.doc-comment h6 {\n  margin-bottom: 0.7em;\n  margin-top: 1.4em;\n  display: block;\n  text-align: left;\n  font-weight: bold;\n}\n\n.doc-comment pre {\n  padding: 0.5em;\n  border: 0 solid #ddd;\n  background-color: #364550;\n  color: #ddd;\n  margin: 5px 0;\n  display: block;\n  border-radius: 0.2em;\n  overflow-x: auto;\n}\n\n.doc-comment ul {\n  display: block;\n  list-style: circle;\n  padding-left: 20px;\n}\n\n.doc-comment ol {\n  display: block;\n  padding-left:20px;\n}\n\n.doc-comment ol.decimal {\n  list-style: decimal;\n}\n\n.doc-comment ol.lowerAlpha {\n  list-style: lower-alpha;\n}\n\n.doc-comment ol.upperAlpha {\n  list-style: upper-alpha;\n}\n\n.doc-comment ol.lowerRoman {\n  list-style: lower-roman;\n}\n\n.doc-comment ol.upperRoman {\n  list-style: upper-roman;\n}\n\n.doc-comment li {\n  display: list-item;\n}\n\n.doc-comment code {\n  font-weight: normal;\n}\n\n.doc-comment em, .doc-comment i {\n  font-style: italic;\n}\n\n.doc-comment strong, .doc-comment b {\n  font-weight: bold;\n}\n\n.runtime-data.hidden {\n  display: none;\n}\n\n.runtime-data .current-version {\n  font-weight: bold;\n}\n\n/*\nStyling for Markdown tables in doc comments.\nFrom: https://gist.github.com/andyferra/2554919\n*/\n\ntable {\n  padding: 0;\n}\n\ntable tr {\n  border-top: 1px solid #cccccc;\n  background-color: white;\n  margin: 0;\n  padding: 0;\n}\n\ntable tr:nth-child(2n) {\n  background-color: #f8f8f8;\n}\n\ntable tr th {\n  font-weight: bold;\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr td {\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr th :first-child, table tr td :first-child {\n  margin-top: 0;\n}\n\ntable tr th :last-child, table tr td :last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/.pkldoc/VERSION",
    "content": "2"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/Module Containing Spaces/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module Containing Spaces (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.Module Containing Spaces\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.`Module Containing Spaces`<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.`Module Containing Spaces`</span></div>\n        <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/Module%20Containing%20Spaces.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/Module%20Containing%20Spaces.pkl\">Module Containing Spaces.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/baseModule/BaseClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>BaseClass (com.package1/baseModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/BaseClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/BaseClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-class-name=\"BaseClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.baseModule</a>\n      <h1 id=\"declaration-title\">BaseClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">BaseClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/baseModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>baseModule (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.baseModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.baseModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/baseModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/baseModule.pkl\">baseModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"BaseClass.html\" class=\"name-decl\">BaseClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classAnnotations/AnnotatedClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClass (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClass</span></div>\n        <div class=\"doc-comment\">Deprecated.</div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classAnnotations/AnnotatedClss.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClss (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClss\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClss<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClss</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClss</code> thought to have a correctly spelled name.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClssWithExpandableComment (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClssWithExpandableComment\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClssWithExpandableComment<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClssWithExpandableComment</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClssWithExpandableComment</code> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classAnnotations.pkl\">classAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"AnnotatedClss\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClss\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClss.html\" class=\"name-decl\">AnnotatedClss</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClssWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClssWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClssWithExpandableComment.html\" class=\"name-decl\">AnnotatedClssWithExpandableComment</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClass.html\" class=\"name-decl\">AnnotatedClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated.</div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments1 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments2 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments3 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments3</span></div>\n        <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments4 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments4</span></div>\n        <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph2, line2).</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments5.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments5 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments5.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments5.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments5\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments5<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments5</span></div>\n        <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments6.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments6 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments6.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments6.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments6\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments6<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments6</span></div>\n        <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments7.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments7 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments7.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments7.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments7\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments7<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments7</span></div>\n        <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/Comments8.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments8 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments8.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments8.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments8\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments8<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments8</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Installation</h2>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classComments.pkl\">classComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>git status</code></td>\n<td>List all <em>new or modified</em> files</td>\n</tr>\n<tr>\n<td><code>git diff</code></td>\n<td>Show file differences that <strong>haven't been</strong> staged</td>\n</tr>\n</tbody>\n</table></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments1.html\" class=\"name-decl\">Comments1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments2.html\" class=\"name-decl\">Comments2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments3.html\" class=\"name-decl\">Comments3</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments4.html\" class=\"name-decl\">Comments4</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments5\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments5.html\" class=\"name-decl\">Comments5</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments6\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments6.html\" class=\"name-decl\">Comments6</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments7\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments7.html\" class=\"name-decl\">Comments7</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments8\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments8.html\" class=\"name-decl\">Comments8</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classInheritance/MyClass1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass1 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass1.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classInheritance/MyClass2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass2 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">MyClass2</span> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classInheritance/MyClass3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass3 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass3</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classInheritance/MyClass4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass4 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass4</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classInheritance</span></div>\n        <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classInheritance.pkl\">classInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass1.html\" class=\"name-decl\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass2.html\" class=\"name-decl\">MyClass2</a> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass3.html\" class=\"name-decl\">MyClass3</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass4.html\" class=\"name-decl\">MyClass4</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classMethodComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodComments.pkl\">classMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classMethodModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodModifiers.pkl\">classMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classMethodTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeAnnotations.pkl\">classMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeReferences.pkl\">classMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ClassWithAnnotatedProperty (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"ClassWithAnnotatedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">ClassWithAnnotatedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ClassWithAnnotatedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyAnnotations.pkl\">classPropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ClassWithAnnotatedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ClassWithAnnotatedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ClassWithAnnotatedProperty.html\" class=\"name-decl\">ClassWithAnnotatedProperty</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classPropertyComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyComments.pkl\">classPropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classPropertyModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with multiple modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyModifiers.pkl\">classPropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classPropertyTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl\">classPropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classPropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeReferences.pkl\">classPropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classTypeConstraints/Address.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Address (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Address.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Address.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Address\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Address<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Address</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"street\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#street\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">street</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"city\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#city\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">city</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classTypeConstraints/Person1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person1 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(length &gt;= 3)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"address\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">address</span>: <a href=\"Address.html\" class=\"name-ref\">Address</a>(street != city)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classTypeConstraints/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classTypeConstraints/Project.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Project (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Project.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Project.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Project\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Project<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Project</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"type\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#type\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">type</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(oneOf(List(&quot;open-source&quot;, &quot;closed-source&quot;)))?<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"contacts\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#contacts\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">contacts</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty), <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)&gt;(length &gt; 10, length &lt; 20)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/classTypeConstraints/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classTypeConstraints (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classTypeConstraints<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classTypeConstraints</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classTypeConstraints.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classTypeConstraints.pkl\">classTypeConstraints.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emailAddress\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emailAddress\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emailAddress</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person1.html\" class=\"name-decl\">Person1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Address\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Address.html\" class=\"name-decl\">Address</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Project\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Project\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Project.html\" class=\"name-decl\">Project</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/docExampleSubject1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject1.pkl\">docExampleSubject1.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a>, <a href=\"https://example.com/package1/docExample2.pkl\">docExample2</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/docExampleSubject2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject2.pkl\">docExampleSubject2.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"y\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#y\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">y</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/docLinks/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/docLinks:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.docLinks</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <code>Person.name</code>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"call()\" class=\"anchor\"> </div>\n            <div id=\"call().number\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#call()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">call</span>(<span class=\"param1\">number</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code>\n<code>number</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/docLinks/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docLinks (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docLinks<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docLinks</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docLinks.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docLinks.pkl\">docLinks.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"age\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#age\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">age</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<code>age</code>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"sing()\" class=\"anchor\"> </div>\n            <div id=\"sing().song\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#sing()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">sing</span>(<span class=\"param1\">song</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <code>sing()</code>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>song</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"PersonList\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#PersonList\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#PersonList\" class=\"name-decl\">PersonList</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>PersonList</code>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package1 (1.2.3) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package1/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package1/1.2.3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package1</span></div>\n        <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>package1-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.2.3</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/\">https://example.com/package1/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package1/\">https://issues.apple.com/package1/</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../com.package2/4.5.6/index.html\">com.package2:4.5.6</a>, <span>com.externalpackage:7.8.9</span></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Docs for Package 1.</p><ul>\n<li>\n<p><a href=\"docLinks/index.html\"><code>docLinks</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#age\"><code>docLinks.age</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#sing()\"><code>docLinks.sing()</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html\"><code>docLinks.Person</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html#name\"><code>docLinks.Person.name</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#PersonList\"><code>docLinks.PersonList</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a></p>\n</li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1.Module%20Containing%20Spaces\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.Module%20Containing%20Spaces\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module%20Containing%20Spaces/index.html\">com.package1.`Module Containing Spaces`</a></div>\n                <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.baseModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.baseModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./baseModule/index.html\">com.package1.baseModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classAnnotations/index.html\">com.package1.classAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classComments/index.html\">com.package1.classComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classInheritance/index.html\">com.package1.classInheritance</a></div>\n                <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodComments/index.html\">com.package1.classMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodModifiers/index.html\">com.package1.classMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeAnnotations/index.html\">com.package1.classMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeReferences/index.html\">com.package1.classMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyAnnotations/index.html\">com.package1.classPropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyComments/index.html\">com.package1.classPropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyModifiers/index.html\">com.package1.classPropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeAnnotations/index.html\">com.package1.classPropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeReferences/index.html\">com.package1.classPropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classTypeConstraints\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classTypeConstraints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classTypeConstraints/index.html\">com.package1.classTypeConstraints</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject1/index.html\">com.package1.docExampleSubject1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject2/index.html\">com.package1.docExampleSubject2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docLinks\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docLinks\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docLinks/index.html\">com.package1.docLinks</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"shared/index.html\"><code>shared</code></a>, <a href=\"shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"docLinks/index.html#age\"><code>age</code></a>, <a href=\"docLinks/index.html#sing()\"><code>sing()</code></a>, <a href=\"docLinks/Person.html\"><code>Person</code></a>, <a href=\"docLinks/Person.html#name\"><code>Person.name</code></a>, <a href=\"docLinks/Person.html#call()\"><code>Person.call()</code></a>, <a href=\"docLinks/index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.methodAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.methodAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./methodAnnotations/index.html\">com.package1.methodAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleComments/index.html\">com.package1.moduleComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleExtend\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleExtend\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleExtend/index.html\">com.package1.moduleExtend</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleInfoAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleInfoAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleInfoAnnotation/index.html\">com.package1.moduleInfoAnnotation</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodCommentInheritance/index.html\">com.package1.moduleMethodCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodComments/index.html\">com.package1.moduleMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodModifiers/index.html\">com.package1.moduleMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeAnnotations/index.html\">com.package1.moduleMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeReferences/index.html\">com.package1.moduleMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyAnnotations/index.html\">com.package1.modulePropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyCommentInheritance/index.html\">com.package1.modulePropertyCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyComments/index.html\">com.package1.modulePropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyModifiers/index.html\">com.package1.modulePropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeAnnotations/index.html\">com.package1.modulePropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeReferences/index.html\">com.package1.modulePropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes1/index.html\">com.package1.moduleTypes1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes2/index.html\">com.package1.moduleTypes2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.nested.nested2.nestedModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.nested.nested2.nestedModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./nested/nested2/nestedModule/index.html\">com.package1.nested.nested2.nestedModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"referenceToExternalPackage\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#referenceToExternalPackage\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./ternalPackage/index.html\">referenceToExternalPackage</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.shared\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.shared\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./shared/index.html\">com.package1.shared</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases/index.html\">com.package1.typealiases</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases2/index.html\">com.package1.typealiases2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typeAliasInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typeAliasInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typeAliasInheritance/index.html\">com.package1.typeAliasInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unionTypes\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unionTypes\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unionTypes/index.html\">com.package1.unionTypes</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedClass/index.html\">com.package1.unlistedClass</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedMethod\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedMethod\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedMethod/index.html\">com.package1.unlistedMethod</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedProperty/index.html\">com.package1.unlistedProperty</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/methodAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>methodAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/methodAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/methodAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.methodAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.methodAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.methodAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/methodAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/methodAnnotations.pkl\">methodAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthod()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthod</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>mthod()</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthodWithExpandableComment()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthodWithExpandableComment()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthodWithExpandableComment</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#mthod()\"><code>mthod()</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#method()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleComments.pkl\">moduleComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleExtend/ExtendClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ExtendClass (com.package1/moduleExtend:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-class-name=\"ExtendClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleExtend</a>\n      <h1 id=\"declaration-title\">ExtendClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ExtendClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleExtend/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleExtend (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleExtend<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleExtend</span> extends <a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleExtend.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleExtend.pkl\">moduleExtend.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../baseModule/BaseClass.html\" class=\"name-decl\">BaseClass</a><span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ExtendClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ExtendClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ExtendClass.html\" class=\"name-decl\">ExtendClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleInfoAnnotation/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleInfoAnnotation (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleInfoAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleInfoAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleInfoAnnotation</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleInfoAnnotation.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleInfoAnnotation.pkl\">moduleInfoAnnotation.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleMethodCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodCommentInheritance</span> extends <a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl\">moduleMethodCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.moduleMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodComments.pkl\">moduleMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodModifiers.pkl\">moduleMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl\">moduleMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/moduleMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeReferences.pkl\">moduleMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation1 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation1</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation.html\" class=\"name-ref\">UserDefinedAnnotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation2 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation2</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation2.html\" class=\"name-ref\">UserDefinedAnnotation2</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyAnnotations.pkl\">modulePropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prperty\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>prperty</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prpertyWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prpertyWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prpertyWithExpandableComment</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#prperty\"><code>prperty</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation1.html\" class=\"name-decl\">UserDefinedAnnotation1</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation2.html\" class=\"name-decl\">UserDefinedAnnotation2</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyCommentInheritance</span> extends <a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl\">modulePropertyCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.modulePropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyComments.pkl\">modulePropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyModifiers.pkl\">modulePropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl\">modulePropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/modulePropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/modulePropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeReferences.pkl\">modulePropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleTypes1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes1.pkl\">moduleTypes1.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"n\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#n\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">n</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleTypes2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/moduleTypes2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleTypes2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/moduleTypes2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes2.pkl\">moduleTypes2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/nested/nested2/nestedModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.nested.nested2.nestedModule</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/nested/nested2/nestedModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>nestedModule (com.package1/nested/nested2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.nested.nested2.nestedModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.nested.nested2.nestedModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/nested/nested2/nestedModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/nested/nested2/nestedModule.pkl\">nestedModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\"},\"summary\":\"Docs for Package 1.\",\"deprecation\":\"com.package1 is deprecated\",\"sourceCode\":\"https://example.com/package1/\",\"sourceCodeUrlScheme\":\"https://example.com/package1%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"}},{\"ref\":{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\"},\"summary\":\"This is a module that has spaces in its name.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"BaseClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClss\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClssWithExpandableComment\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments4\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments5\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments6\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments7\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments8\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\"},\"summary\":\"Class inheritance involving abstract, open, and final classes.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass3\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass4\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\"},\"summary\":\"Class methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\"},\"summary\":\"Class methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\"},\"summary\":\"Class methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\"},\"summary\":\"Class methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ClassWithAnnotatedProperty\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\"},\"summary\":\"Class properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\"},\"summary\":\"Class properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\"},\"summary\":\"Class properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\"},\"summary\":\"Class properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Project\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\"},\"summary\":\"[external1], [external1.MyClass]\\n[shared], [shared.MyClass]\\n[age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\\n[docLinks], [docLinks.age], [docLinks.sing()],\\n[docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\\n[custom *link* text][docLinks.sing()]\\n[module], [module.age], [module.sing()],\\n[module.Person], [module.Person.name], [module.PersonList],\\n[custom *link* text][module.sing()]\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"PersonList\",\"isTypeAlias\":true},\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ExtendClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\"},\"summary\":\"Module methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\"},\"summary\":\"Module methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\"},\"summary\":\"Module methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\"},\"summary\":\"Module methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\"},\"summary\":\"Module properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\"},\"summary\":\"Module properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\"},\"summary\":\"Module properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\"},\"summary\":\"Module properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"baseModule/index.html\"},{\"name\":\"baseProperty\",\"kind\":5,\"url\":\"baseModule/index.html#baseProperty\",\"sig\":\": unknown\",\"parId\":1},{\"name\":\"baseMethod\",\"kind\":4,\"url\":\"baseModule/index.html#baseMethod()\",\"sig\":\"(): unknown\",\"parId\":1},{\"name\":\"BaseClass\",\"kind\":3,\"url\":\"baseModule/BaseClass.html\",\"parId\":1},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"classAnnotations/index.html\"},{\"name\":\"AnnotatedClss\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClss.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClssWithExpandableComment\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClssWithExpandableComment.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClass\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClass.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"classComments/index.html\"},{\"name\":\"Comments1\",\"kind\":3,\"url\":\"classComments/Comments1.html\",\"parId\":9},{\"name\":\"Comments2\",\"kind\":3,\"url\":\"classComments/Comments2.html\",\"parId\":9},{\"name\":\"Comments3\",\"kind\":3,\"url\":\"classComments/Comments3.html\",\"parId\":9},{\"name\":\"Comments4\",\"kind\":3,\"url\":\"classComments/Comments4.html\",\"parId\":9},{\"name\":\"Comments5\",\"kind\":3,\"url\":\"classComments/Comments5.html\",\"parId\":9},{\"name\":\"Comments6\",\"kind\":3,\"url\":\"classComments/Comments6.html\",\"parId\":9},{\"name\":\"Comments7\",\"kind\":3,\"url\":\"classComments/Comments7.html\",\"parId\":9},{\"name\":\"Comments8\",\"kind\":3,\"url\":\"classComments/Comments8.html\",\"parId\":9},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"classInheritance/index.html\"},{\"name\":\"MyClass1\",\"kind\":3,\"url\":\"classInheritance/MyClass1.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass1.html#property1\",\"sig\":\": Boolean\",\"parId\":19},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass1.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":19},{\"name\":\"MyClass2\",\"kind\":3,\"url\":\"classInheritance/MyClass2.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property1\",\"sig\":\": Boolean\",\"parId\":22},{\"name\":\"property2\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property2\",\"sig\":\": String\",\"parId\":22},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"method2\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method2()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"MyClass3\",\"kind\":3,\"url\":\"classInheritance/MyClass3.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass3.html#property1\",\"sig\":\": Boolean\",\"parId\":27},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass3.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":27},{\"name\":\"MyClass4\",\"kind\":3,\"url\":\"classInheritance/MyClass4.html\",\"parId\":18},{\"name\":\"property4\",\"kind\":5,\"url\":\"classInheritance/MyClass4.html#property4\",\"sig\":\": String\",\"parId\":30},{\"name\":\"method3\",\"kind\":4,\"url\":\"classInheritance/MyClass4.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":30},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"classMethodComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classMethodComments/Comments.html\",\"parId\":33},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method1()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method2()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method3()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method4()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method5()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method6()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method7()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"classMethodModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classMethodModifiers/Modifiers.html\",\"parId\":42},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodModifiers/Modifiers.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":43},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"classMethodTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html\",\"parId\":45},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method1()\",\"sig\":\"(): unknown\",\"parId\":46},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":46},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":46},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method4()\",\"sig\":\"(): String\",\"parId\":46},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":46},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":46},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":46},{\"name\":\"method8\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":46},{\"name\":\"method9\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":46},{\"name\":\"method10\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":46},{\"name\":\"method11\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":46},{\"name\":\"method12\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":46},{\"name\":\"method13\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":46},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"classMethodTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classMethodTypeReferences/MyClass.html\",\"parId\":60},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classMethodTypeReferences/TypeReferences.html\",\"parId\":60},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":62},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":62},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"classPropertyAnnotations/index.html\"},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":68},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":69},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":69},{\"name\":\"ClassWithAnnotatedProperty\",\"kind\":3,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html\",\"parId\":68},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":72},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"classPropertyComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classPropertyComments/Comments.html\",\"parId\":74},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property1\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property2\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property3\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property4\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property5\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property6\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property7\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"classPropertyModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classPropertyModifiers/Modifiers.html\",\"parId\":83},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property2\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property3\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property4\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"classPropertyTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html\",\"parId\":88},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property1\",\"sig\":\": unknown\",\"parId\":89},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property2\",\"sig\":\": Float\",\"parId\":89},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property3\",\"sig\":\": List<String>\",\"parId\":89},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property4\",\"sig\":\": Set<String>\",\"parId\":89},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":89},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property6\",\"sig\":\": String?\",\"parId\":89},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property7\",\"sig\":\": () -> String\",\"parId\":89},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property8\",\"sig\":\": String -> Int\",\"parId\":89},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":89},{\"name\":\"property10\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":89},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"classPropertyTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classPropertyTypeReferences/MyClass.html\",\"parId\":100},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classPropertyTypeReferences/TypeReferences.html\",\"parId\":100},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property1\",\"sig\":\": MyClass\",\"parId\":102},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":102},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":102},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":102},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property5\",\"sig\":\": MyClass?\",\"parId\":102},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":102},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":102},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":102},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":102},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"classTypeConstraints/index.html\"},{\"name\":\"emailAddress\",\"kind\":5,\"url\":\"classTypeConstraints/index.html#emailAddress\",\"sig\":\": unknown\",\"parId\":112},{\"name\":\"Person1\",\"kind\":3,\"url\":\"classTypeConstraints/Person1.html\",\"parId\":112},{\"name\":\"name\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#name\",\"sig\":\": String\",\"parId\":114},{\"name\":\"address\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#address\",\"sig\":\": Address\",\"parId\":114},{\"name\":\"Person2\",\"kind\":3,\"url\":\"classTypeConstraints/Person2.html\",\"parId\":112},{\"name\":\"email\",\"kind\":5,\"url\":\"classTypeConstraints/Person2.html#email\",\"sig\":\": String\",\"parId\":117},{\"name\":\"Address\",\"kind\":3,\"url\":\"classTypeConstraints/Address.html\",\"parId\":112},{\"name\":\"street\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#street\",\"sig\":\": String\",\"parId\":119},{\"name\":\"city\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#city\",\"sig\":\": String\",\"parId\":119},{\"name\":\"Project\",\"kind\":3,\"url\":\"classTypeConstraints/Project.html\",\"parId\":112},{\"name\":\"type\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#type\",\"sig\":\": String?\",\"parId\":122},{\"name\":\"contacts\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#contacts\",\"sig\":\": Map<String, String>\",\"parId\":122},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"docExampleSubject1/index.html\"},{\"name\":\"x\",\"kind\":5,\"url\":\"docExampleSubject1/index.html#x\",\"sig\":\": Int\",\"parId\":125},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"docExampleSubject2/index.html\"},{\"name\":\"y\",\"kind\":5,\"url\":\"docExampleSubject2/index.html#y\",\"sig\":\": Int\",\"parId\":127},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"docLinks/index.html\"},{\"name\":\"age\",\"kind\":5,\"url\":\"docLinks/index.html#age\",\"sig\":\": Int\",\"parId\":129},{\"name\":\"sing\",\"kind\":4,\"url\":\"docLinks/index.html#sing()\",\"sig\":\"(song): unknown\",\"parId\":129},{\"name\":\"Person\",\"kind\":3,\"url\":\"docLinks/Person.html\",\"parId\":129},{\"name\":\"name\",\"kind\":5,\"url\":\"docLinks/Person.html#name\",\"sig\":\": String\",\"parId\":132},{\"name\":\"call\",\"kind\":4,\"url\":\"docLinks/Person.html#call()\",\"sig\":\"(number): unknown\",\"parId\":132},{\"name\":\"PersonList\",\"kind\":2,\"url\":\"docLinks/index.html#PersonList\",\"parId\":129},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"methodAnnotations/index.html\"},{\"name\":\"mthod\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthod()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"mthodWithExpandableComment\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthodWithExpandableComment()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"method\",\"kind\":4,\"url\":\"methodAnnotations/index.html#method()\",\"sig\":\"(): Int\",\"parId\":136,\"aka\":[\"function\"]},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"moduleExtend/index.html\"},{\"name\":\"extendProperty\",\"kind\":5,\"url\":\"moduleExtend/index.html#extendProperty\",\"sig\":\": unknown\",\"parId\":141},{\"name\":\"extendMethod\",\"kind\":4,\"url\":\"moduleExtend/index.html#extendMethod()\",\"sig\":\"(): unknown\",\"parId\":141},{\"name\":\"ExtendClass\",\"kind\":3,\"url\":\"moduleExtend/ExtendClass.html\",\"parId\":141},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"moduleMethodCommentInheritance/index.html\"},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodCommentInheritance/index.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":146},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"moduleMethodComments/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method1()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method2()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method3()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method4()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method5()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method6()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method7()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"moduleMethodModifiers/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodModifiers/index.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":156},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"moduleMethodTypeAnnotations/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method1()\",\"sig\":\"(): unknown\",\"parId\":158},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":158},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":158},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method4()\",\"sig\":\"(): String\",\"parId\":158},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":158},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":158},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":158},{\"name\":\"method8\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":158},{\"name\":\"method9\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":158},{\"name\":\"method10\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":158},{\"name\":\"method11\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":158},{\"name\":\"method12\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":158},{\"name\":\"method13\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":158},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"moduleMethodTypeReferences/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":172},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":172},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"moduleMethodTypeReferences/MyClass.html\",\"parId\":172},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"modulePropertyAnnotations/index.html\"},{\"name\":\"prperty\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prperty\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"prpertyWithExpandableComment\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prpertyWithExpandableComment\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"property\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#property\",\"sig\":\": unknown\",\"parId\":179,\"aka\":[\"field\",\"item\"]},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation1\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation1\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation2\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation2\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":179},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":186},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":186},{\"name\":\"UserDefinedAnnotation1\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html#nested\",\"sig\":\": UserDefinedAnnotation\",\"parId\":189},{\"name\":\"UserDefinedAnnotation2\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html#nested\",\"sig\":\": UserDefinedAnnotation2?\",\"parId\":191},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"modulePropertyCommentInheritance/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyCommentInheritance/index.html#property3\",\"sig\":\": Float\",\"parId\":193},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"modulePropertyComments/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property1\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property2\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property3\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property4\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property5\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property6\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property7\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property8\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property9\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property10\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"modulePropertyModifiers/index.html\"},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyModifiers/index.html#property2\",\"sig\":\": Float\",\"parId\":206},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"modulePropertyTypeAnnotations/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property1\",\"sig\":\": unknown\",\"parId\":208},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property2\",\"sig\":\": Float\",\"parId\":208},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property3\",\"sig\":\": List<String>\",\"parId\":208},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property4\",\"sig\":\": Set<String>\",\"parId\":208},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":208},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property6\",\"sig\":\": String?\",\"parId\":208},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property7\",\"sig\":\": () -> String\",\"parId\":208},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property8\",\"sig\":\": String -> Int\",\"parId\":208},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":208},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":208},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"modulePropertyTypeReferences/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property1\",\"sig\":\": MyClass\",\"parId\":219},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":219},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":219},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":219},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property5\",\"sig\":\": MyClass?\",\"parId\":219},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":219},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":219},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":219},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":219},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"modulePropertyTypeReferences/MyClass.html\",\"parId\":219},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"moduleTypes1/index.html\"},{\"name\":\"n\",\"kind\":5,\"url\":\"moduleTypes1/index.html#n\",\"sig\":\": Int\",\"parId\":230},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"moduleTypes2/index.html\"},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":232},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":232},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":232},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":232},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":232},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x6\",\"sig\":\": module\",\"parId\":232},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x7\",\"sig\":\": List<module>\",\"parId\":232},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x8\",\"sig\":\": String|module|Int\",\"parId\":232},{\"name\":\"Foo\",\"kind\":3,\"url\":\"moduleTypes2/Foo.html\",\"parId\":232},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":241},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":241},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":241},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":241},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":241},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x6\",\"sig\":\": module\",\"parId\":241},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x7\",\"sig\":\": List<module>\",\"parId\":241},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x8\",\"sig\":\": String|module|Int\",\"parId\":241},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"nested/nested2/nestedModule/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"nested/nested2/nestedModule/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":250},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"nested/nested2/nestedModule/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":250},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"nested/nested2/nestedModule/MyClass.html\",\"parId\":250},{\"name\":\"referenceToExternalPackage\",\"kind\":1,\"url\":\"ternalPackage/index.html\"},{\"name\":\"prop\",\"kind\":5,\"url\":\"ternalPackage/index.html#prop\",\"sig\":\": Class Two {}\",\"parId\":254},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"shared/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"shared/MyClass.html\",\"parId\":256},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"typealiases/index.html\"},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/index.html#uint\",\"sig\":\": UInt\",\"parId\":258},{\"name\":\"uints\",\"kind\":5,\"url\":\"typealiases/index.html#uints\",\"sig\":\": List<UInt>\",\"parId\":258},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/index.html#email\",\"sig\":\": Email\",\"parId\":258},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/index.html#emails\",\"sig\":\": List<Email>\",\"parId\":258},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/index.html#send()\",\"sig\":\"(email): Email\",\"parId\":258},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases/Person.html\",\"parId\":258},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/Person.html#uint\",\"sig\":\": UInt\",\"parId\":264},{\"name\":\"list\",\"kind\":5,\"url\":\"typealiases/Person.html#list\",\"sig\":\": List<UInt>\",\"parId\":264},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/Person.html#email\",\"sig\":\": Email\",\"parId\":264},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/Person.html#emails\",\"sig\":\": List<Email>\",\"parId\":264},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/Person.html#send()\",\"sig\":\"(email): Email\",\"parId\":264},{\"name\":\"Email\",\"kind\":2,\"url\":\"typealiases/index.html#Email\",\"parId\":258,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"typealiases2/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/index.html#res1\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/index.html#res2\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/index.html#res3\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/index.html#res4\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/index.html#res5\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/index.html#res6\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/index.html#res7\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/index.html#res8\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/index.html#res9\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases2/Person.html\",\"parId\":271},{\"name\":\"name\",\"kind\":5,\"url\":\"typealiases2/Person.html#name\",\"sig\":\": String\",\"parId\":281},{\"name\":\"Foo\",\"kind\":3,\"url\":\"typealiases2/Foo.html\",\"parId\":271},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res1\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res2\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res3\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res4\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res5\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res6\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res7\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res8\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res9\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"List2\",\"kind\":2,\"url\":\"typealiases2/index.html#List2\",\"parId\":271},{\"name\":\"Map2\",\"kind\":2,\"url\":\"typealiases2/index.html#Map2\",\"parId\":271},{\"name\":\"StringMap\",\"kind\":2,\"url\":\"typealiases2/index.html#StringMap\",\"parId\":271},{\"name\":\"MMap\",\"kind\":2,\"url\":\"typealiases2/index.html#MMap\",\"parId\":271},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"typeAliasInheritance/index.html\"},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#email2\",\"sig\":\": Email\",\"parId\":297},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#emails2\",\"sig\":\": List<Email>\",\"parId\":297},{\"name\":\"Person2\",\"kind\":3,\"url\":\"typeAliasInheritance/Person2.html\",\"parId\":297},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#email2\",\"sig\":\": Email\",\"parId\":300},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#emails2\",\"sig\":\": List<Email>\",\"parId\":300},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"unionTypes/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"unionTypes/index.html#res1\",\"sig\":\": Boolean|Number\",\"parId\":303},{\"name\":\"res2\",\"kind\":5,\"url\":\"unionTypes/index.html#res2\",\"sig\":\": \\\\\\\"foo\\\\\\\"|\\\\\\\"bar\\\\\\\"|\\\\\\\"baz\\\\\\\"\",\"parId\":303},{\"name\":\"res3\",\"kind\":5,\"url\":\"unionTypes/index.html#res3\",\"sig\":\": Boolean|List<String>\",\"parId\":303},{\"name\":\"res4\",\"kind\":5,\"url\":\"unionTypes/index.html#res4\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res5\",\"kind\":5,\"url\":\"unionTypes/index.html#res5\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res6\",\"kind\":5,\"url\":\"unionTypes/index.html#res6\",\"sig\":\": Boolean|List<String>?|Number\",\"parId\":303},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"unlistedClass/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedClass/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":310},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedClass/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":310},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"unlistedMethod/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedMethod/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":313},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedMethod/MyClass.html\",\"parId\":313},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"unlistedProperty/index.html\"},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedProperty/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":316},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedProperty/MyClass.html\",\"parId\":316}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/shared/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/shared:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.shared</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/shared/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>shared (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.shared<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.shared</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/shared.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/shared.pkl\">shared.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/shared.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/ternalPackage/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>referenceToExternalPackage (com.package1xternalPackage:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/ternalPackage/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/ternalPackage/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"referenceToExternalPackage\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">referenceToExternalPackage<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">referenceToExternalPackage</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/ternalPackage.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/ternalPackage.pkl\">ternalPackage.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"../../../com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.html\" class=\"name-ref\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/package1/ternalPackage.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\">Module3.<code>property {} four</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typeAliasInheritance/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/typeAliasInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typeAliasInheritance</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typeAliasInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typeAliasInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typeAliasInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typeAliasInheritance</span> extends <a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typeAliasInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typeAliasInheritance.pkl\">typeAliasInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/Person.html\" class=\"name-decl\">Person</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typealiases/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typealiases/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.typealiases</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases.pkl\">typealiases.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typealiases2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typealiases2/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/typealiases2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typealiases2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases2.pkl\">typealiases2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"List2\" class=\"anchor\"> </div>\n            <div id=\"List2.E\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#List2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#List2\" class=\"name-decl\">List2</a>&lt;<a class=\"param1\">E</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<span class=\"name-ref\">E</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Map2\" class=\"anchor\"> </div>\n            <div id=\"Map2.V\" class=\"anchor-param1\"> </div>\n            <div id=\"Map2.K\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#Map2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Map2\" class=\"name-decl\">Map2</a>&lt;<a class=\"param1\">V</a>, <a class=\"param2\">K</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">K</span>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"StringMap\" class=\"anchor\"> </div>\n            <div id=\"StringMap.V\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#StringMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#StringMap\" class=\"name-decl\">StringMap</a>&lt;<a class=\"param1\">V</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MMap\" class=\"anchor\"> </div>\n            <div id=\"MMap.X\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#MMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#MMap\" class=\"name-decl\">MMap</a>&lt;<a class=\"param1\">X</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">X</span>, <span class=\"name-ref\">X</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/unionTypes/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unionTypes (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unionTypes/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unionTypes/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unionTypes\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unionTypes<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unionTypes</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unionTypes.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unionTypes.pkl\">unionTypes.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: &quot;foo&quot;|&quot;bar&quot;|&quot;baz&quot;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/unlistedClass/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedClass (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedClass/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedClass/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedClass.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedClass.pkl\">unlistedClass.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/unlistedMethod/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedMethod:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedMethod</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/unlistedMethod/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedMethod (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedMethod<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedMethod</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedMethod.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedMethod.pkl\">unlistedMethod.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/unlistedProperty/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedProperty:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedProperty</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/1.2.3/unlistedProperty/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedProperty (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedProperty.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedProperty.pkl\">unlistedProperty.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/Module Containing Spaces/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module Containing Spaces (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package1/1.2.3/Module%20Containing%20Spaces/index.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.Module Containing Spaces\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.`Module Containing Spaces`<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.`Module Containing Spaces`</span></div>\n        <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/Module%20Containing%20Spaces.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/Module%20Containing%20Spaces.pkl\">Module Containing Spaces.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/baseModule/BaseClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>BaseClass (com.package1/baseModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/BaseClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/BaseClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-class-name=\"BaseClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.baseModule</a>\n      <h1 id=\"declaration-title\">BaseClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">BaseClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"BaseClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/baseModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>baseModule (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/baseModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/baseModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.baseModule\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.baseModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.baseModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/baseModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/baseModule.pkl\">baseModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"BaseClass.html\" class=\"name-decl\">BaseClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/baseModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classAnnotations/AnnotatedClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClass (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClass</span></div>\n        <div class=\"doc-comment\">Deprecated.</div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classAnnotations/AnnotatedClss.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClss (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClss\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClss<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClss</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClss</code> thought to have a correctly spelled name.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClss.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classAnnotations/AnnotatedClssWithExpandableComment.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>AnnotatedClssWithExpandableComment (com.package1/classAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-class-name=\"AnnotatedClssWithExpandableComment\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classAnnotations</a>\n      <h1 id=\"declaration-title\">AnnotatedClssWithExpandableComment<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature member-deprecated\">class <span class=\"name-decl\">AnnotatedClssWithExpandableComment</span></div>\n        <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n          <dt>Also known as:</dt>\n          <dd><code>OtherName</code></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>AnnotatedClssWithExpandableComment</code> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"AnnotatedClssWithExpandableComment.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classAnnotations.pkl\">classAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"AnnotatedClss\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClss\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClss.html\" class=\"name-decl\">AnnotatedClss</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClssWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClssWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClssWithExpandableComment.html\" class=\"name-decl\">AnnotatedClssWithExpandableComment</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>AnnotatedClass</code></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"AnnotatedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#AnnotatedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a href=\"AnnotatedClass.html\" class=\"name-decl\">AnnotatedClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated.</div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments1 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments2 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments3 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments3</span></div>\n        <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments4 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments4</span></div>\n        <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Class with multi-line and multi-paragraph doc comment (paragraph2, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph2, line2).</p></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments5.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments5 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments5.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments5.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments5\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments5<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments5</span></div>\n        <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments5.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments6.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments6 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments6.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments6.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments6\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments6<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments6</span></div>\n        <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments6.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments7.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments7 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments7.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments7.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments7\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments7<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments7</span></div>\n        <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments7.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/Comments8.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments8 (com.package1/classComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/Comments8.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/Comments8.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-class-name=\"Comments8\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classComments</a>\n      <h1 id=\"declaration-title\">Comments8<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments8</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Installation</h2>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments8.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.classComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classComments.pkl\">classComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>git status</code></td>\n<td>List all <em>new or modified</em> files</td>\n</tr>\n<tr>\n<td><code>git diff</code></td>\n<td>Show file differences that <strong>haven't been</strong> staged</td>\n</tr>\n</tbody>\n</table></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments1.html\" class=\"name-decl\">Comments1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments2.html\" class=\"name-decl\">Comments2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments3.html\" class=\"name-decl\">Comments3</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments4.html\" class=\"name-decl\">Comments4</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with multi-line and multi-paragraph doc comment (paragraph1, line1).\nClass with multi-line and multi-paragraph doc comment (paragraph1, line2).</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments5\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments5.html\" class=\"name-decl\">Comments5</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments6\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments6.html\" class=\"name-decl\">Comments6</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Class with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments7\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments7.html\" class=\"name-decl\">Comments7</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Class with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Comments8\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments8.html\" class=\"name-decl\">Comments8</a><a class=\"member-source-link\" href=\"https://example.com/package1/classComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classInheritance/MyClass1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass1 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass1.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classInheritance/MyClass2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass2 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">MyClass2</span> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classInheritance/MyClass3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass3 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass3<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">MyClass3</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classInheritance/MyClass4.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass4 (com.package1/classInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/MyClass4.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/MyClass4.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-class-name=\"MyClass4\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classInheritance</a>\n      <h1 id=\"declaration-title\">MyClass4<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass4</span> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Inherited property comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass4.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>function method1 in class MyClass2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a>.</span><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"index.html\" class=\"name-ref\">com.package1.classInheritance</a>)</span><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classInheritance</span></div>\n        <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classInheritance.pkl\">classInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass1.html\" class=\"name-decl\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass2.html\" class=\"name-decl\">MyClass2</a> extends <a href=\"MyClass1.html\" class=\"name-ref\">MyClass1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass3.html\" class=\"name-decl\">MyClass3</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MyClass4\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass4.html\" class=\"name-decl\">MyClass4</a> extends <a href=\"MyClass2.html\" class=\"name-ref\">MyClass2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classMethodComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodComments.pkl\">classMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classMethodModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodModifiers.pkl\">classMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classMethodTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeAnnotations.pkl\">classMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classMethodTypeReferences.pkl\">classMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyAnnotations/ClassWithAnnotatedProperty.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ClassWithAnnotatedProperty (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"ClassWithAnnotatedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">ClassWithAnnotatedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ClassWithAnnotatedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ClassWithAnnotatedProperty.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/classPropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyAnnotations.pkl\">classPropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ClassWithAnnotatedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ClassWithAnnotatedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ClassWithAnnotatedProperty.html\" class=\"name-decl\">ClassWithAnnotatedProperty</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyComments/Comments.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Comments (com.package1/classPropertyComments:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/Comments.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/Comments.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-class-name=\"Comments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyComments</a>\n      <h1 id=\"declaration-title\">Comments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Comments</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Comments.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyComments.pkl\">classPropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Comments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Comments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Comments.html\" class=\"name-decl\">Comments</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyModifiers/Modifiers.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Modifiers (com.package1/classPropertyModifiers:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-class-name=\"Modifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyModifiers</a>\n      <h1 id=\"declaration-title\">Modifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">abstract class <span class=\"name-decl\">Modifiers</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with multiple modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Modifiers.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyModifiers.pkl\">classPropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Modifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Modifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Modifiers.html\" class=\"name-decl\">Modifiers</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyModifiers.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyTypeAnnotations/TypeAnnotations.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeAnnotations (com.package1/classPropertyTypeAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-class-name=\"TypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeAnnotations</a>\n      <h1 id=\"declaration-title\">TypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeAnnotations.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl\">classPropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"TypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeAnnotations.html\" class=\"name-decl\">TypeAnnotations</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyTypeReferences/TypeReferences.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>TypeReferences (com.package1/classPropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-class-name=\"TypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classPropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">TypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">TypeReferences</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"TypeReferences.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classPropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classPropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classPropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classPropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classPropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classPropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classPropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classPropertyTypeReferences.pkl\">classPropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"TypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#TypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"TypeReferences.html\" class=\"name-decl\">TypeReferences</a><a class=\"member-source-link\" href=\"https://example.com/package1/classPropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classTypeConstraints/Address.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Address (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Address.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Address.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Address\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Address<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Address</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"street\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#street\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">street</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"city\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#city\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">city</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Address.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classTypeConstraints/Person1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person1 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(length &gt;= 3)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"address\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">address</span>: <a href=\"Address.html\" class=\"name-ref\">Address</a>(street != city)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classTypeConstraints/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classTypeConstraints/Project.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Project (com.package1/classTypeConstraints:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/Project.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/Project.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-class-name=\"Project\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.classTypeConstraints</a>\n      <h1 id=\"declaration-title\">Project<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Project</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"type\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#type\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">type</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(oneOf(List(&quot;open-source&quot;, &quot;closed-source&quot;)))?<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"contacts\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#contacts\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">contacts</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(!isEmpty), <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(emailAddress)&gt;(length &gt; 10, length &lt; 20)<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Project.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/classTypeConstraints/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>classTypeConstraints (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/classTypeConstraints/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/classTypeConstraints/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.classTypeConstraints\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.classTypeConstraints<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.classTypeConstraints</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/classTypeConstraints.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/classTypeConstraints.pkl\">classTypeConstraints.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emailAddress\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emailAddress\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emailAddress</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person1.html\" class=\"name-decl\">Person1</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Address\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Address\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Address.html\" class=\"name-decl\">Address</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Project\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Project\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Project.html\" class=\"name-decl\">Project</a><a class=\"member-source-link\" href=\"https://example.com/package1/classTypeConstraints.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/docExampleSubject1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject1.pkl\">docExampleSubject1.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a>, <a href=\"https://example.com/package1/docExample2.pkl\">docExample2</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/docExampleSubject2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docExampleSubject2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docExampleSubject2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docExampleSubject2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docExampleSubject2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docExampleSubject2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docExampleSubject2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docExampleSubject2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docExampleSubject2.pkl\">docExampleSubject2.pkl</a></dd>\n          <dt class=\"\">Examples:</dt>\n          <dd><a href=\"https://example.com/package1/docExample.pkl\">docExample</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"y\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#y\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">y</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docExampleSubject2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/docLinks/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/docLinks:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.docLinks</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <code>Person.name</code>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"call()\" class=\"anchor\"> </div>\n            <div id=\"call().number\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#call()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">call</span>(<span class=\"param1\">number</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code>\n<code>number</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/docLinks/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>docLinks (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/docLinks/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/docLinks/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.docLinks\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.docLinks<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.docLinks</span></div>\n        <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/docLinks.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/docLinks.pkl\">docLinks.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"age\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#age\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">age</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<code>age</code>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"sing()\" class=\"anchor\"> </div>\n            <div id=\"sing().song\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#sing()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">sing</span>(<span class=\"param1\">song</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <code>sing()</code>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>song</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <code>Person</code>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>Person.call()</code>, <a href=\"index.html#PersonList\"><code>PersonList</code></a>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>name</code>, <code>call()</code></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"PersonList\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#PersonList\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#PersonList\" class=\"name-decl\">PersonList</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/docLinks.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"../shared/index.html\"><code>shared</code></a>, <a href=\"../shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"index.html#age\"><code>age</code></a>, <a href=\"index.html#sing()\"><code>sing()</code></a>, <a href=\"Person.html\"><code>Person</code></a>, <a href=\"Person.html#name\"><code>Person.name</code></a>, <a href=\"Person.html#call()\"><code>Person.call()</code></a>, <code>PersonList</code>\n<a href=\"index.html\"><code>docLinks</code></a>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package1 (1.2.3) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package1/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package1/1.2.3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package1</span></div>\n        <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>package1-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.2.3</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/\">https://example.com/package1/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package1/\">https://issues.apple.com/package1/</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../com.package2/4.5.6/index.html\">com.package2:4.5.6</a>, <span>com.externalpackage:7.8.9</span></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><p>Docs for Package 1.</p><ul>\n<li>\n<p><a href=\"docLinks/index.html\"><code>docLinks</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#age\"><code>docLinks.age</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#sing()\"><code>docLinks.sing()</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html\"><code>docLinks.Person</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/Person.html#name\"><code>docLinks.Person.name</code></a></p>\n</li>\n<li>\n<p><a href=\"docLinks/index.html#PersonList\"><code>docLinks.PersonList</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a></p>\n</li>\n<li>\n<p><a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a></p>\n</li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1.Module%20Containing%20Spaces\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.Module%20Containing%20Spaces\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module%20Containing%20Spaces/index.html\">com.package1.`Module Containing Spaces`</a></div>\n                <div class=\"doc-comment\"><p>This is a module that has spaces in its name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.baseModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.baseModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./baseModule/index.html\">com.package1.baseModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classAnnotations/index.html\">com.package1.classAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classComments/index.html\">com.package1.classComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classInheritance/index.html\">com.package1.classInheritance</a></div>\n                <div class=\"doc-comment\"><p>Class inheritance involving abstract, open, and final classes.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodComments/index.html\">com.package1.classMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodModifiers/index.html\">com.package1.classMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeAnnotations/index.html\">com.package1.classMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classMethodTypeReferences/index.html\">com.package1.classMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyAnnotations/index.html\">com.package1.classPropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyComments/index.html\">com.package1.classPropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyModifiers/index.html\">com.package1.classPropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeAnnotations/index.html\">com.package1.classPropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Class properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classPropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classPropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classPropertyTypeReferences/index.html\">com.package1.classPropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Class properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.classTypeConstraints\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.classTypeConstraints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./classTypeConstraints/index.html\">com.package1.classTypeConstraints</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject1/index.html\">com.package1.docExampleSubject1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docExampleSubject2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docExampleSubject2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docExampleSubject2/index.html\">com.package1.docExampleSubject2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.docLinks\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.docLinks\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./docLinks/index.html\">com.package1.docLinks</a></div>\n                <div class=\"doc-comment\"><p><a href=\"https://example.com/docs/externalpackage/external1/index.html\"><code>external1</code></a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\"><code>external1.MyClass</code></a>\n<a href=\"shared/index.html\"><code>shared</code></a>, <a href=\"shared/MyClass.html\"><code>shared.MyClass</code></a>\n<a href=\"docLinks/index.html#age\"><code>age</code></a>, <a href=\"docLinks/index.html#sing()\"><code>sing()</code></a>, <a href=\"docLinks/Person.html\"><code>Person</code></a>, <a href=\"docLinks/Person.html#name\"><code>Person.name</code></a>, <a href=\"docLinks/Person.html#call()\"><code>Person.call()</code></a>, <a href=\"docLinks/index.html#PersonList\"><code>PersonList</code></a>\n<code>docLinks</code>, <code>docLinks.age</code>, <code>docLinks.sing()</code>,\n<code>docLinks.Person</code>, <code>docLinks.Person.name</code>, <code>docLinks.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a>\n<code>module</code>, <code>module.age</code>, <code>module.sing()</code>,\n<code>module.Person</code>, <code>module.Person.name</code>, <code>module.PersonList</code>,\n<a href=\"docLinks/index.html#sing()\">custom <em>link</em> text</a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.methodAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.methodAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./methodAnnotations/index.html\">com.package1.methodAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleComments/index.html\">com.package1.moduleComments</a></div>\n                <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleExtend\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleExtend\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleExtend/index.html\">com.package1.moduleExtend</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleInfoAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleInfoAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleInfoAnnotation/index.html\">com.package1.moduleInfoAnnotation</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodCommentInheritance/index.html\">com.package1.moduleMethodCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodComments/index.html\">com.package1.moduleMethodComments</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodModifiers/index.html\">com.package1.moduleMethodModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeAnnotations/index.html\">com.package1.moduleMethodTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleMethodTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleMethodTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleMethodTypeReferences/index.html\">com.package1.moduleMethodTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyAnnotations/index.html\">com.package1.modulePropertyAnnotations</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyCommentInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyCommentInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyCommentInheritance/index.html\">com.package1.modulePropertyCommentInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyComments\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyComments\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyComments/index.html\">com.package1.modulePropertyComments</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyModifiers\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyModifiers\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyModifiers/index.html\">com.package1.modulePropertyModifiers</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeAnnotations\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeAnnotations\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeAnnotations/index.html\">com.package1.modulePropertyTypeAnnotations</a></div>\n                <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.modulePropertyTypeReferences\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.modulePropertyTypeReferences\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./modulePropertyTypeReferences/index.html\">com.package1.modulePropertyTypeReferences</a></div>\n                <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes1/index.html\">com.package1.moduleTypes1</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.moduleTypes2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.moduleTypes2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./moduleTypes2/index.html\">com.package1.moduleTypes2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.nested.nested2.nestedModule\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.nested.nested2.nestedModule\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./nested/nested2/nestedModule/index.html\">com.package1.nested.nested2.nestedModule</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"referenceToExternalPackage\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#referenceToExternalPackage\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./ternalPackage/index.html\">referenceToExternalPackage</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.shared\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.shared\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./shared/index.html\">com.package1.shared</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases/index.html\">com.package1.typealiases</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typealiases2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typealiases2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typealiases2/index.html\">com.package1.typealiases2</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.typeAliasInheritance\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.typeAliasInheritance\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./typeAliasInheritance/index.html\">com.package1.typeAliasInheritance</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unionTypes\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unionTypes\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unionTypes/index.html\">com.package1.unionTypes</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedClass/index.html\">com.package1.unlistedClass</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedMethod\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedMethod\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedMethod/index.html\">com.package1.unlistedMethod</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package1.unlistedProperty\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1.unlistedProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./unlistedProperty/index.html\">com.package1.unlistedProperty</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/methodAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>methodAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/methodAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/methodAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.methodAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.methodAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.methodAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/methodAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/methodAnnotations.pkl\">methodAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthod()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthod</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>mthod()</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"mthodWithExpandableComment()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#mthodWithExpandableComment()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">mthodWithExpandableComment</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>method()</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#mthod()\"><code>mthod()</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method()\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#method()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/methodAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>function</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleComments</span></div>\n        <div class=\"doc-comment\"><p>The greatest breakthrough since ever.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleComments.pkl\">moduleComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n        <div class=\"doc-comment expandable hidden collapsed\"><h3>Installation</h3>\n<p>Just follow these simple steps:</p>\n<ol>\n<li>Install it\n<ol>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n</ol>\n</li>\n<li>Install it\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n</li>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h3>Code</h3>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\n  name = &quot;Pigeon&quot;\n  age = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\n  name: String\n  age: Int\n}\n</code></pre>\n<h3>Random Tips</h3>\n<ul>\n<li>don't give up\n<ul>\n<li>just don't</li>\n</ul>\n</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleExtend/ExtendClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>ExtendClass (com.package1/moduleExtend:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/ExtendClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-class-name=\"ExtendClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleExtend</a>\n      <h1 id=\"declaration-title\">ExtendClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">ExtendClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"ExtendClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleExtend/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleExtend (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleExtend/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleExtend/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleExtend\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleExtend<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleExtend</span> extends <a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleExtend.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleExtend.pkl\">moduleExtend.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseProperty\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseProperty</span>: unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"baseMethod()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#baseMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">baseMethod</span>(): unknown<span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"extendMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#extendMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">extendMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"BaseClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#BaseClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../baseModule/BaseClass.html\" class=\"name-decl\">BaseClass</a><span class=\"context\"> (<a href=\"../baseModule/index.html\" class=\"name-ref\">com.package1.baseModule</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ExtendClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#ExtendClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"ExtendClass.html\" class=\"name-decl\">ExtendClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleExtend.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleInfoAnnotation/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleInfoAnnotation (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleInfoAnnotation/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleInfoAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleInfoAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleInfoAnnotation</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleInfoAnnotation.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Pkl version:</dt>\n          <dd>0.10.0 or higher</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleInfoAnnotation.pkl\">moduleInfoAnnotation.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleMethodCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodCommentInheritance</span> extends <a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl\">moduleMethodCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../moduleMethodComments/index.html\" class=\"name-ref\">com.package1.moduleMethodComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleMethodComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.moduleMethodComments</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodComments.pkl\">moduleMethodComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Method with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleMethodModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodModifiers.pkl\">moduleMethodModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">abstract function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with <code>abstract</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleMethodTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module methods with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl\">moduleMethodTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: unknown, <span class=\"param2\">arg2</span>: unknown): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method without declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Zero-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method6()\" class=\"anchor\"> </div>\n            <div id=\"method6().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method6().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method6()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method6</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with simple types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method7()\" class=\"anchor\"> </div>\n            <div id=\"method7().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method7().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method7()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method7</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with list types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method8()\" class=\"anchor\"> </div>\n            <div id=\"method8().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method8().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method8()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method8</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with set types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method9()\" class=\"anchor\"> </div>\n            <div id=\"method9().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method9().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method9()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method9</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with map types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method10()\" class=\"anchor\"> </div>\n            <div id=\"method10().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method10().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method10()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method10</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>?): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with optional types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method11()\" class=\"anchor\"> </div>\n            <div id=\"method11().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method11().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method11()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method11</span>(<span class=\"param1\">arg1</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <span class=\"param2\">arg2</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>): (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with function types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method12()\" class=\"anchor\"> </div>\n            <div id=\"method12().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method12().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method12()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method12</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"param2\">arg2</span>: unknown): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Two-arg method with partially declared types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method13()\" class=\"anchor\"> </div>\n            <div id=\"method13().arg1\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method13()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method13</span>(<span class=\"param1\">arg1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/DataSize.html\" class=\"name-ref\">DataSize</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>One-arg method with complex types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleMethodTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/moduleMethodTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleMethodTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleMethodTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleMethodTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleMethodTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleMethodTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleMethodTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleMethodTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module methods whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleMethodTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleMethodTypeReferences.pkl\">moduleMethodTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method1()\" class=\"anchor\"> </div>\n            <div id=\"method1().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method1().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method1()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method1</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method2()\" class=\"anchor\"> </div>\n            <div id=\"method2().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method2().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method2()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method2</span>(<span class=\"param1\">arg1</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with inter-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method3()\" class=\"anchor\"> </div>\n            <div id=\"method3().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method3().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method3</span>(<span class=\"param1\">arg1</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method4()\" class=\"anchor\"> </div>\n            <div id=\"method4().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method4().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method4()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method4</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <span class=\"param2\">arg2</span>: <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>): <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"method5()\" class=\"anchor\"> </div>\n            <div id=\"method5().arg1\" class=\"anchor-param1\"> </div>\n            <div id=\"method5().arg2\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#method5()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">method5</span>(<span class=\"param1\">arg1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>?, <span class=\"param2\">arg2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;): (<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external2/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Method with complex intra-module, inter-module, and external-module types.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleMethodTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyAnnotations/UserDefinedAnnotation.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"messageOpt\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageOpt\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageOpt</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"messageReq\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#messageReq\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">messageReq</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyAnnotations/UserDefinedAnnotation1.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation1 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation1</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation.html\" class=\"name-ref\">UserDefinedAnnotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation1.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyAnnotations/UserDefinedAnnotation2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>UserDefinedAnnotation2 (com.package1/modulePropertyAnnotations:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-class-name=\"UserDefinedAnnotation2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyAnnotations</a>\n      <h1 id=\"declaration-title\">UserDefinedAnnotation2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">UserDefinedAnnotation2</span> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"nested\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#nested\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">nested</span>: <a href=\"UserDefinedAnnotation2.html\" class=\"name-ref\">UserDefinedAnnotation2</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"UserDefinedAnnotation2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyAnnotations</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyAnnotations.pkl\">modulePropertyAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prperty\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <code>prperty</code> thought to have a correctly spelled name.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prpertyWithExpandableComment\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#prpertyWithExpandableComment\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">prpertyWithExpandableComment</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\">Deprecated: Spelling mistake. Replace with: <code>property</code></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This <a href=\"index.html#prperty\"><code>prperty</code></a> thought to have a correctly spelled name.</p><p>Unfortunately, it did not, as we explain in this expandable comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>field</code>, <code>item</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"propertyUserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#propertyUserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">propertyUserDefinedAnnotation2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"UserDefinedAnnotation\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation.html\" class=\"name-decl\">UserDefinedAnnotation</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation1.html\" class=\"name-decl\">UserDefinedAnnotation1</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"UserDefinedAnnotation2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#UserDefinedAnnotation2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"UserDefinedAnnotation2.html\" class=\"name-decl\">UserDefinedAnnotation2</a> extends <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Annotation.html\" class=\"name-ref\">Annotation</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyAnnotations.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyCommentInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyCommentInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyCommentInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyCommentInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyCommentInheritance</span> extends <a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyCommentInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl\">modulePropertyCommentInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyCommentInheritance.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><span class=\"context\"> (<a href=\"../modulePropertyComments/index.html\" class=\"name-ref\">com.package1.modulePropertyComments</a>)</span></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyComments/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyComments (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyComments/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyComments/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyComments\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyComments<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.modulePropertyComments</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of comments.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyComments.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyComments.pkl\">modulePropertyComments.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with single-line doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\nmulti-line\ndoc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <a href=\"https://apple.com\">single-line</a> <em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with\n<a href=\"https://apple.com\">multi-line</a>\n<em>Markdown</em> doc comment.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>😀😀😀 Property with 😎😎😎 Unicode doc comment. 😡😡😡</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 4 * 10\n</code></pre>\n<p>Rest of the body</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Summary</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code class=\"language-java\">\ncode = 0\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyComments.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><pre><code>\ncode = 2\n</code></pre>\n<p>Rest</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyModifiers/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyModifiers (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyModifiers/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyModifiers/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyModifiers\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyModifiers<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyModifiers</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different modifiers.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyModifiers.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyModifiers.pkl\">modulePropertyModifiers.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member hidden-member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyModifiers.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with <code>hidden</code> modifier.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyTypeAnnotations/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeAnnotations (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeAnnotations\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeAnnotations<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeAnnotations</span></div>\n        <div class=\"doc-comment\"><p>Module properties with different kinds of type annotations.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeAnnotations.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl\">modulePropertyTypeAnnotations.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property without declared type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: () -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property10\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property10\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property10</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>?&gt;?, (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>?) -&gt; <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Float.html\" class=\"name-ref\">Float</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeAnnotations.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with complex type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyTypeReferences/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/modulePropertyTypeReferences:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.modulePropertyTypeReferences</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/modulePropertyTypeReferences/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>modulePropertyTypeReferences (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/modulePropertyTypeReferences/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.modulePropertyTypeReferences\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.modulePropertyTypeReferences<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.modulePropertyTypeReferences</span></div>\n        <div class=\"doc-comment\"><p>Module properties whose types reference classes from\nthe same module, a different module, and external modules.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/modulePropertyTypeReferences.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/modulePropertyTypeReferences.pkl\">modulePropertyTypeReferences.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property1</span>: <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module simple type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with inter-module list type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Set.html\" class=\"name-ref\">Set</a>&lt;<a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module set type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module and inter-module map type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property5</span>: <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with external-module optional type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property6</span>: () -&gt; <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with zero-arg intra-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property7</span>: (<a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with one-arg inter-module and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property8</span>: (<a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>, <a href=\"../shared/MyClass.html\" class=\"name-ref\">MyClass</a>) -&gt; <a href=\"https://example.com/docs/externalpackage/external1/MyClass.html\" class=\"name-ref\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with two-arg intra-module, inter-module, and external-module function type.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property9</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"MyClass.html\" class=\"name-ref\">MyClass</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Property with intra-module mapping type.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/modulePropertyTypeReferences.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleTypes1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes1 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes1/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes1/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes1\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes1<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes1</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes1.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes1.pkl\">moduleTypes1.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"n\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#n\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">n</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes1.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleTypes2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/moduleTypes2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.moduleTypes2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/moduleTypes2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>moduleTypes2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/moduleTypes2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/moduleTypes2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.moduleTypes2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.moduleTypes2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.moduleTypes2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/moduleTypes2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/moduleTypes2.pkl\">moduleTypes2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x1</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x2</span>: <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>?<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Listing.html\" class=\"name-ref\">Listing</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Mapping.html\" class=\"name-ref\">Mapping</a>&lt;<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>, <a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x5</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|<a href=\"../moduleTypes1/index.html\" class=\"name-ref\">moduleTypes1</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x6</span>: module<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x7</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;module&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"x8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#x8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">x8</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>|module|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/moduleTypes2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/nested/nested2/nestedModule/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/nested/nested2/nestedModule:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.nested.nested2.nestedModule</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/nested/nested2/nestedModule/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>nestedModule (com.package1/nested/nested2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../../data/com.package1/_/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../../data/com.package1/1.2.3/nested/nested2/nestedModule/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../../../\" data-module-name=\"com.package1.nested.nested2.nestedModule\" data-root-url-prefix=\"../../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../../../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.nested.nested2.nestedModule<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.nested.nested2.nestedModule</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/nested/nested2/nestedModule.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/nested/nested2/nestedModule.pkl\">nestedModule.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/nested/nested2/nestedModule.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\"},\"summary\":\"Docs for Package 1.\",\"deprecation\":\"com.package1 is deprecated\",\"sourceCode\":\"https://example.com/package1/\",\"sourceCodeUrlScheme\":\"https://example.com/package1%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"}},{\"ref\":{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\"},\"summary\":\"This is a module that has spaces in its name.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"Module Containing Spaces\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"BaseClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClss\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClssWithExpandableComment\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classAnnotations\",\"type\":\"AnnotatedClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments4\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments5\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments6\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments7\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classComments\",\"type\":\"Comments8\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\"},\"summary\":\"Class inheritance involving abstract, open, and final classes.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass3\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass4\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass2\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classInheritance\",\"type\":\"MyClass1\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\"},\"summary\":\"Class methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\"},\"summary\":\"Class methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\"},\"summary\":\"Class methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\"},\"summary\":\"Class methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyAnnotations\",\"type\":\"ClassWithAnnotatedProperty\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\"},\"summary\":\"Class properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyComments\",\"type\":\"Comments\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\"},\"summary\":\"Class properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyModifiers\",\"type\":\"Modifiers\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\"},\"summary\":\"Class properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeAnnotations\",\"type\":\"TypeAnnotations\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\"},\"summary\":\"Class properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"TypeReferences\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classPropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Address\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"classTypeConstraints\",\"type\":\"Project\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docExampleSubject2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\"},\"summary\":\"[external1], [external1.MyClass]\\n[shared], [shared.MyClass]\\n[age], [sing()], [Person], [Person.name], [Person.call()], [PersonList]\\n[docLinks], [docLinks.age], [docLinks.sing()],\\n[docLinks.Person], [docLinks.Person.name], [docLinks.PersonList],\\n[custom *link* text][docLinks.sing()]\\n[module], [module.age], [module.sing()],\\n[module.Person], [module.Person.name], [module.PersonList],\\n[custom *link* text][module.sing()]\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"PersonList\",\"isTypeAlias\":true},\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"docLinks\",\"type\":\"Person\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"methodAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\"},\"summary\":\"The greatest breakthrough since ever.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"baseModule\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleExtend\",\"type\":\"ExtendClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleInfoAnnotation\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\"},\"summary\":\"Module methods with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\"},\"summary\":\"Module methods with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\"},\"summary\":\"Module methods with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\"},\"summary\":\"Module methods whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external2\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleMethodTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation1\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyAnnotations\",\"type\":\"UserDefinedAnnotation2\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Annotation\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyCommentInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\"},\"summary\":\"Module properties with different kinds of comments.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyComments\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\"},\"summary\":\"Module properties with different modifiers.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyModifiers\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\"},\"summary\":\"Module properties with different kinds of type annotations.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeAnnotations\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\"},\"summary\":\"Module properties whose types reference classes from\\nthe same module, a different module, and external modules.\",\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},{\"pkg\":\"com.externalpackage\",\"pkgUri\":null,\"version\":\"7.8.9\",\"module\":\"external1\",\"type\":\"MyClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"modulePropertyTypeReferences\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes1\",\"type\":\"ModuleClass\"},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"moduleTypes2\",\"type\":\"ModuleClass\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"nested/nested2/nestedModule\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"ternalPackage\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"shared\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Person\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Foo\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true},{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}]}],\"typeAliases\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"List2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"Map2\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"StringMap\",\"isTypeAlias\":true}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases2\",\"type\":\"MMap\",\"isTypeAlias\":true}}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"},\"supermodules\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\"}],\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"ModuleClass\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typeAliasInheritance\",\"type\":\"Person2\"},\"superclasses\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Person\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"typealiases\",\"type\":\"Email\",\"isTypeAlias\":true}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unionTypes\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedClass\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedMethod\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]},{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package1\",\"pkgUri\":null,\"version\":\"1.2.3\",\"module\":\"unlistedProperty\",\"type\":\"MyClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"baseModule/index.html\"},{\"name\":\"baseProperty\",\"kind\":5,\"url\":\"baseModule/index.html#baseProperty\",\"sig\":\": unknown\",\"parId\":1},{\"name\":\"baseMethod\",\"kind\":4,\"url\":\"baseModule/index.html#baseMethod()\",\"sig\":\"(): unknown\",\"parId\":1},{\"name\":\"BaseClass\",\"kind\":3,\"url\":\"baseModule/BaseClass.html\",\"parId\":1},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"classAnnotations/index.html\"},{\"name\":\"AnnotatedClss\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClss.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClssWithExpandableComment\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClssWithExpandableComment.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"AnnotatedClass\",\"kind\":3,\"url\":\"classAnnotations/AnnotatedClass.html\",\"parId\":5,\"deprecated\":true,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"classComments/index.html\"},{\"name\":\"Comments1\",\"kind\":3,\"url\":\"classComments/Comments1.html\",\"parId\":9},{\"name\":\"Comments2\",\"kind\":3,\"url\":\"classComments/Comments2.html\",\"parId\":9},{\"name\":\"Comments3\",\"kind\":3,\"url\":\"classComments/Comments3.html\",\"parId\":9},{\"name\":\"Comments4\",\"kind\":3,\"url\":\"classComments/Comments4.html\",\"parId\":9},{\"name\":\"Comments5\",\"kind\":3,\"url\":\"classComments/Comments5.html\",\"parId\":9},{\"name\":\"Comments6\",\"kind\":3,\"url\":\"classComments/Comments6.html\",\"parId\":9},{\"name\":\"Comments7\",\"kind\":3,\"url\":\"classComments/Comments7.html\",\"parId\":9},{\"name\":\"Comments8\",\"kind\":3,\"url\":\"classComments/Comments8.html\",\"parId\":9},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"classInheritance/index.html\"},{\"name\":\"MyClass1\",\"kind\":3,\"url\":\"classInheritance/MyClass1.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass1.html#property1\",\"sig\":\": Boolean\",\"parId\":19},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass1.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":19},{\"name\":\"MyClass2\",\"kind\":3,\"url\":\"classInheritance/MyClass2.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property1\",\"sig\":\": Boolean\",\"parId\":22},{\"name\":\"property2\",\"kind\":5,\"url\":\"classInheritance/MyClass2.html#property2\",\"sig\":\": String\",\"parId\":22},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"method2\",\"kind\":4,\"url\":\"classInheritance/MyClass2.html#method2()\",\"sig\":\"(arg): Boolean\",\"parId\":22},{\"name\":\"MyClass3\",\"kind\":3,\"url\":\"classInheritance/MyClass3.html\",\"parId\":18},{\"name\":\"property1\",\"kind\":5,\"url\":\"classInheritance/MyClass3.html#property1\",\"sig\":\": Boolean\",\"parId\":27},{\"name\":\"method1\",\"kind\":4,\"url\":\"classInheritance/MyClass3.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":27},{\"name\":\"MyClass4\",\"kind\":3,\"url\":\"classInheritance/MyClass4.html\",\"parId\":18},{\"name\":\"property4\",\"kind\":5,\"url\":\"classInheritance/MyClass4.html#property4\",\"sig\":\": String\",\"parId\":30},{\"name\":\"method3\",\"kind\":4,\"url\":\"classInheritance/MyClass4.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":30},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"classMethodComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classMethodComments/Comments.html\",\"parId\":33},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method1()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method2()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method3()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method4()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method5()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method6()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodComments/Comments.html#method7()\",\"sig\":\"(): Float\",\"parId\":34},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"classMethodModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classMethodModifiers/Modifiers.html\",\"parId\":42},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodModifiers/Modifiers.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":43},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"classMethodTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html\",\"parId\":45},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method1()\",\"sig\":\"(): unknown\",\"parId\":46},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":46},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":46},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method4()\",\"sig\":\"(): String\",\"parId\":46},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":46},{\"name\":\"method6\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":46},{\"name\":\"method7\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":46},{\"name\":\"method8\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":46},{\"name\":\"method9\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":46},{\"name\":\"method10\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":46},{\"name\":\"method11\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":46},{\"name\":\"method12\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":46},{\"name\":\"method13\",\"kind\":4,\"url\":\"classMethodTypeAnnotations/TypeAnnotations.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":46},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"classMethodTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classMethodTypeReferences/MyClass.html\",\"parId\":60},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classMethodTypeReferences/TypeReferences.html\",\"parId\":60},{\"name\":\"method1\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method2\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method3\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":62},{\"name\":\"method4\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":62},{\"name\":\"method5\",\"kind\":4,\"url\":\"classMethodTypeReferences/TypeReferences.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":62},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"classPropertyAnnotations/index.html\"},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":68},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":69},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"classPropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":69},{\"name\":\"ClassWithAnnotatedProperty\",\"kind\":3,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html\",\"parId\":68},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"classPropertyAnnotations/ClassWithAnnotatedProperty.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":72},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"classPropertyComments/index.html\"},{\"name\":\"Comments\",\"kind\":3,\"url\":\"classPropertyComments/Comments.html\",\"parId\":74},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property1\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property2\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property3\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property4\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property5\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property6\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyComments/Comments.html#property7\",\"sig\":\": Float\",\"parId\":75},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"classPropertyModifiers/index.html\"},{\"name\":\"Modifiers\",\"kind\":3,\"url\":\"classPropertyModifiers/Modifiers.html\",\"parId\":83},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property2\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property3\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyModifiers/Modifiers.html#property4\",\"sig\":\": Float\",\"parId\":84},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"classPropertyTypeAnnotations/index.html\"},{\"name\":\"TypeAnnotations\",\"kind\":3,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html\",\"parId\":88},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property1\",\"sig\":\": unknown\",\"parId\":89},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property2\",\"sig\":\": Float\",\"parId\":89},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property3\",\"sig\":\": List<String>\",\"parId\":89},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property4\",\"sig\":\": Set<String>\",\"parId\":89},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":89},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property6\",\"sig\":\": String?\",\"parId\":89},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property7\",\"sig\":\": () -> String\",\"parId\":89},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property8\",\"sig\":\": String -> Int\",\"parId\":89},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":89},{\"name\":\"property10\",\"kind\":5,\"url\":\"classPropertyTypeAnnotations/TypeAnnotations.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":89},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"classPropertyTypeReferences/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"classPropertyTypeReferences/MyClass.html\",\"parId\":100},{\"name\":\"TypeReferences\",\"kind\":3,\"url\":\"classPropertyTypeReferences/TypeReferences.html\",\"parId\":100},{\"name\":\"property1\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property1\",\"sig\":\": MyClass\",\"parId\":102},{\"name\":\"property2\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":102},{\"name\":\"property3\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":102},{\"name\":\"property4\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":102},{\"name\":\"property5\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property5\",\"sig\":\": MyClass?\",\"parId\":102},{\"name\":\"property6\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":102},{\"name\":\"property7\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":102},{\"name\":\"property8\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":102},{\"name\":\"property9\",\"kind\":5,\"url\":\"classPropertyTypeReferences/TypeReferences.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":102},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"classTypeConstraints/index.html\"},{\"name\":\"emailAddress\",\"kind\":5,\"url\":\"classTypeConstraints/index.html#emailAddress\",\"sig\":\": unknown\",\"parId\":112},{\"name\":\"Person1\",\"kind\":3,\"url\":\"classTypeConstraints/Person1.html\",\"parId\":112},{\"name\":\"name\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#name\",\"sig\":\": String\",\"parId\":114},{\"name\":\"address\",\"kind\":5,\"url\":\"classTypeConstraints/Person1.html#address\",\"sig\":\": Address\",\"parId\":114},{\"name\":\"Person2\",\"kind\":3,\"url\":\"classTypeConstraints/Person2.html\",\"parId\":112},{\"name\":\"email\",\"kind\":5,\"url\":\"classTypeConstraints/Person2.html#email\",\"sig\":\": String\",\"parId\":117},{\"name\":\"Address\",\"kind\":3,\"url\":\"classTypeConstraints/Address.html\",\"parId\":112},{\"name\":\"street\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#street\",\"sig\":\": String\",\"parId\":119},{\"name\":\"city\",\"kind\":5,\"url\":\"classTypeConstraints/Address.html#city\",\"sig\":\": String\",\"parId\":119},{\"name\":\"Project\",\"kind\":3,\"url\":\"classTypeConstraints/Project.html\",\"parId\":112},{\"name\":\"type\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#type\",\"sig\":\": String?\",\"parId\":122},{\"name\":\"contacts\",\"kind\":5,\"url\":\"classTypeConstraints/Project.html#contacts\",\"sig\":\": Map<String, String>\",\"parId\":122},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"docExampleSubject1/index.html\"},{\"name\":\"x\",\"kind\":5,\"url\":\"docExampleSubject1/index.html#x\",\"sig\":\": Int\",\"parId\":125},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"docExampleSubject2/index.html\"},{\"name\":\"y\",\"kind\":5,\"url\":\"docExampleSubject2/index.html#y\",\"sig\":\": Int\",\"parId\":127},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"docLinks/index.html\"},{\"name\":\"age\",\"kind\":5,\"url\":\"docLinks/index.html#age\",\"sig\":\": Int\",\"parId\":129},{\"name\":\"sing\",\"kind\":4,\"url\":\"docLinks/index.html#sing()\",\"sig\":\"(song): unknown\",\"parId\":129},{\"name\":\"Person\",\"kind\":3,\"url\":\"docLinks/Person.html\",\"parId\":129},{\"name\":\"name\",\"kind\":5,\"url\":\"docLinks/Person.html#name\",\"sig\":\": String\",\"parId\":132},{\"name\":\"call\",\"kind\":4,\"url\":\"docLinks/Person.html#call()\",\"sig\":\"(number): unknown\",\"parId\":132},{\"name\":\"PersonList\",\"kind\":2,\"url\":\"docLinks/index.html#PersonList\",\"parId\":129},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"methodAnnotations/index.html\"},{\"name\":\"mthod\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthod()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"mthodWithExpandableComment\",\"kind\":4,\"url\":\"methodAnnotations/index.html#mthodWithExpandableComment()\",\"sig\":\"(): Int\",\"parId\":136,\"deprecated\":true,\"aka\":[\"function\"]},{\"name\":\"method\",\"kind\":4,\"url\":\"methodAnnotations/index.html#method()\",\"sig\":\"(): Int\",\"parId\":136,\"aka\":[\"function\"]},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"moduleExtend/index.html\"},{\"name\":\"extendProperty\",\"kind\":5,\"url\":\"moduleExtend/index.html#extendProperty\",\"sig\":\": unknown\",\"parId\":141},{\"name\":\"extendMethod\",\"kind\":4,\"url\":\"moduleExtend/index.html#extendMethod()\",\"sig\":\"(): unknown\",\"parId\":141},{\"name\":\"ExtendClass\",\"kind\":3,\"url\":\"moduleExtend/ExtendClass.html\",\"parId\":141},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"moduleMethodCommentInheritance/index.html\"},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodCommentInheritance/index.html#method3()\",\"sig\":\"(arg): Boolean\",\"parId\":146},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"moduleMethodComments/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method1()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method2()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method3()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method4()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method5()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method6()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodComments/index.html#method7()\",\"sig\":\"(): Float\",\"parId\":148},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"moduleMethodModifiers/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodModifiers/index.html#method1()\",\"sig\":\"(arg): Boolean\",\"parId\":156},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"moduleMethodTypeAnnotations/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method1()\",\"sig\":\"(): unknown\",\"parId\":158},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method2()\",\"sig\":\"(arg1): unknown\",\"parId\":158},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method3()\",\"sig\":\"(arg1, arg2): unknown\",\"parId\":158},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method4()\",\"sig\":\"(): String\",\"parId\":158},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method5()\",\"sig\":\"(arg1): Int\",\"parId\":158},{\"name\":\"method6\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method6()\",\"sig\":\"(arg1, arg2): Duration\",\"parId\":158},{\"name\":\"method7\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method7()\",\"sig\":\"(arg1, arg2): List<Duration>\",\"parId\":158},{\"name\":\"method8\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method8()\",\"sig\":\"(arg1, arg2): Set<Duration>\",\"parId\":158},{\"name\":\"method9\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method9()\",\"sig\":\"(arg1, arg2): Map<Duration, Duration>\",\"parId\":158},{\"name\":\"method10\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method10()\",\"sig\":\"(arg1, arg2): Duration?\",\"parId\":158},{\"name\":\"method11\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method11()\",\"sig\":\"(arg1, arg2): (Int, Float) -> Duration\",\"parId\":158},{\"name\":\"method12\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method12()\",\"sig\":\"(arg1, arg2): Boolean\",\"parId\":158},{\"name\":\"method13\",\"kind\":4,\"url\":\"moduleMethodTypeAnnotations/index.html#method13()\",\"sig\":\"(arg1): Map<List<Duration?>?, DataSize? -> Map<Any, Number>>\",\"parId\":158},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"moduleMethodTypeReferences/index.html\"},{\"name\":\"method1\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method1()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method2\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method2()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method3\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method3()\",\"sig\":\"(arg1, arg2): List<MyClass>\",\"parId\":172},{\"name\":\"method4\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method4()\",\"sig\":\"(arg1, arg2): MyClass\",\"parId\":172},{\"name\":\"method5\",\"kind\":4,\"url\":\"moduleMethodTypeReferences/index.html#method5()\",\"sig\":\"(arg1, arg2): MyClass -> MyClass\",\"parId\":172},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"moduleMethodTypeReferences/MyClass.html\",\"parId\":172},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"modulePropertyAnnotations/index.html\"},{\"name\":\"prperty\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prperty\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"prpertyWithExpandableComment\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#prpertyWithExpandableComment\",\"sig\":\": unknown\",\"parId\":179,\"deprecated\":true,\"aka\":[\"field\",\"item\"]},{\"name\":\"property\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#property\",\"sig\":\": unknown\",\"parId\":179,\"aka\":[\"field\",\"item\"]},{\"name\":\"propertyUserDefinedAnnotation\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation1\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation1\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"propertyUserDefinedAnnotation2\",\"kind\":5,\"url\":\"modulePropertyAnnotations/index.html#propertyUserDefinedAnnotation2\",\"sig\":\": Int\",\"parId\":179},{\"name\":\"UserDefinedAnnotation\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html\",\"parId\":179},{\"name\":\"messageOpt\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageOpt\",\"sig\":\": String?\",\"parId\":186},{\"name\":\"messageReq\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation.html#messageReq\",\"sig\":\": String\",\"parId\":186},{\"name\":\"UserDefinedAnnotation1\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation1.html#nested\",\"sig\":\": UserDefinedAnnotation\",\"parId\":189},{\"name\":\"UserDefinedAnnotation2\",\"kind\":3,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html\",\"parId\":179},{\"name\":\"nested\",\"kind\":5,\"url\":\"modulePropertyAnnotations/UserDefinedAnnotation2.html#nested\",\"sig\":\": UserDefinedAnnotation2?\",\"parId\":191},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"modulePropertyCommentInheritance/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyCommentInheritance/index.html#property3\",\"sig\":\": Float\",\"parId\":193},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"modulePropertyComments/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property1\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property2\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property3\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property4\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property5\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property6\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property7\",\"sig\":\": Float\",\"parId\":195},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property8\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property9\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyComments/index.html#property10\",\"sig\":\": Int\",\"parId\":195},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"modulePropertyModifiers/index.html\"},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyModifiers/index.html#property2\",\"sig\":\": Float\",\"parId\":206},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"modulePropertyTypeAnnotations/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property1\",\"sig\":\": unknown\",\"parId\":208},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property2\",\"sig\":\": Float\",\"parId\":208},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property3\",\"sig\":\": List<String>\",\"parId\":208},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property4\",\"sig\":\": Set<String>\",\"parId\":208},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property5\",\"sig\":\": Map<String, Duration>\",\"parId\":208},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property6\",\"sig\":\": String?\",\"parId\":208},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property7\",\"sig\":\": () -> String\",\"parId\":208},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property8\",\"sig\":\": String -> Int\",\"parId\":208},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property9\",\"sig\":\": (String, String) -> Int\",\"parId\":208},{\"name\":\"property10\",\"kind\":5,\"url\":\"modulePropertyTypeAnnotations/index.html#property10\",\"sig\":\": Map<List<String?>?, Boolean? -> Map<Int, Float>>\",\"parId\":208},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"modulePropertyTypeReferences/index.html\"},{\"name\":\"property1\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property1\",\"sig\":\": MyClass\",\"parId\":219},{\"name\":\"property2\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property2\",\"sig\":\": List<MyClass>\",\"parId\":219},{\"name\":\"property3\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property3\",\"sig\":\": Set<MyClass>\",\"parId\":219},{\"name\":\"property4\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property4\",\"sig\":\": Map<MyClass, MyClass>\",\"parId\":219},{\"name\":\"property5\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property5\",\"sig\":\": MyClass?\",\"parId\":219},{\"name\":\"property6\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property6\",\"sig\":\": () -> MyClass\",\"parId\":219},{\"name\":\"property7\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property7\",\"sig\":\": MyClass -> MyClass\",\"parId\":219},{\"name\":\"property8\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property8\",\"sig\":\": (MyClass, MyClass) -> MyClass\",\"parId\":219},{\"name\":\"property9\",\"kind\":5,\"url\":\"modulePropertyTypeReferences/index.html#property9\",\"sig\":\": Mapping<String, MyClass>\",\"parId\":219},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"modulePropertyTypeReferences/MyClass.html\",\"parId\":219},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"moduleTypes1/index.html\"},{\"name\":\"n\",\"kind\":5,\"url\":\"moduleTypes1/index.html#n\",\"sig\":\": Int\",\"parId\":230},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"moduleTypes2/index.html\"},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":232},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":232},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":232},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":232},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":232},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x6\",\"sig\":\": module\",\"parId\":232},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x7\",\"sig\":\": List<module>\",\"parId\":232},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/index.html#x8\",\"sig\":\": String|module|Int\",\"parId\":232},{\"name\":\"Foo\",\"kind\":3,\"url\":\"moduleTypes2/Foo.html\",\"parId\":232},{\"name\":\"x1\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x1\",\"sig\":\": moduleTypes1\",\"parId\":241},{\"name\":\"x2\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x2\",\"sig\":\": moduleTypes1?\",\"parId\":241},{\"name\":\"x3\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x3\",\"sig\":\": Listing<moduleTypes1>\",\"parId\":241},{\"name\":\"x4\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x4\",\"sig\":\": Mapping<moduleTypes1, moduleTypes1>\",\"parId\":241},{\"name\":\"x5\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x5\",\"sig\":\": String|moduleTypes1|Int\",\"parId\":241},{\"name\":\"x6\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x6\",\"sig\":\": module\",\"parId\":241},{\"name\":\"x7\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x7\",\"sig\":\": List<module>\",\"parId\":241},{\"name\":\"x8\",\"kind\":5,\"url\":\"moduleTypes2/Foo.html#x8\",\"sig\":\": String|module|Int\",\"parId\":241},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"nested/nested2/nestedModule/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"nested/nested2/nestedModule/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":250},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"nested/nested2/nestedModule/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":250},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"nested/nested2/nestedModule/MyClass.html\",\"parId\":250},{\"name\":\"referenceToExternalPackage\",\"kind\":1,\"url\":\"ternalPackage/index.html\"},{\"name\":\"prop\",\"kind\":5,\"url\":\"ternalPackage/index.html#prop\",\"sig\":\": Class Two {}\",\"parId\":254},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"shared/index.html\"},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"shared/MyClass.html\",\"parId\":256},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"typealiases/index.html\"},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/index.html#uint\",\"sig\":\": UInt\",\"parId\":258},{\"name\":\"uints\",\"kind\":5,\"url\":\"typealiases/index.html#uints\",\"sig\":\": List<UInt>\",\"parId\":258},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/index.html#email\",\"sig\":\": Email\",\"parId\":258},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/index.html#emails\",\"sig\":\": List<Email>\",\"parId\":258},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/index.html#send()\",\"sig\":\"(email): Email\",\"parId\":258},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases/Person.html\",\"parId\":258},{\"name\":\"uint\",\"kind\":5,\"url\":\"typealiases/Person.html#uint\",\"sig\":\": UInt\",\"parId\":264},{\"name\":\"list\",\"kind\":5,\"url\":\"typealiases/Person.html#list\",\"sig\":\": List<UInt>\",\"parId\":264},{\"name\":\"email\",\"kind\":5,\"url\":\"typealiases/Person.html#email\",\"sig\":\": Email\",\"parId\":264},{\"name\":\"emails\",\"kind\":5,\"url\":\"typealiases/Person.html#emails\",\"sig\":\": List<Email>\",\"parId\":264},{\"name\":\"send\",\"kind\":4,\"url\":\"typealiases/Person.html#send()\",\"sig\":\"(email): Email\",\"parId\":264},{\"name\":\"Email\",\"kind\":2,\"url\":\"typealiases/index.html#Email\",\"parId\":258,\"aka\":[\"OtherName\"]},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"typealiases2/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/index.html#res1\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/index.html#res2\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/index.html#res3\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/index.html#res4\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/index.html#res5\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/index.html#res6\",\"sig\":\": List2\",\"parId\":271},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/index.html#res7\",\"sig\":\": Map2\",\"parId\":271},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/index.html#res8\",\"sig\":\": StringMap\",\"parId\":271},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/index.html#res9\",\"sig\":\": MMap\",\"parId\":271},{\"name\":\"Person\",\"kind\":3,\"url\":\"typealiases2/Person.html\",\"parId\":271},{\"name\":\"name\",\"kind\":5,\"url\":\"typealiases2/Person.html#name\",\"sig\":\": String\",\"parId\":281},{\"name\":\"Foo\",\"kind\":3,\"url\":\"typealiases2/Foo.html\",\"parId\":271},{\"name\":\"res1\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res1\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res2\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res2\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res3\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res3\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res4\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res4\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res5\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res5\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"res6\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res6\",\"sig\":\": List2\",\"parId\":283},{\"name\":\"res7\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res7\",\"sig\":\": Map2\",\"parId\":283},{\"name\":\"res8\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res8\",\"sig\":\": StringMap\",\"parId\":283},{\"name\":\"res9\",\"kind\":5,\"url\":\"typealiases2/Foo.html#res9\",\"sig\":\": MMap\",\"parId\":283},{\"name\":\"List2\",\"kind\":2,\"url\":\"typealiases2/index.html#List2\",\"parId\":271},{\"name\":\"Map2\",\"kind\":2,\"url\":\"typealiases2/index.html#Map2\",\"parId\":271},{\"name\":\"StringMap\",\"kind\":2,\"url\":\"typealiases2/index.html#StringMap\",\"parId\":271},{\"name\":\"MMap\",\"kind\":2,\"url\":\"typealiases2/index.html#MMap\",\"parId\":271},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"typeAliasInheritance/index.html\"},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#email2\",\"sig\":\": Email\",\"parId\":297},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/index.html#emails2\",\"sig\":\": List<Email>\",\"parId\":297},{\"name\":\"Person2\",\"kind\":3,\"url\":\"typeAliasInheritance/Person2.html\",\"parId\":297},{\"name\":\"email2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#email2\",\"sig\":\": Email\",\"parId\":300},{\"name\":\"emails2\",\"kind\":5,\"url\":\"typeAliasInheritance/Person2.html#emails2\",\"sig\":\": List<Email>\",\"parId\":300},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"unionTypes/index.html\"},{\"name\":\"res1\",\"kind\":5,\"url\":\"unionTypes/index.html#res1\",\"sig\":\": Boolean|Number\",\"parId\":303},{\"name\":\"res2\",\"kind\":5,\"url\":\"unionTypes/index.html#res2\",\"sig\":\": \\\\\\\"foo\\\\\\\"|\\\\\\\"bar\\\\\\\"|\\\\\\\"baz\\\\\\\"\",\"parId\":303},{\"name\":\"res3\",\"kind\":5,\"url\":\"unionTypes/index.html#res3\",\"sig\":\": Boolean|List<String>\",\"parId\":303},{\"name\":\"res4\",\"kind\":5,\"url\":\"unionTypes/index.html#res4\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res5\",\"kind\":5,\"url\":\"unionTypes/index.html#res5\",\"sig\":\": Boolean|List<String>?\",\"parId\":303},{\"name\":\"res6\",\"kind\":5,\"url\":\"unionTypes/index.html#res6\",\"sig\":\": Boolean|List<String>?|Number\",\"parId\":303},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"unlistedClass/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedClass/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":310},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedClass/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":310},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"unlistedMethod/index.html\"},{\"name\":\"myProperty\",\"kind\":5,\"url\":\"unlistedMethod/index.html#myProperty\",\"sig\":\": unknown\",\"parId\":313},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedMethod/MyClass.html\",\"parId\":313},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"unlistedProperty/index.html\"},{\"name\":\"myMethod\",\"kind\":4,\"url\":\"unlistedProperty/index.html#myMethod()\",\"sig\":\"(): unknown\",\"parId\":316},{\"name\":\"MyClass\",\"kind\":3,\"url\":\"unlistedProperty/MyClass.html\",\"parId\":316}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/shared/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/shared:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.shared</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/shared/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>shared (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/shared/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/shared/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.shared\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.shared<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.shared</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/shared.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/shared.pkl\">shared.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/shared.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/ternalPackage/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>referenceToExternalPackage (com.package1xternalPackage:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/ternalPackage/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/ternalPackage/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"referenceToExternalPackage\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">referenceToExternalPackage<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">referenceToExternalPackage</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/ternalPackage.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/ternalPackage.pkl\">ternalPackage.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"../../../com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.html\" class=\"name-ref\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/package1/ternalPackage.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\">Module3.<code>property {} four</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typeAliasInheritance/Person2.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person2 (com.package1/typeAliasInheritance:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/Person2.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-class-name=\"Person2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typeAliasInheritance</a>\n      <h1 id=\"declaration-title\">Person2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person2</span> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person2.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a>.</span><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typeAliasInheritance/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typeAliasInheritance (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typeAliasInheritance/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typeAliasInheritance/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typeAliasInheritance\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typeAliasInheritance<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typeAliasInheritance</span> extends <a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typeAliasInheritance.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typeAliasInheritance.pkl\">typeAliasInheritance.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email2</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails2</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"../typealiases/index.html#Email\" class=\"name-ref\">Email</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/Person.html\" class=\"name-decl\">Person</a><span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Person2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person2.html\" class=\"name-decl\">Person2</a> extends <a href=\"../typealiases/Person.html\" class=\"name-ref\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typeAliasInheritance.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"../typealiases/index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<span class=\"context\"> (<a href=\"../typealiases/index.html\" class=\"name-ref\">com.package1.typealiases</a>)</span></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typealiases/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"list\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#list\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">list</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A person's <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typealiases/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">com.package1.typealiases</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases.pkl\">typealiases.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uint\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uint\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uint</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"uints\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#uints\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">uints</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#UInt\" class=\"name-ref\">UInt</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"email\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>My <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"emails\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#emails\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">emails</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"index.html#Email\" class=\"name-ref\">Email</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"send()\" class=\"anchor\"> </div>\n            <div id=\"send().email\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#send()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">send</span>(<span class=\"param1\">email</span>: <a href=\"index.html#Email\" class=\"name-ref\">Email</a>): <a href=\"index.html#Email\" class=\"name-ref\">Email</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Sends an <a href=\"index.html#Email\"><code>Email</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">open class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"Email\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#Email\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Email\" class=\"name-decl\">Email</a> = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>(contains(&quot;@&quot;))<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>A <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\"><code>String</code></a> representing an <code>Email</code> address.</p></div>\n                <dl class=\"member-info expandable hidden collapsed\">\n                  <dt>Also known as:</dt>\n                  <dd><code>OtherName</code></dd>\n                </dl>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typealiases2/Foo.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Foo (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Foo.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Foo.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Foo\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Foo<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Foo</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Foo.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typealiases2/Person.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Person (com.package1/typealiases2:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/Person.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/Person.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-class-name=\"Person\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.typealiases2</a>\n      <h1 id=\"declaration-title\">Person<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Person</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Person.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/typealiases2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>typealiases2 (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/typealiases2/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/typealiases2/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.typealiases2\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.typealiases2<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n        <li><a href=\"#_type-aliases\">Type Aliases</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.typealiases2</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/typealiases2.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/typealiases2.pkl\">typealiases2.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"index.html#List2\" class=\"name-ref\">List2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Duration.html\" class=\"name-ref\">Duration</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a>&lt;<a href=\"Person.html\" class=\"name-ref\">Person</a>?&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: <a href=\"index.html#List2\" class=\"name-ref\">List2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res7\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res7\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res7</span>: <a href=\"index.html#Map2\" class=\"name-ref\">Map2</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res8\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res8\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res8</span>: <a href=\"index.html#StringMap\" class=\"name-ref\">StringMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res9\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res9\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res9</span>: <a href=\"index.html#MMap\" class=\"name-ref\">MMap</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Person\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Person\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Person.html\" class=\"name-decl\">Person</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Foo\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Foo.html\" class=\"name-decl\">Foo</a><a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_type-aliases\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Type Aliases</h2>\n        <ul>\n          <li>\n            <div id=\"List2\" class=\"anchor\"> </div>\n            <div id=\"List2.E\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#List2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#List2\" class=\"name-decl\">List2</a>&lt;<a class=\"param1\">E</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<span class=\"name-ref\">E</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Map2\" class=\"anchor\"> </div>\n            <div id=\"Map2.V\" class=\"anchor-param1\"> </div>\n            <div id=\"Map2.K\" class=\"anchor-param2\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#Map2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#Map2\" class=\"name-decl\">Map2</a>&lt;<a class=\"param1\">V</a>, <a class=\"param2\">K</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">K</span>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"StringMap\" class=\"anchor\"> </div>\n            <div id=\"StringMap.V\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#StringMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#StringMap\" class=\"name-decl\">StringMap</a>&lt;<a class=\"param1\">V</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, <span class=\"name-ref\">V</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"MMap\" class=\"anchor\"> </div>\n            <div id=\"MMap.X\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#MMap\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">typealias </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"index.html#MMap\" class=\"name-decl\">MMap</a>&lt;<a class=\"param1\">X</a>&gt; = <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<span class=\"name-ref\">X</span>, <span class=\"name-ref\">X</span>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/typealiases2.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/unionTypes/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unionTypes (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unionTypes/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unionTypes/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unionTypes\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unionTypes<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unionTypes</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unionTypes.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unionTypes.pkl\">unionTypes.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res1\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res1</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res2\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res2</span>: &quot;foo&quot;|&quot;bar&quot;|&quot;baz&quot;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res3</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res4\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res4\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res4</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res5\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res5\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res5</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?<a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"res6\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#res6\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">res6</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a>|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;)?|<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Number.html\" class=\"name-ref\">Number</a><a class=\"member-source-link\" href=\"https://example.com/package1/unionTypes.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/unlistedClass/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedClass (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedClass/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedClass/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedClass.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedClass.pkl\">unlistedClass.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedClass.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/unlistedMethod/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedMethod:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedMethod</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/unlistedMethod/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedMethod (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedMethod/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedMethod/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedMethod\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedMethod<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedMethod</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedMethod.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedMethod.pkl\">unlistedMethod.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myProperty\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myProperty\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myProperty</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedMethod.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/unlistedProperty/MyClass.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>MyClass (com.package1/unlistedProperty:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/MyClass.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/MyClass.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-class-name=\"MyClass\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package1.unlistedProperty</a>\n      <h1 id=\"declaration-title\">MyClass<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">MyClass</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"MyClass.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package1/current/unlistedProperty/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>unlistedProperty (com.package1:1.2.3) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package1/_/unlistedProperty/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package1/1.2.3/unlistedProperty/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.2.3\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package1\" data-package-version=\"1.2.3\" data-package-url-prefix=\"../\" data-module-name=\"com.package1.unlistedProperty\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package1</a>\n      <h1 id=\"declaration-title\">com.package1.unlistedProperty<span id=\"declaration-version\">1.2.3</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package1.unlistedProperty</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">https://example.com/unlistedProperty.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/package1/unlistedProperty.pkl\">unlistedProperty.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"myMethod()\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#myMethod()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">myMethod</span>(): unknown<a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"MyClass\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#MyClass\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"MyClass.html\" class=\"name-decl\">MyClass</a><a class=\"member-source-link\" href=\"https://example.com/package1/unlistedProperty.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/4.5.6/Module3/Class Two {}.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class Two {} (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class Two {}\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">`Class Two {}`<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">`Class Two {}`</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/4.5.6/Module3/Class3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class3 (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">Class3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Class3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/4.5.6/Module3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module3 (com.package2:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a>\n      <h1 id=\"declaration-title\">com.package2.Module3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package2.Module3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">modulepath:/com/package2/Module3.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/blob/4.5.6/Module3.pkl\">Module3.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\"><code>property {} &lt;&gt; four</code></a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property%20%7B%7D%20%3C%3E%20four\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property%20%7B%7D%20%3C%3E%20four\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">`property {} &lt;&gt; four`</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Class3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class3.html\" class=\"name-decl\">Class3</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Class%20Two%20%7B%7D\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class%20Two%20%7B%7D\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class%20Two%20%7B%7D.html\" class=\"name-decl\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/4.5.6/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package2 (4.5.6) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package2/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package2/4.5.6/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package2<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package2</span></div>\n        <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Authors:</dt>\n          <dd>package2-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>4.5.6</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://sources.apple.com/package2/\">https://sources.apple.com/package2/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package2/\">https://issues.apple.com/package2/</a></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package2.Module3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2.Module3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module3/index.html\">com.package2.Module3</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/4.5.6/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"},\"summary\":\"Docs for Package 2.\",\"sourceCode\":\"https://sources.apple.com/package2/\",\"sourceCodeUrlScheme\":\"https://example.com/blob/4.5.6%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/4.5.6/search-index.js",
    "content": "searchData='[{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"Module3/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/index.html#property3\",\"sig\":\": String\",\"parId\":0},{\"name\":\"property {} <> four\",\"kind\":5,\"url\":\"Module3/index.html#property {} <> four\",\"sig\":\": String\",\"parId\":0},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/index.html#function3()\",\"sig\":\"(n): String\",\"parId\":0},{\"name\":\"Class3\",\"kind\":3,\"url\":\"Module3/Class3.html\",\"parId\":0},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/Class3.html#property3\",\"sig\":\": String\",\"parId\":4},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/Class3.html#function3()\",\"sig\":\"(n): String\",\"parId\":4},{\"name\":\"Class Two {}\",\"kind\":3,\"url\":\"Module3/Class Two {}.html\",\"parId\":0},{\"name\":\"prop\",\"kind\":5,\"url\":\"Module3/Class Two {}.html#prop\",\"sig\":\": String\",\"parId\":7}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/current/Module3/Class Two {}.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class Two {} (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <script src=\"../../../data/com.package2/4.5.6/Module3/Class%20Two%20%7B%7D.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class Two {}\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">`Class Two {}`<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">`Class Two {}`</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"prop\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#prop\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">prop</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class%20Two%20%7B%7D.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/current/Module3/Class3.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Class3 (com.package2/Module3:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/Class3.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/Class3.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-class-name=\"Class3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a> &gt; <a class=\"declaration-parent-link\" href=\"index.html\">com.package2.Module3</a>\n      <h1 id=\"declaration-title\">Class3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">class <span class=\"name-decl\">Class3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties</h2>\n        <ul>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Any.html\" class=\"name-ref\">Any</a>.</span><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"Class3.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"context\"><a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Typed.html\" class=\"name-ref\">Typed</a>.</span><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/current/Module3/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Module3 (com.package2:4.5.6) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/com.package2/_/Module3/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/com.package2/4.5.6/Module3/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"../\" data-module-name=\"com.package2.Module3\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">com.package2</a>\n      <h1 id=\"declaration-title\">com.package2.Module3<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n        <li><a href=\"#_classes\">Classes</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">com.package2.Module3</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">modulepath:/com/package2/Module3.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/blob/4.5.6/Module3.pkl\">Module3.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property3\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">property3</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Something something <a href=\"not_found\"><code>property {} &lt;&gt; four</code></a></p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"property%20%7B%7D%20%3C%3E%20four\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#property%20%7B%7D%20%3C%3E%20four\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">`property {} &lt;&gt; four`</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"function3()\" class=\"anchor\"> </div>\n            <div id=\"function3().n\" class=\"anchor-param1\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#function3()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">function3</span>(<span class=\"param1\">n</span>: <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a>): <a href=\"https://pkl-lang.org/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_classes\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Classes</h2>\n        <ul>\n          <li>\n            <div id=\"Class3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class3.html\" class=\"name-decl\">Class3</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"Class%20Two%20%7B%7D\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#Class%20Two%20%7B%7D\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">class </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a href=\"Class%20Two%20%7B%7D.html\" class=\"name-decl\">`Class Two {}`</a><a class=\"member-source-link\" href=\"https://example.com/blob/4.5.6/Module3.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>com.package2 (4.5.6) • Docsite Title</title>\n    <script src=\"../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../data/com.package2/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../data/com.package2/4.5.6/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"4.5.6\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"com.package2\" data-package-version=\"4.5.6\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">com.package2<span id=\"declaration-version\">4.5.6</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">com.package2</span></div>\n        <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Authors:</dt>\n          <dd>package2-publisher@group.apple.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>4.5.6</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://sources.apple.com/package2/\">https://sources.apple.com/package2/</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://issues.apple.com/package2/\">https://issues.apple.com/package2/</a></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"com.package2.Module3\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2.Module3\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Module3/index.html\">com.package2.Module3</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\"},\"summary\":\"Docs for Package 2.\",\"sourceCode\":\"https://sources.apple.com/package2/\",\"sourceCodeUrlScheme\":\"https://example.com/blob/4.5.6%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\"},\"moduleClass\":{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},\"classes\":[{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class3\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]},{\"ref\":{\"pkg\":\"com.package2\",\"pkgUri\":null,\"version\":\"4.5.6\",\"module\":\"Module3\",\"type\":\"Class Two {}\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}]}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/com.package2/current/search-index.js",
    "content": "searchData='[{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"Module3/index.html\"},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/index.html#property3\",\"sig\":\": String\",\"parId\":0},{\"name\":\"property {} <> four\",\"kind\":5,\"url\":\"Module3/index.html#property {} <> four\",\"sig\":\": String\",\"parId\":0},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/index.html#function3()\",\"sig\":\"(n): String\",\"parId\":0},{\"name\":\"Class3\",\"kind\":3,\"url\":\"Module3/Class3.html\",\"parId\":0},{\"name\":\"property3\",\"kind\":5,\"url\":\"Module3/Class3.html#property3\",\"sig\":\": String\",\"parId\":4},{\"name\":\"function3\",\"kind\":4,\"url\":\"Module3/Class3.html#function3()\",\"sig\":\"(n): String\",\"parId\":4},{\"name\":\"Class Two {}\",\"kind\":3,\"url\":\"Module3/Class Two {}.html\",\"parId\":0},{\"name\":\"prop\",\"kind\":5,\"url\":\"Module3/Class Two {}.html#prop\",\"sig\":\": String\",\"parId\":7}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/Module Containing Spaces/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/baseModule/BaseClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/baseModule/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"moduleExtend\",\n      \"href\": \"../moduleExtend/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classAnnotations/AnnotatedClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classAnnotations/AnnotatedClss.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments4.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments5.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments6.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments7.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/Comments8.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classInheritance/MyClass1.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"MyClass2\",\n      \"href\": \"MyClass2.html\"\n    },\n    {\n      \"text\": \"MyClass3\",\n      \"href\": \"MyClass3.html\"\n    },\n    {\n      \"text\": \"MyClass4\",\n      \"href\": \"MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classInheritance/MyClass2.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"MyClass3\",\n      \"href\": \"MyClass3.html\"\n    },\n    {\n      \"text\": \"MyClass4\",\n      \"href\": \"MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classInheritance/MyClass3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classInheritance/MyClass4.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodComments/Comments.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodModifiers/Modifiers.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodTypeAnnotations/TypeAnnotations.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodTypeReferences/TypeReferences.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classMethodTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyComments/Comments.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyModifiers/Modifiers.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyTypeAnnotations/TypeAnnotations.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyTypeReferences/TypeReferences.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classPropertyTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classTypeConstraints/Address.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Person1\",\n      \"href\": \"Person1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classTypeConstraints/Person1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classTypeConstraints/Person2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classTypeConstraints/Project.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/classTypeConstraints/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/docExampleSubject1/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/docExampleSubject2/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/docLinks/Person.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/docLinks/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/methodAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleComments/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleExtend/ExtendClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleExtend/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleInfoAnnotation/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleMethodCommentInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleMethodComments/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"moduleMethodCommentInheritance\",\n      \"href\": \"../moduleMethodCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleMethodModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleMethodTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"moduleMethodTypeReferences\",\n      \"href\": \"index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleMethodTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"UserDefinedAnnotation1\",\n      \"href\": \"UserDefinedAnnotation1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyCommentInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyComments/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"modulePropertyCommentInheritance\",\n      \"href\": \"../modulePropertyCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyModifiers/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyTypeAnnotations/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"modulePropertyTypeReferences\",\n      \"href\": \"index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/modulePropertyTypeReferences/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleTypes1/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Foo\",\n      \"href\": \"../moduleTypes2/Foo.html\"\n    },\n    {\n      \"text\": \"moduleTypes2\",\n      \"href\": \"../moduleTypes2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleTypes2/Foo.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/moduleTypes2/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"Foo\",\n      \"href\": \"Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/nested/nested2/nestedModule/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/nested/nested2/nestedModule/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/shared/MyClass.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"../classMethodTypeReferences/TypeReferences.html\"\n    },\n    {\n      \"text\": \"TypeReferences\",\n      \"href\": \"../classPropertyTypeReferences/TypeReferences.html\"\n    },\n    {\n      \"text\": \"moduleMethodTypeReferences\",\n      \"href\": \"../moduleMethodTypeReferences/index.html\"\n    },\n    {\n      \"text\": \"modulePropertyTypeReferences\",\n      \"href\": \"../modulePropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/shared/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/ternalPackage/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typeAliasInheritance/Person2.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typeAliasInheritance/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typealiases/Person.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"Person2\",\n      \"href\": \"../typeAliasInheritance/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typealiases/index.json",
    "content": "{\n  \"knownSubtypes\": [\n    {\n      \"text\": \"typeAliasInheritance\",\n      \"href\": \"../typeAliasInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typealiases2/Foo.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typealiases2/Person.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/typealiases2/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/unionTypes/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/unlistedClass/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/unlistedMethod/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/unlistedMethod/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/unlistedProperty/MyClass.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/1.2.3/unlistedProperty/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/Module Containing Spaces/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/Module Containing Spaces/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/baseModule/BaseClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/baseModule/BaseClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/baseModule/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/baseModule/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classAnnotations/AnnotatedClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classAnnotations/AnnotatedClss.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClss.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classAnnotations/AnnotatedClssWithExpandableComment.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/AnnotatedClssWithExpandableComment.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments4.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments5.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments5.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments6.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments6.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments7.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments7.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/Comments8.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/Comments8.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classInheritance/MyClass1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classInheritance/MyClass2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classInheritance/MyClass3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classInheritance/MyClass4.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/MyClass4.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodComments/Comments.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodComments/Comments.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodModifiers/Modifiers.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodModifiers/Modifiers.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodTypeAnnotations/TypeAnnotations.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeAnnotations/TypeAnnotations.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodTypeReferences/TypeReferences.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classMethodTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classMethodTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyAnnotations/ClassWithAnnotatedProperty.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/ClassWithAnnotatedProperty.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/UserDefinedAnnotation.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyComments/Comments.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyComments/Comments.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyModifiers/Modifiers.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyModifiers/Modifiers.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyTypeAnnotations/TypeAnnotations.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeAnnotations/TypeAnnotations.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyTypeReferences/TypeReferences.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/TypeReferences.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classPropertyTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classPropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classTypeConstraints/Address.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Address.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classTypeConstraints/Person1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Person1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classTypeConstraints/Person2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classTypeConstraints/Project.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/Project.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/classTypeConstraints/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/classTypeConstraints/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/docExampleSubject1/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docExampleSubject1/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/docExampleSubject2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docExampleSubject2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/docLinks/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docLinks/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/docLinks/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/docLinks/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../1.2.3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/methodAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/methodAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleExtend/ExtendClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleExtend/ExtendClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleExtend/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleExtend/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleInfoAnnotation/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleInfoAnnotation/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleMethodCommentInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleMethodComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleMethodModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleMethodTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleMethodTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleMethodTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleMethodTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation1.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation1.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyAnnotations/UserDefinedAnnotation2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/UserDefinedAnnotation2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyCommentInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyCommentInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyComments/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyComments/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyModifiers/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyModifiers/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyTypeAnnotations/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeAnnotations/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyTypeReferences/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeReferences/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/modulePropertyTypeReferences/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/modulePropertyTypeReferences/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleTypes1/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes1/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleTypes2/Foo.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes2/Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/moduleTypes2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/moduleTypes2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/nested/nested2/nestedModule/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../../../1.2.3/nested/nested2/nestedModule/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/nested/nested2/nestedModule/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../../../1.2.3/nested/nested2/nestedModule/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/shared/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/shared/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/shared/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/shared/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/ternalPackage/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/ternalPackage/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typeAliasInheritance/Person2.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typeAliasInheritance/Person2.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typeAliasInheritance/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typeAliasInheritance/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typealiases/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typealiases/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typealiases2/Foo.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/Foo.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typealiases2/Person.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/Person.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/typealiases2/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/typealiases2/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/unionTypes/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unionTypes/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/unlistedClass/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedClass/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/unlistedMethod/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedMethod/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/unlistedMethod/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedMethod/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/unlistedProperty/MyClass.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedProperty/MyClass.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package1/_/unlistedProperty/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.2.3\",\n      \"href\": \"../../1.2.3/unlistedProperty/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/4.5.6/Module3/Class Two {}.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"ternalPackage\",\n      \"href\": \"../../../com.package1/1.2.3/ternalPackage/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/4.5.6/Module3/Class3.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/4.5.6/Module3/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/4.5.6/index.json",
    "content": "{\n  \"knownUsages\": [\n    {\n      \"text\": \"com.package1\",\n      \"href\": \"../../com.package1/1.2.3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/_/Module3/Class Two {}.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/Class Two {}.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/_/Module3/Class3.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/Class3.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/_/Module3/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../../4.5.6/Module3/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/com.package2/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"4.5.6\",\n      \"href\": \"../4.5.6/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/0.5.0/Bird/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/0.5.0/allFruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/0.5.0/catalog/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/0.5.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/_/Bird/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/Bird/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/_/allFruit/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/allFruit/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/_/catalog/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../../0.5.0/catalog/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/birds/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"0.5.0\",\n      \"href\": \"../0.5.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/deprecated/1.0.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/deprecated/_/deprecated/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.0.0\",\n      \"href\": \"../../1.0.0/deprecated/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/deprecated/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.0.0\",\n      \"href\": \"../1.0.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/fruit/1.1.0/Fruit/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/fruit/1.1.0/index.json",
    "content": "{}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/fruit/_/Fruit/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.1.0\",\n      \"href\": \"../../1.1.0/Fruit/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/data/localhost(3a)0/fruit/_/index.json",
    "content": "{\n  \"knownVersions\": [\n    {\n      \"text\": \"1.1.0\",\n      \"href\": \"../1.1.0/index.html\"\n    }\n  ]\n}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Docsite Title</title>\n    <script src=\"scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script src=\"scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search\" autocomplete=\"off\" data-root-url-prefix=\"\"></div>\n    </header>\n    <main>\n      <h1 id=\"declaration-title\">Docsite Title</h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_overview\">Overview</a></li>\n        <li><a href=\"#_packages\">Packages</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i>\n        <div class=\"doc-comment\"><p>Let the games begin.</p></div>\n        <div class=\"doc-comment expandable hidden collapsed\"><h2>Great Library</h2>\n<p>Just follow these simple steps. You'll love it.</p>\n<ol>\n<li>Install it</li>\n<li>I promise it's easy.</li>\n<li>You'll figure it out.</li>\n<li>Install it</li>\n</ol>\n<pre><code>name = &quot;Pigeon&quot;\nage = 42\n</code></pre>\n<ol>\n<li>Install it</li>\n</ol>\n<p>Let me <strong>emphasize</strong> how <em>simple</em> this is.</p>\n<p>😀😀😀 emoji day 😎😎😎 don't get 😡😡😡</p>\n<h2>Code</h2>\n<p>The code is beautiful:</p>\n<pre><code>/// example module\nmodule foo.bar\n\nperson {\nname = &quot;Pigeon&quot;\nage = 42\n}\n\nfunction sing() = &quot;tra-la-la&quot;\n\nclass Person {\nname: String\nage: Int\n}\n</code></pre>\n<h2>Random Tips</h2>\n<ul>\n<li>don't give up</li>\n<li>just don't</li>\n<li>don't give up</li>\n</ul>\n<h1>Level 1</h1>\n<h2>Level 2</h2>\n<h3>Level 3</h3>\n<h4>Level 4</h4>\n<h5>Level 5</h5>\n<h6>Level 6</h6>\n<ul>\n<li><a href=\"not_found\"><code>docLinks</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.age</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.sing()</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.Person.name</code></a></li>\n<li><a href=\"not_found\"><code>docLinks.PersonList</code></a></li>\n</ul></div>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_packages\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Packages</h2>\n        <ul>\n          <li>\n            <div id=\"com.package1\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package1\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./com.package1/current/index.html\">com.package1</a></div>\n                <div class=\"doc-comment\">Deprecated: com.package1 is deprecated</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"com.package2\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#com.package2\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./com.package2/current/index.html\">com.package2</a></div>\n                <div class=\"doc-comment\"><p>Docs for Package 2.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fbirds\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fbirds\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/birds/current/index.html\">localhost:0/birds</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Fdeprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Fdeprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><a class=\"name-decl\" href=\"./localhost(3a)0/deprecated/current/index.html\">localhost:0/deprecated</a></div>\n                <div class=\"doc-comment\">Deprecated: don't use</div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"localhost:0%2Ffruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#localhost:0%2Ffruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">package </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./localhost(3a)0/fruit/current/index.html\">localhost:0/fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/0.5.0/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Bird (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/Bird/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/Bird/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"../../../../fruit/1.0.5/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/0.5.0/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>allFruit (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/allFruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/allFruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/0.5.0/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>catalog (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/catalog/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/catalog/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/0.5.0/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/birds (0.5.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/birds/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/birds/0.5.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.5.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.0.5/index.html\">fruit:1.0.5</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/0.5.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/0.5.0/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/current/Bird/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Bird (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/Bird/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/Bird/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.Bird\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.Bird<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">open module <span class=\"name-decl\">birds.Bird</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/Bird.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl\">Bird.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"favoriteFruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#favoriteFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">favoriteFruit</span>: <a href=\"../../../../fruit/1.0.5/Fruit/index.html\" class=\"name-ref\">Fruit</a><a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/Bird.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/current/allFruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>allFruit (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/allFruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/allFruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.allFruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.allFruit<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.allFruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/allFruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl\">allFruit.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruit\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruit</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"fruitFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#fruitFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">fruitFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/allFruit.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/current/catalog/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>catalog (localhost:0/birds:0.5.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/birds/_/catalog/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/birds/0.5.0/catalog/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"../\" data-module-name=\"birds.catalog\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/birds</a>\n      <h1 id=\"declaration-title\">birds.catalog<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">birds.catalog</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0#/catalog.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl\">catalog.pkl</a></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalog\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalog</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"catalogFiles\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#catalogFiles\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">catalogFiles</span>: unknown<a class=\"member-source-link\" href=\"https://example.com/birds/v0.5.0/blob/catalog.pkl#L123-L456\">Source</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/birds (0.5.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/birds/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/birds/0.5.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"0.5.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/birds\" data-package-version=\"0.5.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/birds<span id=\"declaration-version\">0.5.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/birds</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/birds@0.5.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>petey-bird@example.com, polly-bird@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>0.5.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/birds\">https://example.com/birds</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/birds/issues\">https://example.com/birds/issues</a></dd>\n          <dt class=\"\">Dependencies:</dt>\n          <dd><a href=\"../../fruit/1.0.5/index.html\">fruit:1.0.5</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>b27206b80f4f227752b6f02143887f3ea41e554542cec38f7b572b987566c4de</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"birds.catalog\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.catalog\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./catalog/index.html\">birds.catalog</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.allFruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.allFruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./allFruit/index.html\">birds.allFruit</a></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"birds.Bird\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#birds.Bird\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Bird/index.html\">birds.Bird</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\"},\"sourceCode\":\"https://example.com/birds\",\"sourceCodeUrlScheme\":\"https://example.com/birds/v0.5.0/blob%{path}#L%{line}-L%{endLine}\",\"dependencies\":[{\"ref\":{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\"}},{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"catalog\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"allFruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}},{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/birds\",\"pkgUri\":\"package://localhost:0/birds@0.5.0\",\"version\":\"0.5.0\",\"module\":\"Bird\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}],\"usedTypes\":[{\"pkg\":\"fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.0.5\",\"version\":\"1.0.5\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/birds/current/search-index.js",
    "content": "searchData='[{\"name\":\"birds.catalog\",\"kind\":1,\"url\":\"catalog/index.html\"},{\"name\":\"catalog\",\"kind\":5,\"url\":\"catalog/index.html#catalog\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"catalogFiles\",\"kind\":5,\"url\":\"catalog/index.html#catalogFiles\",\"sig\":\": unknown\",\"parId\":0},{\"name\":\"birds.allFruit\",\"kind\":1,\"url\":\"allFruit/index.html\"},{\"name\":\"fruit\",\"kind\":5,\"url\":\"allFruit/index.html#fruit\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"fruitFiles\",\"kind\":5,\"url\":\"allFruit/index.html#fruitFiles\",\"sig\":\": unknown\",\"parId\":3},{\"name\":\"birds.Bird\",\"kind\":1,\"url\":\"Bird/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Bird/index.html#name\",\"sig\":\": String\",\"parId\":6},{\"name\":\"favoriteFruit\",\"kind\":5,\"url\":\"Bird/index.html#favoriteFruit\",\"sig\":\": Fruit\",\"parId\":6}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/1.0.0/deprecated/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>deprecated (localhost:0/deprecated:1.0.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/deprecated/_/deprecated/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"../\" data-module-name=\"deprecated.deprecated\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/deprecated</a>\n      <h1 id=\"declaration-title\">deprecated.deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">deprecated.deprecated</span></div>\n        <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0#/deprecated.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"foo\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">foo</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\">Deprecated. Replace with: <code>bar</code></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Old foo</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"bar\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#bar\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">bar</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\"><p>New bar</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/1.0.0/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/deprecated (1.0.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/deprecated/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/deprecated/1.0.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/deprecated</span></div>\n        <div class=\"doc-comment\">Deprecated: don't use</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>deprecated@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.0.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/deprecated\">https://example.com/deprecated</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/deprecated/issues\">https://example.com/deprecated/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>7589f1b802d6b5b93c468fb6399d2235d44d83f27409da2b036455ccb6e07ce5</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"deprecated.deprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#deprecated.deprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./deprecated/index.html\">deprecated.deprecated</a></div>\n                <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/1.0.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\"},\"deprecation\":\"don't use\",\"sourceCode\":\"https://example.com/deprecated\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\"},\"summary\":\"A module from a deprecated package\",\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/1.0.0/search-index.js",
    "content": "searchData='[{\"name\":\"deprecated.deprecated\",\"kind\":1,\"url\":\"deprecated/index.html\"},{\"name\":\"foo\",\"kind\":5,\"url\":\"deprecated/index.html#foo\",\"sig\":\": Int\",\"parId\":0,\"deprecated\":true},{\"name\":\"bar\",\"kind\":5,\"url\":\"deprecated/index.html#bar\",\"sig\":\": Int\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/current/deprecated/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>deprecated (localhost:0/deprecated:1.0.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/deprecated/_/deprecated/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/deprecated/1.0.0/deprecated/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"../\" data-module-name=\"deprecated.deprecated\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/deprecated</a>\n      <h1 id=\"declaration-title\">deprecated.deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">deprecated.deprecated</span></div>\n        <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0#/deprecated.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"foo\" class=\"anchor\"> </div>\n            <div class=\"member with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#foo\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers member-deprecated\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature member-deprecated\"><span class=\"name-decl\">foo</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\">Deprecated. Replace with: <code>bar</code></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Old foo</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"bar\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#bar\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">bar</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Int.html\" class=\"name-ref\">Int</a></div>\n                <div class=\"doc-comment\"><p>New bar</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/deprecated (1.0.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/deprecated/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/deprecated/1.0.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.0.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/deprecated\" data-package-version=\"1.0.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/deprecated<span id=\"declaration-version\">1.0.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/deprecated</span></div>\n        <div class=\"doc-comment\">Deprecated: don't use</div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/deprecated@1.0.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>deprecated@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.0.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/deprecated\">https://example.com/deprecated</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/deprecated/issues\">https://example.com/deprecated/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>7589f1b802d6b5b93c468fb6399d2235d44d83f27409da2b036455ccb6e07ce5</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"deprecated.deprecated\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#deprecated.deprecated\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./deprecated/index.html\">deprecated.deprecated</a></div>\n                <div class=\"doc-comment\"><p>A module from a deprecated package</p></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\"},\"deprecation\":\"don't use\",\"sourceCode\":\"https://example.com/deprecated\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\"},\"summary\":\"A module from a deprecated package\",\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/deprecated\",\"pkgUri\":\"package://localhost:0/deprecated@1.0.0\",\"version\":\"1.0.0\",\"module\":\"deprecated\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/deprecated/current/search-index.js",
    "content": "searchData='[{\"name\":\"deprecated.deprecated\",\"kind\":1,\"url\":\"deprecated/index.html\"},{\"name\":\"foo\",\"kind\":5,\"url\":\"deprecated/index.html#foo\",\"sig\":\": Int\",\"parId\":0,\"deprecated\":true},{\"name\":\"bar\",\"kind\":5,\"url\":\"deprecated/index.html#bar\",\"sig\":\": Int\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/1.1.0/Fruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Fruit (localhost:0/fruit:1.1.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/fruit/_/Fruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/fruit/1.1.0/Fruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"../\" data-module-name=\"fruit.Fruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/fruit</a>\n      <h1 id=\"declaration-title\">fruit.Fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">fruit.Fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0#/Fruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/1.1.0/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/fruit (1.1.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/fruit/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/fruit/1.1.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>apple-1@example.com, banana-2@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.1.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/fruit\">https://example.com/fruit</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/fruit/issues\">https://example.com/fruit/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"fruit.Fruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#fruit.Fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Fruit/index.html\">fruit.Fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/1.1.0/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"},\"sourceCode\":\"https://example.com/fruit\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/1.1.0/search-index.js",
    "content": "searchData='[{\"name\":\"fruit.Fruit\",\"kind\":1,\"url\":\"Fruit/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Fruit/index.html#name\",\"sig\":\": String\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/current/Fruit/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Fruit (localhost:0/fruit:1.1.0) • Docsite Title</title>\n    <script src=\"../../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../../data/localhost(3a)0/fruit/_/Fruit/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../../data/localhost(3a)0/fruit/1.1.0/Fruit/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"../\" data-module-name=\"fruit.Fruit\" data-root-url-prefix=\"../../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../../index.html\">Docsite Title</a> &gt; <a class=\"declaration-parent-link\" href=\"../index.html\">localhost:0/fruit</a>\n      <h1 id=\"declaration-title\">fruit.Fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_properties\">Properties</a></li>\n        <li><a href=\"#_methods\">Methods</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">module <span class=\"name-decl\">fruit.Fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">Module URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0#/Fruit.pkl</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"runtime-data hidden\">Known subtypes:</dt>\n          <dd id=\"known-subtypes\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_properties\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Properties<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"output\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#output\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">hidden </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">output</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/ModuleOutput.html\" class=\"name-ref\">ModuleOutput</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>The output of this module.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Defaults to all module properties rendered as either Pcf or the format specified on the command line.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"name\" class=\"anchor\"> </div>\n            <div class=\"member\"><a class=\"member-selflink material-icons\" href=\"#name\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\"></div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_methods\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Methods<span class=\"toggle-inherited-members\">(<span class=\"toggle-inherited-members-link button-link\">show inherited</span>)</span></h2>\n        <ul>\n          <li>\n            <div id=\"getClass()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#getClass()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getClass</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Class.html\" class=\"name-ref\">Class</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the class of <code>this</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toString()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#toString()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toString</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns a string representation of <code>this</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is used to convert the values of string interpolation expressions to strings.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"ifNonNull()\" class=\"anchor\"> </div>\n            <div id=\"ifNonNull().Result\" class=\"anchor-param1\"> </div>\n            <div id=\"ifNonNull().transform\" class=\"anchor-param2\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#ifNonNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">ifNonNull</span>&lt;<a class=\"param1\">Result</a>&gt;(<span class=\"param2\">transform</span>: (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html#NonNull\" class=\"name-ref\">NonNull</a>) -&gt; <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>): <a href=\"index.html#ifNonNull().Result\" class=\"name-ref\">Result</a>?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns <code>this |&gt; transform</code> if <code>this</code> is non-null, and <code>null</code> otherwise.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>This method is the complement of the <code>??</code> operator and the equivalent of an <code>Option</code> type's <code>map</code> and <code>flatMap</code> methods.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"hasProperty()\" class=\"anchor\"> </div>\n            <div id=\"hasProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#hasProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">hasProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Boolean.html\" class=\"name-ref\">Boolean</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Tells if this object has a property with the given <code>name</code>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getProperty()\" class=\"anchor\"> </div>\n            <div id=\"getProperty().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getProperty()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getProperty</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"getPropertyOrNull()\" class=\"anchor\"> </div>\n            <div id=\"getPropertyOrNull().name\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#getPropertyOrNull()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">getPropertyOrNull</span>(<span class=\"param1\">name</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>): unknown?<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the value of the property with the given <code>name</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Returns <code>null</code> if a property with this name does not exist.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toDynamic()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toDynamic()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toDynamic</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\" class=\"name-ref\">Dynamic</a><span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Dynamic.html\"><code>Dynamic</code></a> object.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"toMap()\" class=\"anchor\"> </div>\n            <div class=\"member inherited expandable hidden collapsed\"><a class=\"member-selflink material-icons\" href=\"#toMap()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">toMap</span>(): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\" class=\"name-ref\">Map</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>, unknown&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Converts this object to a <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Map.html\"><code>Map</code></a>.</p></div>\n              </div>\n            </div>\n          </li>\n          <li>\n            <div id=\"relativePathTo()\" class=\"anchor\"> </div>\n            <div id=\"relativePathTo().other\" class=\"anchor-param1\"> </div>\n            <div class=\"member inherited expandable hidden collapsed with-expandable-docs\"><i class=\"material-icons expandable-docs-icon\">expand_more</i><a class=\"member-selflink material-icons\" href=\"#relativePathTo()\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">function </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><span class=\"name-decl\">relativePathTo</span>(<span class=\"param1\">other</span>: <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/Module.html\" class=\"name-ref\">Module</a>): <a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/List.html\" class=\"name-ref\">List</a>&lt;<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/String.html\" class=\"name-ref\">String</a>&gt;<span class=\"context\"> (<a href=\"https://pages.github.com/apple/pkl/stdlib/pkl/0.24.0/base/index.html\" class=\"name-ref\">pkl.base</a>)</span><a class=\"member-source-link\" href=\"https://github.com/apple/pkl/blob/0.24.0/stdlib/base.pkl#L123-L456\">Source</a></div>\n                <div class=\"doc-comment\"><p>Returns the relative, descendent directory path between this module and <code>other</code>.</p></div>\n                <div class=\"doc-comment expandable hidden collapsed\"><p>Throws if no such path exists.</p>\n<p>For example, if module <code>mod1</code> has path <code>/dir1/mod1.pkl</code>, and module <code>mod2</code> has path <code>/dir1/dir2/dir3/mod2.pkl</code>,\nthen <code>mod1.relativePathTo(mod2)</code> will return <code>List(&quot;dir2&quot;, &quot;dir3&quot;)</code>.</p>\n<p>A common use case is to compute the directory path between a template located at the root of a hierarchy\n(say <code>rootModule.pkl</code>) and the currently evaluated module (accessible via the <code>module</code> keyword):</p>\n<pre><code>import &quot;rootModule.pkl&quot; // self-import\npath = rootModule.relativePathTo(module)\n</code></pre></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/current/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>localhost:0/fruit (1.1.0) • Docsite Title</title>\n    <script src=\"../../../scripts/pkldoc.js\" defer=\"defer\"></script>\n    <script type=\"module\">\n      import perPackageData from \"../../../data/localhost(3a)0/fruit/_/index.json\" with { type: \"json\" }\n      import perPackageVersionData from \"../../../data/localhost(3a)0/fruit/1.1.0/index.json\" with { type: \"json\" }\n\n      runtimeData.knownVersions(perPackageData.knownVersions, \"1.1.0\");\n      runtimeData.knownUsagesOrSubtypes(\"known-subtypes\", perPackageVersionData.knownSubtypes);\n      runtimeData.knownUsagesOrSubtypes(\"known-usages\", perPackageVersionData.knownUsages);\n    </script>\n    <script src=\"../../../scripts/scroll-into-view.min.js\" defer=\"defer\"></script>\n    <link href=\"../../../styles/pkldoc.css\" media=\"screen\" type=\"text/css\" rel=\"stylesheet\">\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"../../../images/favicon.svg\">\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../../images/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../../../images/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../../../images/favicon-16x16.png\">\n    <meta charset=\"UTF-8\">\n  </head>\n  <body onload=\"onLoad()\">\n    <header>\n      <div id=\"doc-title\"><a href=\"../../../index.html\">Docsite Title</a></div>\n      <div id=\"search\"><i id=\"search-icon\" class=\"material-icons\">search</i><input id=\"search-input\" type=\"search\" placeholder=\"Click or press 'S' to search this package\" autocomplete=\"off\" data-package-name=\"localhost:0/fruit\" data-package-version=\"1.1.0\" data-package-url-prefix=\"\" data-root-url-prefix=\"../../../\"></div>\n    </header>\n    <main><a class=\"declaration-parent-link\" href=\"../../../index.html\">Docsite Title</a>\n      <h1 id=\"declaration-title\">localhost:0/fruit<span id=\"declaration-version\">1.1.0</span></h1>\n      <ul class=\"member-group-links\">\n        <li><a href=\"#_modules\">Modules</a></li>\n      </ul>\n      <div id=\"_overview\" class=\"anchor\"> </div>\n      <div id=\"_declaration\" class=\"member\">\n        <div class=\"member-signature\">package <span class=\"name-decl\">localhost:0/fruit</span></div>\n        <dl class=\"member-info\">\n          <dt class=\"\">URI:</dt>\n          <dd><span class=\"import-uri\">package://localhost:0/fruit@1.1.0</span><i class=\"copy-uri-button material-icons\">content_copy</i></dd>\n          <dt class=\"\">Authors:</dt>\n          <dd>apple-1@example.com, banana-2@example.com</dd>\n          <dt class=\"\">Version:</dt>\n          <dd>1.1.0</dd>\n          <dt class=\"\">Source code:</dt>\n          <dd><a href=\"https://example.com/fruit\">https://example.com/fruit</a></dd>\n          <dt class=\"\">Issue tracker:</dt>\n          <dd><a href=\"https://example.com/fruit/issues\">https://example.com/fruit/issues</a></dd>\n          <dt class=\"\">Checksum:</dt>\n          <dd>8d982761d182f2185e4180c82190791d9a60c721cb3393bb2e946fab90131e8c</dd>\n          <dt class=\"runtime-data hidden\">Known usages:</dt>\n          <dd id=\"known-usages\" class=\"runtime-data hidden\"></dd>\n          <dt class=\"runtime-data hidden\">All versions:</dt>\n          <dd id=\"known-versions\" class=\"runtime-data hidden\"></dd>\n        </dl>\n      </div>\n      <div class=\"member-group\">\n        <div id=\"_modules\" class=\"anchor\"> </div>\n        <h2 class=\"member-group-title\">Modules</h2>\n        <ul>\n          <li>\n            <div id=\"fruit.Fruit\" class=\"anchor\"> </div>\n            <div class=\"member with-page-link\"><a class=\"member-selflink material-icons\" href=\"#fruit.Fruit\">link</a>\n              <div class=\"member-left\">\n                <div class=\"member-modifiers\">module </div>\n              </div>\n              <div class=\"member-main\">\n                <div class=\"member-signature\"><a class=\"name-decl\" href=\"./Fruit/index.html\">fruit.Fruit</a></div>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/current/package-data.json",
    "content": "{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\"},\"sourceCode\":\"https://example.com/fruit\",\"sourceCodeUrlScheme\":null,\"dependencies\":[{\"ref\":{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\"}}],\"modules\":[{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\"},\"moduleClass\":{\"ref\":{\"pkg\":\"localhost:0/fruit\",\"pkgUri\":\"package://localhost:0/fruit@1.1.0\",\"version\":\"1.1.0\",\"module\":\"Fruit\",\"type\":\"ModuleClass\"},\"superclasses\":[{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Module\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Typed\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Object\"},{\"pkg\":\"pkl\",\"pkgUri\":null,\"version\":\"0.24.0\",\"module\":\"base\",\"type\":\"Any\"}]}}]}"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/localhost(3a)0/fruit/current/search-index.js",
    "content": "searchData='[{\"name\":\"fruit.Fruit\",\"kind\":1,\"url\":\"Fruit/index.html\"},{\"name\":\"name\",\"kind\":5,\"url\":\"Fruit/index.html#name\",\"sig\":\": String\",\"parId\":0}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/scripts/pkldoc.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// Whether the current browser is WebKit.\nlet isWebKitBrowser;\n\n// The lazily initialized worker for running searches, if any.\nlet searchWorker = null;\n\n// Tells whether non-worker search is ready for use.\n// Only relevant if we determined that we can't use a worker.\nlet nonWorkerSearchInitialized = false;\n\n// The search div containing search input and search results.\nlet searchElement;\n\n// The search input element.\nlet searchInput;\n\n// The package name associated with the current page, if any.\nlet packageName;\n\nlet packageVersion;\n\n// The module name associated with the current page, if any.\nlet moduleName;\n\n// The class name associated with the current page, if any.\nlet className;\n\n// Prefix to turn a site-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet rootUrlPrefix;\n\n// Prefix to turn a package-relative URL into a page-relative URL.\n// One of \"\", \"../\", \"../../\", etc.\nlet packageUrlPrefix;\n\n// The search result currently selected in the search results list.\nlet selectedSearchResult = null;\n\n// Initializes the UI.\n// Wrapped in a function to avoid execution in tests.\n// noinspection JSUnusedGlobalSymbols\nfunction onLoad() {\n  isWebKitBrowser = navigator.userAgent.indexOf('AppleWebKit') !== -1;\n  searchElement = document.getElementById('search');\n  searchInput = document.getElementById('search-input');\n  packageName = searchInput.dataset.packageName || null;\n  packageVersion = searchInput.dataset.packageVersion || null;\n  moduleName = searchInput.dataset.moduleName || null;\n  className = searchInput.dataset.className || null;\n  rootUrlPrefix = searchInput.dataset.rootUrlPrefix;\n  packageUrlPrefix = searchInput.dataset.packageUrlPrefix;\n\n  initExpandTargetMemberDocs();\n  initNavigateToMemberPage();\n  initToggleMemberDocs();\n  initToggleInheritedMembers();\n  initCopyModuleUriToClipboard();\n  initSearchUi();\n}\n\n// If page URL contains a fragment, expand the target member's docs.\n// Handled in JS rather than CSS so that target member can still be manually collapsed.\nfunction initExpandTargetMemberDocs() {\n  const expandTargetDocs = () => {\n    const hash = window.location.hash;\n    if (hash.length === 0) return;\n    \n    const target = document.getElementById(hash.substring(1));\n    if (!target) return;\n\n    const member = target.nextElementSibling;\n    if (!member || !member.classList.contains('with-expandable-docs')) return;\n\n    expandMemberDocs(member);\n  }\n  \n  window.addEventListener('hashchange', expandTargetDocs);\n  expandTargetDocs();\n}\n\n// For members that have their own page, navigate to that page when the member's box is clicked.\nfunction initNavigateToMemberPage() {\n  const elements = document.getElementsByClassName('with-page-link');\n  for (const element of elements) {\n    const memberLink = element.getElementsByClassName('name-decl')[0];\n    // check if this is actually a link\n    // (it isn't if the generator couldn't resolve the link target)\n    if (memberLink.tagName === 'A') {\n      element.addEventListener('click', (e) => {\n        // don't act if user clicked a link\n        if (e.target !== null && e.target.closest('a') !== null) return;\n\n        // don't act if user clicked to select some text\n        if (window.getSelection().toString()) return;\n\n        memberLink.click();\n      });\n    }\n  }\n}\n\n// Expands and collapses member docs.\nfunction initToggleMemberDocs() {\n  const elements = document.getElementsByClassName('with-expandable-docs');\n  for (const element of elements) {\n    element.addEventListener('click', (e) => {\n      // don't act if user clicked a link\n      if (e.target !== null && e.target.closest('a') !== null) return;\n\n      // don't act if user clicked to select some text\n      if (window.getSelection().toString()) return;\n\n      toggleMemberDocs(element);\n    });\n  }\n}\n\n// Shows and hides inherited members.\nfunction initToggleInheritedMembers() {\n  const memberGroups = document.getElementsByClassName('member-group');\n  for (const group of memberGroups) {\n    const button = group.getElementsByClassName('toggle-inherited-members-link')[0];\n    if (button !== undefined) {\n      const members = group.getElementsByClassName('inherited');\n      button.addEventListener('click', () => toggleInheritedMembers(button, members));\n    }\n  }\n}\n\n// Copies the module URI optionally displayed on a module page to the clipboard.\nfunction initCopyModuleUriToClipboard() {\n  const copyUriButtons = document.getElementsByClassName('copy-uri-button');\n\n  for (const button of copyUriButtons) {\n    const moduleUri = button.previousElementSibling;\n\n    button.addEventListener('click', e => {\n      e.stopPropagation();\n      const range = document.createRange();\n      range.selectNodeContents(moduleUri);\n      const selection = getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      try {\n        document.execCommand('copy');\n      } catch (e) {\n      } finally {\n        selection.removeAllRanges();\n      }\n    });\n  }\n}\n\n// Expands or collapses member docs.\nfunction toggleMemberDocs(memberElem) {\n  const comments = memberElem.getElementsByClassName('expandable');\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n\n  if (isCollapsed) {\n    for (const comment of comments) expandElement(comment);\n    icon.textContent = 'expand_less';\n  } else {\n    for (const comment of comments) collapseElement(comment);\n    icon.textContent = 'expand_more';\n  }\n}\n\n// Expands member docs unless they are already expanded.\nfunction expandMemberDocs(memberElem) {\n  const icon = memberElem.getElementsByClassName('expandable-docs-icon')[0];\n  const isCollapsed = icon.textContent === 'expand_more';\n  \n  if (!isCollapsed) return;\n  \n  const comments = memberElem.getElementsByClassName('expandable');\n  for (const comment of comments) expandElement(comment);\n  icon.textContent = 'expand_less';\n}\n\n// Shows and hides inherited members.\nfunction toggleInheritedMembers(button, members) {\n  const isCollapsed = button.textContent === 'show inherited';\n\n  if (isCollapsed) {\n    for (const member of members) expandElement(member);\n    button.textContent = 'hide inherited';\n  } else {\n    for (const member of members) collapseElement(member);\n    button.textContent = 'show inherited'\n  }\n}\n\n// Expands an element.\n// Done in two steps to make transition work (can't transition from 'hidden').\n// For some reason (likely related to removing 'hidden') the transition isn't animated in FF.\n// When using timeout() instead of requestAnimationFrame()\n// there is *some* animation in FF but still doesn't look right.\nfunction expandElement(element) {\n  element.classList.remove('hidden');\n\n  requestAnimationFrame(() => {\n    element.classList.remove('collapsed');\n  });\n}\n\n// Collapses an element.\n// Done in two steps to make transition work (can't transition to 'hidden').\nfunction collapseElement(element) {\n  element.classList.add('collapsed');\n\n  const listener = () => {\n    element.removeEventListener('transitionend', listener);\n    element.classList.add('hidden');\n  };\n  element.addEventListener('transitionend', listener);\n}\n\n// Initializes the search UI and sets up delayed initialization of the search engine.\nfunction initSearchUi() {\n  // initialize search engine the first time that search input receives focus\n  const onFocus = () => {\n    searchInput.removeEventListener('focus', onFocus);\n    initSearchWorker();\n  };\n  searchInput.addEventListener('focus', onFocus);\n\n  // clear search when search input loses focus,\n  // except if this happens due to a search result being clicked,\n  // in which case clearSearch() will be called by the link's click handler,\n  // and calling it here would prevent the click handler from firing\n  searchInput.addEventListener('focusout', () => {\n    if (document.querySelector('#search-results:hover') === null) clearSearch();\n  });\n\n  // trigger search when user hasn't typed in a while\n  let timeoutId = null;\n  // Using anything other than `overflow: visible` for `#search-results`\n  // slows down painting significantly in WebKit browsers (at least Safari/Mac).\n  // Compensate by using a higher search delay, which is less annoying than a blocking UI.\n  const delay = isWebKitBrowser ? 200 : 100;\n  searchInput.addEventListener('input', () => {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => triggerSearch(searchInput.value), delay);\n  });\n\n  // keyboard shortcut for entering search\n  document.addEventListener('keyup', e => {\n    // could additionally support '/' like GitHub and Gmail do,\n    // but this would require overriding the default behavior of '/' on Firefox\n    if (e.key === 's') searchInput.focus();\n  });\n\n  // keyboard navigation for search results\n  searchInput.addEventListener('keydown', e => {\n    const results = document.getElementById('search-results');\n    if (results !== null) {\n      if (e.key === 'ArrowDown') {\n        selectNextResult(results.firstElementChild);\n        e.preventDefault();\n      } else if (e.key === 'ArrowUp') {\n        selectPrevResult(results.firstElementChild);\n        e.preventDefault();\n      }\n    }\n  });\n  searchInput.addEventListener('keyup', e => {\n    if (e.key === 'Enter' && selectedSearchResult !== null) {\n      selectedSearchResult.firstElementChild.click();\n      clearSearch();\n    }\n  });\n}\n\n// Initializes the search worker.\nfunction initSearchWorker() {\n  const workerScriptUrl = rootUrlPrefix + 'scripts/search-worker.js';\n\n  try {\n    searchWorker = new Worker(workerScriptUrl, {name: packageName === null ? \"main\" : packageName + '/' + packageVersion});\n    searchWorker.addEventListener('message', e => handleSearchResults(e.data.query, e.data.results));\n  } catch (e) {\n    // could not initialize worker, presumably because we are a file:/// page and content security policy got in the way\n    // fall back to running searches synchronously without a worker\n    // this requires loading search related scripts that would otherwise be loaded by the worker\n\n    searchWorker = null;\n    let pendingScripts = 3;\n\n    const onScriptLoaded = () => {\n      if (--pendingScripts === 0) {\n        initSearchIndex();\n        nonWorkerSearchInitialized = true;\n        if (searchInput.focused) {\n          triggerSearch(searchInput.value);\n        }\n      }\n    };\n    \n    const script1 = document.createElement('script');\n    script1.src = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + 'search-index.js';\n    script1.async = true;\n    script1.onload = onScriptLoaded;\n    document.head.append(script1);\n\n    const script2 = document.createElement('script');\n    script2.src = rootUrlPrefix;\n    script2.async = true;\n    script2.onload = onScriptLoaded;\n    document.head.append(script2);\n\n    const script3 = document.createElement('script');\n    script3.src = workerScriptUrl;\n    script3.async = true;\n    script3.onload = onScriptLoaded;\n    document.head.append(script3);\n  }\n}\n\n// Updates search results unless they are stale.\nfunction handleSearchResults(query, results) {\n  if (query.inputValue !== searchInput.value) return;\n\n  updateSearchResults(renderSearchResults(query, results));\n}\n\n// TODO: Should this (or its callers) use requestAnimationFrame() ?\n// Removes any currently displayed search results, then displays the given results if non-null.\nfunction updateSearchResults(resultsDiv) {\n  selectedSearchResult = null;\n\n  const oldResultsDiv = document.getElementById('search-results');\n  if (oldResultsDiv !== null) {\n    searchElement.removeChild(oldResultsDiv);\n  }\n\n  if (resultsDiv != null) {\n    searchElement.append(resultsDiv);\n    selectNextResult(resultsDiv.firstElementChild);\n  }\n}\n\n// Returns the module of the given member, or `null` if the given member is a module.\nfunction getModule(member) {\n  switch (member.level) {\n    case 0:\n      return null;\n    case 1:\n      return member.parent;\n    case 2:\n      return member.parent.parent;\n  }\n}\n\n// Triggers a search unless search input is invalid or incomplete.\nfunction triggerSearch(inputValue) {\n  const query = parseSearchInput(inputValue);\n  if (!isActionableQuery(query)) {\n    handleSearchResults(query, null);\n    return;\n  }\n\n  if (searchWorker !== null) {\n    searchWorker.postMessage({query, packageName, moduleName, className});\n  } else if (nonWorkerSearchInitialized) {\n    const results = runSearch(query, packageName, moduleName, className);\n    handleSearchResults(query, results);\n  }\n}\n\n// Tells if the given Unicode character is a whitespace character.\nfunction isWhitespace(ch) {\n  const cp = ch.codePointAt(0);\n  if (cp >= 9 && cp <= 13 || cp === 32 || cp === 133 || cp === 160) return true;\n  if (cp < 5760) return false;\n  return cp === 5760 || cp >= 8192 && cp <= 8202\n      || cp === 8232 || cp === 8233 || cp === 8239 || cp === 8287 || cp === 12288;\n}\n\n// Trims the given Unicode characters.\nfunction trim(chars) {\n  const length = chars.length;\n  let startIdx, endIdx;\n\n  for (startIdx = 0; startIdx < length; startIdx += 1) {\n    if (!isWhitespace(chars[startIdx])) break;\n  }\n  for (endIdx = chars.length - 1; endIdx > startIdx; endIdx -= 1) {\n    if (!isWhitespace(chars[endIdx])) break;\n  }\n  return chars.slice(startIdx, endIdx + 1);\n}\n\n// Parses the user provided search input.\n// Preconditions:\n// inputValue !== ''\nfunction parseSearchInput(inputValue) {\n  const chars = trim(Array.from(inputValue));\n  const char0 = chars[0]; // may be undefined\n  const char1 = chars[1]; // may be undefined\n  const prefix = char1 === ':' ? char0 + char1 : null;\n  const kind =\n      prefix === null ? null :\n          char0 === 'm' ? 1 :\n              char0 === 't' ? 2 :\n                  char0 === 'c' ? 3 :\n                      char0 === 'f' ? 4 :\n                          char0 === 'p' ? 5 :\n                              undefined;\n  const unprefixedChars = kind !== null && kind !== undefined ?\n      trim(chars.slice(2, chars.length)) :\n      chars;\n  const normalizedCps = toNormalizedCodePoints(unprefixedChars);\n  return {inputValue, prefix, kind, normalizedCps};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\n// Note: Keep in sync with same function in search-worker.js.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Tells if the given query is valid and long enough to be worth running.\n// Prefixed queries require fewer minimum characters than unprefixed queries.\n// This avoids triggering a search while typing a prefix yet still enables searching for single-character names.\n// For example, `p:e` finds `pkl.math#E`.\nfunction isActionableQuery(query) {\n  const kind = query.kind;\n  const queryCps = query.normalizedCps;\n  return kind !== undefined && (kind !== null && queryCps.length > 0 || queryCps.length > 1);\n}\n\n// Renders the given search results for the given query.\n// Preconditions:\n// isActionableQuery(query) ? results !== null : results === null\nfunction renderSearchResults(query, results) {\n  const resultsDiv = document.createElement('div');\n  resultsDiv.id = 'search-results';\n  const ul = document.createElement('ul');\n  resultsDiv.append(ul);\n\n  if (results === null) {\n    if (query.kind !== undefined) return null;\n\n    const li = document.createElement('li');\n    li.className = 'heading';\n    li.textContent = 'Unknown search prefix. Use one of <b>m:</b> (module), <b>c:</b> (class), <b>f:</b> (function), or <b>p:</b> (property).';\n    ul.append(li);\n    return resultsDiv;\n  }\n\n  const {exactMatches, classMatches, moduleMatches, otherMatches} = results;\n\n  if (exactMatches.length + classMatches.length + moduleMatches.length + otherMatches.length === 0) {\n    renderHeading('No results found', ul);\n    return resultsDiv;\n  }\n\n  if (exactMatches.length > 0) {\n    renderHeading('Top hits', ul);\n    renderMembers(query.normalizedCps, exactMatches, ul);\n  }\n  if (classMatches.length > 0) {\n    renderHeading('Class', ul, className);\n    renderMembers(query.normalizedCps, classMatches, ul);\n  }\n  if (moduleMatches.length > 0) {\n    renderHeading('Module', ul, moduleName);\n    renderMembers(query.normalizedCps, moduleMatches, ul);\n  }\n  if (otherMatches.length > 0) {\n    renderHeading('Other results', ul);\n    renderMembers(query.normalizedCps, otherMatches, ul);\n  }\n\n  return resultsDiv;\n}\n\n// Adds a heading such as `Top matches` to the search results list.\nfunction renderHeading(title, ul, name = null) {\n  const li = document.createElement('li');\n  li.className = 'heading';\n  li.append(title);\n  if (name != null) {\n    li.append(' ');\n    li.append(span('heading-name', name))\n  }\n  ul.append(li);\n}\n\n// Adds matching members to the search results list.\nfunction renderMembers(queryCps, members, ul) {\n  for (const member of members) {\n    ul.append(renderMember(queryCps, member));\n  }\n}\n\n// Renders a member to be added to the search result list.\nfunction renderMember(queryCps, member) {\n  const result = document.createElement('li');\n  result.className = 'result';\n  if (member.deprecated) result.className = 'deprecated';\n\n  const link = document.createElement('a');\n  result.append(link);\n\n  link.href = (packageName === null ? rootUrlPrefix : packageUrlPrefix) + member.url;\n  link.addEventListener('mousedown', () => selectResult(result));\n  link.addEventListener('click', clearSearch);\n\n  const keyword = getKindKeyword(member.kind);\n  // noinspection JSValidateTypes (IntelliJ bug?)\n  if (keyword !== null) {\n    link.append(span('keyword', keyword), ' ');\n  }\n\n  // prefix with class name if a class member\n  if (member.level === 2) {\n    link.append(span(\"context\", member.parent.name + '.'));\n  }\n\n  const name = span('result-name');\n  if (member.matchNameIdx === 0) { // main name matched\n    highlightMatch(queryCps, member.names[0], member.matchStartIdx, name);\n  } else { // aka name matched\n    name.append(member.name);\n  }\n  link.append(name);\n\n  if (member.signature !== null) {\n    link.append(member.signature);\n  }\n\n  if (member.matchNameIdx > 0) { // aka name matched\n    link.append(' ');\n    const aka = span('aka');\n    aka.append('(known as: ');\n    const name = span('aka-name');\n    highlightMatch(queryCps, member.names[member.matchNameIdx], member.matchStartIdx, name);\n    aka.append(name, ')');\n    link.append(aka);\n  }\n\n  // add module name if not a module\n  const module = getModule(member);\n  if (module !== null) {\n    link.append(' ', span('context', '(' + module.name + ')'));\n  }\n\n  return result;\n}\n\n// Returns the keyword for the given member kind.\nfunction getKindKeyword(kind) {\n  switch (kind) {\n    case 0:\n      return \"package\";\n    case 1:\n      return \"module\";\n    case 2:\n      return \"typealias\";\n    case 3:\n      return \"class\";\n    case 4:\n      return \"function\";\n    case 5:\n      // properties have no keyword\n      return null;\n  }\n}\n\n// Highlights the matching characters in a member name.\n// Preconditions:\n// queryCps.length > 0\n// computeMatchFrom(queryCps, name.normalizedCps, name.wordStarts, matchStartIdx)\nfunction highlightMatch(queryCps, name, matchStartIdx, parentElem) {\n  const queryLength = queryCps.length;\n  const codePoints = name.codePoints;\n  const nameCps = name.normalizedCps;\n  const nameLength = nameCps.length;\n  const wordStarts = name.wordStarts;\n\n  let queryIdx = 0;\n  let queryCp = queryCps[0];\n  let startIdx = matchStartIdx;\n\n  if (startIdx > 0) {\n    parentElem.append(String.fromCodePoint(...codePoints.subarray(0, startIdx)));\n  }\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp !== nameCp) {\n      const newNameIdx = wordStarts[nameIdx];\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx))));\n      startIdx = newNameIdx;\n      parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx, newNameIdx)));\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      parentElem.append(\n          span('highlight', String.fromCodePoint(...codePoints.subarray(startIdx, nameIdx + 1))));\n      if (nameIdx + 1 < nameLength) {\n        parentElem.append(String.fromCodePoint(...codePoints.subarray(nameIdx + 1, nameLength)));\n      }\n      return;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  throw 'Precondition violated: `computeMatchFrom()`';\n}\n\n// Creates a span element.\nfunction span(className, text = null) {\n  const result = document.createElement('span');\n  result.className = className;\n  result.textContent = text;\n  return result;\n}\n\n// Creates a text node.\nfunction text(content) {\n  return document.createTextNode(content);\n}\n\n// Navigates to the next member entry in the search results list, skipping headings.\nfunction selectNextResult(ul) {\n  let next = selectedSearchResult === null ? ul.firstElementChild : selectedSearchResult.nextElementSibling;\n  while (next !== null) {\n    if (!next.classList.contains('heading')) {\n      selectResult(next);\n      scrollIntoView(next, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    next = next.nextElementSibling;\n  }\n}\n\n// Navigates to the previous member entry in the search results list, skipping headings.\nfunction selectPrevResult(ul) {\n  let prev = selectedSearchResult === null ? ul.lastElementChild : selectedSearchResult.previousElementSibling;\n  while (prev !== null) {\n    if (!prev.classList.contains('heading')) {\n      selectResult(prev);\n      const prev2 = prev.previousElementSibling;\n      // make any immediately preceding heading visible as well (esp. important for first heading)\n      const scrollTo = prev2 !== null && prev2.classList.contains('heading') ? prev2 : prev;\n      scrollIntoView(scrollTo, {\n        behavior: 'instant', // better for keyboard navigation\n        scrollMode: 'if-needed',\n        block: 'nearest',\n        inline: 'nearest',\n      });\n      return;\n    }\n    prev = prev.previousElementSibling;\n  }\n}\n\n// Selects the given entry in the search results list.\nfunction selectResult(li) {\n  if (selectedSearchResult !== null) {\n    selectedSearchResult.classList.remove('selected');\n  }\n  li.classList.add('selected');\n  selectedSearchResult = li;\n}\n\n// Clears the search input and hides/removes the search results list.\nfunction clearSearch() {\n  searchInput.value = '';\n  updateSearchResults(null);\n}\n\nconst updateRuntimeDataWith = (buildAnchor) => (fragmentId, entries) => {\n  if (!entries) return;\n  const fragment = document.createDocumentFragment();\n  let first = true;\n  for (const entry of entries) {\n    const a = document.createElement(\"a\");\n    buildAnchor(entry, a);\n    if (first) {\n      first = false;\n    } else {\n      fragment.append(\", \");\n    }\n    fragment.append(a);\n  }\n\n  const element = document.getElementById(fragmentId);\n  element.append(fragment);\n  element.classList.remove(\"hidden\"); // dd\n  element.previousElementSibling.classList.remove(\"hidden\"); // dt\n}\n\n// Functions called by JS data scripts.\n// noinspection JSUnusedGlobalSymbols\nconst runtimeData = {\n  knownVersions: (versions, myVersion) => {\n    updateRuntimeDataWith((entry, anchor) => {\n      const { text, href } = entry;\n      anchor.textContent = text;\n      // noinspection JSUnresolvedReference\n      if (text === myVersion) {\n        anchor.className = \"current-version\";\n      } else if (href) {\n        anchor.href = href;\n      }\n    })(\"known-versions\", versions);\n  },\n  knownUsagesOrSubtypes: updateRuntimeDataWith((entry, anchor) => {\n    const { text, href } = entry;\n    anchor.textContent = text;\n    // noinspection JSUnresolvedReference\n    anchor.textContent = text;\n    if (href) {\n      anchor.href = href;\n    }\n  }),\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/scripts/search-worker.js",
    "content": "// noinspection DuplicatedCode\n\n'use strict';\n\n// populated by `initSearchIndex()`\nlet searchIndex;\n\n// noinspection ThisExpressionReferencesGlobalObjectJS\nconst isWorker = 'DedicatedWorkerGlobalScope' in this;\n\nif (isWorker) {\n  const workerName = self.name;\n  // relative to this file\n  const searchIndexUrl = workerName === \"main\" ?\n      '../search-index.js' :\n      '../' + workerName + '/search-index.js';\n  importScripts(searchIndexUrl);\n  initSearchIndex();\n  addEventListener('message', e => {\n    const {query, packageName, moduleName, className} = e.data;\n    const results = runSearch(query, packageName, moduleName, className);\n    postMessage({query, results});\n  });\n} else {\n  // non-worker environment\n  // `pkldoc.js` loads scripts and calls `initSearchIndex()`\n}\n\n// Initializes the search index.\nfunction initSearchIndex() {\n  // noinspection JSUnresolvedVariable\n  const data = JSON.parse(searchData);\n  const index = Array(data.length);\n  let idx = 0;\n\n  for (const entry of data) {\n    const name = entry.name;\n    const names = toIndexedNames(entry);\n    // 0 -> package, 1 -> module, 2 -> type alias, 3 -> class, 4 -> function, 5 -> property\n    const kind = entry.kind;\n    const url = entry.url;\n    // noinspection JSUnresolvedVariable\n    const signature = entry.sig === undefined ? null : entry.sig;\n    // noinspection JSUnresolvedVariable\n    const parent = entry.parId === undefined ? null : index[entry.parId];\n    const level = parent === null ? 0 : parent.parent === null ? 1 : 2;\n    const deprecated = entry.deprecated !== undefined;\n\n    index[idx++] = {\n      name,\n      names,\n      kind,\n      url,\n      signature,\n      parent,\n      level,\n      deprecated,\n      // remaining attributes are set by `computeMatchFrom` and hence aren't strictly part of the search index\n      matchNameIdx: -1,  // names[matchNameIdx] is the name that matched\n      matchStartIdx: -1, // names[matchNameIdx].codePoints[matchStartIdx] is the first code point that matched\n      similarity: 0 // number of code points matched relative to total number of code points (between 0.0 and 1.0)\n    };\n  }\n\n  searchIndex = index;\n}\n\n// Runs a search and returns its results.\nfunction runSearch(query, packageName, moduleName, className) {\n  const queryCps = query.normalizedCps;\n  const queryKind = query.kind;\n\n  let exactMatches = [];\n  let classMatches = [];\n  let moduleMatches = [];\n  let otherMatches = [];\n\n  for (const member of searchIndex) {\n    if (queryKind !== null && queryKind !== member.kind) continue;\n\n    if (!isMatch(queryCps, member)) continue;\n\n    if (member.similarity === 1) {\n      exactMatches.push(member);\n    } else if (moduleName !== null && member.level === 1 && moduleName === member.parent.name) {\n      moduleMatches.push(member);\n    } else if (moduleName !== null && member.level === 2 && moduleName === member.parent.parent.name) {\n      if (className !== null && className === member.parent.name) {\n        classMatches.push(member);\n      } else {\n        moduleMatches.push(member);\n      }\n    } else {\n      otherMatches.push(member);\n    }\n  }\n\n  // Sorts members best-first.\n  function compareMembers(member1, member2) {\n    const normDiff = member2.similarity - member1.similarity; // higher is better\n    if (normDiff !== 0) return normDiff;\n\n    const lengthDiff = member1.matchNameLength - member2.matchNameLength; // lower is better\n    if (lengthDiff !== 0) return lengthDiff;\n\n    const kindDiff = member2.kind - member1.kind; // higher is better\n    if (kindDiff !== 0) return kindDiff;\n\n    return member1.matchNameIdx - member2.matchNameIdx; // lower is better\n  }\n\n  exactMatches.sort(compareMembers);\n  classMatches.sort(compareMembers);\n  moduleMatches.sort(compareMembers);\n  otherMatches.sort(compareMembers);\n\n  return {exactMatches, classMatches, moduleMatches, otherMatches};\n}\n\n// Indexes a member's names.\nfunction toIndexedNames(entry) {\n  const result = [];\n  result.push(toIndexedName(entry.name));\n  // noinspection JSUnresolvedVariable\n  const alsoKnownAs = entry.aka;\n  if (alsoKnownAs !== undefined) {\n    for (const name of alsoKnownAs) {\n      result.push(toIndexedName(name));\n    }\n  }\n  return result;\n}\n\n// Indexes the given name.\nfunction toIndexedName(name) {\n  const characters = Array.from(name);\n  const codePoints = Uint32Array.from(characters, ch => ch.codePointAt(0));\n  const normalizedCps = toNormalizedCodePoints(characters);\n  const wordStarts = toWordStarts(characters);\n\n  return {codePoints, normalizedCps, wordStarts};\n}\n\n// Converts a Unicode character array to an array of normalized Unicode code points.\n// Normalization turns characters into their base forms, e.g., é into e.\n// Since JS doesn't support case folding, `toLocaleLowerCase()` is used instead.\nfunction toNormalizedCodePoints(characters) {\n  return Uint32Array.from(characters, ch => ch.normalize('NFD')[0].toLocaleLowerCase().codePointAt(0));\n}\n\n// Returns an array of same length as `characters` that for every index, holds the index of the next word start.\n// Preconditions:\n// characters.length > 0\nfunction toWordStarts(characters) {\n  const length = characters.length;\n  // -1 is used as 'no next word start exists' -> use signed int array\n  const result = length <= 128 ? new Int8Array(length) : new Int16Array(length);\n\n  if (length > 1) {\n    let class1 = toCharClass(characters[length - 1]);\n    let class2;\n    let wordStart = -1;\n    for (let idx = length - 1; idx >= 1; idx -= 1) {\n      class2 = class1;\n      class1 = toCharClass(characters[idx - 1]);\n      const diff = class1 - class2;\n      // transitions other than uppercase -> other\n      if (diff !== 0 && diff !== 3) wordStart = idx;\n      result[idx] = wordStart;\n      // uppercase -> other\n      if (diff === 3) wordStart = idx - 1;\n    }\n  }\n\n  // first character is always a word start\n  result[0] = 0;\n\n  return result;\n}\n\n\n// Partitions characters into uppercase, digit, dot, and other.\nfunction toCharClass(ch) {\n  const regexIsUppercase = /\\p{Lu}/u\n  const regexIsNumericCharacter = /\\p{N}/u\n  return regexIsUppercase.test(ch) ? 3 : regexIsNumericCharacter.test(ch) ? 2 : ch === '.' ? 1 : 0;\n}\n\n// Tests if `queryCps` matches any of `member`'s names.\n// If so, records information about the match in `member`.\n// Preconditions:\n// queryCps.length > 0\nfunction isMatch(queryCps, member) {\n  const queryLength = queryCps.length;\n  let nameIdx = 0;\n\n  for (const name of member.names) {\n    const nameCps = name.normalizedCps;\n    const nameLength = nameCps.length;\n    const wordStarts = name.wordStarts;\n    const maxStartIdx = nameLength - queryLength;\n\n    for (let startIdx = 0; startIdx <= maxStartIdx; startIdx += 1) {\n      const matchLength = computeMatchFrom(queryCps, nameCps, wordStarts, startIdx);\n      if (matchLength > 0) {\n        member.matchNameIdx = nameIdx;\n        member.matchStartIdx = startIdx;\n        // Treat exact match of last module name component as exact match (similarity == 1).\n        // For example, treat \"PodSpec\" as exact match for \"io.k8s.api.core.v1.PodSpec\".\n        // Because \"ps\" is considered an exact match for \"PodSpec\",\n        // it is also considered an exact match for \"io.k8s.api.core.v1.PodSpec\".\n        const isExactMatchOfLastModuleNameComponent =\n            startIdx > 0 && nameCps[startIdx - 1] === 46 /* '.' */ && matchLength === nameLength - startIdx;\n        member.similarity = isExactMatchOfLastModuleNameComponent ? 1 : matchLength / nameLength;\n        member.matchNameLength = nameLength;\n        return true;\n      }\n    }\n\n    nameIdx += 1;\n  }\n\n  return false;\n}\n\n// Tests if the given query matches the given name from `startIdx` on.\n// Returns the number of code points matched.\n// Word start matches get special treatment.\n// For example, `sb` is considered to match all code points of `StringBuilder`.\n// Preconditions:\n// queryCps.length > 0\n// nameCps.length > 0\n// wordStarts.length === nameCps.length\n// startIdx < nameCps.length\nfunction computeMatchFrom(queryCps, nameCps, wordStarts, startIdx) {\n  const queryLength = queryCps.length;\n  const nameLength = nameCps.length;\n  const beginsWithWordStart = wordStarts[startIdx] === startIdx;\n\n  let queryIdx = 0;\n  let matchLength = 0;\n  let queryCp = queryCps[0];\n\n  for (let nameIdx = startIdx; nameIdx < nameLength; nameIdx += 1) {\n    const nameCp = nameCps[nameIdx];\n\n    if (queryCp === nameCp) {\n      matchLength += 1;\n    } else { // check for word start match\n      if (nameIdx === startIdx || !beginsWithWordStart) return 0;\n\n      const newNameIdx = wordStarts[nameIdx];\n      if (newNameIdx === -1) return 0;\n\n      const newNameCp = nameCps[newNameIdx];\n      if (queryCp !== newNameCp) return 0;\n\n      matchLength += newNameIdx - nameIdx + 1;\n      nameIdx = newNameIdx;\n    }\n\n    queryIdx += 1;\n    if (queryIdx === queryLength) {\n      // in case of a word start match, increase matchLength by number of remaining chars of the last matched word\n      const nextIdx = nameIdx + 1;\n      if (beginsWithWordStart && nextIdx < nameLength) {\n        const nextStart = wordStarts[nextIdx];\n        if (nextStart === -1) {\n          matchLength += nameLength - nextIdx;\n        } else {\n          matchLength += nextStart - nextIdx;\n        }\n      }\n\n      return matchLength;\n    }\n\n    queryCp = queryCps[queryIdx];\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/search-index.js",
    "content": "searchData='[{\"name\":\"com.package1\",\"kind\":0,\"url\":\"com.package1/current/index.html\",\"deprecated\":true},{\"name\":\"com.package1.Module Containing Spaces\",\"kind\":1,\"url\":\"com.package1/current/Module Containing Spaces/index.html\"},{\"name\":\"com.package1.baseModule\",\"kind\":1,\"url\":\"com.package1/current/baseModule/index.html\"},{\"name\":\"com.package1.classAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classAnnotations/index.html\"},{\"name\":\"com.package1.classComments\",\"kind\":1,\"url\":\"com.package1/current/classComments/index.html\"},{\"name\":\"com.package1.classInheritance\",\"kind\":1,\"url\":\"com.package1/current/classInheritance/index.html\"},{\"name\":\"com.package1.classMethodComments\",\"kind\":1,\"url\":\"com.package1/current/classMethodComments/index.html\"},{\"name\":\"com.package1.classMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/classMethodModifiers/index.html\"},{\"name\":\"com.package1.classMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.classMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classMethodTypeReferences/index.html\"},{\"name\":\"com.package1.classPropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyComments\",\"kind\":1,\"url\":\"com.package1/current/classPropertyComments/index.html\"},{\"name\":\"com.package1.classPropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/classPropertyModifiers/index.html\"},{\"name\":\"com.package1.classPropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.classPropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/classPropertyTypeReferences/index.html\"},{\"name\":\"com.package1.classTypeConstraints\",\"kind\":1,\"url\":\"com.package1/current/classTypeConstraints/index.html\"},{\"name\":\"com.package1.docExampleSubject1\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject1/index.html\"},{\"name\":\"com.package1.docExampleSubject2\",\"kind\":1,\"url\":\"com.package1/current/docExampleSubject2/index.html\"},{\"name\":\"com.package1.docLinks\",\"kind\":1,\"url\":\"com.package1/current/docLinks/index.html\"},{\"name\":\"com.package1.methodAnnotations\",\"kind\":1,\"url\":\"com.package1/current/methodAnnotations/index.html\"},{\"name\":\"com.package1.moduleComments\",\"kind\":1,\"url\":\"com.package1/current/moduleComments/index.html\"},{\"name\":\"com.package1.moduleExtend\",\"kind\":1,\"url\":\"com.package1/current/moduleExtend/index.html\"},{\"name\":\"com.package1.moduleInfoAnnotation\",\"kind\":1,\"url\":\"com.package1/current/moduleInfoAnnotation/index.html\"},{\"name\":\"com.package1.moduleMethodCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodCommentInheritance/index.html\"},{\"name\":\"com.package1.moduleMethodComments\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodComments/index.html\"},{\"name\":\"com.package1.moduleMethodModifiers\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodModifiers/index.html\"},{\"name\":\"com.package1.moduleMethodTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeAnnotations/index.html\"},{\"name\":\"com.package1.moduleMethodTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/moduleMethodTypeReferences/index.html\"},{\"name\":\"com.package1.modulePropertyAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyCommentInheritance\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyCommentInheritance/index.html\"},{\"name\":\"com.package1.modulePropertyComments\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyComments/index.html\"},{\"name\":\"com.package1.modulePropertyModifiers\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyModifiers/index.html\"},{\"name\":\"com.package1.modulePropertyTypeAnnotations\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeAnnotations/index.html\"},{\"name\":\"com.package1.modulePropertyTypeReferences\",\"kind\":1,\"url\":\"com.package1/current/modulePropertyTypeReferences/index.html\"},{\"name\":\"com.package1.moduleTypes1\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes1/index.html\"},{\"name\":\"com.package1.moduleTypes2\",\"kind\":1,\"url\":\"com.package1/current/moduleTypes2/index.html\"},{\"name\":\"com.package1.nested.nested2.nestedModule\",\"kind\":1,\"url\":\"com.package1/current/nested/nested2/nestedModule/index.html\"},{\"name\":\"com.package1.ternalPackage\",\"kind\":1,\"url\":\"com.package1/current/ternalPackage/index.html\"},{\"name\":\"com.package1.shared\",\"kind\":1,\"url\":\"com.package1/current/shared/index.html\"},{\"name\":\"com.package1.typealiases\",\"kind\":1,\"url\":\"com.package1/current/typealiases/index.html\"},{\"name\":\"com.package1.typealiases2\",\"kind\":1,\"url\":\"com.package1/current/typealiases2/index.html\"},{\"name\":\"com.package1.typeAliasInheritance\",\"kind\":1,\"url\":\"com.package1/current/typeAliasInheritance/index.html\"},{\"name\":\"com.package1.unionTypes\",\"kind\":1,\"url\":\"com.package1/current/unionTypes/index.html\"},{\"name\":\"com.package1.unlistedClass\",\"kind\":1,\"url\":\"com.package1/current/unlistedClass/index.html\"},{\"name\":\"com.package1.unlistedMethod\",\"kind\":1,\"url\":\"com.package1/current/unlistedMethod/index.html\"},{\"name\":\"com.package1.unlistedProperty\",\"kind\":1,\"url\":\"com.package1/current/unlistedProperty/index.html\"},{\"name\":\"com.package2\",\"kind\":0,\"url\":\"com.package2/current/index.html\"},{\"name\":\"com.package2.Module3\",\"kind\":1,\"url\":\"com.package2/current/Module3/index.html\"},{\"name\":\"localhost:0/birds\",\"kind\":0,\"url\":\"localhost:0/birds/current/index.html\"},{\"name\":\"localhost:0/birds.catalog\",\"kind\":1,\"url\":\"localhost:0/birds/current/catalog/index.html\"},{\"name\":\"localhost:0/birds.allFruit\",\"kind\":1,\"url\":\"localhost:0/birds/current/allFruit/index.html\"},{\"name\":\"localhost:0/birds.Bird\",\"kind\":1,\"url\":\"localhost:0/birds/current/Bird/index.html\"},{\"name\":\"localhost:0/deprecated\",\"kind\":0,\"url\":\"localhost:0/deprecated/current/index.html\",\"deprecated\":true},{\"name\":\"localhost:0/deprecated.deprecated\",\"kind\":1,\"url\":\"localhost:0/deprecated/current/deprecated/index.html\"},{\"name\":\"localhost:0/fruit\",\"kind\":0,\"url\":\"localhost:0/fruit/current/index.html\"},{\"name\":\"localhost:0/fruit.Fruit\",\"kind\":1,\"url\":\"localhost:0/fruit/current/Fruit/index.html\"}]';\n"
  },
  {
    "path": "pkl-doc/src/test/files/DocMigratorTest/output/styles/pkldoc.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-Regular'),\n  url('../fonts/lato-v14-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Lato Bold'), local('Lato-Bold'),\n  url('../fonts/lato-v14-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Open Sans Regular'), local('OpenSans-Regular'),\n  url('../fonts/open-sans-v15-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Open Sans Italic'), local('OpenSans-Italic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Open Sans Bold'), local('OpenSans-Bold'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Open Sans';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),\n  url('../fonts/open-sans-v15-latin_latin-ext-700italic.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Source Code Pro'), local('SourceCodePro-Regular'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-regular.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Source Code Pro';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'),\n  url('../fonts/source-code-pro-v7-latin_latin-ext-700.woff2') format('woff2')\n}\n\n@font-face {\n  font-family: 'Material Icons';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Material Icons'),\n  local('MaterialIcons-Regular'),\n  url(../fonts/MaterialIcons-Regular.woff2) format('woff2');\n}\n\n.material-icons {\n  /*noinspection CssNoGenericFontName*/\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 24px;\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  line-height: 1;\n  text-transform: none;\n  letter-spacing: normal;\n  word-wrap: normal;\n  white-space: nowrap;\n  direction: ltr;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  -moz-osx-font-smoothing: grayscale;\n  font-feature-settings: 'liga';\n}\n\ninput[type=search] {\n  -webkit-appearance: textfield;\n}\n\ninput[type=search]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\ninput::-moz-placeholder {\n  opacity: 1;\n}\n\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n  border: 0;\n  font-family: inherit;\n  font-size: 100%;\n  font-style: inherit;\n  font-weight: inherit;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  vertical-align: baseline;\n}\n\nbody {\n  margin: 0;\n  font-family: Lato, Arial, sans-serif;\n  background-color: #f0f3f6;\n  scroll-behavior: smooth;\n}\n\na, a:visited, a:hover, a:active {\n  color: inherit;\n}\n\na:hover {\n  text-decoration: none;\n  transition: 0s;\n}\n\ncode, .member-modifiers, .member-signature, .doc-comment pre, #search-results li.result, .result-name, .heading-name, .aka-name {\n  font-family: \"Source Code Pro\", monospace;\n  letter-spacing: -0.03em;\n}\n\nheader {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw; /* vw to make sure that positioning is the same whether or not vertical scrollbar is displayed */\n  height: 32px;\n  z-index: 1;\n  background-color: #364550;\n  padding: 7px 0 7px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n}\n\n#doc-title {\n  position: absolute;\n  margin-top: 8px;\n  margin-left: 15px;\n}\n\n#doc-title a {\n  color: #fff;\n  text-decoration: none;\n}\n\n#search {\n  position: relative;\n  width: 50vw;\n  margin: 0 auto;\n}\n\n#search-icon {\n  position: absolute;\n  left: 0;\n  top: 2px;\n  padding: 4px;\n  font-size: 21px;\n  color: #a5a9a9;\n}\n\n#search-input {\n  margin-top: 2px;\n  width: 100%;\n  height: 28px;\n  text-indent: 28px;\n  font-size: 0.85em;\n  background-color: rgba(255, 255, 255, 0.2);\n  border: none;\n  border-radius: 3px;\n  color: #fff;\n}\n\n#search-input:focus {\n  background-color: #6D7880;\n  outline: none;\n}\n\n#search-input::placeholder {\n  text-align: center;\n  color: #A5A9A9;\n}\n\n#search-input:focus::placeholder {\n  color: transparent;\n}\n\n#search-results {\n  position: fixed;\n  box-sizing: border-box;\n  top: 38px;\n  left: 25vw;\n  right: 25vw;\n  width: 50vw;\n  max-height: 80%;\n  color: #103a51;\n  background: white;\n  border: solid 1px #6D7880;\n  border-radius: 3px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.18), 0 4px 8px rgba(0, 0, 0, 0.28);\n  white-space: nowrap;\n\n  overflow: auto; /* in safari, this slows down painting, blocking the ui */\n  /*noinspection CssUnknownProperty*/\n  overscroll-behavior: contain;\n  -webkit-overflow-scrolling: touch;\n}\n\n#search-results a {\n  text-decoration: none;\n}\n\n#search-results a:hover {\n  text-decoration: underline;\n}\n\n#search-results ul {\n  list-style: none;\n  font-size: 0.9em;\n}\n\n#search-results li {\n  padding: 0.2ch 3ch;\n  height: 17px; /* used same height regardless of which fonts are used in content */\n}\n\n#search-results li.heading {\n  background-color: #f0f3f6;\n  padding: 0.4ch 1ch;\n}\n\n#search-results li.result {\n  font-size: 0.9em;\n}\n\n#search-results .keyword {\n  color: #000082;\n}\n\n#search-results .highlight {\n  font-weight: bold;\n}\n\n#search-results .context {\n  color: gray;\n}\n\n#search-results .selected, #search-results .selected .keyword, #search-results .selected .aka, #search-results .selected .context {\n  background: darkblue;\n  color: white;\n}\n\n#search-results .deprecated {\n  text-decoration: line-through;\n}\n\n/* make sure that line-through of highlighted region of selected search result has the right color */\n#search-results .deprecated.selected .highlight {\n  text-decoration: line-through;\n}\n\nmain {\n  width: 70%;\n  margin: 60px auto 20px;\n}\n\n.declaration-parent-link {\n  margin: 0 0 1rem;\n}\n\n#declaration-title {\n  font-size: 2em;\n  font-weight: bold;\n  color: #103a51;\n  margin: 0.5rem 0;\n}\n\n#declaration-version {\n  color: #A5A9A9;\n  font-size: 0.9em;\n  vertical-align: bottom;\n  padding-left: 0.25em;\n}\n\n.member-group-links {\n  margin: 0.75em 0 1em 0;\n}\n\n.member-group-links li {\n  display: inline-block;\n  margin-right: 1em;\n}\n\n.member-info {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  line-height: 1.5;\n  margin-top: 0.5em;\n  font-size: 0.9em;\n}\n\n.member-info dt {\n  grid-column: 1;\n  text-align: right;\n}\n\n.member-info dd {\n  grid-column: 2;\n  margin-left: 0.5em;\n}\n\n.copy-uri-button {\n  cursor: pointer;\n  font-size: inherit;\n  margin-left: 0.5em;\n}\n\n.member-group {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.member-group-title {\n  margin: 1rem;\n  font-weight: bold;\n  color: #103a51;\n}\n\n.toggle-inherited-members {\n  font-size: 0.9em;\n  font-weight: normal;\n  margin-left: 0.5em;\n}\n\n.button-link {\n  text-decoration: underline;\n}\n\n.button-link:hover, .button-link:active {\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.member-group ul {\n  list-style: none;\n}\n\n.member-group li {\n  /* for absolutely positioned anchors */\n  position: relative;\n}\n\n.anchor,\n.anchor-param1,\n.anchor-param2,\n.anchor-param3,\n.anchor-param4,\n.anchor-param5,\n.anchor-param6,\n.anchor-param7,\n.anchor-param8,\n.anchor-param9 {\n  position: absolute;\n  top: -60px;\n  left: 0;\n}\n\n.anchor:target ~ .member,\n.anchor-param1:target ~ .member,\n.anchor-param2:target ~ .member,\n.anchor-param3:target ~ .member,\n.anchor-param4:target ~ .member,\n.anchor-param5:target ~ .member,\n.anchor-param6:target ~ .member,\n.anchor-param7:target ~ .member,\n.anchor-param8:target ~ .member,\n.anchor-param9:target ~ .member {\n  border-left: 3px solid #222832;\n}\n\n.anchor:target ~ .member .name-decl,\n.anchor-param1:target ~ .member .param1,\n.anchor-param2:target ~ .member .param2,\n.anchor-param3:target ~ .member .param3,\n.anchor-param4:target ~ .member .param4,\n.anchor-param5:target ~ .member .param5,\n.anchor-param6:target ~ .member .param6,\n.anchor-param7:target ~ .member .param7,\n.anchor-param8:target ~ .member .param8,\n.anchor-param9:target ~ .member .param9 {\n  font-weight: bold;\n}\n\n.member {\n  border-left: 3px solid transparent;\n  margin: 0 auto 0.5rem;\n  background-color: #fff;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n  font-size: 0.9em;\n  padding: 10px;\n  color: #222832;\n}\n\n.member:hover {\n  background-color: #f2f2f2;\n}\n\n.member-left {\n  width: 25%;\n  display: inline;\n  float: left;\n  padding-right: 6px;\n  min-height: 1px;\n  text-align: right;\n}\n\n.member-modifiers {\n  color: #000082;\n}\n\n.member-main {\n  display: block;\n  overflow: hidden;\n}\n\n.member-deprecated {\n  text-decoration: line-through;\n}\n\n.member-selflink {\n  visibility: hidden;\n  display: inline;\n  float: left;\n  padding-right: 20px;\n  color: #222832;\n  text-decoration: none;\n}\n\n.member-source-link {\n  visibility: hidden;\n  color: #fff;\n  background-color: #868e96;\n  display: inline-block;\n  margin-left: 1em;\n  padding: .25em .4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  vertical-align: bottom;\n  border-radius: .25rem\n}\n\n.member-source-link:visited, .member-source-link:hover, .member-source-link:active {\n  color: #fff;\n}\n\n.member:hover .member-source-link, .member:hover .member-selflink {\n  visibility: visible;\n}\n\n.member.inherited, .member.hidden-member {\n  opacity: 0.75;\n}\n\n.member.inherited .context {\n  color: gray;\n}\n\n.member.with-page-link, .member.with-expandable-docs {\n  cursor: pointer;\n}\n\n.member .expandable-docs-icon {\n  float: right;\n}\n\n/*\nDon't style a.name-decl as link\nbecause the entire .member.with-page-link is effectively a link (via JS).\n*/\n.member.with-page-link a.name-decl {\n  text-decoration: none;\n}\n\n.expandable {\n  transform: scaleY(1);\n  transition: transform 0.25s;\n}\n\n.expandable.collapsed {\n  transform: scaleY(0);\n}\n\n.expandable.hidden {\n  display: none;\n}\n\n#_declaration .expandable {\n  transform: none;\n  transition: none;\n}\n\n#_declaration .expandable.collapsed {\n  mask: linear-gradient(rgb(0 0 0), transparent) content-box;\n  height: 100px;\n}\n\n#_declaration .expandable.hidden {\n  display: block;\n}\n\n/* show an otherwise hidden inherited member if it's a link target */\n.anchor:target + .expandable.collapsed.hidden {\n  display: inherit;\n  transform: scaleY(1);\n}\n\n.doc-comment {\n  color: #103a51;\n  margin-top: 0.5rem;\n  font-family: \"Open Sans\", sans-serif;\n  font-size: 0.9em;\n}\n\n.doc-comment p {\n  margin: 0.7em 0;\n}\n\n.doc-comment p:first-child {\n  margin-top: 0;\n}\n\n.doc-comment p:last-child {\n  margin-bottom: 0;\n}\n\n.doc-comment h1,\n.doc-comment h2,\n.doc-comment h3,\n.doc-comment h4,\n.doc-comment h5,\n.doc-comment h6 {\n  margin-bottom: 0.7em;\n  margin-top: 1.4em;\n  display: block;\n  text-align: left;\n  font-weight: bold;\n}\n\n.doc-comment pre {\n  padding: 0.5em;\n  border: 0 solid #ddd;\n  background-color: #364550;\n  color: #ddd;\n  margin: 5px 0;\n  display: block;\n  border-radius: 0.2em;\n  overflow-x: auto;\n}\n\n.doc-comment ul {\n  display: block;\n  list-style: circle;\n  padding-left: 20px;\n}\n\n.doc-comment ol {\n  display: block;\n  padding-left:20px;\n}\n\n.doc-comment ol.decimal {\n  list-style: decimal;\n}\n\n.doc-comment ol.lowerAlpha {\n  list-style: lower-alpha;\n}\n\n.doc-comment ol.upperAlpha {\n  list-style: upper-alpha;\n}\n\n.doc-comment ol.lowerRoman {\n  list-style: lower-roman;\n}\n\n.doc-comment ol.upperRoman {\n  list-style: upper-roman;\n}\n\n.doc-comment li {\n  display: list-item;\n}\n\n.doc-comment code {\n  font-weight: normal;\n}\n\n.doc-comment em, .doc-comment i {\n  font-style: italic;\n}\n\n.doc-comment strong, .doc-comment b {\n  font-weight: bold;\n}\n\n.runtime-data.hidden {\n  display: none;\n}\n\n.runtime-data .current-version {\n  font-weight: bold;\n}\n\n/*\nStyling for Markdown tables in doc comments.\nFrom: https://gist.github.com/andyferra/2554919\n*/\n\ntable {\n  padding: 0;\n}\n\ntable tr {\n  border-top: 1px solid #cccccc;\n  background-color: white;\n  margin: 0;\n  padding: 0;\n}\n\ntable tr:nth-child(2n) {\n  background-color: #f8f8f8;\n}\n\ntable tr th {\n  font-weight: bold;\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr td {\n  border: 1px solid #cccccc;\n  text-align: left;\n  margin: 0;\n  padding: 6px 13px;\n}\n\ntable tr th :first-child, table tr td :first-child {\n  margin-top: 0;\n}\n\ntable tr th :last-child, table tr td :last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/CliDocGeneratorTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:OptIn(ExperimentalPathApi::class)\n\npackage org.pkl.doc\n\nimport com.google.common.jimfs.Configuration\nimport com.google.common.jimfs.Jimfs\nimport java.io.OutputStream\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.*\nimport org.assertj.core.api.AbstractPathAssert\nimport org.assertj.core.api.Assertions\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.condition.DisabledOnOs\nimport org.junit.jupiter.api.condition.OS\nimport org.junit.jupiter.api.io.TempDir\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.cli.CliException\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.walk\nimport org.pkl.core.Version\nimport org.pkl.doc.DocGenerator.Companion.determineCurrentPackages\n\nclass CliDocGeneratorTest {\n  companion object {\n    private val tempFileSystem by lazy { Jimfs.newFileSystem(Configuration.unix()) }\n\n    private val tmpOutputDir: Path by lazy {\n      tempFileSystem.getPath(\"/work/output\").apply { createDirectories() }\n    }\n\n    private val helper = DocGeneratorTestHelper()\n\n    private fun runDocGenerator(\n      outputDir: Path,\n      cacheDir: Path?,\n      sourceModules: List<URI>,\n      noSymlinks: Boolean = false,\n    ) {\n      CliDocGenerator(\n          CliDocGeneratorOptions(\n            CliBaseOptions(\n              sourceModules = sourceModules + helper.docsiteModule,\n              moduleCacheDir = cacheDir,\n            ),\n            outputDir = outputDir,\n            isTestMode = true,\n            noSymlinks = noSymlinks,\n          ),\n          OutputStream.nullOutputStream(),\n        )\n        .run()\n    }\n\n    // Run the doc generator three times; second time adds new versions for the `birds` package\n    @JvmStatic private fun generateDocs(): List<String> = helper.generateDocs()\n  }\n\n  @Test\n  fun `cannot have multiple docsite descriptors`() {\n    val descriptor1 =\n      tempFileSystem.getPath(\"/work/dir1/docsite-info.pkl\").apply {\n        createParentDirectories()\n        createFile()\n      }\n\n    val descriptor2 =\n      tempFileSystem.getPath(\"/work/dir2/docsite-info.pkl\").apply {\n        createParentDirectories()\n        createFile()\n      }\n\n    val generator =\n      CliDocGenerator(\n        CliDocGeneratorOptions(\n          CliBaseOptions(sourceModules = listOf(descriptor1.toUri(), descriptor2.toUri())),\n          outputDir = tmpOutputDir,\n          isTestMode = true,\n        ),\n        OutputStream.nullOutputStream(),\n      )\n\n    val e = assertThrows<CliException> { generator.run() }\n    assertThat(e).hasMessageContaining(\"multiple\", \"docsite-info.pkl\")\n  }\n\n  @Test\n  fun `must have at least one package descriptor`() {\n    val module1 =\n      tempFileSystem.getPath(\"/work/module1.pkl\").apply {\n        createParentDirectories()\n        createFile()\n      }\n    val generator =\n      CliDocGenerator(\n        CliDocGeneratorOptions(\n          CliBaseOptions(sourceModules = listOf(module1.toUri())),\n          outputDir = tmpOutputDir,\n          isTestMode = true,\n        ),\n        OutputStream.nullOutputStream(),\n      )\n\n    val e = assertThrows<CliException> { generator.run() }\n    assertThat(e).hasMessageContaining(\"at least one\", \"doc-package-info.pkl\")\n  }\n\n  @Test\n  fun `must have at least one module to generate documentation for`() {\n    val descriptor1 =\n      tempFileSystem.getPath(\"/work/package-info.pkl\").apply {\n        createParentDirectories()\n        createFile()\n      }\n    val generator =\n      CliDocGenerator(\n        CliDocGeneratorOptions(\n          CliBaseOptions(sourceModules = listOf(descriptor1.toUri())),\n          outputDir = tmpOutputDir,\n          isTestMode = true,\n        ),\n        OutputStream.nullOutputStream(),\n      )\n\n    val e = assertThrows<CliException> { generator.run() }\n    assertThat(e).hasMessageContaining(\"at least one\", \"module\")\n  }\n\n  // to re-generate output, delete directory pkl-doc/src/test/files/DocGeneratorTest/output and run\n  // again\n  @ParameterizedTest\n  @MethodSource(\"generateDocs\")\n  fun test(relativeFilePath: String) {\n    DocTestUtils.testExpectedFile(\n      helper.expectedOutputDir,\n      helper.baseActualOutputDir,\n      relativeFilePath,\n    )\n  }\n\n  @Test\n  fun `creates a symlink called current by default`(@TempDir tempDir: Path) {\n    PackageServer.populateCacheDir(tempDir)\n    runDocGenerator(\n      helper.actualOutputDir,\n      tempDir,\n      helper.package1InputModules + helper.package1PackageModule,\n    )\n\n    val expectedSymlink = helper.actualOutputDir.resolve(\"com.package1/current\")\n    val expectedDestination = helper.actualOutputDir.resolve(\"com.package1/1.2.3\")\n\n    assertThat(expectedSymlink).isSymlinkPointingTo(expectedDestination)\n  }\n\n  @Test\n  fun `does not overwrite the current version if generating an older version`(\n    @TempDir tempDir: Path\n  ) {\n    PackageServer.populateCacheDir(tempDir)\n    val outputDir = tempFileSystem.getPath(\"/doesNotOverwrite\")\n    runDocGenerator(outputDir, tempDir, listOf(URI(\"package://localhost:0/birds@0.6.0\")))\n    runDocGenerator(outputDir, tempDir, listOf(URI(\"package://localhost:0/birds@0.5.0\")))\n\n    val expectedSymlink = outputDir.resolve(\"localhost(3a)0/birds/current\")\n    val expectedDestination = outputDir.resolve(\"localhost(3a)0/birds/0.6.0\")\n\n    assertThat(expectedSymlink).isSymlinkPointingTo(expectedDestination)\n  }\n\n  private fun AbstractPathAssert<*>.isSymlinkPointingTo(\n    expectedDestination: Path\n  ): AbstractPathAssert<*> {\n    if (!actual().isSymbolicLink()) {\n      Assertions.fail<Unit>(\"Expected ${actual()} to be a symlink, but was not\")\n    }\n    if (!Files.isSameFile(actual(), expectedDestination)) {\n      Assertions.fail<Unit>(\n        \"Expected symbolic link ${actual()} should point to $expectedDestination, but points to ${actual().toRealPath()}\"\n      )\n    }\n    return this\n  }\n\n  @Test\n  fun `creates a copy of the latest output called current when symlinks are disabled`(\n    @TempDir tempDir: Path\n  ) {\n    PackageServer.populateCacheDir(tempDir)\n    runDocGenerator(\n      helper.actualOutputDir,\n      tempDir,\n      noSymlinks = true,\n      sourceModules = helper.package1InputModules + helper.package1PackageModule,\n    )\n\n    val currentDirectory = helper.actualOutputDir.resolve(\"com.package1/current\")\n    val sourceDirectory = helper.actualOutputDir.resolve(\"com.package1/1.2.3\")\n\n    assertThat(currentDirectory).isDirectory()\n    assertThat(currentDirectory.isSymbolicLink()).isFalse()\n\n    val expectedFiles = sourceDirectory.walk().map(sourceDirectory::relativize).toList()\n    val actualFiles = currentDirectory.walk().map(currentDirectory::relativize).toList()\n\n    assertThat(actualFiles).hasSameElementsAs(expectedFiles)\n  }\n\n  @Test\n  fun `current() excludes prerelease versions`() {\n    fun createPackageData(version: String) =\n      PackageData(\n        DocPackage(\n          docPackageInfo =\n            DocPackageInfo(\n              name = \"com.package\",\n              version = version,\n              uri = null,\n              importUri = \"foo.pkl\",\n              authors = listOf(\"me\"),\n              sourceCode = URI.create(\"foo.pkl\"),\n              issueTracker = URI.create(\"https://github.com/apple/pkl/issues\"),\n              overview = \"my overview\",\n              sourceCodeUrlScheme = \"https://example.com/blob/$version%{path}#L%{line}-%{endLine}\",\n            ),\n          modules = emptyList(),\n        )\n      )\n\n    val packages: List<PackageData> =\n      listOf(createPackageData(\"1.2.3\"), createPackageData(\"1.3.0-SNAPSHOT\"))\n    val comparator =\n      Comparator<String> { v1, v2 -> Version.parse(v1).compareTo(Version.parse(v2)) }.reversed()\n\n    val newCurrentPackages = determineCurrentPackages(packages, comparator)\n\n    assertThat(newCurrentPackages.map { it.ref.version }).isEqualTo(listOf(\"1.2.3\"))\n  }\n\n  @Test\n  fun `running generator on legacy docsite throws an error`(@TempDir tempDir: Path) {\n    val outputDir =\n      tempFileSystem.getPath(\"/work/runningGeneratorOnLegacyDocsite\").apply { createDirectories() }\n    val legacySiteDir = helper.projectDir.resolve(\"src/test/files/DocMigratorTest/input/version-1\")\n    legacySiteDir.copyToRecursively(outputDir, followLinks = true)\n    assertThatCode {\n        runDocGenerator(\n          outputDir,\n          tempDir,\n          helper.package1InputModules + helper.package1PackageModule,\n        )\n      }\n      .hasMessageContaining(\"pkldoc website model is too old\")\n  }\n\n  @Test\n  @DisabledOnOs(\n    OS.WINDOWS,\n    disabledReason = \"Tests with symlinks does not work correctly on Windows\",\n  )\n  fun `running generator using an existing package results in no changes`(@TempDir tempDir: Path) {\n    val outputDir = tempDir.resolve(\"src\").apply { createDirectories() }\n    val cacheDir = tempDir.resolve(\"cache\").apply { createDirectories() }\n    val run2OutputDir = helper.projectDir.resolve(\"src/test/files/DocGeneratorTest/output/run-2/\")\n    run2OutputDir.copyToRecursively(outputDir, followLinks = false)\n    PackageServer.populateCacheDir(cacheDir)\n    runDocGenerator(\n      outputDir,\n      cacheDir,\n      listOf(URI(\"package://localhost:0/birds@0.5.0\")),\n      noSymlinks = true,\n    )\n    DocTestUtils.assertDirectoriesEqual(run2OutputDir, outputDir)\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/CliMainTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport com.github.ajalt.clikt.core.parse\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.commons.cli.CliException\n\nclass CliMainTest {\n  @Test\n  fun `CLI run test`() {\n    val e =\n      assertThrows<CliException> { DocCommand().parse(arrayOf(\"foo\", \"--output-dir\", \"/tmp\")) }\n    assertThat(e)\n      .hasMessageContaining(\"must contain at least one module named `doc-package-info.pkl`\")\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/DocGeneratorTest.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.condition.EnabledIf\n\nclass DocGeneratorTest {\n  companion object {\n    @JvmStatic\n    fun isJdk21OrLater(): Boolean {\n      return Runtime.version().feature() >= 21\n    }\n  }\n\n  @Test\n  @EnabledIf(\"isJdk21OrLater\")\n  fun `uses virtual thread executor on JDK 21`() {\n    // On older JDKs, we get a ThreadPoolExecutor.\n    // not sure if there's a better assertion to make here.\n    assertThat(DocGenerator.executor.javaClass.canonicalName)\n      .isEqualTo(\"java.util.concurrent.ThreadPerTaskExecutor\")\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/DocGeneratorTestHelper.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.ExperimentalPathApi\nimport kotlin.io.path.copyToRecursively\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.exists\nimport org.assertj.core.api.Assertions\nimport org.junit.jupiter.api.fail\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.test.listFilesRecursively\nimport org.pkl.core.util.IoUtils\n\n@OptIn(ExperimentalPathApi::class)\nclass DocGeneratorTestHelper {\n  internal val tempDir by lazy { Files.createTempDirectory(\"ExecutableCliDocGeneratorTest\") }\n\n  internal val projectDir = FileTestUtils.rootProjectDir.resolve(\"pkl-doc\")\n\n  internal val inputDir: Path by lazy {\n    projectDir.resolve(\"src/test/files/DocGeneratorTest/input\").apply { assert(exists()) }\n  }\n\n  internal val docsiteModule: URI by lazy {\n    inputDir.resolve(\"docsite-info.pkl\").apply { assert(exists()) }.toUri()\n  }\n\n  internal val package1PackageModule: URI by lazy {\n    inputDir.resolve(\"com.package1/doc-package-info.pkl\").apply { assert(exists()) }.toUri()\n  }\n\n  internal val package2PackageModule: URI by lazy {\n    inputDir.resolve(\"com.package2/doc-package-info.pkl\").apply { assert(exists()) }.toUri()\n  }\n\n  internal val package1InputModules: List<URI> by lazy {\n    inputDir\n      .resolve(\"com.package1\")\n      .listFilesRecursively()\n      .filter { it.fileName.toString() != \"doc-package-info.pkl\" }\n      .map { it.toUri() }\n  }\n\n  internal val package2InputModules: List<URI> by lazy {\n    inputDir\n      .resolve(\"com.package2\")\n      .listFilesRecursively()\n      .filter { it.fileName.toString() != \"doc-package-info.pkl\" }\n      .map { it.toUri() }\n  }\n\n  internal val expectedOutputDir: Path by lazy {\n    projectDir.resolve(\"src/test/files/DocGeneratorTest/output\").createDirectories()\n  }\n\n  internal val expectedOutputFiles: List<Path> by lazy { expectedOutputDir.listFilesRecursively() }\n\n  val baseActualOutputDir: Path by lazy {\n    tempDir.resolve(\"work/DocGeneratorTest\").createDirectories()\n  }\n\n  val actualOutputDir: Path by lazy { baseActualOutputDir.resolve(\"run-1\") }\n  val actualOutputDir2: Path by lazy { baseActualOutputDir.resolve(\"run-2\") }\n\n  internal val actualOutputFiles: List<Path> by lazy { baseActualOutputDir.listFilesRecursively() }\n\n  internal val cacheDir: Path by lazy { tempDir.resolve(\"cache\") }\n\n  internal val expectedRelativeOutputFiles: List<String> by lazy {\n    expectedOutputFiles.map { path ->\n      IoUtils.toNormalizedPathString(expectedOutputDir.relativize(path)).let { str ->\n        // Git will by default clone symlinks as shortcuts on Windows, and shortcuts have a\n        // `.lnk` extension.\n        if (IoUtils.isWindows() && str.endsWith(\".lnk\")) str.dropLast(4) else str\n      }\n    }\n  }\n\n  internal val actualRelativeOutputFiles: List<String> by lazy {\n    actualOutputFiles.map { IoUtils.toNormalizedPathString(baseActualOutputDir.relativize(it)) }\n  }\n\n  fun runPklDocCli(executable: Path, options: CliDocGeneratorOptions) {\n    val command = buildList {\n      add(executable.toString())\n      add(\"--output-dir\")\n      add(options.normalizedOutputDir.toString())\n      add(\"--cache-dir\")\n      add(options.base.normalizedModuleCacheDir.toString())\n      if (options.noSymlinks) {\n        add(\"--no-symlinks\")\n      }\n      if (options.isTestMode) {\n        add(\"--test-mode\")\n      }\n      addAll(options.base.normalizedSourceModules.map { it.toString() })\n    }\n    val process =\n      with(ProcessBuilder(command)) {\n        redirectErrorStream(true)\n        start()\n      }\n    try {\n      val out = process.inputStream.reader().readText()\n      val exitCode = process.waitFor()\n\n      if (exitCode != 0) {\n        fail(\n          \"\"\"\n            Process exited with $exitCode.\n\n            Output:\n          \"\"\"\n            .trimIndent() + out\n        )\n      }\n    } finally {\n      process.destroy()\n    }\n  }\n\n  // Run the docsite generator three times; second time adds more packages for the `birds` package.\n  private fun generateDocsWith(doGenerate: (CliDocGeneratorOptions) -> Unit): List<String> {\n    PackageServer.populateCacheDir(cacheDir)\n\n    val options =\n      CliDocGeneratorOptions(\n        CliBaseOptions(\n          sourceModules =\n            listOf(\n              package1PackageModule,\n              package2PackageModule,\n              URI(\"package://localhost:0/birds@0.5.0\"),\n              URI(\"package://localhost:0/fruit@1.1.0\"),\n              URI(\"package://localhost:0/unlisted@1.0.0\"),\n              URI(\"package://localhost:0/deprecated@1.0.0\"),\n              docsiteModule,\n            ) + package1InputModules + package2InputModules,\n          moduleCacheDir = cacheDir,\n        ),\n        outputDir = actualOutputDir,\n        isTestMode = true,\n        noSymlinks = false,\n      )\n    doGenerate(options)\n\n    // simulate running the doc generator again with new packages.\n    actualOutputDir.copyToRecursively(actualOutputDir2, followLinks = false)\n\n    val options2 =\n      CliDocGeneratorOptions(\n        CliBaseOptions(\n          sourceModules =\n            listOf(\n              URI(\"package://localhost:0/birds@0.6.0\"),\n              URI(\"package://localhost:0/birds@0.7.0\"),\n              docsiteModule,\n            ),\n          moduleCacheDir = cacheDir,\n        ),\n        outputDir = actualOutputDir2,\n        isTestMode = true,\n        noSymlinks = false,\n      )\n    doGenerate(options2)\n\n    val missingFiles = expectedRelativeOutputFiles - actualRelativeOutputFiles\n    if (missingFiles.isNotEmpty()) {\n      val error = buildString {\n        appendLine(\"The following expected files were not actually generated:\")\n        missingFiles.forEach { appendLine(it) }\n      }\n      Assertions.fail<Unit>(error)\n    }\n\n    return actualRelativeOutputFiles\n  }\n\n  fun generateDocsWithCli(executable: Path): List<String> {\n    return generateDocsWith { runPklDocCli(executable, it) }\n  }\n\n  fun generateDocs(): List<String> {\n    return generateDocsWith { CliDocGenerator(it).run() }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/DocMigratorTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n@file:OptIn(ExperimentalPathApi::class)\n\npackage org.pkl.doc\n\nimport java.io.OutputStream\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.*\nimport org.assertj.core.api.Assertions\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.pkl.commons.copyRecursively\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.test.listFilesRecursively\nimport org.pkl.core.Version\nimport org.pkl.core.util.IoUtils\n\nclass DocMigratorTest {\n  companion object {\n    private val projectDir = FileTestUtils.rootProjectDir.resolve(\"pkl-doc\")\n\n    private val inputDir: Path by lazy {\n      projectDir.resolve(\"src/test/files/DocMigratorTest/input/version-1\").apply {\n        assert(exists())\n      }\n    }\n\n    private val expectedOutputDir: Path by lazy {\n      projectDir.resolve(\"src/test/files/DocMigratorTest/output/\").also { it.createDirectories() }\n    }\n\n    private val actualOutputDir: Path by lazy { Files.createTempDirectory(\"docMigratorTest\") }\n\n    private val actualOutputFiles: List<Path> by lazy { actualOutputDir.listFilesRecursively() }\n\n    private val actualRelativeOutputFiles: List<String> by lazy {\n      actualOutputFiles.map { IoUtils.toNormalizedPathString(actualOutputDir.relativize(it)) }\n    }\n\n    private val expectedOutputFiles: List<Path> by lazy { expectedOutputDir.listFilesRecursively() }\n\n    private val expectedRelativeOutputFiles: List<String> by lazy {\n      expectedOutputFiles.map { path ->\n        IoUtils.toNormalizedPathString(expectedOutputDir.relativize(path)).let { str ->\n          // Git will by default clone symlinks as shortcuts on Windows, and shortcuts have a\n          // `.lnk` extension.\n          if (IoUtils.isWindows() && str.endsWith(\".lnk\")) str.dropLast(4) else str\n        }\n      }\n    }\n\n    @JvmStatic\n    private fun migrateDocs(): List<String> {\n      val cacheDir = Files.createTempDirectory(\"cli-doc-generator-test-cache\")\n      PackageServer.populateCacheDir(cacheDir)\n      inputDir.copyRecursively(actualOutputDir)\n      val migrator =\n        DocMigrator(actualOutputDir, OutputStream.nullOutputStream()) { v1, v2 ->\n          Version.parse(v1).compareTo(Version.parse(v2))\n        }\n      migrator.run()\n      val missingFiles = expectedRelativeOutputFiles - actualRelativeOutputFiles.toSet()\n      if (missingFiles.isNotEmpty()) {\n        Assertions.fail<Unit>(\n          \"The following expected files were not actually generated:\\n\" +\n            missingFiles.joinToString(\"\\n\")\n        )\n      }\n\n      return actualRelativeOutputFiles\n    }\n  }\n\n  @Test\n  fun parseLegacyRuntimeData(@TempDir tempDir: Path) {\n    val file =\n      tempDir.resolve(\"index.js\").also { f ->\n        f.writeText(\n          \"\"\"\n        runtimeData.links('known-versions','[{\"text\":\"1.2.3\",\"classes\":\"current-version\"}]');\n        runtimeData.links('known-usages','[{\"text\":\"Foo\",\"href\":\"../moduleTypes2/Foo.html\"},{\"text\":\"moduleTypes2\",\"href\":\"../moduleTypes2/index.html\"}]');\n        runtimeData.links('known-subtypes','[{\"text\":\"Foo\",\"href\":\"../moduleTypes2/Foo.html\"}]');\n      \"\"\"\n            .trimIndent()\n        )\n      }\n    val data = DocMigrator.parseLegacyRuntimeData(file, \"../1.2.3/index.html\")\n    assertThat(data)\n      .isEqualTo(\n        RuntimeData(\n          knownVersions = setOf(RuntimeDataLink(text = \"1.2.3\", href = \"../1.2.3/index.html\")),\n          knownUsages =\n            setOf(\n              RuntimeDataLink(text = \"Foo\", href = \"../moduleTypes2/Foo.html\"),\n              RuntimeDataLink(text = \"moduleTypes2\", href = \"../moduleTypes2/index.html\"),\n            ),\n          knownSubtypes = setOf(RuntimeDataLink(text = \"Foo\", href = \"../moduleTypes2/Foo.html\")),\n        )\n      )\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"migrateDocs\")\n  fun test(relativeFilePath: String) {\n    DocTestUtils.testExpectedFile(expectedOutputDir, actualOutputDir, relativeFilePath)\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/DocScopeTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.net.URI\nimport java.nio.file.Path\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.pkl.commons.toPath\nimport org.pkl.commons.toUri\nimport org.pkl.core.Evaluator\nimport org.pkl.core.ModuleSchema\nimport org.pkl.core.ModuleSource.text\nimport org.pkl.core.ModuleSource.uri\nimport org.pkl.core.PClass\nimport org.pkl.core.TypeAlias\n\nclass DocScopeTest {\n  companion object {\n    private val evaluator = Evaluator.preconfigured()\n\n    private val docPackageInfo =\n      DocPackageInfo(\n        \"mypackage\",\n        \"mypackage.\",\n        null,\n        \"1.2.3\",\n        \"publisher\",\n        listOf(\"https://pkl-lang.org/\"),\n        \"sourceCode\".toUri(),\n        \"https://example.com/mypackage/blob/1.2.3%{path}#L%{line}-L%{endLine}\",\n        \"issueTracker\".toUri(),\n        overview = \"overview docs\",\n      )\n\n    private val module: ModuleSchema by lazy {\n      evaluator.evaluateSchema(\n        text(\n          \"\"\"\n          module mypackage.mymodule\n\n          age: Int\n          function sing(song) = \"tra-la-la\"\n\n          class Person {\n            name: String\n            function call(number) = \"calling\"\n          }\n\n          typealias Email = String\n          \"\"\"\n            .trimIndent()\n        )\n      )\n    }\n\n    private val moduleProperty: PClass.Property by lazy { module.moduleClass.properties[\"age\"]!! }\n\n    private val moduleMethod: PClass.Method by lazy { module.moduleClass.methods[\"sing\"]!! }\n\n    private val clazz: PClass by lazy { module.classes[\"Person\"]!! }\n\n    private val typeAlias: TypeAlias by lazy { module.typeAliases[\"Email\"]!! }\n\n    private val classProperty: PClass.Property by lazy { clazz.properties[\"name\"]!! }\n\n    private val classMethod: PClass.Method by lazy { clazz.methods[\"call\"]!! }\n\n    private val docPackage = DocPackage(docPackageInfo, mutableListOf(module))\n\n    private val siteScope: SiteScope by lazy {\n      SiteScope(\n        listOf(docPackage),\n        mapOf(),\n        { evaluator.evaluateSchema(uri(it)) },\n        \"/output/dir\".toPath(),\n      )\n    }\n\n    private val packageScope: PackageScope by lazy {\n      siteScope.getPackage(docPackage.docPackageInfo)\n    }\n\n    private val moduleScope: ModuleScope by lazy { packageScope.getModule(\"mypackage.mymodule\") }\n\n    private val modulePropertyScope: PropertyScope by lazy {\n      PropertyScope(moduleProperty, moduleScope)\n    }\n\n    private val moduleMethodScope: MethodScope by lazy { MethodScope(moduleMethod, moduleScope) }\n\n    private val classScope: ClassScope by lazy { ClassScope(clazz, moduleScope.url, moduleScope) }\n\n    private val typeAliasScope: TypeAliasScope by lazy {\n      TypeAliasScope(typeAlias, moduleScope.url, moduleScope)\n    }\n\n    private val classPropertyScope: PropertyScope by lazy {\n      PropertyScope(classProperty, classScope)\n    }\n\n    private val classMethodScope: MethodScope by lazy { MethodScope(classMethod, classScope) }\n\n    @JvmStatic\n    private fun scopes(): Collection<DocScope> =\n      listOf(\n        moduleScope,\n        modulePropertyScope,\n        moduleMethodScope,\n        classScope,\n        typeAliasScope,\n        classPropertyScope,\n        classMethodScope,\n      )\n\n    @JvmStatic\n    @AfterAll\n    fun afterAll() {\n      evaluator.close()\n    }\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve empty chain`(sourceScope: DocScope) {\n    assertThat(sourceScope.resolveDocLink(\"\")).isNull()\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve module property`(sourceScope: DocScope) {\n    val targetScope = sourceScope.resolveDocLink(\"age\")\n    targetScope as PropertyScope\n\n    assertThat(targetScope.property).isSameAs(moduleProperty)\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"index.html#age\"))\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve module method`(sourceScope: DocScope) {\n    val targetScope = sourceScope.resolveDocLink(\"sing()\")\n    targetScope as MethodScope\n\n    assertThat(targetScope.method).isSameAs(moduleMethod)\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"index.html#sing()\"))\n  }\n\n  @Test\n  internal fun `resolve module method parameter`() {\n    val targetScope = moduleMethodScope.resolveDocLink(\"song\")\n    targetScope as ParameterScope\n\n    assertThat(targetScope.name).isEqualTo(\"song\")\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"index.html#sing().song\"))\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve class`(sourceScope: DocScope) {\n    val targetScope = sourceScope.resolveDocLink(\"Person\")\n    targetScope as ClassScope\n\n    assertThat(targetScope.clazz).isSameAs(clazz)\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"Person.html\"))\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve type alias`(sourceScope: DocScope) {\n    val targetScope = sourceScope.resolveDocLink(\"Email\")\n    targetScope as TypeAliasScope\n\n    assertThat(targetScope.typeAlias).isSameAs(typeAlias)\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"index.html#Email\"))\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve class property`(sourceScope: DocScope) {\n    val targetScope = sourceScope.resolveDocLink(\"Person.name\")\n    targetScope as PropertyScope\n\n    assertThat(targetScope.property).isSameAs(classProperty)\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"Person.html#name\"))\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"scopes\")\n  internal fun `resolve class method`(sourceScope: DocScope) {\n    val targetScope = sourceScope.resolveDocLink(\"Person.call()\")\n    targetScope as MethodScope\n\n    assertThat(targetScope.method).isSameAs(classMethod)\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"Person.html#call()\"))\n  }\n\n  @Test\n  internal fun `resolve class method parameter`() {\n    val targetScope = classMethodScope.resolveDocLink(\"number\")\n    targetScope as ParameterScope\n\n    assertThat(targetScope.name).isEqualTo(\"number\")\n    assertThat(targetScope.urlRelativeTo(moduleScope)).isEqualTo(URI(\"Person.html#call().number\"))\n  }\n\n  @Test\n  internal fun `site scope URL is below output dir even if directory does not exist`() {\n    val outputDir = \"/non/existing\".toPath()\n    val scope = SiteScope(listOf(), mapOf(), { evaluator.evaluateSchema(uri(it)) }, outputDir)\n\n    // used to return `/non/index.html`\n    assertThat(scope.url.toPath()).isEqualTo(Path.of(\"/non/existing/index.html\").toAbsolutePath())\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/DocTestUtils.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport kotlin.io.path.copyTo\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.exists\nimport kotlin.io.path.extension\nimport kotlin.io.path.isSymbolicLink\nimport kotlin.io.path.readSymbolicLink\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions\nimport org.assertj.core.api.Assertions.assertThat\nimport org.pkl.commons.test.listFilesRecursively\nimport org.pkl.commons.toPath\nimport org.pkl.core.util.IoUtils\n\nobject DocTestUtils {\n\n  private val binaryFileExtensions = setOf(\"woff2\", \"png\", \"svg\")\n\n  fun testExpectedFile(expectedOutputDir: Path, actualOutputDir: Path, relativeFilePath: String) {\n    val actualFile = actualOutputDir.resolve(relativeFilePath)\n    assertThat(actualFile)\n      .withFailMessage(\"Test bug: $actualFile should exist but does not.\")\n      .exists()\n\n    // symlinks on Git and Windows is rather finnicky; they create shortcuts by default unless\n    // a core Git option is set. Also, by default, symlinks require administrator privileges to run.\n    // We'll just test that the symlink got created but skip verifying that it points to the right\n    // place.\n    if (actualFile.isSymbolicLink() && IoUtils.isWindows()) return\n    val expectedFile = expectedOutputDir.resolve(relativeFilePath)\n    if (expectedFile.exists()) {\n      when {\n        expectedFile.isSymbolicLink() -> {\n          assertThat(actualFile).isSymbolicLink\n          assertThat(expectedFile.readSymbolicLink().toString().toPath())\n            .isEqualTo(actualFile.readSymbolicLink().toString().toPath())\n        }\n        expectedFile.extension in binaryFileExtensions ->\n          assertThat(actualFile).hasSameBinaryContentAs(expectedFile)\n        else ->\n          // AssertJ's `hasSameTextualContentsAs` method does not produce helpful diffs when\n          // debugging in IntelliJ.\n          assertThat(actualFile.readText())\n            .`as`(\"Expected $expectedFile to have same text contents as $actualFile\")\n            .isEqualTo(expectedFile.readText())\n      }\n    } else {\n      expectedFile.createParentDirectories()\n      if (actualFile.isSymbolicLink()) {\n        // needs special handling because `copyTo` can't copy symlinks between file systems\n        val linkTarget = actualFile.readSymbolicLink()\n        assertThat(linkTarget).isRelative\n        Files.createSymbolicLink(expectedFile, linkTarget.toString().toPath())\n      } else {\n        actualFile.copyTo(expectedFile)\n      }\n      Assertions.fail(\"Created missing expected file `$relativeFilePath`.\")\n    }\n  }\n\n  fun assertDirectoriesEqual(expectedDir: Path, actualDir: Path) {\n    assertThat(actualDir)\n      .withFailMessage(\"Actual directory $actualDir should exist but does not.\")\n      .exists()\n      .isDirectory()\n\n    assertThat(expectedDir)\n      .withFailMessage(\"Expected directory $expectedDir should exist but does not.\")\n      .exists()\n      .isDirectory()\n\n    val expectedFiles =\n      expectedDir\n        .listFilesRecursively()\n        .map { expectedDir.relativize(it) }\n        .map { IoUtils.toNormalizedPathString(it) }\n        .sorted()\n\n    val actualFiles =\n      actualDir\n        .listFilesRecursively()\n        .map { actualDir.relativize(it) }\n        .map { IoUtils.toNormalizedPathString(it) }\n        .sorted()\n\n    assertThat(actualFiles).isEqualTo(expectedFiles)\n\n    expectedFiles.forEach { relativeFilePath ->\n      testExpectedFile(expectedDir, actualDir, relativeFilePath)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/JavaExecutableTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport org.junit.jupiter.api.condition.DisabledIfSystemProperty\nimport org.junit.jupiter.api.condition.EnabledIfSystemProperty\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.pkl.commons.test.Executables\n\n// need both annotations for this to work (see https://stackoverflow.com/a/63252081)\n@EnabledIfSystemProperty(named = \"org.pkl.doc.JavaExecutableTest\", matches = \"true\")\n@DisabledIfSystemProperty(named = \"org.pkl.doc.JavaExecutableTest\", matches = \"(?!true)\")\nclass JavaExecutableTest {\n  companion object {\n    val helper = DocGeneratorTestHelper()\n\n    @JvmStatic\n    private fun generateDocs(): List<String> =\n      helper.generateDocsWithCli(Executables.pkldoc.javaExecutable)\n  }\n\n  @ParameterizedTest()\n  @MethodSource(\"generateDocs\")\n  fun test(relativePath: String) {\n    DocTestUtils.testExpectedFile(\n      helper.expectedOutputDir,\n      helper.baseActualOutputDir,\n      relativePath,\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/NativeExecutableTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport org.junit.jupiter.api.condition.DisabledIfSystemProperty\nimport org.junit.jupiter.api.condition.EnabledIfSystemProperty\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.pkl.commons.test.Executables\n\n// need both annotations for this to work (see https://stackoverflow.com/a/63252081)\n@EnabledIfSystemProperty(named = \"org.pkl.doc.NativeExecutableTest\", matches = \"true\")\n@DisabledIfSystemProperty(named = \"org.pkl.doc.NativeExecutableTest\", matches = \"(?!true)\")\nclass NativeExecutableTest {\n  companion object {\n    val helper = DocGeneratorTestHelper()\n\n    @JvmStatic\n    private fun generateDocs(): List<String> {\n      return helper.generateDocsWithCli(Executables.pkldoc.firstExistingNative)\n    }\n  }\n\n  @ParameterizedTest()\n  @MethodSource(\"generateDocs\")\n  fun test(relativePath: String) {\n    DocTestUtils.testExpectedFile(\n      helper.expectedOutputDir,\n      helper.baseActualOutputDir,\n      relativePath,\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/RuntimeDataTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.core.Version\n\nclass RuntimeDataTest {\n  private val descendingVersionComparator =\n    Comparator<String> { o1, o2 ->\n        val version1 = Version.parse(o1)\n        val version2 = Version.parse(o2)\n        version1.compareTo(version2)\n      }\n      .reversed()\n\n  @Test\n  fun `overwrites the link if newer`() {\n    val current =\n      RuntimeData(\n        knownUsages = setOf(RuntimeDataLink(\"foo.foo\", \"../../../foo/1.2.3/foo/index.html\"))\n      )\n    val ref = ModuleRef(pkg = \"bar\", pkgUri = null, version = \"1.2.3\", module = \"foo\")\n    val usages =\n      setOf(\n        ModuleRef(pkg = \"foo\", pkgUri = null, version = \"1.2.4\", module = \"foo\"),\n        ModuleRef(pkg = \"foo\", pkgUri = null, version = \"1.3.0\", module = \"foo\"),\n      )\n    val result = current.addKnownUsages(ref, usages, { it.fullName }, descendingVersionComparator)\n    assertThat(result)\n      .isEqualTo(\n        RuntimeData(\n          knownUsages = setOf(RuntimeDataLink(\"foo.foo\", \"../../../foo/1.3.0/foo/index.html\"))\n        )\n      )\n  }\n\n  @Test\n  fun `does not overwrite if link is older`() {\n    val current =\n      RuntimeData(\n        knownUsages = setOf(RuntimeDataLink(\"foo.foo\", \"../../../foo/1.3.0/foo/index.html\"))\n      )\n    val ref = ModuleRef(pkg = \"bar\", pkgUri = null, version = \"1.2.3\", module = \"foo\")\n    val usages = setOf(ModuleRef(pkg = \"foo\", pkgUri = null, version = \"1.2.0\", module = \"foo\"))\n\n    val result = current.addKnownUsages(ref, usages, { it.fullName }, descendingVersionComparator)\n    assertThat(result)\n      .isEqualTo(\n        RuntimeData(\n          knownUsages = setOf(RuntimeDataLink(\"foo.foo\", \"../../../foo/1.3.0/foo/index.html\"))\n        )\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-doc/src/test/kotlin/org/pkl/doc/SearchTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.doc\n\nimport com.google.common.jimfs.Configuration\nimport com.google.common.jimfs.Jimfs\nimport java.net.URI\nimport org.assertj.core.api.Assertions.assertThat\nimport org.graalvm.polyglot.Context\nimport org.graalvm.polyglot.Source\nimport org.graalvm.polyglot.Value\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.pkl.commons.cli.CliBaseOptions\nimport org.pkl.commons.readString\n\nclass SearchTest {\n  companion object {\n    private val tempFileSystem = lazy { Jimfs.newFileSystem(Configuration.unix()) }\n\n    private val helper = DocGeneratorTestHelper()\n\n    private val jsContext = lazy {\n      // reuse CliDocGeneratorTest's input files (src/test/files/DocGeneratorTest/input)\n      val packageModule: URI = helper.package1PackageModule\n      val inputModules: List<URI> = helper.package1InputModules\n\n      val pkldocDir = tempFileSystem.value.rootDirectories.first()\n\n      CliDocGenerator(\n          CliDocGeneratorOptions(\n            base =\n              CliBaseOptions(\n                sourceModules = listOf(packageModule) + inputModules,\n                settings = URI(\"pkl:settings\"),\n              ),\n            outputDir = pkldocDir,\n            true,\n          )\n        )\n        .run()\n\n      // `allowAllAccess(true)` disables host/guest language separation\n      // (e.g., to pass `java.util.ArrayList` instances as arguments to JavaScript functions)\n      Context.newBuilder(\"js\").allowAllAccess(true).build().apply {\n        eval(\n          Source.create(\"js\", pkldocDir.resolve(\"com.package1/1.2.3/search-index.js\").readString())\n        )\n        eval(Source.create(\"js\", pkldocDir.resolve(\"scripts/pkldoc.js\").readString()))\n        eval(Source.create(\"js\", pkldocDir.resolve(\"scripts/search-worker.js\").readString()))\n      }\n    }\n\n    private val bindings: Value by lazy {\n      jsContext.value.getBindings(\"js\").apply { getMember(\"initSearchIndex\").executeVoid() }\n    }\n\n    @AfterAll\n    @JvmStatic\n    @Suppress(\"unused\")\n    fun closeTempFileSystem() {\n      if (tempFileSystem.isInitialized()) {\n        tempFileSystem.value.close()\n      }\n    }\n\n    @AfterAll\n    @JvmStatic\n    @Suppress(\"unused\")\n    fun closeJsContext() {\n      if (jsContext.isInitialized()) {\n        jsContext.value.close()\n      }\n    }\n  }\n\n  @Test\n  fun toWordStarts() {\n    val toWordStarts = bindings.getMember(\"toWordStarts\")\n\n    val wordStarts1 = toWordStarts.execute(\"modPropAnns\".map { it.toString() })\n    assertThat(wordStarts1.`as`(List::class.java))\n      .containsExactly(0, 3, 3, 3, 7, 7, 7, 7, -1, -1, -1)\n\n    val wordStarts2 = toWordStarts.execute(\"ModPropAnns\".map { it.toString() })\n    assertThat(wordStarts2.`as`(List::class.java))\n      .containsExactly(0, 3, 3, 3, 7, 7, 7, 7, -1, -1, -1)\n\n    // `PROP` is treated as one word, same as `Prop`\n    // this means abbreviations are treated the same whether or not they are written in all caps\n    // (e.g., `URL` vs. `Url`)\n    val wordStarts3 = toWordStarts.execute(\"ModPROPAnns\".map { it.toString() })\n    assertThat(wordStarts3.`as`(List::class.java))\n      .containsExactly(0, 3, 3, 3, 7, 7, 7, 7, -1, -1, -1)\n\n    // number is treated as one word\n    val wordStarts4 = toWordStarts.execute(\"Mod1234Anns\".map { it.toString() })\n    assertThat(wordStarts4.`as`(List::class.java))\n      .containsExactly(0, 3, 3, 3, 7, 7, 7, 7, -1, -1, -1)\n\n    val wordStarts5 = toWordStarts.execute(\"Mod1234anns\".map { it.toString() })\n    assertThat(wordStarts5.`as`(List::class.java))\n      .containsExactly(0, 3, 3, 3, 7, 7, 7, 7, -1, -1, -1)\n\n    val wordStarts6 = toWordStarts.execute(\"123PropAnns\".map { it.toString() })\n    assertThat(wordStarts6.`as`(List::class.java))\n      .containsExactly(0, 3, 3, 3, 7, 7, 7, 7, -1, -1, -1)\n  }\n\n  @Test\n  fun `search with full name`() {\n    checkSearchResults(\"modulePropertyAnnotations\", setOf(\"com.package1.modulePropertyAnnotations\"))\n  }\n\n  @Test\n  fun `search with full name without capitalization`() {\n    checkSearchResults(\"modulepropertyannotations\", setOf(\"com.package1.modulePropertyAnnotations\"))\n  }\n\n  @Test\n  fun `characters are normalized`() {\n    checkSearchResults(\"modulépropertyannotåtions\", setOf(\"com.package1.modulePropertyAnnotations\"))\n  }\n\n  @Test\n  fun `search with start of name`() {\n    checkSearchResults(\n      \"modulepr\",\n      setOf(\n        \"com.package1.modulePropertyAnnotations\",\n        \"com.package1.modulePropertyCommentInheritance\",\n        \"com.package1.modulePropertyComments\",\n        \"com.package1.modulePropertyModifiers\",\n        \"com.package1.modulePropertyTypeAnnotations\",\n        \"com.package1.modulePropertyTypeReferences\",\n      ),\n    )\n  }\n\n  @Test\n  fun `search with end of name`() {\n    checkSearchResults(\n      \"pereferences\",\n      setOf(\n        \"TypeReferences\",\n        \"com.package1.classMethodTypeReferences\",\n        \"com.package1.classPropertyTypeReferences\",\n        \"com.package1.moduleMethodTypeReferences\",\n        \"com.package1.modulePropertyTypeReferences\",\n      ),\n    )\n  }\n\n  @Test\n  fun `search with middle of name`() {\n    checkSearchResults(\n      \"with\",\n      setOf(\n        \"prpertyWithExpandableComment\",\n        \"AnnotatedClssWithExpandableComment\",\n        \"ClassWithAnnotatedProperty\",\n        \"mthodWithExpandableComment\",\n      ),\n    )\n  }\n\n  @Test\n  fun `search with all word starts`() {\n    checkSearchResults(\"mpa\", setOf(\"com.package1.modulePropertyAnnotations\"))\n  }\n\n  @Test\n  fun `search for prefix of word starts`() {\n    checkSearchResults(\n      \"mp\",\n      setOf(\n        \"myProperty\",\n        \"com.package1.modulePropertyComments\",\n        \"com.package1.modulePropertyModifiers\",\n        \"com.package1.modulePropertyAnnotations\",\n        \"com.package1.modulePropertyTypeReferences\",\n        \"com.package1.modulePropertyTypeAnnotations\",\n        \"com.package1.modulePropertyCommentInheritance\",\n        \"com.package1.docExampleSubject1\",\n        \"com.package1.docExampleSubject2\",\n      ),\n    )\n  }\n\n  @Test\n  fun `search with postfix of word starts`() {\n    checkSearchResults(\n      \"ci\",\n      setOf(\n        \"com.package1.classInheritance\",\n        \"city\", // disregard\n        \"com.package1.moduleMethodCommentInheritance\",\n        \"com.package1.modulePropertyCommentInheritance\",\n      ),\n    )\n  }\n\n  @Test\n  fun `search with numbers`() {\n    checkSearchResults(\"property7\", setOf(\"property7\"))\n    checkSearchResults(\"prop7\", setOf(\"property7\"))\n    checkSearchResults(\"p7\", setOf(\"property7\"))\n  }\n\n  @Test\n  fun `cannot skip middle characters (match must be contiguous)`() {\n    checkSearchResults(\"method7\", setOf(\"method7\"))\n    checkSearchResults(\"methd7\", setOf())\n  }\n\n  @Test\n  fun `cannot skip middle word starts (match must be contiguous)`() {\n    checkSearchResults(\"pwec\", setOf(\"prpertyWithExpandableComment\"))\n    checkSearchResults(\"pwc\", setOf())\n  }\n\n  @Test\n  fun `exact match of last module name component is considered exact match`() {\n    checkExactSearchResults(\"modulePropertyComments\", setOf(\"com.package1.modulePropertyComments\"))\n  }\n\n  @Test\n  fun `exact word start match of last module name component is considered exact match`() {\n    checkExactSearchResults(\"mpc\", setOf(\"com.package1.modulePropertyComments\"))\n  }\n\n  private fun checkSearchResults(inputValue: String, expected: Set<String>) {\n    val query = bindings.getMember(\"parseSearchInput\").execute(inputValue)\n    val results = bindings.getMember(\"runSearch\").execute(query, null, null)\n    val actual =\n      getResultsForCategory(results, \"exactMatches\") +\n        getResultsForCategory(results, \"classMatches\") +\n        getResultsForCategory(results, \"moduleMatches\") +\n        getResultsForCategory(results, \"otherMatches\")\n\n    assertThat(actual).isEqualTo(expected)\n  }\n\n  private fun checkExactSearchResults(inputValue: String, expected: Set<String>) {\n    val query = bindings.getMember(\"parseSearchInput\").execute(inputValue)\n    val results = bindings.getMember(\"runSearch\").execute(query, null, null)\n    val actual = getResultsForCategory(results, \"exactMatches\")\n\n    assertThat(actual).isEqualTo(expected)\n  }\n\n  private fun getResultsForCategory(results: Value, category: String): Set<String> {\n    val categoryResults = results.getMember(category)\n\n    return (0 until categoryResults.arraySize)\n      .map { categoryResults.getArrayElement(it).getMember(\"name\").`as`(String::class.java) }\n      .toSet()\n  }\n}\n"
  },
  {
    "path": "pkl-executor/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=testRuntimeClasspath\norg.pkl-lang:pkl-config-java-all:0.25.0=pklHistoricalDistributions\norg.slf4j:slf4j-api:1.7.36=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.slf4j:slf4j-simple:1.7.36=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=testRuntimeClasspath\nempty=annotationProcessor,apiDependenciesMetadata,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,pklDistributionCurrent,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-executor/pkl-executor.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.nio.file.Files\nimport java.nio.file.LinkOption\n\nplugins {\n  pklAllProjects\n  pklJavaLibrary\n  pklPublishLibrary\n  pklKotlinTest\n}\n\nval pklDistributionCurrent: Configuration by configurations.creating\nval pklHistoricalDistributions: Configuration by configurations.creating\n\n// Because pkl-executor doesn't depend on other Pkl modules\n// (nor has overlapping dependencies that could cause a version conflict),\n// clients are free to use different versions of pkl-executor and (say) pkl-config-java-all.\n// (Pkl distributions used by EmbeddedExecutor are isolated via class loaders.)\ndependencies {\n  pklDistributionCurrent(project(\":pkl-config-java\", \"fatJar\"))\n  @Suppress(\"UnstableApiUsage\") pklHistoricalDistributions(libs.pklConfigJavaAll025)\n\n  implementation(libs.slf4jApi)\n\n  testImplementation(projects.pklCommonsTest)\n  testImplementation(projects.pklCore)\n  testImplementation(libs.slf4jSimple)\n}\n\n// TODO why is this needed? Without this, we get error:\n// `Entry org/pkl/executor/EmbeddedExecutor.java is a duplicate but no duplicate handling strategy\n// has been set.`\n// However, we do not have multiple of these Java files.\ntasks.named<Jar>(\"sourcesJar\") { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-executor\")\n        description.set(\n          \"\"\"\n          Library for executing Pkl code in a sandboxed environment.\n        \"\"\"\n            .trimIndent()\n        )\n      }\n    }\n  }\n}\n\nsourceSets { main { java { srcDir(\"src/main/java\") } } }\n\nval prepareHistoricalDistributions by\n  tasks.registering {\n    val outputDir = layout.buildDirectory.dir(\"pklHistoricalDistributions\")\n    inputs.files(pklHistoricalDistributions.files)\n    outputs.dir(outputDir)\n    doLast {\n      val distributionDir = outputDir.get().asFile.toPath().also(Files::createDirectories)\n      for (file in pklHistoricalDistributions.files) {\n        val target = distributionDir.resolve(file.name)\n        // Create normal files on Windows, symlink on macOS/linux (need admin privileges to create\n        // symlinks on Windows)\n        if (buildInfo.os.isWindows) {\n          if (!Files.isRegularFile(target, LinkOption.NOFOLLOW_LINKS)) {\n            if (Files.exists(target)) {\n              Files.delete(target)\n            }\n            Files.copy(file.toPath(), target)\n          }\n        } else {\n          if (!Files.isSymbolicLink(target)) {\n            if (Files.exists(target)) {\n              Files.delete(target)\n            }\n            Files.createSymbolicLink(target, file.toPath())\n          }\n        }\n      }\n    }\n  }\n\nval prepareTest by\n  tasks.registering { dependsOn(pklDistributionCurrent, prepareHistoricalDistributions) }\n\ntasks.test { dependsOn(prepareTest) }\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/EmbeddedExecutor.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor;\n\nimport java.io.IOException;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.net.URLClassLoader;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.*;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport org.pkl.executor.spi.v1.ExecutorSpi;\nimport org.pkl.executor.spi.v1.ExecutorSpiException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nfinal class EmbeddedExecutor implements Executor {\n  private static final Logger logger = LoggerFactory.getLogger(EmbeddedExecutor.class);\n\n  private static final Pattern MODULE_INFO_PATTERN =\n      Pattern.compile(\"@ModuleInfo\\\\s*\\\\{.*minPklVersion\\\\s*=\\\\s*\\\"([0-9.]*)\\\".*}\", Pattern.DOTALL);\n\n  private final List<PklDistribution> pklDistributions = new ArrayList<>();\n\n  /**\n   * @throws IllegalArgumentException if a Jar file cannot be found or is not a valid Pkl\n   *     distribution\n   */\n  public EmbeddedExecutor(List<Path> pklFatJars) {\n    this(pklFatJars, Executor.class.getClassLoader());\n  }\n\n  // for testing only\n  EmbeddedExecutor(List<Path> pklFatJars, ClassLoader pklExecutorClassLoader) {\n    for (var jarFile : pklFatJars) {\n      pklDistributions.add(new PklDistribution(jarFile, pklExecutorClassLoader));\n    }\n  }\n\n  public String evaluatePath(Path modulePath, ExecutorOptions options) {\n    logger.info(\"Started evaluating Pkl module. modulePath={} options={}\", modulePath, options);\n\n    long startTime = System.nanoTime();\n\n    Version requestedVersion = null;\n    PklDistribution distribution = null;\n    String output = null;\n    RuntimeException exception = null;\n\n    try {\n      if (!Files.isRegularFile(modulePath)) {\n        throw new ExecutorException(\n            String.format(\"Cannot find Pkl module `%s`.\", toDisplayPath(modulePath, options)));\n      }\n\n      // Note that version detection for the given module happens before security checks for its\n      // evaluation.\n      // This should be acceptable because version detection only involves the module passed\n      // directly to the executor\n      // (but not any modules imported by it) and only requires parsing (but not evaluating) the\n      // module.\n      requestedVersion = detectRequestedPklVersion(modulePath, options);\n      //noinspection resource\n      distribution = findCompatibleDistribution(modulePath, requestedVersion, options);\n      output = distribution.evaluatePath(modulePath, options);\n    } catch (RuntimeException e) {\n      exception = e;\n    }\n\n    var endTime = System.nanoTime();\n\n    // Could log exception, but this would violate \"don't log and throw\",\n    // and Pkl stack trace might contain semi-sensitive information.\n    logger.info(\n        \"Finished evaluating Pkl module. modulePath={} outcome={} requestedVersion={} selectedVersion={} elapsedMillis={}\",\n        modulePath,\n        exception == null ? \"success\" : \"failure\",\n        requestedVersion == null ? \"n/a\" : requestedVersion.toString(),\n        distribution == null ? \"n/a\" : distribution.getVersion().toString(),\n        (endTime - startTime) / 1_000_000);\n\n    if (exception != null) throw exception;\n\n    assert output != null;\n    return output;\n  }\n\n  private Version detectRequestedPklVersion(Path modulePath, ExecutorOptions options) {\n    String sourceText;\n    try {\n      sourceText = Files.readString(modulePath, StandardCharsets.UTF_8);\n    } catch (IOException e) {\n      throw new ExecutorException(\n          String.format(\"I/O error loading Pkl module `%s`.\", toDisplayPath(modulePath, options)),\n          e);\n    }\n\n    var version = extractMinPklVersion(sourceText);\n    if (version != null) return version;\n\n    var availableVersions =\n        pklDistributions.stream()\n            .map(it -> it.getVersion().toString())\n            .collect(Collectors.joining(\", \"));\n\n    throw new ExecutorException(\n        String.format(\n            \"Pkl module `%s` does not state which Pkl version it requires. (Available versions: %s)%n\"\n                + \"To fix this problem, annotate the module's `amends`, `extends`, or `module` clause with `@ModuleInfo { minPklVersion = \\\"x.y.z\\\" }`.\",\n            toDisplayPath(modulePath, options), availableVersions));\n  }\n\n  /* @Nullable */ static Version extractMinPklVersion(String sourceText) {\n    var matcher = MODULE_INFO_PATTERN.matcher(sourceText);\n    return matcher.find() ? Version.parse(matcher.group(1)) : null;\n  }\n\n  private PklDistribution findCompatibleDistribution(\n      Path modulePath, Version requestedVersion, ExecutorOptions options) {\n    var result =\n        pklDistributions.stream()\n            .filter(it -> it.getVersion().compareTo(requestedVersion) >= 0)\n            .min(Comparator.comparing(PklDistribution::getVersion));\n\n    if (result.isPresent()) return result.get();\n\n    var availableVersions =\n        pklDistributions.stream()\n            .map(it -> it.getVersion().toString())\n            .collect(Collectors.joining(\", \"));\n\n    throw new ExecutorException(\n        String.format(\n            \"Pkl version `%s` requested by module `%s` is not supported. Available versions: %s%n\"\n                + \"To fix this problem, edit the module's `@ModuleInfo { minPklVersion = \\\"%s\\\" }` annotation.\",\n            requestedVersion,\n            toDisplayPath(modulePath, options),\n            availableVersions,\n            requestedVersion));\n  }\n\n  private static Path toDisplayPath(Path modulePath, ExecutorOptions options) {\n    var rootDir = options.getRootDir();\n    return rootDir == null ? modulePath : relativize(modulePath, rootDir);\n  }\n\n  // On Windows, `Path.relativize` will fail if the two paths have different roots.\n  private static Path relativize(Path path, Path base) {\n    if (path.isAbsolute() && base.isAbsolute() && !path.getRoot().equals(base.getRoot())) {\n      return path;\n    }\n    return base.relativize(path);\n  }\n\n  @Override\n  public void close() throws Exception {\n    for (var pklDistribution : pklDistributions) {\n      pklDistribution.close();\n    }\n  }\n\n  private static final class PklDistribution implements AutoCloseable {\n    final URLClassLoader pklDistributionClassLoader;\n    final /* @Nullable */ ExecutorSpi executorSpi;\n    final Version version;\n\n    /**\n     * @throws IllegalArgumentException if the Jar file does not exist or is not a valid Pkl\n     *     distribution\n     */\n    PklDistribution(Path pklFatJar, ClassLoader pklExecutorClassLoader) {\n      if (!Files.isRegularFile(pklFatJar)) {\n        throw new IllegalArgumentException(\n            String.format(\"Invalid Pkl distribution: Cannot find Jar file `%s`.\", pklFatJar));\n      }\n\n      pklDistributionClassLoader =\n          new PklDistributionClassLoader(pklFatJar, pklExecutorClassLoader);\n      var serviceLoader = ServiceLoader.load(ExecutorSpi.class, pklDistributionClassLoader);\n\n      try {\n        executorSpi = serviceLoader.iterator().next();\n      } catch (NoSuchElementException e) {\n        throw new IllegalArgumentException(\n            String.format(\n                \"Invalid Pkl distribution: Cannot find service of type `%s` in Jar file `%s`.\",\n                ExecutorSpi.class.getTypeName(), pklFatJar));\n\n      } catch (ServiceConfigurationError e) {\n        throw new IllegalArgumentException(\n            String.format(\n                \"Invalid Pkl distribution: Unexpected error loading service of type `%s` from Jar file `%s`.\",\n                ExecutorSpi.class.getTypeName(), pklFatJar),\n            e);\n      }\n\n      // convert to normal to allow running with a dev version\n      version = Version.parse(executorSpi.getPklVersion()).toNormal();\n    }\n\n    Version getVersion() {\n      return version;\n    }\n\n    String evaluatePath(Path modulePath, ExecutorOptions options) {\n      var currentThread = Thread.currentThread();\n      var prevContextClassLoader = currentThread.getContextClassLoader();\n      // Truffle loads stuff from context class loader, so set it to our class loader\n      currentThread.setContextClassLoader(pklDistributionClassLoader);\n      try {\n        return executorSpi.evaluatePath(modulePath, options.toSpiOptions());\n      } catch (ExecutorSpiException e) {\n        throw new ExecutorException(e.getMessage(), e.getCause(), executorSpi.getPklVersion());\n      } catch (RuntimeException e) {\n        // This branch would ideally never be hit, but older Pkl releases (<0.27) erroneously throw\n        // PklException in some cases.\n        // Can't catch PklException directly because pkl-executor cannot depend on pkl-core.\n        if (e.getClass().getName().equals(\"org.pkl.core.PklException\")) {\n          throw new ExecutorException(e.getMessage(), e.getCause());\n        }\n        throw e;\n      } finally {\n        currentThread.setContextClassLoader(prevContextClassLoader);\n      }\n    }\n\n    @Override\n    public void close() throws IOException {\n      pklDistributionClassLoader.close();\n    }\n  }\n\n  private static final class PklDistributionClassLoader extends URLClassLoader {\n    final ClassLoader pklExecutorClassLoader;\n\n    static {\n      registerAsParallelCapable();\n    }\n\n    PklDistributionClassLoader(Path pklFatJar, ClassLoader pklExecutorClassLoader) {\n      // pass `null` to make bootstrap class loader the effective parent\n      super(toUrls(pklFatJar), null);\n      this.pklExecutorClassLoader = pklExecutorClassLoader;\n    }\n\n    @Override\n    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {\n      synchronized (getClassLoadingLock(name)) {\n        var clazz = findLoadedClass(name);\n\n        if (clazz == null) {\n          if (name.startsWith(\"org.pkl.executor.spi.\")) {\n            try {\n              // give pkl-executor a chance to load the SPI class\n              clazz = pklExecutorClassLoader.loadClass(name);\n            } catch (ClassNotFoundException ignored) {\n              // The SPI class exists in this distribution but not in pkl-executor,\n              // so load it from the distribution.\n              // This can happen if the pkl-executor version is lower than the distribution version.\n              clazz = findClass(name);\n            }\n          } else if (name.startsWith(\"java.\")\n              || name.startsWith(\"jdk.\")\n              || name.startsWith(\"sun.\")\n              // Don't add all of `javax` because some packages might come from a dependency\n              // (e.g. jsr305)\n              || name.startsWith(\"javax.annotation.processing\")\n              || name.startsWith(\"javax.lang.\")\n              || name.startsWith(\"javax.naming.\")\n              || name.startsWith(\"javax.net.\")\n              || name.startsWith(\"javax.crypto.\")\n              || name.startsWith(\"javax.security.\")\n              || name.startsWith(\"com.sun.\")) {\n            clazz = getPlatformClassLoader().loadClass(name);\n          } else {\n            clazz = findClass(name);\n          }\n        }\n\n        if (resolve) {\n          resolveClass(clazz);\n        }\n\n        return clazz;\n      }\n    }\n\n    @Override\n    public URL getResource(String name) {\n      var resource = getPlatformClassLoader().getResource(name);\n      return resource != null ? resource : findResource(name);\n    }\n\n    @Override\n    public Enumeration<URL> getResources(String name) throws IOException {\n      return ConcatenatedEnumeration.create(\n          getPlatformClassLoader().getResources(name), findResources(name));\n    }\n\n    static URL[] toUrls(Path pklFatJar) {\n      try {\n        return new URL[] {pklFatJar.toUri().toURL()};\n      } catch (MalformedURLException e) {\n        throw new AssertionError(e);\n      }\n    }\n  }\n\n  private static final class ConcatenatedEnumeration<E> implements Enumeration<E> {\n    final Enumeration<E> e1;\n    final Enumeration<E> e2;\n\n    static <E> Enumeration<E> create(Enumeration<E> e1, Enumeration<E> e2) {\n      return !e1.hasMoreElements()\n          ? e2\n          : !e2.hasMoreElements() ? e1 : new ConcatenatedEnumeration<>(e1, e2);\n    }\n\n    ConcatenatedEnumeration(Enumeration<E> e1, Enumeration<E> e2) {\n      this.e1 = e1;\n      this.e2 = e2;\n    }\n\n    public boolean hasMoreElements() {\n      return e1.hasMoreElements() || e2.hasMoreElements();\n    }\n\n    public E nextElement() throws NoSuchElementException {\n      return e1.hasMoreElements() ? e1.nextElement() : e2.nextElement();\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/Executor.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor;\n\nimport java.nio.file.Path;\n\n/**\n * Evaluates Pkl modules in a sandbox. The modules to be evaluated must have an `amends`, `extends`,\n * or `module` clause annotated with {@code @ModuleInfo { minPklVersion = \"x.y.z\" }}. To avoid\n * resource leaks, an executor must be {@link #close() closed} after use.\n */\npublic interface Executor extends AutoCloseable {\n  /**\n   * Evaluates the given module with the given options, returning the module's output.\n   *\n   * <p>If evaluation fails, throws {@link ExecutorException} with a descriptive message.\n   */\n  String evaluatePath(Path modulePath, ExecutorOptions options);\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/ExecutorException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor;\n\nimport java.util.Objects;\n\n/**\n * Indicates an {@link Executor} error. {@link #getMessage()} returns a user-facing error message.\n */\npublic final class ExecutorException extends RuntimeException {\n  private final String pklVersion;\n\n  public ExecutorException(String message) {\n    super(message);\n    pklVersion = null;\n  }\n\n  public ExecutorException(String message, Throwable cause) {\n    super(message, cause);\n    pklVersion = null;\n  }\n\n  public ExecutorException(String message, Throwable cause, String version) {\n    super(message, cause);\n    pklVersion = Objects.requireNonNull(version);\n  }\n\n  /**\n   * The selected Pkl version used to evaluate the module.\n   *\n   * <p>Returns {@code null} if this exception does not originate from an underlying Pkl evaluator.\n   */\n  public String getPklVersion() {\n    return pklVersion;\n  }\n\n  @Override\n  public String getMessage() {\n    var message = super.getMessage();\n    if (pklVersion == null) {\n      return message;\n    }\n    return message + \"\\nPkl version: \" + pklVersion;\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/ExecutorOptions.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor;\n\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport org.pkl.executor.spi.v1.ExecutorSpiOptions;\nimport org.pkl.executor.spi.v1.ExecutorSpiOptions2;\nimport org.pkl.executor.spi.v1.ExecutorSpiOptions3;\n\n/**\n * Options for {@link Executor#evaluatePath}.\n *\n * <p>To create {@code ExecutorOptions}, use its {@linkplain #builder builder}.\n */\npublic final class ExecutorOptions {\n  private final List<String> allowedModules;\n\n  private final List<String> allowedResources;\n\n  private final Map<String, String> environmentVariables;\n\n  private final Map<String, String> externalProperties;\n\n  private final List<Path> modulePath;\n\n  private final /* @Nullable */ Path rootDir;\n\n  private final /* @Nullable */ Duration timeout;\n\n  private final /* @Nullable */ String outputFormat;\n\n  private final /* @Nullable */ Path moduleCacheDir;\n\n  private final /* @Nullable */ Path projectDir;\n\n  private final List<Path> certificateFiles;\n\n  private final List<byte[]> certificateBytes;\n\n  private final Map<URI, URI> httpRewrites;\n\n  private final int testPort; // -1 means disabled\n\n  private final int spiOptionsVersion; // -1 means use latest\n\n  /** Returns the module cache dir that the CLI uses by default. */\n  public static Path defaultModuleCacheDir() {\n    return Path.of(System.getProperty(\"user.home\"), \".pkl\", \"cache\");\n  }\n\n  public static Builder builder() {\n    return new Builder();\n  }\n\n  /**\n   * A builder of {@link ExecutorOptions}.\n   *\n   * <p>It is safe to create multiple options objects with the same builder.\n   */\n  public static final class Builder {\n    private List<String> allowedModules = List.of();\n    private List<String> allowedResources = List.of();\n    private Map<String, String> environmentVariables = Map.of();\n    private Map<String, String> externalProperties = Map.of();\n    private List<Path> modulePath = List.of();\n    private /* @Nullable */ Path rootDir;\n    private /* @Nullable */ Duration timeout;\n    private /* @Nullable */ String outputFormat;\n    private /* @Nullable */ Path moduleCacheDir;\n    private /* @Nullable */ Path projectDir;\n    private List<Path> certificateFiles = List.of();\n    private List<byte[]> certificateBytes = List.of();\n    private Map<URI, URI> httpRewrites = Map.of();\n    private int testPort = -1; // -1 means disabled\n    private int spiOptionsVersion = -1; // -1 means use latest\n\n    private Builder() {}\n\n    /** API equivalent of the {@code --allowed-modules} CLI option. */\n    public Builder allowedModules(List<String> allowedModules) {\n      this.allowedModules = allowedModules;\n      return this;\n    }\n\n    /** API equivalent of the {@code --allowed-modules} CLI option. */\n    public Builder allowedModules(String... allowedModules) {\n      this.allowedModules = List.of(allowedModules);\n      return this;\n    }\n\n    /** API equivalent of the {@code --allowed-resources} CLI option. */\n    public Builder allowedResources(List<String> allowedResources) {\n      this.allowedResources = allowedResources;\n      return this;\n    }\n\n    /** API equivalent of the {@code --allowed-resources} CLI option. */\n    public Builder allowedResources(String... allowedResources) {\n      this.allowedResources = List.of(allowedResources);\n      return this;\n    }\n\n    /** API equivalent of the repeatable {@code --env-var} CLI option. */\n    public Builder environmentVariables(Map<String, String> environmentVariables) {\n      this.environmentVariables = environmentVariables;\n      return this;\n    }\n\n    /** API equivalent of the repeatable {@code --property} CLI option. */\n    public Builder externalProperties(Map<String, String> externalProperties) {\n      this.externalProperties = externalProperties;\n      return this;\n    }\n\n    /** API equivalent of the {@code --module-path} CLI option. */\n    public Builder modulePath(List<Path> modulePath) {\n      this.modulePath = modulePath;\n      return this;\n    }\n\n    /** API equivalent of the {@code --module-path} CLI option. */\n    public Builder modulePath(Path... modulePath) {\n      this.modulePath = List.of(modulePath);\n      return this;\n    }\n\n    /** API equivalent of the {@code --root-dir} CLI option. */\n    public Builder rootDir(/*Nullable*/ Path rootDir) {\n      this.rootDir = rootDir;\n      return this;\n    }\n\n    /** API equivalent of the {@code --timeout} CLI option. */\n    public Builder timeout(/*Nullable*/ Duration timeout) {\n      this.timeout = timeout;\n      return this;\n    }\n\n    /** API equivalent of the {@code --format} CLI option. */\n    public Builder outputFormat(/*Nullable*/ String outputFormat) {\n      this.outputFormat = outputFormat;\n      return this;\n    }\n\n    /**\n     * API equivalent of the {@code --cache-dir} CLI option. Passing {@code null} is equivalent to\n     * {@code --no-cache}.\n     */\n    public Builder moduleCacheDir(/*Nullable*/ Path moduleCacheDir) {\n      this.moduleCacheDir = moduleCacheDir;\n      return this;\n    }\n\n    /**\n     * API equivalent of the {@code --project-dir} CLI option.\n     *\n     * <p>Unlike the CLI, this option only sets project dependencies. It does not set evaluator\n     * settings.\n     */\n    public Builder projectDir(/*Nullable*/ Path projectDir) {\n      this.projectDir = projectDir;\n      return this;\n    }\n\n    /** API equivalent of the {@code --ca-certificates} CLI option. */\n    public Builder certificateFiles(List<Path> certificateFiles) {\n      this.certificateFiles = certificateFiles;\n      return this;\n    }\n\n    /** API equivalent of the {@code --ca-certificates} CLI option. */\n    public Builder certificateFiles(Path... certificateFiles) {\n      this.certificateFiles = List.of(certificateFiles);\n      return this;\n    }\n\n    public Builder certificateBytes(List<byte[]> certificateBytes) {\n      this.certificateBytes = certificateBytes;\n      return this;\n    }\n\n    public Builder certificateBytes(byte[]... certificateBytes) {\n      this.certificateBytes = List.of(certificateBytes);\n      return this;\n    }\n\n    /**\n     * API equivalent of the {@code --http-rewrite} CLI option.\n     *\n     * <p>This option is ignored on Pkl 0.28 and older.\n     *\n     * @since 0.29.0\n     */\n    public Builder httpRewrites(Map<URI, URI> httpRewrites) {\n      this.httpRewrites = httpRewrites;\n      return this;\n    }\n\n    /** Internal test option. -1 means disabled. */\n    Builder testPort(int testPort) {\n      this.testPort = testPort;\n      return this;\n    }\n\n    /** Internal test option. -1 means use latest. */\n    Builder spiOptionsVersion(int version) {\n      this.spiOptionsVersion = version;\n      return this;\n    }\n\n    public ExecutorOptions build() {\n      return new ExecutorOptions(\n          allowedModules,\n          allowedResources,\n          environmentVariables,\n          externalProperties,\n          modulePath,\n          rootDir,\n          timeout,\n          outputFormat,\n          moduleCacheDir,\n          projectDir,\n          certificateFiles,\n          certificateBytes,\n          httpRewrites,\n          testPort,\n          spiOptionsVersion);\n    }\n  }\n\n  /**\n   * Constructs an options object.\n   *\n   * @deprecated use {@link #builder} instead\n   * @param allowedModules API equivalent of the {@code --allowed-modules} CLI option\n   * @param allowedResources API equivalent of the {@code --allowed-resources} CLI option\n   * @param environmentVariables API equivalent of the repeatable {@code --env-var} CLI option\n   * @param externalProperties API equivalent of the repeatable {@code --property} CLI option\n   * @param modulePath API equivalent of the {@code --module-path} CLI option\n   * @param rootDir API equivalent of the {@code --root-dir} CLI option\n   * @param timeout API equivalent of the {@code --timeout} CLI option\n   * @param outputFormat API equivalent of the {@code --format} CLI option\n   * @param moduleCacheDir API equivalent of the {@code --cache-dir} CLI option. Passing {@link\n   *     #defaultModuleCacheDir()} is equivalent to omitting {@code --cache-dir}. Passing {@code\n   *     null} is equivalent to {@code --no-cache}.\n   * @param projectDir API equivalent of the {@code --project-dir} CLI option.\n   */\n  @Deprecated(forRemoval = true)\n  public ExecutorOptions(\n      List<String> allowedModules,\n      List<String> allowedResources,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      List<Path> modulePath,\n      /* @Nullable */ Path rootDir,\n      /* @Nullable */ Duration timeout,\n      /* @Nullable */ String outputFormat,\n      /* @Nullable */ Path moduleCacheDir,\n      /* @Nullable */ Path projectDir) {\n\n    this(\n        allowedModules,\n        allowedResources,\n        environmentVariables,\n        externalProperties,\n        modulePath,\n        rootDir,\n        timeout,\n        outputFormat,\n        moduleCacheDir,\n        projectDir,\n        List.of(),\n        List.of(),\n        Map.of(),\n        -1,\n        -1);\n  }\n\n  private ExecutorOptions(\n      List<String> allowedModules,\n      List<String> allowedResources,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      List<Path> modulePath,\n      /* @Nullable */ Path rootDir,\n      /* @Nullable */ Duration timeout,\n      /* @Nullable */ String outputFormat,\n      /* @Nullable */ Path moduleCacheDir,\n      /* @Nullable */ Path projectDir,\n      List<Path> certificateFiles,\n      List<byte[]> certificateBytes,\n      Map<URI, URI> httpRewrites,\n      int testPort,\n      int spiOptionsVersion) {\n\n    this.allowedModules = List.copyOf(allowedModules);\n    this.allowedResources = List.copyOf(allowedResources);\n    this.environmentVariables = Map.copyOf(environmentVariables);\n    this.externalProperties = Map.copyOf(externalProperties);\n    this.modulePath = modulePath;\n    this.rootDir = rootDir;\n    this.timeout = timeout;\n    this.outputFormat = outputFormat;\n    this.moduleCacheDir = moduleCacheDir;\n    this.projectDir = projectDir;\n    this.certificateFiles = List.copyOf(certificateFiles);\n    this.certificateBytes = List.copyOf(certificateBytes);\n    this.httpRewrites = Map.copyOf(httpRewrites);\n    this.testPort = testPort;\n    this.spiOptionsVersion = spiOptionsVersion;\n  }\n\n  /** API equivalent of the {@code --allowed-modules} CLI option. */\n  public List<String> getAllowedModules() {\n    return allowedModules;\n  }\n\n  /** API equivalent of the {@code --allowed-resources} CLI option. */\n  public List<String> getAllowedResources() {\n    return allowedResources;\n  }\n\n  /** API equivalent of the repeatable {@code --env-var} CLI option. */\n  public Map<String, String> getEnvironmentVariables() {\n    return environmentVariables;\n  }\n\n  /** API equivalent of the repeatable {@code --property} CLI option. */\n  public Map<String, String> getExternalProperties() {\n    return externalProperties;\n  }\n\n  /** API equivalent of the {@code --module-path} CLI option. */\n  public List<Path> getModulePath() {\n    return modulePath;\n  }\n\n  /** API equivalent of the {@code --root-dir} CLI option. */\n  public /* @Nullable */ Path getRootDir() {\n    return rootDir;\n  }\n\n  /** API equivalent of the {@code --timeout} CLI option. */\n  public Duration getTimeout() {\n    return timeout;\n  }\n\n  /** API equivalent of the {@code --format} CLI option. */\n  public /* @Nullable */ String getOutputFormat() {\n    return outputFormat;\n  }\n\n  /**\n   * API equivalent of the {@code --cache-dir} CLI option. {@code null} is equivalent to {@code\n   * --no-cache}.\n   */\n  public /* @Nullable */ Path getModuleCacheDir() {\n    return moduleCacheDir;\n  }\n\n  /**\n   * API equivalent of the {@code --project-dir} CLI option.\n   *\n   * <p>Unlike the CLI, this option only sets project dependencies. It does not set evaluator\n   * settings.\n   */\n  public /* @Nullable */ Path getProjectDir() {\n    return projectDir;\n  }\n\n  /** API equivalent of the {@code --ca-certificates} CLI option. */\n  public List<Path> getCertificateFiles() {\n    return certificateFiles;\n  }\n\n  public List<byte[]> getCertificateBytes() {\n    return certificateBytes;\n  }\n\n  /**\n   * API equivalent of the {@code --http-rewrite} CLI option.\n   *\n   * <p>This option is ignored on Pkl 0.28 and older.\n   *\n   * @since 0.29.0\n   */\n  public Map<URI, URI> getHttpRewrites() {\n    return httpRewrites;\n  }\n\n  @Override\n  public boolean equals(/* @Nullable */ Object obj) {\n    if (this == obj) return true;\n    if (obj.getClass() != ExecutorOptions.class) return false;\n\n    var other = (ExecutorOptions) obj;\n    return allowedModules.equals(other.allowedModules)\n        && allowedResources.equals(other.allowedResources)\n        && environmentVariables.equals(other.environmentVariables)\n        && externalProperties.equals(other.externalProperties)\n        && modulePath.equals(other.modulePath)\n        && Objects.equals(rootDir, other.rootDir)\n        && Objects.equals(timeout, other.timeout)\n        && Objects.equals(outputFormat, other.outputFormat)\n        && Objects.equals(moduleCacheDir, other.moduleCacheDir)\n        && Objects.equals(projectDir, other.projectDir)\n        && Objects.equals(certificateFiles, other.certificateFiles)\n        && Objects.equals(certificateBytes, other.certificateBytes)\n        && Objects.equals(httpRewrites, other.httpRewrites)\n        && testPort == other.testPort\n        && spiOptionsVersion == other.spiOptionsVersion;\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(\n        allowedModules,\n        allowedResources,\n        environmentVariables,\n        externalProperties,\n        modulePath,\n        rootDir,\n        timeout,\n        outputFormat,\n        moduleCacheDir,\n        projectDir,\n        certificateFiles,\n        certificateBytes,\n        httpRewrites,\n        testPort,\n        spiOptionsVersion);\n  }\n\n  @Override\n  public String toString() {\n    return \"ExecutorOptions{\"\n        + \"allowedModules=\"\n        + allowedModules\n        + \", allowedResources=\"\n        + allowedResources\n        + \", environmentVariables=\"\n        + environmentVariables\n        + \", externalProperties=\"\n        + externalProperties\n        + \", modulePath=\"\n        + modulePath\n        + \", rootDir=\"\n        + rootDir\n        + \", timeout=\"\n        + timeout\n        + \", outputFormat=\"\n        + outputFormat\n        + \", cacheDir=\"\n        + moduleCacheDir\n        + \", projectDir=\"\n        + projectDir\n        + \", certificateFiles=\"\n        + certificateFiles\n        + \", certificateBytes=\"\n        + certificateBytes\n        + \", httpRewrites=\"\n        + httpRewrites\n        + \", testPort=\"\n        + testPort\n        + \", spiOptionsVersion=\"\n        + spiOptionsVersion\n        + '}';\n  }\n\n  ExecutorSpiOptions toSpiOptions() {\n    return switch (spiOptionsVersion) {\n      case -1, 3 ->\n          new ExecutorSpiOptions3(\n              allowedModules,\n              allowedResources,\n              environmentVariables,\n              externalProperties,\n              modulePath,\n              rootDir,\n              timeout,\n              outputFormat,\n              moduleCacheDir,\n              projectDir,\n              certificateFiles,\n              certificateBytes,\n              testPort,\n              httpRewrites);\n      case 2 ->\n          new ExecutorSpiOptions2(\n              allowedModules,\n              allowedResources,\n              environmentVariables,\n              externalProperties,\n              modulePath,\n              rootDir,\n              timeout,\n              outputFormat,\n              moduleCacheDir,\n              projectDir,\n              certificateFiles,\n              certificateBytes,\n              testPort);\n      case 1 -> // for testing only\n          new ExecutorSpiOptions(\n              allowedModules,\n              allowedResources,\n              environmentVariables,\n              externalProperties,\n              modulePath,\n              rootDir,\n              timeout,\n              outputFormat,\n              moduleCacheDir,\n              projectDir);\n      default ->\n          throw new AssertionError(\"Unknown ExecutorSpiOptions version: \" + spiOptionsVersion);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/Executors.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor;\n\nimport java.nio.file.Path;\nimport java.util.List;\n\n/** A factory for {@link Executor}s. */\npublic final class Executors {\n  private Executors() {}\n\n  /**\n   * Creates an executor that evaluates Pkl modules in the caller's JVM with the given fat Jar Pkl\n   * distributions (typically <em>pkl-config-java-all</em>).\n   *\n   * @throws IllegalArgumentException if a Jar file cannot be found or is not a valid Pkl\n   *     distribution\n   */\n  public static Executor embedded(List<Path> pklFatJars) {\n    return new EmbeddedExecutor(pklFatJars);\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/Version.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor;\n\nimport java.util.*;\nimport java.util.regex.Pattern;\n\n/**\n * A <a href=\"https://semver.org/spec/v2.0.0.html\">semantic version</a>.\n *\n * <p>This class guarantees that valid semantic version numbers are handled correctly, but does\n * <em>not</em> guarantee that invalid semantic version numbers are rejected.\n */\n// copied from `org.pkl.core.Version` to avoid dependency on pkl-core\n@SuppressWarnings(\"Duplicates\")\nfinal class Version implements Comparable<Version> {\n  // https://semver.org/#backusnaur-form-grammar-for-valid-semver-versions\n  private static final Pattern VERSION =\n      Pattern.compile(\"(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)(?:-([^+]+))?(?:\\\\+(.+))?\");\n\n  private static final Pattern NUMERIC_IDENTIFIER = Pattern.compile(\"(0|[1-9]\\\\d*)\");\n\n  private static final Comparator<Version> COMPARATOR =\n      Comparator.comparingInt(Version::getMajor)\n          .thenComparingInt(Version::getMinor)\n          .thenComparingInt(Version::getPatch)\n          .thenComparing(\n              (v1, v2) -> {\n                if (v1.preRelease == null) return v2.preRelease == null ? 0 : 1;\n                if (v2.preRelease == null) return -1;\n                var ids1 = v1.getPreReleaseIdentifiers();\n                var ids2 = v2.getPreReleaseIdentifiers();\n                var minSize = Math.min(ids1.length, ids2.length);\n                for (var i = 0; i < minSize; i++) {\n                  var result = ids1[i].compareTo(ids2[i]);\n                  if (result != 0) return result;\n                }\n                return Integer.compare(ids1.length, ids2.length);\n              });\n\n  private final int major;\n  private final int minor;\n  private final int patch;\n  private final /*@Nullable*/ String preRelease;\n  private final /*@Nullable*/ String build;\n\n  // always access through getter\n  private volatile Identifier[] __preReleaseIdentifiers;\n\n  /** Constructs a semantic version. */\n  public Version(\n      int major,\n      int minor,\n      int patch,\n      /*@Nullable*/ String preRelease,\n      /*@Nullable*/ String build) {\n    this.major = major;\n    this.minor = minor;\n    this.patch = patch;\n    this.preRelease = preRelease;\n    this.build = build;\n  }\n\n  /**\n   * Parses the given string as a semantic version number.\n   *\n   * <p>Throws {@link IllegalArgumentException} if the given string could not be parsed as a\n   * semantic version number or is too large to fit into a {@link Version}.\n   */\n  public static Version parse(String version) {\n    var result = parseOrNull(version);\n    if (result != null) return result;\n\n    if (VERSION.matcher(version).matches()) {\n      throw new IllegalArgumentException(\n          String.format(\"`%s` is too large to fit into a Version.\", version));\n    }\n\n    throw new IllegalArgumentException(\n        String.format(\"`%s` could not be parsed as a semantic version number.\", version));\n  }\n\n  /**\n   * Parses the given string as a semantic version number.\n   *\n   * <p>Returns {@code null} if the given string could not be parsed as a semantic version number or\n   * is too large to fit into a {@link Version}.\n   */\n  public static /*@Nullable*/ Version parseOrNull(String version) {\n    var matcher = VERSION.matcher(version);\n    if (!matcher.matches()) return null;\n\n    try {\n      return new Version(\n          Integer.parseInt(matcher.group(1)),\n          Integer.parseInt(matcher.group(2)),\n          Integer.parseInt(matcher.group(3)),\n          matcher.group(4),\n          matcher.group(5));\n    } catch (NumberFormatException e) {\n      return null;\n    }\n  }\n\n  /** Returns a comparator for semantic versions. */\n  public static Comparator<Version> comparator() {\n    return COMPARATOR;\n  }\n\n  /** Returns the major version. */\n  public int getMajor() {\n    return major;\n  }\n\n  /** Returns a copy of this version with the given major version. */\n  public Version withMajor(int major) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the minor version. */\n  public int getMinor() {\n    return minor;\n  }\n\n  /** Returns a copy of this version with the given minor version. */\n  public Version withMinor(int minor) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the patch version. */\n  public int getPatch() {\n    return patch;\n  }\n\n  /** Returns a copy of this version with the given patch version. */\n  public Version withPatch(int patch) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the pre-release version (if any). */\n  public /*@Nullable*/ String getPreRelease() {\n    return preRelease;\n  }\n\n  /** Returns a copy of this version with the given pre-release version. */\n  public Version withPreRelease(/*@Nullable*/ String preRelease) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Returns the build metadata (if any). */\n  public /*@Nullable*/ String getBuild() {\n    return build;\n  }\n\n  /** Returns a copy of this version with the given build metadata. */\n  public Version withBuild(/*@Nullable*/ String build) {\n    return new Version(major, minor, patch, preRelease, build);\n  }\n\n  /** Tells if this version has no pre-release version or build metadata. */\n  @SuppressWarnings(\"unused\")\n  public boolean isNormal() {\n    return preRelease == null && build == null;\n  }\n\n  /** Tells if this version has a non-zero major version and no pre-release version. */\n  public boolean isStable() {\n    return major != 0 && preRelease == null;\n  }\n\n  /** Strips any pre-release version and build metadata from this version. */\n  public Version toNormal() {\n    return preRelease == null && build == null\n        ? this\n        : new Version(major, minor, patch, null, null);\n  }\n\n  /** Compares this version to the given version according to semantic versioning rules. */\n  @Override\n  public int compareTo(@SuppressWarnings(\"NullableProblems\") /*@Nonnull*/ Version other) {\n    return COMPARATOR.compare(this, other);\n  }\n\n  /** Tells if this version is equal to {@code obj} according to semantic versioning rules. */\n  @Override\n  public boolean equals(/* @Nullable */ Object obj) {\n    if (this == obj) return true;\n    if (!(obj instanceof Version other)) return false;\n    return major == other.major\n        && minor == other.minor\n        && patch == other.patch\n        && Objects.equals(preRelease, other.preRelease);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(major, minor, patch, preRelease);\n  }\n\n  @Override\n  public String toString() {\n    return major\n        + \".\"\n        + minor\n        + \".\"\n        + patch\n        + (preRelease != null ? \"-\" + preRelease : \"\")\n        + (build != null ? \"+\" + build : \"\");\n  }\n\n  private Identifier[] getPreReleaseIdentifiers() {\n    if (__preReleaseIdentifiers == null) {\n      __preReleaseIdentifiers =\n          preRelease == null\n              ? new Identifier[0]\n              : Arrays.stream(preRelease.split(\"\\\\.\"))\n                  .map(\n                      str ->\n                          NUMERIC_IDENTIFIER.matcher(str).matches()\n                              ? new Identifier(Long.parseLong(str), null)\n                              : new Identifier(-1, str))\n                  .toArray(Identifier[]::new);\n    }\n    return __preReleaseIdentifiers;\n  }\n\n  private record Identifier(long numericId, /*@Nullable*/ String alphanumericId)\n      implements Comparable<Identifier> {\n\n    @Override\n    public int compareTo(/*@Nonnull*/ @SuppressWarnings(\"NullableProblems\") Identifier other) {\n      return alphanumericId != null\n          ? other.alphanumericId != null ? alphanumericId.compareTo(other.alphanumericId) : 1\n          : other.alphanumericId != null ? -1 : Long.compare(numericId, other.numericId);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/spi/package-info.java",
    "content": "/**\n * <strong>Internal</strong> SPI for executing Pkl code with different Pkl distributions.\n *\n * <p>CAUTION: Every class X under `spi` MUST adhere to the following rules:\n *\n * <ol>\n *   <li>X MUST live in a versioned subpackage (v1, v2, etc.).\n *   <li>Any change made to X MUST be binary compatible.\n *   <li>X MUST only use classes from its own package and Java platform packages.\n * </ol>\n */\npackage org.pkl.executor.spi;\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/spi/v1/ExecutorSpi.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor.spi.v1;\n\nimport java.nio.file.Path;\n\npublic interface ExecutorSpi {\n  String getPklVersion();\n\n  /**\n   * Evaluation the Pkl module with the given path, returning the module's output.\n   *\n   * <p>If evaluation fails, throws {@link ExecutorSpiException} with a descriptive message.\n   */\n  String evaluatePath(Path modulePath, ExecutorSpiOptions options);\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/spi/v1/ExecutorSpiException.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor.spi.v1;\n\npublic final class ExecutorSpiException extends RuntimeException {\n  public ExecutorSpiException(String message, Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/spi/v1/ExecutorSpiOptions.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor.spi.v1;\n\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.List;\nimport java.util.Map;\n\npublic class ExecutorSpiOptions {\n  private final List<String> allowedModules;\n\n  private final List<String> allowedResources;\n\n  private final Map<String, String> environmentVariables;\n\n  private final Map<String, String> externalProperties;\n\n  private final List<Path> modulePath;\n\n  private final Path rootDir;\n\n  private final Duration timeout;\n\n  private final String outputFormat;\n  private final Path moduleCacheDir;\n  private final Path projectDir;\n\n  public ExecutorSpiOptions(\n      List<String> allowedModules,\n      List<String> allowedResources,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      List<Path> modulePath,\n      /* @Nullable */ Path rootDir,\n      /* @Nullable */ Duration timeout,\n      /* @Nullable */ String outputFormat,\n      /* @Nullable */ Path moduleCacheDir,\n      /* @Nullable */ Path projectDir) {\n\n    this.allowedModules = allowedModules;\n    this.allowedResources = allowedResources;\n    this.environmentVariables = environmentVariables;\n    this.externalProperties = externalProperties;\n    this.modulePath = modulePath;\n    this.rootDir = rootDir;\n    this.timeout = timeout;\n    this.outputFormat = outputFormat;\n    this.moduleCacheDir = moduleCacheDir;\n    this.projectDir = projectDir;\n  }\n\n  public List<String> getAllowedModules() {\n    return allowedModules;\n  }\n\n  public List<String> getAllowedResources() {\n    return allowedResources;\n  }\n\n  public Map<String, String> getEnvironmentVariables() {\n    return environmentVariables;\n  }\n\n  public Map<String, String> getExternalProperties() {\n    return externalProperties;\n  }\n\n  public List<Path> getModulePath() {\n    return modulePath;\n  }\n\n  public /* @Nullable */ Path getRootDir() {\n    return rootDir;\n  }\n\n  public /* @Nullable */ Duration getTimeout() {\n    return timeout;\n  }\n\n  public /* @Nullable */ String getOutputFormat() {\n    return outputFormat;\n  }\n\n  public /* @Nullable */ Path getModuleCacheDir() {\n    return moduleCacheDir;\n  }\n\n  public Path getProjectDir() {\n    return projectDir;\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/spi/v1/ExecutorSpiOptions2.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor.spi.v1;\n\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.List;\nimport java.util.Map;\n\npublic class ExecutorSpiOptions2 extends ExecutorSpiOptions {\n  private final List<Path> certificateFiles;\n\n  private final List<byte[]> certificateBytes;\n\n  private final int testPort;\n\n  public ExecutorSpiOptions2(\n      List<String> allowedModules,\n      List<String> allowedResources,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      List<Path> modulePath,\n      Path rootDir,\n      Duration timeout,\n      String outputFormat,\n      Path moduleCacheDir,\n      Path projectDir,\n      List<Path> certificateFiles,\n      List<byte[]> certificateBytes,\n      int testPort) {\n    super(\n        allowedModules,\n        allowedResources,\n        environmentVariables,\n        externalProperties,\n        modulePath,\n        rootDir,\n        timeout,\n        outputFormat,\n        moduleCacheDir,\n        projectDir);\n    this.certificateFiles = certificateFiles;\n    this.certificateBytes = certificateBytes;\n    this.testPort = testPort;\n  }\n\n  public List<Path> getCertificateFiles() {\n    return certificateFiles;\n  }\n\n  public List<byte[]> getCertificateBytes() {\n    return certificateBytes;\n  }\n\n  public int getTestPort() {\n    return testPort;\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/main/java/org/pkl/executor/spi/v1/ExecutorSpiOptions3.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor.spi.v1;\n\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.time.Duration;\nimport java.util.List;\nimport java.util.Map;\n\npublic class ExecutorSpiOptions3 extends ExecutorSpiOptions2 {\n\n  private final Map<URI, URI> httpRewrites;\n\n  public ExecutorSpiOptions3(\n      List<String> allowedModules,\n      List<String> allowedResources,\n      Map<String, String> environmentVariables,\n      Map<String, String> externalProperties,\n      List<Path> modulePath,\n      Path rootDir,\n      Duration timeout,\n      String outputFormat,\n      Path moduleCacheDir,\n      Path projectDir,\n      List<Path> certificateFiles,\n      List<byte[]> certificateBytes,\n      int testPort,\n      Map<URI, URI> httpRewrites) {\n    super(\n        allowedModules,\n        allowedResources,\n        environmentVariables,\n        externalProperties,\n        modulePath,\n        rootDir,\n        timeout,\n        outputFormat,\n        moduleCacheDir,\n        projectDir,\n        certificateFiles,\n        certificateBytes,\n        testPort);\n    this.httpRewrites = httpRewrites;\n  }\n\n  public Map<URI, URI> getHttpRewrites() {\n    return httpRewrites;\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/test/kotlin/org/pkl/executor/EmbeddedExecutorTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor\n\nimport java.io.File\nimport java.net.URI\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport java.time.Duration\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.exists\nimport kotlin.io.path.writeText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.assertThatCode\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.condition.DisabledOnOs\nimport org.junit.jupiter.api.condition.OS\nimport org.junit.jupiter.api.io.TempDir\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.FilteringClassLoader\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.commons.toPath\nimport org.pkl.core.Release\n\nclass EmbeddedExecutorTest {\n  /**\n   * An executor that uses a particular combination of ExecutorSpiOptions version, pkl-executor\n   * version, and Pkl distribution version.\n   */\n  class TestExecutor(\n    private val executor: Executor,\n    private val spiOptionsVersion: Int,\n    private val name: String,\n  ) {\n    fun evaluatePath(modulePath: Path, optionSpec: ExecutorOptions.Builder.() -> Unit): String {\n      val options =\n        ExecutorOptions.builder().apply(optionSpec).spiOptionsVersion(spiOptionsVersion).build()\n      return executor.evaluatePath(modulePath, options)\n    }\n\n    override fun toString(): String = name\n  }\n\n  companion object {\n    @JvmStatic\n    private val allTestExecutors: List<TestExecutor> by lazy {\n      listOf(\n        TestExecutor(executor1_1.value, 1, \"SpiOptions1, Executor1, Distribution1\"),\n\n        // This context has a pkl-executor version that is lower than the distribution version.\n        TestExecutor(executor1_2.value, 1, \"SpiOptions1, Executor1, Distribution2\"),\n        TestExecutor(executor2_1.value, 1, \"SpiOptions1, Executor2, Distribution1\"),\n        TestExecutor(executor2_1.value, 3, \"SpiOptions3, Executor2, Distribution1\"),\n        TestExecutor(executor2_2.value, 1, \"SpiOptions1, Executor2, Distribution2\"),\n        TestExecutor(executor2_2.value, 3, \"SpiOptions3, Executor2, Distribution2\"),\n      )\n    }\n\n    private val currentExecutor: TestExecutor by lazy {\n      TestExecutor(executor2_2.value, -1, \"currentExecutor\")\n    }\n\n    // A pkl-executor library that supports ExecutorSpiOptions up to v1\n    // and a Pkl distribution that supports ExecutorSpiOptions up to v1.\n    private val executor1_1: Lazy<Executor> = lazy {\n      EmbeddedExecutor(listOf(pklDistribution1), pklExecutorClassLoader1)\n    }\n\n    // A pkl-executor library that supports ExecutorSpiOptions up to v1\n    // and a Pkl distribution that supports ExecutorSpiOptions up to v3.\n    private val executor1_2: Lazy<Executor> = lazy {\n      EmbeddedExecutor(listOf(pklDistribution2), pklExecutorClassLoader1)\n    }\n\n    // A pkl-executor library that supports ExecutorSpiOptions up to v3\n    // and a Pkl distribution that supports ExecutorSpiOptions up to v1.\n    private val executor2_1: Lazy<Executor> = lazy {\n      EmbeddedExecutor(listOf(pklDistribution1), pklExecutorClassLoader2)\n    }\n\n    // A pkl-executor library that supports ExecutorSpiOptions up to v3\n    // and a Pkl distribution that supports ExecutorSpiOptions up to v3.\n    private val executor2_2: Lazy<Executor> = lazy {\n      EmbeddedExecutor(listOf(pklDistribution2), pklExecutorClassLoader2)\n    }\n\n    private val allExecutors by lazy { listOf(executor1_1, executor1_2, executor2_1, executor2_2) }\n\n    // a pkl-executor class loader that supports ExecutorSpiOptions up to v1\n    private val pklExecutorClassLoader1: ClassLoader by lazy {\n      FilteringClassLoader(pklExecutorClassLoader2) { className ->\n        !className.matches(Regex(\".*ExecutorSpiOptions\\\\d+$\"))\n      }\n    }\n\n    // a pkl-executor class loader that supports ExecutorSpiOptions up to v3\n    private val pklExecutorClassLoader2: ClassLoader by lazy {\n      EmbeddedExecutor::class.java.classLoader\n    }\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      for (executor in allExecutors) {\n        if (executor.isInitialized()) executor.value.close()\n      }\n    }\n\n    // a Pkl distribution that supports ExecutorSpiOptions up to v1\n    private val pklDistribution1: Path by lazy {\n      FileTestUtils.rootProjectDir\n        .resolve(\"pkl-executor/build/pklHistoricalDistributions/pkl-config-java-all-0.25.0.jar\")\n        .apply { if (!exists()) missingTestFixture() }\n    }\n\n    // a Pkl distribution that supports ExecutorSpiOptions up to v3\n    private val pklDistribution2: Path by lazy {\n      FileTestUtils.rootProjectDir\n        .resolve(\n          \"pkl-config-java/build/libs/pkl-config-java-all-\" +\n            \"${Release.current().version().withBuild(null).toString().replaceFirst(\"dev\", \"SNAPSHOT\")}.jar\"\n        )\n        .apply { if (!exists()) missingTestFixture() }\n    }\n\n    private fun missingTestFixture(): Nothing =\n      throw AssertionError(\n        \"Missing test fixture. \" + \"To fix this problem, run `./gradlew :pkl-executor:prepareTest`.\"\n      )\n  }\n\n  @Test\n  fun extractMinPklVersion() {\n    assertThat(\n        EmbeddedExecutor.extractMinPklVersion(\n          \"\"\"\n      @ModuleInfo { minPklVersion = \"1.2.3\" }\n    \"\"\"\n            .trimIndent()\n        )\n      )\n      .isEqualTo(Version.parse(\"1.2.3\"))\n\n    assertThat(\n        EmbeddedExecutor.extractMinPklVersion(\n          \"\"\"\n      @ModuleInfo{minPklVersion=\"1.2.3\"}\n    \"\"\"\n            .trimIndent()\n        )\n      )\n      .isEqualTo(Version.parse(\"1.2.3\"))\n\n    assertThat(\n        EmbeddedExecutor.extractMinPklVersion(\n          \"\"\"\n      @ModuleInfo   {   minPklVersion   =   \"1.2.3\"   }\n    \"\"\"\n            .trimIndent()\n        )\n      )\n      .isEqualTo(Version.parse(\"1.2.3\"))\n\n    assertThat(\n        EmbeddedExecutor.extractMinPklVersion(\n          \"\"\"\n      @ModuleInfo {\n          minPklVersion = \"1.2.3\"\n      }\n    \"\"\"\n            .trimIndent()\n        )\n      )\n      .isEqualTo(Version.parse(\"1.2.3\"))\n\n    assertThat(\n        EmbeddedExecutor.extractMinPklVersion(\n          \"\"\"\n      @ModuleInfo {\n          author = \"foo@bar.apple.com\"\n          minPklVersion = \"1.2.3\"\n      }\n    \"\"\"\n            .trimIndent()\n        )\n      )\n      .isEqualTo(Version.parse(\"1.2.3\"))\n\n    assertThat(\n        EmbeddedExecutor.extractMinPklVersion(\n          \"\"\"\n      @ModuleInfo {\n          minPklVersion = \"1.2.3\"\n          author = \"foo@bar.apple.com\"\n      }\n    \"\"\"\n            .trimIndent()\n        )\n      )\n      .isEqualTo(Version.parse(\"1.2.3\"))\n  }\n\n  @Test\n  fun `create embedded executor with non-existing Pkl distribution`() {\n    val e =\n      assertThrows<IllegalArgumentException> {\n        Executors.embedded(listOf(\"/non/existing\".toPath()))\n      }\n\n    val sep = File.separatorChar\n    assertThat(e.message).contains(\"Cannot find Jar file\").contains(\"${sep}non${sep}existing\")\n  }\n\n  @Test\n  fun `create embedded executor with invalid Pkl distribution that is not a Jar file`(\n    @TempDir tempDir: Path\n  ) {\n    val file = Files.createFile(tempDir.resolve(\"pkl.jar\"))\n    val e = assertThrows<IllegalArgumentException> { Executors.embedded(listOf(file)) }\n\n    assertThat(e.message).contains(\"Cannot find service\").contains(\"pkl.jar\")\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `evaluate a module that is missing a ModuleInfo annotation`(\n    executor: TestExecutor,\n    @TempDir tempDir: Path,\n  ) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      module test\n\n      x = 1\n    \"\"\"\n          .trimIndent()\n      )\n\n    val e =\n      assertThrows<ExecutorException> {\n        executor.evaluatePath(pklFile) {\n          allowedModules(\"file:\")\n          allowedResources(\"prop:\")\n          rootDir(tempDir)\n        }\n      }\n\n    assertThat(e.message)\n      .contains(\"Pkl module `test.pkl` does not state which Pkl version it requires.\")\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `evaluate a module that requests an incompatible Pkl version`(\n    executor: TestExecutor,\n    @TempDir tempDir: Path,\n  ) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"99.99.99\" }\n      module test\n\n      x = 1\n    \"\"\"\n          .trimIndent()\n      )\n\n    val e =\n      assertThrows<ExecutorException> {\n        executor.evaluatePath(pklFile) {\n          allowedModules(\"file:\")\n          allowedResources(\"prop:\")\n          rootDir(tempDir)\n        }\n      }\n\n    assertThat(e.message)\n      .contains(\"Pkl version `99.99.99` requested by module `test.pkl` is not supported.\")\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `evaluate a module that reads environment variables and external properties`(\n    executor: TestExecutor,\n    @TempDir tempDir: Path,\n  ) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"0.11.0\" }\n      module test\n\n      x = read(\"env:ENV_VAR\")\n      y = read(\"prop:property\")\n    \"\"\"\n          .trimIndent()\n      )\n\n    val result =\n      executor.evaluatePath(pklFile) {\n        allowedModules(\"file:\")\n        // should `prop:pkl.outputFormat` be allowed automatically?\n        allowedResources(\"prop:\", \"env:\")\n        environmentVariables(mapOf(\"ENV_VAR\" to \"ENV_VAR\"))\n        externalProperties(mapOf(\"property\" to \"property\"))\n      }\n\n    assertThat(result.trim())\n      .isEqualTo(\n        \"\"\"\n      x = \"ENV_VAR\"\n      y = \"property\"\n    \"\"\"\n          .trimIndent()\n          .trim()\n      )\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `evaluate a module that depends on another module`(\n    executor: TestExecutor,\n    @TempDir tempDir: Path,\n  ) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"0.11.0\" }\n      amends \"template.pkl\"\n\n      foo {\n        bar = 42\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    val templateFile = tempDir.resolve(\"template.pkl\")\n    templateFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      foo: Foo\n\n      class Foo {\n        bar: Int\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    val result =\n      executor.evaluatePath(pklFile) {\n        allowedModules(\"file:\")\n        allowedResources(\"prop:\")\n      }\n\n    assertThat(result.trim())\n      .isEqualTo(\n        \"\"\"\n      foo {\n        bar = 42\n      }\n    \"\"\"\n          .trimIndent()\n          .trim()\n      )\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `evaluate a module whose evaluation fails`(executor: TestExecutor, @TempDir tempDir: Path) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"0.11.0\" }\n      module test\n\n      foo = throw(\"ouch\")\n    \"\"\"\n          .trimIndent()\n      )\n\n    val e =\n      assertThrows<ExecutorException> {\n        executor.evaluatePath(pklFile) {\n          allowedModules(\"file:\")\n          allowedResources(\"prop:\")\n          rootDir(tempDir)\n        }\n      }\n\n    assertThat(e.message)\n      .contains(\"ouch\")\n      // ensure module file paths are relativized\n      .contains(\"at test#foo (test.pkl)\")\n      .doesNotContain(tempDir.toString())\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `evaluate a module whose project evaluation fails`(\n    executor: TestExecutor,\n    @TempDir tempDir: Path,\n  ) {\n    // the toRealPath is important here or the failure reason can change\n    // this happens on macOS where /tmp is a symlink to /private/tmp\n    // it's related to how SecurityManagers.Standard handles canonicalizing paths that don't exist\n    val rootDir = tempDir.toRealPath()\n\n    val innerDir = rootDir.resolve(\"inner\").createDirectories()\n    innerDir\n      .resolve(\"PklProject\")\n      .toFile()\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n      dependencies {\n        [\"myDep\"] = import(\"../nonexistent/PklProject\")\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    val pklFile = innerDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"0.11.0\" }\n      module test\n\n      foo = \"bar\"\n    \"\"\"\n          .trimIndent()\n      )\n\n    val e =\n      assertThrows<ExecutorException> {\n        executor.evaluatePath(pklFile) {\n          allowedModules(\"file:\", \"pkl:\")\n          allowedResources(\"prop:\")\n          projectDir(innerDir)\n          rootDir(rootDir)\n        }\n      }\n\n    assertThat(e.message).contains(\"Cannot find module\").contains(\"/nonexistent/PklProject\")\n\n    // ensure module file paths are relativized\n    // legacy distribution does not handle these errors with the correct stack frame transformer\n    // only assert on this for newer distributions\n    if (!executor.toString().contains(\"Distribution1\")) {\n      assertThat(e.message).doesNotContain(innerDir.toString())\n    }\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  fun `time out a module`(executor: TestExecutor, @TempDir tempDir: Path) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"0.11.0\" }\n      module test\n\n      x = fib(100)\n\n      function fib(n) = if (n < 2) n else fib(n - 1) + fib(n - 2)\n    \"\"\"\n          .trimIndent()\n      )\n\n    val e =\n      assertThrows<ExecutorException> {\n        executor.evaluatePath(pklFile) {\n          allowedModules(\"file:\")\n          allowedResources(\"prop:\")\n          rootDir(tempDir)\n          timeout(Duration.ofSeconds(1))\n        }\n      }\n\n    assertThat(e.message).contains(\"Evaluation timed out after 1 second(s).\")\n  }\n\n  @Test\n  fun `evaluate a module that loads a package`(@TempDir tempDir: Path) {\n    val cacheDir = tempDir.resolve(\"cache\")\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n      @ModuleInfo { minPklVersion = \"0.24.0\" }\n      module MyModule\n\n      import \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\n\n      chirpy = new Bird { name = \"Chirpy\"; favoriteFruit { name = \"Orange\" } }\n    \"\"\"\n          .trimIndent()\n      )\n    val result =\n      PackageServer().use { server ->\n        currentExecutor.evaluatePath(pklFile) {\n          allowedModules(\"file:\", \"package:\", \"https:\")\n          allowedResources(\"prop:\", \"package:\", \"https:\")\n          moduleCacheDir(cacheDir)\n          certificateFiles(FileTestUtils.selfSignedCertificate)\n          testPort(server.port)\n        }\n      }\n    assertThat(result.trim())\n      .isEqualTo(\n        \"\"\"\n      chirpy {\n        name = \"Chirpy\"\n        favoriteFruit {\n          name = \"Orange\"\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n\n    // verify that cache was populated\n    assertThat(cacheDir.toFile().list()).isNotEmpty()\n  }\n\n  @Test\n  fun `http rewrites option`(@TempDir tempDir: Path) {\n    val pklFile = tempDir.resolve(\"test.pkl\")\n    pklFile.writeText(\n      \"\"\"\n      @ModuleInfo { minPklVersion = \"0.29.0\" }\n      result = import(\"https://example.com/foo.pkl\")\n    \"\"\"\n        .trimIndent()\n    )\n    assertThatCode {\n        currentExecutor.evaluatePath(pklFile) {\n          allowedModules(\"file:\", \"https:\")\n          allowedResources(\"prop:\")\n          httpRewrites(mapOf(URI(\"https://example.com/\") to URI(\"https://example.example/\")))\n        }\n      }\n      .hasMessageContaining(\n        \"Error connecting to host `example.example`. (request was rewritten: https://example.com/foo.pkl -> https://example.example/foo.pkl)\"\n      )\n  }\n\n  @ParameterizedTest\n  @MethodSource(\"getAllTestExecutors\")\n  @DisabledOnOs(OS.WINDOWS, disabledReason = \"Can't populate legacy cache dir on Windows\")\n  fun `evaluate a project dependency`(executor: TestExecutor, @TempDir tempDir: Path) {\n    val cacheDir = tempDir.resolve(\"packages\")\n    PackageServer.populateCacheDir(cacheDir)\n    PackageServer.populateLegacyCacheDir(cacheDir)\n    val projectDir = tempDir.resolve(\"project/\")\n    projectDir.createDirectories()\n    projectDir\n      .resolve(\"PklProject\")\n      .toFile()\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n      \n      dependencies {\n        [\"birds\"] { uri = \"package://localhost:0/birds@0.5.0\" }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    val dollar = '$'\n    projectDir\n      .resolve(\"PklProject.deps.json\")\n      .toFile()\n      .writeText(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${dollar}skipChecksumVerification\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n            \"checksums\": {\n              \"sha256\": \"${dollar}skipChecksumVerification\"\n            }\n          }\n        }\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    val pklFile = projectDir.resolve(\"test.pkl\")\n    pklFile\n      .toFile()\n      .writeText(\n        \"\"\"\n        @ModuleInfo { minPklVersion = \"0.24.0\" }\n        module myModule\n        \n        import \"@birds/catalog/Swallow.pkl\"\n        \n        result = Swallow\n      \"\"\"\n          .trimIndent()\n      )\n    val result =\n      executor.evaluatePath(pklFile) {\n        allowedModules(\"file:\", \"package:\", \"projectpackage:\", \"https:\", \"pkl:\")\n        allowedResources(\"file:\", \"prop:\", \"package:\", \"projectpackage:\", \"https:\")\n        moduleCacheDir(cacheDir)\n        projectDir(projectDir)\n      }\n    assertThat(result)\n      .isEqualTo(\n        \"\"\"\n      result {\n        name = \"Swallow\"\n        favoriteFruit {\n          name = \"Apple\"\n        }\n      }\n      \n    \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-executor/src/test/kotlin/org/pkl/executor/VersionTest.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.executor\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\n// copied from `org.pkl.core.VersionTest`\nclass VersionTest {\n  @Test\n  fun `parse release version`() {\n    val version = Version.parse(\"1.2.3\")\n    assertThat(version.major).isEqualTo(1)\n    assertThat(version.minor).isEqualTo(2)\n    assertThat(version.patch).isEqualTo(3)\n    assertThat(version.preRelease).isNull()\n    assertThat(version.build).isNull()\n  }\n\n  @Test\n  fun `parse snapshot version`() {\n    val version = Version.parse(\"1.2.3-SNAPSHOT+build-123\")\n    assertThat(version.major).isEqualTo(1)\n    assertThat(version.minor).isEqualTo(2)\n    assertThat(version.patch).isEqualTo(3)\n    assertThat(version.preRelease).isEqualTo(\"SNAPSHOT\")\n    assertThat(version.build).isEqualTo(\"build-123\")\n  }\n\n  @Test\n  fun `parse beta version`() {\n    val version = Version.parse(\"1.2.3-beta.1+build-123\")\n    assertThat(version.major).isEqualTo(1)\n    assertThat(version.minor).isEqualTo(2)\n    assertThat(version.patch).isEqualTo(3)\n    assertThat(version.preRelease).isEqualTo(\"beta.1\")\n    assertThat(version.build).isEqualTo(\"build-123\")\n  }\n\n  @Test\n  fun `parse invalid version`() {\n    assertThat(Version.parseOrNull(\"not a version number\")).isNull()\n\n    assertThrows<IllegalArgumentException> { Version.parse(\"not a version number\") }\n  }\n\n  @Test\n  fun `parse too large version`() {\n    assertThrows<IllegalArgumentException> { Version.parse(\"not a version number\") }\n\n    assertThrows<IllegalArgumentException> { Version.parse(\"999999999999999.0.0\") }\n  }\n\n  @Test\n  fun toNormal() {\n    val stripped = Version.parse(\"1.2.3\")\n    assertThat(Version.parse(\"1.2.3-beta-1+build-123\").toNormal()).isEqualTo(stripped)\n    assertThat(Version.parse(\"1.2.3-beta-1\").toNormal()).isEqualTo(stripped)\n    assertThat(Version.parse(\"1.2.3\").toNormal()).isEqualTo(stripped)\n  }\n\n  @Test\n  fun withMethods() {\n    val version =\n      Version.parse(\"0.0.0\")\n        .withMajor(1)\n        .withMinor(2)\n        .withPatch(3)\n        .withPreRelease(\"rc.1\")\n        .withBuild(\"456.789\")\n\n    assertThat(version).isEqualTo(Version.parse(\"1.2.3-rc.1+456.789\"))\n\n    val version2 =\n      Version.parse(\"0.0.0\")\n        .withBuild(\"456.789\")\n        .withPreRelease(\"rc.1\")\n        .withPatch(3)\n        .withMinor(2)\n        .withMajor(1)\n\n    assertThat(version2).isEqualTo(version)\n  }\n\n  @Test\n  fun `compareTo()`() {\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 2, 3, null, null))).isEqualTo(0)\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null).compareTo(Version(1, 2, 3, \"SNAPSHOT\", null)))\n      .isEqualTo(0)\n    assertThat(Version(1, 2, 3, \"alpha\", null).compareTo(Version(1, 2, 3, \"alpha\", null)))\n      .isEqualTo(0)\n    assertThat(Version(1, 2, 3, \"alpha\", null).compareTo(Version(1, 2, 3, \"alpha\", \"build123\")))\n      .isEqualTo(0)\n\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(2, 2, 3, null, null))).isLessThan(0)\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 3, 3, null, null))).isLessThan(0)\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 2, 4, null, null))).isLessThan(0)\n\n    assertThat(Version(2, 2, 3, null, null).compareTo(Version(1, 2, 3, null, null)))\n      .isGreaterThan(0)\n    assertThat(Version(1, 3, 3, null, null).compareTo(Version(1, 2, 3, null, null)))\n      .isGreaterThan(0)\n    assertThat(Version(1, 2, 4, null, null).compareTo(Version(1, 2, 3, null, null)))\n      .isGreaterThan(0)\n\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null).compareTo(Version(1, 2, 3, null, null)))\n      .isLessThan(0)\n    assertThat(Version(1, 2, 3, \"alpha\", null).compareTo(Version(1, 2, 3, \"beta\", null)))\n      .isLessThan(0)\n    assertThat(Version(1, 2, 3, \"alpha\", \"build123\").compareTo(Version(1, 2, 3, \"beta\", null)))\n      .isLessThan(0)\n\n    assertThat(Version(1, 2, 3, null, null).compareTo(Version(1, 2, 3, \"SNAPSHOT\", null)))\n      .isGreaterThan(0)\n    assertThat(Version(1, 2, 3, \"beta\", null).compareTo(Version(1, 2, 3, \"alpha\", \"build123\")))\n      .isGreaterThan(0)\n  }\n\n  @Test\n  fun `compare version with too large numeric pre-release identifier`() {\n    // error is deferred until compareTo(), but should be good enough\n    assertThrows<IllegalArgumentException> {\n      Version(1, 2, 3, \"999\", null).compareTo(Version(1, 2, 3, \"9999999999999999999\", null))\n    }\n  }\n\n  @Test\n  fun `equals()`() {\n    assertThat(Version(1, 2, 3, null, null)).isEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null)).isEqualTo(Version(1, 2, 3, \"SNAPSHOT\", null))\n    assertThat(Version(1, 2, 3, \"alpha\", null)).isEqualTo(Version(1, 2, 3, \"alpha\", null))\n    assertThat(Version(1, 2, 3, \"beta\", \"build123\")).isEqualTo(Version(1, 2, 3, \"beta\", \"build456\"))\n\n    assertThat(Version(1, 3, 3, null, null)).isNotEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 4, null, null)).isNotEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null)).isNotEqualTo(Version(1, 2, 3, null, null))\n    assertThat(Version(1, 2, 3, \"beta\", null)).isNotEqualTo(Version(1, 2, 3, \"alpha\", null))\n  }\n\n  @Test\n  fun `hashCode()`() {\n    assertThat(Version(1, 2, 3, null, null).hashCode())\n      .isEqualTo(Version(1, 2, 3, null, null).hashCode())\n    assertThat(Version(1, 2, 3, \"SNAPSHOT\", null).hashCode())\n      .isEqualTo(Version(1, 2, 3, \"SNAPSHOT\", null).hashCode())\n    assertThat(Version(1, 2, 3, \"alpha\", null).hashCode())\n      .isEqualTo(Version(1, 2, 3, \"alpha\", null).hashCode())\n    assertThat(Version(1, 2, 3, \"alpha\", \"build123\").hashCode())\n      .isEqualTo(Version(1, 2, 3, \"alpha\", \"build456\").hashCode())\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-formatter/pkl-formatter.gradle.kts",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklKotlinLibrary\n  pklPublishLibrary\n}\n\ndependencies {\n  api(projects.pklParser)\n\n  testImplementation(projects.pklCommonsTest)\n}\n\ntasks.test {\n  inputs\n    .dir(\"src/test/files/FormatterSnippetTests/input\")\n    .withPropertyName(\"formatterSnippetTestsInput\")\n    .withPathSensitivity(PathSensitivity.RELATIVE)\n  inputs\n    .dir(\"src/test/files/FormatterSnippetTests/output\")\n    .withPropertyName(\"formatterSnippetTestsOutput\")\n    .withPathSensitivity(PathSensitivity.RELATIVE)\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-formatter\")\n        description.set(\"Formatter for Pkl\")\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/main/kotlin/org/pkl/formatter/Builder.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\nimport java.util.EnumSet\nimport kotlin.collections.withIndex\nimport org.pkl.formatter.ast.Empty\nimport org.pkl.formatter.ast.ForceLine\nimport org.pkl.formatter.ast.FormatNode\nimport org.pkl.formatter.ast.Group\nimport org.pkl.formatter.ast.IfWrap\nimport org.pkl.formatter.ast.Indent\nimport org.pkl.formatter.ast.Line\nimport org.pkl.formatter.ast.MultilineStringGroup\nimport org.pkl.formatter.ast.Nodes\nimport org.pkl.formatter.ast.Space\nimport org.pkl.formatter.ast.SpaceOrLine\nimport org.pkl.formatter.ast.Text\nimport org.pkl.parser.syntax.Operator\nimport org.pkl.parser.syntax.generic.Node\nimport org.pkl.parser.syntax.generic.NodeType\n\ninternal class Builder(sourceText: String, private val grammarVersion: GrammarVersion) {\n  private var id: Int = 0\n  private val source: CharArray = sourceText.toCharArray()\n  private var noNewlines = false\n\n  fun format(node: Node): FormatNode =\n    when (node.type) {\n      NodeType.MODULE -> formatModule(node)\n      NodeType.DOC_COMMENT -> Nodes(formatGeneric(node.children, null))\n      NodeType.DOC_COMMENT_LINE -> formatDocComment(node)\n      NodeType.LINE_COMMENT,\n      NodeType.BLOCK_COMMENT,\n      NodeType.TERMINAL,\n      NodeType.MODIFIER,\n      NodeType.IDENTIFIER,\n      NodeType.STRING_CHARS,\n      NodeType.STRING_ESCAPE,\n      NodeType.INT_LITERAL_EXPR,\n      NodeType.FLOAT_LITERAL_EXPR,\n      NodeType.BOOL_LITERAL_EXPR,\n      NodeType.THIS_EXPR,\n      NodeType.OUTER_EXPR,\n      NodeType.MODULE_EXPR,\n      NodeType.NULL_EXPR,\n      NodeType.MODULE_TYPE,\n      NodeType.UNKNOWN_TYPE,\n      NodeType.NOTHING_TYPE,\n      NodeType.SHEBANG,\n      NodeType.OPERATOR -> Text(node.text(source))\n      NodeType.STRING_NEWLINE -> mustForceLine()\n      NodeType.MODULE_DECLARATION -> formatModuleDeclaration(node)\n      NodeType.MODULE_DEFINITION -> formatModuleDefinition(node)\n      NodeType.SINGLE_LINE_STRING_LITERAL_EXPR -> formatSingleLineString(node)\n      NodeType.MULTI_LINE_STRING_LITERAL_EXPR -> formatMultilineString(node)\n      NodeType.ANNOTATION -> formatAnnotation(node)\n      NodeType.TYPEALIAS -> formatTypealias(node)\n      NodeType.TYPEALIAS_HEADER -> formatTypealiasHeader(node)\n      NodeType.TYPEALIAS_BODY -> formatTypealiasBody(node)\n      NodeType.MODIFIER_LIST -> formatModifierList(node)\n      NodeType.PARAMETER_LIST -> formatParameterList(node)\n      NodeType.PARAMETER_LIST_ELEMENTS -> formatParameterListElements(node)\n      NodeType.TYPE_PARAMETER_LIST -> formatTypeParameterList(node)\n      NodeType.TYPE_PARAMETER_LIST_ELEMENTS -> formatParameterListElements(node)\n      NodeType.TYPE_PARAMETER -> Group(newId(), formatGeneric(node.children, spaceOrLine()))\n      NodeType.PARAMETER -> formatParameter(node)\n      NodeType.EXTENDS_CLAUSE,\n      NodeType.AMENDS_CLAUSE -> formatAmendsExtendsClause(node)\n      NodeType.IMPORT_LIST -> formatImportList(node)\n      NodeType.IMPORT -> formatImport(node)\n      NodeType.IMPORT_ALIAS -> Group(newId(), formatGeneric(node.children, spaceOrLine()))\n      NodeType.CLASS -> formatClass(node)\n      NodeType.CLASS_HEADER -> formatClassHeader(node)\n      NodeType.CLASS_HEADER_EXTENDS -> formatClassHeaderExtends(node)\n      NodeType.CLASS_BODY -> formatClassBody(node)\n      NodeType.CLASS_BODY_ELEMENTS -> formatClassBodyElements(node)\n      NodeType.CLASS_PROPERTY,\n      NodeType.OBJECT_PROPERTY,\n      NodeType.OBJECT_ENTRY -> formatClassProperty(node)\n      NodeType.CLASS_PROPERTY_HEADER,\n      NodeType.OBJECT_PROPERTY_HEADER -> formatClassPropertyHeader(node)\n      NodeType.CLASS_PROPERTY_HEADER_BEGIN,\n      NodeType.OBJECT_PROPERTY_HEADER_BEGIN -> formatClassPropertyHeaderBegin(node)\n      NodeType.CLASS_PROPERTY_BODY,\n      NodeType.OBJECT_PROPERTY_BODY -> formatClassPropertyBody(node)\n      NodeType.CLASS_METHOD,\n      NodeType.OBJECT_METHOD -> formatClassMethod(node)\n      NodeType.CLASS_METHOD_HEADER -> formatClassMethodHeader(node)\n      NodeType.CLASS_METHOD_BODY -> formatClassMethodBody(node)\n      NodeType.OBJECT_BODY -> formatObjectBody(node)\n      NodeType.OBJECT_ELEMENT -> format(node.children[0]) // has a single element\n      NodeType.OBJECT_ENTRY_HEADER -> formatObjectEntryHeader(node)\n      NodeType.FOR_GENERATOR -> formatForGenerator(node)\n      NodeType.FOR_GENERATOR_HEADER -> formatForGeneratorHeader(node)\n      NodeType.FOR_GENERATOR_HEADER_DEFINITION -> formatForGeneratorHeaderDefinition(node)\n      NodeType.FOR_GENERATOR_HEADER_DEFINITION_HEADER ->\n        formatForGeneratorHeaderDefinitionHeader(node)\n      NodeType.WHEN_GENERATOR -> formatWhenGenerator(node)\n      NodeType.WHEN_GENERATOR_HEADER -> formatWhenGeneratorHeader(node)\n      NodeType.OBJECT_SPREAD -> Nodes(formatGeneric(node.children, null))\n      NodeType.MEMBER_PREDICATE -> formatMemberPredicate(node)\n      NodeType.QUALIFIED_IDENTIFIER -> formatQualifiedIdentifier(node)\n      NodeType.ARGUMENT_LIST -> formatArgumentList(node)\n      NodeType.ARGUMENT_LIST_ELEMENTS -> formatArgumentListElements(node)\n      NodeType.OBJECT_PARAMETER_LIST -> formatObjectParameterList(node)\n      NodeType.IF_EXPR -> formatIf(node)\n      NodeType.IF_HEADER -> formatIfHeader(node)\n      NodeType.IF_CONDITION -> formatIfCondition(node)\n      NodeType.IF_CONDITION_EXPR -> Indent(formatGeneric(node.children, null))\n      NodeType.IF_THEN_EXPR -> formatIfThen(node)\n      NodeType.IF_ELSE_EXPR -> formatIfElse(node)\n      NodeType.NEW_EXPR,\n      NodeType.AMENDS_EXPR -> formatNewExpr(node)\n      NodeType.NEW_HEADER -> formatNewHeader(node)\n      NodeType.UNQUALIFIED_ACCESS_EXPR -> formatUnqualifiedAccessExpression(node)\n      NodeType.QUALIFIED_ACCESS_EXPR -> formatQualifiedAccessExpression(node)\n      NodeType.BINARY_OP_EXPR -> formatBinaryOpExpr(node)\n      NodeType.FUNCTION_LITERAL_EXPR -> formatFunctionLiteralExpr(node)\n      NodeType.FUNCTION_LITERAL_BODY -> formatFunctionLiteralBody(node)\n      NodeType.SUBSCRIPT_EXPR,\n      NodeType.SUPER_SUBSCRIPT_EXPR -> formatSubscriptExpr(node)\n      NodeType.TRACE_EXPR -> formatTraceThrowReadExpr(node)\n      NodeType.THROW_EXPR -> formatTraceThrowReadExpr(node)\n      NodeType.READ_EXPR -> formatTraceThrowReadExpr(node)\n      NodeType.NON_NULL_EXPR -> Nodes(formatGeneric(node.children, null))\n      NodeType.SUPER_ACCESS_EXPR -> Nodes(formatGeneric(node.children, null))\n      NodeType.PARENTHESIZED_EXPR -> formatParenthesizedExpr(node)\n      NodeType.PARENTHESIZED_EXPR_ELEMENTS -> formatParenthesizedExprElements(node)\n      NodeType.IMPORT_EXPR -> Nodes(formatGeneric(node.children, null))\n      NodeType.LET_EXPR -> formatLetExpr(node)\n      NodeType.LET_PARAMETER_DEFINITION -> formatLetParameterDefinition(node)\n      NodeType.LET_PARAMETER -> formatLetParameter(node)\n      NodeType.UNARY_MINUS_EXPR -> Nodes(formatGeneric(node.children, null))\n      NodeType.LOGICAL_NOT_EXPR -> Nodes(formatGeneric(node.children, null))\n      NodeType.TYPE_ANNOTATION -> formatTypeAnnotation(node)\n      NodeType.TYPE_ARGUMENT_LIST -> formatTypeParameterList(node)\n      NodeType.TYPE_ARGUMENT_LIST_ELEMENTS -> formatParameterListElements(node)\n      NodeType.DECLARED_TYPE -> formatDeclaredType(node)\n      NodeType.CONSTRAINED_TYPE -> formatConstrainedType(node)\n      NodeType.CONSTRAINED_TYPE_CONSTRAINT -> formatParameterList(node)\n      NodeType.CONSTRAINED_TYPE_ELEMENTS -> formatParameterListElements(node)\n      NodeType.NULLABLE_TYPE -> Nodes(formatGeneric(node.children, null))\n      NodeType.UNION_TYPE -> formatUnionType(node)\n      NodeType.FUNCTION_TYPE -> formatFunctionType(node)\n      NodeType.FUNCTION_TYPE_PARAMETERS -> formatParameterList(node)\n      NodeType.STRING_CONSTANT_TYPE -> format(node.children[0])\n      NodeType.PARENTHESIZED_TYPE -> formatParenthesizedType(node)\n      NodeType.PARENTHESIZED_TYPE_ELEMENTS -> formatParenthesizedTypeElements(node)\n      else -> throw RuntimeException(\"Unknown node type: ${node.type}\")\n    }\n\n  private fun formatModule(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.linesBetween(next) > 1) TWO_NEWLINES else forceLine()\n      }\n    return Nodes(nodes)\n  }\n\n  private fun formatModuleDeclaration(node: Node): FormatNode {\n    return Nodes(formatGeneric(node.children, TWO_NEWLINES))\n  }\n\n  private fun formatModuleDefinition(node: Node): FormatNode {\n    val (prefixes, nodes) = splitPrefixes(node.children)\n    val fnodes =\n      formatGenericWithGen(nodes, Space) { node, _ ->\n        if (node.type == NodeType.QUALIFIED_IDENTIFIER) {\n          Nodes(formatGeneric(node.children, null))\n        } else {\n          format(node)\n        }\n      }\n    val res = Nodes(fnodes)\n    return if (prefixes.isEmpty()) {\n      res\n    } else {\n      val sep = getSeparator(prefixes.last(), nodes.first(), spaceOrLine())\n      Nodes(formatGeneric(prefixes, spaceOrLine()) + listOf(sep, res))\n    }\n  }\n\n  private fun formatDocComment(node: Node): FormatNode {\n    val txt = node.text()\n    if (txt == \"///\" || txt == \"/// \") return Text(\"///\")\n\n    var comment = txt.substring(3)\n    if (comment.isStrictBlank()) return Text(\"///\")\n\n    if (comment.isNotEmpty() && comment[0] != ' ') comment = \" $comment\"\n    return Text(\"///$comment\")\n  }\n\n  private fun String.isStrictBlank(): Boolean {\n    for (ch in this) {\n      if (ch != ' ' && ch != '\\t') return false\n    }\n    return true\n  }\n\n  private fun formatQualifiedIdentifier(node: Node): FormatNode {\n    // short circuit\n    if (node.children.size == 1) return format(node.children[0])\n\n    val first = listOf(format(node.children[0]), line())\n    val nodes =\n      formatGeneric(node.children.drop(1)) { n1, _ ->\n        if (n1.type == NodeType.TERMINAL) null else line()\n      }\n    return Group(newId(), first + listOf(Indent(nodes)))\n  }\n\n  private fun formatUnqualifiedAccessExpression(node: Node): FormatNode {\n    val children = node.children\n    if (children.size == 1) return format(children[0])\n    val firstNode = node.firstProperChild()!!\n    return if (firstNode.text() == \"Map\") {\n      val nodes =\n        formatGenericWithGen(children, null) { node, _ ->\n          if (node.type == NodeType.ARGUMENT_LIST) {\n            formatArgumentList(node, twoBy2 = true)\n          } else {\n            format(node)\n          }\n        }\n      Nodes(nodes)\n    } else {\n      Nodes(formatGeneric(children, null))\n    }\n  }\n\n  /**\n   * Special cases when formatting qualified access:\n   *\n   * Case 1: Dot calls followed by closing method call: wrap after the opening paren.\n   *\n   * ```\n   * foo.bar.baz(new {\n   *   qux = 1\n   * })\n   * ```\n   *\n   * Case 2: Dot calls, then method calls: group the leading access together.\n   *\n   * ```\n   * foo.bar\n   *   .baz(new {\n   *     qux = 1\n   *   })\n   *   .baz()\n   * ```\n   *\n   * Case 3: If there are multiple lambdas present, always force a newline.\n   *\n   * ```\n   * foo\n   *   .map((it) -> it + 1)\n   *   .filter((it) -> it.isEven)\n   * ```\n   */\n  private fun formatQualifiedAccessExpression(node: Node): FormatNode {\n    var lambdaCount = 0\n    var methodCallCount = 0\n    var indexBeforeFirstMethodCall = 0\n    val flat = mutableListOf<Node>()\n\n    fun gatherFacts(current: Node) {\n      for (child in current.children) {\n        if (child.type == NodeType.QUALIFIED_ACCESS_EXPR) {\n          gatherFacts(child)\n        } else {\n          flat.add(child)\n          when {\n            isMethodCall(child) -> {\n              methodCallCount++\n              if (hasFunctionLiteral(child, 2)) {\n                lambdaCount++\n              }\n            }\n            methodCallCount == 0 -> {\n              indexBeforeFirstMethodCall = flat.lastIndex\n            }\n          }\n        }\n      }\n    }\n\n    gatherFacts(node)\n\n    val leadingSeparator: (Node, Node) -> FormatNode? = { prev, next ->\n      when {\n        prev.type == NodeType.OPERATOR -> null\n        next.type == NodeType.OPERATOR -> line()\n        else -> spaceOrLine()\n      }\n    }\n\n    val trailingSeparator: (Node, Node) -> FormatNode? = { prev, next ->\n      when {\n        prev.type == NodeType.OPERATOR -> null\n        next.type == NodeType.OPERATOR -> if (lambdaCount > 1) forceLine() else line()\n        else -> spaceOrLine()\n      }\n    }\n\n    val nodes =\n      when {\n        methodCallCount == 1 && isMethodCall(flat.lastProperNode()!!) -> {\n          // lift argument list into its own node\n          val (callChain, argsList) = splitFunctionCallNode(flat)\n          val leadingNodes =\n            indentAfterFirstNewline(formatGeneric(callChain, leadingSeparator), true)\n          val trailingNodes = formatGeneric(argsList, trailingSeparator)\n          val sep = getBaseSeparator(callChain.last(), argsList.first())\n          if (sep != null) {\n            leadingNodes + sep + trailingNodes\n          } else {\n            leadingNodes + trailingNodes\n          }\n        }\n        methodCallCount > 0 && indexBeforeFirstMethodCall > 0 -> {\n          val leading = flat.subList(0, indexBeforeFirstMethodCall)\n          val trailing = flat.subList(indexBeforeFirstMethodCall, flat.size)\n          val leadingNodes = indentAfterFirstNewline(formatGeneric(leading, leadingSeparator), true)\n          val trailingNodes = formatGeneric(trailing, trailingSeparator)\n          leadingNodes + line() + trailingNodes\n        }\n        else -> formatGeneric(flat, trailingSeparator)\n      }\n\n    val shouldGroup = node.children.size == flat.size\n    return Group(newId(), indentAfterFirstNewline(nodes, shouldGroup))\n  }\n\n  /**\n   * Split a function call node to extract its identifier into the leading group. For example,\n   * `foo.bar(5)` becomes: leading gets `foo.bar`, rest gets `(5)`.\n   */\n  private fun splitFunctionCallNode(nodes: List<Node>): Pair<List<Node>, List<Node>> {\n    assert(nodes.isNotEmpty())\n    val lastNode = nodes.last()\n    val argListIdx = lastNode.children.indexOfFirst { it.type == NodeType.ARGUMENT_LIST }\n    val leading = nodes.subList(0, nodes.lastIndex) + lastNode.children.subList(0, argListIdx)\n    val trailing = lastNode.children.subList(argListIdx, lastNode.children.size)\n    return leading to trailing\n  }\n\n  private fun isMethodCall(node: Node): Boolean {\n    if (node.type != NodeType.UNQUALIFIED_ACCESS_EXPR) return false\n    for (child in node.children) {\n      if (child.type == NodeType.ARGUMENT_LIST) {\n        return true\n      }\n    }\n    return false\n  }\n\n  private fun formatAmendsExtendsClause(node: Node): FormatNode {\n    val prefix = formatGeneric(node.children.dropLast(1), spaceOrLine())\n    // string constant\n    val suffix = Indent(listOf(format(node.children.last())))\n    return Group(newId(), prefix + listOf(spaceOrLine()) + suffix)\n  }\n\n  private fun formatImport(node: Node): FormatNode {\n    return Group(\n      newId(),\n      formatGenericWithGen(node.children, spaceOrLine()) { node, _ ->\n        if (node.isTerminal(\"import\")) format(node) else indent(format(node))\n      },\n    )\n  }\n\n  private fun formatAnnotation(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatTypealias(node: Node): FormatNode {\n    val nodes =\n      groupNonPrefixes(node) { children -> Group(newId(), formatGeneric(children, spaceOrLine())) }\n    return Nodes(nodes)\n  }\n\n  private fun formatTypealiasHeader(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, Space))\n  }\n\n  private fun formatTypealiasBody(node: Node): FormatNode {\n    return Indent(formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatClass(node: Node): FormatNode {\n    return Nodes(formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatClassHeader(node: Node): FormatNode {\n    return groupOnSpace(formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatClassHeaderExtends(node: Node): FormatNode {\n    return indent(Group(newId(), formatGeneric(node.children, spaceOrLine())))\n  }\n\n  private fun formatClassBody(node: Node): FormatNode {\n    val children = node.children\n    if (children.size == 2) {\n      // no members\n      return Nodes(formatGeneric(children, null))\n    }\n    return Group(newId(), formatGeneric(children, forceLine()))\n  }\n\n  private fun formatClassBodyElements(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        val lineDiff = prev.linesBetween(next)\n        if (lineDiff > 1 || lineDiff == 0) TWO_NEWLINES else forceLine()\n      }\n    return Indent(nodes)\n  }\n\n  private fun formatClassProperty(node: Node): FormatNode {\n    val sameLine =\n      node.children\n        .lastOrNull { it.isExpressionOrPropertyBody() }\n        ?.let {\n          if (it.type.isExpression) isSameLineExpr(it) else isSameLineExpr(it.children.last())\n        } ?: false\n    val nodes =\n      groupNonPrefixes(node) { children ->\n        val nodes =\n          formatGenericWithGen(children, { _, _ -> if (sameLine) Space else spaceOrLine() }) {\n            node,\n            _ ->\n            if ((node.isExpressionOrPropertyBody()) && !sameLine) {\n              indent(format(node))\n            } else format(node)\n          }\n        groupOnSpace(nodes)\n      }\n    return Nodes(nodes)\n  }\n\n  private fun Node.isExpressionOrPropertyBody(): Boolean =\n    type.isExpression ||\n      type == NodeType.CLASS_PROPERTY_BODY ||\n      type == NodeType.OBJECT_PROPERTY_BODY\n\n  private fun formatClassPropertyHeader(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatClassPropertyHeaderBegin(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatClassPropertyBody(node: Node): FormatNode {\n    return Nodes(formatGeneric(node.children, null))\n  }\n\n  private fun formatClassMethod(node: Node): FormatNode {\n    val prefixes = mutableListOf<FormatNode>()\n    val nodes =\n      if (node.children[0].type == NodeType.CLASS_METHOD_HEADER) node.children\n      else {\n        val idx = node.children.indexOfFirst { it.type == NodeType.CLASS_METHOD_HEADER }\n        val prefixNodes = node.children.subList(0, idx)\n        prefixes += formatGeneric(prefixNodes, null)\n        prefixes += getSeparator(prefixNodes.last(), node.children[idx], forceLine())\n        node.children.subList(idx, node.children.size)\n      }\n\n    // Separate header (before =) and body (= and after)\n    val bodyIdx = nodes.indexOfFirst { it.type == NodeType.CLASS_METHOD_BODY } - 1\n    val header = if (bodyIdx < 0) nodes else nodes.subList(0, bodyIdx)\n    val headerGroupId = newId()\n    val methodGroupId = newId()\n    val headerNodes =\n      formatGenericWithGen(header, spaceOrLine()) { node, _ ->\n        if (node.type == NodeType.PARAMETER_LIST) {\n          formatParameterList(node, id = headerGroupId)\n        } else {\n          format(node)\n        }\n      }\n    if (bodyIdx < 0) {\n      // body is empty, return header\n      return if (prefixes.isEmpty()) {\n        Group(headerGroupId, headerNodes)\n      } else {\n        Nodes(prefixes + Group(headerGroupId, headerNodes))\n      }\n    }\n\n    val bodyNodes = nodes.subList(bodyIdx, nodes.size)\n\n    val expr = bodyNodes.last().children[0]\n    val isSameLineBody = isSameLineExpr(expr)\n\n    // Format body (= and expression)\n    val bodyFormat =\n      if (isSameLineBody) {\n        formatGeneric(bodyNodes, Space)\n      } else {\n        formatGenericWithGen(bodyNodes, spaceOrLine()) { node, next ->\n          if (next == null) indent(format(node)) else format(node)\n        }\n      }\n\n    val headerGroup = Group(headerGroupId, headerNodes)\n    val bodyGroup = Group(newId(), bodyFormat)\n    val separator = getSeparator(header.last(), bodyNodes.first(), Space)\n    val allNodes = Group(methodGroupId, listOf(headerGroup, separator, bodyGroup))\n\n    return if (prefixes.isEmpty()) allNodes else Nodes(prefixes + allNodes)\n  }\n\n  private fun formatClassMethodHeader(node: Node): FormatNode {\n    val nodes = formatGeneric(node.children, Space)\n    return Nodes(nodes)\n  }\n\n  private fun formatClassMethodBody(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, null))\n  }\n\n  private fun formatParameter(node: Node): FormatNode {\n    if (node.children.size == 1) return format(node.children[0]) // underscore\n    return Group(newId(), formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatParameterList(node: Node, id: Int? = null): FormatNode {\n    if (node.children.size == 2) return Text(\"()\")\n    val groupId = id ?: newId()\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) {\n          if (next.isTerminal(\")\")) {\n            // trailing comma\n            if (grammarVersion == GrammarVersion.V1) {\n              line()\n            } else {\n              ifWrap(groupId, nodes(Text(\",\"), line()), line())\n            }\n          } else line()\n        } else spaceOrLine()\n      }\n    return if (id != null) Nodes(nodes) else Group(groupId, nodes)\n  }\n\n  private fun formatArgumentList(node: Node, twoBy2: Boolean = false): FormatNode {\n    if (node.children.size == 2) return Text(\"()\")\n    val hasTrailingLambda = hasTrailingLambda(node)\n    val groupId = newId()\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { prev, next ->\n          if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) {\n            val node = if (hasTrailingLambda) Empty else line()\n            if (next.isTerminal(\")\") && !hasTrailingLambda) {\n              // trailing comma\n              if (grammarVersion == GrammarVersion.V1) {\n                node\n              } else {\n                ifWrap(groupId, nodes(Text(\",\"), node), node)\n              }\n            } else node\n          } else spaceOrLine()\n        },\n      ) { node, _ ->\n        if (node.type == NodeType.ARGUMENT_LIST_ELEMENTS) {\n          formatArgumentListElements(node, hasTrailingLambda, twoBy2 = twoBy2)\n        } else format(node)\n      }\n    return Group(groupId, nodes)\n  }\n\n  private fun formatArgumentListElements(\n    node: Node,\n    hasTrailingLambda: Boolean = false,\n    twoBy2: Boolean = false,\n  ): FormatNode {\n    val children = node.children\n    val shouldMultiline = shouldMultilineNodes(node) { it.isTerminal(\",\") }\n    val sep: (Node, Node) -> FormatNode = { _, _ ->\n      if (shouldMultiline) forceSpaceyLine() else spaceOrLine()\n    }\n    return if (twoBy2) {\n      val pairs = pairArguments(children)\n      val nodes =\n        formatGenericWithGen(pairs, sep) { node, _ ->\n          if (node.type == NodeType.ARGUMENT_LIST_ELEMENTS) {\n            Group(newId(), formatGeneric(node.children, spaceOrLine()))\n          } else {\n            format(node)\n          }\n        }\n      Indent(nodes)\n    } else if (hasTrailingLambda) {\n      // if the args have a trailing lambda, group them differently\n      val splitIndex = children.indexOfLast { it.type in SAME_LINE_EXPRS }\n      val normalParams = children.subList(0, splitIndex)\n      val lastParam = children.subList(splitIndex, children.size)\n      val trailingNode = if (endsWithClosingCurlyBrace(lastParam.last())) Empty else line()\n      val lastNodes = formatGenericWithGen(lastParam, sep, null)\n      if (normalParams.isEmpty()) {\n        val lastNodes = formatGenericWithGen(lastParam, sep, null)\n        group(Group(newId(), lastNodes), trailingNode)\n      } else {\n        val separator = getSeparator(normalParams.last(), lastParam[0], Space)\n        val paramNodes = formatGenericWithGen(normalParams, sep, null)\n        group(Group(newId(), paramNodes), separator, Group(newId(), lastNodes), trailingNode)\n      }\n    } else {\n      Indent(formatGeneric(children, sep))\n    }\n  }\n\n  private fun shouldMultilineNodes(node: Node, predicate: (Node) -> Boolean): Boolean {\n    for (idx in 0..<node.children.lastIndex) {\n      val prev = node.children[idx]\n      val next = node.children[idx + 1]\n      if ((predicate(prev) || predicate(next)) && prev.linesBetween(next) > 0) {\n        return true\n      }\n    }\n    return false\n  }\n\n  private tailrec fun endsWithClosingCurlyBrace(node: Node): Boolean {\n    return if (node.children.isNotEmpty()) {\n      endsWithClosingCurlyBrace(node.children.last())\n    } else {\n      node.isTerminal(\"}\")\n    }\n  }\n\n  /**\n   * Tells if an argument list has a trailing lambda, new expr, or amends expr.\n   *\n   * Only considered trailing lamdba if:\n   * 1. There is only one lambda/new expr/amends expr in the list. E.g. avoid formatting `toMap()`\n   *    weirdly: ``` foo.toMap( (it) -> makeSomeKey(it), (it) -> makeSomeValue(it), ) ```\n   * 2. The lambda does not have leading or trailing line comment.\n   */\n  private fun hasTrailingLambda(argList: Node): Boolean {\n    val children = argList.firstProperChild()?.children ?: return false\n    var seenLambda = false\n    if (children.last().type == NodeType.LINE_COMMENT) {\n      return false\n    }\n    for (i in children.lastIndex downTo 0) {\n      val child = children[i]\n      if (!child.isProper()) continue\n      if (!seenLambda) {\n        if (child.type !in SAME_LINE_EXPRS) {\n          return false\n        }\n        // preceded by line comment\n        if (children.getOrNull(i - 1)?.type == NodeType.LINE_COMMENT) return false\n        seenLambda = true\n      } else if (child.type in SAME_LINE_EXPRS) {\n        return false\n      }\n    }\n    return true\n  }\n\n  private fun pairArguments(nodes: List<Node>): List<Node> {\n    val res = mutableListOf<Node>()\n    var tmp = mutableListOf<Node>()\n    var commas = 0\n    for (node in nodes) {\n      if (node.isTerminal(\",\")) {\n        commas++\n        if (commas == 2) {\n          val suffixes = mutableListOf<Node>()\n          while (tmp.isNotEmpty() && tmp.last().type.isAffix) {\n            // trailing comments should not be paired\n            suffixes += tmp.removeLast()\n          }\n          res += Node(NodeType.ARGUMENT_LIST_ELEMENTS, tmp)\n          while (suffixes.isNotEmpty()) {\n            res += suffixes.removeFirst()\n          }\n          res += node\n          commas = 0\n          tmp = mutableListOf()\n        } else {\n          tmp += node\n        }\n      } else if (tmp.isEmpty() && node.type.isAffix) {\n        // leading comments should not be paired\n        res += node\n      } else {\n        tmp += node\n      }\n    }\n    if (tmp.isNotEmpty()) {\n      res += Node(NodeType.ARGUMENT_LIST_ELEMENTS, tmp)\n    }\n    return res\n  }\n\n  private fun formatParameterListElements(node: Node): FormatNode {\n    return Indent(formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatTypeParameterList(node: Node): FormatNode {\n    if (node.children.size == 2) return Text(\"<>\")\n    val id = newId()\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.isTerminal(\"<\") || next.isTerminal(\">\")) {\n          if (next.isTerminal(\">\")) {\n            // trailing comma\n            if (grammarVersion == GrammarVersion.V1) {\n              Line\n            } else {\n              ifWrap(id, nodes(Text(\",\"), line()), line())\n            }\n          } else line()\n        } else spaceOrLine()\n      }\n    return Group(id, nodes)\n  }\n\n  private fun formatObjectParameterList(node: Node): FormatNode {\n    // object param lists don't have trailing commas, as they have a trailing ->\n    val groupId = newId()\n    val nonWrappingNodes = Nodes(formatGeneric(node.children, spaceOrLine()))\n    // double indent the params if they wrap\n    val wrappingNodes = indent(Indent(listOf(line()) + nonWrappingNodes))\n    return Group(groupId, listOf(ifWrap(groupId, wrappingNodes, nodes(Space, nonWrappingNodes))))\n  }\n\n  private fun formatObjectBody(node: Node): FormatNode {\n    if (node.children.size == 2) return Text(\"{}\")\n    val groupId = newId()\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { prev, next ->\n          if (next.type == NodeType.OBJECT_PARAMETER_LIST) Empty\n          else if (prev.isTerminal(\"{\") || next.isTerminal(\"}\")) {\n            val lines = prev.linesBetween(next)\n            if (lines == 0) spaceOrLine() else forceSpaceyLine()\n          } else spaceOrLine()\n        },\n      ) { node, _ ->\n        if (node.type == NodeType.OBJECT_MEMBER_LIST) {\n          formatObjectMemberList(node, groupId)\n        } else format(node)\n      }\n    return Group(groupId, nodes)\n  }\n\n  private fun formatObjectMemberList(node: Node, groupId: Int): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        val lines = prev.linesBetween(next)\n        when (lines) {\n          0 -> ifWrap(groupId, line(), Text(\"; \"))\n          1 -> forceLine()\n          else -> TWO_NEWLINES\n        }\n      }\n    return Indent(nodes)\n  }\n\n  private fun formatObjectEntryHeader(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatForGenerator(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (\n          prev.type == NodeType.FOR_GENERATOR_HEADER || next.type == NodeType.FOR_GENERATOR_HEADER\n        ) {\n          Space\n        } else spaceOrLine()\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatForGeneratorHeader(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else null\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatForGeneratorHeaderDefinition(node: Node): FormatNode {\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { _, next -> if (next.type in SAME_LINE_EXPRS) Space else spaceOrLine() },\n      ) { node, _ ->\n        if (node.type.isExpression && node.type !in SAME_LINE_EXPRS) indent(format(node))\n        else format(node)\n      }\n    return indent(Group(newId(), nodes))\n  }\n\n  private fun formatForGeneratorHeaderDefinitionHeader(node: Node): FormatNode {\n    val nodes = formatGeneric(node.children, spaceOrLine())\n    return Group(newId(), nodes)\n  }\n\n  private fun formatWhenGenerator(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (\n          prev.type == NodeType.WHEN_GENERATOR_HEADER ||\n            prev.isTerminal(\"when\", \"else\") ||\n            next.isTerminal(\"else\")\n        ) {\n          Space\n        } else {\n          spaceOrLine()\n        }\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatWhenGeneratorHeader(node: Node): FormatNode {\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { prev, next ->\n          if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else spaceOrLine()\n        },\n      ) { node, _ ->\n        if (!node.type.isAffix && node.type != NodeType.TERMINAL) {\n          indent(format(node))\n        } else format(node)\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatMemberPredicate(node: Node): FormatNode {\n    val nodes =\n      formatGenericWithGen(node.children, spaceOrLine()) { node, next ->\n        if (next == null && node.type != NodeType.OBJECT_BODY) {\n          indent(format(node))\n        } else format(node)\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatStringParts(nodes: List<Node>): List<FormatNode> {\n    return buildList {\n      var isInStringInterpolation = false\n      val cursor = nodes.iterator().peekable()\n      var prev: Node? = null\n      while (cursor.hasNext()) {\n        if (isInStringInterpolation) {\n          val prevNoNewlines = noNewlines\n          val elems = cursor.takeUntilBefore { it.isTerminal(\")\") }\n          noNewlines = !elems.isMultiline()\n          getBaseSeparator(prev!!, elems.first())?.let { add(it) }\n          val formatted = formatGeneric(elems, null)\n          addAll(formatted)\n          getBaseSeparator(elems.last(), cursor.peek())?.let { add(it) }\n          noNewlines = prevNoNewlines\n          isInStringInterpolation = false\n          continue\n        }\n        val elem = cursor.next()\n        if (elem.type == NodeType.TERMINAL && elem.text().endsWith(\"(\")) {\n          isInStringInterpolation = true\n        }\n        add(format(elem))\n        prev = elem\n      }\n    }\n  }\n\n  private fun formatSingleLineString(node: Node): FormatNode {\n    return Group(newId(), formatStringParts(node.children))\n  }\n\n  private fun formatMultilineString(node: Node): FormatNode {\n    val nodes = formatStringParts(node.children)\n    return MultilineStringGroup(node.children.last().span.colBegin, nodes)\n  }\n\n  private fun formatIf(node: Node): FormatNode {\n    val separator = if (node.isMultiline()) forceSpaceyLine() else spaceOrLine()\n    val nodes =\n      formatGeneric(node.children) { _, next ->\n        // produce `else if` in the case of nested if.\n        // note: don't need to handle if `next.children[0]` is an affix because that can't be\n        // emitted as `else if` anyway.\n        if (next.type == NodeType.IF_ELSE_EXPR && next.children[0].type == NodeType.IF_EXPR) Space\n        else separator\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatIfHeader(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { _, next ->\n        if (next.type == NodeType.IF_CONDITION) Space else spaceOrLine()\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatIfCondition(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else spaceOrLine()\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatIfThen(node: Node): FormatNode {\n    return Indent(formatGeneric(node.children, null))\n  }\n\n  private fun formatIfElse(node: Node): FormatNode {\n    val children = node.children\n    if (children.size == 1) {\n      val expr = children[0]\n      return if (expr.type == NodeType.IF_EXPR) {\n        // unpack the group\n        val group = formatIf(expr) as Group\n        Nodes(group.nodes)\n      } else {\n        indent(format(expr))\n      }\n    }\n    return Indent(formatGeneric(node.children, null))\n  }\n\n  private fun formatNewExpr(node: Node): FormatNode {\n    val nodes = formatGeneric(node.children, spaceOrLine())\n    return Group(newId(), nodes)\n  }\n\n  private fun formatNewHeader(node: Node): FormatNode {\n    val nodes = formatGeneric(node.children, spaceOrLine())\n    return Group(newId(), nodes)\n  }\n\n  private fun formatParenthesizedExpr(node: Node): FormatNode {\n    if (node.children.size == 2) return Text(\"()\")\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { prev, next ->\n          if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else spaceOrLine()\n        },\n      ) { node, _ ->\n        if (node.type.isExpression) indent(format(node)) else format(node)\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatParenthesizedExprElements(node: Node): FormatNode {\n    return indent(Group(newId(), formatGeneric(node.children, null)))\n  }\n\n  private fun formatFunctionLiteralExpr(node: Node): FormatNode {\n    val (params, rest) = node.children.splitOn { it.isTerminal(\"->\") }\n    val sameLine =\n      node.children\n        .last { it.type == NodeType.FUNCTION_LITERAL_BODY }\n        .let { body ->\n          val expr = body.children.find { it.type.isExpression }!!\n          isSameLineExpr(expr)\n        }\n    val sep = if (sameLine) Space else spaceOrLine()\n    val bodySep = getSeparator(params.last(), rest.first(), sep)\n\n    val nodes = formatGeneric(params, sep)\n    val restNodes = listOf(bodySep) + formatGeneric(rest, sep)\n    return Group(newId(), nodes + listOf(Group(newId(), restNodes)))\n  }\n\n  private fun formatFunctionLiteralBody(node: Node): FormatNode {\n    val expr = node.children.find { it.type.isExpression }!!\n    val nodes = formatGeneric(node.children, null)\n    return if (isSameLineExpr(expr)) Group(newId(), nodes) else Indent(nodes)\n  }\n\n  private fun formatLetExpr(node: Node): FormatNode {\n    val separator = if (node.isMultiline()) forceSpaceyLine() else spaceOrLine()\n    val endsWithLet = node.children.last().type == NodeType.LET_EXPR\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { _, next -> if (next.type == NodeType.LET_PARAMETER_DEFINITION) Space else separator },\n      ) { node, _ ->\n        when {\n          node.type == NodeType.LET_EXPR -> {\n            // unpack the lets\n            val group = formatLetExpr(node) as Group\n            Nodes(group.nodes)\n          }\n          endsWithLet -> format(node)\n          node.type.isExpression || node.type.isAffix -> indent(format(node))\n          else -> format(node)\n        }\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatLetParameterDefinition(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else spaceOrLine()\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatLetParameter(node: Node): FormatNode {\n    return indent(formatClassProperty(node))\n  }\n\n  private fun formatBinaryOpExpr(node: Node): FormatNode {\n    val flat = flattenBinaryOperatorExprs(node)\n    val shouldMultiline = shouldMultilineNodes(node) { it.type == NodeType.OPERATOR }\n    val nodes =\n      formatGeneric(flat) { prev, next ->\n        val sep = if (shouldMultiline) forceSpaceyLine() else spaceOrLine()\n        if (prev.type == NodeType.OPERATOR) {\n          when (prev.text()) {\n            \"-\" -> sep\n            else -> Space\n          }\n        } else if (next.type == NodeType.OPERATOR) {\n          when (next.text()) {\n            \"-\" -> Space\n            else -> sep\n          }\n        } else sep\n      }\n\n    val shouldGroup = node.children.size == flat.size\n    return Group(newId(), indentAfterFirstNewline(nodes, shouldGroup))\n  }\n\n  private fun hasFunctionLiteral(node: Node, depth: Int): Boolean {\n    if (node.type == NodeType.FUNCTION_LITERAL_EXPR) return true\n    for (child in node.children) {\n      if (child.type == NodeType.FUNCTION_LITERAL_EXPR) return true\n      if (depth > 0 && hasFunctionLiteral(child, depth - 1)) return true\n    }\n    return false\n  }\n\n  private fun formatSubscriptExpr(node: Node): FormatNode {\n    return Nodes(formatGeneric(node.children, null))\n  }\n\n  private fun formatTraceThrowReadExpr(node: Node): FormatNode {\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { prev, next -> if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else null },\n      ) { node, _ ->\n        if (node.type.isExpression) indent(format(node)) else format(node)\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatDeclaredType(node: Node): FormatNode {\n    return Nodes(formatGeneric(node.children, spaceOrLine()))\n  }\n\n  private fun formatConstrainedType(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { _, next ->\n        if (next.type == NodeType.CONSTRAINED_TYPE_CONSTRAINT) null else spaceOrLine()\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatUnionType(node: Node): FormatNode {\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        when {\n          next.isTerminal(\"|\") -> spaceOrLine()\n          prev.isTerminal(\"|\") -> Space\n          else -> null\n        }\n      }\n    return Group(newId(), indentAfterFirstNewline(nodes))\n  }\n\n  private fun formatFunctionType(node: Node): FormatNode {\n    val nodes =\n      formatGenericWithGen(\n        node.children,\n        { prev, next ->\n          if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else spaceOrLine()\n        },\n      ) { node, next ->\n        if (next == null) indent(format(node)) else format(node)\n      }\n    return Group(newId(), nodes)\n  }\n\n  private fun formatParenthesizedType(node: Node): FormatNode {\n    if (node.children.size == 2) return Text(\"()\")\n    val groupId = newId()\n    val nodes =\n      formatGeneric(node.children) { prev, next ->\n        if (prev.isTerminal(\"(\") || next.isTerminal(\")\")) line() else spaceOrLine()\n      }\n    return Group(groupId, nodes)\n  }\n\n  private fun formatParenthesizedTypeElements(node: Node): FormatNode {\n    return indent(Group(newId(), formatGeneric(node.children, spaceOrLine())))\n  }\n\n  private fun formatTypeAnnotation(node: Node): FormatNode {\n    return Group(newId(), formatGeneric(node.children, Space))\n  }\n\n  private fun formatModifierList(node: Node): FormatNode {\n    val nodes = mutableListOf<FormatNode>()\n    val children = node.children.groupBy { it.type.isAffix }\n    if (children[true] != null) {\n      nodes += formatGeneric(children[true]!!, spaceOrLine())\n    }\n    val modifiers = children[false]!!.sortedBy(::modifierPrecedence)\n    nodes += formatGeneric(modifiers, Space)\n    return Nodes(nodes)\n  }\n\n  private data class ImportWithComments(\n    val leadingAffixes: List<Node>,\n    val import: Node,\n    val trailingAffixes: List<Node>,\n  )\n\n  private fun buildImportsWithComments(children: List<Node>): List<ImportWithComments> {\n    val result = mutableListOf<ImportWithComments>()\n    var pendingAffixes = mutableListOf<Node>()\n    var lastImport: Node? = null\n    var lastTrailing = mutableListOf<Node>()\n    var lastLeading = mutableListOf<Node>()\n\n    for (child in children) {\n      if (child.type.isAffix) {\n        if (lastImport != null && lastImport.span.lineEnd == child.span.lineBegin) {\n          // trailing comment on the same line as the preceding import\n          lastTrailing.add(child)\n        } else {\n          // leading comment for the next import\n          // first, flush the previous import\n          if (lastImport != null) {\n            result.add(ImportWithComments(lastLeading, lastImport, lastTrailing))\n            lastImport = null\n            lastTrailing = mutableListOf()\n            lastLeading = mutableListOf()\n          }\n          pendingAffixes.add(child)\n        }\n      } else {\n        // import node\n        if (lastImport != null) {\n          result.add(ImportWithComments(lastLeading, lastImport, lastTrailing))\n          lastTrailing = mutableListOf()\n        }\n        lastLeading = pendingAffixes\n        pendingAffixes = mutableListOf()\n        lastImport = child\n      }\n    }\n    // flush the last import\n    if (lastImport != null) {\n      result.add(ImportWithComments(lastLeading, lastImport, lastTrailing))\n    }\n    return result\n  }\n\n  private fun formatImportList(node: Node): FormatNode {\n    val nodes = mutableListOf<FormatNode>()\n\n    val allImportsWithComments = buildImportsWithComments(node.children)\n    val imports =\n      allImportsWithComments.groupBy { it.import.findChildByType(NodeType.TERMINAL)?.text(source) }\n    if (imports[\"import\"] != null) {\n      formatImportListHelper(imports[\"import\"]!!, nodes)\n      if (imports[\"import*\"] != null) nodes += TWO_NEWLINES\n    }\n    if (imports[\"import*\"] != null) {\n      formatImportListHelper(imports[\"import*\"]!!, nodes)\n    }\n\n    return Nodes(nodes)\n  }\n\n  private fun formatImportWithComments(entry: ImportWithComments, nodes: MutableList<FormatNode>) {\n    if (entry.leadingAffixes.isNotEmpty()) {\n      nodes += formatGeneric(entry.leadingAffixes, spaceOrLine())\n      nodes += forceLine()\n    }\n    nodes += format(entry.import)\n    for (affix in entry.trailingAffixes) {\n      nodes += Space\n      nodes += format(affix)\n    }\n  }\n\n  private fun formatImportListHelper(\n    allImports: List<ImportWithComments>,\n    nodes: MutableList<FormatNode>,\n  ) {\n    val comparator = ImportComparator(source)\n    val imports =\n      allImports.groupBy { entry ->\n        val url = getImportUrl(entry.import)\n        when {\n          ABSOLUTE_URL_REGEX.matches(url) -> 0\n          url.startsWith('@') -> 1\n          else -> 2\n        }\n      }\n    val absolute = imports[0]?.sortedWith(compareBy(comparator) { it.import })\n    val projects = imports[1]?.sortedWith(compareBy(comparator) { it.import })\n    val relatives = imports[2]?.sortedWith(compareBy(comparator) { it.import })\n    var shouldNewline = false\n\n    if (absolute != null) {\n      for ((i, imp) in absolute.withIndex()) {\n        if (i > 0) nodes += forceLine()\n        formatImportWithComments(imp, nodes)\n      }\n      if (projects != null || relatives != null) nodes += forceLine()\n      shouldNewline = true\n    }\n\n    if (projects != null) {\n      if (shouldNewline) nodes += forceLine()\n      for ((i, imp) in projects.withIndex()) {\n        if (i > 0) nodes += forceLine()\n        formatImportWithComments(imp, nodes)\n      }\n      if (relatives != null) nodes += forceLine()\n      shouldNewline = true\n    }\n\n    if (relatives != null) {\n      if (shouldNewline) nodes += forceLine()\n      for ((i, imp) in relatives.withIndex()) {\n        if (i > 0) nodes += forceLine()\n        formatImportWithComments(imp, nodes)\n      }\n    }\n  }\n\n  private fun formatGeneric(children: List<Node>, separator: FormatNode?): List<FormatNode> {\n    return formatGeneric(children) { _, _ -> separator }\n  }\n\n  private fun formatGeneric(\n    children: List<Node>,\n    separatorFn: (Node, Node) -> FormatNode?,\n  ): List<FormatNode> {\n    return formatGenericWithGen(children, separatorFn, null)\n  }\n\n  private fun formatGenericWithGen(\n    children: List<Node>,\n    separator: FormatNode?,\n    generatorFn: ((Node, Node?) -> FormatNode)?,\n  ): List<FormatNode> {\n    return formatGenericWithGen(children, { _, _ -> separator }, generatorFn)\n  }\n\n  private fun formatGenericWithGen(\n    children: List<Node>,\n    separatorFn: (Node, Node) -> FormatNode?,\n    generatorFn: ((Node, Node?) -> FormatNode)?,\n  ): List<FormatNode> {\n    // skip semicolons\n    val children = children.filter { !it.isSemicolon() }\n    // short circuit\n    if (children.isEmpty()) return emptyList()\n    if (children.size == 1) return listOf(format(children[0]))\n\n    val nodes = mutableListOf<FormatNode>()\n    var prev = children[0]\n    for (child in children.drop(1)) {\n      nodes +=\n        if (generatorFn != null) {\n          generatorFn(prev, child)\n        } else {\n          format(prev)\n        }\n      val separator = getSeparator(prev, child, separatorFn)\n      if (separator != null) nodes += separator\n      prev = child\n    }\n    nodes +=\n      if (generatorFn != null) {\n        generatorFn(children.last(), null)\n      } else {\n        format(children.last())\n      }\n    return nodes\n  }\n\n  private fun Node.isSemicolon(): Boolean = type.isAffix && text() == \";\"\n\n  /** Groups all non prefixes (comments, doc comments, annotations) of this node together. */\n  private fun groupNonPrefixes(node: Node, groupFn: (List<Node>) -> FormatNode): List<FormatNode> {\n    val children = node.children\n    val index =\n      children.indexOfFirst {\n        !it.type.isAffix && it.type != NodeType.DOC_COMMENT && it.type != NodeType.ANNOTATION\n      }\n    if (index <= 0) {\n      // no prefixes\n      return listOf(groupFn(children))\n    }\n    val prefixes = children.subList(0, index)\n    val nodes = children.subList(index, children.size)\n    val res = mutableListOf<FormatNode>()\n    res += formatGeneric(prefixes, spaceOrLine())\n    res += getSeparator(prefixes.last(), nodes.first(), spaceOrLine())\n    res += groupFn(nodes)\n    return res\n  }\n\n  private fun getImportUrl(node: Node): String =\n    node.findChildByType(NodeType.STRING_CHARS)!!.text().drop(1).dropLast(1)\n\n  private fun getSeparator(prev: Node, next: Node, separator: FormatNode): FormatNode {\n    return getBaseSeparator(prev, next) ?: separator\n  }\n\n  private fun getSeparator(\n    prev: Node,\n    next: Node,\n    separatorFn: (Node, Node) -> FormatNode?,\n  ): FormatNode? {\n    return getBaseSeparator(prev, next) ?: separatorFn(prev, next)\n  }\n\n  private fun getBaseSeparator(prev: Node, next: Node): FormatNode? {\n    return when {\n      endsInLineComment(prev) -> {\n        if (prev.linesBetween(next) > 1) {\n          TWO_NEWLINES\n        } else {\n          mustForceLine()\n        }\n      }\n\n      hasTrailingAffix(prev, next) -> Space\n      prev.type == NodeType.DOC_COMMENT -> mustForceLine()\n      prev.type == NodeType.ANNOTATION -> forceLine()\n      prev.type in FORCE_LINE_AFFIXES || next.type.isAffix -> {\n        if (prev.linesBetween(next) > 1) {\n          TWO_NEWLINES\n        } else {\n          mustForceLine()\n        }\n      }\n\n      prev.type == NodeType.BLOCK_COMMENT ->\n        if (prev.linesBetween(next) > 0) forceSpaceyLine() else Space\n\n      next.type in EMPTY_SUFFIXES ||\n        prev.isTerminal(\"[\", \"!\", \"@\", \"[[\") ||\n        next.isTerminal(\"]\", \"?\", \",\") -> Empty\n\n      prev.isTerminal(\"class\", \"function\", \"new\") ||\n        next.isTerminal(\"=\", \"{\", \"->\", \"class\", \"function\") ||\n        next.type == NodeType.OBJECT_BODY ||\n        prev.type == NodeType.MODIFIER_LIST -> Space\n\n      next.type == NodeType.DOC_COMMENT -> TWO_NEWLINES\n      else -> null\n    }\n  }\n\n  private tailrec fun endsInLineComment(node: Node): Boolean {\n    return when {\n      node.type == NodeType.LINE_COMMENT -> true\n      node.children.isEmpty() -> false\n      else -> endsInLineComment(node.children.last())\n    }\n  }\n\n  private fun line(): FormatNode {\n    return if (noNewlines) Empty else Line\n  }\n\n  private fun spaceOrLine(): FormatNode {\n    return if (noNewlines) Space else SpaceOrLine\n  }\n\n  private fun mustForceLine(): FormatNode {\n    if (noNewlines) {\n      // should never happen; we do not set `noNewlines` for interpolation blocks that span multiple\n      // lines\n      throw RuntimeException(\"Tried to render Pkl code as single line\")\n    }\n    return ForceLine\n  }\n\n  private fun forceLine(): FormatNode {\n    return if (noNewlines) Empty else ForceLine\n  }\n\n  private fun forceSpaceyLine(): FormatNode {\n    return if (noNewlines) Space else ForceLine\n  }\n\n  private fun ifWrap(id: Int, ifWrap: FormatNode, ifNotWrap: FormatNode): FormatNode {\n    return if (noNewlines) ifNotWrap else IfWrap(id, ifWrap, ifNotWrap)\n  }\n\n  private fun hasTrailingAffix(node: Node, next: Node): Boolean {\n    var n: Node? = next\n    while (n != null) {\n      if (n.type.isAffix && node.span.lineEnd == n.span.lineBegin) return true\n      n = n.children.getOrNull(0)\n    }\n    return false\n  }\n\n  private fun modifierPrecedence(modifier: Node): Int {\n    return when (val text = modifier.text()) {\n      \"abstract\",\n      \"open\" -> 0\n      \"external\" -> 1\n      \"local\",\n      \"hidden\" -> 2\n      \"fixed\",\n      \"const\" -> 3\n      else -> throw RuntimeException(\"Unknown modifier `$text`\")\n    }\n  }\n\n  private fun isSameLineExpr(node: Node): Boolean {\n    return node.type in SAME_LINE_EXPRS\n  }\n\n  private fun splitPrefixes(nodes: List<Node>): Pair<List<Node>, List<Node>> {\n    val splitPoint = nodes.indexOfFirst { !it.type.isAffix && it.type != NodeType.DOC_COMMENT }\n    return nodes.subList(0, splitPoint) to nodes.subList(splitPoint, nodes.size)\n  }\n\n  private fun indentAfterFirstNewline(\n    nodes: List<FormatNode>,\n    group: Boolean = false,\n  ): List<FormatNode> {\n    val index = nodes.indexOfFirst { it is SpaceOrLine || it is ForceLine || it is Line }\n    if (index <= 0) return nodes\n    val indented =\n      if (group) {\n        group(Indent(nodes.subList(index, nodes.size)))\n      } else {\n        Indent(nodes.subList(index, nodes.size))\n      }\n\n    return nodes.subList(0, index) + listOf(indented)\n  }\n\n  private fun groupOnSpace(fnodes: List<FormatNode>): FormatNode {\n    val res = mutableListOf<FormatNode>()\n    for ((i, node) in fnodes.withIndex()) {\n      if (i > 0 && (node is SpaceOrLine || node is Space)) {\n        res += groupOnSpace(fnodes.subList(i, fnodes.size))\n        break\n      } else {\n        res += node\n      }\n    }\n    return Group(newId(), res)\n  }\n\n  /** Flatten binary operators by precedence */\n  private fun flattenBinaryOperatorExprs(node: Node): List<Node> {\n    val op = node.children.first { it.type == NodeType.OPERATOR }.text()\n    return flattenBinaryOperatorExprs(node, Operator.byName(op).prec)\n  }\n\n  private fun flattenBinaryOperatorExprs(node: Node, prec: Int): List<Node> {\n    val actualOp = node.children.first { it.type == NodeType.OPERATOR }.text()\n    if (prec != Operator.byName(actualOp).prec) return listOf(node)\n    return buildList {\n      for (child in node.children) {\n        if (child.type == NodeType.BINARY_OP_EXPR) {\n          addAll(flattenBinaryOperatorExprs(child, prec))\n        } else {\n          add(child)\n        }\n      }\n    }\n  }\n\n  private fun Node.linesBetween(next: Node): Int = next.span.lineBegin - span.lineEnd\n\n  private fun Node.text() = text(source)\n\n  private fun Node.isTerminal(vararg texts: String): Boolean =\n    type == NodeType.TERMINAL && text(source) in texts\n\n  private fun newId(): Int {\n    return id++\n  }\n\n  private fun nodes(vararg nodes: FormatNode) = Nodes(nodes.toList())\n\n  private fun group(vararg nodes: FormatNode) = Group(newId(), nodes.toList())\n\n  private fun indent(vararg nodes: FormatNode) = Indent(nodes.toList())\n\n  private class ImportComparator(private val source: CharArray) : Comparator<Node> {\n    override fun compare(o1: Node, o2: Node): Int {\n      val import1 = o1.findChildByType(NodeType.STRING_CHARS)?.text(source)\n      val import2 = o2.findChildByType(NodeType.STRING_CHARS)?.text(source)\n      if (import1 == null || import2 == null) {\n        // should never happen\n        throw RuntimeException(\"ImportComparator: not an import\")\n      }\n\n      return NaturalOrderComparator(ignoreCase = true).compare(import1, import2)\n    }\n  }\n\n  private fun Node.firstProperChild(): Node? {\n    for (child in children) {\n      if (child.isProper()) return child\n    }\n    return null\n  }\n\n  private fun List<Node>.lastProperNode(): Node? {\n    for (i in lastIndex downTo 0) {\n      if (this[i].isProper()) return this[i]\n    }\n    return null\n  }\n\n  // returns true if this node is not an affix or terminal\n  private fun Node.isProper(): Boolean = !type.isAffix && type != NodeType.TERMINAL\n\n  private fun Node.isMultiline(): Boolean = span.lineBegin < span.lineEnd\n\n  private fun List<Node>.isMultiline(): Boolean =\n    if (isEmpty()) false else first().span.lineBegin < last().span.lineEnd\n\n  private inline fun <T> List<T>.splitOn(pred: (T) -> Boolean): Pair<List<T>, List<T>> {\n    val index = indexOfFirst { pred(it) }\n    return if (index == -1) {\n      Pair(this, emptyList())\n    } else {\n      Pair(take(index), drop(index))\n    }\n  }\n\n  class PeekableIterator<T>(private val iterator: Iterator<T>) : Iterator<T> {\n    private var peek: T? = null\n\n    private var hasPeek = false\n\n    override fun next(): T {\n      return if (hasPeek) {\n        hasPeek = false\n        peek!!\n      } else {\n        iterator.next()\n      }\n    }\n\n    override fun hasNext(): Boolean {\n      return if (hasPeek) true else iterator.hasNext()\n    }\n\n    fun peek(): T {\n      if (!hasNext()) {\n        throw NoSuchElementException()\n      }\n      if (hasPeek) {\n        return peek!!\n      }\n      peek = iterator.next()\n      hasPeek = true\n      return peek!!\n    }\n\n    inline fun takeUntilBefore(predicate: (T) -> Boolean): List<T> {\n      return buildList {\n        while (true) {\n          if (!hasNext() || predicate(peek())) {\n            return@buildList\n          }\n          add(next())\n        }\n      }\n    }\n  }\n\n  private fun <T> Iterator<T>.peekable(): PeekableIterator<T> {\n    return PeekableIterator(this)\n  }\n\n  companion object {\n    private val ABSOLUTE_URL_REGEX = Regex(\"\"\"\\w+:.*\"\"\")\n\n    private val TWO_NEWLINES = Nodes(listOf(ForceLine, ForceLine))\n\n    private val FORCE_LINE_AFFIXES =\n      EnumSet.of(\n        NodeType.DOC_COMMENT_LINE,\n        NodeType.LINE_COMMENT,\n        NodeType.SEMICOLON,\n        NodeType.SHEBANG,\n      )\n\n    private val EMPTY_SUFFIXES =\n      EnumSet.of(\n        NodeType.TYPE_ARGUMENT_LIST,\n        NodeType.TYPE_ANNOTATION,\n        NodeType.TYPE_PARAMETER_LIST,\n        NodeType.PARAMETER_LIST,\n      )\n\n    private val SAME_LINE_EXPRS =\n      EnumSet.of(NodeType.NEW_EXPR, NodeType.AMENDS_EXPR, NodeType.FUNCTION_LITERAL_EXPR)\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/main/kotlin/org/pkl/formatter/Formatter.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\nimport java.nio.file.Files\nimport java.nio.file.Path\nimport org.pkl.formatter.ast.ForceLine\nimport org.pkl.formatter.ast.Nodes\nimport org.pkl.parser.GenericParser\n\n/** A formatter for Pkl files that applies canonical formatting rules. */\nclass Formatter {\n  /**\n   * Formats a Pkl file from the given file path.\n   *\n   * @param path the path to the Pkl file to format\n   * @param grammarVersion grammar compatibility version\n   * @return the formatted Pkl source code as a string\n   * @throws java.io.IOException if the file cannot be read\n   */\n  @JvmOverloads\n  fun format(path: Path, grammarVersion: GrammarVersion = GrammarVersion.latest()): String {\n    return format(Files.readString(path), grammarVersion)\n  }\n\n  /**\n   * Formats the given Pkl source code text.\n   *\n   * @param text the Pkl source code to format\n   * @param grammarVersion grammar compatibility version\n   * @return the formatted Pkl source code as a string\n   */\n  @JvmOverloads\n  fun format(text: String, grammarVersion: GrammarVersion = GrammarVersion.latest()): String {\n    val parser = GenericParser()\n    val builder = Builder(text, grammarVersion)\n    val gen = Generator()\n    val ast = parser.parseModule(text)\n    val formatAst = builder.format(ast)\n    // force a line at the end of the file\n    gen.generate(Nodes(listOf(formatAst, ForceLine)))\n    return gen.toString()\n  }\n}\n\n/** Grammar compatibility version. */\nenum class GrammarVersion(val version: Int, val versionSpan: String) {\n  V1(1, \"0.25 - 0.29\"),\n  V2(2, \"0.30+\");\n\n  companion object {\n    @JvmStatic fun latest(): GrammarVersion = entries.maxBy { it.version }\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/main/kotlin/org/pkl/formatter/Generator.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\nimport org.pkl.formatter.ast.Empty\nimport org.pkl.formatter.ast.ForceLine\nimport org.pkl.formatter.ast.FormatNode\nimport org.pkl.formatter.ast.Group\nimport org.pkl.formatter.ast.IfWrap\nimport org.pkl.formatter.ast.Indent\nimport org.pkl.formatter.ast.Line\nimport org.pkl.formatter.ast.MultilineStringGroup\nimport org.pkl.formatter.ast.Nodes\nimport org.pkl.formatter.ast.Space\nimport org.pkl.formatter.ast.SpaceOrLine\nimport org.pkl.formatter.ast.Text\nimport org.pkl.formatter.ast.Wrap\n\ninternal class Generator {\n  private val buf: StringBuilder = StringBuilder()\n  private var indent: Int = 0\n  private var size: Int = 0\n  private val wrapped: MutableSet<Int> = mutableSetOf()\n  private var shouldAddIndent = false\n\n  fun generate(node: FormatNode) {\n    node(node, Wrap.DETECT)\n  }\n\n  private fun node(node: FormatNode, wrap: Wrap) {\n    when (node) {\n      is Empty -> {}\n      is Nodes -> node.nodes.forEach { node(it, wrap) }\n      is Group -> {\n        val width = node.nodes.sumOf { it.width(wrapped) }\n        val wrap =\n          if (size + width > MAX) {\n            wrapped += node.id\n            Wrap.ENABLED\n          } else {\n            Wrap.DETECT\n          }\n        node.nodes.forEach { node(it, wrap) }\n      }\n      is IfWrap -> {\n        if (wrapped.contains(node.id)) {\n          node(node.ifWrap, Wrap.ENABLED)\n        } else {\n          node(node.ifNotWrap, wrap)\n        }\n      }\n      is Text -> text(node.text)\n      is Line -> {\n        if (wrap.isEnabled()) {\n          newline()\n        }\n      }\n      is ForceLine -> newline()\n      is SpaceOrLine -> {\n        if (wrap.isEnabled()) {\n          newline()\n        } else {\n          text(\" \")\n        }\n      }\n      is Space -> text(\" \")\n      is Indent -> {\n        if (wrap.isEnabled() && node.nodes.isNotEmpty()) {\n          size += INDENT.length\n          indent++\n          node.nodes.forEach { node(it, wrap) }\n          indent--\n        } else {\n          node.nodes.forEach { node(it, wrap) }\n        }\n      }\n      is MultilineStringGroup -> {\n        val indentLength = indent * INDENT.length\n        val oldIndent = indentFor(node)\n        var previousNewline = false\n        for ((i, child) in node.nodes.withIndex()) {\n          when {\n            child is ForceLine -> newline(shouldIndent = false) // don't indent\n            child is Text &&\n              previousNewline &&\n              child.text.isBlank() &&\n              child.text.length == oldIndent &&\n              node.nodes[i + 1] is ForceLine -> {}\n            child is Text && previousNewline ->\n              text(reposition(child.text, node.endQuoteCol - 1, indentLength))\n            else -> node(child, Wrap.DETECT) // always detect wrapping\n          }\n          previousNewline = child is ForceLine\n        }\n      }\n    }\n  }\n\n  private fun text(value: String) {\n    if (shouldAddIndent) {\n      repeat(times = indent) { buf.append(INDENT) }\n      shouldAddIndent = false\n    }\n    size += value.length\n    buf.append(value)\n  }\n\n  private fun newline(shouldIndent: Boolean = true) {\n    size = INDENT.length * indent\n    buf.append('\\n')\n    shouldAddIndent = shouldIndent\n  }\n\n  // accept text indented by originalOffset characters (tabs or spaces)\n  // and return it indented by newOffset characters (spaces only)\n  private fun reposition(text: String, originalOffset: Int, newOffset: Int): String =\n    \" \".repeat(newOffset) + text.drop(originalOffset)\n\n  // Returns the indent of this multiline string, which is the size of the last node before the\n  // closing quotes, or 0 if the closing quotes have no indentation\n  private fun indentFor(multi: MultilineStringGroup): Int {\n    val nodes = multi.nodes\n    if (nodes.size < 2) return 0\n    val beforeLast = nodes[nodes.lastIndex - 1]\n    return if (beforeLast is Text) beforeLast.text.length else 0\n  }\n\n  override fun toString(): String {\n    return buf.toString()\n  }\n\n  companion object {\n    // max line length\n    const val MAX = 100\n    private const val INDENT = \"  \"\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/main/kotlin/org/pkl/formatter/NaturalOrderComparator.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\ninternal class NaturalOrderComparator(private val ignoreCase: Boolean = false) :\n  Comparator<String> {\n\n  override fun compare(s1: String, s2: String): Int {\n    var i = 0\n    var j = 0\n\n    while (i < s1.length && j < s2.length) {\n      val c1 = if (ignoreCase) s1[i].lowercaseChar() else s1[i]\n      val c2 = if (ignoreCase) s2[j].lowercaseChar() else s2[j]\n\n      if (c1.isDigit() && c2.isDigit()) {\n        val (num1, nextI) = getNumber(s1, i)\n        val (num2, nextJ) = getNumber(s2, j)\n\n        val numComparison = num1.compareTo(num2)\n        if (numComparison != 0) {\n          return numComparison\n        }\n        i = nextI\n        j = nextJ\n      } else {\n        val charComparison = c1.compareTo(c2)\n        if (charComparison != 0) {\n          return charComparison\n        }\n        i++\n        j++\n      }\n    }\n\n    return s1.length.compareTo(s2.length)\n  }\n\n  private fun getNumber(s: String, startIndex: Int): LongAndInt {\n    var i = startIndex\n    val start = i\n\n    while (i < s.length && s[i].isDigit()) {\n      i++\n    }\n    val numStr = s.substring(start, i)\n    val number = numStr.toLongOrNull() ?: 0L\n    return LongAndInt(number, i)\n  }\n\n  // use this instead of Pair to avoid boxing\n  private data class LongAndInt(val l: Long, var i: Int)\n}\n"
  },
  {
    "path": "pkl-formatter/src/main/kotlin/org/pkl/formatter/ast/FormatNode.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter.ast\n\nimport org.pkl.formatter.Generator\n\nenum class Wrap {\n  ENABLED,\n  DETECT;\n\n  fun isEnabled(): Boolean = this == ENABLED\n}\n\nsealed interface FormatNode {\n  fun width(wrapped: Set<Int>): Int =\n    when (this) {\n      is Nodes -> nodes.sumOf { it.width(wrapped) }\n      is Group -> nodes.sumOf { it.width(wrapped) }\n      is Indent -> nodes.sumOf { it.width(wrapped) }\n      is IfWrap -> if (id in wrapped) ifWrap.width(wrapped) else ifNotWrap.width(wrapped)\n      is Text -> text.length\n      SpaceOrLine,\n      Space -> 1\n      ForceLine,\n      is MultilineStringGroup -> Generator.MAX\n      Empty -> 0\n      Line -> 0\n    }\n}\n\ndata class Text(val text: String) : FormatNode\n\nobject Empty : FormatNode\n\nobject Line : FormatNode\n\nobject ForceLine : FormatNode\n\nobject SpaceOrLine : FormatNode\n\nobject Space : FormatNode\n\ndata class Indent(val nodes: List<FormatNode>) : FormatNode\n\ndata class Nodes(val nodes: List<FormatNode>) : FormatNode\n\ndata class Group(val id: Int, val nodes: List<FormatNode>) : FormatNode\n\ndata class MultilineStringGroup(val endQuoteCol: Int, val nodes: List<FormatNode>) : FormatNode\n\ndata class IfWrap(val id: Int, val ifWrap: FormatNode, val ifNotWrap: FormatNode) : FormatNode\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/class-bodies.pkl",
    "content": "class Foo {\n\n}\n\nclass Bar\n{\n  qux = 1\n}\n\nclass Baz { prop = 0; prop2 = 1 }\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/comma-termination.pkl",
    "content": "function fun(a, b, c, d) = a\n\nnoTrailingCommas = fun(1, 2, 3, 4,)\n\ntrailingCommas = fun(\"loooooooooooooooooooongString\", \"loooooooooooooooongString\", \"looooooooooooooooongString\", \"notTooLong\")\n\nnoTrailingCommaObjParams {\n  fooooooooooooooooooooooooooooooooo, baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar, baaaaaaaaaaaaaaaaaaaaaz ->\n  1 + 1\n}\n\ntrailingCommaInLambdas = (fooooooooooooooooooooooooooooooooo, baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar, baaaaaaaaaaaaaaaaaaaaaz) -> 1\n\ntrailingCommaInConstraints: String(isSomethingSomethingSomething, isSomethingElse, isSomethingSomethingSomethingElse)\n\ntrailingCommaInTypeParameters: Mapping<SomethingSomethingSomethingSomething, SomethingSomething | SomethingElse>\n\nfunctionType: (ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType, ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType2, /* comment */) -> String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/comment-interleaved.pkl",
    "content": "module comment.interleaved\n\nlocal test: Int|String =\n  if (true)\n    1 // It's the same as \"100%\"\n  else\n    \"8%\"\n\nfoo: ( // some comment\n  * String(\n      // if dtstart is defined and a datetime, until must also be a datetime if defined\n      true\n    )\n  |Int\n  // trailing comment\n  )?\n\nfoo2: (// some comment\n  Int, // other comment\n    String\n  ) ->Int\n\nbar = ( // some comment\n  10 + 10\n  // another comment\n  )\n\nbar2 = ( // some comment\n    foo, bar\n    // another comment\n  ) -> foo + bar\n\nbar3 =\n  let (bar = new Dynamic {})\n    // some coment\n    (bar) {\n      qux = 4\n    }\n\nbar4 =\n  // some coment\n  let (bar = new Dynamic {})\n    (bar) {\n      qux = 4\n    }\n\nbar5 =\n  let (bar = 4)\n  // some coment\n  let (qux = 5)\n    bar + qux\n\nbar6 =\n  let (bar = 4)\n    /* some comment */ bar + 5\n\nbar7 =\n  let (bar = 4) /* some comment */\n    bar + 5\n\nbar8 =\n  let (bar = 4)\n    // some comment\n    // another comment\n  let (foo = 5)\n    // some comment\n    // another comment\n      bar + foo\n\nbar9 =\n  let (bar = 4)\n    // some comment\n    // another comment\n    bar\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/dangling-doc-comment.pkl",
    "content": "module dangling\n\n/// Doc comment.\n///\n/// for this field\n// sepearted by a stray comment\n/// but continues here.\nsome: String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/doc-comments.pkl",
    "content": "\n//// line 1\n///// line 2\nfoo = 1\n\n/// line 1\n///      \n/// \n/// line 2\nbar = 1\n\n///line 1\n///line 2\nbaz = 1\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/expr-binary.pkl",
    "content": "foo {\n  123123123123 + 123123123123 * 123123123123 - 123123123123 / 123123123123 + 123123123123 ** 123123123123\n  2\n  3\n  4\n}\n\nbar = clazz.superclass == null || clazz.superclass.reflectee == Module || clazz.superclass.reflectee == Typed\n\nbaz =\nnew Listing {\n  1\n  2\n} |> mixin1 |> mixin2\n\nqux =\n  (baz) {\n    1\n    2\n  } {\n    3\n    4\n  }\n\nminus = superLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongVariable - 100000\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/expr-chain-grouping.pkl",
    "content": "res1 = foo.bar(new {\n  foo = 1\n})\n\nres2 = foo.bar.baz(new {\n  foo =1\n})\n\nres3 = foo.bar(3).baz(new {\n  qux = 3\n})\n\nres4 = foooooooooooooooooooooooooooooooooooooo.foooooooooooooooooooooooooooooooooooooo.foooooooooooooooooooooooooooooooooooooo.bar(5)\n\nres5 = foooooooooooooo.foooooooooooooo.foooooooooooooo.foooooooooooooo.foooooooooooooo(4).foooooooooooooo.bar(5)\n\nres6 = foooooooooooooooooooooooooooooooooooooo.foooooooooooooooooooooooooooooooooooooo.foooooooooooooooooooooooooooooooooooooo.foooooooooooooo(4).foooooooooooooo.bar(5)\n\nres7 = foooooooooooooo.foooooooooooooo.foooooooooooooo.foooooooooooooo /* hello */ .foooooooooooooo(4).foooooooooooooo.bar(5)\n\nres8 = foooooooooooooo.foooooooooooooo.foooooooooooooo().foooooooooooooo.foooooooooooooo(4).foooooooooooooo.bar(5)\n\nres9 = foo.bar(new { \n  foo = 1\n  bar = 2\n}).qux\n\nres10 = foo.bar /* some comment */ (5)\n\nres11 = foo.bar /* some comment */.baz(new { foooooooooooooooooooooooooo = 1; baaaaaaaaaaaaaaaaaaaaar = 2 }).buz\n\nres12 = foo.biz\n  .bar((it) -> it + 2)\n  .qux((it) -> it + 1)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/expr-chain.pkl",
    "content": "res = myList.map((it) -> it.partition).filter((it) -> someList.contains(it))\n\nres2 = myList.map(lambda1).filter(lambda2)\n\nres3 = myList.map((it) -> it.partition)\n\nres4 = myList.foo.map((it) -> it.partition)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/expr-if.pkl",
    "content": "foo =\n  if (someCondition) 10000\n  else\n    if (someOtherCondition) 20000\n    else\n      if (someAnotherCondition) 30000\n      else 4\n\nfoo2 = if (bar) 1 else 2\n\n// respect newlines in if/else if they exist.\n// if anything of these wrap, everything wraps.\nfoo3 =\n  if (bar)\n    1 else 2\n\nfoo4 =\n  if (bar) 1 else \n    2\n\nfoo5 =\n  if (bar) 1\n  else 2\n\nfoo6 =\n  if (bar)\n    1\n  else\n    2\n\nfoo7 =\n  if /* some comment */ (bar) 1\n  else 2\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/expr-let.pkl",
    "content": "\nfoo = let (vaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaariable = 10) 1 * 1\n\nbar = let (someVariable = new Listing {\n    1\n  }) 1 * 1\n\nbaz =\n  let (someVariable = 10000000)\n    let (someOtherVariable = 2000000)\n      let (someAnotherVariable = 3000000) someVariable + someOtherVariable + someAnotherVariable\n\nqux = let ( // some comment\n    // another comment\n    bar = 5\n  )\n    bar\n\nquzzy =\n  let (baz = 1) baz + 1\n\n// respect newlines in lets\nquzzzy =\n  let (baz = 1)\n    baz + 1\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/imports.pkl",
    "content": "// top level comment\n\nimport \"@foo/Foo.pkl\" as foo\nimport* \"**.pkl\" /* ** */ // glob import\nimport \"pkl:math\"\n\nimport \"package://example.com/myPackage@1.0.0#/Qux.pkl\"\nimport* \"file:///tmp/*.pkl\"\n\n\nimport \"https://example.com/baz.pkl\"\n// module2 leading\n// module2 leading 2\nimport \"module2.pkl\"\nimport \"pkl:reflect\"\nimport \"...\"\nimport* \"@foo/**.pkl\"\nimport \"@bar/Bar.pkl\"\nimport \"Module12.pkl\"\n/* module 11 leading */\nimport \"module11.pkl\" /* module11 block */ // trailing module11\nimport \"module1.pkl\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/indentation.pkl",
    "content": "foo = new {\nbar = 1\n}\n\nclass Foo {\n    baz: Int\n}\n\nbar =\n  new Listing {\n    1\n    2\n  }\n\nbaz =\n(foo) {\n  2\n  3\n}\n\nqux =\n  (x, y) -> new Listing {\n    x\n    y\n  }\n\nforGen = new Listing {\n  for (someVar in new Listing {\n    1\n    2\n  }) {\n    [someVar] = someVar\n  }\n}\n\nobjParams: Listing<Int> =\n  new {\n  default {\n    key -> key + 1\n  }\n}\n\nobjParams2: Listing<Int> = new {\n  default { someVeryLongParameter1, someVeryLongParameter2, someVeryLongParameter3, someVeryLongParameter4 ->\n    1\n  }\n}\n\nparenType: (ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType(reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalylongConstraint))\n\nfunctionType: (ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType,ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType2) -> String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/line-breaks.pkl",
    "content": "module\nfoo.bar.baz\namends\n\"bar.pkl\"\n\nimport\n\"@foo/Foo.pkl\"\nas foo\n\nlocal\nopen\nclass Bar {}\n\nconst\nlocal\nbaz = 10\n\nlocal\nfunction\nfun(x) =\n  x\n\nconst local prooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooperty: String = \"foo\"\n\nlocal function function2(parameter1: Parameter1Type, parameter2: Parameter2Type, parameter3: Parameter3Type, parameter4: Parameter4Type): String = \"\"\n\nlocal const function function3(parameter1: String|Int, parameter2: String|Int): Mapping<String|Int, String> =\n  new {}\n\nprop = function2(loooooooooooooooooogParameter1, loooooooooooooooooogParameter2, loooooooooooooooooogParameter3, loooooooooooooooooogParameter4)\n\nprop2: String\n  |Int\n  |Boolean\n\nfuncParam = fun(\n  (x, y) -> new Listing {\n  x\n  y\n})\n\nfuncParam2 = aFun(foo, 10 * 10, anotherVariable, if (true) 100000 else 200000, (param1, param2) -> param1 * param2)\n\nfuncParam3 = aFun(foo, 10 * 10, anotherVariable, 200000, (param1, param2) -> param1 * param2)\n\nfuncParam4 = aFun(foo, 10 * 10, anotherVariable, if (true) 100000 else 200000, new Listing {\n  1\n  2\n})\n\nopen local class SomeReallyInterestingClassName<in SomeInParameter, out SomeOutParameter> extends AnotherInterestingClassName {\n  foo: Int\n}\n\nlocal function resourceMapping(type): Mapping<String, unknown> =\n  new Mapping { default = (key) -> (type) { metadata { name = key } } }\n\nlocal const function biiiiiiiiiiiiiiiiiiiiiiiiigFunction(param1: String, param2: String(!isBlank)): Boolean\n\nlocal const function someFunction(param1: String, param2: String(!isBlank)): Boolean\n\nlocal function render(currentIndent: String) =\n  \"\\(currentIndent)@\\(identifier.render(currentIndent))\" +\n    if (body == null) \"\" else \" \" + body.render(currentIndent)\n\nitems: List<Item> =\n  allItems\n    .filter((item) ->\n    badItems.containsKey(item) // some line comment \n    || item.tags.toList().findOrNull((it) -> it.type == \"bookmark\") != null // some other line comment\n  )\n    .sortBy((item) -> item.name)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/line-breaks2.pkl",
    "content": "module reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly.loooooooooooooooooooooooooooooooog.naaaaaaaaaaaaaaaaaaaaaaaaaame\nextends \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongModule.pkl\"\n\nimport \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongModule.pkl\" as foo\n\nlocal open class LoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongName {}\n\nlocal open class ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongName {}\n\nconst hidden loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName = 99\n\nconst hidden reallyLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName = 99\n\nconst local function looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName(x: Int, y) = x + y\n\ntypealias Foo = LooooooooooooooooooooooooongTypeName|AnotherLooooooooooooooooooooooooongTypeName|OtherLooooooooooooooooooooooooongTypeName\n\nbar: Boolean|Mapping<LooooooooooooooooooooooooooooongTypeName, AnotherLooooooooooooooooooooooooooooongTypeName>(loooooooooooooooooooogConstraint)\n\nhidden foobar: LongType(someVeryyyyyyyloooong, requirements.might.be.even_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooonger)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/line-breaks3.pkl",
    "content": "// respect line breaks on:\n// * operator chains\n// * argument lists in method calls\n//\n// only look for line breaks on either side of the operator, or the comma.\nres1 =\n  foo\n    * bar\n    * baz\n\nres2 = foo\n  |> bar + bar\n  |> baz\n\nres3 = foo\n  |> bar\n    + baz\n  |> qux\n\nres4 = foo(\n  (it) -> it + 1,\n  (it) -> it + 2\n)\n\nres5 = foo(\n  1,\n  2, 3, 4\n)\n\n// don't respect newlines right after opening paren and closing paren\nres6 = foo.bar(\n  1, 2, 3\n)\n\n// only respect newlines on either side of a binary operator (we still want to inline `bar(3)` here).\nres7 = foo + bar(\n      3\n    ) + baz\n\n// only the newlines after each \"entry\" are respected \nres8 = Map(\n  1, 2,\n  3, 4\n)\n\nres9 = Map(\n  1,\n  2,\n  3, 4\n)\n\nres10 = foo(1\n  ,2\n  ,3)\n\nres11 = foo +\n  bar +\n  baz\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/line-width.pkl",
    "content": "module reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly.loooooooooooooooooooooooooooooooog.naaaaaaaaaaaaaaaaaaaaaaaaaaaaame\nextends \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongModule.pkl\"\n\nlocal reallyLongVariableName = true\nlocal anotherReallyLongName = 1\nlocal evenLongerVariableName = 2\n\n/// this property has a reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly long doc comment\nproperty = if (reallyLongVariableName) anotherReallyLongName else evenLongerVariableName + anotherReallyLongName\n\nlongString = \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly long string\"\n\nshortProperty = 1\n\nreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongVariableName = 10\n\nreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongVariableName2 =\n  if (reallyLongVariableName) anotherReallyLongName else evenLongerVariableName + anotherReallyLongName\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/map-function.pkl",
    "content": "\nfoo = Map(1000, \"some random string\", 20000, \"another random string\", 30000, \"yet another random string\")\n\nincorrect = Map(\"This has\", 1000000, \"an incorrect number\", 2000000, \"of parameters\", 30000000, \"passed to Map\")\n\nbar =\n  Map(\n    // leading\n    1,\n    2,\n    // between\n    3,\n    4, // trailing\n    5,\n    6,\n    7, // mid\n    8,\n    9,\n    10\n  )\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/method-call-trailing-lambdas.pkl",
    "content": "// multiple lambda arguments means argument list wraps\nres1 = foo.toMap(\n  (elem) -> elem.toString(),\n  (elem) -> elem.toString().split(\"\").map((str) -> str + \"hello\").toSet()\n)\n\n// new object and trailing lambda means argument list wraps\nres2 = foo.doFoo(\n  new Listing { 1; 2; 3 },\n  (elem) -> elem.toString().split(\"\").map((str) -> str + \"hello\").toSet()\n)\n\n// single trailing lambda is broken on its own\nres4 = foo.foldLeft(\n  \"heeeeeeelloooooooooooooooooooooooooooooooooooooooooooooo\",\n  (elem) -> elem.foooooooooooooooooooooooooooooooooooooooooooooooooooo\n)\n\nres5 = ifNonNull((it) -> someFunctionCall(it as SomeReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongTypeName))\n\nres6 = ifNonNull((it) -> someFunctionCall(it as SomeReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongTypeNameLonger))\n\nres7 =\n  qux(bar, (a) ->\n    hello // some comment\n  )\n\nres8 = qux(\n  // some comment\n  (a) -> bar\n)\n\nres9 =\n  qux(bar, new {\n    bar = 1\n  } // some comment\n  )\n\nres10 = (a) -> hello // some comment\n\nres11 =\n  qux(bar, (a) ->\n    hello\n    // some comment\n  )\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/modifiers.pkl",
    "content": "hidden const foo = 1\n\nopen local class Foo {}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/module-definitions.pkl",
    "content": "// comment\n// one\n\n\n/// doc comment\n\nopen\nmodule\nfoo\n  .bar\n\namends\n\"baz.pkl\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/multi-line-strings.pkl",
    "content": "foo = \"\"\"\n  asd \\(new {\n  bar = 1\n}) asd\n  \"\"\"\n\nbar = \"\"\"\n      line 1\n        line 2\n          line3\n      \"\"\"\n\nbaz = \"\"\"\n\\n\n\\(bar)\nline\n\\u{123}\n\"\"\"\n\n// remove unneeded spaces\nqux = \"\"\"\n  foo\n  \n  bar\n  \n  baz\n    \n  \\(foo)\n  \"\"\"\n\n// mixed tabs and spaces\nquux {\n  // space tab\n  \"\"\"\n \tbar\n\n \tbaz\n \t\\(1)\n\n \t\"\"\"\n  // tab tab\n  \"\"\"\n\t\tbar\n\n\t\tbaz\n\t\t\\(1)\n\n\t\t\"\"\"\n}\n\nobj {\n    data {\n      [\"bar\"] = \"\"\"\n        foo\n        \n        \"\"\"\n    }\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/object-members.pkl",
    "content": "foo: Listing<Int> = new {1 2   3; 4;5 6  7}\n\nbar: Listing<Int> = new { 1 2\n  3\n  4\n}\n\nlineIsTooBig: Listing<Int> = new { 999999; 1000000; 1000001; 1000002; 1000003; 1000004; 1000005; 1000006; 1000007; 1000008; 1000009 }\n\nlineIsTooBig2 { 999999; 1000000; 1000001; 1000002; 1000003; 1000004; 1000005; 1000006; 1000007; 1000008; 1000009; 1000010 }\n\nbaz = new Dynamic {\n  1 2\n  3 4\n\n  [\"foo\"] = 3; bar = 30\n\n\n  baz = true\n}\n\nqux = new Dynamic {1 2 3 prop=\"prop\"; [0]=9}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/prefixes.pkl",
    "content": "\n/// Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong doc comment\n@Annotation { looooooooooooooooooooooooooooooooooooooooooooooooooongVariableName = 10 }\ntypealias Foo = String\n\n/// Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong doc comment\n@Annotation { looooooooooooooooooooooooooooooooooooooooooooooooooongVariableName = 10 }\nfoo = \"should fit in a single line\"\n\n/// Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong doc comment\n@Annotation { looooooooooooooooooooooooooooooooooooooooooooooooooongVariableName = 10 }\nfunction bar(x): String = \"result: \\(x)\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/single-line-strings.pkl",
    "content": "foo1 = \"some string\"\n\nfoo2 = \"some string with \\( new { x = 1; y = 2 }) interpolation\"\n\nfoo3 = \"some reeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally long string with \\( new { x = 1; y = 2 } ) interpolation\"\n\nfoo4 = \"some reeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally long string with \\( foo.bar.baz() ) qualified access\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/spaces.pkl",
    "content": "import\"foo.pkl\"\n\nbar=new  Listing < Int > ( !isEmpty ){1;2}//a bar\n\ntypealias Typealias=(String,Int)->Boolean\n\n///a baz\n///returns its parameter\nbaz = (x,y,z)->x+y+z\n\nfunction fun ( x:Int ? ,b  :Boolean )= if(b)/***return x**/x else x+bar [0 ]\n\nprop = trace (1) + super . foo + module .foo\n\nprop2 {\n  for(x in List(1)) {\n    when(x == 1){\n      x\n    }\n  }\n}\n\nchoices: \"foo\" | * \"bar\" | String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/string-interpolation.pkl",
    "content": "prop1 =\n  \"\"\"\n  asd \\(new { bar = 1 }) asd\n  \"\"\"\n\nprop2 =\n  \"\"\"\n  \\(let (bar = 15) bar + new { qux = 15 }.toString())\n  \"\"\"\n\nprop3 =\n  \"\"\"\n  \\(new {\n    // some comment\n    foo = 1\n\n    // some comment\n    bar = 2\n  })\n  \"\"\"\n\nprop4 =\n  \"\"\"\n  \\(1 + /* block comment */ 2)\n  \"\"\"\n\nprop5 =\n  \"\"\"\n  \\(\"\"\"\n  foo\n  bar\n  baz\n  \"\"\")\n  \"\"\"\n\nprop6 = \"\\(// some line comment\n  /* some block comment */\n  \"\\(\"\"\"\n    one\n    two\n    three\n    \"\"\")\"\n  // some line comment again\n)\"\n\nprop7 = \"\\(\n5\n// trailing line comment\n)\"\n\nprop8 = \"\\(new { foo = 1 bar = 2 baz = 3 })\"\n\nprop9 = \"\\(if (true) 1 else 2)\"\n\nprop10 = \"\\(\n  if (true) 1\n  else 2\n)\"\n\nprop11 = \"\\(\n  new {\n    1;\n    2;\n    3;\n  }\n)\"\n\n// single line expressions are not broken up\nprop12 = \"Some \\(if (true) 1 else 2) reeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallly long string with interpolation\"\n\n// multi-line expressions are preserved\nprop13 = \"Some \\(\n  if (true)\n    1\n  else 2\n  ) reeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallly long string with interpolation\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/type-aliases.pkl",
    "content": "typealias\n  Foo\n  =\n  String\n\ntypealias VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongTypeAlias = String(!isEmpty)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/input/when.pkl",
    "content": "foo {\n  when  (true)\n  {\n  bar = 1\n  }\n  else {\n    bar = 2\n  }\n}\n\nbar {\n  when (new Listing {\n    1\n    2\n  }.contains(1)) {\n    \"1\"\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/class-bodies.pkl",
    "content": "class Foo {}\n\nclass Bar {\n  qux = 1\n}\n\nclass Baz {\n  prop = 0\n\n  prop2 = 1\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/comma-termination.pkl",
    "content": "function fun(a, b, c, d) = a\n\nnoTrailingCommas = fun(1, 2, 3, 4)\n\ntrailingCommas =\n  fun(\n    \"loooooooooooooooooooongString\",\n    \"loooooooooooooooongString\",\n    \"looooooooooooooooongString\",\n    \"notTooLong\",\n  )\n\nnoTrailingCommaObjParams {\n    fooooooooooooooooooooooooooooooooo,\n    baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar,\n    baaaaaaaaaaaaaaaaaaaaaz ->\n  1 + 1\n}\n\ntrailingCommaInLambdas = (\n  fooooooooooooooooooooooooooooooooo,\n  baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar,\n  baaaaaaaaaaaaaaaaaaaaaz,\n) -> 1\n\ntrailingCommaInConstraints: String(\n  isSomethingSomethingSomething,\n  isSomethingElse,\n  isSomethingSomethingSomethingElse,\n)\n\ntrailingCommaInTypeParameters: Mapping<\n  SomethingSomethingSomethingSomething,\n  SomethingSomething | SomethingElse,\n>\n\nfunctionType: (\n  ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType,\n  ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType2 /* comment */,\n) ->\n  String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/comment-interleaved.pkl",
    "content": "module comment.interleaved\n\nlocal test: Int | String =\n  if (true)\n    1 // It's the same as \"100%\"\n  else\n    \"8%\"\n\nfoo: ( // some comment\n  *String(\n    // if dtstart is defined and a datetime, until must also be a datetime if defined\n    true,\n  )\n    | Int\n  // trailing comment\n)?\n\nfoo2: ( // some comment\n  Int, // other comment\n  String,\n) ->\n  Int\n\nbar =\n  ( // some comment\n    10 + 10\n    // another comment\n  )\n\nbar2 = ( // some comment\n  foo,\n  bar\n  // another comment\n) -> foo + bar\n\nbar3 =\n  let (bar = new Dynamic {})\n    // some coment\n    (bar) {\n      qux = 4\n    }\n\nbar4 =\n  // some coment\n  let (bar = new Dynamic {})\n    (bar) {\n      qux = 4\n    }\n\nbar5 =\n  let (bar = 4)\n  // some coment\n  let (qux = 5)\n    bar + qux\n\nbar6 =\n  let (bar = 4)\n    /* some comment */ bar + 5\n\nbar7 =\n  let (bar = 4) /* some comment */\n    bar + 5\n\nbar8 =\n  let (bar = 4)\n  // some comment\n  // another comment\n  let (foo = 5)\n    // some comment\n    // another comment\n    bar + foo\n\nbar9 =\n  let (bar = 4)\n    // some comment\n    // another comment\n    bar\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/dangling-doc-comment.pkl",
    "content": "module dangling\n\n/// Doc comment.\n///\n/// for this field\n// sepearted by a stray comment\n/// but continues here.\nsome: String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/doc-comments.pkl",
    "content": "/// / line 1\n/// // line 2\nfoo = 1\n\n/// line 1\n///\n///\n/// line 2\nbar = 1\n\n/// line 1\n/// line 2\nbaz = 1\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/expr-binary.pkl",
    "content": "foo {\n  123123123123\n    + 123123123123 * 123123123123 -\n    123123123123 / 123123123123\n    + 123123123123 ** 123123123123\n  2\n  3\n  4\n}\n\nbar =\n  clazz.superclass == null\n    || clazz.superclass.reflectee == Module\n    || clazz.superclass.reflectee == Typed\n\nbaz =\n  new Listing {\n    1\n    2\n  }\n    |> mixin1\n    |> mixin2\n\nqux = (baz) {\n  1\n  2\n} {\n  3\n  4\n}\n\nminus =\n  superLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongVariable -\n    100000\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/expr-chain-grouping.pkl",
    "content": "res1 =\n  foo.bar(new {\n    foo = 1\n  })\n\nres2 =\n  foo.bar.baz(new {\n    foo = 1\n  })\n\nres3 =\n  foo\n    .bar(3)\n    .baz(new {\n      qux = 3\n    })\n\nres4 =\n  foooooooooooooooooooooooooooooooooooooo\n    .foooooooooooooooooooooooooooooooooooooo\n    .foooooooooooooooooooooooooooooooooooooo\n    .bar(5)\n\nres5 =\n  foooooooooooooo.foooooooooooooo.foooooooooooooo.foooooooooooooo\n    .foooooooooooooo(4)\n    .foooooooooooooo\n    .bar(5)\n\nres6 =\n  foooooooooooooooooooooooooooooooooooooo\n    .foooooooooooooooooooooooooooooooooooooo\n    .foooooooooooooooooooooooooooooooooooooo\n    .foooooooooooooo(4)\n    .foooooooooooooo\n    .bar(5)\n\nres7 =\n  foooooooooooooo.foooooooooooooo.foooooooooooooo.foooooooooooooo /* hello */\n    .foooooooooooooo(4)\n    .foooooooooooooo\n    .bar(5)\n\nres8 =\n  foooooooooooooo.foooooooooooooo\n    .foooooooooooooo()\n    .foooooooooooooo\n    .foooooooooooooo(4)\n    .foooooooooooooo\n    .bar(5)\n\nres9 =\n  foo\n    .bar(new {\n      foo = 1\n      bar = 2\n    })\n    .qux\n\nres10 = foo.bar /* some comment */ (5)\n\nres11 =\n  foo.bar /* some comment */\n    .baz(new { foooooooooooooooooooooooooo = 1; baaaaaaaaaaaaaaaaaaaaar = 2 })\n    .buz\n\nres12 =\n  foo.biz\n    .bar((it) -> it + 2)\n    .qux((it) -> it + 1)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/expr-chain.pkl",
    "content": "res =\n  myList\n    .map((it) -> it.partition)\n    .filter((it) -> someList.contains(it))\n\nres2 = myList.map(lambda1).filter(lambda2)\n\nres3 = myList.map((it) -> it.partition)\n\nres4 = myList.foo.map((it) -> it.partition)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/expr-if.pkl",
    "content": "foo =\n  if (someCondition)\n    10000\n  else if (someOtherCondition)\n    20000\n  else if (someAnotherCondition)\n    30000\n  else\n    4\n\nfoo2 = if (bar) 1 else 2\n\n// respect newlines in if/else if they exist.\n// if anything of these wrap, everything wraps.\nfoo3 =\n  if (bar)\n    1\n  else\n    2\n\nfoo4 =\n  if (bar)\n    1\n  else\n    2\n\nfoo5 =\n  if (bar)\n    1\n  else\n    2\n\nfoo6 =\n  if (bar)\n    1\n  else\n    2\n\nfoo7 =\n  if /* some comment */ (bar)\n    1\n  else\n    2\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/expr-let.pkl",
    "content": "foo =\n  let (\n    vaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaariable =\n      10\n  )\n    1 * 1\n\nbar =\n  let (\n    someVariable = new Listing {\n      1\n    }\n  )\n    1 * 1\n\nbaz =\n  let (someVariable = 10000000)\n  let (someOtherVariable = 2000000)\n  let (someAnotherVariable = 3000000)\n    someVariable + someOtherVariable + someAnotherVariable\n\nqux =\n  let ( // some comment\n    // another comment\n    bar = 5\n  )\n    bar\n\nquzzy = let (baz = 1) baz + 1\n\n// respect newlines in lets\nquzzzy =\n  let (baz = 1)\n    baz + 1\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/imports.pkl",
    "content": "// top level comment\n\nimport \"https://example.com/baz.pkl\"\nimport \"package://example.com/myPackage@1.0.0#/Qux.pkl\"\nimport \"pkl:math\"\nimport \"pkl:reflect\"\n\nimport \"@bar/Bar.pkl\"\nimport \"@foo/Foo.pkl\" as foo\n\nimport \"...\"\nimport \"module1.pkl\"\n// module2 leading\n// module2 leading 2\nimport \"module2.pkl\"\n/* module 11 leading */\nimport \"module11.pkl\" /* module11 block */ // trailing module11\nimport \"Module12.pkl\"\n\nimport* \"file:///tmp/*.pkl\"\n\nimport* \"@foo/**.pkl\"\n\nimport* \"**.pkl\" /* ** */ // glob import\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/indentation.pkl",
    "content": "foo = new {\n  bar = 1\n}\n\nclass Foo {\n  baz: Int\n}\n\nbar = new Listing {\n  1\n  2\n}\n\nbaz = (foo) {\n  2\n  3\n}\n\nqux = (x, y) -> new Listing {\n  x\n  y\n}\n\nforGen = new Listing {\n  for (\n    someVar in new Listing {\n      1\n      2\n    }\n  ) {\n    [someVar] = someVar\n  }\n}\n\nobjParams: Listing<Int> = new {\n  default { key ->\n    key + 1\n  }\n}\n\nobjParams2: Listing<Int> = new {\n  default {\n      someVeryLongParameter1,\n      someVeryLongParameter2,\n      someVeryLongParameter3,\n      someVeryLongParameter4 ->\n    1\n  }\n}\n\nparenType: (\n  ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType(\n    reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalylongConstraint,\n  )\n)\n\nfunctionType: (\n  ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType,\n  ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongType2,\n) ->\n  String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/line-breaks.pkl",
    "content": "module foo.bar.baz\n\namends \"bar.pkl\"\n\nimport \"@foo/Foo.pkl\" as foo\n\nopen local class Bar {}\n\nlocal const baz = 10\n\nlocal function fun(x) = x\n\nlocal const prooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooperty: String =\n  \"foo\"\n\nlocal function function2(\n  parameter1: Parameter1Type,\n  parameter2: Parameter2Type,\n  parameter3: Parameter3Type,\n  parameter4: Parameter4Type,\n): String = \"\"\n\nlocal const function function3(\n  parameter1: String | Int,\n  parameter2: String | Int,\n): Mapping<String | Int, String> = new {}\n\nprop =\n  function2(\n    loooooooooooooooooogParameter1,\n    loooooooooooooooooogParameter2,\n    loooooooooooooooooogParameter3,\n    loooooooooooooooooogParameter4,\n  )\n\nprop2: String | Int | Boolean\n\nfuncParam =\n  fun((x, y) -> new Listing {\n    x\n    y\n  })\n\nfuncParam2 =\n  aFun(foo, 10 * 10, anotherVariable, if (true) 100000 else 200000, (param1, param2) ->\n    param1 * param2\n  )\n\nfuncParam3 = aFun(foo, 10 * 10, anotherVariable, 200000, (param1, param2) -> param1 * param2)\n\nfuncParam4 =\n  aFun(foo, 10 * 10, anotherVariable, if (true) 100000 else 200000, new Listing {\n    1\n    2\n  })\n\nopen local class SomeReallyInterestingClassName<in SomeInParameter, out SomeOutParameter>\n  extends AnotherInterestingClassName {\n  foo: Int\n}\n\nlocal function resourceMapping(type): Mapping<String, unknown> = new Mapping {\n  default = (key) -> (type) { metadata { name = key } }\n}\n\nlocal const function biiiiiiiiiiiiiiiiiiiiiiiiigFunction(\n  param1: String,\n  param2: String(!isBlank),\n): Boolean\n\nlocal const function someFunction(param1: String, param2: String(!isBlank)): Boolean\n\nlocal function render(currentIndent: String) =\n  \"\\(currentIndent)@\\(identifier.render(currentIndent))\"\n    + if (body == null) \"\" else \" \" + body.render(currentIndent)\n\nitems: List<Item> =\n  allItems\n    .filter(\n      (item) ->\n        badItems.containsKey(item) // some line comment \n          || item.tags.toList().findOrNull((it) -> it.type == \"bookmark\") != null // some other line comment\n    )\n    .sortBy((item) -> item.name)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/line-breaks2.pkl",
    "content": "module reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly.loooooooooooooooooooooooooooooooog.naaaaaaaaaaaaaaaaaaaaaaaaaame\n\nextends\n  \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongModule.pkl\"\n\nimport\n  \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongModule.pkl\"\n  as foo\n\nopen local class LoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongName {}\n\nopen local class ReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongName {}\n\nhidden const loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName =\n  99\n\nhidden const reallyLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName =\n  99\n\nlocal const function looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName(\n  x: Int,\n  y,\n) = x + y\n\ntypealias Foo =\n  LooooooooooooooooooooooooongTypeName\n    | AnotherLooooooooooooooooooooooooongTypeName\n    | OtherLooooooooooooooooooooooooongTypeName\n\nbar: Boolean\n  | Mapping<\n    LooooooooooooooooooooooooooooongTypeName,\n    AnotherLooooooooooooooooooooooooooooongTypeName,\n  >(loooooooooooooooooooogConstraint)\n\nhidden foobar: LongType(\n  someVeryyyyyyyloooong,\n  requirements.might.be.even_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooonger,\n)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/line-breaks3.pkl",
    "content": "// respect line breaks on:\n// * operator chains\n// * argument lists in method calls\n//\n// only look for line breaks on either side of the operator, or the comma.\nres1 =\n  foo\n    * bar\n    * baz\n\nres2 =\n  foo\n    |> bar + bar\n    |> baz\n\nres3 =\n  foo\n    |> bar\n      + baz\n    |> qux\n\nres4 =\n  foo(\n    (it) -> it + 1,\n    (it) -> it + 2,\n  )\n\nres5 =\n  foo(\n    1,\n    2,\n    3,\n    4,\n  )\n\n// don't respect newlines right after opening paren and closing paren\nres6 = foo.bar(1, 2, 3)\n\n// only respect newlines on either side of a binary operator (we still want to inline `bar(3)` here).\nres7 = foo + bar(3) + baz\n\n// only the newlines after each \"entry\" are respected \nres8 =\n  Map(\n    1, 2,\n    3, 4,\n  )\n\nres9 =\n  Map(\n    1, 2,\n    3, 4,\n  )\n\nres10 =\n  foo(\n    1,\n    2,\n    3,\n  )\n\nres11 =\n  foo\n    + bar\n    + baz\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/line-width.pkl",
    "content": "module reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly.loooooooooooooooooooooooooooooooog.naaaaaaaaaaaaaaaaaaaaaaaaaaaaame\n\nextends\n  \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongModule.pkl\"\n\nlocal reallyLongVariableName = true\nlocal anotherReallyLongName = 1\nlocal evenLongerVariableName = 2\n\n/// this property has a reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly long doc comment\nproperty =\n  if (reallyLongVariableName)\n    anotherReallyLongName\n  else\n    evenLongerVariableName + anotherReallyLongName\n\nlongString =\n  \"reaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaly long string\"\n\nshortProperty = 1\n\nreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongVariableName =\n  10\n\nreaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongVariableName2 =\n  if (reallyLongVariableName)\n    anotherReallyLongName\n  else\n    evenLongerVariableName + anotherReallyLongName\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/map-function.pkl",
    "content": "foo =\n  Map(\n    1000, \"some random string\",\n    20000, \"another random string\",\n    30000, \"yet another random string\",\n  )\n\nincorrect =\n  Map(\n    \"This has\", 1000000,\n    \"an incorrect number\", 2000000,\n    \"of parameters\", 30000000,\n    \"passed to Map\",\n  )\n\nbar =\n  Map(\n    // leading\n    1, 2,\n    // between\n    3, 4, // trailing\n    5, 6,\n    7, // mid\n    8,\n    9, 10,\n  )\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/method-call-trailing-lambdas.pkl",
    "content": "// multiple lambda arguments means argument list wraps\nres1 =\n  foo.toMap(\n    (elem) -> elem.toString(),\n    (elem) -> elem.toString().split(\"\").map((str) -> str + \"hello\").toSet(),\n  )\n\n// new object and trailing lambda means argument list wraps\nres2 =\n  foo.doFoo(\n    new Listing { 1; 2; 3 },\n    (elem) -> elem.toString().split(\"\").map((str) -> str + \"hello\").toSet(),\n  )\n\n// single trailing lambda is broken on its own\nres4 =\n  foo.foldLeft(\"heeeeeeelloooooooooooooooooooooooooooooooooooooooooooooo\", (elem) ->\n    elem.foooooooooooooooooooooooooooooooooooooooooooooooooooo\n  )\n\nres5 =\n  ifNonNull((it) -> someFunctionCall(it as SomeReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongTypeName))\n\nres6 =\n  ifNonNull((it) ->\n    someFunctionCall(it as SomeReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalyLongTypeNameLonger)\n  )\n\nres7 =\n  qux(\n    bar,\n    (a) -> hello // some comment\n  )\n\nres8 =\n  qux(\n    // some comment\n    (a) -> bar,\n  )\n\nres9 =\n  qux(\n    bar,\n    new {\n      bar = 1\n    } // some comment\n  )\n\nres10 = (a) -> hello // some comment\n\nres11 =\n  qux(\n    bar,\n    (a) -> hello\n    // some comment\n  )\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/modifiers.pkl",
    "content": "hidden const foo = 1\n\nopen local class Foo {}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/module-definitions.pkl",
    "content": "// comment\n// one\n\n/// doc comment\nopen module foo.bar\n\namends \"baz.pkl\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/multi-line-strings.pkl",
    "content": "foo =\n  \"\"\"\n  asd \\(new {\n    bar = 1\n  }) asd\n  \"\"\"\n\nbar =\n  \"\"\"\n  line 1\n    line 2\n      line3\n  \"\"\"\n\nbaz =\n  \"\"\"\n  \\n\n  \\(bar)\n  line\n  \\u{123}\n  \"\"\"\n\n// remove unneeded spaces\nqux =\n  \"\"\"\n  foo\n\n  bar\n\n  baz\n    \n  \\(foo)\n  \"\"\"\n\n// mixed tabs and spaces\nquux {\n  // space tab\n  \"\"\"\n  bar\n\n  baz\n  \\(1)\n\n  \"\"\"\n  // tab tab\n  \"\"\"\n  bar\n\n  baz\n  \\(1)\n\n  \"\"\"\n}\n\nobj {\n  data {\n    [\"bar\"] =\n      \"\"\"\n      foo\n\n      \"\"\"\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/object-members.pkl",
    "content": "foo: Listing<Int> = new { 1; 2; 3; 4; 5; 6; 7 }\n\nbar: Listing<Int> = new {\n  1\n  2\n  3\n  4\n}\n\nlineIsTooBig: Listing<Int> = new {\n  999999\n  1000000\n  1000001\n  1000002\n  1000003\n  1000004\n  1000005\n  1000006\n  1000007\n  1000008\n  1000009\n}\n\nlineIsTooBig2 {\n  999999\n  1000000\n  1000001\n  1000002\n  1000003\n  1000004\n  1000005\n  1000006\n  1000007\n  1000008\n  1000009\n  1000010\n}\n\nbaz = new Dynamic {\n  1\n  2\n  3\n  4\n\n  [\"foo\"] = 3\n  bar = 30\n\n  baz = true\n}\n\nqux = new Dynamic { 1; 2; 3; prop = \"prop\"; [0] = 9 }\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/prefixes.pkl",
    "content": "/// Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong doc comment\n@Annotation { looooooooooooooooooooooooooooooooooooooooooooooooooongVariableName = 10 }\ntypealias Foo = String\n\n/// Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong doc comment\n@Annotation { looooooooooooooooooooooooooooooooooooooooooooooooooongVariableName = 10 }\nfoo = \"should fit in a single line\"\n\n/// Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong doc comment\n@Annotation { looooooooooooooooooooooooooooooooooooooooooooooooooongVariableName = 10 }\nfunction bar(x): String = \"result: \\(x)\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/single-line-strings.pkl",
    "content": "foo1 = \"some string\"\n\nfoo2 = \"some string with \\(new { x = 1; y = 2 }) interpolation\"\n\nfoo3 =\n  \"some reeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally long string with \\(new { x = 1; y = 2 }) interpolation\"\n\nfoo4 =\n  \"some reeeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaally long string with \\(foo.bar.baz()) qualified access\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/spaces.pkl",
    "content": "import \"foo.pkl\"\n\nbar = new Listing<Int>(!isEmpty) { 1; 2 } //a bar\n\ntypealias Typealias = (String, Int) -> Boolean\n\n/// a baz\n/// returns its parameter\nbaz = (x, y, z) -> x + y + z\n\nfunction fun(x: Int?, b: Boolean) = if (b) /***return x**/ x else x + bar[0]\n\nprop = trace(1) + super.foo + module.foo\n\nprop2 {\n  for (x in List(1)) {\n    when (x == 1) {\n      x\n    }\n  }\n}\n\nchoices: \"foo\" | *\"bar\" | String\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/string-interpolation.pkl",
    "content": "prop1 =\n  \"\"\"\n  asd \\(new { bar = 1 }) asd\n  \"\"\"\n\nprop2 =\n  \"\"\"\n  \\(let (bar = 15) bar + new { qux = 15 }.toString())\n  \"\"\"\n\nprop3 =\n  \"\"\"\n  \\(new {\n    // some comment\n    foo = 1\n\n    // some comment\n    bar = 2\n  })\n  \"\"\"\n\nprop4 =\n  \"\"\"\n  \\(1 + /* block comment */ 2)\n  \"\"\"\n\nprop5 =\n  \"\"\"\n  \\(\"\"\"\n  foo\n  bar\n  baz\n  \"\"\")\n  \"\"\"\n\nprop6 =\n  \"\\( // some line comment\n  /* some block comment */\n  \"\\(\"\"\"\n  one\n  two\n  three\n  \"\"\")\"\n  // some line comment again\n  )\"\n\nprop7 =\n  \"\\(5\n  // trailing line comment\n  )\"\n\nprop8 = \"\\(new { foo = 1; bar = 2; baz = 3 })\"\n\nprop9 = \"\\(if (true) 1 else 2)\"\n\nprop10 =\n  \"\\(if (true)\n    1\n  else\n    2)\"\n\nprop11 =\n  \"\\(new {\n    1\n    2\n    3\n  })\"\n\n// single line expressions are not broken up\nprop12 =\n  \"Some \\(if (true) 1 else 2) reeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallly long string with interpolation\"\n\n// multi-line expressions are preserved\nprop13 =\n  \"Some \\(if (true)\n    1\n  else\n    2) reeeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallly long string with interpolation\"\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/type-aliases.pkl",
    "content": "typealias Foo = String\n\ntypealias VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongTypeAlias =\n  String(!isEmpty)\n"
  },
  {
    "path": "pkl-formatter/src/test/files/FormatterSnippetTests/output/when.pkl",
    "content": "foo {\n  when (true) {\n    bar = 1\n  } else {\n    bar = 2\n  }\n}\n\nbar {\n  when (\n    new Listing {\n      1\n      2\n    }.contains(1)\n  ) {\n    \"1\"\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/kotlin/org/pkl/formatter/FormatterSnippetTests.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\nimport org.junit.platform.commons.annotation.Testable\n\n@Testable class FormatterSnippetTests\n"
  },
  {
    "path": "pkl-formatter/src/test/kotlin/org/pkl/formatter/FormatterSnippetTestsEngine.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\nimport java.nio.file.Path\nimport kotlin.io.path.isRegularFile\nimport kotlin.reflect.KClass\nimport org.pkl.commons.test.InputOutputTestEngine\nimport org.pkl.parser.ParserError\n\nabstract class AbstractFormatterSnippetTestsEngine : InputOutputTestEngine() {\n\n  private val snippetsDir: Path =\n    rootProjectDir.resolve(\"pkl-formatter/src/test/files/FormatterSnippetTests\")\n\n  private val expectedOutputDir: Path = snippetsDir.resolve(\"output\")\n\n  /** Convenience for development; this selects which snippet test(s) to run. */\n  // language=regexp\n  internal val selection: String = \"\"\n\n  override val includedTests: List<Regex> = listOf(Regex(\".*$selection\\\\.pkl\"))\n\n  override val inputDir: Path = snippetsDir.resolve(\"input\")\n\n  override val isInputFile: (Path) -> Boolean = { it.isRegularFile() }\n\n  override fun expectedOutputFileFor(inputFile: Path): Path {\n    val relativePath = relativize(inputFile, inputDir).toString()\n    return expectedOutputDir.resolve(relativePath)\n  }\n\n  companion object {\n    private fun relativize(path: Path, base: Path): Path {\n      if (System.getProperty(\"os.name\").contains(\"Windows\")) {\n        if (path.isAbsolute && base.isAbsolute && (path.root != base.root)) {\n          return path\n        }\n      }\n      return base.relativize(path)\n    }\n  }\n}\n\nclass FormatterSnippetTestsEngine : AbstractFormatterSnippetTestsEngine() {\n  override val testClass: KClass<*> = FormatterSnippetTests::class\n\n  override fun generateOutputFor(inputFile: Path): Pair<Boolean, String> {\n    val formatter = Formatter()\n    val (success, output) =\n      try {\n        val res = formatter.format(inputFile)\n        true to res\n      } catch (_: ParserError) {\n        false to \"\"\n      }\n\n    return success to output\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/kotlin/org/pkl/formatter/FormatterTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.formatter\n\nimport java.nio.file.Path\nimport kotlin.io.path.isRegularFile\nimport kotlin.io.path.relativeTo\nimport kotlin.io.path.useDirectoryEntries\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.pkl.commons.readString\nimport org.pkl.commons.test.FileTestUtils\nimport org.pkl.commons.test.failWithDiff\nimport org.pkl.parser.GenericParserError\n\nclass FormatterTest {\n\n  @Test\n  fun `multiline string - wrong start quote`() {\n    val ex =\n      assertThrows<GenericParserError> {\n        format(\n          \"\"\"\n        foo = \"\"${'\"'}line1\n          line 2\n          \"\"${'\"'}\n      \"\"\"\n        )\n      }\n\n    assertThat(ex.message).contains(\"The content of a multi-line string must begin on a new line\")\n  }\n\n  @Test\n  fun `multiline string - wrong end quote`() {\n    val ex =\n      assertThrows<GenericParserError> {\n        format(\n          \"\"\"\n        foo = \"\"${'\"'}\n          line1\n          line 2\"\"${'\"'}\n      \"\"\"\n        )\n      }\n\n    assertThat(ex.message)\n      .contains(\"The closing delimiter of a multi-line string must begin on a new line\")\n  }\n\n  @Test\n  fun `multiline string - wrong indentation`() {\n    val ex =\n      assertThrows<GenericParserError> {\n        format(\n          \"\"\"\n        foo = \"\"${'\"'}\n          line1\n        line 2\n          \"\"${'\"'}\n      \"\"\"\n        )\n      }\n\n    assertThat(ex.message)\n      .contains(\"Line must match or exceed indentation of the String's last line.\")\n  }\n\n  private fun format(code: String): String {\n    return Formatter().format(code.trimIndent())\n  }\n\n  @Test\n  fun `snippet test output must be stable`() {\n    val outputDir =\n      FileTestUtils.rootProjectDir.resolve(\n        \"pkl-formatter/src/test/files/FormatterSnippetTests/output\"\n      )\n    val formatter = Formatter()\n    fun walkDir(dir: Path) {\n      dir.useDirectoryEntries { children ->\n        for (child in children) {\n          if (child.isRegularFile()) {\n            val expected = child.readString()\n            val formatted = formatter.format(expected)\n            if (expected != formatted) {\n              failWithDiff(\n                \"Formatter output not stable: ${child.relativeTo(outputDir)}\",\n                expected,\n                formatted,\n              )\n            }\n          } else {\n            walkDir(child)\n          }\n        }\n      }\n    }\n\n    walkDir(outputDir)\n  }\n\n  @Test\n  fun `whitespace only`() {\n    for (src in listOf(\";;;\", \"\\n\", \"\\n\\n\\n\", \"\\t\")) {\n      assertThat(format(src)).isEqualTo(\"\\n\")\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-formatter/src/test/resources/META-INF/services/org.junit.platform.engine.TestEngine",
    "content": "org.pkl.formatter.FormatterSnippetTestsEngine\n"
  },
  {
    "path": "pkl-gradle/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=compileClasspath,compileOnlyDependenciesMetadata\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=compileClasspath,compileOnlyDependenciesMetadata\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=compileClasspath,compileOnlyDependenciesMetadata\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=compileClasspath,compileOnlyDependenciesMetadata\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=compileClasspath,compileOnlyDependenciesMetadata\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=compileClasspath,compileOnlyDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=compileClasspath,compileOnlyDependenciesMetadata,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=compileClasspath,compileOnlyDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=annotationProcessor,apiDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,runtimeClasspath,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-gradle/pkl-gradle.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklJavaLibrary\n  pklGradlePluginTest\n\n  `java-gradle-plugin`\n  `maven-publish`\n  pklPublishLibrary\n  signing\n}\n\ndependencies {\n  // Declare a `compileOnly` dependency on `projects.pklTools`\n  // to ensure correct code navigation in IntelliJ.\n  compileOnly(projects.pklTools)\n\n  // Declare a `runtimeOnly` dependency on `project(\":pkl-tools\", \"fatJar\")`\n  // to ensure that the published plugin\n  // (and also plugin tests, see the generated `plugin-under-test-metadata.properties`)\n  // only depends on the pkl-tools shaded fat JAR.\n  // This avoids dependency version conflicts with other Gradle plugins.\n  //\n  // Hide this dependency from IntelliJ\n  // to prevent IntelliJ from reindexing the pkl-tools fat JAR after every build.\n  // (IntelliJ gets everything it needs from the `compileOnly` dependency.)\n  //\n  // To debug shaded code in IntelliJ, temporarily remove the conditional.\n  if (System.getProperty(\"idea.sync.active\") == null) {\n    runtimeOnly(projects.pklTools) {\n      attributes { attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.SHADOWED)) }\n    }\n  }\n\n  testImplementation(projects.pklCommonsTest)\n}\n\nsourceSets {\n  test {\n    // Remove Gradle distribution JARs from test compile classpath.\n    // This prevents a conflict between Gradle's and Pkl's Kotlin versions.\n    //\n    // For some reason, IntelliJ import turns pklCommonsTest into a runtime dependency\n    // if `compileClasspath` is filtered, causing \"unresolved reference\" errors in IntelliJ.\n    // As a workaround, don't perform filtering for IntelliJ (import).\n    if (System.getProperty(\"idea.sync.active\") == null) {\n      compileClasspath = compileClasspath.filter { !(it.path.contains(\"dists\")) }\n    }\n  }\n}\n\npublishing {\n  publications {\n    withType<MavenPublication>().configureEach {\n      pom {\n        name.set(\"pkl-gradle plugin\")\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-gradle\")\n        description.set(\"Gradle plugin for the Pkl configuration language.\")\n      }\n    }\n  }\n}\n\ngradlePlugin {\n  plugins {\n    create(\"pkl\") {\n      id = \"org.pkl-lang\"\n      implementationClass = \"org.pkl.gradle.PklPlugin\"\n      displayName = \"pkl-gradle\"\n      description = \"Gradle plugin for interacting with Pkl\"\n    }\n  }\n}\n\ngradlePluginTests {\n  // keep in sync with `PklPlugin.MIN_GRADLE_VERSION`\n  minGradleVersion = GradleVersion.version(\"8.2\")\n  maxGradleVersion = GradleVersion.version(\"9.99\")\n  skippedGradleVersions = listOf()\n}\n\nsigning {\n  publishing.publications.withType(MavenPublication::class.java).configureEach {\n    if (name != \"library\") {\n      sign(this)\n    }\n  }\n}\n\n// As of Gradle 8.10, the following is necessary to avoid a test compile error.\n// (Apparently, gradle-api.jar now contains metadata that causes kotlinc to enforce Gradle's Kotlin\n// version.)\n// A more robust solution would be to port plugin tests to Java.\ntasks.compileTestKotlin {\n  compilerOptions { freeCompilerArgs.add(\"-Xskip-metadata-version-check\") }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/PklAnalyzerCommands.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle;\n\nimport org.gradle.api.Action;\nimport org.gradle.api.NamedDomainObjectContainer;\nimport org.pkl.gradle.spec.AnalyzeImportsSpec;\n\npublic interface PklAnalyzerCommands {\n  NamedDomainObjectContainer<AnalyzeImportsSpec> getImports();\n\n  default void imports(Action<? super NamedDomainObjectContainer<AnalyzeImportsSpec>> action) {\n    action.execute(getImports());\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/PklExtension.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle;\n\nimport org.gradle.api.Action;\nimport org.gradle.api.NamedDomainObjectContainer;\nimport org.gradle.api.tasks.Nested;\nimport org.pkl.gradle.spec.EvalSpec;\nimport org.pkl.gradle.spec.JavaCodeGenSpec;\nimport org.pkl.gradle.spec.KotlinCodeGenSpec;\nimport org.pkl.gradle.spec.PkldocSpec;\nimport org.pkl.gradle.spec.TestSpec;\n\n@SuppressWarnings(\"unused\")\npublic interface PklExtension {\n  NamedDomainObjectContainer<EvalSpec> getEvaluators();\n\n  NamedDomainObjectContainer<JavaCodeGenSpec> getJavaCodeGenerators();\n\n  NamedDomainObjectContainer<KotlinCodeGenSpec> getKotlinCodeGenerators();\n\n  NamedDomainObjectContainer<PkldocSpec> getPkldocGenerators();\n\n  NamedDomainObjectContainer<TestSpec> getTests();\n\n  @Nested\n  PklProjectCommands getProject();\n\n  @Nested\n  PklAnalyzerCommands getAnalyzers();\n\n  default void evaluators(Action<? super NamedDomainObjectContainer<EvalSpec>> action) {\n    action.execute(getEvaluators());\n  }\n\n  default void javaCodeGenerators(\n      Action<? super NamedDomainObjectContainer<JavaCodeGenSpec>> action) {\n    action.execute(getJavaCodeGenerators());\n  }\n\n  default void kotlinCodeGenerators(\n      Action<? super NamedDomainObjectContainer<KotlinCodeGenSpec>> action) {\n    action.execute(getKotlinCodeGenerators());\n  }\n\n  default void pkldocGenerators(Action<? super NamedDomainObjectContainer<PkldocSpec>> action) {\n    action.execute(getPkldocGenerators());\n  }\n\n  default void tests(Action<? super NamedDomainObjectContainer<TestSpec>> action) {\n    action.execute(getTests());\n  }\n\n  default void project(Action<? super PklProjectCommands> action) {\n    action.execute(getProject());\n  }\n\n  default void analyzers(Action<? super PklAnalyzerCommands> action) {\n    action.execute(getAnalyzers());\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/PklPlugin.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle;\n\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.util.Collections;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.function.Function;\nimport org.gradle.api.GradleException;\nimport org.gradle.api.NamedDomainObjectContainer;\nimport org.gradle.api.Plugin;\nimport org.gradle.api.Project;\nimport org.gradle.api.Transformer;\nimport org.gradle.api.file.SourceDirectorySet;\nimport org.gradle.api.provider.Provider;\nimport org.gradle.api.tasks.SourceSet;\nimport org.gradle.api.tasks.SourceSetContainer;\nimport org.gradle.api.tasks.TaskProvider;\nimport org.gradle.language.base.plugins.LifecycleBasePlugin;\nimport org.gradle.plugins.ide.idea.model.IdeaModel;\nimport org.gradle.util.GradleVersion;\nimport org.pkl.cli.CliEvaluatorOptions;\nimport org.pkl.core.ImportGraph;\nimport org.pkl.core.OutputFormat;\nimport org.pkl.core.util.IoUtils;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.gradle.spec.AnalyzeImportsSpec;\nimport org.pkl.gradle.spec.BasePklSpec;\nimport org.pkl.gradle.spec.CodeGenSpec;\nimport org.pkl.gradle.spec.EvalSpec;\nimport org.pkl.gradle.spec.JavaCodeGenSpec;\nimport org.pkl.gradle.spec.KotlinCodeGenSpec;\nimport org.pkl.gradle.spec.ModulesSpec;\nimport org.pkl.gradle.spec.PkldocSpec;\nimport org.pkl.gradle.spec.ProjectPackageSpec;\nimport org.pkl.gradle.spec.ProjectResolveSpec;\nimport org.pkl.gradle.spec.TestSpec;\nimport org.pkl.gradle.task.AnalyzeImportsTask;\nimport org.pkl.gradle.task.BasePklTask;\nimport org.pkl.gradle.task.CodeGenTask;\nimport org.pkl.gradle.task.EvalTask;\nimport org.pkl.gradle.task.JavaCodeGenTask;\nimport org.pkl.gradle.task.KotlinCodeGenTask;\nimport org.pkl.gradle.task.ModulesTask;\nimport org.pkl.gradle.task.PkldocTask;\nimport org.pkl.gradle.task.ProjectPackageTask;\nimport org.pkl.gradle.task.ProjectResolveTask;\nimport org.pkl.gradle.task.TestTask;\nimport org.pkl.gradle.utils.PluginUtils;\n\n@SuppressWarnings(\"unused\")\npublic class PklPlugin implements Plugin<Project> {\n\n  private static final String MIN_GRADLE_VERSION = \"8.2\";\n\n  @LateInit private Project project;\n\n  @Override\n  public void apply(Project project) {\n    this.project = project;\n\n    if (GradleVersion.current().compareTo(GradleVersion.version(MIN_GRADLE_VERSION)) < 0) {\n      throw new GradleException(\n          String.format(\"Plugin `org.pkl` requires Gradle %s or higher.\", MIN_GRADLE_VERSION));\n    }\n\n    var extension = project.getExtensions().create(\"pkl\", PklExtension.class);\n    configureExtension(extension);\n  }\n\n  private void configureExtension(PklExtension extension) {\n    configureEvalTasks(extension.getEvaluators());\n    configureJavaCodeGenTasks(extension.getJavaCodeGenerators());\n    configureKotlinCodeGenTasks(extension.getKotlinCodeGenerators());\n    configurePkldocTasks(extension.getPkldocGenerators());\n    configureTestTasks(extension.getTests());\n    configureProjectPackageTasks(extension.getProject().getPackagers());\n    configureProjectResolveTasks(extension.getProject().getResolvers());\n    configureAnalyzeImportsTasks(extension.getAnalyzers().getImports());\n  }\n\n  private void configureProjectPackageTasks(NamedDomainObjectContainer<ProjectPackageSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n          spec.getOutputPath()\n              .convention(project.getLayout().getBuildDirectory().dir(\"generated/pkl/packages\"));\n          spec.getOverwrite().convention(false);\n          var packageTask = createTask(ProjectPackageTask.class, spec);\n          packageTask.configure(\n              task -> {\n                task.getProjectDirectories().from(spec.getProjectDirectories());\n                task.getOutputPath().set(spec.getOutputPath());\n                task.getSkipPublishCheck().set(spec.getSkipPublishCheck());\n                task.getJunitReportsDir().set(spec.getJunitReportsDir());\n                task.getOverwrite().set(spec.getOverwrite());\n              });\n          project\n              .getPluginManager()\n              .withPlugin(\n                  \"base\",\n                  appliedPlugin ->\n                      project\n                          .getTasks()\n                          .named(\n                              LifecycleBasePlugin.BUILD_TASK_NAME,\n                              it -> it.dependsOn(packageTask)));\n        });\n  }\n\n  private void configureProjectResolveTasks(NamedDomainObjectContainer<ProjectResolveSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n          var resolveTask = createTask(ProjectResolveTask.class, spec);\n          resolveTask.configure(\n              task -> task.getProjectDirectories().from(spec.getProjectDirectories()));\n        });\n  }\n\n  private void configureAnalyzeImportsTasks(NamedDomainObjectContainer<AnalyzeImportsSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n          spec.getOutputFormat().convention(OutputFormat.PCF.toString());\n          var analyzeImportsTask = createTask(AnalyzeImportsTask.class, spec);\n          analyzeImportsTask.configure(\n              task -> {\n                task.getOutputFormat().set(spec.getOutputFormat());\n                task.getOutputFile().set(spec.getOutputFile());\n                configureModulesTask(task, spec, null);\n              });\n        });\n  }\n\n  private void configureEvalTasks(NamedDomainObjectContainer<EvalSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n          spec.getOutputFile()\n              .convention(\n                  project\n                      .getLayout()\n                      .getProjectDirectory()\n                      // %{moduleDir} is resolved relatively to the working directory,\n                      // and the working directory is set to the project directory,\n                      // so this path works correctly.\n                      .file(\"%{moduleDir}/%{moduleName}.%{outputFormat}\"));\n          spec.getOutputFormat().convention(OutputFormat.PCF.toString());\n          spec.getModuleOutputSeparator()\n              .convention(CliEvaluatorOptions.Companion.getDefaults().getModuleOutputSeparator());\n          spec.getExpression()\n              .convention(CliEvaluatorOptions.Companion.getDefaults().getExpression());\n\n          createModulesTask(EvalTask.class, spec)\n              .configure(\n                  task -> {\n                    task.getOutputFile().set(spec.getOutputFile());\n                    task.getOutputFormat().set(spec.getOutputFormat());\n                    task.getModuleOutputSeparator().set(spec.getModuleOutputSeparator());\n                    task.getMultipleFileOutputDir().set(spec.getMultipleFileOutputDir());\n                    task.getExpression().set(spec.getExpression());\n                  });\n        });\n  }\n\n  private void configureJavaCodeGenTasks(NamedDomainObjectContainer<JavaCodeGenSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n          configureCodeGenSpec(spec);\n\n          spec.getGenerateGetters().convention(false);\n          spec.getGenerateJavadoc().convention(false);\n          // Not using `convention()` so that users can disable generation of\n          // constructor parameters annotations by setting this property to `null`.\n          spec.getParamsAnnotation()\n              .set(\n                  project.provider(\n                      () ->\n                          spec.getGenerateSpringBootConfig().get()\n                              ? null\n                              : \"org.pkl.config.java.mapper.Named\"));\n\n          createModulesTask(JavaCodeGenTask.class, spec)\n              .configure(\n                  task -> {\n                    configureCodeGenTask(task, spec);\n                    task.getGenerateGetters().set(spec.getGenerateGetters());\n                    task.getGenerateJavadoc().set(spec.getGenerateJavadoc());\n                    task.getParamsAnnotation().set(spec.getParamsAnnotation());\n                    task.getNonNullAnnotation().set(spec.getNonNullAnnotation());\n                  });\n        });\n\n    project.afterEvaluate(\n        prj ->\n            specs.all(\n                spec -> {\n                  configureIdeaModule(spec);\n                  configureCodeGenSpecSourceDirectories(\n                      spec, \"java\", s -> Optional.of(s.getJava()));\n                }));\n  }\n\n  private void configureKotlinCodeGenTasks(NamedDomainObjectContainer<KotlinCodeGenSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n          configureCodeGenSpec(spec);\n\n          spec.getGenerateKdoc().convention(false);\n\n          createModulesTask(KotlinCodeGenTask.class, spec)\n              .configure(\n                  task -> {\n                    configureCodeGenTask(task, spec);\n                    task.getGenerateKdoc().set(spec.getGenerateKdoc());\n                  });\n        });\n\n    project.afterEvaluate(\n        prj ->\n            specs.all(\n                spec -> {\n                  configureIdeaModule(spec);\n                  configureCodeGenSpecSourceDirectories(\n                      spec, \"kotlin\", this::getKotlinSourceDirectorySet);\n                }));\n  }\n\n  private void configurePkldocTasks(NamedDomainObjectContainer<PkldocSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n\n          spec.getOutputDir()\n              .convention(\n                  project\n                      .getLayout()\n                      .getBuildDirectory()\n                      .map(it -> it.dir(\"pkldoc\").dir(spec.getName())));\n\n          spec.getNoSymlinks().convention(false);\n\n          createModulesTask(PkldocTask.class, spec)\n              .configure(\n                  task -> {\n                    task.getOutputDir().set(spec.getOutputDir());\n                    task.getNoSymlinks().set(spec.getNoSymlinks());\n                  });\n        });\n  }\n\n  private void configureTestTasks(NamedDomainObjectContainer<TestSpec> specs) {\n    specs.all(\n        spec -> {\n          configureBaseSpec(spec);\n\n          spec.getOverwrite().convention(false);\n\n          var testTask = createModulesTask(TestTask.class, spec);\n          testTask.configure(\n              task -> {\n                task.getJunitReportsDir().set(spec.getJunitReportsDir());\n                task.getOverwrite().set(spec.getOverwrite());\n              });\n\n          project\n              .getPluginManager()\n              .withPlugin(\n                  \"base\",\n                  appliedPlugin ->\n                      project\n                          .getTasks()\n                          .named(\n                              LifecycleBasePlugin.CHECK_TASK_NAME,\n                              checkTask -> checkTask.dependsOn(testTask)));\n        });\n  }\n\n  private void configureBaseSpec(BasePklSpec spec) {\n    spec.getAllowedModules()\n        .convention(\n            List.of(\n                \"repl:\", \"file:\", \"modulepath:\", \"https:\", \"pkl:\", \"package:\", \"projectpackage:\"));\n\n    spec.getAllowedResources()\n        .convention(List.of(\"env:\", \"prop:\", \"file:\", \"modulepath:\", \"https:\", \"package:\"));\n\n    spec.getEvalRootDir().convention(project.getRootProject().getLayout().getProjectDirectory());\n\n    // Defaulting to OS env vars is bad for reproducibility and cachability.\n    // Hence, this spec defaults to empty env vars, which is consistent with other Gradle tasks\n    // (e.g., Test) but inconsistent with the Pkl CLI.\n    // Therefore, we don't set any initial value for the environmentVariables property.\n\n    // Not using `convention()` to allow the user to unset this property, disabling the cache.\n    spec.getModuleCacheDir().set(IoUtils.getDefaultModuleCacheDir().toFile());\n\n    spec.getNoCache().convention(false);\n\n    spec.getTestPort().convention(-1);\n\n    spec.getHttpNoProxy().convention(List.of());\n  }\n\n  private void configureCodeGenSpec(CodeGenSpec spec) {\n    spec.getOutputDir()\n        .convention(\n            project\n                .getLayout()\n                .getBuildDirectory()\n                .map(it -> it.dir(\"generated\").dir(\"pkl\").dir(spec.getName())));\n\n    spec.getSourceSet()\n        .convention(\n            project\n                .getProviders()\n                .provider(\n                    () -> {\n                      var sourceSets = project.getExtensions().findByType(SourceSetContainer.class);\n                      if (sourceSets == null) {\n                        return null;\n                      }\n                      return sourceSets.findByName(SourceSet.MAIN_SOURCE_SET_NAME);\n                    }));\n\n    spec.getIndent().convention(\"  \");\n\n    spec.getGenerateSpringBootConfig().convention(false);\n\n    spec.getImplementSerializable().convention(false);\n\n    spec.getAddGeneratedAnnotation().convention(false);\n\n    configureCodeGenSpecModulePath(spec);\n  }\n\n  private void configureCodeGenSpecModulePath(CodeGenSpec spec) {\n    // Set module path to all of the configured resources source directories and the compile\n    // classpath to find Pkl modules that are classpath resources.\n    // Compilation classpath should be correct (vs. runtime classpath) if the library author\n    // properly declares upstream libraries as `api` dependencies.\n    // We must not use the processResources task as an input here, because it would introduce\n    // a circular dependency (because codegen also generates a resources directory).\n    //\n    // Also note that in this case, we are NOT setting a dependency from the\n    // spec.getModulePath() file collection to the sourceSet.getResources().getSourceDirectories()\n    // file collection. Doing that would make spec.getModulePath() propagate a dependency\n    // on the tasks which contribute to sourceSet.getResources().getSourceDirectories(),\n    // and one of them is our own codegen task, which would result in a circular dependency.\n    // Refer to configureCodeGenSpecSourceDirectories for logic which links the codegen task\n    // to sourceSet.getResources().getSourceDirectories().\n\n    var modulePath = project.files();\n    modulePath\n        .from(getResourceSourceDirectoriesExceptSpecOutput(spec))\n        // This technically breaks the dependency on compile classpath builder tasks,\n        // however, compile classpath on a source set is always a plain configuration which\n        // has no builder tasks, so this is not an issue.\n        .from(spec.getSourceSet().map(SourceSet::getCompileClasspath));\n    spec.getModulePath().from(modulePath);\n  }\n\n  private Provider<Set<File>> getResourceSourceDirectoriesExceptSpecOutput(CodeGenSpec spec) {\n    // Intentionally break the dependency on source set's resources source directory set\n    // builder tasks by using `getFiles()` instead of `FileCollection`\n    // returned by `getSourceDirectories()`.\n    // Additionally, we must exclude our own output, to avoid creating circular dependencies\n    // at runtime which invalidate task execution cache.\n    return spec.getSourceSet()\n        .flatMap(\n            sourceSet ->\n                spec.getOutputDir()\n                    .map(\n                        specOutputDir ->\n                            sourceSet\n                                .getResources()\n                                .getSourceDirectories()\n                                .filter(\n                                    f ->\n                                        !f.getAbsolutePath()\n                                            .startsWith(\n                                                specOutputDir.getAsFile().getAbsolutePath()))\n                                .getFiles()));\n  }\n\n  // Must be called from Project.afterEvaluate() only, because this method depends\n  // on user-provided configuration not accessible with lazy configuration.\n  private void configureCodeGenSpecSourceDirectories(\n      CodeGenSpec spec,\n      String languageName,\n      Function<? super SourceSet, ? extends Optional<SourceDirectorySet>>\n          extractSourceDirectorySet) {\n    var task = project.getTasks().named(spec.getName(), CodeGenTask.class);\n    var sourceSet = spec.getSourceSet().get();\n    extractSourceDirectorySet\n        .apply(sourceSet)\n        .ifPresentOrElse(\n            dirSet -> dirSet.srcDir(task.flatMap(t -> t.getOutputDir().dir(languageName))),\n            () ->\n                project\n                    .getLogger()\n                    .debug(\n                        \"Source directory set for language {} is not available, \"\n                            + \"will not add task {} as its dependency\",\n                        languageName,\n                        task.getName()));\n    sourceSet.getResources().srcDir(task.flatMap(t -> t.getOutputDir().dir(\"resources\")));\n  }\n\n  // Must be called from Project.afterEvaluate() only, because this method depends\n  // on user-provided configuration not accessible with lazy configuration.\n  private void configureIdeaModule(CodeGenSpec spec) {\n    project\n        .getPluginManager()\n        .withPlugin(\n            \"idea\",\n            plugin -> {\n              var module = project.getExtensions().getByType(IdeaModel.class).getModule();\n              var outputDir = spec.getOutputDir().get().getAsFile();\n              module.getGeneratedSourceDirs().add(outputDir);\n              if (spec.getSourceSet().get().getName().toLowerCase().contains(\"test\")) {\n                module.getTestSources().from(append(module.getTestSources().getFiles(), outputDir));\n              } else {\n                module.setSourceDirs(append(module.getSourceDirs(), outputDir));\n              }\n            });\n  }\n\n  private void configureCodeGenTask(CodeGenTask task, CodeGenSpec spec) {\n    task.getIndent().set(spec.getIndent());\n    task.getOutputDir().set(spec.getOutputDir());\n    task.getGenerateSpringBootConfig().set(spec.getGenerateSpringBootConfig());\n    task.getImplementSerializable().set(spec.getImplementSerializable());\n    task.getAddGeneratedAnnotation().set(spec.getAddGeneratedAnnotation());\n    task.getRenames().set(spec.getRenames());\n  }\n\n  private <T extends BasePklTask, S extends BasePklSpec> void configureBaseTask(T task, S spec) {\n    task.getAllowedModules().set(spec.getAllowedModules());\n    task.getAllowedResources().set(spec.getAllowedResources());\n    task.getEnvironmentVariables().set(spec.getEnvironmentVariables());\n    task.getExternalProperties().set(spec.getExternalProperties());\n    task.getModulePath().from(spec.getModulePath());\n    task.getSettingsModule().set(spec.getSettingsModule());\n    task.getEvalRootDir().set(spec.getEvalRootDir());\n    task.getColor().set(spec.getColor());\n    task.getNoCache().set(spec.getNoCache());\n    task.getModuleCacheDir().set(spec.getModuleCacheDir());\n    task.getEvalTimeout().set(spec.getEvalTimeout());\n    task.getTestPort().set(spec.getTestPort());\n    task.getHttpProxy().set(spec.getHttpProxy());\n    task.getHttpNoProxy().set(spec.getHttpNoProxy());\n    task.getHttpRewrites().set(spec.getHttpRewrites());\n  }\n\n  private List<File> getTransitiveModules(AnalyzeImportsTask analyzeTask) {\n    var outputFile = analyzeTask.getOutputFile().get().getAsFile().toPath();\n    if (!analyzeTask.getOnlyIf().isSatisfiedBy(analyzeTask)) {\n      return Collections.emptyList();\n    }\n    try {\n      var contents = Files.readString(outputFile);\n      ImportGraph importGraph = ImportGraph.parseFromJson(contents);\n      var imports = importGraph.resolvedImports().values();\n      return imports.stream()\n          .filter((it) -> it.getScheme().equalsIgnoreCase(\"file\"))\n          .map(File::new)\n          .toList();\n    } catch (Exception e) {\n      throw new RuntimeException(e);\n    }\n  }\n\n  private <T extends ModulesTask, S extends ModulesSpec> void configureModulesTask(\n      T task,\n      S spec,\n      @Nullable TaskProvider<AnalyzeImportsTask> analyzeImportsTask,\n      @Nullable Transformer<List<?>, List<?>> mapSourceModules) {\n    configureBaseTask(task, spec);\n    if (mapSourceModules != null) {\n      task.getSourceModules().set(spec.getSourceModules().map(mapSourceModules));\n    } else {\n      task.getSourceModules().set(spec.getSourceModules());\n    }\n    task.getNoProject().set(spec.getNoProject());\n    task.getProjectDir().set(spec.getProjectDir());\n    task.getOmitProjectSettings().set(spec.getOmitProjectSettings());\n    if (!spec.getTransitiveModules().isEmpty()) {\n      task.getTransitiveModules().set(spec.getTransitiveModules());\n    } else if (analyzeImportsTask != null) {\n      task.dependsOn(analyzeImportsTask);\n      task.getTransitiveModules().set(analyzeImportsTask.map(this::getTransitiveModules));\n    }\n  }\n\n  private <T extends ModulesTask, S extends ModulesSpec> void configureModulesTask(\n      T task, S spec, @Nullable TaskProvider<AnalyzeImportsTask> analyzeImportsTask) {\n    configureModulesTask(task, spec, analyzeImportsTask, null);\n  }\n\n  private TaskProvider<AnalyzeImportsTask> createAnalyzeImportsTask(ModulesSpec spec) {\n    var outputFile =\n        project\n            .getLayout()\n            .getBuildDirectory()\n            .file(\"pkl-gradle/imports/\" + spec.getName() + \".json\");\n    return project\n        .getTasks()\n        .register(\n            spec.getName() + \"GatherImports\",\n            AnalyzeImportsTask.class,\n            task -> {\n              configureModulesTask(\n                  task,\n                  spec,\n                  null,\n                  (modules) ->\n                      // only need to analyze imports of file-based modules; it's unlikely that a\n                      // non-file-based module will import a file-based module due to security\n                      // manager trust levels (see\n                      // org.pkl.core.SecurityManagers.getDefaultTrustLevel).\n                      modules.stream()\n                          .map(PluginUtils::parseModuleNotationToUri)\n                          .filter(\n                              (it) ->\n                                  it.getScheme() == null || it.getScheme().equalsIgnoreCase(\"file\"))\n                          .toList());\n              task.setDescription(\"Compute the set of imports declared by input modules\");\n              task.setGroup(\"build\");\n              task.getOutputFormat().set(OutputFormat.JSON.toString());\n              task.getOutputFile().set(outputFile);\n              task.onlyIf(ignored -> !task.getSourceModules().get().isEmpty());\n            });\n  }\n\n  /**\n   * Implicitly also create a task of type {@link AnalyzeImportsTask}, postfixing the spec name with\n   * {@code \"GatherImports\"}.\n   *\n   * <p>The resulting task depends on the analyze task, and configures its own input files based on\n   * the result of analysis.\n   *\n   * <p>The end result is that the task automatically has correct up-to-date checks without users\n   * needing to manually provide transitive modules.\n   */\n  private <T extends ModulesTask> TaskProvider<T> createModulesTask(\n      Class<T> taskClass, ModulesSpec spec) {\n    var analyzeImportsTask = createAnalyzeImportsTask(spec);\n    return project\n        .getTasks()\n        .register(\n            spec.getName(),\n            taskClass,\n            task -> configureModulesTask(task, spec, analyzeImportsTask));\n  }\n\n  private <T extends BasePklTask> TaskProvider<T> createTask(Class<T> taskClass, BasePklSpec spec) {\n    return project\n        .getTasks()\n        .register(spec.getName(), taskClass, task -> configureBaseTask(task, spec));\n  }\n\n  private <T> Set<T> append(Set<? extends T> set1, T element) {\n    Set<T> result = new LinkedHashSet<>(set1.size() + 1);\n    result.addAll(set1);\n    result.add(element);\n    return result;\n  }\n\n  private Optional<SourceDirectorySet> getKotlinSourceDirectorySet(SourceSet sourceSet) {\n    var kotlinExtension = sourceSet.getExtensions().findByName(\"kotlin\");\n    if (kotlinExtension instanceof SourceDirectorySet sourceDirSet) {\n      return Optional.of(sourceDirSet);\n    }\n    return Optional.empty();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/PklProjectCommands.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle;\n\nimport org.gradle.api.Action;\nimport org.gradle.api.NamedDomainObjectContainer;\nimport org.pkl.gradle.spec.ProjectPackageSpec;\nimport org.pkl.gradle.spec.ProjectResolveSpec;\n\n@SuppressWarnings(\"unused\")\npublic interface PklProjectCommands {\n  NamedDomainObjectContainer<ProjectPackageSpec> getPackagers();\n\n  NamedDomainObjectContainer<ProjectResolveSpec> getResolvers();\n\n  default void packagers(Action<? super NamedDomainObjectContainer<ProjectPackageSpec>> action) {\n    action.execute(getPackagers());\n  }\n\n  default void resolvers(Action<? super NamedDomainObjectContainer<ProjectResolveSpec>> action) {\n    action.execute(getResolvers());\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.gradle;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/AnalyzeImportsSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.RegularFileProperty;\nimport org.gradle.api.provider.Property;\n\n/** Configuration options for import analyzers. Documented in user manual. */\npublic interface AnalyzeImportsSpec extends ModulesSpec {\n  RegularFileProperty getOutputFile();\n\n  Property<String> getOutputFormat();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/BasePklSpec.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport java.net.URI;\nimport java.time.Duration;\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.ListProperty;\nimport org.gradle.api.provider.MapProperty;\nimport org.gradle.api.provider.Property;\n\n/** Configuration options shared between plugin features. Documented in user manual. */\npublic interface BasePklSpec {\n  String getName();\n\n  ConfigurableFileCollection getTransitiveModules();\n\n  ListProperty<String> getAllowedModules();\n\n  ListProperty<String> getAllowedResources();\n\n  MapProperty<String, String> getEnvironmentVariables();\n\n  MapProperty<String, String> getExternalProperties();\n\n  ConfigurableFileCollection getModulePath();\n\n  Property<Object> getSettingsModule();\n\n  DirectoryProperty getEvalRootDir();\n\n  DirectoryProperty getModuleCacheDir();\n\n  Property<Boolean> getColor();\n\n  Property<Boolean> getNoCache();\n\n  // use same type (Duration) as Gradle's `Task.timeout`\n  Property<Duration> getEvalTimeout();\n\n  Property<Integer> getTestPort();\n\n  Property<URI> getHttpProxy();\n\n  ListProperty<String> getHttpNoProxy();\n\n  MapProperty<URI, URI> getHttpRewrites();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/CodeGenSpec.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.MapProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.SourceSet;\n\n/** Configuration options shared between code generators. Documented in user manual. */\npublic interface CodeGenSpec extends ModulesSpec {\n  DirectoryProperty getOutputDir();\n\n  Property<Boolean> getAddGeneratedAnnotation();\n\n  Property<SourceSet> getSourceSet();\n\n  Property<String> getIndent();\n\n  Property<Boolean> getGenerateSpringBootConfig();\n\n  Property<Boolean> getImplementSerializable();\n\n  MapProperty<String, String> getRenames();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/EvalSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.file.RegularFileProperty;\nimport org.gradle.api.provider.Property;\n\n/** Configuration options for evaluators. Documented in user manual. */\npublic interface EvalSpec extends ModulesSpec {\n  RegularFileProperty getOutputFile();\n\n  Property<String> getOutputFormat();\n\n  Property<String> getModuleOutputSeparator();\n\n  DirectoryProperty getMultipleFileOutputDir();\n\n  Property<String> getExpression();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/JavaCodeGenSpec.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.provider.Property;\n\n/** Configuration options for Java code generators. Documented in user manual. */\npublic interface JavaCodeGenSpec extends CodeGenSpec {\n  Property<Boolean> getGenerateGetters();\n\n  Property<Boolean> getGenerateJavadoc();\n\n  Property<String> getParamsAnnotation();\n\n  Property<String> getNonNullAnnotation();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/KotlinCodeGenSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.provider.Property;\n\n/** Configuration options for Kotlin code generators. Documented in user manual. */\npublic interface KotlinCodeGenSpec extends CodeGenSpec {\n  Property<Boolean> getGenerateKdoc();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/ModulesSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.ListProperty;\nimport org.gradle.api.provider.Property;\n\npublic interface ModulesSpec extends BasePklSpec {\n  ListProperty<Object> getSourceModules();\n\n  ConfigurableFileCollection getTransitiveModules();\n\n  DirectoryProperty getProjectDir();\n\n  Property<Boolean> getOmitProjectSettings();\n\n  Property<Boolean> getNoProject();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/PkldocSpec.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.Property;\n\n/** Configuration options for Pkldoc generators. Documented in user manual. */\npublic interface PkldocSpec extends ModulesSpec {\n  DirectoryProperty getOutputDir();\n\n  Property<Boolean> getNoSymlinks();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/ProjectPackageSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.Property;\n\npublic interface ProjectPackageSpec extends BasePklSpec {\n  ConfigurableFileCollection getProjectDirectories();\n\n  DirectoryProperty getOutputPath();\n\n  DirectoryProperty getJunitReportsDir();\n\n  Property<Boolean> getOverwrite();\n\n  Property<Boolean> getSkipPublishCheck();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/ProjectResolveSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.ConfigurableFileCollection;\n\npublic interface ProjectResolveSpec extends BasePklSpec {\n  ConfigurableFileCollection getProjectDirectories();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/TestSpec.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.spec;\n\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.Property;\n\npublic interface TestSpec extends ModulesSpec {\n  DirectoryProperty getJunitReportsDir();\n\n  Property<Boolean> getOverwrite();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/spec/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.gradle.spec;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/AnalyzeImportsTask.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport org.gradle.api.file.RegularFileProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.provider.Provider;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.OutputFile;\nimport org.pkl.cli.CliImportAnalyzer;\nimport org.pkl.cli.CliImportAnalyzerOptions;\n\npublic abstract class AnalyzeImportsTask extends ModulesTask {\n  @OutputFile\n  @Optional\n  public abstract RegularFileProperty getOutputFile();\n\n  @Input\n  public abstract Property<String> getOutputFormat();\n\n  private final Provider<CliImportAnalyzer> cliImportAnalyzerProvider =\n      getProviders()\n          .provider(\n              () ->\n                  new CliImportAnalyzer(\n                      new CliImportAnalyzerOptions(\n                          getCliBaseOptions(),\n                          mapAndGetOrNull(getOutputFile(), it -> it.getAsFile().toPath()),\n                          mapAndGetOrNull(getOutputFormat(), it -> it))));\n\n  @Override\n  protected void doRunTask() {\n    //noinspection ResultOfMethodCallIgnored\n    getOutputs().getPreviousOutputFiles().forEach(File::delete);\n    cliImportAnalyzerProvider.get().run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/BasePklTask.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.time.Duration;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\nimport javax.inject.Inject;\nimport org.gradle.api.DefaultTask;\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.model.ObjectFactory;\nimport org.gradle.api.provider.ListProperty;\nimport org.gradle.api.provider.MapProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.provider.Provider;\nimport org.gradle.api.provider.ProviderFactory;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.InputFile;\nimport org.gradle.api.tasks.InputFiles;\nimport org.gradle.api.tasks.Internal;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.TaskAction;\nimport org.pkl.commons.cli.CliBaseOptions;\nimport org.pkl.core.evaluatorSettings.Color;\nimport org.pkl.core.util.LateInit;\nimport org.pkl.core.util.Nullable;\nimport org.pkl.gradle.utils.PluginUtils;\n\npublic abstract class BasePklTask extends DefaultTask {\n  private static final String TRUFFLE_USE_FALLBACK_RUNTIME_FLAG = \"truffle.UseFallbackRuntime\";\n\n  private static final String POLYGLOT_WARN_INTERPRETER_ONLY_FLAG =\n      \"polyglot.engine.WarnInterpreterOnly\";\n\n  @Input\n  public abstract ListProperty<String> getAllowedModules();\n\n  @Input\n  public abstract ListProperty<String> getAllowedResources();\n\n  @Input\n  public abstract MapProperty<String, String> getEnvironmentVariables();\n\n  @Input\n  public abstract MapProperty<String, String> getExternalProperties();\n\n  @InputFiles\n  public abstract ConfigurableFileCollection getModulePath();\n\n  @Internal\n  public abstract Property<Object> getSettingsModule();\n\n  @Internal\n  public Provider<Object> getParsedSettingsModule() {\n    return getSettingsModule().map(PluginUtils::parseModuleNotation);\n  }\n\n  @InputFile\n  @Optional\n  public Provider<File> getSettingsModuleFile() {\n    return getParsedSettingsModule()\n        .map(\n            it -> {\n              if (it instanceof File file) {\n                return file;\n              }\n              return null;\n            });\n  }\n\n  @Input\n  @Optional\n  public Provider<URI> getSettingsModuleUri() {\n    return getParsedSettingsModule()\n        .map(\n            it -> {\n              if (it instanceof URI uri) {\n                return uri;\n              }\n              return null;\n            });\n  }\n\n  // Exposed as a task input via evalRootDirPath, because we only need to depend\n  // on this directory's path and not on its contents.\n  @Internal\n  public abstract DirectoryProperty getEvalRootDir();\n\n  @Input\n  @Optional\n  public Provider<String> getEvalRootDirPath() {\n    return getEvalRootDir().map(it -> it.getAsFile().getAbsolutePath());\n  }\n\n  // This is not a task input because it doesn't affect task output but only performance.\n  @Internal\n  public abstract DirectoryProperty getModuleCacheDir();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getColor();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getNoCache();\n\n  @Input\n  @Optional\n  public abstract Property<Duration> getEvalTimeout();\n\n  @Input\n  @Optional\n  public abstract Property<Integer> getTestPort();\n\n  @Input\n  @Optional\n  public abstract Property<URI> getHttpProxy();\n\n  @Input\n  @Optional\n  public abstract ListProperty<String> getHttpNoProxy();\n\n  @Input\n  @Optional\n  public abstract MapProperty<URI, URI> getHttpRewrites();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getPowerAssertions();\n\n  /**\n   * There are issues with using native libraries in Gradle plugins. As a workaround for now, make\n   * Truffle use an un-optimized runtime.\n   *\n   * @see <a\n   *     href=\"https://discuss.gradle.org/t/loading-a-native-library-in-a-gradle-plugin/44854\">https://discuss.gradle.org/t/loading-a-native-library-in-a-gradle-plugin/44854</a>\n   * @see <a\n   *     href=\"https://github.com/apple/pkl/issues/988\">https://github.com/apple/pkl/issues/988</a>\n   */\n  // TODO: Remove this workaround when ugprading to Truffle 24.2+ (Truffle automatically falls back\n  // in this scenario).\n  protected void withFallbackTruffleRuntime(Runnable task) {\n    System.setProperty(TRUFFLE_USE_FALLBACK_RUNTIME_FLAG, \"true\");\n    System.setProperty(POLYGLOT_WARN_INTERPRETER_ONLY_FLAG, \"false\");\n    task.run();\n  }\n\n  @TaskAction\n  public void runTask() {\n    withFallbackTruffleRuntime(this::doRunTask);\n  }\n\n  protected abstract void doRunTask();\n\n  @LateInit protected CliBaseOptions cachedOptions;\n\n  // Must be called during task execution time only.\n  @Internal\n  protected CliBaseOptions getCliBaseOptions() {\n    if (cachedOptions == null) {\n      cachedOptions =\n          new CliBaseOptions(\n              getSourceModulesAsUris(),\n              patternsFromStrings(getAllowedModules().get()),\n              patternsFromStrings(getAllowedResources().get()),\n              getEnvironmentVariables().get(),\n              getExternalProperties().get(),\n              parseModulePath(),\n              getProject().getProjectDir().toPath(),\n              mapAndGetOrNull(getEvalRootDirPath(), Paths::get),\n              mapAndGetOrNull(getSettingsModule(), PluginUtils::parseModuleNotationToUri),\n              null,\n              getEvalTimeout().getOrNull(),\n              mapAndGetOrNull(getModuleCacheDir(), it1 -> it1.getAsFile().toPath()),\n              getColor().getOrElse(false) ? Color.ALWAYS : Color.NEVER,\n              getNoCache().getOrElse(false),\n              false,\n              false,\n              false,\n              getTestPort().getOrElse(-1),\n              Collections.emptyList(),\n              getHttpProxy().getOrNull(),\n              getHttpNoProxy().getOrElse(List.of()),\n              getHttpRewrites().getOrNull(),\n              Map.of(),\n              Map.of(),\n              null,\n              getPowerAssertions().getOrElse(false));\n    }\n    return cachedOptions;\n  }\n\n  @Internal\n  protected List<URI> getSourceModulesAsUris() {\n    return Collections.emptyList();\n  }\n\n  @Inject\n  protected abstract ObjectFactory getObjects();\n\n  @Inject\n  protected abstract ProviderFactory getProviders();\n\n  protected List<Path> parseModulePath() {\n    return getModulePath().getFiles().stream().map(File::toPath).collect(Collectors.toList());\n  }\n\n  protected List<Pattern> patternsFromStrings(List<String> patterns) {\n    return patterns.stream().map(Pattern::compile).collect(Collectors.toList());\n  }\n\n  /**\n   * Equivalent to {@code provider.map(it -> f.apply(it)).getOrNull()}.\n   *\n   * <p>This function is necessary because in some cases doing {@code\n   * someProvider.map(...).getOrNull()} may trigger validation errors inside Gradle, when {@code\n   * someProvider} is derived from a property.\n   */\n  protected <T, U> @Nullable U mapAndGetOrNull(Provider<T> provider, Function<T, U> f) {\n    @Nullable T value = provider.getOrNull();\n    return value == null ? null : f.apply(value);\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/CodeGenTask.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.MapProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.OutputDirectory;\n\npublic abstract class CodeGenTask extends ModulesTask {\n  @OutputDirectory\n  public abstract DirectoryProperty getOutputDir();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getAddGeneratedAnnotation();\n\n  @Input\n  public abstract Property<String> getIndent();\n\n  @Input\n  public abstract Property<Boolean> getGenerateSpringBootConfig();\n\n  @Input\n  public abstract Property<Boolean> getImplementSerializable();\n\n  @Input\n  public abstract MapProperty<String, String> getRenames();\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/EvalTask.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport java.util.Collections;\nimport java.util.Set;\nimport javax.annotation.Nullable;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.file.FileCollection;\nimport org.gradle.api.file.RegularFileProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.provider.Provider;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.Internal;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.OutputDirectories;\nimport org.gradle.api.tasks.OutputFiles;\nimport org.pkl.cli.CliEvaluator;\nimport org.pkl.cli.CliEvaluatorOptions;\n\npublic abstract class EvalTask extends ModulesTask {\n\n  // not tracked because it might contain placeholders\n  // required\n  @Internal\n  public abstract RegularFileProperty getOutputFile();\n\n  // not tracked because it might contain placeholders\n  // optional\n  @Internal\n  public abstract DirectoryProperty getMultipleFileOutputDir();\n\n  @Input\n  public abstract Property<String> getOutputFormat();\n\n  @Input\n  public abstract Property<String> getModuleOutputSeparator();\n\n  @Input\n  @Optional\n  public abstract Property<String> getExpression();\n\n  private final Provider<CliEvaluator> cliEvaluator =\n      getProviders()\n          .provider(\n              () ->\n                  new CliEvaluator(\n                      new CliEvaluatorOptions(\n                          getCliBaseOptions(),\n                          getOutputFile().get().getAsFile().getAbsolutePath(),\n                          getOutputFormat().get(),\n                          getModuleOutputSeparator().get(),\n                          mapAndGetOrNull(\n                              getMultipleFileOutputDir(), it -> it.getAsFile().getAbsolutePath()),\n                          getExpression().getOrNull())));\n\n  @SuppressWarnings(\"unused\")\n  @OutputFiles\n  @Optional\n  public FileCollection getEffectiveOutputFiles() {\n    return getObjects()\n        .fileCollection()\n        .from(cliEvaluator.map(e -> nullToEmpty(e.getOutputFiles())));\n  }\n\n  @OutputDirectories\n  @Optional\n  public FileCollection getEffectiveOutputDirs() {\n    return getObjects()\n        .fileCollection()\n        .from(cliEvaluator.map(e -> nullToEmpty(e.getOutputDirectories())));\n  }\n\n  private static <T> Set<T> nullToEmpty(@Nullable Set<T> set) {\n    return set == null ? Collections.emptySet() : set;\n  }\n\n  @Override\n  protected void doRunTask() {\n    //noinspection ResultOfMethodCallIgnored\n    getOutputs().getPreviousOutputFiles().forEach(File::delete);\n    cliEvaluator.get().run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/JavaCodeGenTask.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.Optional;\nimport org.pkl.codegen.java.CliJavaCodeGenerator;\nimport org.pkl.codegen.java.CliJavaCodeGeneratorOptions;\n\npublic abstract class JavaCodeGenTask extends CodeGenTask {\n  @Input\n  public abstract Property<Boolean> getGenerateGetters();\n\n  @Input\n  public abstract Property<Boolean> getGenerateJavadoc();\n\n  @Input\n  @Optional\n  public abstract Property<String> getParamsAnnotation();\n\n  @Input\n  @Optional\n  public abstract Property<String> getNonNullAnnotation();\n\n  @Override\n  protected void doRunTask() {\n    //noinspection ResultOfMethodCallIgnored\n    getOutputs().getPreviousOutputFiles().forEach(File::delete);\n\n    new CliJavaCodeGenerator(\n            new CliJavaCodeGeneratorOptions(\n                getCliBaseOptions(),\n                getProject().file(getOutputDir()).toPath(),\n                getIndent().get(),\n                getAddGeneratedAnnotation().get(),\n                getGenerateGetters().get(),\n                getGenerateJavadoc().get(),\n                getGenerateSpringBootConfig().get(),\n                getParamsAnnotation().getOrNull(),\n                getNonNullAnnotation().getOrNull(),\n                getImplementSerializable().get(),\n                getRenames().get()))\n        .run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/KotlinCodeGenTask.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.pkl.codegen.kotlin.CliKotlinCodeGenerator;\nimport org.pkl.codegen.kotlin.CliKotlinCodeGeneratorOptions;\n\npublic abstract class KotlinCodeGenTask extends CodeGenTask {\n  @Input\n  public abstract Property<Boolean> getGenerateKdoc();\n\n  @Override\n  protected void doRunTask() {\n    //noinspection ResultOfMethodCallIgnored\n    getOutputs().getPreviousOutputFiles().forEach(File::delete);\n\n    new CliKotlinCodeGenerator(\n            new CliKotlinCodeGeneratorOptions(\n                getCliBaseOptions(),\n                getProject().file(getOutputDir()).toPath(),\n                getIndent().get(),\n                getGenerateKdoc().get(),\n                getGenerateSpringBootConfig().get(),\n                getImplementSerializable().get(),\n                getAddGeneratedAnnotation().get(),\n                getRenames().get()))\n        .run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/ModulesTask.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport java.net.URI;\nimport java.nio.file.Paths;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.gradle.api.InvalidUserDataException;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.file.FileCollection;\nimport org.gradle.api.provider.ListProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.provider.Provider;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.InputFiles;\nimport org.gradle.api.tasks.Internal;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.TaskAction;\nimport org.pkl.commons.cli.CliBaseOptions;\nimport org.pkl.core.evaluatorSettings.Color;\nimport org.pkl.core.util.Pair;\nimport org.pkl.gradle.utils.PluginUtils;\n\npublic abstract class ModulesTask extends BasePklTask {\n  // We expose the contents of this property as task inputs via the sourceModuleFiles\n  // and sourceModuleUris properties. We cannot use two separate properties because\n  // the order of source modules matters for the CLI API invocation, so it must be\n  // a single collection.\n  @Internal\n  public abstract ListProperty<Object> getSourceModules();\n\n  @InputFiles\n  public abstract ListProperty<File> getTransitiveModules();\n\n  private final Map<List<Object>, Pair<List<File>, List<URI>>> parsedSourceModulesCache =\n      new HashMap<>();\n\n  // Used for input tracking purposes only.\n  @Internal\n  public Provider<Pair<List<File>, List<URI>>> getParsedSourceModules() {\n    return getSourceModules()\n        .map(it -> parsedSourceModulesCache.computeIfAbsent(it, this::splitFilesAndUris));\n  }\n\n  // We use @InputFiles and FileCollection here to ensure that file contents are tracked.\n  @InputFiles\n  public FileCollection getSourceModuleFiles() {\n    return getProject().files(getParsedSourceModules().map(it -> it.first));\n  }\n\n  // We use @Input and just a list value because we can only track the URIs themselves\n  // but not their contents.\n  @Input\n  public Provider<List<URI>> getSourceModuleUris() {\n    return getParsedSourceModules().map(it -> it.second);\n  }\n\n  /**\n   * Returns the sourceModules property as a list of URIs.\n   *\n   * <p>This method ensures that the order of source modules in the sourceModules property is\n   * preserved all the way to the CLI API invocation.\n   */\n  @Internal\n  @Override\n  protected List<URI> getSourceModulesAsUris() {\n    return getSourceModules().get().stream()\n        .map(PluginUtils::parseModuleNotationToUri)\n        .collect(Collectors.toList());\n  }\n\n  // Exposed as a task input via getProjectDirPath, because we only need to depend\n  // on this directory's path and not on its contents.\n  @Internal\n  public abstract DirectoryProperty getProjectDir();\n\n  @Input\n  @Optional\n  public Provider<String> getProjectDirPath() {\n    return getProjectDir().map(it -> it.getAsFile().getAbsolutePath());\n  }\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getOmitProjectSettings();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getNoProject();\n\n  /**\n   * A source module can be either a file or a URI. Files can be tracked, so this method splits a\n   * collection of module notations (which can be strings, URIs, URLs, Files or Paths) into a list\n   * of files (for content-based tracking) and URIs (for simple value-based tracking). These lists\n   * are then exposed as separate read-only properties to make Gradle track them as proper inputs.\n   */\n  private Pair<List<File>, List<URI>> splitFilesAndUris(List<Object> modules) {\n    var files = new ArrayList<File>();\n    var uris = new ArrayList<URI>();\n    for (var m : modules) {\n      var parsed = PluginUtils.parseModuleNotation(m);\n      if (parsed instanceof File file) {\n        files.add(file);\n      } else if (parsed instanceof URI uri) {\n        uris.add(uri);\n      }\n    }\n    return Pair.of(files, uris);\n  }\n\n  @TaskAction\n  @Override\n  public void runTask() {\n    if (getCliBaseOptions().getNormalizedSourceModules().isEmpty()) {\n      throw new InvalidUserDataException(\"No source modules specified.\");\n    }\n    withFallbackTruffleRuntime(this::doRunTask);\n  }\n\n  @Internal\n  @Override\n  protected CliBaseOptions getCliBaseOptions() {\n    if (cachedOptions == null) {\n      cachedOptions =\n          new CliBaseOptions(\n              getSourceModulesAsUris(),\n              patternsFromStrings(getAllowedModules().get()),\n              patternsFromStrings(getAllowedResources().get()),\n              getEnvironmentVariables().get(),\n              getExternalProperties().get(),\n              parseModulePath(),\n              getProject().getProjectDir().toPath(),\n              mapAndGetOrNull(getEvalRootDirPath(), Paths::get),\n              mapAndGetOrNull(getSettingsModule(), PluginUtils::parseModuleNotationToUri),\n              getProjectDir().isPresent() ? getProjectDir().get().getAsFile().toPath() : null,\n              getEvalTimeout().getOrNull(),\n              mapAndGetOrNull(getModuleCacheDir(), it1 -> it1.getAsFile().toPath()),\n              getColor().getOrElse(false) ? Color.ALWAYS : Color.NEVER,\n              getNoCache().getOrElse(false),\n              getOmitProjectSettings().getOrElse(false),\n              getNoProject().getOrElse(false),\n              false,\n              getTestPort().getOrElse(-1),\n              Collections.emptyList(),\n              null,\n              List.of(),\n              getHttpRewrites().getOrNull(),\n              Map.of(),\n              Map.of(),\n              null,\n              getPowerAssertions().getOrElse(false));\n    }\n    return cachedOptions;\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/PkldocTask.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.OutputDirectory;\nimport org.pkl.doc.CliDocGenerator;\nimport org.pkl.doc.CliDocGeneratorOptions;\n\npublic abstract class PkldocTask extends ModulesTask {\n  @OutputDirectory\n  public abstract DirectoryProperty getOutputDir();\n\n  @Input\n  public abstract Property<Boolean> getNoSymlinks();\n\n  @Override\n  protected void doRunTask() {\n    new CliDocGenerator(\n            new CliDocGeneratorOptions(\n                getCliBaseOptions(),\n                getOutputDir().get().getAsFile().toPath(),\n                false,\n                getNoSymlinks().get()))\n        .run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/ProjectPackageTask.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.PrintWriter;\nimport java.nio.file.Path;\nimport java.util.stream.Collectors;\nimport org.gradle.api.InvalidUserDataException;\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.InputFiles;\nimport org.gradle.api.tasks.Internal;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.OutputDirectory;\nimport org.gradle.api.tasks.UntrackedTask;\nimport org.pkl.cli.CliProjectPackager;\nimport org.pkl.commons.cli.CliTestOptions;\n\n@UntrackedTask(because = \"Output names are known only after execution\")\npublic abstract class ProjectPackageTask extends BasePklTask {\n  @InputFiles\n  public abstract ConfigurableFileCollection getProjectDirectories();\n\n  @Internal\n  public abstract DirectoryProperty getOutputPath();\n\n  @Optional\n  @OutputDirectory\n  public abstract DirectoryProperty getJunitReportsDir();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getJunitAggregateReports();\n\n  @Input\n  public abstract Property<String> getJunitAggregateSuiteName();\n\n  @Input\n  public abstract Property<Boolean> getOverwrite();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getSkipPublishCheck();\n\n  public ProjectPackageTask() {\n    this.getJunitAggregateSuiteName().convention(\"pkl-tests\");\n  }\n\n  @Override\n  protected void doRunTask() {\n    var projectDirectories =\n        getProjectDirectories().getFiles().stream()\n            .map(it -> Path.of(it.getAbsolutePath()))\n            .collect(Collectors.toList());\n    if (projectDirectories.isEmpty()) {\n      throw new InvalidUserDataException(\"No project directories specified.\");\n    }\n\n    new CliProjectPackager(\n            getCliBaseOptions(),\n            projectDirectories,\n            new CliTestOptions(\n                mapAndGetOrNull(getJunitReportsDir(), it -> it.getAsFile().toPath()),\n                getOverwrite().get(),\n                getJunitAggregateReports().getOrElse(false),\n                getJunitAggregateSuiteName().get()),\n            getOutputPath().get().getAsFile().getAbsolutePath(),\n            getSkipPublishCheck().getOrElse(false),\n            new PrintWriter(System.out),\n            new PrintWriter(System.err))\n        .run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/ProjectResolveTask.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.File;\nimport java.io.PrintWriter;\nimport java.nio.file.Path;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.gradle.api.InvalidUserDataException;\nimport org.gradle.api.file.ConfigurableFileCollection;\nimport org.gradle.api.provider.Provider;\nimport org.gradle.api.tasks.InputFiles;\nimport org.gradle.api.tasks.Internal;\nimport org.pkl.cli.CliProjectResolver;\n\npublic abstract class ProjectResolveTask extends BasePklTask {\n  @Internal\n  public abstract ConfigurableFileCollection getProjectDirectories();\n\n  // Only the `PklProject` files matter for creating PklProject.deps.json files.\n  // Otherwise, these tasks can be considered up to date.\n  @InputFiles\n  public Provider<List<File>> getProjectPklFiles() {\n    return getProjectDirectories()\n        .getElements()\n        .map(\n            (files) ->\n                files.stream()\n                    .map((it) -> it.getAsFile().toPath().resolve(\"PklProject\").toFile())\n                    .collect(Collectors.toList()));\n  }\n\n  @Override\n  protected void doRunTask() {\n    var projectDirectories =\n        getProjectDirectories().getFiles().stream()\n            .map(it -> Path.of(it.getAbsolutePath()))\n            .collect(Collectors.toList());\n    if (projectDirectories.isEmpty()) {\n      throw new InvalidUserDataException(\"No project directories specified.\");\n    }\n    new CliProjectResolver(\n            getCliBaseOptions(),\n            projectDirectories,\n            new PrintWriter(System.out),\n            new PrintWriter(System.err))\n        .run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/TestTask.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.task;\n\nimport java.io.PrintWriter;\nimport org.gradle.api.file.DirectoryProperty;\nimport org.gradle.api.provider.Property;\nimport org.gradle.api.tasks.Input;\nimport org.gradle.api.tasks.Optional;\nimport org.gradle.api.tasks.OutputDirectory;\nimport org.pkl.cli.CliTestRunner;\nimport org.pkl.commons.cli.CliTestOptions;\n\npublic abstract class TestTask extends ModulesTask {\n  @Optional\n  @OutputDirectory\n  public abstract DirectoryProperty getJunitReportsDir();\n\n  @Input\n  @Optional\n  public abstract Property<Boolean> getJunitAggregateReports();\n\n  @Input\n  public abstract Property<String> getJunitAggregateSuiteName();\n\n  @Input\n  public abstract Property<Boolean> getOverwrite();\n\n  public TestTask() {\n    this.getJunitAggregateSuiteName().convention(\"pkl-tests\");\n    this.getPowerAssertions().convention(true);\n  }\n\n  @Override\n  protected void doRunTask() {\n    new CliTestRunner(\n            getCliBaseOptions(),\n            new CliTestOptions(\n                mapAndGetOrNull(getJunitReportsDir(), it -> it.getAsFile().toPath()),\n                getOverwrite().get(),\n                getJunitAggregateReports().getOrElse(false),\n                getJunitAggregateSuiteName().get()),\n            new PrintWriter(System.out),\n            new PrintWriter(System.err))\n        .run();\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/task/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.gradle.task;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/utils/PluginUtils.java",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle.utils;\n\nimport java.io.File;\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.nio.file.InvalidPathException;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport org.gradle.api.InvalidUserDataException;\nimport org.gradle.api.file.FileSystemLocation;\nimport org.pkl.core.util.IoUtils;\n\npublic class PluginUtils {\n  private PluginUtils() {}\n\n  /**\n   * Parses the specified source module notation into a \"parsed\" notation which is then used for\n   * input path tracking and as an argument for the CLI API.\n   *\n   * <p>This method accepts the following input types:\n   *\n   * <ul>\n   *   <li>{@link URI} - used as is.\n   *   <li>{@link File} - used as is.\n   *   <li>{@link Path} - converted to a {@link File}. This conversion may fail because not all\n   *       {@link Path}s point to the local file system.\n   *   <li>{@link URL} - converted to a {@link URI}. This conversion may fail because {@link URL}\n   *       allows for URLs which are not compliant URIs.\n   *   <li>{@link CharSequence} - first, converted to a string. If this string is \"URI-like\" (see\n   *       {@link IoUtils#isUriLike(String)}), then we attempt to parse it as a {@link URI}, which\n   *       may fail. Otherwise, we attempt to parse it as a {@link Path}, which is then converted to\n   *       a {@link File} (both of these operations may fail).\n   *   <li>{@link FileSystemLocation} - converted to a {@link File} via the {@link\n   *       FileSystemLocation#getAsFile()} method.\n   * </ul>\n   *\n   * In case the returned value is determined to be a {@link URI}, then this URI is first checked\n   * for whether its scheme is {@code file}, like {@code file:///example/path}. In such case, this\n   * method returns a {@link File} corresponding to the file path in the URI. Otherwise, a {@link\n   * URI} instance is returned.\n   *\n   * @throws InvalidUserDataException In case the input is none of the types described above, or\n   *     when the underlying value cannot be parsed correctly.\n   */\n  public static Object parseModuleNotation(Object notation) {\n    if (notation instanceof URI uri) {\n      if (\"file\".equals(uri.getScheme())) {\n        return new File(uri.getPath());\n      }\n      return uri;\n    } else if (notation instanceof File) {\n      return notation;\n    } else if (notation instanceof Path path) {\n      try {\n        return path.toFile();\n      } catch (UnsupportedOperationException e) {\n        throw new InvalidUserDataException(\"Failed to parse Pkl module file path: \" + notation, e);\n      }\n    } else if (notation instanceof URL url) {\n      try {\n        return parseModuleNotation(url.toURI());\n      } catch (URISyntaxException e) {\n        throw new InvalidUserDataException(\"Failed to parse Pkl module URI: \" + notation, e);\n      }\n    } else if (notation instanceof CharSequence) {\n      var s = notation.toString();\n      if (IoUtils.isUriLike(s)) {\n        try {\n          return parseModuleNotation(IoUtils.toUri(s));\n        } catch (URISyntaxException e) {\n          throw new InvalidUserDataException(\"Failed to parse Pkl module URI: \" + s, e);\n        }\n      } else {\n        try {\n          return Paths.get(s).toFile();\n        } catch (InvalidPathException | UnsupportedOperationException e) {\n          throw new InvalidUserDataException(\"Failed to parse Pkl module file path: \" + s, e);\n        }\n      }\n    } else if (notation instanceof FileSystemLocation location) {\n      return location.getAsFile();\n    } else {\n      throw new InvalidUserDataException(\n          \"Unsupported value of type \"\n              + notation.getClass()\n              + \" used as a module path: \"\n              + notation);\n    }\n  }\n\n  /**\n   * Converts either a file or a URI to a URI. We convert a relative file to a URI via the {@link\n   * IoUtils#createUri(String)} because other ways of conversion can make relative paths into\n   * absolute URIs, which may break module loading.\n   */\n  public static URI parsedModuleNotationToUri(Object notation) {\n    if (notation instanceof File file) {\n      if (file.isAbsolute()) {\n        return file.toPath().toUri();\n      }\n      return IoUtils.createUri(IoUtils.toNormalizedPathString(file.toPath()));\n    } else if (notation instanceof URI uri) {\n      return uri;\n    }\n    throw new IllegalArgumentException(\"Invalid parsed module notation: \" + notation);\n  }\n\n  public static URI parseModuleNotationToUri(Object m) {\n    var parsed1 = PluginUtils.parseModuleNotation(m);\n    return parsedModuleNotationToUri(parsed1);\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/main/java/org/pkl/gradle/utils/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.gradle.utils;\n\nimport org.pkl.core.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/AbstractTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport java.net.URI\nimport java.nio.file.Path\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.writeText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.gradle.testkit.runner.BuildResult\nimport org.gradle.testkit.runner.GradleRunner\nimport org.gradle.testkit.runner.UnexpectedBuildFailure\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.readString\n\nabstract class AbstractTest {\n  private val gradleVersion: String? = System.getProperty(\"testGradleVersion\")\n\n  private val gradleDistributionUrl: String? = System.getProperty(\"testGradleDistributionUrl\")\n\n  @TempDir protected lateinit var testProjectDir: Path\n\n  protected fun runTask(taskName: String, expectFailure: Boolean = false): BuildResult {\n\n    val runner =\n      GradleRunner.create()\n        .withProjectDir(testProjectDir.toFile())\n        .withArguments(\"--stacktrace\", \"--no-build-cache\", taskName)\n        .withPluginClasspath()\n        .withDebug(true)\n\n    if (gradleVersion != null) {\n      runner.withGradleVersion(gradleVersion)\n    }\n    if (gradleDistributionUrl != null) {\n      runner.withGradleDistribution(URI(gradleDistributionUrl))\n    }\n\n    return try {\n      if (expectFailure) runner.buildAndFail() else runner.build()\n    } catch (e: UnexpectedBuildFailure) {\n      throw AssertionError(e.buildResult.output)\n    }\n  }\n\n  protected fun writeFile(fileName: String, contents: String): Path {\n    return testProjectDir.resolve(fileName).apply {\n      createParentDirectories()\n      writeText(contents.trimIndent())\n    }\n  }\n\n  protected fun checkFileContents(file: Path, contents: String) {\n    assertThat(file).exists()\n    assertThat(file.readString().trim()).isEqualTo(contents.trim())\n  }\n\n  protected fun checkTextContains(text: String, vararg contents: String) {\n    for (content in contents) {\n      try {\n        assertThat(text).contains(content.trimMargin())\n      } catch (e: AssertionError) {\n        // to get diff output in IDE\n        assertThat(text).isEqualTo(content.trimMargin())\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/AnalyzeImportsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass AnalyzeImportsTest : AbstractTest() {\n  @Test\n  fun `write to console`() {\n    writeFile(\"input.pkl\", \"\")\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n        plugins {\n          id \"org.pkl-lang\"\n        }\n\n        pkl {\n          analyzers {\n            imports {\n              analyzeMyImports {\n                sourceModules = [\"input.pkl\"]\n              }\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val result = runTask(\"analyzeMyImports\")\n    assertThat(result.output).contains(\"imports {\")\n  }\n\n  @Test\n  fun `output file`() {\n    writeFile(\"input.pkl\", \"\")\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n        plugins {\n          id \"org.pkl-lang\"\n        }\n\n        pkl {\n          analyzers {\n            imports {\n              analyzeMyImports {\n                sourceModules = [\"input.pkl\"]\n                outputFile = file(\"myFile.pcf\")\n              }\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    runTask(\"analyzeMyImports\")\n    assertThat(testProjectDir.resolve(\"myFile.pcf\")).exists()\n  }\n\n  @Test\n  fun `output format`() {\n    writeFile(\"input.pkl\", \"\")\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n        plugins {\n          id \"org.pkl-lang\"\n        }\n\n        pkl {\n          analyzers {\n            imports {\n              analyzeMyImports {\n                sourceModules = [\"input.pkl\"]\n                outputFormat = \"json\"\n              }\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    val result = runTask(\"analyzeMyImports\")\n    assertThat(result.output)\n      .contains(\n        \"\"\"\n          {\n            \"imports\": {\n        \"\"\"\n          .trimIndent()\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/EvaluatorsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport java.nio.file.Path\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.gradle.testkit.runner.TaskOutcome\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.readString\nimport org.pkl.commons.test.PackageServer\n\nclass EvaluatorsTest : AbstractTest() {\n  @Test\n  fun `render Pcf`() {\n    writeBuildFile(\"pcf\")\n\n    writePklFile()\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      person {\n        name = \"Pigeon\"\n        age = 30\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `render YAML`() {\n    writeBuildFile(\"yaml\")\n\n    writePklFile()\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.yaml\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      person:\n        name: Pigeon\n        age: 30\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `render JSON`() {\n    writeBuildFile(\"json\")\n\n    writePklFile()\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.json\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      {\n        \"person\": {\n          \"name\": \"Pigeon\",\n          \"age\": 30\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `render plist`() {\n    writeBuildFile(\"plist\")\n\n    writePklFile()\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.plist\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n      <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n      <plist version=\"1.0\">\n      <dict>\n        <key>person</key>\n        <dict>\n          <key>name</key>\n          <string>Pigeon</string>\n          <key>age</key>\n          <integer>30</integer>\n        </dict>\n      </dict>\n      </plist>\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `set external properties`() {\n    writeBuildFile(\n      \"pcf\",\n      \"\"\"\n      externalProperties = [prop1: \"value1\", prop2: \"value2\"]\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writePklFile(\n      \"\"\"\n      prop1 = read(\"prop:prop1\")\n      prop2 = read(\"prop:prop2\")\n      other = read?(\"prop:other\")\n    \"\"\"\n        .trimIndent()\n    )\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      prop1 = \"value1\"\n      prop2 = \"value2\"\n      other = null\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `defaults to empty environment variables`() {\n    writeBuildFile(\"pcf\")\n\n    writePklFile(\n      \"\"\"\n      prop1 = read?(\"env:USER\")\n      prop2 = read?(\"env:PATH\")\n      prop3 = read?(\"env:JAVA_HOME\")\n    \"\"\"\n        .trimIndent()\n    )\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      prop1 = null\n      prop2 = null\n      prop3 = null\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `set environment variables`() {\n    writeBuildFile(\n      \"pcf\",\n      \"\"\"\n      environmentVariables = [VAR1: \"value1\", VAR2: \"value2\"]\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writePklFile(\n      \"\"\"\n      prop1 = read(\"env:VAR1\")\n      prop2 = read(\"env:VAR2\")\n      other = read?(\"env:OTHER\")\n    \"\"\"\n        .trimIndent()\n    )\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      prop1 = \"value1\"\n      prop2 = \"value2\"\n      other = null\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `no source modules`() {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTest {\n            outputFormat = \"pcf\"\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    val result = runTask(\"evalTest\", true)\n    assertThat(result.output).contains(\"No source modules specified.\")\n  }\n\n  @Test\n  fun `source module URIs`() {\n    writeFile(\n      \"testDir/test.pkl\",\n      \"\"\"\n      person {\n        name = \"Pigeon\"\n        age = 20 + 10\n      }\n    \"\"\",\n    )\n\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTest {\n            sourceModules = [uri(\"modulepath:/test.pkl\")]\n            modulePath.from layout.projectDirectory.dir(\"testDir\")\n            outputFile = layout.projectDirectory.file(\"test.pcf\")\n            settingsModule = \"pkl:settings\"\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      person {\n        name = \"Pigeon\"\n        age = 30\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `cannot evaluate module located outside evalRootDir`() {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTest {\n            evalRootDir = file(\"/non/existing\")\n            sourceModules = [\"test.pkl\"]\n            settingsModule = \"pkl:settings\"\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    val result = runTask(\"evalTest\", expectFailure = true)\n    assertThat(result.output).contains(\"Refusing to load module\")\n    assertThat(result.output)\n      .contains(\"because it is not within the root directory (`--root-dir`).\")\n  }\n\n  @Test\n  fun `evaluation timeout`() {\n    // Gradle 4.10 doesn't automatically import Duration\n    writeBuildFile(\n      \"pcf\",\n      \"\"\"\n      evalTimeout = java.time.Duration.ofMillis(100)\n    \"\"\",\n    )\n\n    writePklFile(\n      \"\"\"\n      function fib(n) = if (n < 2) 0 else fib(n - 1) + fib(n - 2)\n      x = fib(100)\n    \"\"\"\n    )\n\n    val result = runTask(\"evalTest\", expectFailure = true)\n    assertThat(result.output).contains(\"timed out\")\n  }\n\n  @Test\n  fun `module output separator`() {\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTask {\n            moduleOutputSeparator = \"// hello\"\n            sourceModules = [\"test1.pkl\", \"test2.pkl\"]\n            settingsModule = \"pkl:settings\"\n            outputFile = layout.projectDirectory.file(\"test.pcf\")\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    writeFile(\"test1.pkl\", \"foo = 1\")\n    writeFile(\"test2.pkl\", \"bar = 2\")\n    runTask(\"evalTask\")\n\n    checkFileContents(\n      outputFile,\n      \"\"\"\n      foo = 1\n      // hello\n      bar = 2\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n\n  @Test\n  fun `compliant file URIs`() {\n    writeBuildFile(\"pcf\")\n    writeFile(\n      \"test.pkl\",\n      \"\"\"\n      import \"pkl:reflect\"\n      output {\n        text = reflect.Module(module).uri\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    runTask(\"evalTest\")\n\n    val outputFile = testProjectDir.resolve(\"test.pcf\")\n    assertThat(outputFile).exists()\n    assertThat(outputFile.readString().trim()).startsWith(\"file:///\")\n  }\n\n  @Test\n  fun `multiple file output`() {\n    writeBuildFile(\n      \"pcf\",\n      \"\"\"\n      multipleFileOutputDir = layout.projectDirectory.dir(\"my-output\")\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"test.pkl\",\n      \"\"\"\n        output {\n          files {\n            [\"output-1.txt\"] {\n              text = \"My output 1\"\n            }\n            [\"output-2.txt\"] {\n              text = \"My output 2\"\n            }\n          }\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    runTask(\"evalTest\")\n    checkFileContents(testProjectDir.resolve(\"my-output/output-1.txt\"), \"My output 1\")\n    checkFileContents(testProjectDir.resolve(\"my-output/output-2.txt\"), \"My output 2\")\n  }\n\n  @Test\n  fun expression() {\n    writeBuildFile(\n      \"yaml\",\n      \"\"\"\n      expression = \"metadata.name\"\n      outputFile = layout.projectDirectory.file(\"output.txt\")\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"test.pkl\",\n      \"\"\"\n        metadata {\n          name = \"Uni\"\n        }\n      \"\"\"\n        .trimIndent(),\n    )\n    runTask(\"evalTest\")\n    checkFileContents(testProjectDir.resolve(\"output.txt\"), \"Uni\")\n  }\n\n  @Test\n  fun `explicitly set cache dir`(@TempDir tempDir: Path) {\n    writeBuildFile(\n      \"pcf\",\n      \"\"\"\n      moduleCacheDir = file(\"${tempDir.toUri()}\")\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"test.pkl\",\n      \"\"\"\n        import \"package://localhost:0/birds@0.5.0#/Bird.pkl\"\n        \n        res = new Bird { name = \"Wally\"; favoriteFruit { name = \"bananas\" } }\n      \"\"\"\n        .trimIndent(),\n    )\n    PackageServer.populateCacheDir(tempDir)\n    runTask(\"evalTest\")\n  }\n\n  @Test\n  fun `explicitly set project dir`() {\n    writeBuildFile(\"pcf\", \"projectDir = file(\\\"proj1\\\")\", listOf(\"proj1/foo.pkl\"))\n\n    writeFile(\n      \"proj1/PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      dependencies {\n        [\"proj2\"] = import(\"../proj2/PklProject\")\n      }\n      \n      package {\n        name = \"proj1\"\n        baseUri = \"package://localhost:0/\\(name)\"\n        version = \"1.0.0\"\n        packageZipUrl = \"https://localhost:0/\\(name)@\\(version).zip\"\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writeFile(\n      \"proj2/PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      package {\n        name = \"proj2\"\n        baseUri = \"package://localhost:0/\\(name)\"\n        version = \"1.0.0\"\n        packageZipUrl = \"https://localhost:0/\\(name)@\\(version).zip\"\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writeFile(\n      \"proj1/PklProject.deps.json\",\n      \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/proj2@1\": {\n            \"type\": \"local\",\n            \"uri\": \"projectpackage://localhost:0/proj2@1.0.0\",\n            \"path\": \"../proj2\"\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writeFile(\n      \"proj2/PklProject.deps.json\",\n      \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {}\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writeFile(\n      \"proj1/foo.pkl\",\n      \"\"\"\n      module proj1.foo\n      \n      bar: String = import(\"@proj2/baz.pkl\").qux\n    \"\"\"\n        .trimIndent(),\n    )\n\n    writeFile(\n      \"proj2/baz.pkl\",\n      \"\"\"\n      qux: String = \"Contents of @proj2/qux\"\n    \"\"\"\n        .trimIndent(),\n    )\n\n    runTask(\"evalTest\")\n    assertThat(testProjectDir.resolve(\"proj1/foo.pcf\")).exists()\n  }\n\n  @Test\n  fun `implicit dependency tracking for effective output files`() {\n    writeFile(\"file1.pkl\", \"foo = 1\")\n\n    writeFile(\"file2.pkl\", \"bar = 1\")\n\n    writeFile(\n      \"build.gradle.kts\",\n      \"\"\"\n      import org.pkl.gradle.task.EvalTask\n\n      plugins {\n        id(\"org.pkl-lang\")\n      }\n\n      pkl {\n        evaluators {\n          register(\"doEval\") {\n            sourceModules.set(files(\"file1.pkl\", \"file2.pkl\"))\n            outputFile.set(layout.projectDirectory.file(\"%{moduleName}.%{outputFormat}\"))\n            outputFormat.set(\"yaml\")\n          }\n        }\n      }\n\n      val doEval by tasks.existing(EvalTask::class) {\n        doLast {\n          file(\"evalCounter.txt\").appendText(\"doEval executed\\n\")\n        }\n      }\n\n      val printEvalFiles by tasks.registering {\n        inputs.files(doEval)\n        doLast {\n          println(\"evalCounter.txt\")\n          println(file(\"evalCounter.txt\").readText())\n          \n          inputs.files.forEach {\n            println(it.name)\n            println(it.readText())\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val result1 = runTask(\"printEvalFiles\")\n\n    // `doEval` task is invoked transitively.\n    assertThat(result1.task(\":doEval\")?.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    assertThat(result1.output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      evalCounter.txt\n      doEval executed\n      \n      file1.yaml\n      foo: 1\n\n      file2.yaml\n      bar: 1\n      \"\"\"\n          .trimIndent()\n      )\n\n    // Run the task again to check that it is cached.\n    val result2 = runTask(\"printEvalFiles\")\n\n    assertThat(result2.task(\":doEval\")?.outcome).isEqualTo(TaskOutcome.UP_TO_DATE)\n\n    // evalCounter.txt content is the same as before.\n    assertThat(result2.output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      evalCounter.txt\n      doEval executed\n      \n      file1.yaml\n      foo: 1\n\n      file2.yaml\n      bar: 1\n      \"\"\"\n          .trimIndent()\n      )\n\n    // Modify the input file.\n    writeFile(\"file1.pkl\", \"foo = 7\")\n\n    // Run the build again - the evaluation task will not be cached.\n    val result3 = runTask(\"printEvalFiles\")\n\n    assertThat(result3.task(\":doEval\")?.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // evalCounter.txt content is updated too.\n    assertThat(result3.output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      evalCounter.txt\n      doEval executed\n      doEval executed\n      \n      file1.yaml\n      foo: 7\n\n      file2.yaml\n      bar: 1\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `implicit dependency tracking for multiple output directory`() {\n    writePklFile(\n      \"\"\"\n      pigeon {\n        name = \"Pigeon\"\n        diet = \"Seeds\"\n      }\n      \n      parrot {\n        name = \"Parrot\"\n        diet = \"Seeds\"\n      }\n      \n      output {\n        files {\n          [\"birds/pigeon.json\"] {\n            value = pigeon\n            renderer = new JsonRenderer {}\n          }\n          [\"birds/parrot.pcf\"] {\n            value = parrot\n            renderer = new PcfRenderer {}\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent()\n    )\n\n    writeBuildFile(\n      \"yaml\",\n      additionalContents =\n        \"\"\"\n        multipleFileOutputDir = layout.projectDirectory.dir(\"%{moduleDir}/%{moduleName}-%{outputFormat}\")\n      \"\"\"\n          .trimIndent(),\n      additionalBuildScript =\n        \"\"\"\n        tasks.named('evalTest') {\n          doLast {\n            file(\"evalCounter.txt\").append(\"evalTest executed\\n\")\n          }\n        }\n        \n        abstract class PrintTask extends DefaultTask {\n          @InputFiles\n          public abstract ConfigurableFileCollection getInputDirs();\n        }\n        \n        // ensure that iteration order is the same across environments\n        def sortByTypeThenName = { a, b ->\n            a.isFile() != b.isFile() ? a.isFile() <=> b.isFile() : a.name <=> b.name\n        }\n\n        tasks.register('printEvalDirs', PrintTask) {\n          inputDirs.from(tasks.named('evalTest'))\n          \n          doLast {\n            println \"evalCounter.txt\"\n            println file(\"evalCounter.txt\").text\n\n            inputDirs.forEach { f ->\n              f.traverse(visitRoot: true, sort: sortByTypeThenName) {\n                if (it.isDirectory()) {\n                  println layout.projectDirectory.asFile.relativePath(it) + '/'\n                  println()\n                } else {\n                  println layout.projectDirectory.asFile.relativePath(it)\n                  println it.text\n                }\n              }\n            }\n          }\n        }\n      \"\"\"\n          .trimIndent(),\n    )\n\n    val result1 = runTask(\"printEvalDirs\")\n\n    // `doEval` task is invoked transitively.\n    assertThat(result1.task(\":evalTest\")?.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // NB: Configured output format, 'yaml', is only used to replace the placeholder in the path;\n    // the output files themselves are formatted according to configuration\n    // in the rendered module.\n\n    assertThat(result1.output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      evalCounter.txt\n      evalTest executed\n      \n      test-yaml/birds/\n      \n      test-yaml/birds/parrot.pcf\n      name = \"Parrot\"\n      diet = \"Seeds\"\n      \n      test-yaml/birds/pigeon.json\n      {\n        \"name\": \"Pigeon\",\n        \"diet\": \"Seeds\"\n      }\n      \n      test-yaml/\n      \"\"\"\n          .trimIndent()\n      )\n\n    // Run the task again to check that it is cached.\n    val result2 = runTask(\"printEvalDirs\")\n\n    assertThat(result2.task(\":evalTest\")?.outcome).isEqualTo(TaskOutcome.UP_TO_DATE)\n\n    // evalCounter.txt content is the same as before.\n    assertThat(result2.output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      evalCounter.txt\n      evalTest executed\n      \n      test-yaml/birds/\n      \n      test-yaml/birds/parrot.pcf\n      name = \"Parrot\"\n      diet = \"Seeds\"\n      \n      test-yaml/birds/pigeon.json\n      {\n        \"name\": \"Pigeon\",\n        \"diet\": \"Seeds\"\n      }\n      \n      test-yaml/\n      \"\"\"\n          .trimIndent()\n      )\n\n    // Modify the input file.\n    writePklFile(testProjectDir.resolve(\"test.pkl\").readText().replace(\"Parrot\", \"Macaw\"))\n\n    // Run the build again - the evaluation task will not be cached.\n    val result3 = runTask(\"printEvalDirs\")\n\n    assertThat(result3.task(\":evalTest\")?.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // evalCounter.txt content is updated too.\n    assertThat(result3.output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      evalCounter.txt\n      evalTest executed\n      evalTest executed\n      \n      test-yaml/birds/\n      \n      test-yaml/birds/parrot.pcf\n      name = \"Macaw\"\n      diet = \"Seeds\"\n      \n      test-yaml/birds/pigeon.json\n      {\n        \"name\": \"Pigeon\",\n        \"diet\": \"Seeds\"\n      }\n      \n      test-yaml/\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `implicit dependency tracking for declared imports`() {\n    writePklFile(\"import \\\"shared.pkl\\\"\")\n    writeFile(\"shared.pkl\", \"foo = 1\")\n    writeBuildFile(\"json\")\n    val result1 = runTask(\"evalTest\")\n    assertThat(result1.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // evalTest should be up-to-date now\n    val result2 = runTask(\"evalTest\")\n    assertThat(result2.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.UP_TO_DATE)\n\n    // update transitive module with new contents\n    writeFile(\"shared.pkl\", \"foo = 2\")\n\n    // evalTest should be out-of-date and need to run again\n    val result3 = runTask(\"evalTest\")\n    assertThat(result3.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // running again should be up-to-date again\n    val result4 = runTask(\"evalTest\")\n    assertThat(result4.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.UP_TO_DATE)\n  }\n\n  @Test\n  fun `explicit dependency tracking using transitive modules`() {\n    writePklFile(\"import \\\"shared.pkl\\\"\")\n    writeFile(\"shared.pkl\", \"foo = 1\")\n    writeFile(\"shared2.pkl\", \"foo = 1\")\n    // intentionally use wrong transitive module\n    writeBuildFile(\n      \"json\",\n      additionalContents =\n        \"\"\"\n      transitiveModules.from(files(\"shared2.pkl\"))\n    \"\"\"\n          .trimIndent(),\n    )\n    val result1 = runTask(\"evalTest\")\n    assertThat(result1.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // evalTest should be up-to-date now\n    val result2 = runTask(\"evalTest\")\n    assertThat(result2.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.UP_TO_DATE)\n\n    // update transitive module with new contents\n    writeFile(\"shared2.pkl\", \"foo = 2\")\n\n    // evalTest should be out-of-date and need to run again\n    val result5 = runTask(\"evalTest\")\n    assertThat(result5.task(\":evalTest\")!!.outcome).isEqualTo(TaskOutcome.SUCCESS)\n\n    // the \"GatherImports\" task did not run\n    assertThat(result5.task(\":evalTestGatherImports\")).isNull()\n  }\n\n  private fun writeBuildFile(\n    // don't use `org.pkl.core.OutputFormat`\n    // because test compile class path doesn't contain pkl-core\n    outputFormat: String,\n    additionalContents: String = \"\",\n    sourceModules: List<String> = listOf(\"test.pkl\"),\n    additionalBuildScript: String = \"\",\n  ) {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTest {\n            sourceModules = [${sourceModules.joinToString(separator = \", \") { \"\\\"$it\\\"\" }}]\n            outputFormat = \"$outputFormat\"\n            settingsModule = \"pkl:settings\"\n            $additionalContents\n          }\n        }\n      }\n      \n      $additionalBuildScript\n    \"\"\",\n    )\n  }\n\n  private fun writePklFile(\n    contents: String =\n      \"\"\"\n    person {\n      name = \"Pigeon\"\n      age = 20 + 10\n    }\n  \"\"\"\n  ) {\n    writeFile(\"test.pkl\", contents)\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/JavaCodeGeneratorsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport kotlin.io.path.listDirectoryEntries\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass JavaCodeGeneratorsTest : AbstractTest() {\n  @Test\n  fun `generate code`() {\n    writeBuildFile()\n    writePklFile()\n\n    runTask(\"configClasses\")\n\n    val baseDir = testProjectDir.resolve(\"build/generated/java/foo/bar\")\n    val moduleFile = baseDir.resolve(\"Mod.java\")\n\n    assertThat(baseDir.listDirectoryEntries().size).isEqualTo(1)\n    assertThat(moduleFile).exists()\n\n    val text = moduleFile.readText()\n\n    // shading must not affect generated code\n    assertThat(text).doesNotContain(\"org.pkl.thirdparty\")\n\n    checkTextContains(\n      text,\n      \"\"\"\n      |public final class Mod {\n      |  public final @Nonnull Object other;\n    \"\"\",\n    )\n\n    checkTextContains(\n      text,\n      \"\"\"\n      |  public static final class Person {\n      |    public final @Nonnull String name;\n      |\n      |    public final @Nonnull List<Address> addresses;\n    \"\"\",\n    )\n\n    checkTextContains(\n      text,\n      \"\"\"\n      |  public static final class Address {\n      |    public final @Nonnull String street;\n      |\n      |    public final long zip;\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `compile generated code`() {\n    writeBuildFile()\n    writePklFile()\n\n    runTask(\"compileJava\")\n\n    val classesDir = testProjectDir.resolve(\"build/classes/java/main\")\n    val moduleClassFile = classesDir.resolve(\"foo/bar/Mod.class\")\n    val personClassFile = classesDir.resolve(\"foo/bar/Mod\\$Person.class\")\n    val addressClassFile = classesDir.resolve(\"foo/bar/Mod\\$Address.class\")\n    assertThat(moduleClassFile).exists()\n    assertThat(personClassFile).exists()\n    assertThat(addressClassFile).exists()\n  }\n\n  @Test\n  fun `no source modules`() {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTest {\n            outputFormat = \"pcf\"\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    val result = runTask(\"evalTest\", true)\n    assertThat(result.output).contains(\"No source modules specified.\")\n  }\n\n  private fun writeBuildFile() {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"java\"\n        id \"org.pkl-lang\"\n      }\n\n      repositories {\n        mavenCentral()\n      }\n\n      dependencies {\n        implementation \"javax.inject:javax.inject:1\"\n        implementation \"com.google.code.findbugs:jsr305:3.0.2\"\n      }\n\n      pkl {\n        javaCodeGenerators {\n          configClasses {\n            sourceModules = [\"mod.pkl\"]\n            outputDir = file(\"build/generated\")\n            paramsAnnotation = \"javax.inject.Named\"\n            nonNullAnnotation = \"javax.annotation.Nonnull\"\n            settingsModule = \"pkl:settings\"\n            renames = [\n              'org': 'foo.bar'\n            ]\n          }\n        }\n      }\n    \"\"\",\n    )\n  }\n\n  private fun writePklFile() {\n    writeFile(\n      \"mod.pkl\",\n      \"\"\"\n        module org.mod\n  \n        class Person {\n          name: String\n          addresses: List<Address?>\n        }\n  \n        class Address {\n          street: String\n          zip: Int\n        }\n  \n        other = 42\n      \"\"\",\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/KotlinCodeGeneratorsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport kotlin.io.path.listDirectoryEntries\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass KotlinCodeGeneratorsTest : AbstractTest() {\n  @Test\n  fun `generate code`() {\n    writeBuildFile()\n    writePklFile()\n\n    runTask(\"configClasses\")\n\n    val baseDir = testProjectDir.resolve(\"build/generated/kotlin/foo/bar\")\n    val kotlinFile = baseDir.resolve(\"Mod.kt\")\n\n    assertThat(baseDir.listDirectoryEntries().size).isEqualTo(1)\n    assertThat(kotlinFile).exists()\n\n    val text = kotlinFile.readText()\n\n    // shading must not affect generated code\n    assertThat(text).doesNotContain(\"org.pkl.thirdparty\")\n\n    checkTextContains(\n      text,\n      \"\"\"\n      |data class Mod(\n      |  val other: Any?\n      |)\n    \"\"\",\n    )\n\n    checkTextContains(\n      text,\n      \"\"\"\n      |  data class Person(\n      |    val name: String,\n      |    val addresses: List<Address>\n      |  )\n    \"\"\",\n    )\n\n    checkTextContains(\n      text,\n      \"\"\"\n      |  open class Address(\n      |    open val street: String,\n      |    open val zip: Long\n      |  )\n    \"\"\",\n    )\n  }\n\n  @Test\n  fun `compile generated code`() {\n    writeBuildFile()\n    writePklFile()\n    runTask(\"compileKotlin\")\n\n    val classesDir = testProjectDir.resolve(\"build/classes/kotlin/main\")\n    val moduleClassFile = classesDir.resolve(\"foo/bar/Mod.class\")\n    val personClassFile = classesDir.resolve(\"foo/bar/Mod\\$Person.class\")\n    val addressClassFile = classesDir.resolve(\"foo/bar/Mod\\$Address.class\")\n    assertThat(moduleClassFile).exists()\n    assertThat(personClassFile).exists()\n    assertThat(addressClassFile).exists()\n  }\n\n  @Test\n  fun `no source modules`() {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        evaluators {\n          evalTest {\n            outputFormat = \"pcf\"\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    val result = runTask(\"evalTest\", true)\n    assertThat(result.output).contains(\"No source modules specified.\")\n  }\n\n  private fun writeBuildFile() {\n    val kotlinVersion = \"2.0.21\"\n\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      buildscript {\n        repositories {\n          mavenCentral()\n        }\n\n        dependencies {\n          classpath(\"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion\") {\n            exclude module: \"kotlin-android-extensions\"\n          }\n        }\n      }\n\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      apply plugin: \"kotlin\"\n\n      repositories {\n        mavenCentral()\n      }\n\n      dependencies {\n        implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion\"\n      }\n\n      pkl {\n        kotlinCodeGenerators {\n          configClasses {\n            sourceModules = [\"mod.pkl\"]\n            outputDir = file(\"build/generated\")\n            settingsModule = \"pkl:settings\"\n            renames = [\n              'org.': 'foo.bar.'\n            ]\n          }\n        }\n      }\n    \"\"\",\n    )\n  }\n\n  private fun writePklFile() {\n    writeFile(\n      \"mod.pkl\",\n      \"\"\"\n      module org.mod\n\n      class Person {\n        name: String\n        addresses: List<Address>\n      }\n\n      // \"open\" to test generating regular class\n      open class Address {\n        street: String\n        zip: Int\n      }\n\n      other = 42\n    \"\"\",\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/PkldocGeneratorsTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport java.nio.file.Path\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.pkl.commons.test.PackageServer\n\nclass PkldocGeneratorsTest : AbstractTest() {\n  @Test\n  fun `generate docs`(@TempDir tempDir: Path) {\n    PackageServer.populateCacheDir(tempDir)\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        pkldocGenerators {\n          pkldoc {\n            moduleCacheDir = file(\"${tempDir.toUri()}\")\n            sourceModules = [\"package://localhost:0/birds@0.5.0\", \"person.pkl\", \"doc-package-info.pkl\"]\n            outputDir = file(\"build/pkldoc\")\n            settingsModule = \"pkl:settings\"\n          }\n        }\n      }\n    \"\"\",\n    )\n    writeFile(\n      \"doc-package-info.pkl\",\n      \"\"\"\n      /// A test package.\n      amends \"pkl:DocPackageInfo\"\n      name = \"test\"\n      version = \"1.0.0\"\n      importUri = \"https://pkl-lang.org/\"\n      authors { \"publisher@apple.com\" }\n      sourceCode = \"sources.apple.com/\"\n      issueTracker = \"issues.apple.com\"\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"person.pkl\",\n      \"\"\"\n      module test.person\n\n      class Person {\n        name: String\n        addresses: List<Address>\n      }\n\n      class Address {\n        street: String\n        zip: Int\n      }\n\n      other = 42\n    \"\"\"\n        .trimIndent(),\n    )\n\n    runTask(\"pkldoc\")\n\n    val baseDir = testProjectDir.resolve(\"build/pkldoc\")\n    val mainFile = baseDir.resolve(\"index.html\")\n    val packageFile = baseDir.resolve(\"test/1.0.0/index.html\")\n    val moduleFile = baseDir.resolve(\"test/1.0.0/person/index.html\")\n    val personFile = baseDir.resolve(\"test/1.0.0/person/Person.html\")\n    val addressFile = baseDir.resolve(\"test/1.0.0/person/Address.html\")\n\n    assertThat(mainFile).exists()\n    assertThat(packageFile).exists()\n    assertThat(moduleFile).exists()\n    assertThat(personFile).exists()\n    assertThat(addressFile).exists()\n\n    checkTextContains(mainFile.readText(), \"<html lang=\\\"en-US\\\">\", \"test\")\n    checkTextContains(packageFile.readText(), \"<html lang=\\\"en-US\\\">\", \"test.person\")\n    checkTextContains(moduleFile.readText(), \"<html lang=\\\"en-US\\\">\", \"Person\", \"Address\", \"other\")\n    checkTextContains(personFile.readText(), \"<html lang=\\\"en-US\\\">\", \"name\", \"addresses\")\n    checkTextContains(addressFile.readText(), \"<html lang=\\\"en-US\\\">\", \"street\", \"zip\")\n\n    val birdsPackageFile = baseDir.resolve(\"localhost(3a)0/birds/0.5.0/index.html\")\n    assertThat(birdsPackageFile).exists()\n  }\n\n  @Test\n  fun `generate docs only for package`(@TempDir tempDir: Path) {\n    PackageServer.populateCacheDir(tempDir)\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        pkldocGenerators {\n          pkldoc {\n            moduleCacheDir = file(\"${tempDir.toUri()}\")\n            sourceModules = [\"package://localhost:0/birds@0.5.0\"]\n            outputDir = file(\"build/pkldoc\")\n            settingsModule = \"pkl:settings\"\n          }\n        }\n      }\n    \"\"\",\n    )\n\n    runTask(\"pkldoc\")\n\n    val baseDir = testProjectDir.resolve(\"build/pkldoc\")\n    val birdsPackageFile = baseDir.resolve(\"localhost(3a)0/birds/0.5.0/index.html\")\n    assertThat(birdsPackageFile).exists()\n  }\n\n  @Test\n  fun `no source modules`() {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        pkldocGenerators {\n          pkldoc {\n          }\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n\n    val result = runTask(\"pkldoc\", true)\n    assertThat(result.output).contains(\"No source modules specified.\")\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/ProjectPackageTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass ProjectPackageTest : AbstractTest() {\n  @Test\n  fun basic() {\n    writeBuildFile(\"skipPublishCheck.set(true)\")\n    writeProjectContent()\n    runTask(\"createMyPackages\")\n    assertThat(testProjectDir.resolve(\"build/generated/pkl/packages/proj1@1.0.0.zip\")).exists()\n    assertThat(testProjectDir.resolve(\"build/generated/pkl/packages/proj1@1.0.0\")).exists()\n  }\n\n  @Test\n  fun `custom output dir`() {\n    writeBuildFile(\n      \"\"\"\n      outputPath.set(file(\"thepackages\"))\n      skipPublishCheck.set(true)\n    \"\"\"\n    )\n    writeProjectContent()\n    runTask(\"createMyPackages\")\n    assertThat(testProjectDir.resolve(\"thepackages/proj1@1.0.0.zip\")).exists()\n    assertThat(testProjectDir.resolve(\"thepackages/proj1@1.0.0\")).exists()\n  }\n\n  @Test\n  fun `junit dir`() {\n    writeBuildFile(\n      \"\"\"\n      junitReportsDir.set(file(\"test-reports\"))\n      skipPublishCheck.set(true)\n    \"\"\"\n        .trimIndent()\n    )\n    writeProjectContent()\n    runTask(\"createMyPackages\")\n    assertThat(testProjectDir.resolve(\"test-reports\")).isNotEmptyDirectory()\n  }\n\n  private fun writeBuildFile(additionalContents: String = \"\") {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        project {\n          packagers {\n            createMyPackages {\n              projectDirectories.from(file(\"proj1\"))\n              settingsModule = \"pkl:settings\"\n              $additionalContents\n            }\n          }\n        }\n      }\n    \"\"\",\n    )\n  }\n\n  private fun writeProjectContent() {\n    writeFile(\n      \"proj1/PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n      \n      package {\n        name = \"proj1\"\n        baseUri = \"package://localhost:0/proj1\"\n        version = \"1.0.0\"\n        packageZipUrl = \"https://localhost:0/proj1@\\(version).zip\"\n        apiTests {\n          \"tests.pkl\"\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"proj1/PklProject.deps.json\",\n      \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"dependencies\": {}\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"proj1/foo.pkl\",\n      \"\"\"\n      module proj1.foo\n      \n      bar: String\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\n      \"proj1/tests.pkl\",\n      \"\"\"\n      amends \"pkl:test\"\n      \n      facts {\n        [\"it works\"] {\n          1 == 1\n        }\n      }\n    \"\"\"\n        .trimIndent(),\n    )\n    writeFile(\"foo.txt\", \"The contents of foo.txt\")\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/ProjectResolveTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass ProjectResolveTest : AbstractTest() {\n  @Test\n  fun basic() {\n    writeBuildFile()\n    writeProjectContent()\n    runTask(\"resolveMyProj\")\n    assertThat(testProjectDir.resolve(\"proj1/PklProject.deps.json\"))\n      .hasContent(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {}\n      }\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  private fun writeBuildFile(additionalContents: String = \"\") {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        project {\n          resolvers {\n            resolveMyProj {\n              projectDirectories.from(file(\"proj1\"))\n              settingsModule = \"pkl:settings\"\n              $additionalContents\n            }\n          }\n        }\n      }\n    \"\"\",\n    )\n  }\n\n  private fun writeProjectContent() {\n    writeFile(\n      \"proj1/PklProject\",\n      \"\"\"\n      amends \"pkl:Project\"\n    \"\"\"\n        .trimIndent(),\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-gradle/src/test/kotlin/org/pkl/gradle/TestsTest.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.gradle\n\nimport java.nio.file.Path\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.pkl.commons.toNormalizedPathString\n\nclass TestsTest : AbstractTest() {\n\n  @Test\n  fun `facts pass`() {\n    writeBuildFile()\n\n    writePklFile()\n\n    val res = runTask(\"evalTest\")\n    assertThat(res.output).contains(\"✔ should pass\")\n  }\n\n  @Test\n  fun `facts fail`() {\n    writeBuildFile()\n\n    writePklFile(\n      additionalFacts =\n        \"\"\"\n      [\"should fail\"] {\n        1 == 3\n        \"foo\" == \"bar\"\n      }\n    \"\"\"\n          .trimIndent()\n    )\n\n    val res = runTask(\"evalTest\", expectFailure = true)\n    assertThat(res.output).contains(\"✘ should fail\")\n    assertThat(res.output).contains(\"1 == 3\")\n    assertThat(res.output).contains(\"\"\"\"foo\" == \"bar\"\"\"\")\n  }\n\n  @Test\n  fun error() {\n    writeBuildFile()\n\n    writePklFile(\n      additionalFacts =\n        \"\"\"\n      [\"error\"] {\n        throw(\"exception\")\n      }\n    \"\"\"\n          .trimIndent()\n    )\n\n    val output =\n      runTask(\"evalTest\", expectFailure = true)\n        .output\n        .stripFilesAndLines()\n        .lineSequence()\n        .joinToString(\"\\n\")\n\n    assertThat(output)\n      .containsIgnoringNewLines(\n        \"\"\"\n      > Task :evalTest FAILED\n      module test\n        facts\n          ✔ should pass\n          ✘ error\n             –– Pkl Error ––\n             exception\n\n             9 | throw(\"exception\")\n                 ^^^^^^^^^^^^^^^^^^\n             at test#facts[\"error\"][#1] (file:///file, line x)\n\n      50.0% tests pass [1/2 failed], 66.6% asserts pass [1/3 failed]\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `full example`() {\n    writePklFile(contents = bigTest)\n    writeFile(\"test.pkl-expected.pcf\", bigTestExpected)\n\n    writeBuildFile()\n\n    val output =\n      runTask(\"evalTest\", expectFailure = true)\n        .output\n        .stripFilesAndLines()\n        .lineSequence()\n        .joinToString(\"\\n\")\n\n    assertThat(output.trimStart())\n      .startsWith(\n        \"\"\"\n        > Task :evalTestGatherImports\n\n        > Task :evalTest FAILED\n        pkl: TRACE: 8 = 8 (file:///file, line x)\n        module test\n          facts\n            ✔ sum numbers\n            ✔ divide numbers\n            ✘ fail\n               4 == 9 (file:///file, line x)\n                 │\n                 false\n               \"foo\" == \"bar\" (file:///file, line x)\n                     │\n                     false\n          examples\n            ✔ user 0\n            ✘ user 1\n               #1: (file:///file, line x)\n                 Expected: (file:///file, line x)\n                 new {\n                   name = \"Parrot\"\n                   age = 35\n                 }\n                 Actual: (file:///file, line x)\n                 new {\n                   name = \"Welma\"\n                   age = 35\n                 }\n\n        60.0% tests pass [2/5 failed], 66.6% asserts pass [3/9 failed]\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `overwrite expected examples`() {\n    writePklFile(additionalExamples = examples)\n    writeFile(\"test.pkl-expected.pcf\", bigTestExpected)\n\n    writeBuildFile(\"overwrite = true\")\n\n    val output = runTask(\"evalTest\", expectFailure = true).output\n\n    assertThat(output).contains(\"✍️ user 0\")\n    assertThat(output).contains(\"✍️ user 1\")\n  }\n\n  @Test\n  fun `full example with error`() {\n    writeBuildFile()\n\n    writePklFile(\n      additionalFacts =\n        \"\"\"\n      [\"error\"] {\n        throw(\"exception\")\n      }\n    \"\"\"\n          .trimIndent(),\n      additionalExamples = examples,\n    )\n    writeFile(\"test.pkl-expected.pcf\", bigTestExpected)\n\n    val output =\n      runTask(\"evalTest\", expectFailure = true)\n        .output\n        .stripFilesAndLines()\n        .lineSequence()\n        .joinToString(\"\\n\")\n\n    assertThat(output.trimStart())\n      .startsWith(\n        \"\"\"\n        > Task :evalTestGatherImports\n        \n        > Task :evalTest FAILED\n        module test\n          facts\n            ✔ should pass\n            ✘ error\n               –– Pkl Error ––\n               exception\n        \n               9 | throw(\"exception\")\n                   ^^^^^^^^^^^^^^^^^^\n               at test#facts[\"error\"][#1] (file:///file, line x)\n          examples\n            ✔ user 0\n            ✘ user 1\n               #1: (file:///file, line x)\n                 Expected: (file:///file, line x)\n                 new {\n                   name = \"Parrot\"\n                   age = 35\n                 }\n                 Actual: (file:///file, line x)\n                 new {\n                   name = \"Welma\"\n                   age = 35\n                 }\n\n        50.0% tests pass [2/4 failed], 66.6% asserts pass [2/6 failed]\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `JUnit reports`() {\n    val pklFile = writePklFile(contents = bigTest)\n    writeFile(\"test.pkl-expected.pcf\", bigTestExpected)\n\n    writeBuildFile(\"junitReportsDir = file('${pklFile.parent.toNormalizedPathString()}/build')\")\n\n    runTask(\"evalTest\", expectFailure = true)\n\n    val outputFile = testProjectDir.resolve(\"build/test.xml\")\n    val report = outputFile.readText().stripFilesAndLines()\n\n    assertThat(report)\n      .isEqualTo(\n        // language=xml\n        \"\"\"\n        <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n        <testsuite name=\"test\" tests=\"5\" failures=\"2\">\n            <testcase classname=\"test.facts\" name=\"sum numbers\"></testcase>\n            <testcase classname=\"test.facts\" name=\"divide numbers\"></testcase>\n            <testcase classname=\"test.facts\" name=\"fail\">\n                <failure message=\"Fact Failure\">4 == 9 (file:///file, line x)\n          │\n          false</failure>\n                <failure message=\"Fact Failure\">&quot;foo&quot; == &quot;bar&quot; (file:///file, line x)\n              │\n              false</failure>\n            </testcase>\n            <testcase classname=\"test.examples\" name=\"user 0\"></testcase>\n            <testcase classname=\"test.examples\" name=\"user 1\">\n                <failure message=\"Example Failure\">#1: (file:///file, line x)\n          Expected: (file:///file, line x)\n          new {\n            name = &quot;Parrot&quot;\n            age = 35\n          }\n          Actual: (file:///file, line x)\n          new {\n            name = &quot;Welma&quot;\n            age = 35\n          }</failure>\n            </testcase>\n            <system-err><![CDATA[8 = 8\n        ]]></system-err>\n        </testsuite>\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `JUnit reports with error`() {\n    val pklFile =\n      writePklFile(\n        additionalFacts =\n          \"\"\"\n      [\"error\"] {\n        throw(\"exception\")\n      }\n    \"\"\"\n            .trimIndent(),\n        additionalExamples = examples,\n      )\n    writeFile(\"test.pkl-expected.pcf\", bigTestExpected)\n\n    writeBuildFile(\"junitReportsDir = file('${pklFile.parent.toNormalizedPathString()}/build')\")\n\n    runTask(\"evalTest\", expectFailure = true)\n\n    val outputFile = testProjectDir.resolve(\"build/test.xml\")\n    val report = outputFile.readText().stripFilesAndLines()\n\n    assertThat(report)\n      .isEqualTo(\n        \"\"\"\n        <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n        <testsuite name=\"test\" tests=\"4\" failures=\"2\">\n            <testcase classname=\"test.facts\" name=\"should pass\"></testcase>\n            <testcase classname=\"test.facts\" name=\"error\">\n                <error message=\"exception\">–– Pkl Error ––\n        exception\n        \n        9 | throw(&quot;exception&quot;)\n            ^^^^^^^^^^^^^^^^^^\n        at test#facts[&quot;error&quot;][#1] (file:///file, line x)\n        </error>\n            </testcase>\n            <testcase classname=\"test.examples\" name=\"user 0\"></testcase>\n            <testcase classname=\"test.examples\" name=\"user 1\">\n                <failure message=\"Example Failure\">#1: (file:///file, line x)\n          Expected: (file:///file, line x)\n          new {\n            name = &quot;Parrot&quot;\n            age = 35\n          }\n          Actual: (file:///file, line x)\n          new {\n            name = &quot;Welma&quot;\n            age = 35\n          }</failure>\n            </testcase>\n        </testsuite>\n\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  private val examples =\n    \"\"\"\n      [\"user 0\"] {\n        new {\n          name = \"Cool\"\n          age = 11\n        }\n      }\n      [\"user 1\"] {\n        new {\n          name = \"Pigeon\"\n          age = 40\n        }\n        new {\n          name = \"Welma\"\n          age = 35\n        }\n      }\n  \"\"\"\n      .trimIndent()\n\n  private val bigTest =\n    \"\"\"\n    amends \"pkl:test\"\n\n    local function sum(a, b) = a + b\n    \n    facts {\n      [\"sum numbers\"] {\n        sum(3, 5) == trace(8)\n        sum(3, 0) == 3\n      }\n      [\"divide numbers\"] {\n        (8 / 4) == 2\n        (12 / 2) == 6\n      }\n      [\"fail\"] {\n        4 == 9\n        \"foo\" == \"bar\"\n      }\n    }\n    \n    examples {\n      $examples\n    }\n  \"\"\"\n      .trimIndent()\n\n  private val bigTestExpected =\n    \"\"\"\n    examples {\n      [\"user 0\"] {\n        new {\n          name = \"Cool\"\n          age = 11\n        }\n      }\n      [\"user 1\"] {\n        new {\n          name = \"Pigeon\"\n          age = 40\n        }\n        new {\n          name = \"Parrot\"\n          age = 35\n        }\n      }\n    }\n  \"\"\"\n      .trimIndent()\n\n  private fun writeBuildFile(additionalContents: String = \"\") {\n    writeFile(\n      \"build.gradle\",\n      \"\"\"\n      plugins {\n        id \"org.pkl-lang\"\n      }\n\n      pkl {\n        tests {\n          evalTest {\n            sourceModules = [\"test.pkl\"]\n            settingsModule = \"pkl:settings\"\n            $additionalContents\n          }\n        }\n      }\n    \"\"\",\n    )\n  }\n\n  private fun writePklFile(\n    additionalFacts: String = \"\",\n    additionalExamples: String = \"\",\n    contents: String =\n      \"\"\"\n    amends \"pkl:test\"\n    \n    facts {\n      [\"should pass\"] {\n        1 == 1\n        10 == 10\n      }\n      $additionalFacts\n    }\n    \n    examples {\n      $additionalExamples\n    }\n    \"\"\",\n  ): Path {\n    return writeFile(\"test.pkl\", contents)\n  }\n\n  private fun String.stripFilesAndLines(): String =\n    replace(Regex(\"\"\"\\(file:///.*, line \\d+\\)\"\"\"), \"(file:///file, line x)\")\n}\n"
  },
  {
    "path": "pkl-internal-intellij-plugin/README.adoc",
    "content": "Internal IntelliJ plugin for developing the Pkl codebase.\n\nThis plugin is intentionally not published anywhere.\nFor usage, see the docs in link:../DEVELOPMENT.adoc[DEVELOPMENT.adoc].\n"
  },
  {
    "path": "pkl-internal-intellij-plugin/pkl-internal-intellij-plugin.gradle.kts",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  kotlin(\"jvm\")\n  alias(libs.plugins.intellij)\n}\n\nrepositories {\n  mavenCentral()\n  intellijPlatform { defaultRepositories() }\n}\n\ndependencies {\n  intellijPlatform {\n    create(\"IC\", libs.versions.intellij.get())\n    bundledPlugin(\"com.intellij.java\")\n    bundledPlugin(\"org.jetbrains.plugins.gradle\")\n    bundledPlugin(\"JUnit\")\n  }\n}\n\nspotless {\n  kotlin {\n    ktfmt(libs.versions.ktfmt.get()).googleStyle()\n    target(\"src/*/kotlin/**/*.kt\")\n    licenseHeaderFile(rootProject.file(\"buildSrc/src/main/resources/license-header.star-block.txt\"))\n  }\n}\n"
  },
  {
    "path": "pkl-internal-intellij-plugin/src/main/kotlin/org/pkl/internal/intellij/SnippetTestEditorProvider.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.internal.intellij\n\nimport com.intellij.openapi.fileEditor.*\nimport com.intellij.openapi.fileEditor.impl.text.TextEditorProvider\nimport com.intellij.openapi.project.DumbAware\nimport com.intellij.openapi.project.Project\nimport com.intellij.openapi.vfs.VirtualFile\n\nclass SnippetTestEditorProvider : FileEditorProvider, DumbAware {\n  override fun accept(project: Project, file: VirtualFile): Boolean = file.isSnippetTestInputFile()\n\n  override fun createEditor(project: Project, file: VirtualFile): FileEditor {\n    val textEditorProvider = TextEditorProvider.getInstance()\n    val outputFile = findOutputFile(file)\n\n    val inputEditor = textEditorProvider.createEditor(project, file) as TextEditor\n    val outputEditor =\n      outputFile?.let { textEditorProvider.createEditor(project, it) as TextEditor }\n\n    return SnippetTestSplitEditor(inputEditor, outputEditor)\n  }\n\n  override fun getEditorTypeId(): String = \"snippet-test-split-editor\"\n\n  override fun getPolicy(): FileEditorPolicy = FileEditorPolicy.HIDE_DEFAULT_EDITOR\n}\n"
  },
  {
    "path": "pkl-internal-intellij-plugin/src/main/kotlin/org/pkl/internal/intellij/SnippetTestSplitEditor.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.internal.intellij\n\nimport com.intellij.execution.ExecutionListener\nimport com.intellij.execution.ExecutionManager\nimport com.intellij.execution.Executor\nimport com.intellij.execution.ProgramRunnerUtil\nimport com.intellij.execution.RunManager\nimport com.intellij.execution.executors.DefaultDebugExecutor\nimport com.intellij.execution.executors.DefaultRunExecutor\nimport com.intellij.execution.junit.JUnitConfiguration\nimport com.intellij.execution.junit.JUnitConfigurationType\nimport com.intellij.execution.process.ProcessHandler\nimport com.intellij.execution.runners.ExecutionEnvironment\nimport com.intellij.icons.AllIcons\nimport com.intellij.openapi.actionSystem.*\nimport com.intellij.openapi.application.ApplicationManager\nimport com.intellij.openapi.fileEditor.FileEditor\nimport com.intellij.openapi.fileEditor.FileEditorLocation\nimport com.intellij.openapi.fileEditor.FileEditorState\nimport com.intellij.openapi.fileEditor.FileEditorStateLevel\nimport com.intellij.openapi.fileEditor.TextEditor\nimport com.intellij.openapi.fileEditor.impl.text.TextEditorProvider\nimport com.intellij.openapi.module.ModuleUtil\nimport com.intellij.openapi.project.Project\nimport com.intellij.openapi.util.UserDataHolderBase\nimport com.intellij.openapi.vfs.VirtualFile\nimport com.intellij.openapi.vfs.VirtualFileManager\nimport com.intellij.psi.JavaPsiFacade\nimport com.intellij.psi.PsiClass\nimport com.intellij.psi.search.GlobalSearchScope\nimport com.intellij.ui.components.JBPanel\nimport java.awt.BorderLayout\nimport java.beans.PropertyChangeListener\nimport javax.swing.JComponent\nimport javax.swing.JSplitPane\n\nclass SnippetTestSplitEditor(\n  private val inputEditor: TextEditor,\n  private var outputEditor: TextEditor?,\n) : UserDataHolderBase(), FileEditor {\n\n  private var currentViewMode = if (outputEditor != null) ViewMode.SPLIT else ViewMode.INPUT_ONLY\n\n  private val splitPane: JSplitPane =\n    JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inputEditor.component, outputEditor?.component).apply {\n      resizeWeight = 0.5\n    }\n\n  private val mainPanel =\n    JBPanel<JBPanel<*>>(BorderLayout()).apply {\n      add(createToolbar(), BorderLayout.NORTH)\n      when (currentViewMode) {\n        ViewMode.INPUT_ONLY -> add(inputEditor.component, BorderLayout.CENTER)\n        ViewMode.SPLIT -> add(splitPane, BorderLayout.CENTER)\n      }\n    }\n\n  private fun createToolbar(): JComponent {\n    val actionGroup =\n      DefaultActionGroup().apply {\n        add(RunTestAction())\n        add(DebugTestAction())\n        add(RunAllTestsAction())\n        add(OverwriteSnippetAction())\n        addSeparator()\n        add(ShowInputOnlyAction())\n        add(ShowSplitAction())\n      }\n\n    val toolbar =\n      ActionManager.getInstance().createActionToolbar(\"SnippetTestEditor\", actionGroup, true)\n    toolbar.targetComponent = mainPanel\n    return toolbar.component\n  }\n\n  private fun setViewMode(mode: ViewMode) {\n    if (currentViewMode == mode || outputEditor == null) return\n    currentViewMode = mode\n\n    // Remove the current center component\n    val layout = mainPanel.layout as BorderLayout\n    layout.getLayoutComponent(BorderLayout.CENTER)?.let { mainPanel.remove(it) }\n\n    when (mode) {\n      ViewMode.INPUT_ONLY -> {\n        mainPanel.add(inputEditor.component, BorderLayout.CENTER)\n      }\n      ViewMode.SPLIT -> {\n        // Re-add components to splitPane in case they were removed\n        splitPane.leftComponent = inputEditor.component\n        splitPane.rightComponent = outputEditor!!.component\n        mainPanel.add(splitPane, BorderLayout.CENTER)\n      }\n    }\n\n    mainPanel.revalidate()\n    mainPanel.repaint()\n  }\n\n  override fun getComponent(): JComponent = mainPanel\n\n  override fun getPreferredFocusedComponent(): JComponent? = inputEditor.preferredFocusedComponent\n\n  override fun getName(): String = \"Snippet Test\"\n\n  override fun getFile(): VirtualFile? = inputEditor.file\n\n  override fun setState(state: FileEditorState) {\n    if (state is SnippetTestSplitEditorState) {\n      inputEditor.setState(state.inputState)\n      if (outputEditor != null && state.outputState != null) {\n        outputEditor!!.setState(state.outputState)\n      }\n    }\n  }\n\n  override fun getState(level: FileEditorStateLevel): FileEditorState {\n    return SnippetTestSplitEditorState(inputEditor.getState(level), outputEditor?.getState(level))\n  }\n\n  override fun isModified(): Boolean = inputEditor.isModified || outputEditor?.isModified ?: false\n\n  override fun isValid(): Boolean = inputEditor.isValid && outputEditor?.isValid ?: true\n\n  override fun addPropertyChangeListener(listener: PropertyChangeListener) {\n    inputEditor.addPropertyChangeListener(listener)\n    outputEditor?.addPropertyChangeListener(listener)\n  }\n\n  override fun removePropertyChangeListener(listener: PropertyChangeListener) {\n    inputEditor.removePropertyChangeListener(listener)\n    outputEditor?.removePropertyChangeListener(listener)\n  }\n\n  override fun getCurrentLocation(): FileEditorLocation? = inputEditor.currentLocation\n\n  override fun dispose() {\n    inputEditor.dispose()\n    outputEditor?.dispose()\n  }\n\n  /**\n   * Refreshes the output editor by reloading the output file from disk. This is useful after\n   * running tests, as the output file may have been created or changed (e.g., from .pcf to .err).\n   */\n  private fun refreshOutputEditor(project: Project) {\n    val inputFile = inputEditor.file ?: return\n\n    // Refresh the input file's parent to pick up any new output files\n    ApplicationManager.getApplication().invokeLater {\n      VirtualFileManager.getInstance().asyncRefresh {\n        val currentOutputFile = findOutputFile(inputFile)\n        val editorOutputFile = outputEditor?.file\n        when {\n          currentOutputFile != null && currentOutputFile != editorOutputFile -> {\n            // No output file exists; set split mode.\n            if (editorOutputFile == null) {\n              replaceOutputEditorAndSetSplitMode(project, currentOutputFile)\n            } else {\n              // The output file has changed (e.g., .pcf to .err or vice versa), or got created.\n              // We need to replace the output editor with a new one for the new file\n              replaceOutputEditor(project, currentOutputFile)\n            }\n          }\n          else -> currentOutputFile?.refresh(true, false)\n        }\n      }\n    }\n  }\n\n  /**\n   * Replaces the current output editor with a new one for the specified file. This is necessary\n   * when the output file type changes (e.g., from .pcf to .err).\n   */\n  private fun replaceOutputEditorAndSetSplitMode(project: Project, newOutputFile: VirtualFile) {\n    ApplicationManager.getApplication().invokeLater {\n      val textEditorProvider = TextEditorProvider.getInstance()\n      val newEditor = textEditorProvider.createEditor(project, newOutputFile) as TextEditor\n\n      // Dispose the old editor\n      outputEditor?.dispose()\n\n      // Update the reference to the new editor\n      outputEditor = newEditor\n      setViewMode(ViewMode.SPLIT)\n    }\n  }\n\n  /**\n   * Replaces the current output editor with a new one for the specified file. This is necessary\n   * when the output file type changes (e.g., from .pcf to .err).\n   */\n  private fun replaceOutputEditor(project: Project, newOutputFile: VirtualFile) {\n    ApplicationManager.getApplication().invokeLater {\n      val textEditorProvider = TextEditorProvider.getInstance()\n      val newEditor = textEditorProvider.createEditor(project, newOutputFile) as TextEditor\n\n      // Dispose the old editor\n      outputEditor?.dispose()\n\n      // Update the reference to the new editor\n      outputEditor = newEditor\n\n      // Update the split pane with the new editor\n      when (currentViewMode) {\n        ViewMode.SPLIT -> {\n          splitPane.rightComponent = newEditor.component\n          splitPane.revalidate()\n          splitPane.repaint()\n        }\n        ViewMode.INPUT_ONLY -> {\n          // Nothing to do, output is not visible\n        }\n      }\n    }\n  }\n\n  private enum class ViewMode {\n    INPUT_ONLY,\n    SPLIT,\n  }\n\n  private inner class ShowInputOnlyAction :\n    ToggleAction(\"Show Input Only\", \"Show only the input file\", AllIcons.General.LayoutEditorOnly) {\n    override fun isSelected(e: AnActionEvent): Boolean = currentViewMode == ViewMode.INPUT_ONLY\n\n    override fun setSelected(e: AnActionEvent, state: Boolean) {\n      if (state) setViewMode(ViewMode.INPUT_ONLY)\n    }\n  }\n\n  private inner class ShowSplitAction :\n    ToggleAction(\n      \"Show Split\",\n      \"Show input and output side by side\",\n      AllIcons.General.LayoutEditorPreview,\n    ) {\n    override fun isSelected(e: AnActionEvent): Boolean = currentViewMode == ViewMode.SPLIT\n\n    override fun setSelected(e: AnActionEvent, state: Boolean) {\n      if (state) setViewMode(ViewMode.SPLIT)\n    }\n  }\n\n  private inner class RunTestAction :\n    AnAction(\"Run Test\", \"Run the snippet test\", AllIcons.Actions.Execute) {\n    override fun actionPerformed(e: AnActionEvent) {\n      val project = e.project ?: return\n      executeTest(project, DefaultRunExecutor.getRunExecutorInstance())\n    }\n  }\n\n  private inner class RunAllTestsAction :\n    AnAction(\"Run All Tests\", \"Run all snippet tests\", AllIcons.Actions.RunAll) {\n    override fun actionPerformed(e: AnActionEvent) {\n      val project = e.project ?: return\n      executeAllTests(project, DefaultRunExecutor.getRunExecutorInstance())\n    }\n  }\n\n  private inner class DebugTestAction :\n    AnAction(\"Debug Test\", \"Debug the snippet test\", AllIcons.Actions.StartDebugger) {\n    override fun actionPerformed(e: AnActionEvent) {\n      val project = e.project ?: return\n      executeTest(project, DefaultDebugExecutor.getDebugExecutorInstance())\n    }\n  }\n\n  private inner class OverwriteSnippetAction :\n    AnAction(\n      \"Overwrite Snippet\",\n      \"Run test and regenerate expected output\",\n      AllIcons.Actions.RerunAutomatically,\n    ) {\n    override fun actionPerformed(e: AnActionEvent) {\n      val project = e.project ?: return\n\n      executeTest(\n        project,\n        DefaultRunExecutor.getRunExecutorInstance(),\n        mapOf(\"OVERWRITE_SNIPPETS\" to \"1\"),\n      )\n    }\n  }\n\n  /**\n   * Builds a JUnit UniqueID selector for the snippet test. E.g.\n   *\n   * ```\n   * [engine:LanguageSnippetTestsEngine]/[inputDirNode:lambdas]/[inputFileNode:lambdaStackTrace2.pkl]\n   * ```\n   */\n  private fun buildUniqueId(file: VirtualFile): String? {\n    val path = file.path\n    // Pattern: .../LanguageSnippetTests/input/lambdas/lambdaStackTrace2.pkl\n    val pattern = Regex(\".*/([^/]+)/src/test/files/(\\\\w+)/input/(.+)$\")\n    val match = pattern.find(path) ?: return null\n\n    val testType = match.groupValues[2] // e.g., \"LanguageSnippetTests\"\n    val relativePath = match.groupValues[3] // e.g., \"lambdas/lambdaStackTrace2.pkl\"\n\n    // Extract directory and filename\n    val parts = relativePath.split(\"/\")\n    val fileName = parts.last()\n    val engineName = testType + \"Engine\"\n    val uniqueId = buildString {\n      append(\"[engine:$engineName]\")\n      if (parts.size > 1) {\n        for (dir in parts.dropLast(1)) {\n          append(\"/[inputDirNode:$dir]\")\n        }\n      }\n      append(\"/[inputFileNode:$fileName]\")\n    }\n\n    return uniqueId\n  }\n\n  private fun getTestClass(project: Project, file: VirtualFile): PsiClass {\n    val path = file.path\n    // Pattern: .../LanguageSnippetTests/input/lambdas/lambdaStackTrace2.pkl\n    val pattern = Regex(\".*/([^/]+)/src/test/files/(\\\\w+)/input/(.+)$\")\n    val match = pattern.find(path)!!\n    val folder = match.groupValues[2]\n    val className =\n      when (folder) {\n        \"LanguageSnippetTests\" -> \"org.pkl.core.LanguageSnippetTests\"\n        \"FormatterSnippetTests\" -> \"org.pkl.formatter.FormatterSnippetTests\"\n        // legacy; doesn't exist on main branch\n        \"SnippetTests\" -> \"org.pkl.server.SnippetTests\"\n        else -> throw IllegalStateException(\"\")\n      }\n    return JavaPsiFacade.getInstance(project)\n      .findClass(className, GlobalSearchScope.allScope(project))!!\n  }\n\n  private fun executeAllTests(project: Project, executor: Executor) {\n    val file = inputEditor.file ?: return\n\n    val path = file.path\n    // Pattern: .../LanguageSnippetTests/input/lambdas/lambdaStackTrace2.pkl\n    val pattern = Regex(\".*/([^/]+)/src/test/files/(\\\\w+)/input/(.+)$\")\n    val match = pattern.find(path) ?: return\n\n    val testType = match.groupValues[2] // e.g., \"LanguageSnippetTests\"\n    executeTest(project, executor, testType) { data ->\n      data.TEST_OBJECT = JUnitConfiguration.TEST_CLASS\n      data.setMainClass(getTestClass(project, file))\n    }\n  }\n\n  private fun executeTest(\n    project: Project,\n    executor: Executor,\n    envVars: Map<String, String> = emptyMap(),\n  ) {\n    val file = inputEditor.file ?: return\n    val uniqueId = buildUniqueId(file) ?: return\n    executeTest(project, executor, file.name) { data ->\n      data.TEST_OBJECT = JUnitConfiguration.TEST_UNIQUE_ID\n      data.setUniqueIds(uniqueId)\n\n      if (envVars.isNotEmpty()) {\n        data.envs = envVars.toMutableMap()\n        data.PASS_PARENT_ENVS = true\n      }\n    }\n  }\n\n  private fun executeTest(\n    project: Project,\n    executor: Executor,\n    title: String,\n    configure: (JUnitConfiguration.Data) -> Unit,\n  ) {\n    val file = inputEditor.file ?: return\n    val module = ModuleUtil.findModuleForFile(file, project) ?: return\n\n    val runManager = RunManager.getInstance(project)\n    val configurationType = JUnitConfigurationType.getInstance()\n    val configurationFactory = configurationType.configurationFactories.first()\n\n    val settings = runManager.createConfiguration(title, configurationFactory)\n\n    val configuration = settings.configuration as? JUnitConfiguration ?: return\n    configure(configuration.persistentData)\n\n    configuration.setModule(module)\n\n    // Add the configuration to the RunManager so it appears in recent configurations\n    runManager.addConfiguration(settings)\n    runManager.selectedConfiguration = settings\n\n    // Add listener to refresh output editor after test completes\n    val messageBus = project.messageBus.connect()\n    messageBus.subscribe(\n      ExecutionManager.EXECUTION_TOPIC,\n      object : ExecutionListener {\n        override fun processTerminated(\n          executorId: String,\n          env: ExecutionEnvironment,\n          handler: ProcessHandler,\n          exitCode: Int,\n        ) {\n          // Check if this is our test run\n          if (env.runProfile == configuration) {\n            // Refresh the output editor after the test completes\n            refreshOutputEditor(project)\n            // Disconnect the listener after use\n            messageBus.disconnect()\n          }\n        }\n      },\n    )\n\n    ProgramRunnerUtil.executeConfiguration(settings, executor)\n  }\n}\n\ndata class SnippetTestSplitEditorState(\n  val inputState: FileEditorState,\n  val outputState: FileEditorState?,\n) : FileEditorState {\n  override fun canBeMergedWith(otherState: FileEditorState, level: FileEditorStateLevel): Boolean {\n    val other = otherState as? SnippetTestSplitEditorState ?: return false\n    if (!inputState.canBeMergedWith(other.inputState, level)) return false\n    val otherState = other.outputState\n    return when {\n      outputState == null && otherState == null -> true\n      outputState != null && otherState != null -> outputState.canBeMergedWith(otherState, level)\n      else -> false\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-internal-intellij-plugin/src/main/kotlin/org/pkl/internal/intellij/util.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.internal.intellij\n\nimport com.intellij.openapi.vfs.VirtualFile\nimport com.intellij.openapi.vfs.VirtualFileManager\n\ninternal fun VirtualFile.isSnippetTestInputFile(): Boolean {\n  return path.contains(\"/src/test/files/\") && path.contains(\"/input/\") && extension == \"pkl\"\n}\n\nprivate val hiddenExtensionRegex = Regex(\".*[.]([^.]*)[.]pkl\")\n\nprivate fun possibleOutputPaths(testType: String, relativePath: String): String? {\n  return when (testType) {\n    \"LanguageSnippetTests\" ->\n      if (relativePath.matches(hiddenExtensionRegex)) relativePath.dropLast(4)\n      else relativePath.dropLast(3) + \"pcf\"\n    \"FormatterSnippetTests\" -> relativePath\n    \"SnippetTests\" -> relativePath.replaceAfterLast('.', \"yaml\")\n    else -> null\n  }\n}\n\ninternal fun findOutputFile(inputFile: VirtualFile): VirtualFile? {\n  val path = inputFile.path\n  val inputPattern = Regex(\".*/src/test/files/(\\\\w+)/input/(.+)$\")\n  val match = inputPattern.find(path) ?: return null\n\n  val testType = match.groupValues[1]\n  val relativePath = match.groupValues[2]\n  val relativeOutputPath = possibleOutputPaths(testType, relativePath) ?: return null\n  val outputPath = path.replace(\"/input/$relativePath\", \"/output/$relativeOutputPath\")\n  val fileManager = VirtualFileManager.getInstance()\n  return fileManager.findFileByUrl(\"file://$outputPath\")\n    ?: fileManager.findFileByUrl(\"file://${outputPath.replaceAfterLast('.', \"err\")}\")\n}\n"
  },
  {
    "path": "pkl-internal-intellij-plugin/src/main/resources/META-INF/plugin.xml",
    "content": "<idea-plugin>\n  <id>org.pkl.intellij.snippet-test-helper</id>\n  <name>Pkl Snippet Test Helper</name>\n  <vendor>Apple Inc. and the Pkl project authors</vendor>\n\n  <description><![CDATA[\n    Automatically opens snippet test output files when input files are opened.\n\n    This is an internal plugin that is meant for development on the Pkl project itself.\n  ]]></description>\n\n  <depends>com.intellij.modules.platform</depends>\n  <depends>com.intellij.java</depends>\n  <depends>org.jetbrains.plugins.gradle</depends>\n\n  <extensions defaultExtensionNs=\"com.intellij\">\n    <fileEditorProvider implementation=\"org.pkl.internal.intellij.SnippetTestEditorProvider\"/>\n  </extensions>\n</idea-plugin>\n"
  },
  {
    "path": "pkl-parser/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.code.findbugs:jsr305:3.0.2=compileClasspath,compileOnlyDependenciesMetadata\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\nempty=annotationProcessor,apiDependenciesMetadata,implementationDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,runtimeClasspath,signatures,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-parser/pkl-parser.gradle.kts",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklJavaLibrary\n  pklPublishLibrary\n  idea\n}\n\ndependencies {\n  compileOnly(libs.jsr305)\n\n  testImplementation(projects.pklCommonsTest)\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"library\") {\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-parser\")\n        description.set(\"The parser for the Pkl language.\")\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/BaseParserVisitor.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport org.pkl.parser.syntax.Annotation;\nimport org.pkl.parser.syntax.ArgumentList;\nimport org.pkl.parser.syntax.Class;\nimport org.pkl.parser.syntax.ClassBody;\nimport org.pkl.parser.syntax.ClassMethod;\nimport org.pkl.parser.syntax.ClassProperty;\nimport org.pkl.parser.syntax.DocComment;\nimport org.pkl.parser.syntax.Expr.AmendsExpr;\nimport org.pkl.parser.syntax.Expr.BinaryOperatorExpr;\nimport org.pkl.parser.syntax.Expr.BoolLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FloatLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FunctionLiteralExpr;\nimport org.pkl.parser.syntax.Expr.IfExpr;\nimport org.pkl.parser.syntax.Expr.ImportExpr;\nimport org.pkl.parser.syntax.Expr.IntLiteralExpr;\nimport org.pkl.parser.syntax.Expr.LetExpr;\nimport org.pkl.parser.syntax.Expr.LogicalNotExpr;\nimport org.pkl.parser.syntax.Expr.ModuleExpr;\nimport org.pkl.parser.syntax.Expr.MultiLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.NewExpr;\nimport org.pkl.parser.syntax.Expr.NonNullExpr;\nimport org.pkl.parser.syntax.Expr.NullLiteralExpr;\nimport org.pkl.parser.syntax.Expr.OuterExpr;\nimport org.pkl.parser.syntax.Expr.ParenthesizedExpr;\nimport org.pkl.parser.syntax.Expr.QualifiedAccessExpr;\nimport org.pkl.parser.syntax.Expr.ReadExpr;\nimport org.pkl.parser.syntax.Expr.SingleLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.SubscriptExpr;\nimport org.pkl.parser.syntax.Expr.SuperAccessExpr;\nimport org.pkl.parser.syntax.Expr.SuperSubscriptExpr;\nimport org.pkl.parser.syntax.Expr.ThisExpr;\nimport org.pkl.parser.syntax.Expr.ThrowExpr;\nimport org.pkl.parser.syntax.Expr.TraceExpr;\nimport org.pkl.parser.syntax.Expr.TypeCastExpr;\nimport org.pkl.parser.syntax.Expr.TypeCheckExpr;\nimport org.pkl.parser.syntax.Expr.UnaryMinusExpr;\nimport org.pkl.parser.syntax.Expr.UnqualifiedAccessExpr;\nimport org.pkl.parser.syntax.ExtendsOrAmendsClause;\nimport org.pkl.parser.syntax.Identifier;\nimport org.pkl.parser.syntax.ImportClause;\nimport org.pkl.parser.syntax.Keyword;\nimport org.pkl.parser.syntax.Modifier;\nimport org.pkl.parser.syntax.ModuleDecl;\nimport org.pkl.parser.syntax.Node;\nimport org.pkl.parser.syntax.ObjectBody;\nimport org.pkl.parser.syntax.ObjectMember.ForGenerator;\nimport org.pkl.parser.syntax.ObjectMember.MemberPredicate;\nimport org.pkl.parser.syntax.ObjectMember.ObjectElement;\nimport org.pkl.parser.syntax.ObjectMember.ObjectEntry;\nimport org.pkl.parser.syntax.ObjectMember.ObjectMethod;\nimport org.pkl.parser.syntax.ObjectMember.ObjectProperty;\nimport org.pkl.parser.syntax.ObjectMember.ObjectSpread;\nimport org.pkl.parser.syntax.ObjectMember.WhenGenerator;\nimport org.pkl.parser.syntax.Parameter;\nimport org.pkl.parser.syntax.ParameterList;\nimport org.pkl.parser.syntax.QualifiedIdentifier;\nimport org.pkl.parser.syntax.ReplInput;\nimport org.pkl.parser.syntax.StringConstant;\nimport org.pkl.parser.syntax.StringPart;\nimport org.pkl.parser.syntax.Type.ConstrainedType;\nimport org.pkl.parser.syntax.Type.DeclaredType;\nimport org.pkl.parser.syntax.Type.FunctionType;\nimport org.pkl.parser.syntax.Type.ModuleType;\nimport org.pkl.parser.syntax.Type.NothingType;\nimport org.pkl.parser.syntax.Type.NullableType;\nimport org.pkl.parser.syntax.Type.ParenthesizedType;\nimport org.pkl.parser.syntax.Type.StringConstantType;\nimport org.pkl.parser.syntax.Type.UnionType;\nimport org.pkl.parser.syntax.Type.UnknownType;\nimport org.pkl.parser.syntax.TypeAlias;\nimport org.pkl.parser.syntax.TypeAnnotation;\nimport org.pkl.parser.syntax.TypeArgumentList;\nimport org.pkl.parser.syntax.TypeParameter;\nimport org.pkl.parser.syntax.TypeParameterList;\n\npublic abstract class BaseParserVisitor<T> implements ParserVisitor<T> {\n\n  @Override\n  public T visitUnknownType(UnknownType type) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitNothingType(NothingType type) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitModuleType(ModuleType type) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitStringConstantType(StringConstantType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitDeclaredType(DeclaredType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitParenthesizedType(ParenthesizedType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitNullableType(NullableType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitConstrainedType(ConstrainedType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitUnionType(UnionType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitFunctionType(FunctionType type) {\n    return visitChildren(type);\n  }\n\n  @Override\n  public T visitThisExpr(ThisExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitOuterExpr(OuterExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitModuleExpr(ModuleExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitNullLiteralExpr(NullLiteralExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitBoolLiteralExpr(BoolLiteralExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitIntLiteralExpr(IntLiteralExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitFloatLiteralExpr(FloatLiteralExpr expr) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitThrowExpr(ThrowExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitTraceExpr(TraceExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitImportExpr(ImportExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitReadExpr(ReadExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitUnqualifiedAccessExpr(UnqualifiedAccessExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitStringConstant(StringConstant expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitSingleLineStringLiteralExpr(SingleLineStringLiteralExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitMultiLineStringLiteralExpr(MultiLineStringLiteralExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitNewExpr(NewExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitAmendsExpr(AmendsExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitSuperAccessExpr(SuperAccessExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitSuperSubscriptExpr(SuperSubscriptExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitQualifiedAccessExpr(QualifiedAccessExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitSubscriptExpr(SubscriptExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitNonNullExpr(NonNullExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitUnaryMinusExpr(UnaryMinusExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitLogicalNotExpr(LogicalNotExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitBinaryOperatorExpr(BinaryOperatorExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitTypeCheckExpr(TypeCheckExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitTypeCastExpr(TypeCastExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitIfExpr(IfExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitLetExpr(LetExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitFunctionLiteralExpr(FunctionLiteralExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitParenthesizedExpr(ParenthesizedExpr expr) {\n    return visitChildren(expr);\n  }\n\n  @Override\n  public T visitObjectProperty(ObjectProperty member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitObjectMethod(ObjectMethod member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitMemberPredicate(MemberPredicate member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitObjectElement(ObjectElement member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitObjectEntry(ObjectEntry member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitObjectSpread(ObjectSpread member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitWhenGenerator(WhenGenerator member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitForGenerator(ForGenerator member) {\n    return visitChildren(member);\n  }\n\n  @Override\n  public T visitModule(org.pkl.parser.syntax.Module module) {\n    return visitChildren(module);\n  }\n\n  @Override\n  public T visitModuleDecl(ModuleDecl decl) {\n    return visitChildren(decl);\n  }\n\n  @Override\n  public T visitExtendsOrAmendsClause(ExtendsOrAmendsClause decl) {\n    return visitChildren(decl);\n  }\n\n  @Override\n  public T visitImportClause(ImportClause imp) {\n    return visitChildren(imp);\n  }\n\n  @Override\n  public T visitClass(Class clazz) {\n    return visitChildren(clazz);\n  }\n\n  @Override\n  public T visitModifier(Modifier modifier) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitClassProperty(ClassProperty prop) {\n    return visitChildren(prop);\n  }\n\n  @Override\n  public T visitClassMethod(ClassMethod method) {\n    return visitChildren(method);\n  }\n\n  @Override\n  public T visitTypeAlias(TypeAlias typeAlias) {\n    return visitChildren(typeAlias);\n  }\n\n  @Override\n  public T visitAnnotation(Annotation annotation) {\n    return visitChildren(annotation);\n  }\n\n  @Override\n  public T visitParameter(Parameter param) {\n    return visitChildren(param);\n  }\n\n  @Override\n  public T visitParameterList(ParameterList paramList) {\n    return visitChildren(paramList);\n  }\n\n  @Override\n  public T visitTypeParameterList(TypeParameterList typeParameterList) {\n    return visitChildren(typeParameterList);\n  }\n\n  @Override\n  public T visitTypeAnnotation(TypeAnnotation typeAnnotation) {\n    return visitChildren(typeAnnotation);\n  }\n\n  @Override\n  public T visitArgumentList(ArgumentList argumentList) {\n    return visitChildren(argumentList);\n  }\n\n  @Override\n  public T visitStringPart(StringPart part) {\n    return visitChildren(part);\n  }\n\n  @Override\n  public T visitClassBody(ClassBody classBody) {\n    return visitChildren(classBody);\n  }\n\n  @Override\n  public T visitDocComment(DocComment docComment) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitIdentifier(Identifier identifier) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitQualifiedIdentifier(QualifiedIdentifier qualifiedIdentifier) {\n    return visitChildren(qualifiedIdentifier);\n  }\n\n  @Override\n  public T visitObjectBody(ObjectBody objectBody) {\n    return visitChildren(objectBody);\n  }\n\n  @Override\n  public T visitTypeParameter(TypeParameter typeParameter) {\n    return visitChildren(typeParameter);\n  }\n\n  @Override\n  public T visitReplInput(ReplInput replInput) {\n    return visitChildren(replInput);\n  }\n\n  @Override\n  public T visitKeyword(Keyword keyword) {\n    return defaultValue();\n  }\n\n  @Override\n  public T visitTypeArgumentList(TypeArgumentList typeArgumentList) {\n    return visitChildren(typeArgumentList);\n  }\n\n  private T visitChildren(Node node) {\n    T result = defaultValue();\n    var children = node.children();\n    if (children == null) return result;\n    for (var child : children) {\n      if (child != null) {\n        result = aggregateResult(result, child.accept(this));\n      }\n    }\n    return result;\n  }\n\n  protected abstract T defaultValue();\n\n  protected T aggregateResult(T result, T nextResult) {\n    return nextResult;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/GenericParser.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Supplier;\nimport org.pkl.parser.syntax.Operator;\nimport org.pkl.parser.syntax.generic.FullSpan;\nimport org.pkl.parser.syntax.generic.Node;\nimport org.pkl.parser.syntax.generic.NodeType;\nimport org.pkl.parser.util.ErrorMessages;\nimport org.pkl.parser.util.Nullable;\n\n@SuppressWarnings(\"DuplicatedCode\")\npublic class GenericParser {\n\n  private Lexer lexer;\n  private Token lookahead;\n  private FullSpan spanLookahead;\n  private FullToken _lookahead;\n  private int cursor = 0;\n  private final List<FullToken> tokens = new ArrayList<>();\n\n  private void init(String source) {\n    this.lexer = new Lexer(source);\n    cursor = 0;\n    while (true) {\n      var ft = new FullToken(lexer.next(), lexer.fullSpan(), lexer.newLinesBetween);\n      tokens.add(ft);\n      if (ft.token == Token.EOF) break;\n    }\n    _lookahead = tokens.get(cursor);\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n  }\n\n  public Node parseModule(String source) {\n    init(source);\n    if (lookahead == Token.EOF) {\n      return new Node(NodeType.MODULE, new FullSpan(0, 0, 1, 1, 1, 1), List.of());\n    }\n    var children = new ArrayList<Node>();\n    var nodes = new ArrayList<Node>();\n    if (lookahead == Token.SHEBANG) {\n      nodes.add(makeAffix(next()));\n    }\n    ff(nodes);\n\n    var res = parseMemberHeader(children);\n\n    if (isModuleDecl()) {\n      nodes.add(parseModuleDecl(children));\n      children.clear();\n      res = new HeaderResult(false, false, false);\n      ff(nodes);\n    }\n\n    // imports\n    var imports = new ArrayList<Node>();\n    while (lookahead == Token.IMPORT || lookahead == Token.IMPORT_STAR) {\n      if (res.hasDocComment || res.hasAnnotations || res.hasModifiers) {\n        throw parserError(\"wrongHeaders\", \"Imports\");\n      }\n      var lastImport = parseImportDecl();\n      imports.add(lastImport);\n      // keep trailing affixes as part of the import\n      while (lookahead.isAffix() && lastImport.span.isSameLine(spanLookahead)) {\n        imports.add(makeAffix(next()));\n      }\n      if (!isImport()) break;\n      ff(imports);\n    }\n    if (!imports.isEmpty()) {\n      nodes.add(new Node(NodeType.IMPORT_LIST, imports));\n      ff(nodes);\n    }\n\n    // entries\n    if (res.hasDocComment || res.hasAnnotations || res.hasModifiers) {\n      nodes.add(parseModuleMember(children));\n      ff(nodes);\n    }\n\n    while (lookahead != Token.EOF) {\n      children.clear();\n      parseMemberHeader(children);\n      nodes.add(parseModuleMember(children));\n      ff(nodes);\n    }\n    return new Node(NodeType.MODULE, nodes);\n  }\n\n  private Node parseModuleDecl(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var headers = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headers.add(headerParts.modifierList);\n    }\n    if (lookahead == Token.MODULE) {\n      var subChildren = new ArrayList<>(headers);\n      subChildren.add(makeTerminal(next()));\n      ff(subChildren);\n      subChildren.add(parseQualifiedIdentifier());\n      children.add(new Node(NodeType.MODULE_DEFINITION, subChildren));\n    } else {\n      children.addAll(headers);\n      if (headerParts.modifierList != null) {\n        throw parserError(\"wrongHeaders\", \"Amends or extends declaration\");\n      }\n    }\n    var looka = lookahead();\n    if (looka == Token.AMENDS || looka == Token.EXTENDS) {\n      var type = looka == Token.AMENDS ? NodeType.AMENDS_CLAUSE : NodeType.EXTENDS_CLAUSE;\n      ff(children);\n      var subChildren = new ArrayList<Node>();\n      subChildren.add(makeTerminal(next()));\n      ff(subChildren);\n      subChildren.add(parseStringConstant());\n      children.add(new Node(type, subChildren));\n    }\n    return new Node(NodeType.MODULE_DECLARATION, children);\n  }\n\n  private Node parseQualifiedIdentifier() {\n    var children = new ArrayList<Node>();\n    children.add(parseIdentifier());\n    while (lookahead() == Token.DOT) {\n      ff(children);\n      children.add(new Node(NodeType.TERMINAL, next().span));\n      ff(children);\n      children.add(parseIdentifier());\n    }\n    return new Node(NodeType.QUALIFIED_IDENTIFIER, children);\n  }\n\n  private Node parseImportDecl() {\n    var children = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    ff(children);\n    children.add(parseStringConstant());\n    if (lookahead() == Token.AS) {\n      ff(children);\n      var alias = new ArrayList<Node>();\n      alias.add(makeTerminal(next()));\n      ff(alias);\n      alias.add(parseIdentifier());\n      children.add(new Node(NodeType.IMPORT_ALIAS, alias));\n    }\n    return new Node(NodeType.IMPORT, children);\n  }\n\n  private HeaderResult parseMemberHeader(List<Node> children) {\n    var hasDocComment = false;\n    var hasAnnotation = false;\n    var hasModifier = false;\n    var docs = new ArrayList<Node>();\n    ff(children);\n    while (lookahead() == Token.DOC_COMMENT) {\n      ff(docs);\n      docs.add(new Node(NodeType.DOC_COMMENT_LINE, next().span));\n      hasDocComment = true;\n    }\n    if (hasDocComment) {\n      children.add(new Node(NodeType.DOC_COMMENT, docs));\n    }\n    ff(children);\n    while (lookahead == Token.AT) {\n      children.add(parseAnnotation());\n      hasAnnotation = true;\n      ff(children);\n    }\n    var modifiers = new ArrayList<Node>();\n    while (lookahead.isModifier()) {\n      modifiers.add(make(NodeType.MODIFIER, next().span));\n      hasModifier = true;\n      ff(children);\n    }\n    if (hasModifier) children.add(new Node(NodeType.MODIFIER_LIST, modifiers));\n    return new HeaderResult(hasDocComment, hasAnnotation, hasModifier);\n  }\n\n  private Node parseModuleMember(List<Node> preChildren) {\n    return switch (lookahead) {\n      case IDENTIFIER -> parseClassProperty(preChildren);\n      case TYPE_ALIAS -> parseTypeAlias(preChildren);\n      case CLASS -> parseClass(preChildren);\n      case FUNCTION -> parseClassMethod(preChildren);\n      case EOF -> throw parserError(\"unexpectedEndOfFile\");\n      default -> {\n        if (lookahead.isKeyword()) {\n          throw parserError(\"keywordNotAllowedHere\", lookahead.text());\n        }\n        if (lookahead == Token.DOC_COMMENT) {\n          throw parserError(\"danglingDocComment\");\n        }\n        throw parserError(\"invalidTopLevelToken\");\n      }\n    };\n  }\n\n  private Node parseTypeAlias(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var headers = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headers.add(headerParts.modifierList);\n    }\n    // typealias keyword\n    headers.add(makeTerminal(next()));\n    ff(headers);\n    headers.add(parseIdentifier());\n    ff(headers);\n    if (lookahead == Token.LT) {\n      headers.add(parseTypeParameterList());\n      ff(headers);\n    }\n    expect(Token.ASSIGN, headers, \"unexpectedToken\", \"=\");\n    children.add(new Node(NodeType.TYPEALIAS_HEADER, headers));\n    var body = new ArrayList<Node>();\n    ff(body);\n    body.add(parseType());\n    children.add(new Node(NodeType.TYPEALIAS_BODY, body));\n    return new Node(NodeType.TYPEALIAS, children);\n  }\n\n  private Node parseClass(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var headers = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headers.add(headerParts.modifierList);\n    }\n    // class keyword\n    headers.add(makeTerminal(next()));\n    ff(headers);\n    headers.add(parseIdentifier());\n    if (lookahead() == Token.LT) {\n      ff(headers);\n      headers.add(parseTypeParameterList());\n    }\n    if (lookahead() == Token.EXTENDS) {\n      var extend = new ArrayList<Node>();\n      ff(extend);\n      extend.add(makeTerminal(next()));\n      ff(extend);\n      extend.add(parseType());\n      headers.add(new Node(NodeType.CLASS_HEADER_EXTENDS, extend));\n    }\n    children.add(new Node(NodeType.CLASS_HEADER, headers));\n    if (lookahead() == Token.LBRACE) {\n      ff(children);\n      children.add(parseClassBody());\n    }\n    return new Node(NodeType.CLASS, children);\n  }\n\n  private Node parseClassBody() {\n    var children = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    var elements = new ArrayList<Node>();\n    var hasElements = false;\n    ff(elements);\n    while (lookahead != Token.RBRACE && lookahead != Token.EOF) {\n      hasElements = true;\n      var preChildren = new ArrayList<Node>();\n      parseMemberHeader(preChildren);\n      if (lookahead == Token.FUNCTION) {\n        elements.add(parseClassMethod(preChildren));\n      } else {\n        elements.add(parseClassProperty(preChildren));\n      }\n      ff(elements);\n    }\n    if (lookahead == Token.EOF) {\n      throw parserError(ErrorMessages.create(\"missingDelimiter\", \"}\"), prev().span.stopSpan());\n    }\n    if (hasElements) {\n      children.add(new Node(NodeType.CLASS_BODY_ELEMENTS, elements));\n    } else if (!elements.isEmpty()) {\n      // add affixes\n      children.addAll(elements);\n    }\n    expect(Token.RBRACE, children, \"missingDelimiter\", \"}\");\n    return new Node(NodeType.CLASS_BODY, children);\n  }\n\n  private Node parseClassProperty(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var header = new ArrayList<Node>();\n    var headerBegin = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headerBegin.add(headerParts.modifierList);\n    }\n    headerBegin.add(parseIdentifier());\n    header.add(new Node(NodeType.CLASS_PROPERTY_HEADER_BEGIN, headerBegin));\n    var hasTypeAnnotation = false;\n    if (lookahead() == Token.COLON) {\n      ff(header);\n      header.add(parseTypeAnnotation());\n      hasTypeAnnotation = true;\n    }\n    children.add(new Node(NodeType.CLASS_PROPERTY_HEADER, header));\n    if (lookahead() == Token.ASSIGN) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      var body = new ArrayList<Node>();\n      ff(body);\n      body.add(parseExpr());\n      children.add(new Node(NodeType.CLASS_PROPERTY_BODY, body));\n    } else if (lookahead() == Token.LBRACE) {\n      if (hasTypeAnnotation) {\n        throw parserError(\"typeAnnotationInAmends\");\n      }\n      while (lookahead() == Token.LBRACE) {\n        ff(children);\n        children.add(parseObjectBody());\n      }\n    }\n    return new Node(NodeType.CLASS_PROPERTY, children);\n  }\n\n  private Node parseClassMethod(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var headers = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headers.add(headerParts.modifierList);\n    }\n    expect(Token.FUNCTION, headers, \"unexpectedToken\", \"function\");\n    ff(headers);\n    headers.add(parseIdentifier());\n    children.add(new Node(NodeType.CLASS_METHOD_HEADER, headers));\n    ff(children);\n    if (lookahead == Token.LT) {\n      children.add(parseTypeParameterList());\n      ff(children);\n    }\n    children.add(parseParameterList());\n    if (lookahead() == Token.COLON) {\n      ff(children);\n      children.add(parseTypeAnnotation());\n    }\n    if (lookahead() == Token.ASSIGN) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      var body = new ArrayList<Node>();\n      ff(body);\n      body.add(parseExpr());\n      children.add(new Node(NodeType.CLASS_METHOD_BODY, body));\n    }\n    return new Node(NodeType.CLASS_METHOD, children);\n  }\n\n  private Node parseObjectBody() {\n    var children = new ArrayList<Node>();\n    expect(Token.LBRACE, children, \"unexpectedToken\", \"{\");\n    if (lookahead() == Token.RBRACE) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      return new Node(NodeType.OBJECT_BODY, children);\n    }\n    if (isParameter()) {\n      var params = new ArrayList<Node>();\n      ff(params);\n      parseListOf(Token.ARROW, params, this::parseParameter);\n      expect(Token.ARROW, params, \"unexpectedToken2\", \",\", \"->\");\n      children.add(new Node(NodeType.OBJECT_PARAMETER_LIST, params));\n      ff(children);\n    }\n    var members = new ArrayList<Node>();\n    ff(members);\n    while (lookahead != Token.RBRACE) {\n      if (lookahead == Token.EOF) {\n        throw parserError(ErrorMessages.create(\"missingDelimiter\", \"}\"), prev().span.stopSpan());\n      }\n      members.add(parseObjectMember());\n      ff(members);\n    }\n    if (!members.isEmpty()) {\n      children.add(new Node(NodeType.OBJECT_MEMBER_LIST, members));\n    }\n    children.add(makeTerminal(next())); // RBRACE\n    return new Node(NodeType.OBJECT_BODY, children);\n  }\n\n  /** Returns true if the lookahead is a parameter, false if it's a member. May have to backtrack */\n  private boolean isParameter() {\n    if (lookahead == Token.UNDERSCORE) return true;\n    if (lookahead != Token.IDENTIFIER) return false;\n    // have to backtrack\n    var originalCursor = cursor;\n    var result = false;\n    next(); // identifier\n    ff();\n    if (lookahead == Token.ARROW || lookahead == Token.COMMA) {\n      result = true;\n    } else if (lookahead == Token.COLON) {\n      next(); // colon\n      ff();\n      parseType();\n      ff();\n      result = lookahead == Token.COMMA || lookahead == Token.ARROW;\n    }\n    backtrackTo(originalCursor);\n    return result;\n  }\n\n  private Node parseObjectMember() {\n    return switch (lookahead) {\n      case IDENTIFIER -> {\n        var originalCursor = cursor;\n        next();\n        ff(new ArrayList<>());\n        if (lookahead == Token.LBRACE || lookahead == Token.COLON || lookahead == Token.ASSIGN) {\n          // it's an objectProperty\n          backtrackTo(originalCursor);\n          yield parseObjectProperty(null);\n        } else {\n          backtrackTo(originalCursor);\n          // it's an expression\n          yield parseObjectElement();\n        }\n      }\n      case FUNCTION -> parseObjectMethod(List.of());\n      case LPRED -> parseMemberPredicate();\n      case LBRACK -> parseObjectEntry();\n      case SPREAD, QSPREAD -> parseObjectSpread();\n      case WHEN -> parseWhenGenerator();\n      case FOR -> parseForGenerator();\n      case TYPE_ALIAS, CLASS ->\n          throw parserError(ErrorMessages.create(\"missingDelimiter\", \"}\"), prev().span.stopSpan());\n      default -> {\n        var preChildren = new ArrayList<Node>();\n        while (lookahead.isModifier()) {\n          preChildren.add(make(NodeType.MODIFIER, next().span));\n          ff(preChildren);\n        }\n        if (!preChildren.isEmpty()) {\n          if (lookahead == Token.FUNCTION) {\n            yield parseObjectMethod(List.of(new Node(NodeType.MODIFIER_LIST, preChildren)));\n          } else {\n            yield parseObjectProperty(List.of(new Node(NodeType.MODIFIER_LIST, preChildren)));\n          }\n        } else {\n          yield parseObjectElement();\n        }\n      }\n    };\n  }\n\n  private Node parseObjectElement() {\n    return new Node(NodeType.OBJECT_ELEMENT, List.of(parseExpr()));\n  }\n\n  private Node parseObjectProperty(@Nullable List<Node> preChildren) {\n    var children = new ArrayList<Node>();\n    var header = new ArrayList<Node>();\n    var headerBegin = new ArrayList<Node>();\n    if (preChildren != null) {\n      headerBegin.addAll(preChildren);\n    }\n    ff(headerBegin);\n    var modifierList = new ArrayList<Node>();\n    while (lookahead.isModifier()) {\n      modifierList.add(make(NodeType.MODIFIER, next().span));\n      ff(modifierList);\n    }\n    if (!modifierList.isEmpty()) {\n      headerBegin.add(new Node(NodeType.MODIFIER_LIST, modifierList));\n    }\n    headerBegin.add(parseIdentifier());\n    header.add(new Node(NodeType.OBJECT_PROPERTY_HEADER_BEGIN, headerBegin));\n    var hasTypeAnnotation = false;\n    if (lookahead() == Token.COLON) {\n      ff(header);\n      header.add(parseTypeAnnotation());\n      hasTypeAnnotation = true;\n    }\n    children.add(new Node(NodeType.OBJECT_PROPERTY_HEADER, header));\n    if (hasTypeAnnotation || lookahead() == Token.ASSIGN) {\n      ff(children);\n      expect(Token.ASSIGN, children, \"unexpectedToken\", \"=\");\n      var body = new ArrayList<Node>();\n      ff(body);\n      body.add(parseExpr(\"}\"));\n      children.add(new Node(NodeType.OBJECT_PROPERTY_BODY, body));\n      return new Node(NodeType.OBJECT_PROPERTY, children);\n    }\n    ff(children);\n    children.addAll(parseBodyList());\n    return new Node(NodeType.OBJECT_PROPERTY, children);\n  }\n\n  private Node parseObjectMethod(List<Node> preChildren) {\n    var headerParts = getHeaderParts(preChildren);\n    var children = new ArrayList<>(headerParts.preffixes);\n    var headers = new ArrayList<Node>();\n    if (headerParts.modifierList != null) {\n      headers.add(headerParts.modifierList);\n    }\n    expect(Token.FUNCTION, headers, \"unexpectedToken\", \"function\");\n    ff(headers);\n    headers.add(parseIdentifier());\n    children.add(new Node(NodeType.CLASS_METHOD_HEADER, headers));\n    ff(children);\n    if (lookahead == Token.LT) {\n      children.add(parseTypeParameterList());\n      ff(children);\n    }\n    children.add(parseParameterList());\n    ff(children);\n    if (lookahead == Token.COLON) {\n      children.add(parseTypeAnnotation());\n      ff(children);\n    }\n    expect(Token.ASSIGN, children, \"unexpectedToken\", \"=\");\n    var body = new ArrayList<Node>();\n    ff(body);\n    body.add(parseExpr());\n    children.add(new Node(NodeType.CLASS_METHOD_BODY, body));\n    return new Node(NodeType.OBJECT_METHOD, children);\n  }\n\n  private Node parseMemberPredicate() {\n    var children = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    ff(children);\n    children.add(parseExpr());\n    ff(children);\n    var firstBrack = expect(Token.RBRACK, \"unexpectedToken\", \"]]\");\n    children.add(makeTerminal(firstBrack));\n    var secondbrack = expect(Token.RBRACK, \"unexpectedToken\", \"]]\");\n    children.add(makeTerminal(secondbrack));\n    if (firstBrack.span.charIndex() != secondbrack.span.charIndex() - 1) {\n      // There shouldn't be any whitespace between the first and second ']'.\n      var span = firstBrack.span.endWith(secondbrack.span);\n      var text = lexer.textFor(span.charIndex(), span.length());\n      throw parserError(ErrorMessages.create(\"unexpectedToken\", text, \"]]\"), firstBrack.span);\n    }\n    ff(children);\n    if (lookahead == Token.ASSIGN) {\n      children.add(makeTerminal(next()));\n      ff(children);\n      children.add(parseExpr(\"}\"));\n      return new Node(NodeType.MEMBER_PREDICATE, children);\n    }\n    children.addAll(parseBodyList());\n    return new Node(NodeType.MEMBER_PREDICATE, children);\n  }\n\n  private Node parseObjectEntry() {\n    var children = new ArrayList<Node>();\n    var header = new ArrayList<Node>();\n    expect(Token.LBRACK, header, \"unexpectedToken\", \"[\");\n    ff(header);\n    header.add(parseExpr());\n    expect(Token.RBRACK, header, \"unexpectedToken\", \"]\");\n    if (lookahead() == Token.ASSIGN) {\n      ff(header);\n      header.add(makeTerminal(next()));\n      children.add(new Node(NodeType.OBJECT_ENTRY_HEADER, header));\n      ff(children);\n      children.add(parseExpr());\n      return new Node(NodeType.OBJECT_ENTRY, children);\n    }\n    children.add(new Node(NodeType.OBJECT_ENTRY_HEADER, header));\n    ff(children);\n    children.addAll(parseBodyList());\n    return new Node(NodeType.OBJECT_ENTRY, children);\n  }\n\n  private Node parseObjectSpread() {\n    var children = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    ff(children);\n    children.add(parseExpr());\n    return new Node(NodeType.OBJECT_SPREAD, children);\n  }\n\n  private Node parseWhenGenerator() {\n    var children = new ArrayList<Node>();\n    var header = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    ff(children);\n    expect(Token.LPAREN, header, \"unexpectedToken\", \"(\");\n    ff(header);\n    header.add(parseExpr());\n    ff(header);\n    expect(Token.RPAREN, header, \"unexpectedToken\", \")\");\n    children.add(new Node(NodeType.WHEN_GENERATOR_HEADER, header));\n    ff(children);\n    children.add(parseObjectBody());\n    if (lookahead() == Token.ELSE) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      ff(children);\n      children.add(parseObjectBody());\n    }\n    return new Node(NodeType.WHEN_GENERATOR, children);\n  }\n\n  private Node parseForGenerator() {\n    var children = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    ff(children);\n    var header = new ArrayList<Node>();\n    expect(Token.LPAREN, header, \"unexpectedToken\", \"(\");\n    var headerDefinition = new ArrayList<Node>();\n    var headerDefinitionHeader = new ArrayList<Node>();\n    ff(headerDefinitionHeader);\n    headerDefinitionHeader.add(parseParameter());\n    ff(headerDefinitionHeader);\n    if (lookahead == Token.COMMA) {\n      headerDefinitionHeader.add(makeTerminal(next()));\n      ff(headerDefinitionHeader);\n      headerDefinitionHeader.add(parseParameter());\n      ff(headerDefinitionHeader);\n    }\n    expect(Token.IN, headerDefinitionHeader, \"unexpectedToken\", \"in\");\n    headerDefinition.add(\n        new Node(NodeType.FOR_GENERATOR_HEADER_DEFINITION_HEADER, headerDefinitionHeader));\n    ff(headerDefinition);\n    headerDefinition.add(parseExpr());\n    ff(headerDefinition);\n    header.add(new Node(NodeType.FOR_GENERATOR_HEADER_DEFINITION, headerDefinition));\n    expect(Token.RPAREN, header, \"unexpectedToken\", \")\");\n    children.add(new Node(NodeType.FOR_GENERATOR_HEADER, header));\n    ff(children);\n    children.add(parseObjectBody());\n    return new Node(NodeType.FOR_GENERATOR, children);\n  }\n\n  private Node parseExpr() {\n    return parseExpr(null, 1);\n  }\n\n  private Node parseExpr(@Nullable String expectation) {\n    return parseExpr(expectation, 1);\n  }\n\n  private Node parseExpr(@Nullable String expectation, int minPrecedence) {\n    var expr = parseExprAtom(expectation);\n    var fullOpToken = fullLookahead();\n    var operator = getOperator(fullOpToken.tk);\n    while (operator != null) {\n      if (operator.getPrec() < minPrecedence) break;\n      // `-` and `[]` must be in the same line as the left operand and have no semicolons inbetween\n      if ((operator == Operator.MINUS || operator == Operator.SUBSCRIPT)\n          && (fullOpToken.hasSemicolon || !expr.span.isSameLine(fullOpToken.tk.span))) break;\n      var children = new ArrayList<Node>();\n      children.add(expr);\n      ff(children);\n      var op = next();\n      children.add(make(NodeType.OPERATOR, op.span));\n      ff(children);\n      var nodeType = NodeType.BINARY_OP_EXPR;\n      var nextMinPrec = operator.isLeftAssoc() ? operator.getPrec() + 1 : operator.getPrec();\n      switch (op.token) {\n        case IS, AS -> children.add(parseType());\n        case LBRACK -> {\n          nodeType = NodeType.SUBSCRIPT_EXPR;\n          children.add(parseExpr(\"]\"));\n          ff(children);\n          expect(Token.RBRACK, children, \"unexpectedToken\", \"]\");\n        }\n        case DOT, QDOT -> {\n          nodeType = NodeType.QUALIFIED_ACCESS_EXPR;\n          children.add(parseUnqualifiedAccessExpr());\n        }\n        case NON_NULL -> nodeType = NodeType.NON_NULL_EXPR;\n        default -> children.add(parseExpr(expectation, nextMinPrec));\n      }\n\n      expr = new Node(nodeType, children);\n      fullOpToken = fullLookahead();\n      operator = getOperator(fullOpToken.tk);\n    }\n    return expr;\n  }\n\n  private @Nullable Operator getOperator(FullToken tk) {\n    return switch (tk.token) {\n      case POW -> Operator.POW;\n      case STAR -> Operator.MULT;\n      case DIV -> Operator.DIV;\n      case INT_DIV -> Operator.INT_DIV;\n      case MOD -> Operator.MOD;\n      case PLUS -> Operator.PLUS;\n      case MINUS -> Operator.MINUS;\n      case GT -> Operator.GT;\n      case GTE -> Operator.GTE;\n      case LT -> Operator.LT;\n      case LTE -> Operator.LTE;\n      case IS -> Operator.IS;\n      case AS -> Operator.AS;\n      case EQUAL -> Operator.EQ_EQ;\n      case NOT_EQUAL -> Operator.NOT_EQ;\n      case AND -> Operator.AND;\n      case OR -> Operator.OR;\n      case PIPE -> Operator.PIPE;\n      case COALESCE -> Operator.NULL_COALESCE;\n      case DOT -> Operator.DOT;\n      case QDOT -> Operator.QDOT;\n      case LBRACK -> Operator.SUBSCRIPT;\n      case NON_NULL -> Operator.NON_NULL;\n      default -> null;\n    };\n  }\n\n  private Node parseUnqualifiedAccessExpr() {\n    var children = new ArrayList<Node>();\n    children.add(parseIdentifier());\n    if (lookahead() == Token.LPAREN && noSemicolonInbetween() && _lookahead.newLinesBetween == 0) {\n      ff(children);\n      children.add(parseArgumentList());\n    }\n    return new Node(NodeType.UNQUALIFIED_ACCESS_EXPR, children);\n  }\n\n  private Node parseExprAtom(@Nullable String expectation) {\n    var expr =\n        switch (lookahead) {\n          case THIS -> new Node(NodeType.THIS_EXPR, next().span);\n          case OUTER -> new Node(NodeType.OUTER_EXPR, next().span);\n          case MODULE -> new Node(NodeType.MODULE_EXPR, next().span);\n          case NULL -> new Node(NodeType.NULL_EXPR, next().span);\n          case THROW -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n            ff(children);\n            children.add(parseExpr(\")\"));\n            ff(children);\n            expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n            yield new Node(NodeType.THROW_EXPR, children);\n          }\n          case TRACE -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n            ff(children);\n            children.add(parseExpr(\")\"));\n            ff(children);\n            expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n            yield new Node(NodeType.TRACE_EXPR, children);\n          }\n          case IMPORT, IMPORT_STAR -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n            ff(children);\n            children.add(parseStringConstant());\n            ff(children);\n            expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n            yield new Node(NodeType.IMPORT_EXPR, children);\n          }\n          case READ, READ_STAR, READ_QUESTION -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n            ff(children);\n            children.add(parseExpr(\")\"));\n            ff(children);\n            expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n            yield new Node(NodeType.READ_EXPR, children);\n          }\n          case NEW -> {\n            var children = new ArrayList<Node>();\n            var header = new ArrayList<Node>();\n            header.add(makeTerminal(next()));\n            ff(header);\n            if (lookahead != Token.LBRACE) {\n              header.add(parseType(\"{\"));\n              children.add(new Node(NodeType.NEW_HEADER, header));\n              ff(children);\n            } else {\n              children.add(new Node(NodeType.NEW_HEADER, header));\n            }\n            children.add(parseObjectBody());\n            yield new Node(NodeType.NEW_EXPR, children);\n          }\n          case MINUS -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            // unary minus has higher precendence than most binary operators\n            children.add(parseExpr(expectation, 12));\n            yield new Node(NodeType.UNARY_MINUS_EXPR, children);\n          }\n          case NOT -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            // logical not has higher precendence than most binary operators\n            children.add(parseExpr(expectation, 11));\n            yield new Node(NodeType.LOGICAL_NOT_EXPR, children);\n          }\n          case LPAREN -> {\n            // can be function literal or parenthesized expression\n            if (isFunctionLiteral()) {\n              yield parseFunctionLiteral();\n            } else {\n              yield parseParenthesizedExpr();\n            }\n          }\n          case SUPER -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            if (lookahead == Token.DOT) {\n              children.add(makeTerminal(next()));\n              ff(children);\n              children.add(parseIdentifier());\n              if (lookahead() == Token.LPAREN) {\n                ff(children);\n                children.add(parseArgumentList());\n              }\n              yield new Node(NodeType.SUPER_ACCESS_EXPR, children);\n            } else {\n              expect(Token.LBRACK, children, \"unexpectedToken\", \"[\");\n              ff(children);\n              children.add(parseExpr());\n              ff(children);\n              expect(Token.RBRACK, children, \"unexpectedToken\", \"]\");\n              yield new Node(NodeType.SUPER_SUBSCRIPT_EXPR, children);\n            }\n          }\n          case IF -> {\n            var children = new ArrayList<Node>();\n            var header = new ArrayList<Node>();\n            header.add(makeTerminal(next()));\n            ff(header);\n            var condition = new ArrayList<Node>();\n            var conditionExpr = new ArrayList<Node>();\n            expect(Token.LPAREN, condition, \"unexpectedToken\", \"(\");\n            ff(conditionExpr);\n            conditionExpr.add(parseExpr(\")\"));\n            ff(conditionExpr);\n            condition.add(new Node(NodeType.IF_CONDITION_EXPR, conditionExpr));\n            expect(Token.RPAREN, condition, \"unexpectedToken\", \")\");\n            header.add(new Node(NodeType.IF_CONDITION, condition));\n            children.add(new Node(NodeType.IF_HEADER, header));\n            var thenExpr = new ArrayList<Node>();\n            ff(thenExpr);\n            thenExpr.add(parseExpr(\"else\"));\n            ff(thenExpr);\n            children.add(new Node(NodeType.IF_THEN_EXPR, thenExpr));\n            expect(Token.ELSE, children, \"unexpectedToken\", \"else\");\n            var elseExpr = new ArrayList<Node>();\n            ff(elseExpr);\n            elseExpr.add(parseExpr(expectation));\n            children.add(new Node(NodeType.IF_ELSE_EXPR, elseExpr));\n            yield new Node(NodeType.IF_EXPR, children);\n          }\n          case LET -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            ff(children);\n            var paramDef = new ArrayList<Node>();\n            expect(Token.LPAREN, paramDef, \"unexpectedToken\", \"(\");\n            var param = new ArrayList<Node>();\n            ff(param);\n            param.add(parseParameter());\n            ff(param);\n            expect(Token.ASSIGN, param, \"unexpectedToken\", \"=\");\n            ff(param);\n            param.add(parseExpr(\")\"));\n            paramDef.add(new Node(NodeType.LET_PARAMETER, param));\n            ff(paramDef);\n            expect(Token.RPAREN, paramDef, \"unexpectedToken\", \")\");\n            children.add(new Node(NodeType.LET_PARAMETER_DEFINITION, paramDef));\n            ff(children);\n            children.add(parseExpr(expectation));\n            yield new Node(NodeType.LET_EXPR, children);\n          }\n          case TRUE, FALSE -> new Node(NodeType.BOOL_LITERAL_EXPR, next().span);\n          case INT, HEX, BIN, OCT -> new Node(NodeType.INT_LITERAL_EXPR, next().span);\n          case FLOAT -> new Node(NodeType.FLOAT_LITERAL_EXPR, next().span);\n          case STRING_START -> parseSingleLineStringLiteralExpr();\n          case STRING_MULTI_START -> parseMultiLineStringLiteralExpr();\n          case IDENTIFIER -> parseUnqualifiedAccessExpr();\n          case EOF ->\n              throw parserError(\n                  ErrorMessages.create(\"unexpectedEndOfFile\"), prev().span.stopSpan());\n          default -> {\n            var text = _lookahead.text(lexer);\n            if (expectation != null) {\n              throw parserError(\"unexpectedToken\", text, expectation);\n            }\n            throw parserError(\"unexpectedTokenForExpression\", text);\n          }\n        };\n    return parseExprRest(expr);\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private Node parseExprRest(Node expr) {\n    // amends\n    if (lookahead() == Token.LBRACE) {\n      var children = new ArrayList<Node>();\n      children.add(expr);\n      ff(children);\n      if (expr.type == NodeType.PARENTHESIZED_EXPR\n          || expr.type == NodeType.AMENDS_EXPR\n          || expr.type == NodeType.NEW_EXPR) {\n        children.add(parseObjectBody());\n        return parseExprRest(new Node(NodeType.AMENDS_EXPR, children));\n      }\n      throw parserError(\"unexpectedCurlyProbablyAmendsExpression\", expr.text(lexer.getSource()));\n    }\n    return expr;\n  }\n\n  private boolean isFunctionLiteral() {\n    var originalCursor = cursor;\n    try {\n      next(); // open (\n      ff();\n      var token = next().token;\n      ff();\n      if (token == Token.RPAREN) {\n        return lookahead == Token.ARROW;\n      }\n      if (token == Token.UNDERSCORE) {\n        return true;\n      }\n      if (token != Token.IDENTIFIER) {\n        return false;\n      }\n      if (lookahead == Token.COMMA || lookahead == Token.COLON) {\n        return true;\n      }\n      if (lookahead == Token.RPAREN) {\n        next();\n        ff();\n        return lookahead == Token.ARROW;\n      }\n      return false;\n    } finally {\n      backtrackTo(originalCursor);\n    }\n  }\n\n  private Node parseSingleLineStringLiteralExpr() {\n    var children = new ArrayList<Node>();\n    var start = next();\n    children.add(makeTerminal(start)); // string start\n    while (lookahead != Token.STRING_END) {\n      switch (lookahead) {\n        case STRING_PART -> {\n          var tk = next();\n          if (!tk.text(lexer).isEmpty()) {\n            children.add(make(NodeType.STRING_CHARS, tk.span));\n          }\n        }\n        case STRING_ESCAPE_NEWLINE,\n            STRING_ESCAPE_TAB,\n            STRING_ESCAPE_QUOTE,\n            STRING_ESCAPE_BACKSLASH,\n            STRING_ESCAPE_RETURN,\n            STRING_ESCAPE_UNICODE ->\n            children.add(make(NodeType.STRING_ESCAPE, next().span));\n        case INTERPOLATION_START -> {\n          children.add(makeTerminal(next()));\n          ff(children);\n          children.add(parseExpr(\")\"));\n          ff(children);\n          expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n        }\n        case EOF -> {\n          var delimiter = new StringBuilder(start.text(lexer)).reverse().toString();\n          throw parserError(\"missingDelimiter\", delimiter);\n        }\n      }\n    }\n    children.add(makeTerminal(next())); // string end\n    return new Node(NodeType.SINGLE_LINE_STRING_LITERAL_EXPR, children);\n  }\n\n  private Node parseMultiLineStringLiteralExpr() {\n    var children = new ArrayList<Node>();\n    var start = next();\n    children.add(makeTerminal(start)); // string start\n    if (lookahead != Token.STRING_NEWLINE) {\n      throw parserError(ErrorMessages.create(\"stringContentMustBeginOnNewLine\"), spanLookahead);\n    }\n    while (lookahead != Token.STRING_END) {\n      switch (lookahead) {\n        case STRING_PART -> {\n          var tk = next();\n          if (!tk.text(lexer).isEmpty()) {\n            children.add(make(NodeType.STRING_CHARS, tk.span));\n          }\n        }\n        case STRING_NEWLINE -> children.add(make(NodeType.STRING_NEWLINE, next().span));\n        case STRING_ESCAPE_NEWLINE,\n            STRING_ESCAPE_TAB,\n            STRING_ESCAPE_QUOTE,\n            STRING_ESCAPE_BACKSLASH,\n            STRING_ESCAPE_RETURN,\n            STRING_ESCAPE_UNICODE ->\n            children.add(make(NodeType.STRING_ESCAPE, next().span));\n        case INTERPOLATION_START -> {\n          children.add(makeTerminal(next()));\n          ff(children);\n          children.add(parseExpr(\")\"));\n          ff(children);\n          expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n        }\n        case EOF -> {\n          var delimiter = new StringBuilder(start.text(lexer)).reverse().toString();\n          throw parserError(\"missingDelimiter\", delimiter);\n        }\n      }\n    }\n    children.add(makeTerminal(next())); // string end\n    validateStringEndDelimiter(children);\n    validateStringIndentation(children);\n    return new Node(NodeType.MULTI_LINE_STRING_LITERAL_EXPR, children);\n  }\n\n  private void validateStringEndDelimiter(List<Node> nodes) {\n    var beforeLast = nodes.get(nodes.size() - 2);\n    if (beforeLast.type == NodeType.STRING_NEWLINE) return;\n    var text = beforeLast.text(lexer.getSource());\n    if (!text.isBlank()) {\n      throw parserError(\n          ErrorMessages.create(\"closingStringDelimiterMustBeginOnNewLine\"), beforeLast.span);\n    }\n  }\n\n  private void validateStringIndentation(List<Node> nodes) {\n    var indentNode = nodes.get(nodes.size() - 2);\n    if (indentNode.type == NodeType.STRING_NEWLINE) return;\n    var indent = indentNode.text(lexer.getSource());\n    var previousNewline = false;\n    for (var i = 1; i < nodes.size() - 2; i++) {\n      var child = nodes.get(i);\n      if (child.type != NodeType.STRING_NEWLINE && previousNewline) {\n        var text = child.text(lexer.getSource());\n        if (!text.startsWith(indent)) {\n          throw parserError(ErrorMessages.create(\"stringIndentationMustMatchLastLine\"), child.span);\n        }\n      }\n      previousNewline = child.type == NodeType.STRING_NEWLINE;\n    }\n  }\n\n  private Node parseParenthesizedExpr() {\n    var children = new ArrayList<Node>();\n    expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n    if (lookahead() == Token.RPAREN) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      return new Node(NodeType.PARENTHESIZED_EXPR, children);\n    }\n    var elements = new ArrayList<Node>();\n    ff(elements);\n    elements.add(parseExpr(\")\"));\n    ff(elements);\n    children.add(new Node(NodeType.PARENTHESIZED_EXPR_ELEMENTS, elements));\n    expect(Token.RPAREN, children, \"unexpectedToken\", \")\");\n    return new Node(NodeType.PARENTHESIZED_EXPR, children);\n  }\n\n  private Node parseFunctionLiteral() {\n    var paramListChildren = new ArrayList<Node>();\n    expect(Token.LPAREN, paramListChildren, \"unexpectedToken\", \"(\");\n    if (lookahead() == Token.RPAREN) {\n      ff(paramListChildren);\n      paramListChildren.add(makeTerminal(next()));\n    } else {\n      var elements = new ArrayList<Node>();\n      ff(elements);\n      parseListOf(Token.RPAREN, elements, this::parseParameter);\n      paramListChildren.add(new Node(NodeType.PARAMETER_LIST_ELEMENTS, elements));\n      expect(Token.RPAREN, paramListChildren, \"unexpectedToken2\", \",\", \")\");\n    }\n    var children = new ArrayList<Node>();\n    children.add(new Node(NodeType.PARAMETER_LIST, paramListChildren));\n    ff(children);\n    expect(Token.ARROW, children, \"unexpectedToken\", \"->\");\n    var body = new ArrayList<Node>();\n    ff(body);\n    body.add(parseExpr());\n    children.add(new Node(NodeType.FUNCTION_LITERAL_BODY, body));\n    return new Node(NodeType.FUNCTION_LITERAL_EXPR, children);\n  }\n\n  private Node parseType() {\n    return parseType(null);\n  }\n\n  private Node parseType(@Nullable String expectation) {\n    var children = new ArrayList<Node>();\n    var hasDefault = false;\n    FullSpan start = null;\n    if (lookahead == Token.STAR) {\n      var tk = next();\n      start = tk.span;\n      children.add(makeTerminal(tk));\n      ff(children);\n      hasDefault = true;\n    }\n    var first = parseTypeAtom(expectation);\n    children.add(first);\n\n    if (lookahead() != Token.UNION) {\n      if (hasDefault) {\n        throw parserError(ErrorMessages.create(\"notAUnion\"), start.endWith(first.span));\n      }\n      return first;\n    }\n\n    while (lookahead() == Token.UNION) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      ff(children);\n      if (lookahead == Token.STAR) {\n        if (hasDefault) {\n          throw parserError(\"multipleUnionDefaults\");\n        }\n        children.add(makeTerminal(next()));\n        ff(children);\n        hasDefault = true;\n      }\n      var type = parseTypeAtom(expectation);\n      children.add(type);\n    }\n    return new Node(NodeType.UNION_TYPE, children);\n  }\n\n  private Node parseTypeAtom(@Nullable String expectation) {\n    var typ =\n        switch (lookahead) {\n          case UNKNOWN -> make(NodeType.UNKNOWN_TYPE, next().span);\n          case NOTHING -> make(NodeType.NOTHING_TYPE, next().span);\n          case MODULE -> make(NodeType.MODULE_TYPE, next().span);\n          case LPAREN -> {\n            var children = new ArrayList<Node>();\n            children.add(makeTerminal(next()));\n            var totalTypes = 0;\n            if (lookahead() == Token.RPAREN) {\n              ff(children);\n              children.add(makeTerminal(next()));\n            } else {\n              var elements = new ArrayList<Node>();\n              ff(elements);\n              elements.add(parseType(\")\"));\n              ff(elements);\n              while (lookahead == Token.COMMA) {\n                var comma = next();\n                if (lookahead() == Token.RPAREN) {\n                  ff(elements);\n                  break;\n                }\n                elements.add(makeTerminal(comma));\n                ff(elements);\n                elements.add(parseType(\")\"));\n                totalTypes++;\n                ff(elements);\n              }\n              children.add(new Node(NodeType.PARENTHESIZED_TYPE_ELEMENTS, elements));\n              expect(Token.RPAREN, children, \"unexpectedToken2\", \",\", \")\");\n            }\n            if (totalTypes > 1 || lookahead() == Token.ARROW) {\n              var actualChildren = new ArrayList<Node>();\n              actualChildren.add(new Node(NodeType.FUNCTION_TYPE_PARAMETERS, children));\n              ff(actualChildren);\n              expect(Token.ARROW, actualChildren, \"unexpectedToken\", \"->\");\n              ff(actualChildren);\n              actualChildren.add(parseType(expectation));\n              yield new Node(NodeType.FUNCTION_TYPE, actualChildren);\n            } else {\n              yield new Node(NodeType.PARENTHESIZED_TYPE, children);\n            }\n          }\n          case IDENTIFIER -> {\n            var children = new ArrayList<Node>();\n            children.add(parseQualifiedIdentifier());\n            if (lookahead() == Token.LT) {\n              ff(children);\n              children.add(parseTypeArgumentList());\n            }\n            yield new Node(NodeType.DECLARED_TYPE, children);\n          }\n          case STRING_START ->\n              new Node(NodeType.STRING_CONSTANT_TYPE, List.of(parseStringConstant()));\n          default -> {\n            var text = _lookahead.text(lexer);\n            if (expectation != null) {\n              throw parserError(\"unexpectedTokenForType2\", text, expectation);\n            }\n            throw parserError(\"unexpectedTokenForType\", text);\n          }\n        };\n\n    if (typ.type == NodeType.FUNCTION_TYPE) return typ;\n    return parseTypeEnd(typ);\n  }\n\n  private Node parseTypeEnd(Node type) {\n    var children = new ArrayList<Node>();\n    children.add(type);\n    // nullable types\n    if (lookahead() == Token.QUESTION) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      var res = new Node(NodeType.NULLABLE_TYPE, children);\n      return parseTypeEnd(res);\n    }\n    // constrained types: have to start in the same line as the type\n    var fla = fullLookahead();\n    if (fla.tk.token == Token.LPAREN && noSemicolonInbetween() && fla.tk.newLinesBetween == 0) {\n      ff(children);\n      var constraint = new ArrayList<Node>();\n      constraint.add(makeTerminal(next()));\n      var elements = new ArrayList<Node>();\n      ff(elements);\n      parseListOf(Token.RPAREN, elements, () -> parseExpr(\")\"));\n      constraint.add(new Node(NodeType.CONSTRAINED_TYPE_ELEMENTS, elements));\n      expect(Token.RPAREN, constraint, \"unexpectedToken2\", \",\", \")\");\n      children.add(new Node(NodeType.CONSTRAINED_TYPE_CONSTRAINT, constraint));\n      var res = new Node(NodeType.CONSTRAINED_TYPE, children);\n      return parseTypeEnd(res);\n    }\n    return type;\n  }\n\n  private Node parseAnnotation() {\n    var children = new ArrayList<Node>();\n    children.add(makeTerminal(next()));\n    children.add(parseType());\n    if (lookahead() == Token.LBRACE) {\n      ff(children);\n      children.add(parseObjectBody());\n    }\n    return new Node(NodeType.ANNOTATION, children);\n  }\n\n  private Node parseParameter() {\n    if (lookahead == Token.UNDERSCORE) {\n      return new Node(NodeType.PARAMETER, List.of(makeTerminal(next())));\n    }\n    return parseTypedIdentifier();\n  }\n\n  private Node parseTypedIdentifier() {\n    var children = new ArrayList<Node>();\n    children.add(parseIdentifier());\n    if (lookahead() == Token.COLON) {\n      ff(children);\n      children.add(parseTypeAnnotation());\n    }\n    return new Node(NodeType.PARAMETER, children);\n  }\n\n  private Node parseParameterList() {\n    var children = new ArrayList<Node>();\n    expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n    ff(children);\n    if (lookahead == Token.RPAREN) {\n      children.add(makeTerminal(next()));\n    } else {\n      var elements = new ArrayList<Node>();\n      parseListOf(Token.RPAREN, elements, this::parseParameter);\n      children.add(new Node(NodeType.PARAMETER_LIST_ELEMENTS, elements));\n      expect(Token.RPAREN, children, \"unexpectedToken2\", \",\", \")\");\n    }\n    return new Node(NodeType.PARAMETER_LIST, children);\n  }\n\n  private List<Node> parseBodyList() {\n    if (lookahead != Token.LBRACE) {\n      throw parserError(\"unexpectedToken2\", _lookahead.text(lexer), \"{\", \"=\");\n    }\n    var bodies = new ArrayList<Node>();\n    do {\n      bodies.add(parseObjectBody());\n    } while (lookahead() == Token.LBRACE);\n    return bodies;\n  }\n\n  private Node parseTypeParameterList() {\n    var children = new ArrayList<Node>();\n    expect(Token.LT, children, \"unexpectedToken\", \"<\");\n    ff(children);\n    var elements = new ArrayList<Node>();\n    parseListOf(Token.GT, elements, this::parseTypeParameter);\n    children.add(new Node(NodeType.TYPE_PARAMETER_LIST_ELEMENTS, elements));\n    expect(Token.GT, children, \"unexpectedToken2\", \",\", \">\");\n    return new Node(NodeType.TYPE_PARAMETER_LIST, children);\n  }\n\n  private Node parseTypeArgumentList() {\n    var children = new ArrayList<Node>();\n    expect(Token.LT, children, \"unexpectedToken\", \"<\");\n    ff(children);\n    var elements = new ArrayList<Node>();\n    parseListOf(Token.GT, elements, () -> parseType(\">\"));\n    children.add(new Node(NodeType.TYPE_ARGUMENT_LIST_ELEMENTS, elements));\n    expect(Token.GT, children, \"unexpectedToken2\", \",\", \">\");\n    return new Node(NodeType.TYPE_ARGUMENT_LIST, children);\n  }\n\n  private Node parseArgumentList() {\n    var children = new ArrayList<Node>();\n    expect(Token.LPAREN, children, \"unexpectedToken\", \"(\");\n    if (lookahead() == Token.RPAREN) {\n      ff(children);\n      children.add(makeTerminal(next()));\n      return new Node(NodeType.ARGUMENT_LIST, children);\n    }\n    var elements = new ArrayList<Node>();\n    ff(elements);\n    parseListOf(Token.RPAREN, elements, () -> parseExpr(\")\"));\n    ff(elements);\n    children.add(new Node(NodeType.ARGUMENT_LIST_ELEMENTS, elements));\n    expect(Token.RPAREN, children, \"unexpectedToken2\", \",\", \")\");\n    return new Node(NodeType.ARGUMENT_LIST, children);\n  }\n\n  private Node parseTypeParameter() {\n    var children = new ArrayList<Node>();\n    if (lookahead == Token.IN) {\n      children.add(makeTerminal(next()));\n    } else if (lookahead == Token.OUT) {\n      children.add(makeTerminal(next()));\n    }\n    children.add(parseIdentifier());\n    return new Node(NodeType.TYPE_PARAMETER, children);\n  }\n\n  private Node parseTypeAnnotation() {\n    var children = new ArrayList<Node>();\n    expect(Token.COLON, children, \"unexpectedToken\", \":\");\n    ff(children);\n    children.add(parseType());\n    return new Node(NodeType.TYPE_ANNOTATION, children);\n  }\n\n  private Node parseIdentifier() {\n    if (lookahead != Token.IDENTIFIER) {\n      if (lookahead.isKeyword()) {\n        throw parserError(\"keywordNotAllowedHere\", lookahead.text());\n      }\n      throw parserError(\"unexpectedToken\", _lookahead.text(lexer), \"identifier\");\n    }\n    return new Node(NodeType.IDENTIFIER, next().span);\n  }\n\n  private Node parseStringConstant() {\n    var children = new ArrayList<Node>();\n    var startTk = expect(Token.STRING_START, \"unexpectedToken\", \"\\\"\");\n    children.add(makeTerminal(startTk));\n    while (lookahead != Token.STRING_END) {\n      switch (lookahead) {\n        case STRING_PART,\n            STRING_ESCAPE_NEWLINE,\n            STRING_ESCAPE_TAB,\n            STRING_ESCAPE_QUOTE,\n            STRING_ESCAPE_BACKSLASH,\n            STRING_ESCAPE_RETURN,\n            STRING_ESCAPE_UNICODE ->\n            children.add(makeTerminal(next()));\n        case EOF -> {\n          var delimiter = new StringBuilder(startTk.text(lexer)).reverse().toString();\n          throw parserError(\"missingDelimiter\", delimiter);\n        }\n        case INTERPOLATION_START -> throw parserError(\"interpolationInConstant\");\n        // the lexer makes sure we only get the above tokens inside a string\n        default -> throw new RuntimeException(\"Unreacheable code\");\n      }\n    }\n    children.add(makeTerminal(next())); // string end\n    return new Node(NodeType.STRING_CHARS, children);\n  }\n\n  private FullToken expect(Token type, String errorKey, Object... messageArgs) {\n    if (lookahead != type) {\n      var span = spanLookahead;\n      if (lookahead == Token.EOF || _lookahead.newLinesBetween > 0) {\n        // don't point at the EOF or the next line, but at the end of the last token\n        span = prev().span.stopSpan();\n      }\n      var args = messageArgs;\n      if (errorKey.startsWith(\"unexpectedToken\")) {\n        args = new Object[messageArgs.length + 1];\n        args[0] = lookahead == Token.EOF ? \"EOF\" : _lookahead.text(lexer);\n        System.arraycopy(messageArgs, 0, args, 1, messageArgs.length);\n      }\n      throw parserError(ErrorMessages.create(errorKey, args), span);\n    }\n    return next();\n  }\n\n  private void expect(Token type, List<Node> children, String errorKey, Object... messageArgs) {\n    var tk = expect(type, errorKey, messageArgs);\n    children.add(makeTerminal(tk));\n  }\n\n  private void parseListOf(Token terminator, List<Node> children, Supplier<Node> parser) {\n    children.add(parser.get());\n    ff(children);\n    while (lookahead == Token.COMMA) {\n      // don't store the last comma\n      var comma = makeTerminal(next());\n      if (lookahead() == terminator) break;\n      children.add(comma);\n      ff(children);\n      children.add(parser.get());\n      ff(children);\n    }\n  }\n\n  private GenericParserError parserError(String messageKey, Object... args) {\n    return new GenericParserError(ErrorMessages.create(messageKey, args), spanLookahead);\n  }\n\n  private GenericParserError parserError(String message, FullSpan span) {\n    return new GenericParserError(message, span);\n  }\n\n  private boolean isModuleDecl() {\n    var _cursor = cursor;\n    var ftk = tokens.get(_cursor);\n    while (ftk.token.isAffix() || ftk.token.isModifier()) {\n      ftk = tokens.get(++_cursor);\n    }\n    var tk = ftk.token;\n    return tk == Token.MODULE || tk == Token.EXTENDS || tk == Token.AMENDS;\n  }\n\n  private boolean isImport() {\n    var _cursor = cursor;\n    var ftk = tokens.get(_cursor);\n    while (ftk.token.isAffix()) {\n      ftk = tokens.get(++_cursor);\n    }\n    var tk = ftk.token;\n    return tk == Token.IMPORT || tk == Token.IMPORT_STAR;\n  }\n\n  private FullToken next() {\n    var tmp = tokens.get(cursor++);\n    _lookahead = tokens.get(cursor);\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n    return tmp;\n  }\n\n  private boolean noSemicolonInbetween() {\n    return tokens.get(cursor - 1).token != Token.SEMICOLON;\n  }\n\n  private void backtrack() {\n    var tmp = tokens.get(--cursor);\n    lookahead = tmp.token;\n    spanLookahead = tmp.span;\n  }\n\n  private void backtrackTo(int point) {\n    cursor = point;\n    var tmp = tokens.get(cursor);\n    lookahead = tmp.token;\n    spanLookahead = tmp.span;\n  }\n\n  private FullToken prev() {\n    return tokens.get(cursor - 1);\n  }\n\n  // Jump over affixes and find the next token\n  private Token lookahead() {\n    var i = cursor;\n    var tmp = tokens.get(i);\n    while (tmp.token.isAffix() && tmp.token != Token.EOF) {\n      tmp = tokens.get(++i);\n    }\n    return tmp.token;\n  }\n\n  // Jump over affixes and find the next token\n  private LookaheadSearch fullLookahead() {\n    var i = cursor;\n    var hasSemicolon = false;\n    var tmp = tokens.get(i);\n    while (tmp.token.isAffix() && tmp.token != Token.EOF) {\n      if (tmp.token == Token.SEMICOLON) {\n        hasSemicolon = true;\n      }\n      tmp = tokens.get(++i);\n    }\n    return new LookaheadSearch(tmp, hasSemicolon);\n  }\n\n  private record LookaheadSearch(FullToken tk, boolean hasSemicolon) {}\n\n  private record HeaderParts(List<Node> preffixes, @Nullable Node modifierList) {}\n\n  private HeaderParts getHeaderParts(List<Node> nodes) {\n    if (nodes.isEmpty()) return new HeaderParts(nodes, null);\n    var last = nodes.get(nodes.size() - 1);\n    if (last.type == NodeType.MODIFIER_LIST) {\n      return new HeaderParts(nodes.subList(0, nodes.size() - 1), last);\n    }\n    return new HeaderParts(nodes, null);\n  }\n\n  private Node make(NodeType type, FullSpan span) {\n    return new Node(type, span);\n  }\n\n  private Node makeAffix(FullToken tk) {\n    return new Node(nodeTypeForAffix(tk.token), tk.span);\n  }\n\n  private Node makeTerminal(FullToken tk) {\n    return new Node(NodeType.TERMINAL, tk.span);\n  }\n\n  // fast-forward over affix tokens\n  // store children\n  private void ff(List<Node> children) {\n    var tmp = tokens.get(cursor);\n    while (tmp.token.isAffix()) {\n      children.add(makeAffix(tmp));\n      tmp = tokens.get(++cursor);\n    }\n    _lookahead = tmp;\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n  }\n\n  // fast-forward over affix tokens\n  private void ff() {\n    var tmp = tokens.get(cursor);\n    while (tmp.token.isAffix()) {\n      tmp = tokens.get(++cursor);\n    }\n    _lookahead = tmp;\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n  }\n\n  private NodeType nodeTypeForAffix(Token token) {\n    return switch (token) {\n      case LINE_COMMENT -> NodeType.LINE_COMMENT;\n      case BLOCK_COMMENT -> NodeType.BLOCK_COMMENT;\n      case SHEBANG -> NodeType.SHEBANG;\n      case SEMICOLON -> NodeType.SEMICOLON;\n      default -> throw new RuntimeException(\"Unreacheable code\");\n    };\n  }\n\n  private record FullToken(Token token, FullSpan span, int newLinesBetween) {\n    String text(Lexer lexer) {\n      return lexer.textFor(span.charIndex(), span.length());\n    }\n  }\n\n  private record HeaderResult(\n      boolean hasDocComment, boolean hasAnnotations, boolean hasModifiers) {}\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/GenericParserError.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport org.pkl.parser.syntax.generic.FullSpan;\n\npublic class GenericParserError extends RuntimeException {\n  private final FullSpan span;\n\n  public GenericParserError(String msg, FullSpan span) {\n    super(msg);\n    this.span = span;\n  }\n\n  public FullSpan getSpan() {\n    return span;\n  }\n\n  @Override\n  public String toString() {\n    return getMessage() + \" at \" + span;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/Lexer.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport java.util.ArrayDeque;\nimport java.util.Deque;\nimport org.pkl.parser.syntax.generic.FullSpan;\nimport org.pkl.parser.util.ErrorMessages;\n\npublic class Lexer {\n\n  private final char[] source;\n  private final int size;\n  protected int cursor = 0;\n  protected int sCursor = 0;\n  private int line = 1;\n  private int sLine = 1;\n  private int col = 1;\n  private int sCol = 1;\n  private int lookahead;\n  private State state = State.DEFAULT;\n  private final Deque<InterpolationScope> interpolationStack = new ArrayDeque<>();\n  private boolean stringEnded = false;\n  private boolean isEscape = false;\n  // how many newlines exist between two subsequent tokens\n  protected int newLinesBetween = 0;\n\n  private static final int EOF = -1;\n\n  public Lexer(String input) {\n    source = input.toCharArray();\n    size = source.length;\n    if (size > 0) {\n      lookahead = source[cursor];\n    } else {\n      lookahead = EOF;\n    }\n  }\n\n  // The span of the last lexed token\n  public Span span() {\n    return new Span(sCursor, cursor - sCursor);\n  }\n\n  // The full span of the last lexed token\n  public FullSpan fullSpan() {\n    return new FullSpan(sCursor, cursor - sCursor, sLine, sCol, line, col);\n  }\n\n  // The text of the last lexed token\n  public String text() {\n    return new String(source, sCursor, cursor - sCursor);\n  }\n\n  public int getStartCursor() {\n    return sCursor;\n  }\n\n  public int getCursor() {\n    return cursor;\n  }\n\n  public char[] getSource() {\n    return source;\n  }\n\n  public String textFor(int offset, int size) {\n    return new String(source, offset, size);\n  }\n\n  public Token next() {\n    sCursor = cursor;\n    sLine = line;\n    sCol = col;\n    newLinesBetween = 0;\n    return switch (state) {\n      case DEFAULT -> nextDefault();\n      case STRING -> nextString();\n    };\n  }\n\n  private Token nextDefault() {\n    var ch = nextChar();\n    // ignore spaces\n    while (ch == ' ' || ch == '\\n' || ch == '\\t' || ch == '\\f' || ch == '\\r') {\n      sCursor = cursor;\n      if (ch == '\\n') {\n        newLinesBetween++;\n        sLine = line;\n      }\n      sCol = col;\n      ch = nextChar();\n    }\n    return switch (ch) {\n      case EOF -> {\n        // when EOF is reached we overshot the span\n        cursor--;\n        yield Token.EOF;\n      }\n      case ';' -> Token.SEMICOLON;\n      case '(' -> {\n        var scope = interpolationStack.peek();\n        if (scope != null) {\n          scope.parens++;\n        }\n        yield Token.LPAREN;\n      }\n      case ')' -> {\n        var scope = interpolationStack.peek();\n        if (scope != null) {\n          scope.parens--;\n          if (scope.parens <= 0) {\n            // interpolation is over. Back to string\n            state = State.STRING;\n          }\n        }\n        yield Token.RPAREN;\n      }\n      case '{' -> Token.LBRACE;\n      case '}' -> Token.RBRACE;\n      case ',' -> Token.COMMA;\n      case '@' -> Token.AT;\n      case ':' -> Token.COLON;\n      case '+' -> Token.PLUS;\n      case '%' -> Token.MOD;\n      case '[' -> {\n        if (lookahead == '[') {\n          nextChar();\n          yield Token.LPRED;\n        } else yield Token.LBRACK;\n      }\n      case ']' -> Token.RBRACK;\n      case '=' -> {\n        if (lookahead == '=') {\n          nextChar();\n          yield Token.EQUAL;\n        } else yield Token.ASSIGN;\n      }\n      case '>' -> {\n        if (lookahead == '=') {\n          nextChar();\n          yield Token.GTE;\n        } else yield Token.GT;\n      }\n      case '<' -> {\n        if (lookahead == '=') {\n          nextChar();\n          yield Token.LTE;\n        } else yield Token.LT;\n      }\n      case '-' -> {\n        if (lookahead == '>') {\n          nextChar();\n          yield Token.ARROW;\n        } else yield Token.MINUS;\n      }\n      case '!' -> {\n        if (lookahead == '!') {\n          nextChar();\n          yield Token.NON_NULL;\n        } else if (lookahead == '=') {\n          nextChar();\n          yield Token.NOT_EQUAL;\n        } else yield Token.NOT;\n      }\n      case '?' -> {\n        if (lookahead == '.') {\n          nextChar();\n          yield Token.QDOT;\n        } else if (lookahead == '?') {\n          nextChar();\n          yield Token.COALESCE;\n        } else yield Token.QUESTION;\n      }\n      case '&' -> {\n        if (lookahead == '&') {\n          nextChar();\n          yield Token.AND;\n        } else {\n          throw unexpectedChar(ch, \"&&\");\n        }\n      }\n      case '|' -> {\n        if (lookahead == '>') {\n          nextChar();\n          yield Token.PIPE;\n        } else if (lookahead == '|') {\n          nextChar();\n          yield Token.OR;\n        } else {\n          yield Token.UNION;\n        }\n      }\n      case '*' -> {\n        if (lookahead == '*') {\n          nextChar();\n          yield Token.POW;\n        } else yield Token.STAR;\n      }\n      case '~' -> {\n        if (lookahead == '/') {\n          nextChar();\n          yield Token.INT_DIV;\n        } else {\n          throw unexpectedChar(ch, \"~/\");\n        }\n      }\n      case '.' -> {\n        if (lookahead == '.') {\n          nextChar();\n          if (lookahead == '.') {\n            nextChar();\n            if (lookahead == '?') {\n              nextChar();\n              yield Token.QSPREAD;\n            } else {\n              yield Token.SPREAD;\n            }\n          } else {\n            throw unexpectedChar(\"..\", \".\", \"...\", \"...?\");\n          }\n        } else if (lookahead >= 48 && lookahead <= 57) {\n          yield lexNumber(ch);\n        } else {\n          yield Token.DOT;\n        }\n      }\n      case '`' -> {\n        lexQuotedIdentifier();\n        yield Token.IDENTIFIER;\n      }\n      case '/' -> lexSlash();\n      case '\"' -> lexStringStart(0);\n      case '#' -> {\n        if (lookahead == '!') {\n          yield lexShebang();\n        } else {\n          yield lexStringStartPounds();\n        }\n      }\n      default -> {\n        if (Character.isDigit(ch)) {\n          yield lexNumber(ch);\n        } else if (isIdentifierStart(ch)) {\n          yield lexIdentifier();\n        } else throw lexError(ErrorMessages.create(\"invalidCharacter\", (char) ch), cursor - 1, 1);\n      }\n    };\n  }\n\n  private Token nextString() {\n    var scope = interpolationStack.getFirst();\n    if (stringEnded) {\n      lexStringEnd(scope);\n      stringEnded = false;\n      interpolationStack.pop();\n      state = State.DEFAULT;\n      return Token.STRING_END;\n    }\n    if (lookahead == EOF) return Token.EOF;\n    if (isEscape) {\n      isEscape = false;\n      // consume the `\\#*`\n      for (var i = 0; i < scope.pounds + 1; i++) {\n        nextChar();\n      }\n      return lexEscape();\n    }\n    if (scope.quotes == 1) {\n      lexString(scope.pounds);\n    } else {\n      if (lookahead == '\\r') {\n        nextChar();\n        if (lookahead == '\\n') {\n          nextChar();\n        }\n        return Token.STRING_NEWLINE;\n      }\n      if (lookahead == '\\n') {\n        nextChar();\n        return Token.STRING_NEWLINE;\n      }\n      lexMultiString(scope.pounds);\n    }\n    return Token.STRING_PART;\n  }\n\n  private Token lexStringStartPounds() {\n    int pounds = 1;\n    while (lookahead == '#') {\n      nextChar();\n      pounds++;\n    }\n    if (lookahead == EOF) {\n      throw lexError(ErrorMessages.create(\"unexpectedEndOfFile\"), span());\n    }\n    if (lookahead != '\"') {\n      throw unexpectedChar(lookahead, \"\\\"\");\n    }\n    nextChar();\n    return lexStringStart(pounds);\n  }\n\n  private Token lexStringStart(int pounds) {\n    var quotes = 1;\n    if (lookahead == '\"') {\n      nextChar();\n      if (lookahead == '\"') {\n        nextChar();\n        quotes = 3;\n      } else {\n        backup();\n      }\n    }\n    state = State.STRING;\n    interpolationStack.push(new InterpolationScope(quotes, pounds));\n    stringEnded = false;\n    if (quotes == 1) return Token.STRING_START;\n    return Token.STRING_MULTI_START;\n  }\n\n  private void lexStringEnd(InterpolationScope scope) {\n    // don't actually need to check it here\n    for (var i = 0; i < scope.quotes + scope.pounds; i++) {\n      nextChar();\n    }\n  }\n\n  private void lexString(int pounds) {\n    var poundsInARow = 0;\n    var foundQuote = false;\n    var foundBackslash = false;\n    while (lookahead != EOF) {\n      var ch = nextChar();\n      switch (ch) {\n        case '\\n', '\\r' ->\n            throw lexError(\n                ErrorMessages.create(\"missingDelimiter\", \"\\\"\" + \"#\".repeat(pounds)), cursor - 1, 1);\n        case '\"' -> {\n          if (pounds == 0) {\n            backup();\n            stringEnded = true;\n            return;\n          }\n          foundQuote = true;\n          foundBackslash = false;\n          poundsInARow = 0;\n        }\n        case '\\\\' -> {\n          foundQuote = false;\n          foundBackslash = true;\n          poundsInARow = 0;\n          if (pounds == poundsInARow) {\n            backup(pounds + 1);\n            isEscape = true;\n            return;\n          }\n        }\n        case '#' -> {\n          poundsInARow++;\n          if (foundQuote && (pounds == poundsInARow)) {\n            backup(pounds + 1);\n            stringEnded = true;\n            return;\n          }\n          if (foundBackslash && pounds == poundsInARow) {\n            backup(pounds + 1);\n            isEscape = true;\n            return;\n          }\n        }\n        default -> {\n          foundQuote = false;\n          foundBackslash = false;\n          poundsInARow = 0;\n        }\n      }\n    }\n  }\n\n  private void lexMultiString(int pounds) {\n    var poundsInARow = 0;\n    var quotesInARow = 0;\n    var foundBackslash = false;\n    while (lookahead != EOF && lookahead != '\\n' && lookahead != '\\r') {\n      var ch = nextChar();\n      switch (ch) {\n        case '\"' -> {\n          quotesInARow++;\n          if (quotesInARow == 3 && pounds == 0) {\n            backup(3);\n            stringEnded = true;\n            return;\n          }\n          poundsInARow = 0;\n          foundBackslash = false;\n        }\n        case '\\\\' -> {\n          quotesInARow = 0;\n          poundsInARow = 0;\n          foundBackslash = true;\n          if (pounds == poundsInARow) {\n            backup(pounds + 1);\n            isEscape = true;\n            return;\n          }\n        }\n        case '#' -> {\n          poundsInARow++;\n          if (quotesInARow == 3 && pounds == poundsInARow) {\n            backup(pounds + 3);\n            stringEnded = true;\n            return;\n          }\n          if (foundBackslash && pounds == poundsInARow) {\n            backup(pounds + 1);\n            isEscape = true;\n            return;\n          }\n        }\n        default -> {\n          quotesInARow = 0;\n          poundsInARow = 0;\n          foundBackslash = false;\n        }\n      }\n    }\n  }\n\n  private Token lexEscape() {\n    if (lookahead == EOF) throw unexpectedEndOfFile();\n    var ch = nextChar();\n    return switch (ch) {\n      case 'n' -> Token.STRING_ESCAPE_NEWLINE;\n      case '\"' -> Token.STRING_ESCAPE_QUOTE;\n      case '\\\\' -> Token.STRING_ESCAPE_BACKSLASH;\n      case 't' -> Token.STRING_ESCAPE_TAB;\n      case 'r' -> Token.STRING_ESCAPE_RETURN;\n      case '(' -> {\n        var scope = interpolationStack.getFirst();\n        scope.parens++;\n        state = State.DEFAULT;\n        yield Token.INTERPOLATION_START;\n      }\n      case 'u' -> lexUnicodeEscape();\n      default ->\n          throw lexError(\n              ErrorMessages.create(\"invalidCharacterEscapeSequence\", \"\\\\\" + (char) ch, \"\\\\\"),\n              cursor - 2,\n              2);\n    };\n  }\n\n  private Token lexUnicodeEscape() {\n    if (lookahead != '{') {\n      throw unexpectedChar(lookahead, \"{\");\n    }\n    do {\n      nextChar();\n    } while (lookahead != '}' && lookahead != EOF && Character.isLetterOrDigit(lookahead));\n    if (lookahead == '}') {\n      // consume the close bracket\n      nextChar();\n    } else {\n      throw lexError(ErrorMessages.create(\"unterminatedUnicodeEscapeSequence\", text()), span());\n    }\n    return Token.STRING_ESCAPE_UNICODE;\n  }\n\n  private Token lexIdentifier() {\n    while (isIdentifierPart(lookahead)) {\n      nextChar();\n    }\n\n    var identifierStr = text();\n    var identifier = getKeywordOrIdentifier(identifierStr);\n    return switch (identifier) {\n      case IMPORT -> {\n        if (lookahead == '*') {\n          nextChar();\n          yield Token.IMPORT_STAR;\n        } else yield Token.IMPORT;\n      }\n      case READ ->\n          switch (lookahead) {\n            case '*' -> {\n              nextChar();\n              yield Token.READ_STAR;\n            }\n            case '?' -> {\n              nextChar();\n              yield Token.READ_QUESTION;\n            }\n            default -> Token.READ;\n          };\n      default -> identifier;\n    };\n  }\n\n  private void lexQuotedIdentifier() {\n    while (lookahead != '`' && lookahead != '\\n' && lookahead != '\\r' && lookahead != EOF) {\n      nextChar();\n    }\n    if (lookahead == '`') {\n      nextChar();\n    } else {\n      throw unexpectedChar(lookahead, \"backquote\");\n    }\n  }\n\n  private Token lexNumber(int start) {\n    if (start == '0') {\n      if (lookahead == 'x' || lookahead == 'X') {\n        nextChar();\n        lexHexNumber();\n        return Token.HEX;\n      }\n      if (lookahead == 'b' || lookahead == 'B') {\n        nextChar();\n        lexBinNumber();\n        return Token.BIN;\n      }\n      if (lookahead == 'o' || lookahead == 'O') {\n        nextChar();\n        lexOctNumber();\n        return Token.OCT;\n      }\n      if (lookahead == 'e' || lookahead == 'E') {\n        nextChar();\n        lexExponent();\n        return Token.FLOAT;\n      }\n    } else if (start == '.') {\n      lexDotNumber();\n      return Token.FLOAT;\n    }\n\n    while ((lookahead >= 48 && lookahead <= 57) || lookahead == '_') {\n      nextChar();\n    }\n\n    if (lookahead == 'e' || lookahead == 'E') {\n      nextChar();\n      lexExponent();\n      return Token.FLOAT;\n    } else if (lookahead == '.') {\n      nextChar();\n      if (lookahead == '_') {\n        throw lexError(\"invalidSeparatorPosition\");\n      }\n      if (lookahead < 48 || lookahead > 57) {\n        backup();\n        return Token.INT;\n      }\n      lexDotNumber();\n      return Token.FLOAT;\n    }\n    return Token.INT;\n  }\n\n  private Token lexSlash() {\n    switch (lookahead) {\n      case '/':\n        {\n          nextChar();\n          var token = lookahead == '/' ? Token.DOC_COMMENT : Token.LINE_COMMENT;\n          while (lookahead != '\\n' && lookahead != '\\r' && lookahead != EOF) {\n            nextChar();\n          }\n          return token;\n        }\n      case '*':\n        {\n          nextChar();\n          lexBlockComment();\n          return Token.BLOCK_COMMENT;\n        }\n      default:\n        return Token.DIV;\n    }\n  }\n\n  private void lexBlockComment() {\n    if (lookahead == EOF) throw unexpectedEndOfFile();\n    var prev = nextChar();\n    while (lookahead != EOF) {\n      if (prev == '*' && lookahead == '/') {\n        nextChar();\n        break;\n      }\n      prev = nextChar();\n    }\n    if (lookahead == EOF) throw unexpectedEndOfFile();\n  }\n\n  private void lexHexNumber() {\n    if (lookahead == '_') {\n      throw lexError(\"invalidSeparatorPosition\");\n    }\n    if (!isHex(lookahead)) {\n      throw unexpectedChar(lookahead, \"hexadecimal number\");\n    }\n    while (isHex(lookahead) || lookahead == '_') {\n      nextChar();\n    }\n  }\n\n  private void lexBinNumber() {\n    if (lookahead == '_') {\n      throw lexError(\"invalidSeparatorPosition\");\n    }\n    if (!(lookahead == '0' || lookahead == '1')) {\n      throw unexpectedChar(lookahead, \"binary number\");\n    }\n    while (lookahead == '0' || lookahead == '1' || lookahead == '_') {\n      nextChar();\n    }\n  }\n\n  private void lexOctNumber() {\n    if (lookahead == '_') {\n      throw lexError(\"invalidSeparatorPosition\");\n    }\n    var ch = lookahead;\n    if (!(ch >= 48 && ch <= 55)) {\n      throw unexpectedChar(ch, \"octal number\");\n    }\n    while ((ch >= 48 && ch <= 55) || ch == '_') {\n      nextChar();\n      ch = lookahead;\n    }\n  }\n\n  private void lexExponent() {\n    if (lookahead == '+' || lookahead == '-') {\n      nextChar();\n    }\n    if (lookahead == '_') {\n      throw lexError(\"invalidSeparatorPosition\");\n    }\n    if (lookahead < 48 || lookahead > 57) {\n      throw unexpectedChar(lookahead, \"number\");\n    }\n    while ((lookahead >= 48 && lookahead <= 57) || lookahead == '_') {\n      nextChar();\n    }\n  }\n\n  private void lexDotNumber() {\n    if (lookahead == '_') {\n      throw lexError(\"invalidSeparatorPosition\");\n    }\n    while ((lookahead >= 48 && lookahead <= 57) || lookahead == '_') {\n      nextChar();\n    }\n    if (lookahead == 'e' || lookahead == 'E') {\n      nextChar();\n      lexExponent();\n    }\n  }\n\n  private Token lexShebang() {\n    do {\n      nextChar();\n    } while (lookahead != '\\n' && lookahead != '\\r' && lookahead != EOF);\n    return Token.SHEBANG;\n  }\n\n  private boolean isHex(int code) {\n    return (code >= 48 && code <= 57) || (code >= 97 && code <= 102) || (code >= 65 && code <= 70);\n  }\n\n  private static boolean isIdentifierStart(int c) {\n    return c == '_' || c == '$' || Character.isUnicodeIdentifierStart(c);\n  }\n\n  private static boolean isIdentifierPart(int c) {\n    return c != EOF && (c == '$' || Character.isUnicodeIdentifierPart(c));\n  }\n\n  private int nextChar() {\n    var tmp = lookahead;\n    cursor++;\n    if (cursor >= size) {\n      lookahead = EOF;\n    } else {\n      lookahead = source[cursor];\n    }\n    if (tmp == '\\n') {\n      line++;\n      col = 1;\n    } else {\n      col++;\n    }\n    return tmp;\n  }\n\n  private void backup() {\n    lookahead = source[--cursor];\n    col--;\n  }\n\n  private void backup(int amount) {\n    cursor -= amount;\n    col -= amount;\n    lookahead = source[cursor];\n  }\n\n  private ParserError lexError(String msg, Object... args) {\n    var length = lookahead == EOF ? 0 : 1;\n    var index = lookahead == EOF ? cursor - 1 : cursor;\n    return new ParserError(ErrorMessages.create(msg, args), new Span(index, length));\n  }\n\n  private ParserError lexError(String msg, int charIndex, int length) {\n    return new ParserError(msg, new Span(charIndex, length));\n  }\n\n  private ParserError lexError(String msg, Span span) {\n    return new ParserError(msg, span);\n  }\n\n  private ParserError unexpectedChar(int got, String didYouMean) {\n    if (got == EOF) {\n      return unexpectedChar(\"EOF\", didYouMean);\n    }\n    return lexError(\"unexpectedCharacter\", (char) got, didYouMean);\n  }\n\n  private ParserError unexpectedChar(String got, String didYouMean) {\n    return lexError(\"unexpectedCharacter\", got, didYouMean);\n  }\n\n  private ParserError unexpectedChar(String got, String option1, String option2, String option3) {\n    return lexError(\"unexpectedCharacter3\", got, option1, option2, option3);\n  }\n\n  private ParserError unexpectedEndOfFile() {\n    return lexError(ErrorMessages.create(\"unexpectedEndOfFile\"), cursor, 0);\n  }\n\n  public static boolean isRegularIdentifier(String identifier) {\n    if (identifier.isEmpty()) return false;\n\n    if (isKeyword(identifier)) return false;\n\n    var firstCp = identifier.codePointAt(0);\n    return (firstCp == '$' || firstCp == '_' || Character.isUnicodeIdentifierStart(firstCp))\n        && identifier\n            .codePoints()\n            .skip(1)\n            .allMatch(cp -> cp == '$' || Character.isUnicodeIdentifierPart(cp));\n  }\n\n  public static String maybeQuoteIdentifier(String identifier) {\n    return isRegularIdentifier(identifier) ? identifier : \"`\" + identifier + \"`\";\n  }\n\n  private static boolean isKeyword(String text) {\n    return getKeywordOrIdentifier(text) != Token.IDENTIFIER;\n  }\n\n  private static Token getKeywordOrIdentifier(String keyword) {\n    return switch (keyword) {\n      case \"_\" -> Token.UNDERSCORE;\n      case \"abstract\" -> Token.ABSTRACT;\n      case \"amends\" -> Token.AMENDS;\n      case \"as\" -> Token.AS;\n      case \"case\" -> Token.CASE;\n      case \"class\" -> Token.CLASS;\n      case \"const\" -> Token.CONST;\n      case \"delete\" -> Token.DELETE;\n      case \"else\" -> Token.ELSE;\n      case \"extends\" -> Token.EXTENDS;\n      case \"external\" -> Token.EXTERNAL;\n      case \"false\" -> Token.FALSE;\n      case \"fixed\" -> Token.FIXED;\n      case \"for\" -> Token.FOR;\n      case \"function\" -> Token.FUNCTION;\n      case \"hidden\" -> Token.HIDDEN;\n      case \"if\" -> Token.IF;\n      case \"import\" -> Token.IMPORT;\n      case \"in\" -> Token.IN;\n      case \"is\" -> Token.IS;\n      case \"let\" -> Token.LET;\n      case \"local\" -> Token.LOCAL;\n      case \"module\" -> Token.MODULE;\n      case \"new\" -> Token.NEW;\n      case \"nothing\" -> Token.NOTHING;\n      case \"null\" -> Token.NULL;\n      case \"open\" -> Token.OPEN;\n      case \"out\" -> Token.OUT;\n      case \"outer\" -> Token.OUTER;\n      case \"override\" -> Token.OVERRIDE;\n      case \"protected\" -> Token.PROTECTED;\n      case \"read\" -> Token.READ;\n      case \"record\" -> Token.RECORD;\n      case \"super\" -> Token.SUPER;\n      case \"switch\" -> Token.SWITCH;\n      case \"this\" -> Token.THIS;\n      case \"throw\" -> Token.THROW;\n      case \"trace\" -> Token.TRACE;\n      case \"true\" -> Token.TRUE;\n      case \"typealias\" -> Token.TYPE_ALIAS;\n      case \"unknown\" -> Token.UNKNOWN;\n      case \"vararg\" -> Token.VARARG;\n      case \"when\" -> Token.WHEN;\n      default -> Token.IDENTIFIER;\n    };\n  }\n\n  private static class InterpolationScope {\n    final int quotes;\n    final int pounds;\n    int parens = 0;\n\n    protected InterpolationScope(int quotes, int pounds) {\n      this.quotes = quotes;\n      this.pounds = pounds;\n    }\n  }\n\n  private enum State {\n    DEFAULT,\n    STRING\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/Parser.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.function.Supplier;\nimport org.pkl.parser.syntax.Annotation;\nimport org.pkl.parser.syntax.ArgumentList;\nimport org.pkl.parser.syntax.Class;\nimport org.pkl.parser.syntax.ClassBody;\nimport org.pkl.parser.syntax.ClassMethod;\nimport org.pkl.parser.syntax.ClassProperty;\nimport org.pkl.parser.syntax.DocComment;\nimport org.pkl.parser.syntax.Expr;\nimport org.pkl.parser.syntax.Expr.AmendsExpr;\nimport org.pkl.parser.syntax.Expr.BinaryOperatorExpr;\nimport org.pkl.parser.syntax.Expr.BoolLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FloatLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FunctionLiteralExpr;\nimport org.pkl.parser.syntax.Expr.IfExpr;\nimport org.pkl.parser.syntax.Expr.IntLiteralExpr;\nimport org.pkl.parser.syntax.Expr.LetExpr;\nimport org.pkl.parser.syntax.Expr.LogicalNotExpr;\nimport org.pkl.parser.syntax.Expr.ModuleExpr;\nimport org.pkl.parser.syntax.Expr.MultiLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.NewExpr;\nimport org.pkl.parser.syntax.Expr.NonNullExpr;\nimport org.pkl.parser.syntax.Expr.NullLiteralExpr;\nimport org.pkl.parser.syntax.Expr.OuterExpr;\nimport org.pkl.parser.syntax.Expr.ParenthesizedExpr;\nimport org.pkl.parser.syntax.Expr.QualifiedAccessExpr;\nimport org.pkl.parser.syntax.Expr.ReadExpr;\nimport org.pkl.parser.syntax.Expr.ReadType;\nimport org.pkl.parser.syntax.Expr.SingleLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.SubscriptExpr;\nimport org.pkl.parser.syntax.Expr.SuperAccessExpr;\nimport org.pkl.parser.syntax.Expr.SuperSubscriptExpr;\nimport org.pkl.parser.syntax.Expr.ThisExpr;\nimport org.pkl.parser.syntax.Expr.ThrowExpr;\nimport org.pkl.parser.syntax.Expr.TraceExpr;\nimport org.pkl.parser.syntax.Expr.UnaryMinusExpr;\nimport org.pkl.parser.syntax.Expr.UnqualifiedAccessExpr;\nimport org.pkl.parser.syntax.ExtendsOrAmendsClause;\nimport org.pkl.parser.syntax.Identifier;\nimport org.pkl.parser.syntax.ImportClause;\nimport org.pkl.parser.syntax.Keyword;\nimport org.pkl.parser.syntax.Modifier;\nimport org.pkl.parser.syntax.Module;\nimport org.pkl.parser.syntax.ModuleDecl;\nimport org.pkl.parser.syntax.Node;\nimport org.pkl.parser.syntax.ObjectBody;\nimport org.pkl.parser.syntax.ObjectMember;\nimport org.pkl.parser.syntax.Operator;\nimport org.pkl.parser.syntax.Parameter;\nimport org.pkl.parser.syntax.Parameter.TypedIdentifier;\nimport org.pkl.parser.syntax.ParameterList;\nimport org.pkl.parser.syntax.QualifiedIdentifier;\nimport org.pkl.parser.syntax.ReplInput;\nimport org.pkl.parser.syntax.StringConstant;\nimport org.pkl.parser.syntax.StringPart;\nimport org.pkl.parser.syntax.StringPart.StringChars;\nimport org.pkl.parser.syntax.Type;\nimport org.pkl.parser.syntax.Type.DeclaredType;\nimport org.pkl.parser.syntax.Type.ParenthesizedType;\nimport org.pkl.parser.syntax.Type.StringConstantType;\nimport org.pkl.parser.syntax.TypeAlias;\nimport org.pkl.parser.syntax.TypeAnnotation;\nimport org.pkl.parser.syntax.TypeArgumentList;\nimport org.pkl.parser.syntax.TypeParameter;\nimport org.pkl.parser.syntax.TypeParameterList;\nimport org.pkl.parser.util.ErrorMessages;\nimport org.pkl.parser.util.Nullable;\n\n@SuppressWarnings(\"DuplicatedCode\")\npublic class Parser {\n\n  private Lexer lexer;\n  private Token lookahead;\n  private Span spanLookahead;\n  private boolean backtracking = false;\n  private FullToken prev;\n  private FullToken _lookahead;\n  private boolean precededBySemicolon = false;\n\n  public Parser() {}\n\n  private void init(String source) {\n    this.lexer = new Lexer(source);\n    _lookahead = forceNext();\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n  }\n\n  public Module parseModule(String source) {\n    init(source);\n    if (lookahead == Token.EOF) {\n      return new Module(Collections.singletonList(null), new Span(0, 0));\n    }\n    if (lookahead == Token.SHEBANG) next();\n    var start = spanLookahead;\n    Span end = null;\n    ModuleDecl moduleDecl;\n    var nodes = new ArrayList<Node>();\n    try {\n      var header = parseMemberHeader();\n\n      moduleDecl = parseModuleDecl(header);\n      if (moduleDecl != null) {\n        end = moduleDecl.span();\n        header = null;\n      }\n      nodes.add(moduleDecl);\n      // imports\n      while (lookahead == Token.IMPORT || lookahead == Token.IMPORT_STAR) {\n        if (header != null && header.isNotEmpty()) {\n          throw parserError(\"wrongHeaders\", \"Imports\");\n        }\n        var _import = parseImportDecl();\n        nodes.add(_import);\n        end = _import.span();\n      }\n\n      // entries\n      if (header != null && header.isNotEmpty()) {\n        end = parseModuleMember(header, nodes);\n      }\n\n      while (lookahead != Token.EOF) {\n        header = parseMemberHeader();\n        end = parseModuleMember(header, nodes);\n      }\n      return new Module(nodes, start.endWith(spanLookahead));\n    } catch (ParserError pe) {\n      var spanEnd = end != null ? end : start;\n      pe.setPartialParseResult(new Module(nodes, start.endWith(spanEnd)));\n      throw pe;\n    }\n  }\n\n  public Expr parseExpressionInput(String source) {\n    init(source);\n    var expr = parseExpr();\n    expect(Token.EOF, \"unexpectedToken\", \"end of file\");\n    return expr;\n  }\n\n  public ReplInput parseReplInput(String source) {\n    init(source);\n    var nodes = new ArrayList<Node>();\n    while (lookahead != Token.EOF) {\n      var header = parseMemberHeader();\n      switch (lookahead) {\n        case IMPORT, IMPORT_STAR -> {\n          ensureEmptyHeaders(header, \"Imports\");\n          nodes.add(parseImportDecl());\n        }\n        case MODULE, AMENDS, EXTENDS -> nodes.add(parseModuleDecl(header));\n        case CLASS -> nodes.add(parseClass(header));\n        case TYPE_ALIAS -> nodes.add(parseTypeAlias(header));\n        case FUNCTION -> nodes.add(parseClassMethod(header));\n        case IDENTIFIER -> {\n          next();\n          switch (lookahead) {\n            case COLON, ASSIGN, LBRACE -> {\n              backtrack();\n              nodes.add(parseClassProperty(header));\n            }\n            default -> {\n              backtrack();\n              ensureEmptyHeaders(header, \"Expressions\");\n              nodes.add(parseExpr());\n            }\n          }\n        }\n        default -> {\n          ensureEmptyHeaders(header, \"Expressions\");\n          nodes.add(parseExpr());\n        }\n      }\n    }\n    Span span;\n    if (nodes.isEmpty()) {\n      span = new Span(0, 0);\n    } else {\n      span = nodes.get(0).span().endWith(nodes.get(nodes.size() - 1).span());\n    }\n    return new ReplInput(nodes, span);\n  }\n\n  private @Nullable ModuleDecl parseModuleDecl(MemberHeader header) {\n    QualifiedIdentifier moduleName = null;\n    Keyword moduleKeyword = null;\n    var start = header.span();\n    Span end = null;\n    if (lookahead == Token.MODULE) {\n      var module = expect(Token.MODULE, \"unexpectedToken\", \"module\");\n      moduleKeyword = new Keyword(module.span);\n      if (start == null) {\n        start = module.span;\n      }\n      moduleName = parseQualifiedIdentifier();\n      end = moduleName.span();\n    }\n    var extendsOrAmendsDecl = parseExtendsAmendsDecl();\n    if (extendsOrAmendsDecl != null) {\n      if (start == null) {\n        start = extendsOrAmendsDecl.span();\n      }\n      end = extendsOrAmendsDecl.span();\n    }\n    if (moduleName != null || extendsOrAmendsDecl != null) {\n      var children = new ArrayList<Node>();\n      children.add(header.docComment);\n      children.addAll(header.annotations);\n      var modifiersOffset = children.size();\n      children.addAll(header.modifiers);\n      var nameOffset = children.size();\n      children.add(moduleKeyword);\n      children.add(moduleName);\n      children.add(extendsOrAmendsDecl);\n      return new ModuleDecl(children, modifiersOffset, nameOffset, start.endWith(end));\n    }\n    return null;\n  }\n\n  private QualifiedIdentifier parseQualifiedIdentifier() {\n    var idents = parseListOf(Token.DOT, this::parseIdentifier);\n    return new QualifiedIdentifier(idents);\n  }\n\n  private @Nullable ExtendsOrAmendsClause parseExtendsAmendsDecl() {\n    if (lookahead == Token.EXTENDS) {\n      var tk = next().span;\n      var url = parseStringConstant();\n      return new ExtendsOrAmendsClause(\n          url, ExtendsOrAmendsClause.Type.EXTENDS, tk.endWith(url.span()));\n    }\n    if (lookahead == Token.AMENDS) {\n      var tk = next().span;\n      var url = parseStringConstant();\n      return new ExtendsOrAmendsClause(\n          url, ExtendsOrAmendsClause.Type.AMENDS, tk.endWith(url.span()));\n    }\n    return null;\n  }\n\n  private ImportClause parseImportDecl() {\n    Span start;\n    boolean isGlob = false;\n    if (lookahead == Token.IMPORT_STAR) {\n      start = next().span;\n      isGlob = true;\n    } else {\n      start = expect(Token.IMPORT, \"unexpectedToken2\", \"import\", \"import*\").span;\n    }\n    var str = parseStringConstant();\n    var end = str.span();\n    Identifier alias = null;\n    if (lookahead == Token.AS) {\n      next();\n      alias = parseIdentifier();\n      end = alias.span();\n    }\n    return new ImportClause(str, isGlob, alias, start.endWith(end));\n  }\n\n  private MemberHeader parseMemberHeader() {\n    DocComment docComment = null;\n    var annotations = new ArrayList<Annotation>();\n    var modifiers = new ArrayList<Modifier>();\n    if (lookahead == Token.DOC_COMMENT) {\n      docComment = parseDocComment();\n    }\n    while (lookahead == Token.AT) {\n      annotations.add(parseAnnotation());\n    }\n    while (lookahead.isModifier()) {\n      modifiers.add(parseModifier());\n    }\n    return new MemberHeader(docComment, annotations, modifiers);\n  }\n\n  private DocComment parseDocComment() {\n    var spans = new ArrayList<Span>();\n    spans.add(nextComment().span);\n    while (lookahead == Token.DOC_COMMENT\n        || lookahead == Token.LINE_COMMENT\n        || lookahead == Token.BLOCK_COMMENT) {\n      var next = nextComment();\n      // newlines are not allowed in doc comments\n      if (next.newLinesBetween > 1) {\n        if (next.token == Token.DOC_COMMENT) {\n          backtrack();\n        }\n        break;\n      }\n      if (next.token == Token.DOC_COMMENT) {\n        spans.add(next.span);\n      }\n    }\n    while (lookahead == Token.LINE_COMMENT || lookahead == Token.BLOCK_COMMENT) {\n      nextComment();\n    }\n    return new DocComment(spans);\n  }\n\n  private Span parseModuleMember(MemberHeader header, List<Node> nodes) {\n    switch (lookahead) {\n      case IDENTIFIER -> {\n        var node = parseClassProperty(header);\n        nodes.add(node);\n        return node.span();\n      }\n      case TYPE_ALIAS -> {\n        var node = parseTypeAlias(header);\n        nodes.add(node);\n        return node.span();\n      }\n      case CLASS -> {\n        var node = parseClass(header);\n        nodes.add(node);\n        return node.span();\n      }\n      case FUNCTION -> {\n        var node = parseClassMethod(header);\n        nodes.add(node);\n        return node.span();\n      }\n      case EOF -> throw parserError(\"unexpectedEndOfFile\");\n      default -> {\n        if (lookahead.isKeyword()) {\n          throw parserError(\"keywordNotAllowedHere\", lookahead.text());\n        }\n        if (lookahead == Token.DOC_COMMENT) {\n          throw parserError(\"danglingDocComment\");\n        }\n        throw parserError(\"invalidTopLevelToken\");\n      }\n    }\n  }\n\n  private TypeAlias parseTypeAlias(MemberHeader header) {\n    var typeAlias = next().span;\n    var startSpan = header.span(typeAlias);\n\n    var identifier = parseIdentifier();\n    TypeParameterList typePars = null;\n    if (lookahead == Token.LT) {\n      typePars = parseTypeParameterList();\n    }\n    expect(Token.ASSIGN, \"unexpectedToken\", \"=\");\n    var type = parseType();\n    var children = new ArrayList<Node>(header.annotations.size() + header.modifiers.size() + 5);\n    children.add(header.docComment);\n    children.addAll(header.annotations);\n    var modifiersOffset = header.annotations.size() + 1;\n    children.addAll(header.modifiers);\n    var nameOffset = modifiersOffset + header.modifiers.size();\n    children.add(new Keyword(typeAlias));\n    children.add(identifier);\n    children.add(typePars);\n    children.add(type);\n    return new TypeAlias(children, modifiersOffset, nameOffset, startSpan.endWith(type.span()));\n  }\n\n  private Class parseClass(MemberHeader header) {\n    var classKeyword = next();\n    var startSpan = header.span(classKeyword.span);\n    var children = new ArrayList<Node>();\n    children.add(header.docComment);\n    children.addAll(header.annotations);\n    var modifiersOffset = header.annotations.size() + 1;\n    children.addAll(header.modifiers);\n    var nameOffset = modifiersOffset + header.modifiers.size();\n    children.add(new Keyword(classKeyword.span));\n    var name = parseIdentifier();\n    children.add(name);\n    TypeParameterList typePars = null;\n    var end = name.span();\n    if (lookahead == Token.LT) {\n      typePars = parseTypeParameterList();\n      end = typePars.span();\n    }\n    children.add(typePars);\n    Type superClass = null;\n    if (lookahead == Token.EXTENDS) {\n      next();\n      superClass = parseType();\n      end = superClass.span();\n    }\n    children.add(superClass);\n\n    ClassBody body = null;\n    if (lookahead == Token.LBRACE) {\n      body = parseClassBody();\n      end = body.span();\n    }\n    children.add(body);\n\n    return new Class(children, modifiersOffset, nameOffset, startSpan.endWith(end));\n  }\n\n  private ClassBody parseClassBody() {\n    var start = expect(Token.LBRACE, \"missingDelimiter\", \"{\").span;\n    var children = new ArrayList<Node>();\n    while (lookahead != Token.RBRACE && lookahead != Token.EOF) {\n      var entryHeader = parseMemberHeader();\n      if (lookahead == Token.FUNCTION) {\n        children.add(parseClassMethod(entryHeader));\n      } else {\n        children.add(parseClassProperty(entryHeader));\n      }\n    }\n    if (lookahead == Token.EOF) {\n      throw new ParserError(\n          ErrorMessages.create(\"missingDelimiter\", \"}\"), prev.span.stopSpan().move(1));\n    }\n    var end = expect(Token.RBRACE, \"missingDelimiter\", \"}\").span;\n    return new ClassBody(children, start.endWith(end));\n  }\n\n  private ClassProperty parseClassProperty(MemberHeader header) {\n    var name = parseIdentifier();\n    var start = header.span(name.span());\n    var children = new ArrayList<Node>();\n    children.add(header.docComment);\n    children.addAll(header.annotations);\n    var modifiersOffset = header.annotations.size() + 1;\n    children.addAll(header.modifiers);\n    var nameOffset = modifiersOffset + header.modifiers.size();\n    TypeAnnotation typeAnnotation = null;\n    Expr expr = null;\n    var bodies = new ArrayList<ObjectBody>();\n    if (lookahead == Token.COLON) {\n      typeAnnotation = parseTypeAnnotation();\n    }\n    if (lookahead == Token.ASSIGN) {\n      next();\n      expr = parseExpr();\n    } else if (lookahead == Token.LBRACE) {\n      if (typeAnnotation != null) {\n        throw parserError(\"typeAnnotationInAmends\");\n      }\n      while (lookahead == Token.LBRACE) {\n        bodies.add(parseObjectBody());\n      }\n    }\n    children.add(name);\n    children.add(typeAnnotation);\n    children.add(expr);\n    children.addAll(bodies);\n    if (expr != null) {\n      return new ClassProperty(children, modifiersOffset, nameOffset, start.endWith(expr.span()));\n    }\n    if (!bodies.isEmpty()) {\n      return new ClassProperty(\n          children,\n          modifiersOffset,\n          nameOffset,\n          start.endWith(bodies.get(bodies.size() - 1).span()));\n    }\n    if (typeAnnotation == null) {\n      throw new ParserError(ErrorMessages.create(\"invalidProperty\"), name.span());\n    }\n    return new ClassProperty(\n        children, modifiersOffset, nameOffset, start.endWith(typeAnnotation.span()));\n  }\n\n  private ClassMethod parseClassMethod(MemberHeader header) {\n    var func = expect(Token.FUNCTION, \"unexpectedToken\", \"function\").span;\n    var start = header.span(func);\n    var headerSpanStart = header.modifierSpan(func);\n    var children = new ArrayList<Node>();\n    children.add(header.docComment);\n    children.addAll(header.annotations);\n    var modifiersOffset = header.annotations.size() + 1;\n    children.addAll(header.modifiers);\n    var nameOffset = modifiersOffset + header.modifiers.size();\n    var name = parseIdentifier();\n    children.add(name);\n    TypeParameterList typePars = null;\n    if (lookahead == Token.LT) {\n      typePars = parseTypeParameterList();\n    }\n    children.add(typePars);\n    var parameterList = parseParameterList();\n    children.add(parameterList);\n    var end = parameterList.span();\n    var endHeader = end;\n    TypeAnnotation typeAnnotation = null;\n    if (lookahead == Token.COLON) {\n      typeAnnotation = parseTypeAnnotation();\n      end = typeAnnotation.span();\n      endHeader = end;\n    }\n    children.add(typeAnnotation);\n    Expr expr = null;\n    if (lookahead == Token.ASSIGN) {\n      next();\n      expr = parseExpr();\n      end = expr.span();\n    }\n    children.add(expr);\n    return new ClassMethod(\n        children,\n        modifiersOffset,\n        nameOffset,\n        headerSpanStart.endWith(endHeader),\n        start.endWith(end));\n  }\n\n  private ObjectBody parseObjectBody() {\n    var start = expect(Token.LBRACE, \"unexpectedToken\", \"{\").span;\n    List<Node> nodes = new ArrayList<>();\n    var membersOffset = -1;\n    if (lookahead == Token.RBRACE) {\n      return new ObjectBody(List.of(), 0, start.endWith(next().span));\n    } else if (lookahead == Token.UNDERSCORE) {\n      // it's a parameter\n      nodes.addAll(parseListOfParameter(Token.COMMA, Token.ARROW));\n      expect(Token.ARROW, \"unexpectedToken2\", \",\", \"->\");\n    } else if (lookahead == Token.IDENTIFIER) {\n      // not sure what it is yet\n      var identifier = parseIdentifier();\n      if (lookahead == Token.ARROW) {\n        // it's a parameter\n        next();\n        nodes.add(new TypedIdentifier(identifier, null, identifier.span()));\n      } else if (lookahead == Token.COMMA) {\n        // it's a parameter\n        backtrack();\n        nodes.addAll(parseListOfParameter(Token.COMMA, Token.ARROW));\n        expect(Token.ARROW, \"unexpectedToken2\", \",\", \"->\");\n      } else if (lookahead == Token.COLON) {\n        // still not sure\n        var colon = next().span;\n        var type = parseType();\n        var typeAnnotation = new TypeAnnotation(type, colon.endWith(type.span()));\n        if (lookahead == Token.COMMA) {\n          // it's a parameter\n          next();\n          nodes.add(\n              new TypedIdentifier(\n                  identifier, typeAnnotation, identifier.span().endWith(type.span())));\n          nodes.addAll(parseListOfParameter(Token.COMMA, Token.ARROW));\n          expect(Token.ARROW, \"unexpectedToken2\", \",\", \"->\");\n        } else if (lookahead == Token.ARROW) {\n          // it's a parameter\n          next();\n          nodes.add(\n              new TypedIdentifier(\n                  identifier, typeAnnotation, identifier.span().endWith(type.span())));\n        } else {\n          // it's a member\n          expect(Token.ASSIGN, \"unexpectedToken\", \"=\");\n          var expr = parseExpr();\n          membersOffset = 0;\n          nodes.add(\n              new ObjectMember.ObjectProperty(\n                  Arrays.asList(identifier, typeAnnotation, expr),\n                  0,\n                  identifier.span().endWith(expr.span())));\n        }\n      } else {\n        // member\n        backtrack();\n      }\n    }\n\n    if (membersOffset < 0) {\n      membersOffset = nodes.size();\n    }\n    // members\n    while (lookahead != Token.RBRACE) {\n      if (lookahead == Token.EOF) {\n        throw new ParserError(\n            ErrorMessages.create(\"missingDelimiter\", \"}\"), prev.span.stopSpan().move(1));\n      }\n      nodes.add(parseObjectMember());\n    }\n    var end = next().span;\n    return new ObjectBody(nodes, membersOffset, start.endWith(end));\n  }\n\n  private ObjectMember parseObjectMember() {\n    return switch (lookahead) {\n      case IDENTIFIER -> {\n        next();\n        if (lookahead == Token.LBRACE || lookahead == Token.COLON || lookahead == Token.ASSIGN) {\n          // it's an objectProperty\n          backtrack();\n          yield parseObjectProperty(null);\n        } else {\n          backtrack();\n          // it's an expression\n          yield parseObjectElement();\n        }\n      }\n      case FUNCTION -> parseObjectMethod(List.of());\n      case LPRED -> parseMemberPredicate();\n      case LBRACK -> parseObjectEntry();\n      case SPREAD, QSPREAD -> parseObjectSpread();\n      case WHEN -> parseWhenGenerator();\n      case FOR -> parseForGenerator();\n      case TYPE_ALIAS, CLASS ->\n          throw new ParserError(\n              ErrorMessages.create(\"missingDelimiter\", \"}\"), prev.span.stopSpan().move(1));\n      default -> {\n        var modifiers = new ArrayList<Modifier>();\n        while (lookahead.isModifier()) {\n          modifiers.add(parseModifier());\n        }\n        if (!modifiers.isEmpty()) {\n          if (lookahead == Token.FUNCTION) {\n            yield parseObjectMethod(modifiers);\n          } else {\n            yield parseObjectProperty(modifiers);\n          }\n        } else {\n          yield parseObjectElement();\n        }\n      }\n    };\n  }\n\n  private ObjectMember.ObjectElement parseObjectElement() {\n    var expr = parseExpr(\"}\");\n    return new ObjectMember.ObjectElement(expr, expr.span());\n  }\n\n  private ObjectMember parseObjectProperty(@Nullable List<Modifier> modifiers) {\n    var start = spanLookahead;\n    if (modifiers != null && !modifiers.isEmpty()) {\n      start = modifiers.get(0).span();\n    }\n    var allModifiers = modifiers;\n    if (allModifiers == null) {\n      allModifiers = parseModifierList();\n    }\n    var identifier = parseIdentifier();\n    TypeAnnotation typeAnnotation = null;\n    if (lookahead == Token.COLON) {\n      typeAnnotation = parseTypeAnnotation();\n    }\n    if (typeAnnotation != null || lookahead == Token.ASSIGN) {\n      expect(Token.ASSIGN, \"unexpectedToken\", \"=\");\n      var expr = parseExpr(\"}\");\n      var nodes = new ArrayList<Node>(allModifiers.size() + 4);\n      nodes.addAll(allModifiers);\n      nodes.add(identifier);\n      nodes.add(typeAnnotation);\n      nodes.add(expr);\n      return new ObjectMember.ObjectProperty(\n          nodes, allModifiers.size(), start.endWith(expr.span()));\n    }\n    var bodies = parseBodyList();\n    var end = bodies.get(bodies.size() - 1).span();\n    var nodes = new ArrayList<Node>(allModifiers.size() + 4);\n    nodes.addAll(allModifiers);\n    nodes.add(identifier);\n    nodes.add(null);\n    nodes.add(null);\n    nodes.addAll(bodies);\n    return new ObjectMember.ObjectProperty(nodes, allModifiers.size(), start.endWith(end));\n  }\n\n  private ObjectMember.ObjectMethod parseObjectMethod(List<Modifier> modifiers) {\n    var start = spanLookahead;\n    if (!modifiers.isEmpty()) {\n      start = modifiers.get(0).span();\n    }\n    var function = expect(Token.FUNCTION, \"unexpectedToken\", \"function\").span;\n    var identifier = parseIdentifier();\n    TypeParameterList params = null;\n    if (lookahead == Token.LT) {\n      params = parseTypeParameterList();\n    }\n    var args = parseParameterList();\n    TypeAnnotation typeAnnotation = null;\n    if (lookahead == Token.COLON) {\n      typeAnnotation = parseTypeAnnotation();\n    }\n    expect(Token.ASSIGN, \"unexpectedToken\", \"=\");\n    var expr = parseExpr(\"}\");\n    var nodes = new ArrayList<Node>(modifiers.size() + 6);\n    nodes.addAll(modifiers);\n    nodes.add(new Keyword(function));\n    nodes.add(identifier);\n    nodes.add(params);\n    nodes.add(args);\n    nodes.add(typeAnnotation);\n    nodes.add(expr);\n    return new ObjectMember.ObjectMethod(nodes, modifiers.size(), start.endWith(expr.span()));\n  }\n\n  private ObjectMember parseMemberPredicate() {\n    var start = next().span;\n    var pred = parseExpr(\"]]\");\n    var firstBrack = expect(Token.RBRACK, \"unexpectedToken\", \"]]\").span;\n    Span secondbrack;\n    if (lookahead != Token.RBRACK) {\n      var text = _lookahead.text(lexer);\n      throw new ParserError(ErrorMessages.create(\"unexpectedToken\", text, \"]]\"), firstBrack);\n    } else {\n      secondbrack = next().span;\n    }\n    if (firstBrack.charIndex() != secondbrack.charIndex() - 1) {\n      // There shouldn't be any whitespace between the first and second ']'.\n      var span = firstBrack.endWith(secondbrack);\n      var text = lexer.textFor(span.charIndex(), span.length());\n      throw new ParserError(ErrorMessages.create(\"unexpectedToken\", text, \"]]\"), firstBrack);\n    }\n    if (lookahead == Token.ASSIGN) {\n      next();\n      var expr = parseExpr(\"}\");\n      return new ObjectMember.MemberPredicate(List.of(pred, expr), start.endWith(expr.span()));\n    }\n    var bodies = parseBodyList();\n    var end = bodies.get(bodies.size() - 1).span();\n    var nodes = new ArrayList<Node>(bodies.size() + 2);\n    nodes.add(pred);\n    nodes.add(null);\n    nodes.addAll(bodies);\n    return new ObjectMember.MemberPredicate(nodes, start.endWith(end));\n  }\n\n  private ObjectMember parseObjectEntry() {\n    var start = expect(Token.LBRACK, \"unexpectedToken\", \"[\").span;\n    var key = parseExpr(\"]\");\n    expect(Token.RBRACK, \"unexpectedToken\", \"]\");\n    if (lookahead == Token.ASSIGN) {\n      next();\n      var expr = parseExpr(\"}\");\n      return new ObjectMember.ObjectEntry(List.of(key, expr), start.endWith(expr.span()));\n    }\n    var bodies = parseBodyList();\n    var end = bodies.get(bodies.size() - 1).span();\n    var nodes = new ArrayList<Node>(bodies.size() + 2);\n    nodes.add(key);\n    nodes.add(null);\n    nodes.addAll(bodies);\n    return new ObjectMember.ObjectEntry(nodes, start.endWith(end));\n  }\n\n  private ObjectMember.ObjectSpread parseObjectSpread() {\n    var start = next();\n    boolean isNullable = start.token == Token.QSPREAD;\n    var expr = parseExpr(\"}\");\n    return new ObjectMember.ObjectSpread(expr, isNullable, start.span.endWith(expr.span()));\n  }\n\n  private ObjectMember.WhenGenerator parseWhenGenerator() {\n    var start = next().span;\n    expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n    var pred = parseExpr(\")\");\n    expect(Token.RPAREN, \"unexpectedToken\", \")\");\n    var body = parseObjectBody();\n    var end = body.span();\n    ObjectBody elseBody = null;\n    if (lookahead == Token.ELSE) {\n      next();\n      elseBody = parseObjectBody();\n      end = elseBody.span();\n    }\n    return new ObjectMember.WhenGenerator(pred, body, elseBody, start.endWith(end));\n  }\n\n  private ObjectMember.ForGenerator parseForGenerator() {\n    var start = next().span;\n    expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n    var par1 = parseParameter();\n    Parameter par2 = null;\n    if (lookahead == Token.COMMA) {\n      next();\n      par2 = parseParameter();\n    }\n    expect(Token.IN, \"unexpectedToken\", \"in\");\n    var expr = parseExpr(\")\");\n    expect(Token.RPAREN, \"unexpectedToken\", \")\");\n    var body = parseObjectBody();\n    return new ObjectMember.ForGenerator(par1, par2, expr, body, start.endWith(body.span()));\n  }\n\n  private Expr parseExpr() {\n    return parseExpr(null);\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private Expr parseExpr(@Nullable String expectation) {\n    return parseExpr(expectation, 1);\n  }\n\n  private Expr parseExpr(@Nullable String expectation, int minPrecedence) {\n    var expr = parseExprAtom(expectation);\n    var op = getOperator();\n    while (op != null) {\n      if (op.getPrec() < minPrecedence) break;\n      // `-` must be in the same line as the left operand and have no semicolons inbetween\n      if (op == Operator.MINUS && (precededBySemicolon || _lookahead.newLinesBetween > 0)) break;\n\n      next(); // operator\n      switch (op) {\n        case IS -> {\n          var type = parseType();\n          expr = new Expr.TypeCheckExpr(expr, type, expr.span().endWith(type.span()));\n        }\n        case AS -> {\n          var type = parseType();\n          expr = new Expr.TypeCastExpr(expr, type, expr.span().endWith(type.span()));\n        }\n        case DOT, QDOT -> {\n          var rhs = parseIdentifier();\n          var isNullable = op == Operator.QDOT;\n          ArgumentList argumentList = null;\n          if (lookahead == Token.LPAREN\n              && !precededBySemicolon\n              && _lookahead.newLinesBetween == 0) {\n            argumentList = parseArgumentList();\n          }\n          var lastSpan = argumentList != null ? argumentList.span() : rhs.span();\n          expr =\n              new QualifiedAccessExpr(\n                  expr, rhs, isNullable, argumentList, expr.span().endWith(lastSpan));\n        }\n        default -> {\n          var nextMinPrec = op.isLeftAssoc() ? op.getPrec() + 1 : op.getPrec();\n          var rhs = parseExpr(expectation, nextMinPrec);\n          expr = new BinaryOperatorExpr(expr, rhs, op, expr.span().endWith(rhs.span()));\n        }\n      }\n      op = getOperator();\n    }\n    return expr;\n  }\n\n  private @Nullable Operator getOperator() {\n    return switch (lookahead) {\n      case POW -> Operator.POW;\n      case STAR -> Operator.MULT;\n      case DIV -> Operator.DIV;\n      case INT_DIV -> Operator.INT_DIV;\n      case MOD -> Operator.MOD;\n      case PLUS -> Operator.PLUS;\n      case MINUS -> Operator.MINUS;\n      case GT -> Operator.GT;\n      case GTE -> Operator.GTE;\n      case LT -> Operator.LT;\n      case LTE -> Operator.LTE;\n      case IS -> Operator.IS;\n      case AS -> Operator.AS;\n      case EQUAL -> Operator.EQ_EQ;\n      case NOT_EQUAL -> Operator.NOT_EQ;\n      case AND -> Operator.AND;\n      case OR -> Operator.OR;\n      case PIPE -> Operator.PIPE;\n      case COALESCE -> Operator.NULL_COALESCE;\n      case DOT -> Operator.DOT;\n      case QDOT -> Operator.QDOT;\n      default -> null;\n    };\n  }\n\n  private Expr parseExprAtom(@Nullable String expectation) {\n    var expr =\n        switch (lookahead) {\n          case THIS -> new ThisExpr(next().span);\n          case OUTER -> new OuterExpr(next().span);\n          case MODULE -> new ModuleExpr(next().span);\n          case NULL -> new NullLiteralExpr(next().span);\n          case THROW -> {\n            var start = next().span;\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var exp = parseExpr(\")\");\n            var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n            yield new ThrowExpr(exp, start.endWith(end));\n          }\n          case TRACE -> {\n            var start = next().span;\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var exp = parseExpr(\")\");\n            var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n            yield new TraceExpr(exp, start.endWith(end));\n          }\n          case IMPORT -> {\n            var start = next().span;\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var strConst = parseStringConstant();\n            var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n            yield new Expr.ImportExpr(strConst, false, start.endWith(end));\n          }\n          case IMPORT_STAR -> {\n            var start = next().span;\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var strConst = parseStringConstant();\n            var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n            yield new Expr.ImportExpr(strConst, true, start.endWith(end));\n          }\n          case READ, READ_STAR, READ_QUESTION -> {\n            var readType =\n                switch (lookahead) {\n                  case READ_QUESTION -> ReadType.NULL;\n                  case READ_STAR -> ReadType.GLOB;\n                  default -> ReadType.READ;\n                };\n            var start = next().span;\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var exp = parseExpr(\")\");\n            var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n            yield new ReadExpr(exp, readType, start.endWith(end));\n          }\n          case NEW -> {\n            var start = next().span;\n            Type type = null;\n            if (lookahead != Token.LBRACE) {\n              type = parseType(\"{\");\n            }\n            var body = parseObjectBody();\n            yield new NewExpr(type, body, start.endWith(body.span()));\n          }\n          case MINUS -> {\n            var start = next().span;\n            // calling `parseExprAtom` here and not `parseExpr` because\n            // unary minus has higher precendence than binary operators\n            var exp = parseExprAtom(expectation);\n            yield new UnaryMinusExpr(exp, start.endWith(exp.span()));\n          }\n          case NOT -> {\n            var start = next().span;\n            // calling `parseExprAtom` here and not `parseExpr` because\n            // logical not has higher precendence than binary operators\n            var exp = parseExprAtom(expectation);\n            yield new LogicalNotExpr(exp, start.endWith(exp.span()));\n          }\n          case LPAREN -> {\n            // can be function literal or parenthesized expression\n            var start = next().span;\n            yield switch (lookahead) {\n              case UNDERSCORE -> parseFunctionLiteral(start);\n              case IDENTIFIER -> parseFunctionLiteralOrParenthesized(start);\n              case RPAREN -> {\n                var endParen = next().span;\n                var paramList = new ParameterList(List.of(), start.endWith(endParen));\n                expect(Token.ARROW, \"unexpectedToken\", \"->\");\n                var exp = parseExpr(expectation);\n                yield new FunctionLiteralExpr(paramList, exp, start.endWith(exp.span()));\n              }\n              default -> {\n                // expression\n                var exp = parseExpr(\")\");\n                var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n                yield new ParenthesizedExpr(exp, start.endWith(end));\n              }\n            };\n          }\n          case SUPER -> {\n            var start = next().span;\n            if (lookahead == Token.DOT) {\n              next();\n              var identifier = parseIdentifier();\n              if (lookahead == Token.LPAREN\n                  && !precededBySemicolon\n                  && _lookahead.newLinesBetween == 0) {\n                var args = parseArgumentList();\n                yield new SuperAccessExpr(identifier, args, start.endWith(args.span()));\n              } else {\n                yield new SuperAccessExpr(identifier, null, start.endWith(identifier.span()));\n              }\n            } else {\n              expect(Token.LBRACK, \"unexpectedToken\", \"[\");\n              var exp = parseExpr(\"]\");\n              var end = expect(Token.RBRACK, \"unexpectedToken\", \"]\").span;\n              yield new SuperSubscriptExpr(exp, start.endWith(end));\n            }\n          }\n          case IF -> {\n            var start = next().span;\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var pred = parseExpr(\")\");\n            expect(Token.RPAREN, \"unexpectedToken\", \")\");\n            var then = parseExpr(\"else\");\n            expect(Token.ELSE, \"unexpectedToken\", \"else\");\n            var elseCase = parseExpr(expectation);\n            yield new IfExpr(pred, then, elseCase, start.endWith(elseCase.span()));\n          }\n          case LET -> {\n            var start = next().span();\n            expect(Token.LPAREN, \"unexpectedToken\", \"(\");\n            var param = parseParameter();\n            expect(Token.ASSIGN, \"unexpectedToken\", \"=\");\n            var bindExpr = parseExpr(\")\");\n            expect(Token.RPAREN, \"unexpectedToken\", \")\");\n            var exp = parseExpr(expectation);\n            yield new LetExpr(param, bindExpr, exp, start.endWith(exp.span()));\n          }\n          case TRUE -> new BoolLiteralExpr(true, next().span);\n          case FALSE -> new BoolLiteralExpr(false, next().span);\n          case INT, HEX, BIN, OCT -> {\n            var tk = next();\n            yield new IntLiteralExpr(tk.text(lexer), tk.span);\n          }\n          case FLOAT -> {\n            var tk = next();\n            yield new FloatLiteralExpr(tk.text(lexer), tk.span);\n          }\n          case STRING_START -> parseSingleLineStringLiteralExpr();\n          case STRING_MULTI_START -> parseMultiLineStringLiteralExpr();\n          case IDENTIFIER -> {\n            var identifier = parseIdentifier();\n            if (lookahead == Token.LPAREN\n                && !precededBySemicolon\n                && _lookahead.newLinesBetween == 0) {\n              var args = parseArgumentList();\n              yield new UnqualifiedAccessExpr(\n                  identifier, args, identifier.span().endWith(args.span()));\n            } else {\n              yield new UnqualifiedAccessExpr(identifier, null, identifier.span());\n            }\n          }\n          case EOF ->\n              throw new ParserError(\n                  ErrorMessages.create(\"unexpectedEndOfFile\"), prev.span.stopSpan().move(1));\n          default -> {\n            var text = _lookahead.text(lexer);\n            if (expectation != null) {\n              throw parserError(\"unexpectedToken\", text, expectation);\n            }\n            throw parserError(\"unexpectedTokenForExpression\", text);\n          }\n        };\n    return parseExprRest(expr);\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private Expr parseExprRest(Expr expr) {\n    // non null\n    if (lookahead == Token.NON_NULL) {\n      var end = next().span;\n      var res = new NonNullExpr(expr, expr.span().endWith(end));\n      return parseExprRest(res);\n    }\n    // amends\n    if (lookahead == Token.LBRACE) {\n      if (expr instanceof ParenthesizedExpr\n          || expr instanceof AmendsExpr\n          || expr instanceof NewExpr) {\n        var body = parseObjectBody();\n        return parseExprRest(new AmendsExpr(expr, body, expr.span().endWith(body.span())));\n      }\n      throw parserError(\"unexpectedCurlyProbablyAmendsExpression\", expr.text(lexer.getSource()));\n    }\n    // qualified access\n    if (lookahead == Token.DOT || lookahead == Token.QDOT) {\n      var isNullable = next().token == Token.QDOT;\n      var identifier = parseIdentifier();\n      ArgumentList argumentList = null;\n      if (lookahead == Token.LPAREN && !precededBySemicolon && _lookahead.newLinesBetween == 0) {\n        argumentList = parseArgumentList();\n      }\n      var lastSpan = argumentList != null ? argumentList.span() : identifier.span();\n      var res =\n          new QualifiedAccessExpr(\n              expr, identifier, isNullable, argumentList, expr.span().endWith(lastSpan));\n      return parseExprRest(res);\n    }\n    // subscript (needs to be in the same line as the expression)\n    if (lookahead == Token.LBRACK && !precededBySemicolon && _lookahead.newLinesBetween == 0) {\n      next();\n      var exp = parseExpr(\"]\");\n      var end = expect(Token.RBRACK, \"unexpectedToken\", \"]\").span;\n      var res = new SubscriptExpr(expr, exp, expr.span().endWith(end));\n      return parseExprRest(res);\n    }\n    return expr;\n  }\n\n  private Expr parseSingleLineStringLiteralExpr() {\n    var start = next();\n    var parts = new ArrayList<StringPart>();\n    var builder = new StringBuilder();\n    var startSpan = spanLookahead;\n    var end = spanLookahead;\n    while (lookahead != Token.STRING_END) {\n      switch (lookahead) {\n        case STRING_PART -> {\n          var tk = next();\n          end = tk.span;\n          builder.append(tk.text(lexer));\n        }\n        case STRING_ESCAPE_NEWLINE -> {\n          end = next().span;\n          builder.append('\\n');\n        }\n        case STRING_ESCAPE_TAB -> {\n          end = next().span;\n          builder.append('\\t');\n        }\n        case STRING_ESCAPE_QUOTE -> {\n          end = next().span;\n          builder.append('\"');\n        }\n        case STRING_ESCAPE_BACKSLASH -> {\n          end = next().span;\n          builder.append('\\\\');\n        }\n        case STRING_ESCAPE_RETURN -> {\n          end = next().span;\n          builder.append('\\r');\n        }\n        case STRING_ESCAPE_UNICODE -> {\n          var tk = next();\n          end = tk.span;\n          builder.append(parseUnicodeEscape(tk));\n        }\n        case INTERPOLATION_START -> {\n          var istart = next().span;\n          if (!builder.isEmpty()) {\n            assert startSpan != null;\n            parts.add(new StringChars(builder.toString(), startSpan.endWith(end)));\n            builder = new StringBuilder();\n          }\n          var exp = parseExpr(\")\");\n          end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n          parts.add(new StringPart.StringInterpolation(exp, istart.endWith(end)));\n          startSpan = spanLookahead;\n        }\n        case EOF -> {\n          var delimiter = new StringBuilder(start.text(lexer)).reverse().toString();\n          throw parserError(\"missingDelimiter\", delimiter);\n        }\n      }\n    }\n    if (!builder.isEmpty()) {\n      parts.add(new StringChars(builder.toString(), startSpan.endWith(end)));\n    }\n    end = next().span;\n    return new SingleLineStringLiteralExpr(parts, start.span, end, start.span.endWith(end));\n  }\n\n  private Expr parseMultiLineStringLiteralExpr() {\n    var start = next();\n    var stringTokens = new ArrayList<TempNode>();\n    while (lookahead != Token.STRING_END) {\n      switch (lookahead) {\n        case STRING_PART,\n            STRING_NEWLINE,\n            STRING_ESCAPE_NEWLINE,\n            STRING_ESCAPE_TAB,\n            STRING_ESCAPE_QUOTE,\n            STRING_ESCAPE_BACKSLASH,\n            STRING_ESCAPE_RETURN,\n            STRING_ESCAPE_UNICODE ->\n            stringTokens.add(new TempNode(next(), null));\n        case INTERPOLATION_START -> {\n          var istart = next();\n          var exp = parseExpr(\")\");\n          var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n          var interpolation = new StringPart.StringInterpolation(exp, istart.span.endWith(end));\n          stringTokens.add(new TempNode(null, interpolation));\n        }\n        case EOF -> {\n          var delimiter = new StringBuilder(start.text(lexer)).reverse().toString();\n          throw parserError(\"missingDelimiter\", delimiter);\n        }\n      }\n    }\n    var end = next().span;\n    var fullSpan = start.span.endWith(end);\n    var parts = validateMultiLineString(stringTokens, fullSpan);\n    return new MultiLineStringLiteralExpr(parts, start.span, end, fullSpan);\n  }\n\n  private List<StringPart> validateMultiLineString(List<TempNode> nodes, Span span) {\n    var firstNode = nodes.isEmpty() ? null : nodes.get(0);\n    if (firstNode == null\n        || firstNode.token == null\n        || firstNode.token.token != Token.STRING_NEWLINE) {\n      var errorSpan = firstNode == null ? span : firstNode.span();\n      throw new ParserError(ErrorMessages.create(\"stringContentMustBeginOnNewLine\"), errorSpan);\n    }\n    // only contains a newline\n    if (nodes.size() == 1) {\n      return List.of(new StringChars(\"\", firstNode.span()));\n    }\n    var indent = getCommonIndent(nodes, span);\n    return renderString(nodes, indent);\n  }\n\n  @SuppressWarnings(\"DataFlowIssue\")\n  private List<StringPart> renderString(List<TempNode> nodes, String commonIndent) {\n    var parts = new ArrayList<StringPart>();\n    var builder = new StringBuilder();\n    var endOffset = nodes.get(nodes.size() - 1).token.token == Token.STRING_NEWLINE ? 1 : 2;\n    var isNewLine = true;\n    Span start = null;\n    Span end = null;\n    for (var i = 1; i < nodes.size() - endOffset; i++) {\n      var node = nodes.get(i);\n      if (node.node != null) {\n        if (!builder.isEmpty()) {\n          parts.add(new StringChars(builder.toString(), start.endWith(end)));\n          builder = new StringBuilder();\n          start = null;\n        }\n        parts.add(node.node);\n      } else {\n        var token = node.token;\n        assert token != null;\n        if (start == null) {\n          start = token.span;\n        }\n        end = token.span;\n        switch (token.token) {\n          case STRING_NEWLINE -> {\n            builder.append('\\n');\n            isNewLine = true;\n          }\n          case STRING_PART -> {\n            var text = token.text(lexer);\n            if (isNewLine) {\n              if (text.startsWith(commonIndent)) {\n                builder.append(text, commonIndent.length(), text.length());\n              } else {\n                var actualIndent = getLeadingIndentCount(text);\n                var textSpan = token.span.move(actualIndent).grow(-actualIndent);\n                throw new ParserError(\n                    ErrorMessages.create(\"stringIndentationMustMatchLastLine\"), textSpan);\n              }\n            } else {\n              builder.append(text);\n            }\n            isNewLine = false;\n          }\n          default -> {\n            if (isNewLine && !commonIndent.isEmpty()) {\n              throw new ParserError(\n                  ErrorMessages.create(\"stringIndentationMustMatchLastLine\"), token.span);\n            }\n            builder.append(getEscapeText(token));\n            isNewLine = false;\n          }\n        }\n      }\n    }\n    if (!builder.isEmpty()) {\n      parts.add(new StringChars(builder.toString(), start.endWith(end)));\n    }\n    return parts;\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  private Expr parseFunctionLiteralOrParenthesized(Span start) {\n    var identifier = parseIdentifier();\n    return switch (lookahead) {\n      case COMMA -> {\n        next();\n        var params = new ArrayList<Parameter>();\n        params.add(new TypedIdentifier(identifier, null, identifier.span()));\n        params.addAll(parseListOfParameter(Token.COMMA, Token.RPAREN));\n        var endParen = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n        var paramList = new ParameterList(params, start.endWith(endParen));\n        expect(Token.ARROW, \"unexpectedToken\", \"->\");\n        var expr = parseExpr();\n        yield new FunctionLiteralExpr(paramList, expr, start.endWith(expr.span()));\n      }\n      case COLON -> {\n        var typeAnnotation = parseTypeAnnotation();\n        var params = new ArrayList<Parameter>();\n        params.add(\n            new TypedIdentifier(\n                identifier, typeAnnotation, identifier.span().endWith(typeAnnotation.span())));\n        if (lookahead == Token.COMMA) {\n          next();\n          params.addAll(parseListOfParameter(Token.COMMA, Token.RPAREN));\n        }\n        var endParen = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n        var paramList = new ParameterList(params, start.endWith(endParen));\n        expect(Token.ARROW, \"unexpectedToken\", \"->\");\n        var expr = parseExpr(\")\");\n        yield new FunctionLiteralExpr(paramList, expr, start.endWith(expr.span()));\n      }\n      case RPAREN -> {\n        // still not sure\n        var end = next().span;\n        if (lookahead == Token.ARROW) {\n          next();\n          var expr = parseExpr();\n          var params = new ArrayList<Parameter>();\n          params.add(new TypedIdentifier(identifier, null, identifier.span()));\n          var paramList = new ParameterList(params, start.endWith(end));\n          yield new FunctionLiteralExpr(paramList, expr, start.endWith(expr.span()));\n        } else {\n          var exp = new UnqualifiedAccessExpr(identifier, null, identifier.span());\n          yield new ParenthesizedExpr(exp, start.endWith(end));\n        }\n      }\n      default -> {\n        // this is an expression\n        backtrack();\n        var expr = parseExpr(\")\");\n        var end = expect(Token.RPAREN, \"unexpectedToken\", \")\").span;\n        yield new ParenthesizedExpr(expr, start.endWith(end));\n      }\n    };\n  }\n\n  private FunctionLiteralExpr parseFunctionLiteral(Span start) {\n    // the open parens is already parsed\n    var params = parseListOfParameter(Token.COMMA, Token.RPAREN);\n    var endParen = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n    var paramList = new ParameterList(params, start.endWith(endParen));\n    expect(Token.ARROW, \"unexpectedToken\", \"->\");\n    var expr = parseExpr();\n    return new FunctionLiteralExpr(paramList, expr, start.endWith(expr.span()));\n  }\n\n  private Type parseType() {\n    return parseType(null);\n  }\n\n  private Type parseType(@Nullable String expectation) {\n    var defaultIndex = -1;\n    Span start = null;\n    if (lookahead == Token.STAR) {\n      defaultIndex = 0;\n      start = next().span;\n    }\n    var first = parseTypeAtom(expectation);\n    if (start == null) {\n      start = first.span();\n    }\n\n    if (lookahead != Token.UNION) {\n      if (defaultIndex == 0) {\n        throw new ParserError(ErrorMessages.create(\"notAUnion\"), start.endWith(first.span()));\n      }\n      return first;\n    }\n\n    var types = new ArrayList<Type>();\n    types.add(first);\n    var end = start;\n    var i = 1;\n    while (lookahead == Token.UNION) {\n      next();\n      if (lookahead == Token.STAR) {\n        if (defaultIndex != -1) {\n          throw parserError(\"multipleUnionDefaults\");\n        }\n        defaultIndex = i;\n        next();\n      }\n      var type = parseTypeAtom(expectation);\n      types.add(type);\n      end = type.span();\n      i++;\n    }\n    return new Type.UnionType(types, defaultIndex, start.endWith(end));\n  }\n\n  private Type parseTypeAtom(@Nullable String expectation) {\n    Type typ;\n    switch (lookahead) {\n      case UNKNOWN -> typ = new Type.UnknownType(next().span);\n      case NOTHING -> typ = new Type.NothingType(next().span);\n      case MODULE -> typ = new Type.ModuleType(next().span);\n      case LPAREN -> {\n        var tk = next();\n        var children = new ArrayList<Node>();\n        Span end;\n        if (lookahead == Token.RPAREN) {\n          end = next().span;\n        } else {\n          children.addAll(parseListOf(Token.COMMA, Token.RPAREN, () -> parseType(\")\")));\n          end = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n        }\n        if (lookahead == Token.ARROW || children.size() > 1) {\n          expect(Token.ARROW, \"unexpectedToken\", \"->\");\n          var ret = parseType(expectation);\n          children.add(ret);\n          typ = new Type.FunctionType(children, tk.span.endWith(ret.span()));\n        } else {\n          if (children.isEmpty()) {\n            throw new ParserError(ErrorMessages.create(\"unexpectedTokenForType\", \")\"), end);\n          }\n          typ = new ParenthesizedType((Type) children.get(0), tk.span.endWith(end));\n        }\n      }\n      case IDENTIFIER -> {\n        var start = spanLookahead;\n        var name = parseQualifiedIdentifier();\n        var end = name.span();\n        TypeArgumentList typeArgumentList = null;\n        if (lookahead == Token.LT) {\n          typeArgumentList = parseTypeArgumentList();\n          end = typeArgumentList.span();\n        }\n        typ = new DeclaredType(name, typeArgumentList, start.endWith(end));\n      }\n      case STRING_START -> {\n        var str = parseStringConstant();\n        typ = new StringConstantType(str, str.span());\n      }\n      default -> {\n        var text = _lookahead.text(lexer);\n        if (expectation != null) {\n          throw parserError(\"unexpectedTokenForType2\", text, expectation);\n        }\n        throw parserError(\"unexpectedTokenForType\", text);\n      }\n    }\n\n    if (typ instanceof Type.FunctionType) return typ;\n    return parseTypeEnd(typ);\n  }\n\n  private Type parseTypeEnd(Type type) {\n    // nullable types\n    if (lookahead == Token.QUESTION) {\n      var end = spanLookahead;\n      next();\n      var res = new Type.NullableType(type, type.span().endWith(end));\n      return parseTypeEnd(res);\n    }\n    // constrained types: have to start in the same line as the type\n    if (lookahead == Token.LPAREN && !precededBySemicolon && _lookahead.newLinesBetween == 0) {\n      next();\n      var constraints = parseListOf(Token.COMMA, Token.RPAREN, () -> parseExpr(\")\"));\n      var end = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n      var children = new ArrayList<Node>(constraints.size() + 1);\n      children.add(type);\n      children.addAll(constraints);\n      var res = new Type.ConstrainedType(children, type.span().endWith(end));\n      return parseTypeEnd(res);\n    }\n    return type;\n  }\n\n  private Annotation parseAnnotation() {\n    var start = next().span;\n    var children = new ArrayList<Node>(2);\n    var type = parseType();\n    children.add(type);\n    ObjectBody body = null;\n    var end = type.span();\n    if (lookahead == Token.LBRACE) {\n      body = parseObjectBody();\n      end = body.span();\n    }\n    children.add(body);\n    return new Annotation(children, start.endWith(end));\n  }\n\n  private Parameter parseParameter() {\n    if (lookahead == Token.UNDERSCORE) {\n      var span = next().span;\n      return new Parameter.Underscore(span);\n    }\n    return parseTypedIdentifier();\n  }\n\n  private Modifier parseModifier() {\n    return switch (lookahead) {\n      case EXTERNAL -> new Modifier(Modifier.ModifierValue.EXTERNAL, next().span);\n      case ABSTRACT -> new Modifier(Modifier.ModifierValue.ABSTRACT, next().span);\n      case OPEN -> new Modifier(Modifier.ModifierValue.OPEN, next().span);\n      case LOCAL -> new Modifier(Modifier.ModifierValue.LOCAL, next().span);\n      case HIDDEN -> new Modifier(Modifier.ModifierValue.HIDDEN, next().span);\n      case FIXED -> new Modifier(Modifier.ModifierValue.FIXED, next().span);\n      case CONST -> new Modifier(Modifier.ModifierValue.CONST, next().span);\n      default -> throw new RuntimeException(\"Unreacheable code\");\n    };\n  }\n\n  private List<Modifier> parseModifierList() {\n    var modifiers = new ArrayList<Modifier>();\n    while (lookahead.isModifier()) {\n      modifiers.add(parseModifier());\n    }\n    return modifiers;\n  }\n\n  private ParameterList parseParameterList() {\n    var start = expect(Token.LPAREN, \"unexpectedToken\", \"(\").span;\n    Span end;\n    List<Parameter> args = new ArrayList<>();\n    if (lookahead == Token.RPAREN) {\n      end = next().span;\n    } else {\n      args = parseListOfParameter(Token.COMMA, Token.RPAREN);\n      end = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n    }\n    return new ParameterList(args, start.endWith(end));\n  }\n\n  private List<ObjectBody> parseBodyList() {\n    if (lookahead != Token.LBRACE) {\n      throw parserError(\"unexpectedToken2\", _lookahead.text(lexer), \"{\", \"=\");\n    }\n    var bodies = new ArrayList<ObjectBody>();\n    do {\n      bodies.add(parseObjectBody());\n    } while (lookahead == Token.LBRACE);\n    return bodies;\n  }\n\n  private TypeParameterList parseTypeParameterList() {\n    var start = expect(Token.LT, \"unexpectedToken\", \"<\").span;\n    var pars = parseListOf(Token.COMMA, Token.GT, this::parseTypeParameter);\n    var end = expect(Token.GT, \"unexpectedToken2\", \",\", \">\").span;\n    return new TypeParameterList(pars, start.endWith(end));\n  }\n\n  private TypeArgumentList parseTypeArgumentList() {\n    var start = expect(Token.LT, \"unexpectedToken\", \"<\").span;\n    var pars = parseListOf(Token.COMMA, Token.GT, this::parseType);\n    var end = expect(Token.GT, \"unexpectedToken2\", \",\", \">\").span;\n    return new TypeArgumentList(pars, start.endWith(end));\n  }\n\n  private ArgumentList parseArgumentList() {\n    var start = expect(Token.LPAREN, \"unexpectedToken\", \"(\").span;\n    if (lookahead == Token.RPAREN) {\n      return new ArgumentList(new ArrayList<>(), start.endWith(next().span));\n    }\n    var exprs = parseListOf(Token.COMMA, Token.RPAREN, this::parseExpr);\n    var end = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n    return new ArgumentList(exprs, start.endWith(end));\n  }\n\n  private TypeParameter parseTypeParameter() {\n    TypeParameter.Variance variance = null;\n    var start = spanLookahead;\n    if (lookahead == Token.IN) {\n      next();\n      variance = TypeParameter.Variance.IN;\n    } else if (lookahead == Token.OUT) {\n      next();\n      variance = TypeParameter.Variance.OUT;\n    }\n    var identifier = parseIdentifier();\n    return new TypeParameter(variance, identifier, start.endWith(identifier.span()));\n  }\n\n  private TypedIdentifier parseTypedIdentifier() {\n    var identifier = parseIdentifier();\n    TypeAnnotation typeAnnotation = null;\n    var end = identifier.span();\n    if (lookahead == Token.COLON) {\n      typeAnnotation = parseTypeAnnotation();\n      end = typeAnnotation.span();\n    }\n    return new TypedIdentifier(identifier, typeAnnotation, identifier.span().endWith(end));\n  }\n\n  private TypeAnnotation parseTypeAnnotation() {\n    var start = expect(Token.COLON, \"unexpectedToken\", \":\").span;\n    var type = parseType();\n    return new TypeAnnotation(type, start.endWith(type.span()));\n  }\n\n  private Identifier parseIdentifier() {\n    if (lookahead != Token.IDENTIFIER) {\n      if (lookahead.isKeyword()) {\n        throw parserError(\"keywordNotAllowedHere\", lookahead.text());\n      }\n      throw parserError(\"unexpectedToken\", _lookahead.text(lexer), \"identifier\");\n    }\n    var tk = next();\n    var text = tk.text(lexer);\n    return new Identifier(text, tk.span);\n  }\n\n  private StringConstant parseStringConstant() {\n    var start = spanLookahead;\n    var startTk = expect(Token.STRING_START, \"unexpectedToken\", \"\\\"\");\n    var builder = new StringBuilder();\n    while (lookahead != Token.STRING_END) {\n      switch (lookahead) {\n        case STRING_PART -> builder.append(next().text(lexer));\n        case STRING_ESCAPE_NEWLINE -> {\n          next();\n          builder.append('\\n');\n        }\n        case STRING_ESCAPE_TAB -> {\n          next();\n          builder.append('\\t');\n        }\n        case STRING_ESCAPE_QUOTE -> {\n          next();\n          builder.append('\"');\n        }\n        case STRING_ESCAPE_BACKSLASH -> {\n          next();\n          builder.append('\\\\');\n        }\n        case STRING_ESCAPE_RETURN -> {\n          next();\n          builder.append('\\r');\n        }\n        case STRING_ESCAPE_UNICODE -> builder.append(parseUnicodeEscape(next()));\n        case EOF -> {\n          var delimiter = new StringBuilder(startTk.text(lexer)).reverse().toString();\n          throw parserError(\"missingDelimiter\", delimiter);\n        }\n        case INTERPOLATION_START -> throw parserError(\"interpolationInConstant\");\n        // the lexer makes sure we only get the above tokens inside a string\n        default -> throw new RuntimeException(\"Unreacheable code\");\n      }\n    }\n    var end = next().span;\n    return new StringConstant(builder.toString(), start.endWith(end));\n  }\n\n  private String getEscapeText(FullToken tk) {\n    return switch (tk.token) {\n      case STRING_ESCAPE_NEWLINE -> \"\\n\";\n      case STRING_ESCAPE_QUOTE -> \"\\\"\";\n      case STRING_ESCAPE_BACKSLASH -> \"\\\\\";\n      case STRING_ESCAPE_TAB -> \"\\t\";\n      case STRING_ESCAPE_RETURN -> \"\\r\";\n      case STRING_ESCAPE_UNICODE -> parseUnicodeEscape(tk);\n      default -> throw new RuntimeException(\"Unreacheable code\");\n    };\n  }\n\n  private String parseUnicodeEscape(FullToken tk) {\n    var text = tk.text(lexer);\n    var lastIndex = text.length() - 1;\n    var startIndex = text.indexOf('{', 2);\n    try {\n      var codepoint = Integer.parseInt(text.substring(startIndex + 1, lastIndex), 16);\n      return Character.toString(codepoint);\n    } catch (NumberFormatException e) {\n      throw new ParserError(\n          ErrorMessages.create(\"invalidUnicodeEscapeSequence\", text, text.substring(0, startIndex)),\n          tk.span);\n    }\n  }\n\n  private String getCommonIndent(List<TempNode> nodes, Span span) {\n    var lastNode = nodes.get(nodes.size() - 1);\n    if (lastNode.token == null) {\n      throw new ParserError(\n          ErrorMessages.create(\"closingStringDelimiterMustBeginOnNewLine\"), lastNode.span());\n    }\n    if (lastNode.token.token == Token.STRING_NEWLINE) return \"\";\n    var beforeLast = nodes.get(nodes.size() - 2);\n    if (beforeLast.token != null && beforeLast.token.token == Token.STRING_NEWLINE) {\n      var indent = getTrailingIndent(lastNode);\n      if (indent != null) {\n        return indent;\n      }\n    }\n    throw new ParserError(ErrorMessages.create(\"closingStringDelimiterMustBeginOnNewLine\"), span);\n  }\n\n  private @Nullable String getTrailingIndent(TempNode node) {\n    var token = node.token;\n    if (token == null || token.token != Token.STRING_PART) return null;\n    var text = token.text(lexer);\n    for (var i = 0; i < text.length(); i++) {\n      var ch = text.charAt(i);\n      if (ch != ' ' && ch != '\\t') return null;\n    }\n    return text;\n  }\n\n  private int getLeadingIndentCount(String text) {\n    if (text.isEmpty()) return 0;\n    for (var i = 0; i < text.length(); i++) {\n      var ch = text.charAt(i);\n      if (ch != ' ' && ch != '\\t') {\n        return i;\n      }\n    }\n    return text.length();\n  }\n\n  private record TempNode(\n      @Nullable FullToken token, @Nullable StringPart.StringInterpolation node) {\n    Span span() {\n      if (token != null) return token.span;\n      assert node != null;\n      return node.span();\n    }\n  }\n\n  private FullToken expect(Token type, String errorKey, Object... messageArgs) {\n    if (lookahead != type) {\n      var span = spanLookahead;\n      if (lookahead == Token.EOF || _lookahead.newLinesBetween > 0) {\n        // don't point at the EOF or the next line, but at the end of the last token\n        span = prev.span.stopSpan().move(1);\n      }\n      var args = messageArgs;\n      if (errorKey.startsWith(\"unexpectedToken\")) {\n        args = new Object[messageArgs.length + 1];\n        args[0] = lookahead == Token.EOF ? \"EOF\" : _lookahead.text(lexer);\n        System.arraycopy(messageArgs, 0, args, 1, messageArgs.length);\n      }\n      throw new ParserError(ErrorMessages.create(errorKey, args), span);\n    }\n    return next();\n  }\n\n  private <T> List<T> parseListOf(Token separator, Supplier<T> parser) {\n    var res = new ArrayList<T>();\n    res.add(parser.get());\n    while (lookahead == separator) {\n      next();\n      res.add(parser.get());\n    }\n    return res;\n  }\n\n  private <T> List<T> parseListOf(Token separator, Token terminator, Supplier<T> parser) {\n    var res = new ArrayList<T>();\n    res.add(parser.get());\n    while (lookahead == separator) {\n      next();\n      if (lookahead == terminator) {\n        break;\n      }\n      res.add(parser.get());\n    }\n    return res;\n  }\n\n  private List<Parameter> parseListOfParameter(Token separator, Token terminator) {\n    var res = new ArrayList<Parameter>();\n    if (lookahead == terminator) {\n      return res;\n    }\n\n    res.add(parseParameter());\n    while (lookahead == separator) {\n      next();\n      if (lookahead == terminator) {\n        break;\n      }\n      res.add(parseParameter());\n    }\n    return res;\n  }\n\n  private ParserError parserError(String messageKey, Object... args) {\n    return new ParserError(ErrorMessages.create(messageKey, args), spanLookahead);\n  }\n\n  private record MemberHeader(\n      @Nullable DocComment docComment, List<Annotation> annotations, List<Modifier> modifiers) {\n    boolean isNotEmpty() {\n      return !(docComment == null && annotations.isEmpty() && modifiers.isEmpty());\n    }\n\n    @SuppressWarnings(\"DataFlowIssue\")\n    @Nullable\n    Span span() {\n      return span(null);\n    }\n\n    Span span(Span or) {\n      if (docComment != null) {\n        return docComment.span();\n      }\n      if (!annotations().isEmpty()) {\n        return annotations.get(0).span();\n      }\n      if (!modifiers().isEmpty()) {\n        return modifiers.get(0).span();\n      }\n      return or;\n    }\n\n    Span modifierSpan(Span or) {\n      if (!modifiers.isEmpty()) {\n        return modifiers.get(0).span();\n      }\n      return or;\n    }\n  }\n\n  private FullToken next() {\n    if (backtracking) {\n      backtracking = false;\n      lookahead = _lookahead.token;\n      spanLookahead = _lookahead.span;\n      return prev;\n    }\n    prev = _lookahead;\n    _lookahead = forceNext();\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n    return prev;\n  }\n\n  private FullToken forceNext() {\n    var tk = lexer.next();\n    precededBySemicolon = false;\n    var newLines = lexer.newLinesBetween;\n    while (tk.isAffix()) {\n      precededBySemicolon = precededBySemicolon || tk == Token.SEMICOLON;\n      tk = lexer.next();\n      newLines += lexer.newLinesBetween;\n    }\n    return new FullToken(tk, lexer.span(), newLines);\n  }\n\n  // Like next, but don't ignore comments\n  private FullToken nextComment() {\n    prev = _lookahead;\n    _lookahead = forceNextComment();\n    lookahead = _lookahead.token;\n    spanLookahead = _lookahead.span;\n    return prev;\n  }\n\n  private FullToken forceNextComment() {\n    var tk = lexer.next();\n    precededBySemicolon = false;\n    while (tk == Token.SEMICOLON) {\n      precededBySemicolon = true;\n      tk = lexer.next();\n    }\n    return new FullToken(tk, lexer.span(), lexer.newLinesBetween);\n  }\n\n  /**\n   * Backtrack to the previous token.\n   *\n   * <p>Can only backtrack one token.\n   */\n  private void backtrack() {\n    assert !backtracking;\n    lookahead = prev.token;\n    spanLookahead = prev.span;\n    backtracking = true;\n  }\n\n  private void ensureEmptyHeaders(MemberHeader header, String messageArg) {\n    if (header.isNotEmpty()) {\n      throw new ParserError(\n          ErrorMessages.create(\"wrongHeaders\", messageArg), header.span(spanLookahead));\n    }\n  }\n\n  private record FullToken(Token token, Span span, int newLinesBetween) {\n    String text(Lexer lexer) {\n      return lexer.textFor(span.charIndex(), span.length());\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/ParserError.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport org.pkl.parser.syntax.Module;\nimport org.pkl.parser.util.Nullable;\n\npublic class ParserError extends RuntimeException {\n  private final Span span;\n  private @Nullable Module partialParseResult;\n\n  public ParserError(String msg, Span span) {\n    super(msg);\n    this.span = span;\n  }\n\n  public Span span() {\n    return span;\n  }\n\n  public void setPartialParseResult(@Nullable Module partialParseResult) {\n    this.partialParseResult = partialParseResult;\n  }\n\n  public @Nullable Module getPartialParseResult() {\n    return partialParseResult;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/ParserVisitor.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\nimport org.pkl.parser.syntax.Annotation;\nimport org.pkl.parser.syntax.ArgumentList;\nimport org.pkl.parser.syntax.Class;\nimport org.pkl.parser.syntax.ClassBody;\nimport org.pkl.parser.syntax.ClassMethod;\nimport org.pkl.parser.syntax.ClassProperty;\nimport org.pkl.parser.syntax.DocComment;\nimport org.pkl.parser.syntax.Expr;\nimport org.pkl.parser.syntax.Expr.AmendsExpr;\nimport org.pkl.parser.syntax.Expr.BinaryOperatorExpr;\nimport org.pkl.parser.syntax.Expr.BoolLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FloatLiteralExpr;\nimport org.pkl.parser.syntax.Expr.FunctionLiteralExpr;\nimport org.pkl.parser.syntax.Expr.IfExpr;\nimport org.pkl.parser.syntax.Expr.IntLiteralExpr;\nimport org.pkl.parser.syntax.Expr.LetExpr;\nimport org.pkl.parser.syntax.Expr.LogicalNotExpr;\nimport org.pkl.parser.syntax.Expr.ModuleExpr;\nimport org.pkl.parser.syntax.Expr.MultiLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.NewExpr;\nimport org.pkl.parser.syntax.Expr.NonNullExpr;\nimport org.pkl.parser.syntax.Expr.NullLiteralExpr;\nimport org.pkl.parser.syntax.Expr.OuterExpr;\nimport org.pkl.parser.syntax.Expr.ParenthesizedExpr;\nimport org.pkl.parser.syntax.Expr.QualifiedAccessExpr;\nimport org.pkl.parser.syntax.Expr.ReadExpr;\nimport org.pkl.parser.syntax.Expr.SingleLineStringLiteralExpr;\nimport org.pkl.parser.syntax.Expr.SubscriptExpr;\nimport org.pkl.parser.syntax.Expr.SuperAccessExpr;\nimport org.pkl.parser.syntax.Expr.SuperSubscriptExpr;\nimport org.pkl.parser.syntax.Expr.ThisExpr;\nimport org.pkl.parser.syntax.Expr.ThrowExpr;\nimport org.pkl.parser.syntax.Expr.TraceExpr;\nimport org.pkl.parser.syntax.Expr.TypeCastExpr;\nimport org.pkl.parser.syntax.Expr.TypeCheckExpr;\nimport org.pkl.parser.syntax.Expr.UnaryMinusExpr;\nimport org.pkl.parser.syntax.Expr.UnqualifiedAccessExpr;\nimport org.pkl.parser.syntax.ExtendsOrAmendsClause;\nimport org.pkl.parser.syntax.Identifier;\nimport org.pkl.parser.syntax.ImportClause;\nimport org.pkl.parser.syntax.Keyword;\nimport org.pkl.parser.syntax.Modifier;\nimport org.pkl.parser.syntax.Module;\nimport org.pkl.parser.syntax.ModuleDecl;\nimport org.pkl.parser.syntax.ObjectBody;\nimport org.pkl.parser.syntax.ObjectMember;\nimport org.pkl.parser.syntax.Parameter;\nimport org.pkl.parser.syntax.ParameterList;\nimport org.pkl.parser.syntax.QualifiedIdentifier;\nimport org.pkl.parser.syntax.ReplInput;\nimport org.pkl.parser.syntax.StringConstant;\nimport org.pkl.parser.syntax.StringPart;\nimport org.pkl.parser.syntax.Type;\nimport org.pkl.parser.syntax.TypeAlias;\nimport org.pkl.parser.syntax.TypeAnnotation;\nimport org.pkl.parser.syntax.TypeArgumentList;\nimport org.pkl.parser.syntax.TypeParameter;\nimport org.pkl.parser.syntax.TypeParameterList;\n\npublic interface ParserVisitor<Result> {\n\n  Result visitUnknownType(Type.UnknownType type);\n\n  Result visitNothingType(Type.NothingType type);\n\n  Result visitModuleType(Type.ModuleType type);\n\n  Result visitStringConstantType(Type.StringConstantType type);\n\n  Result visitDeclaredType(Type.DeclaredType type);\n\n  Result visitParenthesizedType(Type.ParenthesizedType type);\n\n  Result visitNullableType(Type.NullableType type);\n\n  Result visitConstrainedType(Type.ConstrainedType type);\n\n  Result visitUnionType(Type.UnionType type);\n\n  Result visitFunctionType(Type.FunctionType type);\n\n  Result visitThisExpr(ThisExpr expr);\n\n  Result visitOuterExpr(OuterExpr expr);\n\n  Result visitModuleExpr(ModuleExpr expr);\n\n  Result visitNullLiteralExpr(NullLiteralExpr expr);\n\n  Result visitBoolLiteralExpr(BoolLiteralExpr expr);\n\n  Result visitIntLiteralExpr(IntLiteralExpr expr);\n\n  Result visitFloatLiteralExpr(FloatLiteralExpr expr);\n\n  Result visitThrowExpr(ThrowExpr expr);\n\n  Result visitTraceExpr(TraceExpr expr);\n\n  Result visitImportExpr(Expr.ImportExpr expr);\n\n  Result visitReadExpr(ReadExpr expr);\n\n  Result visitUnqualifiedAccessExpr(UnqualifiedAccessExpr expr);\n\n  Result visitStringConstant(StringConstant expr);\n\n  Result visitSingleLineStringLiteralExpr(SingleLineStringLiteralExpr expr);\n\n  Result visitMultiLineStringLiteralExpr(MultiLineStringLiteralExpr expr);\n\n  Result visitNewExpr(NewExpr expr);\n\n  Result visitAmendsExpr(AmendsExpr expr);\n\n  Result visitSuperAccessExpr(SuperAccessExpr expr);\n\n  Result visitSuperSubscriptExpr(SuperSubscriptExpr expr);\n\n  Result visitQualifiedAccessExpr(QualifiedAccessExpr expr);\n\n  Result visitSubscriptExpr(SubscriptExpr expr);\n\n  Result visitNonNullExpr(NonNullExpr expr);\n\n  Result visitUnaryMinusExpr(UnaryMinusExpr expr);\n\n  Result visitLogicalNotExpr(LogicalNotExpr expr);\n\n  Result visitBinaryOperatorExpr(BinaryOperatorExpr expr);\n\n  Result visitTypeCheckExpr(TypeCheckExpr expr);\n\n  Result visitTypeCastExpr(TypeCastExpr expr);\n\n  Result visitIfExpr(IfExpr expr);\n\n  Result visitLetExpr(LetExpr expr);\n\n  Result visitFunctionLiteralExpr(FunctionLiteralExpr expr);\n\n  Result visitParenthesizedExpr(ParenthesizedExpr expr);\n\n  Result visitObjectProperty(ObjectMember.ObjectProperty member);\n\n  Result visitObjectMethod(ObjectMember.ObjectMethod member);\n\n  Result visitMemberPredicate(ObjectMember.MemberPredicate member);\n\n  Result visitObjectElement(ObjectMember.ObjectElement member);\n\n  Result visitObjectEntry(ObjectMember.ObjectEntry member);\n\n  Result visitObjectSpread(ObjectMember.ObjectSpread member);\n\n  Result visitWhenGenerator(ObjectMember.WhenGenerator member);\n\n  Result visitForGenerator(ObjectMember.ForGenerator member);\n\n  Result visitModule(Module module);\n\n  Result visitModuleDecl(ModuleDecl decl);\n\n  Result visitExtendsOrAmendsClause(ExtendsOrAmendsClause decl);\n\n  Result visitImportClause(ImportClause imp);\n\n  Result visitClass(Class clazz);\n\n  Result visitModifier(Modifier modifier);\n\n  Result visitClassProperty(ClassProperty entry);\n\n  Result visitClassMethod(ClassMethod entry);\n\n  Result visitClassBody(ClassBody classBody);\n\n  Result visitTypeAlias(TypeAlias typeAlias);\n\n  Result visitAnnotation(Annotation annotation);\n\n  Result visitParameter(Parameter param);\n\n  Result visitParameterList(ParameterList paramList);\n\n  Result visitTypeParameter(TypeParameter typeParameter);\n\n  Result visitTypeParameterList(TypeParameterList typeParameterList);\n\n  Result visitTypeAnnotation(TypeAnnotation typeAnnotation);\n\n  Result visitArgumentList(ArgumentList argumentList);\n\n  Result visitStringPart(StringPart part);\n\n  Result visitDocComment(DocComment docComment);\n\n  Result visitIdentifier(Identifier identifier);\n\n  Result visitQualifiedIdentifier(QualifiedIdentifier qualifiedIdentifier);\n\n  Result visitObjectBody(ObjectBody objectBody);\n\n  Result visitReplInput(ReplInput replInput);\n\n  Result visitKeyword(Keyword keyword);\n\n  Result visitTypeArgumentList(TypeArgumentList typeArgumentList);\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/Span.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\npublic record Span(int charIndex, int length) {\n\n  /** Returns a span that starts with this span and ends with {@code end}. */\n  public Span endWith(Span end) {\n    return new Span(charIndex, end.charIndex - charIndex + end.length);\n  }\n\n  /** Checks wheter {@code other} starts directly after this span ends */\n  public boolean adjacent(Span other) {\n    return charIndex + length == other.charIndex;\n  }\n\n  public int stopIndex() {\n    return charIndex + length - 1;\n  }\n\n  public int stopIndexExclusive() {\n    return charIndex + length;\n  }\n\n  public Span stopSpan() {\n    return new Span(charIndex + length - 1, 1);\n  }\n\n  public Span move(int amount) {\n    return new Span(charIndex + amount, length);\n  }\n\n  public Span grow(int amount) {\n    return new Span(charIndex, length + amount);\n  }\n\n  /** Tells if {@code other} is entirely within this span. */\n  public boolean contains(Span other) {\n    return charIndex <= other.charIndex && other.charIndex + other.length <= charIndex + length;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/Token.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser;\n\npublic enum Token {\n  ABSTRACT,\n  AMENDS,\n  AS,\n  CLASS,\n  CONST,\n  ELSE,\n  EXTENDS,\n  EXTERNAL,\n  FALSE,\n  FIXED,\n  FOR,\n  FUNCTION,\n  HIDDEN,\n  IF,\n  IMPORT,\n  IMPORT_STAR,\n  IN,\n  IS,\n  LET,\n  LOCAL,\n  MODULE,\n  NEW,\n  NOTHING,\n  NULL,\n  OPEN,\n  OUT,\n  OUTER,\n  READ,\n  READ_STAR,\n  READ_QUESTION,\n  SUPER,\n  THIS,\n  THROW,\n  TRACE,\n  TRUE,\n  TYPE_ALIAS,\n  UNKNOWN,\n  WHEN,\n\n  // reserved for future use\n  PROTECTED,\n  OVERRIDE,\n  RECORD,\n  DELETE,\n  CASE,\n  SWITCH,\n  VARARG,\n\n  // punctuation\n  LPAREN,\n  RPAREN,\n  LBRACE,\n  RBRACE,\n  LBRACK,\n  RBRACK,\n  LPRED,\n  COMMA,\n  DOT,\n  QDOT,\n  COALESCE,\n  NON_NULL,\n  AT,\n  ASSIGN,\n  GT,\n  LT,\n\n  // rest\n  NOT,\n  QUESTION,\n  COLON,\n  ARROW,\n  EQUAL,\n  NOT_EQUAL,\n  LTE,\n  GTE,\n  AND,\n  OR,\n  PLUS,\n  MINUS,\n  POW,\n  STAR,\n  DIV,\n  INT_DIV,\n  MOD,\n  UNION,\n  PIPE,\n  SPREAD,\n  QSPREAD,\n  UNDERSCORE,\n  EOF,\n  SEMICOLON,\n\n  INT,\n  FLOAT,\n  BIN,\n  OCT,\n  HEX,\n  IDENTIFIER,\n  LINE_COMMENT,\n  BLOCK_COMMENT,\n  DOC_COMMENT,\n  SHEBANG,\n  INTERPOLATION_START,\n  STRING_START,\n  STRING_MULTI_START,\n  STRING_NEWLINE,\n  STRING_ESCAPE_NEWLINE,\n  STRING_ESCAPE_TAB,\n  STRING_ESCAPE_RETURN,\n  STRING_ESCAPE_QUOTE,\n  STRING_ESCAPE_BACKSLASH,\n  STRING_ESCAPE_UNICODE,\n  STRING_END,\n  STRING_PART;\n\n  public boolean isModifier() {\n    return switch (this) {\n      case EXTERNAL, ABSTRACT, OPEN, LOCAL, HIDDEN, FIXED, CONST -> true;\n      default -> false;\n    };\n  }\n\n  public boolean isKeyword() {\n    return switch (this) {\n      case ABSTRACT,\n          AMENDS,\n          AS,\n          CLASS,\n          CONST,\n          ELSE,\n          EXTENDS,\n          EXTERNAL,\n          FALSE,\n          FIXED,\n          FOR,\n          FUNCTION,\n          HIDDEN,\n          IF,\n          IMPORT,\n          IMPORT_STAR,\n          IN,\n          IS,\n          LET,\n          LOCAL,\n          MODULE,\n          NEW,\n          NOTHING,\n          NULL,\n          OPEN,\n          OUT,\n          OUTER,\n          READ,\n          READ_STAR,\n          READ_QUESTION,\n          SUPER,\n          THIS,\n          THROW,\n          TRACE,\n          TRUE,\n          TYPE_ALIAS,\n          UNKNOWN,\n          WHEN,\n          UNDERSCORE,\n          PROTECTED,\n          OVERRIDE,\n          RECORD,\n          DELETE,\n          CASE,\n          SWITCH,\n          VARARG ->\n          true;\n      default -> false;\n    };\n  }\n\n  public boolean isOperator() {\n    return switch (this) {\n      case POW,\n          STAR,\n          DIV,\n          INT_DIV,\n          MOD,\n          PLUS,\n          MINUS,\n          GT,\n          GTE,\n          LT,\n          LTE,\n          IS,\n          AS,\n          EQUAL,\n          NOT_EQUAL,\n          AND,\n          OR,\n          PIPE,\n          COALESCE,\n          DOT,\n          QDOT,\n          LBRACK ->\n          true;\n      default -> false;\n    };\n  }\n\n  public boolean isAffix() {\n    return switch (this) {\n      case LINE_COMMENT, BLOCK_COMMENT, SEMICOLON -> true;\n      default -> false;\n    };\n  }\n\n  public String text() {\n    if (this == UNDERSCORE) {\n      return \"_\";\n    }\n    return name().toLowerCase();\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.parser;\n\nimport org.pkl.parser.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/AbstractNode.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic abstract class AbstractNode implements Node {\n  protected final Span span;\n  protected final @Nullable List<? extends @Nullable Node> children;\n  protected @Nullable Node parent;\n\n  public AbstractNode(Span span, @Nullable List<? extends @Nullable Node> children) {\n    this.span = span;\n    if (children != null) {\n      this.children = Collections.unmodifiableList(children);\n    } else {\n      this.children = null;\n    }\n\n    if (children != null) {\n      for (var node : children) {\n        if (node != null) {\n          node.setParent(this);\n        }\n      }\n    }\n  }\n\n  @Override\n  public Span span() {\n    return span;\n  }\n\n  @Override\n  public @Nullable Node parent() {\n    return parent;\n  }\n\n  @Override\n  public void setParent(Node parent) {\n    this.parent = parent;\n  }\n\n  @Override\n  public @Nullable List<? extends @Nullable Node> children() {\n    return children;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    AbstractNode that = (AbstractNode) o;\n    return Objects.equals(span, that.span) && Objects.deepEquals(children, that.children);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(span, children);\n  }\n\n  @Override\n  public String toString() {\n    var name = getClass().getSimpleName();\n    return name + \"{span=\" + span + \", children=\" + children + '}';\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Annotation.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class Annotation extends AbstractNode {\n  public Annotation(List<Node> nodes, Span span) {\n    super(span, nodes);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitAnnotation(this);\n  }\n\n  public Type getType() {\n    assert children != null;\n    var ret = (Type) children.get(0);\n    assert ret != null;\n    return ret;\n  }\n\n  public @Nullable ObjectBody getBody() {\n    assert children != null;\n    return (ObjectBody) children.get(1);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ArgumentList.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class ArgumentList extends AbstractNode {\n\n  public ArgumentList(List<Expr> arguments, Span span) {\n    super(span, arguments);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitArgumentList(this);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Expr> getArguments() {\n    assert children != null;\n    return (List<Expr>) children;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Class.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic final class Class extends AbstractNode {\n  private final int modifiersOffset;\n  private final int keywordOffset;\n\n  public Class(List<Node> nodes, int modifiersOffset, int keywordOffset, Span span) {\n    super(span, nodes);\n    this.modifiersOffset = modifiersOffset;\n    this.keywordOffset = keywordOffset;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitClass(this);\n  }\n\n  public @Nullable DocComment getDocComment() {\n    assert children != null;\n    return (DocComment) children.get(0);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Annotation> getAnnotations() {\n    assert children != null;\n    return (List<Annotation>) children.subList(1, modifiersOffset);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Modifier> getModifiers() {\n    assert children != null;\n    return (List<Modifier>) children.subList(modifiersOffset, keywordOffset);\n  }\n\n  public Keyword getClassKeyword() {\n    assert children != null;\n    var ret = (Keyword) children.get(keywordOffset);\n    assert ret != null;\n    return ret;\n  }\n\n  public Identifier getName() {\n    assert children != null;\n    var ret = (Identifier) children.get(keywordOffset + 1);\n    assert ret != null;\n    return ret;\n  }\n\n  public @Nullable TypeParameterList getTypeParameterList() {\n    assert children != null;\n    return (TypeParameterList) children.get(keywordOffset + 2);\n  }\n\n  public @Nullable Type getSuperClass() {\n    assert children != null;\n    return (Type) children.get(keywordOffset + 3);\n  }\n\n  public @Nullable ClassBody getBody() {\n    assert children != null;\n    return (ClassBody) children.get(keywordOffset + 4);\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  public Span getHeaderSpan() {\n    Span start = null;\n    assert children != null;\n    for (var i = modifiersOffset; i < children.size(); i++) {\n      var child = children.get(i);\n      if (child != null) {\n        start = child.span();\n        break;\n      }\n    }\n    Span end;\n    if (getSuperClass() != null) {\n      end = getSuperClass().span();\n    } else if (getTypeParameterList() != null) {\n      end = getTypeParameterList().span();\n    } else {\n      end = getName().span();\n    }\n    assert start != null;\n    return start.endWith(end);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ClassBody.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class ClassBody extends AbstractNode {\n\n  public ClassBody(List<Node> nodes, Span span) {\n    super(span, nodes);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitClassBody(this);\n  }\n\n  public List<ClassProperty> getProperties() {\n    var props = new ArrayList<ClassProperty>();\n    assert children != null;\n    for (var child : children) {\n      if (child instanceof ClassProperty prop) {\n        props.add(prop);\n      }\n    }\n    return props;\n  }\n\n  public List<ClassMethod> getMethods() {\n    var methods = new ArrayList<ClassMethod>();\n    assert children != null;\n    for (var child : children) {\n      if (child instanceof ClassMethod method) {\n        methods.add(method);\n      }\n    }\n    return methods;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ClassMethod.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class ClassMethod extends AbstractNode {\n  private final int modifiersOffset;\n  private final int nameOffset;\n  private final Span headerSpan;\n\n  public ClassMethod(\n      List<Node> nodes, int modifiersOffset, int nameOffset, Span headerSpan, Span span) {\n    super(span, nodes);\n    this.headerSpan = headerSpan;\n    this.modifiersOffset = modifiersOffset;\n    this.nameOffset = nameOffset;\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitClassMethod(this);\n  }\n\n  public @Nullable DocComment getDocComment() {\n    assert children != null;\n    return (DocComment) children.get(0);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Annotation> getAnnotations() {\n    assert children != null;\n    return (List<Annotation>) children.subList(1, modifiersOffset);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Modifier> getModifiers() {\n    assert children != null;\n    return (List<Modifier>) children.subList(modifiersOffset, nameOffset);\n  }\n\n  public Identifier getName() {\n    assert children != null;\n    var ret = (Identifier) children.get(nameOffset);\n    assert ret != null;\n    return ret;\n  }\n\n  public @Nullable TypeParameterList getTypeParameterList() {\n    assert children != null;\n    return (TypeParameterList) children.get(nameOffset + 1);\n  }\n\n  public ParameterList getParameterList() {\n    assert children != null;\n    var ret = (ParameterList) children.get(nameOffset + 2);\n    assert ret != null;\n    return ret;\n  }\n\n  public @Nullable TypeAnnotation getTypeAnnotation() {\n    assert children != null;\n    return (TypeAnnotation) children.get(nameOffset + 3);\n  }\n\n  public @Nullable Expr getExpr() {\n    assert children != null;\n    return (Expr) children.get(nameOffset + 4);\n  }\n\n  public Span getHeaderSpan() {\n    return headerSpan;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ClassProperty.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic final class ClassProperty extends AbstractNode {\n  private final int modifiersOffset;\n  private final int nameOffset;\n\n  public ClassProperty(List<Node> nodes, int modifiersOffset, int nameOffset, Span span) {\n    super(span, nodes);\n    this.modifiersOffset = modifiersOffset;\n    this.nameOffset = nameOffset;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitClassProperty(this);\n  }\n\n  public @Nullable DocComment getDocComment() {\n    assert children != null;\n    return (DocComment) children.get(0);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Annotation> getAnnotations() {\n    assert children != null;\n    return (List<Annotation>) children.subList(1, modifiersOffset);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Modifier> getModifiers() {\n    assert children != null;\n    return (List<Modifier>) children.subList(modifiersOffset, nameOffset);\n  }\n\n  public Identifier getName() {\n    assert children != null;\n    var ret = (Identifier) children.get(nameOffset);\n    assert ret != null;\n    return ret;\n  }\n\n  public @Nullable TypeAnnotation getTypeAnnotation() {\n    assert children != null;\n    return (TypeAnnotation) children.get(nameOffset + 1);\n  }\n\n  public @Nullable Expr getExpr() {\n    assert children != null;\n    return (Expr) children.get(nameOffset + 2);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<ObjectBody> getBodyList() {\n    assert children != null;\n    return (List<ObjectBody>) children.subList(nameOffset + 3, children.size());\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/DocComment.java",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\n\npublic final class DocComment extends AbstractNode {\n  private final List<Span> spans;\n\n  public DocComment(List<Span> spans) {\n    super(spans.get(0).endWith(spans.get(spans.size() - 1)), null);\n    this.spans = spans;\n  }\n\n  @Override\n  public Span span() {\n    return spans.get(0).endWith(spans.get(spans.size() - 1));\n  }\n\n  public List<Span> getSpans() {\n    return spans;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitDocComment(this);\n  }\n\n  @Override\n  public String text(char[] source) {\n    var builder = new StringBuilder();\n    for (var span : spans) {\n      builder.append(new String(source, span.charIndex(), span.length()));\n      builder.append('\\n');\n    }\n    return builder.toString();\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Expr.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\n@SuppressWarnings(\"unused\")\npublic abstract sealed class Expr extends AbstractNode {\n\n  public Expr(Span span, @Nullable List<? extends @Nullable Node> children) {\n    super(span, children);\n  }\n\n  public static final class ThisExpr extends Expr {\n    public ThisExpr(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitThisExpr(this);\n    }\n  }\n\n  public static final class OuterExpr extends Expr {\n    public OuterExpr(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitOuterExpr(this);\n    }\n  }\n\n  public static final class ModuleExpr extends Expr {\n    public ModuleExpr(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitModuleExpr(this);\n    }\n  }\n\n  public static final class NullLiteralExpr extends Expr {\n    public NullLiteralExpr(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitNullLiteralExpr(this);\n    }\n  }\n\n  public static final class BoolLiteralExpr extends Expr {\n    private final boolean b;\n\n    public BoolLiteralExpr(boolean b, Span span) {\n      super(span, null);\n      this.b = b;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitBoolLiteralExpr(this);\n    }\n\n    public boolean isB() {\n      return b;\n    }\n  }\n\n  public static final class IntLiteralExpr extends Expr {\n    private final String number;\n\n    public IntLiteralExpr(String number, Span span) {\n      super(span, null);\n      this.number = number;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitIntLiteralExpr(this);\n    }\n\n    public String getNumber() {\n      return number;\n    }\n  }\n\n  public static final class FloatLiteralExpr extends Expr {\n    private final String number;\n\n    public FloatLiteralExpr(String number, Span span) {\n      super(span, null);\n      this.number = number;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitFloatLiteralExpr(this);\n    }\n\n    public String getNumber() {\n      return number;\n    }\n  }\n\n  public abstract static sealed class StringLiteralExpr extends Expr\n      permits SingleLineStringLiteralExpr, MultiLineStringLiteralExpr {\n    public abstract List<StringPart> getParts();\n\n    public StringLiteralExpr(Span span, List<StringPart> parts) {\n      super(span, parts);\n    }\n\n    public final boolean hasInterpolation() {\n      var children = children();\n      assert children != null;\n      return children.size() > 1;\n    }\n  }\n\n  public static final class SingleLineStringLiteralExpr extends StringLiteralExpr {\n    private final Span startDelimiterSpan;\n    private final Span endDelimiterSpan;\n\n    public SingleLineStringLiteralExpr(\n        List<StringPart> parts, Span startDelimiterSpan, Span endDelimiterSpan, Span span) {\n      super(span, parts);\n      this.startDelimiterSpan = startDelimiterSpan;\n      this.endDelimiterSpan = endDelimiterSpan;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitSingleLineStringLiteralExpr(this);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<StringPart> getParts() {\n      assert children != null;\n      return (List<StringPart>) children;\n    }\n\n    public Span getStartDelimiterSpan() {\n      return startDelimiterSpan;\n    }\n\n    public Span getEndDelimiterSpan() {\n      return endDelimiterSpan;\n    }\n  }\n\n  public static final class MultiLineStringLiteralExpr extends StringLiteralExpr {\n    private final Span startDelimiterSpan;\n    private final Span endDelimiterSpan;\n\n    public MultiLineStringLiteralExpr(\n        List<StringPart> parts, Span startDelimiterSpan, Span endDelimiterSpan, Span span) {\n      super(span, parts);\n      this.startDelimiterSpan = startDelimiterSpan;\n      this.endDelimiterSpan = endDelimiterSpan;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitMultiLineStringLiteralExpr(this);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<StringPart> getParts() {\n      assert children != null;\n      return (List<StringPart>) children;\n    }\n\n    public Span getStartDelimiterSpan() {\n      return startDelimiterSpan;\n    }\n\n    public Span getEndDelimiterSpan() {\n      return endDelimiterSpan;\n    }\n  }\n\n  public static final class ThrowExpr extends Expr {\n    public ThrowExpr(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitThrowExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class TraceExpr extends Expr {\n    public TraceExpr(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitTraceExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class ImportExpr extends Expr {\n    private final boolean isGlob;\n\n    public ImportExpr(StringConstant importStr, boolean isGlob, Span span) {\n      super(span, List.of(importStr));\n      this.isGlob = isGlob;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitImportExpr(this);\n    }\n\n    public StringConstant getImportStr() {\n      assert children != null;\n      var ret = (StringConstant) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public boolean isGlob() {\n      return isGlob;\n    }\n  }\n\n  public static final class ReadExpr extends Expr {\n    private final ReadType readType;\n\n    public ReadExpr(Expr expr, ReadType readType, Span span) {\n      super(span, List.of(expr));\n      this.readType = readType;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitReadExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public ReadType getReadType() {\n      return readType;\n    }\n  }\n\n  public enum ReadType {\n    READ,\n    GLOB,\n    NULL\n  }\n\n  public static final class UnqualifiedAccessExpr extends Expr {\n    public UnqualifiedAccessExpr(\n        Identifier identifier, @Nullable ArgumentList argumentList, Span span) {\n      super(span, Arrays.asList(identifier, argumentList));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitUnqualifiedAccessExpr(this);\n    }\n\n    public Identifier getIdentifier() {\n      assert children != null;\n      var ret = (Identifier) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable ArgumentList getArgumentList() {\n      assert children != null;\n      return (ArgumentList) children.get(1);\n    }\n  }\n\n  public static final class QualifiedAccessExpr extends Expr {\n    private final boolean isNullable;\n\n    public QualifiedAccessExpr(\n        Expr expr,\n        Identifier identifier,\n        boolean isNullable,\n        @Nullable ArgumentList argumentList,\n        Span span) {\n      super(span, Arrays.asList(expr, identifier, argumentList));\n      this.isNullable = isNullable;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitQualifiedAccessExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Identifier getIdentifier() {\n      assert children != null;\n      var ret = (Identifier) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n\n    public boolean isNullable() {\n      return isNullable;\n    }\n\n    public @Nullable ArgumentList getArgumentList() {\n      assert children != null;\n      return (ArgumentList) children.get(2);\n    }\n  }\n\n  public static final class SuperAccessExpr extends Expr {\n    public SuperAccessExpr(Identifier identifier, @Nullable ArgumentList argumentList, Span span) {\n      super(span, Arrays.asList(identifier, argumentList));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitSuperAccessExpr(this);\n    }\n\n    public Identifier getIdentifier() {\n      assert children != null;\n      var ret = (Identifier) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable ArgumentList getArgumentList() {\n      assert children != null;\n      return (ArgumentList) children.get(1);\n    }\n  }\n\n  public static final class SuperSubscriptExpr extends Expr {\n    public SuperSubscriptExpr(Expr arg, Span span) {\n      super(span, List.of(arg));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitSuperSubscriptExpr(this);\n    }\n\n    public Expr getArg() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class SubscriptExpr extends Expr {\n    public SubscriptExpr(Expr expr, Expr arg, Span span) {\n      super(span, List.of(expr, arg));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitSubscriptExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getArg() {\n      assert children != null;\n      var ret = (Expr) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class IfExpr extends Expr {\n    public IfExpr(Expr cond, Expr then, Expr els, Span span) {\n      super(span, List.of(cond, then, els));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitIfExpr(this);\n    }\n\n    public Expr getCond() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getThen() {\n      assert children != null;\n      var ret = (Expr) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getEls() {\n      assert children != null;\n      var ret = (Expr) children.get(2);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class LetExpr extends Expr {\n    public LetExpr(Parameter parameter, Expr bindingExpr, Expr expr, Span span) {\n      super(span, List.of(parameter, bindingExpr, expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitLetExpr(this);\n    }\n\n    public Parameter getParameter() {\n      assert children != null;\n      var ret = (Parameter) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getBindingExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(2);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class FunctionLiteralExpr extends Expr {\n    public FunctionLiteralExpr(ParameterList parameterList, Expr expr, Span span) {\n      super(span, List.of(parameterList, expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitFunctionLiteralExpr(this);\n    }\n\n    public ParameterList getParameterList() {\n      assert children != null;\n      var ret = (ParameterList) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class ParenthesizedExpr extends Expr {\n    public ParenthesizedExpr(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitParenthesizedExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class NewExpr extends Expr {\n    public NewExpr(@Nullable Type type, ObjectBody body, Span span) {\n      super(span, Arrays.asList(type, body));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitNewExpr(this);\n    }\n\n    public @Nullable Type getType() {\n      assert children != null;\n      return (Type) children.get(0);\n    }\n\n    public ObjectBody getBody() {\n      assert children != null;\n      var ret = (ObjectBody) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n\n    public Span newSpan() {\n      return new Span(span.charIndex(), 3);\n    }\n  }\n\n  public static final class AmendsExpr extends Expr {\n    public AmendsExpr(Expr expr, ObjectBody body, Span span) {\n      super(span, List.of(expr, body));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitAmendsExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public ObjectBody getBody() {\n      assert children != null;\n      var ret = (ObjectBody) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class NonNullExpr extends Expr {\n    public NonNullExpr(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitNonNullExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class UnaryMinusExpr extends Expr {\n    public UnaryMinusExpr(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitUnaryMinusExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class LogicalNotExpr extends Expr {\n    public LogicalNotExpr(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitLogicalNotExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class BinaryOperatorExpr extends Expr {\n    private final Operator op;\n\n    public BinaryOperatorExpr(Expr left, Expr right, Operator op, Span span) {\n      super(span, List.of(left, right));\n      this.op = op;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitBinaryOperatorExpr(this);\n    }\n\n    public Expr getLeft() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Expr getRight() {\n      assert children != null;\n      var ret = (Expr) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n\n    public Operator getOp() {\n      return op;\n    }\n\n    @Override\n    public String toString() {\n      return \"BinaryOp{children=\" + children + \", op=\" + op + \", span=\" + span + '}';\n    }\n\n    @SuppressWarnings(\"ConstantValue\")\n    @Override\n    public boolean equals(Object o) {\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      if (this == o) {\n        return true;\n      }\n      BinaryOperatorExpr binaryOp = (BinaryOperatorExpr) o;\n      return Objects.deepEquals(children, binaryOp.children)\n          && op == binaryOp.op\n          && Objects.equals(span, binaryOp.span);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(children, op, span);\n    }\n  }\n\n  public static final class TypeCheckExpr extends Expr {\n    public TypeCheckExpr(Expr expr, Type type, Span span) {\n      super(span, List.of(expr, type));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitTypeCheckExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Type getType() {\n      assert children != null;\n      var ret = (Type) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class TypeCastExpr extends Expr {\n    public TypeCastExpr(Expr expr, Type type, Span span) {\n      super(span, List.of(expr, type));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitTypeCastExpr(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public Type getType() {\n      assert children != null;\n      var ret = (Type) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ExtendsOrAmendsClause.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class ExtendsOrAmendsClause extends AbstractNode {\n  private final Type type;\n\n  public ExtendsOrAmendsClause(StringConstant url, Type type, Span span) {\n    super(span, List.of(url));\n    this.type = type;\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitExtendsOrAmendsClause(this);\n  }\n\n  public StringConstant getUrl() {\n    assert children != null;\n    var ret = (StringConstant) children.get(0);\n    assert ret != null;\n    return ret;\n  }\n\n  public Type getType() {\n    return type;\n  }\n\n  @Override\n  public String toString() {\n    return \"ExtendsOrAmendsClause{\"\n        + \"type=\"\n        + type\n        + \", span=\"\n        + span\n        + \", children=\"\n        + children\n        + '}';\n  }\n\n  @SuppressWarnings(\"ConstantValue\")\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    if (this == o) {\n      return true;\n    }\n    if (!super.equals(o)) {\n      return false;\n    }\n    ExtendsOrAmendsClause that = (ExtendsOrAmendsClause) o;\n    return type == that.type;\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(super.hashCode(), type);\n  }\n\n  public enum Type {\n    EXTENDS,\n    AMENDS\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Identifier.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\n\npublic final class Identifier extends AbstractNode {\n  private final String value;\n\n  public Identifier(String value, Span span) {\n    super(span, null);\n    this.value = value;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitIdentifier(this);\n  }\n\n  public String getValue() {\n    return removeBackticks(value);\n  }\n\n  public String getRawValue() {\n    return value;\n  }\n\n  private static String removeBackticks(String text) {\n    if (!text.isEmpty() && text.charAt(0) == '`') {\n      // lexer makes sure there's a ` at the end\n      return text.substring(1, text.length() - 1);\n    }\n    return text;\n  }\n\n  @Override\n  public String toString() {\n    return \"Identifier{value='\" + value + '\\'' + \", span=\" + span + '}';\n  }\n\n  @SuppressWarnings(\"ConstantValue\")\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    if (this == o) {\n      return true;\n    }\n    Identifier identifier = (Identifier) o;\n    return Objects.equals(value, identifier.value) && Objects.equals(span, identifier.span);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(value, span);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ImportClause.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Arrays;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic final class ImportClause extends AbstractNode {\n  private final boolean isGlob;\n\n  public ImportClause(\n      StringConstant importStr, boolean isGlob, @Nullable Identifier alias, Span span) {\n    super(span, Arrays.asList(importStr, alias));\n    this.isGlob = isGlob;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitImportClause(this);\n  }\n\n  public StringConstant getImportStr() {\n    assert children != null;\n    var ret = (StringConstant) children.get(0);\n    assert ret != null;\n    return ret;\n  }\n\n  public boolean isGlob() {\n    return isGlob;\n  }\n\n  public @Nullable Identifier getAlias() {\n    assert children != null;\n    return (Identifier) children.get(1);\n  }\n\n  @Override\n  public String toString() {\n    return \"Import{isGlob=\" + isGlob + \", span=\" + span + \", children=\" + children + '}';\n  }\n\n  @SuppressWarnings(\"ConstantValue\")\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    if (this == o) {\n      return true;\n    }\n    if (!super.equals(o)) {\n      return false;\n    }\n    ImportClause anImport = (ImportClause) o;\n    return isGlob == anImport.isGlob;\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(super.hashCode(), isGlob);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Keyword.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\n\npublic class Keyword extends AbstractNode {\n\n  public Keyword(Span span) {\n    super(span, null);\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitKeyword(this);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Modifier.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\n\npublic final class Modifier extends AbstractNode {\n  private final ModifierValue value;\n\n  public Modifier(ModifierValue value, Span span) {\n    super(span, null);\n    this.value = value;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitModifier(this);\n  }\n\n  public ModifierValue getValue() {\n    return value;\n  }\n\n  @Override\n  public String toString() {\n    return \"Modifier{value=\" + value + \", span=\" + span + '}';\n  }\n\n  @SuppressWarnings(\"ConstantValue\")\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    if (this == o) {\n      return true;\n    }\n    Modifier modifier = (Modifier) o;\n    return value == modifier.value && Objects.equals(span, modifier.span);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(value, span);\n  }\n\n  public enum ModifierValue {\n    EXTERNAL,\n    ABSTRACT,\n    OPEN,\n    LOCAL,\n    HIDDEN,\n    FIXED,\n    CONST\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Module.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic final class Module extends AbstractNode {\n  public Module(List<Node> nodes, Span span) {\n    super(span, nodes);\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitModule(this);\n  }\n\n  public @Nullable ModuleDecl getDecl() {\n    assert children != null;\n    // children can be empty when there was a parse error\n    return children.isEmpty() ? null : (ModuleDecl) children.get(0);\n  }\n\n  public List<ImportClause> getImports() {\n    assert children != null;\n    if (children.size() < 2) return List.of();\n    var res = new ArrayList<ImportClause>();\n    for (int i = 1; i < children.size(); i++) {\n      var child = children.get(i);\n      if (child instanceof ImportClause imp) {\n        res.add(imp);\n      } else {\n        // imports are sequential\n        break;\n      }\n    }\n    return res;\n  }\n\n  public List<org.pkl.parser.syntax.Class> getClasses() {\n    var res = new ArrayList<org.pkl.parser.syntax.Class>();\n    assert children != null;\n    for (var child : children) {\n      if (child instanceof Class clazz) {\n        res.add(clazz);\n      }\n    }\n    return res;\n  }\n\n  public List<TypeAlias> getTypeAliases() {\n    var res = new ArrayList<TypeAlias>();\n    assert children != null;\n    for (var child : children) {\n      if (child instanceof TypeAlias typeAlias) {\n        res.add(typeAlias);\n      }\n    }\n    return res;\n  }\n\n  public List<ClassProperty> getProperties() {\n    var res = new ArrayList<ClassProperty>();\n    assert children != null;\n    for (var child : children) {\n      if (child instanceof ClassProperty classProperty) {\n        res.add(classProperty);\n      }\n    }\n    return res;\n  }\n\n  public List<ClassMethod> getMethods() {\n    var res = new ArrayList<ClassMethod>();\n    assert children != null;\n    for (var child : children) {\n      if (child instanceof ClassMethod classMethod) {\n        res.add(classMethod);\n      }\n    }\n    return res;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ModuleDecl.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic final class ModuleDecl extends AbstractNode {\n  private final int modifiersOffset;\n  private final int nameOffset;\n\n  public ModuleDecl(List<Node> nodes, int modifiersOffset, int nameOffset, Span span) {\n    super(span, nodes);\n    this.modifiersOffset = modifiersOffset;\n    this.nameOffset = nameOffset;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitModuleDecl(this);\n  }\n\n  public @Nullable DocComment getDocComment() {\n    assert children != null;\n    return (DocComment) children.get(0);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Annotation> getAnnotations() {\n    assert children != null;\n    return (List<Annotation>) children.subList(1, modifiersOffset);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Modifier> getModifiers() {\n    assert children != null;\n    return (List<Modifier>) children.subList(modifiersOffset, nameOffset);\n  }\n\n  public @Nullable Keyword getModuleKeyword() {\n    assert children != null;\n    return (Keyword) children.get(nameOffset);\n  }\n\n  public @Nullable QualifiedIdentifier getName() {\n    assert children != null;\n    return (QualifiedIdentifier) children.get(nameOffset + 1);\n  }\n\n  public @Nullable ExtendsOrAmendsClause getExtendsOrAmendsDecl() {\n    assert children != null;\n    return (ExtendsOrAmendsClause) children.get(nameOffset + 2);\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  public Span headerSpan() {\n    Span start = null;\n    assert children != null;\n    for (var i = modifiersOffset; i < children.size(); i++) {\n      var child = children.get(i);\n      if (child != null) {\n        start = child.span();\n        break;\n      }\n    }\n    var extendsOrAmends = children.get(nameOffset + 2);\n    assert start != null;\n    if (extendsOrAmends != null) {\n      return start.endWith(extendsOrAmends.span());\n    }\n    var end = children.get(nameOffset + 1);\n    assert end != null;\n    return start.endWith(end.span());\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Node.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic interface Node {\n  Span span();\n\n  @Nullable\n  Node parent();\n\n  void setParent(Node parent);\n\n  @Nullable\n  List<? extends @Nullable Node> children();\n\n  <T> T accept(ParserVisitor<? extends T> visitor);\n\n  default String text(char[] source) {\n    return new String(source, span().charIndex(), span().length());\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectBody.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\n\npublic final class ObjectBody extends AbstractNode {\n  private final int membersOffset;\n\n  public ObjectBody(List<Node> nodes, int membersOffset, Span span) {\n    super(span, nodes);\n    this.membersOffset = membersOffset;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitObjectBody(this);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Parameter> getParameters() {\n    assert children != null;\n    return (List<Parameter>) children.subList(0, membersOffset);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<ObjectMember> getMembers() {\n    assert children != null;\n    return (List<ObjectMember>) children.subList(membersOffset, children.size());\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ObjectMember.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\n@SuppressWarnings(\"unused\")\npublic abstract sealed class ObjectMember extends AbstractNode {\n\n  public ObjectMember(Span span, @Nullable List<? extends @Nullable Node> children) {\n    super(span, children);\n  }\n\n  public static final class ObjectElement extends ObjectMember {\n    public ObjectElement(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitObjectElement(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class ObjectProperty extends ObjectMember {\n    private final int identifierOffset;\n\n    public ObjectProperty(List<Node> nodes, int identifierOffset, Span span) {\n      super(span, nodes);\n      this.identifierOffset = identifierOffset;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitObjectProperty(this);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<Modifier> getModifiers() {\n      assert children != null;\n      return (List<Modifier>) children.subList(0, identifierOffset);\n    }\n\n    public Identifier getIdentifier() {\n      assert children != null;\n      var ret = (Identifier) children.get(identifierOffset);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable TypeAnnotation getTypeAnnotation() {\n      assert children != null;\n      return (TypeAnnotation) children.get(identifierOffset + 1);\n    }\n\n    public @Nullable Expr getExpr() {\n      assert children != null;\n      return (Expr) children.get(identifierOffset + 2);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<ObjectBody> getBodyList() {\n      assert children != null;\n      return (List<ObjectBody>) children.subList(identifierOffset + 3, children.size());\n    }\n  }\n\n  public static final class ObjectMethod extends ObjectMember {\n    private final int identifierOffset;\n\n    public ObjectMethod(List<Node> nodes, int identifierOffset, Span span) {\n      super(span, nodes);\n      this.identifierOffset = identifierOffset;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitObjectMethod(this);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<Modifier> getModifiers() {\n      assert children != null;\n      return (List<Modifier>) children.subList(0, identifierOffset);\n    }\n\n    public Keyword getFunctionKeyword() {\n      assert children != null;\n      var ret = (Keyword) children.get(identifierOffset);\n      assert ret != null;\n      return ret;\n    }\n\n    public Identifier getIdentifier() {\n      assert children != null;\n      var ret = (Identifier) children.get(identifierOffset + 1);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable TypeParameterList getTypeParameterList() {\n      assert children != null;\n      return (TypeParameterList) children.get(identifierOffset + 2);\n    }\n\n    public ParameterList getParamList() {\n      assert children != null;\n      var ret = (ParameterList) children.get(identifierOffset + 3);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable TypeAnnotation getTypeAnnotation() {\n      assert children != null;\n      return (TypeAnnotation) children.get(identifierOffset + 4);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(identifierOffset + 5);\n      assert ret != null;\n      return ret;\n    }\n\n    @SuppressWarnings(\"DuplicatedCode\")\n    public Span headerSpan() {\n      Span start = null;\n      assert children != null;\n      for (var child : children) {\n        if (child != null) {\n          start = child.span();\n          break;\n        }\n      }\n      Span end;\n      var typeAnnotation = children.get(identifierOffset + 4);\n      if (typeAnnotation == null) {\n        var stop = children.get(identifierOffset + 3);\n        assert stop != null;\n        end = stop.span();\n      } else {\n        end = typeAnnotation.span();\n      }\n      assert start != null;\n      return start.endWith(end);\n    }\n  }\n\n  public static final class MemberPredicate extends ObjectMember {\n    public MemberPredicate(List<Node> nodes, Span span) {\n      super(span, nodes);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitMemberPredicate(this);\n    }\n\n    public Expr getPred() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable Expr getExpr() {\n      assert children != null;\n      return (Expr) children.get(1);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<ObjectBody> getBodyList() {\n      assert children != null;\n      return (List<ObjectBody>) children.subList(2, children.size());\n    }\n  }\n\n  public static final class ObjectEntry extends ObjectMember {\n    public ObjectEntry(List<Node> nodes, Span span) {\n      super(span, nodes);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitObjectEntry(this);\n    }\n\n    public Expr getKey() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable Expr getValue() {\n      assert children != null;\n      return (Expr) children.get(1);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<ObjectBody> getBodyList() {\n      assert children != null;\n      return (List<ObjectBody>) children.subList(2, children.size());\n    }\n  }\n\n  public static final class ObjectSpread extends ObjectMember {\n    private final boolean isNullable;\n\n    public ObjectSpread(Expr expr, boolean isNullable, Span span) {\n      super(span, List.of(expr));\n      this.isNullable = isNullable;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitObjectSpread(this);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public boolean isNullable() {\n      return isNullable;\n    }\n\n    @Override\n    public String toString() {\n      return \"ObjectSpread{\"\n          + \"isNullable=\"\n          + isNullable\n          + \", span=\"\n          + span\n          + \", children=\"\n          + children\n          + '}';\n    }\n\n    @SuppressWarnings(\"ConstantValue\")\n    @Override\n    public boolean equals(Object o) {\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      if (this == o) {\n        return true;\n      }\n      if (!super.equals(o)) {\n        return false;\n      }\n      ObjectSpread that = (ObjectSpread) o;\n      return isNullable == that.isNullable;\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(super.hashCode(), isNullable);\n    }\n  }\n\n  public static final class WhenGenerator extends ObjectMember {\n    public WhenGenerator(\n        Expr predicate, ObjectBody thenClause, @Nullable ObjectBody elseClause, Span span) {\n      super(span, Arrays.asList(predicate, thenClause, elseClause));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitWhenGenerator(this);\n    }\n\n    public Expr getPredicate() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public ObjectBody getThenClause() {\n      assert children != null;\n      var ret = (ObjectBody) children.get(1);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable ObjectBody getElseClause() {\n      assert children != null;\n      return (ObjectBody) children.get(2);\n    }\n  }\n\n  public static final class ForGenerator extends ObjectMember {\n    public ForGenerator(\n        Parameter p1, @Nullable Parameter p2, Expr expr, ObjectBody body, Span span) {\n      super(span, Arrays.asList(p1, p2, expr, body));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitForGenerator(this);\n    }\n\n    public Parameter getP1() {\n      assert children != null;\n      var ret = (Parameter) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable Parameter getP2() {\n      assert children != null;\n      return (Parameter) children.get(1);\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(2);\n      assert ret != null;\n      return ret;\n    }\n\n    public ObjectBody getBody() {\n      assert children != null;\n      var ret = (ObjectBody) children.get(3);\n      assert ret != null;\n      return ret;\n    }\n\n    public Span forSpan() {\n      return new Span(span.charIndex(), 3);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Operator.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\npublic enum Operator {\n  NULL_COALESCE(1, false),\n  PIPE(2, true),\n  OR(3, true),\n  AND(4, true),\n  EQ_EQ(5, true),\n  NOT_EQ(5, true),\n  IS(6, true),\n  AS(6, true),\n  LT(7, true),\n  GT(7, true),\n  LTE(7, true),\n  GTE(7, true),\n  PLUS(8, true),\n  MINUS(8, true),\n  MULT(9, true),\n  DIV(9, true),\n  INT_DIV(9, true),\n  MOD(9, true),\n  POW(10, false),\n  NON_NULL(16, true),\n  SUBSCRIPT(18, true),\n  DOT(20, true),\n  QDOT(20, true);\n\n  private final int prec;\n  private final boolean isLeftAssoc;\n\n  Operator(int prec, boolean isLeftAssoc) {\n    this.prec = prec;\n    this.isLeftAssoc = isLeftAssoc;\n  }\n\n  public int getPrec() {\n    return prec;\n  }\n\n  public boolean isLeftAssoc() {\n    return isLeftAssoc;\n  }\n\n  public static Operator byName(String name) {\n    return switch (name) {\n      case \"??\" -> NULL_COALESCE;\n      case \"|>\" -> PIPE;\n      case \"||\" -> OR;\n      case \"&&\" -> AND;\n      case \"==\" -> EQ_EQ;\n      case \"!=\" -> NOT_EQ;\n      case \"is\" -> IS;\n      case \"as\" -> AS;\n      case \"<\" -> LT;\n      case \"<=\" -> LTE;\n      case \">\" -> GT;\n      case \">=\" -> GTE;\n      case \"+\" -> PLUS;\n      case \"-\" -> MINUS;\n      case \"*\" -> MULT;\n      case \"/\" -> DIV;\n      case \"~/\" -> INT_DIV;\n      case \"%\" -> MOD;\n      case \"**\" -> POW;\n      case \"!!\" -> NON_NULL;\n      case \"[\" -> SUBSCRIPT;\n      case \".\" -> DOT;\n      case \"?.\" -> QDOT;\n      default -> throw new RuntimeException(\"Unknown operator: \" + name);\n    };\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Parameter.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic abstract sealed class Parameter extends AbstractNode {\n\n  public Parameter(Span span, @Nullable List<? extends @Nullable Node> children) {\n    super(span, children);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitParameter(this);\n  }\n\n  public static final class Underscore extends Parameter {\n    public Underscore(Span span) {\n      super(span, null);\n    }\n  }\n\n  public static final class TypedIdentifier extends Parameter {\n    public TypedIdentifier(\n        Identifier identifier, @Nullable TypeAnnotation typeAnnotation, Span span) {\n      super(span, Arrays.asList(identifier, typeAnnotation));\n    }\n\n    public Identifier getIdentifier() {\n      assert children != null;\n      var ret = (Identifier) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable TypeAnnotation getTypeAnnotation() {\n      assert children != null;\n      return (TypeAnnotation) children.get(1);\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ParameterList.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class ParameterList extends AbstractNode {\n  public ParameterList(List<Parameter> parameters, Span span) {\n    super(span, parameters);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitParameterList(this);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Parameter> getParameters() {\n    assert children != null;\n    return (List<Parameter>) children;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/QualifiedIdentifier.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport org.pkl.parser.ParserVisitor;\n\npublic final class QualifiedIdentifier extends AbstractNode {\n  public QualifiedIdentifier(List<Identifier> identifiers) {\n    super(\n        identifiers.get(0).span.endWith(identifiers.get(identifiers.size() - 1).span), identifiers);\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitQualifiedIdentifier(this);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Identifier> getIdentifiers() {\n    assert children != null;\n    return (List<Identifier>) children;\n  }\n\n  public String text() {\n    return getIdentifiers().stream().map(Identifier::getValue).collect(Collectors.joining(\".\"));\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/ReplInput.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class ReplInput extends AbstractNode {\n  public ReplInput(List<Node> nodes, Span span) {\n    super(span, nodes);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitReplInput(this);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Node> getNodes() {\n    assert children != null;\n    return (List<Node>) children;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/StringConstant.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class StringConstant extends AbstractNode {\n  private final String string;\n\n  public StringConstant(String string, Span span) {\n    super(span, null);\n    this.string = string;\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitStringConstant(this);\n  }\n\n  public String getString() {\n    return string;\n  }\n\n  @Override\n  public String toString() {\n    return \"StringConstant{string='\" + string + '\\'' + \", span=\" + span + '}';\n  }\n\n  @SuppressWarnings(\"ConstantValue\")\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    if (this == o) {\n      return true;\n    }\n    if (!super.equals(o)) {\n      return false;\n    }\n    StringConstant that = (StringConstant) o;\n    return Objects.equals(string, that.string);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(super.hashCode(), string);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/StringPart.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic abstract sealed class StringPart extends AbstractNode {\n\n  public StringPart(Span span, @Nullable List<? extends @Nullable Node> children) {\n    super(span, children);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitStringPart(this);\n  }\n\n  public static final class StringChars extends StringPart {\n    private final String string;\n\n    public StringChars(String string, Span span) {\n      super(span, null);\n      this.string = string;\n    }\n\n    public String getString() {\n      return string;\n    }\n\n    @Override\n    public String toString() {\n      return \"StringChars{string='\" + string + '\\'' + \", span=\" + span + '}';\n    }\n\n    @SuppressWarnings(\"ConstantValue\")\n    @Override\n    public boolean equals(Object o) {\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      if (this == o) {\n        return true;\n      }\n      if (!super.equals(o)) {\n        return false;\n      }\n      StringChars that = (StringChars) o;\n      return Objects.equals(string, that.string);\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(super.hashCode(), string);\n    }\n  }\n\n  public static final class StringInterpolation extends StringPart {\n    public StringInterpolation(Expr expr, Span span) {\n      super(span, List.of(expr));\n    }\n\n    public Expr getExpr() {\n      assert children != null;\n      var ret = (Expr) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/Type.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic abstract sealed class Type extends AbstractNode {\n\n  public Type(Span span, @Nullable List<? extends @Nullable Node> children) {\n    super(span, children);\n  }\n\n  public static final class UnknownType extends Type {\n    public UnknownType(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitUnknownType(this);\n    }\n  }\n\n  public static final class NothingType extends Type {\n    public NothingType(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitNothingType(this);\n    }\n  }\n\n  public static final class ModuleType extends Type {\n    public ModuleType(Span span) {\n      super(span, null);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitModuleType(this);\n    }\n  }\n\n  public static final class StringConstantType extends Type {\n    public StringConstantType(StringConstant str, Span span) {\n      super(span, List.of(str));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitStringConstantType(this);\n    }\n\n    public StringConstant getStr() {\n      assert children != null;\n      var ret = (StringConstant) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class DeclaredType extends Type {\n    public DeclaredType(QualifiedIdentifier name, @Nullable TypeArgumentList typeArgs, Span span) {\n      super(span, Arrays.asList(name, typeArgs));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitDeclaredType(this);\n    }\n\n    public QualifiedIdentifier getName() {\n      assert children != null;\n      var ret = (QualifiedIdentifier) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    public @Nullable TypeArgumentList getArgs() {\n      assert children != null;\n      return (TypeArgumentList) children.get(1);\n    }\n  }\n\n  public static final class ParenthesizedType extends Type {\n    public ParenthesizedType(Type type, Span span) {\n      super(span, List.of(type));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitParenthesizedType(this);\n    }\n\n    public Type getType() {\n      assert children != null;\n      var ret = (Type) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class NullableType extends Type {\n    public NullableType(Type type, Span span) {\n      super(span, List.of(type));\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitNullableType(this);\n    }\n\n    public Type getType() {\n      assert children != null;\n      var ret = (Type) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n  }\n\n  public static final class ConstrainedType extends Type {\n    public ConstrainedType(List<Node> nodes, Span span) {\n      super(span, nodes);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitConstrainedType(this);\n    }\n\n    public Type getType() {\n      assert children != null;\n      var ret = (Type) children.get(0);\n      assert ret != null;\n      return ret;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<Expr> getExprs() {\n      assert children != null;\n      return (List<Expr>) children.subList(1, children.size());\n    }\n  }\n\n  public static final class UnionType extends Type {\n    private final int defaultIndex;\n\n    public UnionType(List<Type> types, int defaultIndex, Span span) {\n      super(span, types);\n      this.defaultIndex = defaultIndex;\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitUnionType(this);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<Type> getTypes() {\n      assert children != null;\n      return (List<Type>) children;\n    }\n\n    public int getDefaultIndex() {\n      return defaultIndex;\n    }\n\n    @Override\n    public String toString() {\n      return \"UnionType{\"\n          + \"defaultIndex=\"\n          + defaultIndex\n          + \", span=\"\n          + span\n          + \", children=\"\n          + children\n          + '}';\n    }\n\n    @SuppressWarnings(\"ConstantValue\")\n    @Override\n    public boolean equals(Object o) {\n      if (o == null || getClass() != o.getClass()) {\n        return false;\n      }\n      if (this == o) {\n        return true;\n      }\n      if (!super.equals(o)) {\n        return false;\n      }\n      UnionType unionType = (UnionType) o;\n      return defaultIndex == unionType.defaultIndex;\n    }\n\n    @Override\n    public int hashCode() {\n      return Objects.hash(super.hashCode(), defaultIndex);\n    }\n  }\n\n  public static final class FunctionType extends Type {\n    public FunctionType(List<Node> children, Span span) {\n      super(span, children);\n    }\n\n    @Override\n    public <T> T accept(ParserVisitor<? extends T> visitor) {\n      return visitor.visitFunctionType(this);\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public List<Type> getArgs() {\n      assert children != null;\n      return (List<Type>) children.subList(0, children.size() - 1);\n    }\n\n    public Type getRet() {\n      assert children != null;\n      var ret = (Type) children.get(children.size() - 1);\n      assert ret != null;\n      return ret;\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAlias.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\n@SuppressWarnings(\"unused\")\npublic final class TypeAlias extends AbstractNode {\n  private final int modifiersOffset;\n  private final int nameOffset;\n\n  public TypeAlias(List<Node> children, int modifiersOffset, int nameOffset, Span span) {\n    super(span, children);\n    this.modifiersOffset = modifiersOffset;\n    this.nameOffset = nameOffset;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitTypeAlias(this);\n  }\n\n  public @Nullable DocComment getDocComment() {\n    assert children != null;\n    return (DocComment) children.get(0);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Annotation> getAnnotations() {\n    assert children != null;\n    return (List<Annotation>) children.subList(1, modifiersOffset);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Modifier> getModifiers() {\n    assert children != null;\n    return (List<Modifier>) children.subList(modifiersOffset, nameOffset);\n  }\n\n  public Keyword getTypealiasKeyword() {\n    assert children != null;\n    var ret = (Keyword) children.get(nameOffset);\n    assert ret != null;\n    return ret;\n  }\n\n  public Identifier getName() {\n    assert children != null;\n    var ret = (Identifier) children.get(nameOffset + 1);\n    assert ret != null;\n    return ret;\n  }\n\n  public @Nullable TypeParameterList getTypeParameterList() {\n    assert children != null;\n    return (TypeParameterList) children.get(nameOffset + 2);\n  }\n\n  public Type getType() {\n    assert children != null;\n    var ret = (Type) children.get(nameOffset + 3);\n    assert ret != null;\n    return ret;\n  }\n\n  @SuppressWarnings(\"DuplicatedCode\")\n  public Span getHeaderSpan() {\n    Span start = null;\n    assert children != null;\n    for (var i = modifiersOffset; i < children.size(); i++) {\n      var child = children.get(i);\n      if (child != null) {\n        start = child.span();\n        break;\n      }\n    }\n    var endNode = children.get(nameOffset + 1);\n    assert endNode != null;\n    var end = endNode.span();\n    var tparList = children.get(nameOffset + 2);\n    if (tparList != null) {\n      end = tparList.span();\n    }\n    assert start != null;\n    return start.endWith(end);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/TypeAnnotation.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class TypeAnnotation extends AbstractNode {\n  public TypeAnnotation(Type type, Span span) {\n    super(span, List.of(type));\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitTypeAnnotation(this);\n  }\n\n  public Type getType() {\n    assert children != null;\n    var ret = (Type) children.get(0);\n    assert ret != null;\n    return ret;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/TypeArgumentList.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\n\npublic class TypeArgumentList extends AbstractNode {\n\n  public TypeArgumentList(List<Type> children, Span span) {\n    super(span, children);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<Type> getTypes() {\n    assert children != null;\n    return (List<Type>) children;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitTypeArgumentList(this);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameter.java",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic final class TypeParameter extends AbstractNode {\n  private final @Nullable Variance variance;\n\n  public TypeParameter(@Nullable Variance variance, Identifier identifier, Span span) {\n    super(span, List.of(identifier));\n    this.variance = variance;\n  }\n\n  @Override\n  public <T> T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitTypeParameter(this);\n  }\n\n  public @Nullable Variance getVariance() {\n    return variance;\n  }\n\n  public Identifier getIdentifier() {\n    assert children != null;\n    var ret = (Identifier) children.get(0);\n    assert ret != null;\n    return ret;\n  }\n\n  @Override\n  public String toString() {\n    return \"TypeParameter{\"\n        + \"variance=\"\n        + variance\n        + \", children=\"\n        + children\n        + \", span=\"\n        + span\n        + '}';\n  }\n\n  @SuppressWarnings(\"ConstantValue\")\n  @Override\n  public boolean equals(Object o) {\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    if (this == o) {\n      return true;\n    }\n    if (!super.equals(o)) {\n      return false;\n    }\n    TypeParameter that = (TypeParameter) o;\n    return variance == that.variance;\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(super.hashCode(), variance);\n  }\n\n  public enum Variance {\n    IN,\n    OUT\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/TypeParameterList.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax;\n\nimport java.util.List;\nimport org.pkl.parser.ParserVisitor;\nimport org.pkl.parser.Span;\nimport org.pkl.parser.util.Nullable;\n\npublic class TypeParameterList extends AbstractNode {\n  public TypeParameterList(List<TypeParameter> parameters, Span span) {\n    super(span, parameters);\n  }\n\n  @Override\n  public <T> @Nullable T accept(ParserVisitor<? extends T> visitor) {\n    return visitor.visitTypeParameterList(this);\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public List<TypeParameter> getParameters() {\n    assert children != null;\n    return (List<TypeParameter>) children;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/generic/FullSpan.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax.generic;\n\npublic record FullSpan(\n    int charIndex, int length, int lineBegin, int colBegin, int lineEnd, int colEnd) {\n\n  public FullSpan endWith(FullSpan end) {\n    return new FullSpan(\n        charIndex,\n        end.charIndex - charIndex + end.length,\n        lineBegin,\n        colBegin,\n        end.lineEnd,\n        end.colEnd);\n  }\n\n  public boolean isSameLine(FullSpan other) {\n    return lineEnd == other.lineBegin;\n  }\n\n  public FullSpan stopSpan() {\n    return new FullSpan(charIndex + length - 1, 1, lineEnd, colEnd, lineEnd, colEnd);\n  }\n\n  @Override\n  public String toString() {\n    return \"(%d:%d - %d:%d)\".formatted(lineBegin, colBegin, lineEnd, colEnd);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/generic/Node.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax.generic;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Objects;\nimport org.pkl.parser.util.Nullable;\n\npublic class Node {\n  public final List<Node> children;\n  public final FullSpan span;\n  public final NodeType type;\n  private @Nullable String text;\n\n  public Node(NodeType type, FullSpan span) {\n    this(type, span, Collections.emptyList());\n  }\n\n  public Node(NodeType type, FullSpan span, List<Node> children) {\n    this.type = type;\n    this.span = span;\n    this.children = Collections.unmodifiableList(children);\n  }\n\n  public Node(NodeType type, List<Node> children) {\n    this.type = type;\n    if (children.isEmpty()) throw new RuntimeException(\"No children or span given for node\");\n    var end = children.get(children.size() - 1).span;\n    this.span = children.get(0).span.endWith(end);\n    this.children = Collections.unmodifiableList(children);\n  }\n\n  public String text(char[] source) {\n    if (text == null) {\n      text = new String(source, span.charIndex(), span.length());\n    }\n    return text;\n  }\n\n  /** Returns the first child of type {@code type} or {@code null}. */\n  public @Nullable Node findChildByType(NodeType type) {\n    for (var child : children) {\n      if (child.type == type) return child;\n    }\n    return null;\n  }\n\n  @Override\n  public boolean equals(Object o) {\n    if (this == o) {\n      return true;\n    }\n    if (o == null || getClass() != o.getClass()) {\n      return false;\n    }\n    Node node = (Node) o;\n    return Objects.equals(children, node.children)\n        && Objects.equals(span, node.span)\n        && Objects.equals(type, node.type);\n  }\n\n  @Override\n  public int hashCode() {\n    return Objects.hash(children, span, type);\n  }\n\n  @Override\n  public String toString() {\n    return \"Node{type='\" + type + \"', span=\" + span + \", children=\" + children + '}';\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/generic/NodeType.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.syntax.generic;\n\npublic enum NodeType {\n  TERMINAL,\n  SHEBANG,\n  // affixes,\n  LINE_COMMENT(NodeKind.AFFIX),\n  BLOCK_COMMENT(NodeKind.AFFIX),\n  SEMICOLON(NodeKind.AFFIX),\n\n  MODULE,\n  DOC_COMMENT,\n  DOC_COMMENT_LINE,\n  MODIFIER,\n  MODIFIER_LIST,\n  AMENDS_CLAUSE,\n  EXTENDS_CLAUSE,\n  MODULE_DECLARATION,\n  MODULE_DEFINITION,\n  ANNOTATION,\n  IDENTIFIER,\n  QUALIFIED_IDENTIFIER,\n  IMPORT,\n  IMPORT_ALIAS,\n  IMPORT_LIST,\n  TYPEALIAS,\n  TYPEALIAS_HEADER,\n  TYPEALIAS_BODY,\n  CLASS,\n  CLASS_HEADER,\n  CLASS_HEADER_EXTENDS,\n  CLASS_BODY,\n  CLASS_BODY_ELEMENTS,\n  CLASS_METHOD,\n  CLASS_METHOD_HEADER,\n  CLASS_METHOD_BODY,\n  CLASS_PROPERTY,\n  CLASS_PROPERTY_HEADER,\n  CLASS_PROPERTY_HEADER_BEGIN,\n  CLASS_PROPERTY_BODY,\n  OBJECT_BODY,\n  OBJECT_MEMBER_LIST,\n  PARAMETER,\n  TYPE_ANNOTATION,\n  PARAMETER_LIST,\n  PARAMETER_LIST_ELEMENTS,\n  TYPE_PARAMETER_LIST,\n  TYPE_PARAMETER_LIST_ELEMENTS,\n  ARGUMENT_LIST,\n  ARGUMENT_LIST_ELEMENTS,\n  TYPE_ARGUMENT_LIST,\n  TYPE_ARGUMENT_LIST_ELEMENTS,\n  OBJECT_PARAMETER_LIST,\n  TYPE_PARAMETER,\n  STRING_CHARS,\n  OPERATOR,\n  STRING_NEWLINE,\n  STRING_ESCAPE,\n\n  // members\n  OBJECT_ELEMENT,\n  OBJECT_PROPERTY,\n  OBJECT_PROPERTY_HEADER,\n  OBJECT_PROPERTY_HEADER_BEGIN,\n  OBJECT_PROPERTY_BODY,\n  OBJECT_METHOD,\n  MEMBER_PREDICATE,\n  OBJECT_ENTRY,\n  OBJECT_ENTRY_HEADER,\n  OBJECT_SPREAD,\n  WHEN_GENERATOR,\n  WHEN_GENERATOR_HEADER,\n  FOR_GENERATOR,\n  FOR_GENERATOR_HEADER,\n  FOR_GENERATOR_HEADER_DEFINITION,\n  FOR_GENERATOR_HEADER_DEFINITION_HEADER,\n\n  // expressions\n  THIS_EXPR(NodeKind.EXPR),\n  OUTER_EXPR(NodeKind.EXPR),\n  MODULE_EXPR(NodeKind.EXPR),\n  NULL_EXPR(NodeKind.EXPR),\n  THROW_EXPR(NodeKind.EXPR),\n  TRACE_EXPR(NodeKind.EXPR),\n  IMPORT_EXPR(NodeKind.EXPR),\n  READ_EXPR(NodeKind.EXPR),\n  NEW_EXPR(NodeKind.EXPR),\n  NEW_HEADER,\n  UNARY_MINUS_EXPR(NodeKind.EXPR),\n  LOGICAL_NOT_EXPR(NodeKind.EXPR),\n  FUNCTION_LITERAL_EXPR(NodeKind.EXPR),\n  FUNCTION_LITERAL_BODY,\n  PARENTHESIZED_EXPR(NodeKind.EXPR),\n  PARENTHESIZED_EXPR_ELEMENTS,\n  SUPER_SUBSCRIPT_EXPR(NodeKind.EXPR),\n  SUPER_ACCESS_EXPR(NodeKind.EXPR),\n  SUBSCRIPT_EXPR(NodeKind.EXPR),\n  QUALIFIED_ACCESS_EXPR(NodeKind.EXPR),\n  IF_EXPR(NodeKind.EXPR),\n  IF_HEADER,\n  IF_CONDITION,\n  IF_CONDITION_EXPR,\n  IF_THEN_EXPR,\n  IF_ELSE_EXPR,\n  LET_EXPR(NodeKind.EXPR),\n  LET_PARAMETER_DEFINITION,\n  LET_PARAMETER,\n  BOOL_LITERAL_EXPR(NodeKind.EXPR),\n  INT_LITERAL_EXPR(NodeKind.EXPR),\n  FLOAT_LITERAL_EXPR(NodeKind.EXPR),\n  SINGLE_LINE_STRING_LITERAL_EXPR(NodeKind.EXPR),\n  MULTI_LINE_STRING_LITERAL_EXPR(NodeKind.EXPR),\n  UNQUALIFIED_ACCESS_EXPR(NodeKind.EXPR),\n  NON_NULL_EXPR(NodeKind.EXPR),\n  AMENDS_EXPR(NodeKind.EXPR),\n  BINARY_OP_EXPR(NodeKind.EXPR),\n\n  // types\n  UNKNOWN_TYPE(NodeKind.TYPE),\n  NOTHING_TYPE(NodeKind.TYPE),\n  MODULE_TYPE(NodeKind.TYPE),\n  UNION_TYPE(NodeKind.TYPE),\n  FUNCTION_TYPE(NodeKind.TYPE),\n  FUNCTION_TYPE_PARAMETERS,\n  PARENTHESIZED_TYPE(NodeKind.TYPE),\n  PARENTHESIZED_TYPE_ELEMENTS,\n  DECLARED_TYPE(NodeKind.TYPE),\n  NULLABLE_TYPE(NodeKind.TYPE),\n  STRING_CONSTANT_TYPE(NodeKind.TYPE),\n  CONSTRAINED_TYPE(NodeKind.TYPE),\n  CONSTRAINED_TYPE_CONSTRAINT,\n  CONSTRAINED_TYPE_ELEMENTS;\n\n  private final NodeKind kind;\n\n  NodeType() {\n    this.kind = NodeKind.NONE;\n  }\n\n  NodeType(NodeKind kind) {\n    this.kind = kind;\n  }\n\n  public boolean isAffix() {\n    return kind == NodeKind.AFFIX;\n  }\n\n  public boolean isExpression() {\n    return kind == NodeKind.EXPR;\n  }\n\n  public boolean isType() {\n    return kind == NodeKind.TYPE;\n  }\n\n  private enum NodeKind {\n    TYPE,\n    EXPR,\n    AFFIX,\n    NONE;\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/generic/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.parser.syntax.generic;\n\nimport org.pkl.parser.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/syntax/package-info.java",
    "content": "@NonnullByDefault\npackage org.pkl.parser.syntax;\n\nimport org.pkl.parser.util.NonnullByDefault;\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/util/ErrorMessages.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.util;\n\nimport java.text.MessageFormat;\nimport java.util.Locale;\nimport java.util.ResourceBundle;\n\npublic final class ErrorMessages {\n  private ErrorMessages() {}\n\n  public static String create(String messageName, Object... args) {\n    var locale = Locale.getDefault();\n    var errorMessage =\n        ResourceBundle.getBundle(\"org.pkl.parser.errorMessages\", locale).getString(messageName);\n\n    // only format if `errorMessage` is a format string\n    if (args.length == 0) return errorMessage;\n\n    var formatter = new MessageFormat(errorMessage, locale);\n    return formatter.format(args);\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/util/NonnullByDefault.java",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.util;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport javax.annotation.meta.TypeQualifierDefault;\n\n/**\n * Indicates that method return types and method parameters in the annotated package are Nonnull\n * unless explicitly annotated with {@link Nullable}.\n *\n * <p>This annotation is a generalization of {@link javax.annotation.ParametersAreNonnullByDefault}.\n * All Pkl packages containing Java code should carry this annotation.\n *\n * <p>Ideally, this default would apply to every {@link ElementType#TYPE_USE}, but I haven't been\n * able to make this work reasonably in <a\n * href=\"https://youtrack.jetbrains.com/issue/IDEA-278618\">IntelliJ</a>.\n */\n@Documented\n@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER})\n@javax.annotation.Nonnull\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.PACKAGE)\npublic @interface NonnullByDefault {}\n"
  },
  {
    "path": "pkl-parser/src/main/java/org/pkl/parser/util/Nullable.java",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser.util;\n\nimport static javax.annotation.meta.When.MAYBE;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport javax.annotation.meta.TypeQualifierNickname;\n\n@Target({\n  ElementType.TYPE_PARAMETER,\n  ElementType.TYPE_USE,\n  ElementType.PARAMETER,\n  ElementType.FIELD,\n  ElementType.METHOD\n})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@javax.annotation.Nonnull(when = MAYBE)\n@TypeQualifierNickname\npublic @interface Nullable {}\n"
  },
  {
    "path": "pkl-parser/src/main/resources/org/pkl/parser/errorMessages.properties",
    "content": "unexpectedCharacter=\\\nUnexpected character `{0}`. Did you mean `{1}`?\n\nunexpectedCharacter3=\\\nUnexpected character `{0}`. Did you mean `{1}`, `{2}` or `{3}`?\n\nunexpectedToken=\\\nUnexpected token `{0}`. Expected `{1}`.\n\nunexpectedToken2=\\\nUnexpected token `{0}`. Expected `{1}` or `{2}`.\n\nunexpectedTokenForExpression=\\\nUnexpected token `{0}`.\n\nunexpectedTokenForType=\\\nUnexpected token `{0}`. Expected a type.\n\nunexpectedTokenForType2=\\\nUnexpected token `{0}`. Expected a type or `{1}`.\n\nunexpectedCurlyProbablyAmendsExpression=\\\nUnexpected token: `'{'`.\\n\\\n\\n\\\nIf you meant to write an amends expression, wrap the parent in parentheses. Try: `({0}) '{' ... '}'`\n\nunexpectedEndOfFile=\\\nUnexpected end of file.\n\ninvalidCharacter=\\\nInvalid identifier `{0}`.\n\ninvalidTopLevelToken=\\\nInvalid token at position. Expected a class, typealias, method, or property.\n\ninvalidProperty=\\\nInvalid property definition. Expected a type annotation, `=` or `{`.\n\ninvalidSeparatorPosition=\\\nUnexpected separator character.\\n\\\n\\n\\\nThe separator character (`_`) cannot follow `0x`, `0b`, `.`, `e`, or 'E' in a number literal.\n\ninvalidCharacterEscapeSequence=\\\nInvalid character escape sequence `{0}`.\\n\\\n\\n\\\nValid character escape sequences are:  {1}n  {1}r  {1}t  {1}\"  {1}\\\\\n\ninvalidUnicodeEscapeSequence=\\\nInvalid Unicode escape sequence `{0}`.\\n\\\n\\n\\\nValid Unicode escape sequences are {1}'{'0'}' to {1}'{'10FFFF'}' (1-6 hexadecimal characters).\n\nmissingDelimiter=\\\nMissing `{0}` delimiter.\n\nunterminatedUnicodeEscapeSequence=\\\nUnterminated Unicode escape sequence `{0}`.\\n\\\n\\n\\\nUnicode escape sequences must end with `}`.\n\nkeywordNotAllowedHere=\\\nKeyword `{0}` is not allowed here.\\n\\\n\\n\\\nIf you must use this name as identifier, enclose it in backticks.\n\ntypeAnnotationInAmends=\\\nProperties with type annotations cannot have object bodies.\\n\\\n\\n\\\nTo define both a type annotation and an object body, try using assignment instead.\\n\\\nFor example: `obj: Bird = new { ... }`.\n\nstringContentMustBeginOnNewLine=\\\nThe content of a multi-line string must begin on a new line.\n\nstringIndentationMustMatchLastLine=\\\nLine must match or exceed indentation of the String's last line.\n\nclosingStringDelimiterMustBeginOnNewLine=\\\nThe closing delimiter of a multi-line string must begin on a new line.\n\ninterpolationInConstant=\\\nString constant cannot have interpolated values.\n\nmultipleUnionDefaults=\\\nA type union cannot have more than one default type.\n\nnotAUnion=\\\nOnly type unions can have a default marker (*).\n\nwrongHeaders=\\\n{0} cannot have doc comments, annotations or modifiers.\n\ndanglingDocComment=\\\nDangling documentation comment.\\n\\\n\\n\\\nDocumentation comments must be attached to modules, classes, typealiases, methods, or properties.\n\nwrongShebangPosition=\\\nShebangs are only allowed at the very beginning of a file.\n"
  },
  {
    "path": "pkl-parser/src/test/kotlin/org/pkl/parser/GenericSexpRenderer.kt",
    "content": "/*\n * Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser\n\nimport java.util.EnumSet\nimport org.pkl.parser.syntax.generic.Node\nimport org.pkl.parser.syntax.generic.NodeType\n\nclass GenericSexpRenderer(code: String) {\n  private var tab = \"\"\n  private var buf = StringBuilder()\n  private val source = code.toCharArray()\n\n  fun render(node: Node): String {\n    innerRender(node)\n    return buf.toString()\n  }\n\n  private fun innerRender(node: Node) {\n    if (node.type == NodeType.UNION_TYPE) {\n      renderUnionType(node)\n      return\n    }\n    doRender(name(node), collectChildren(node))\n  }\n\n  private fun doRender(name: String, children: List<Node>) {\n    buf.append(tab)\n    buf.append(\"(\")\n    buf.append(name)\n    val oldTab = increaseTab()\n    for (child in children) {\n      buf.append('\\n')\n      innerRender(child)\n    }\n    tab = oldTab\n    buf.append(')')\n  }\n\n  private fun renderUnionType(node: Node) {\n    buf.append(tab)\n    buf.append(\"(\")\n    buf.append(name(node))\n    val oldTab = increaseTab()\n    var previousTerminal: Node? = null\n    for (child in node.children) {\n      if (child.type == NodeType.TERMINAL) previousTerminal = child\n      if (child.type in IGNORED_CHILDREN) continue\n      buf.append('\\n')\n      if (previousTerminal != null && previousTerminal.text(source) == \"*\") {\n        previousTerminal = null\n        renderDefaultUnionType(child)\n      } else {\n        innerRender(child)\n      }\n    }\n    tab = oldTab\n    buf.append(')')\n  }\n\n  private fun renderDefaultUnionType(node: Node) {\n    buf.append(tab)\n    buf.append(\"(defaultUnionType\\n\")\n    val oldTab = increaseTab()\n    innerRender(node)\n    tab = oldTab\n    buf.append(')')\n  }\n\n  private fun collectChildren(node: Node): List<Node> =\n    when (node.type) {\n      NodeType.MULTI_LINE_STRING_LITERAL_EXPR ->\n        node.children.filter { it.type !in IGNORED_CHILDREN && !it.type.isStringData() }\n      NodeType.SINGLE_LINE_STRING_LITERAL_EXPR -> {\n        val children = node.children.filter { it.type !in IGNORED_CHILDREN }\n        val res = mutableListOf<Node>()\n        var prev: Node? = null\n        for (child in children) {\n          val inARow = child.type.isStringData() && (prev != null && prev.type.isStringData())\n          if (!inARow) {\n            res += child\n          }\n          prev = child\n        }\n        res\n      }\n      NodeType.DOC_COMMENT -> listOf()\n      else -> {\n        val nodes = mutableListOf<Node>()\n        for (child in node.children) {\n          if (child.type in IGNORED_CHILDREN) continue\n          if (child.type in UNPACK_CHILDREN) {\n            nodes += collectChildren(child)\n          } else {\n            nodes += child\n          }\n        }\n        nodes\n      }\n    }\n\n  private fun NodeType.isStringData(): Boolean =\n    this == NodeType.STRING_CHARS || this == NodeType.STRING_ESCAPE\n\n  private fun name(node: Node): String =\n    when (node.type) {\n      NodeType.MODULE_DECLARATION -> \"moduleHeader\"\n      NodeType.IMPORT -> importName(node, isExpr = false)\n      NodeType.IMPORT_EXPR -> importName(node, isExpr = true)\n      NodeType.BINARY_OP_EXPR -> binopName(node)\n      NodeType.CLASS -> \"clazz\"\n      NodeType.EXTENDS_CLAUSE,\n      NodeType.AMENDS_CLAUSE -> \"extendsOrAmendsClause\"\n      NodeType.TYPEALIAS -> \"typeAlias\"\n      NodeType.STRING_ESCAPE -> \"stringChars\"\n      NodeType.QUALIFIED_ACCESS_EXPR -> {\n        val op = node.findChildByType(NodeType.OPERATOR)!!\n        if (op.text(source) == \".\") \"qualifiedAccessExpr\" else \"nullableQualifiedAccessExpr\"\n      }\n      NodeType.READ_EXPR -> {\n        val terminal = node.children.find { it.type == NodeType.TERMINAL }!!.text(source)\n        when (terminal) {\n          \"read*\" -> \"readGlobExpr\"\n          \"read?\" -> \"readNullExpr\"\n          else -> \"readExpr\"\n        }\n      }\n      else -> {\n        val names = node.type.name.split('_').map { it.lowercase() }\n        if (names.size > 1) {\n          val capitalized = names.drop(1).map { n -> n.replaceFirstChar { it.titlecase() } }\n          (listOf(names[0]) + capitalized).joinToString(\"\")\n        } else names[0]\n      }\n    }\n\n  private fun importName(node: Node, isExpr: Boolean): String {\n    val terminal = node.children.find { it.type == NodeType.TERMINAL }!!.text(source)\n    val suffix = if (isExpr) \"Expr\" else \"Clause\"\n    return if (terminal == \"import*\") \"importGlob$suffix\" else \"import$suffix\"\n  }\n\n  private fun binopName(node: Node): String {\n    val op = node.children.find { it.type == NodeType.OPERATOR }!!.text(source)\n    return when (op) {\n      \"**\" -> \"exponentiationExpr\"\n      \"*\",\n      \"/\",\n      \"~/\",\n      \"%\" -> \"multiplicativeExpr\"\n      \"+\",\n      \"-\" -> \"additiveExpr\"\n      \">\",\n      \">=\",\n      \"<\",\n      \"<=\" -> \"comparisonExpr\"\n      \"is\" -> \"typeCheckExpr\"\n      \"as\" -> \"typeCastExpr\"\n      \"==\",\n      \"!=\" -> \"equalityExpr\"\n      \"&&\" -> \"logicalAndExpr\"\n      \"||\" -> \"logicalOrExpr\"\n      \"|>\" -> \"pipeExpr\"\n      \"??\" -> \"nullCoalesceExpr\"\n      \".\" -> \"qualifiedAccessExpr\"\n      \"?.\" -> \"nullableQualifiedAccessExpr\"\n      else -> throw RuntimeException(\"Unknown operator: $op\")\n    }\n  }\n\n  private fun increaseTab(): String {\n    val old = tab\n    tab += \"  \"\n    return old\n  }\n\n  companion object {\n    private val IGNORED_CHILDREN =\n      EnumSet.of(\n        NodeType.LINE_COMMENT,\n        NodeType.BLOCK_COMMENT,\n        NodeType.SHEBANG,\n        NodeType.SEMICOLON,\n        NodeType.TERMINAL,\n        NodeType.OPERATOR,\n        NodeType.STRING_NEWLINE,\n      )\n\n    private val UNPACK_CHILDREN =\n      EnumSet.of(\n        NodeType.MODULE_DEFINITION,\n        NodeType.IMPORT_LIST,\n        NodeType.IMPORT_ALIAS,\n        NodeType.TYPEALIAS_HEADER,\n        NodeType.TYPEALIAS_BODY,\n        NodeType.CLASS_PROPERTY_HEADER,\n        NodeType.CLASS_PROPERTY_HEADER_BEGIN,\n        NodeType.CLASS_PROPERTY_BODY,\n        NodeType.CLASS_METHOD_HEADER,\n        NodeType.CLASS_METHOD_BODY,\n        NodeType.CLASS_HEADER,\n        NodeType.CLASS_HEADER_EXTENDS,\n        NodeType.CLASS_BODY_ELEMENTS,\n        NodeType.MODIFIER_LIST,\n        NodeType.NEW_HEADER,\n        NodeType.OBJECT_MEMBER_LIST,\n        NodeType.OBJECT_ENTRY_HEADER,\n        NodeType.OBJECT_PROPERTY_HEADER,\n        NodeType.OBJECT_PROPERTY_HEADER_BEGIN,\n        NodeType.OBJECT_PROPERTY_BODY,\n        NodeType.OBJECT_PARAMETER_LIST,\n        NodeType.FOR_GENERATOR_HEADER,\n        NodeType.FOR_GENERATOR_HEADER_DEFINITION,\n        NodeType.FOR_GENERATOR_HEADER_DEFINITION_HEADER,\n        NodeType.WHEN_GENERATOR_HEADER,\n        NodeType.IF_HEADER,\n        NodeType.IF_CONDITION,\n        NodeType.IF_CONDITION_EXPR,\n        NodeType.IF_THEN_EXPR,\n        NodeType.IF_ELSE_EXPR,\n        NodeType.FUNCTION_LITERAL_BODY,\n        NodeType.ARGUMENT_LIST_ELEMENTS,\n        NodeType.PARAMETER_LIST_ELEMENTS,\n        NodeType.CONSTRAINED_TYPE_CONSTRAINT,\n        NodeType.CONSTRAINED_TYPE_ELEMENTS,\n        NodeType.TYPE_PARAMETER_LIST_ELEMENTS,\n        NodeType.TYPE_ARGUMENT_LIST_ELEMENTS,\n        NodeType.LET_PARAMETER_DEFINITION,\n        NodeType.LET_PARAMETER,\n        NodeType.PARENTHESIZED_EXPR_ELEMENTS,\n        NodeType.PARENTHESIZED_TYPE_ELEMENTS,\n        NodeType.FUNCTION_TYPE_PARAMETERS,\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/test/kotlin/org/pkl/parser/LexerTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass LexerTest {\n\n  @Test\n  fun isRegularIdentifier() {\n    assertThat(Lexer.isRegularIdentifier(\"pigeon\")).isTrue\n\n    assertThat(Lexer.isRegularIdentifier(\"_pigeon\")).isTrue\n    assertThat(Lexer.isRegularIdentifier(\"f_red\")).isTrue\n\n    assertThat(Lexer.isRegularIdentifier(\"\\$pigeon\")).isTrue\n    assertThat(Lexer.isRegularIdentifier(\"f\\$red\")).isTrue\n\n    assertThat(Lexer.isRegularIdentifier(\"जावास्क्रिप्ट\")).isTrue\n\n    assertThat(Lexer.isRegularIdentifier(\"this\")).isFalse\n    assertThat(Lexer.isRegularIdentifier(\"😀\")).isFalse\n  }\n\n  @Test\n  fun maybeQuoteIdentifier() {\n    assertThat(Lexer.maybeQuoteIdentifier(\"pigeon\")).isEqualTo(\"pigeon\")\n    assertThat(Lexer.maybeQuoteIdentifier(\"_pigeon\")).isEqualTo(\"_pigeon\")\n    assertThat(Lexer.maybeQuoteIdentifier(\"\\$pigeon\")).isEqualTo(\"\\$pigeon\")\n    assertThat(Lexer.maybeQuoteIdentifier(\"जावास्क्रिप्ट\")).isEqualTo(\"जावास्क्रिप्ट\")\n\n    assertThat(Lexer.maybeQuoteIdentifier(\"this\")).isEqualTo(\"`this`\")\n    assertThat(Lexer.maybeQuoteIdentifier(\"😀\")).isEqualTo(\"`😀`\")\n  }\n\n  @Test\n  fun lexSingleBacktick() {\n    val thrown = assertThrows<ParserError> { Lexer(\"`\").next() }\n    assertThat(thrown).hasMessageContaining(\"Unexpected character `EOF`\")\n  }\n\n  @Test\n  fun rejectsSentinelBetweenTokens() {\n    val lexerFFFF = Lexer(\"// Comment with \\uFFFF character\\nclass \\uFFFF Bar\")\n    assertThat(lexerFFFF.next()).isEqualTo(Token.LINE_COMMENT)\n    assertThat(lexerFFFF.next()).isEqualTo(Token.CLASS)\n    val thrown = assertThrows<ParserError> { lexerFFFF.next() }\n    assertThat(thrown).hasMessageContaining(\"Invalid identifier\")\n  }\n\n  @Test\n  fun acceptsAllUnicodeCodepointsInComments() {\n    // Test valid Unicode codepoints can appear literally\n    // without being misinterpreted as EOF.\n\n    // Test the previously problematic U+7FFF (Short.MAX_VALUE)\n    val lexer7FFF = Lexer(\"// Comment with \\u7FFF character\\nclass Foo\")\n    assertThat(lexer7FFF.next()).isEqualTo(Token.LINE_COMMENT)\n    assertThat(lexer7FFF.next()).isEqualTo(Token.CLASS)\n    assertThat(lexer7FFF.next()).isEqualTo(Token.IDENTIFIER)\n    assertThat(lexer7FFF.next()).isEqualTo(Token.EOF)\n\n    // Test U+FFFF (Character.MAX_VALUE)\n    val lexerFFFF = Lexer(\"// Comment with \\uFFFF character\\nclass Bar\")\n    assertThat(lexerFFFF.next()).isEqualTo(Token.LINE_COMMENT)\n    assertThat(lexerFFFF.next()).isEqualTo(Token.CLASS)\n    assertThat(lexerFFFF.next()).isEqualTo(Token.IDENTIFIER)\n    assertThat(lexerFFFF.next()).isEqualTo(Token.EOF)\n\n    // Test a range of codepoints including edge cases\n    val testCodepoints =\n      listOf(\n        0x0000, // NULL\n        0x0001, // Start of heading\n        0x007F, // DELETE\n        0x0080, // First non-ASCII\n        0x7FFE, // One before the old problematic value\n        0x7FFF, // Old EOF sentinel (Short.MAX_VALUE)\n        0x8000, // One after the old problematic value\n        0xFFFE, // One before Character.MAX_VALUE\n        0xFFFF, // Character.MAX_VALUE (noncharacter)\n      )\n\n    for (codepoint in testCodepoints) {\n      val char = codepoint.toChar()\n      // Put the test character in a comment, followed by actual code tokens\n      val input = \"// Test $char\\nmodule Test\"\n      val lexer = Lexer(input)\n      assertThat(lexer.next())\n        .withFailMessage(\"Codepoint U+%04X should be accepted in comment\", codepoint)\n        .isEqualTo(Token.LINE_COMMENT)\n      assertThat(lexer.next())\n        .withFailMessage(\n          \"Codepoint U+%04X should not terminate input early (expecting MODULE)\",\n          codepoint,\n        )\n        .isEqualTo(Token.MODULE)\n      assertThat(lexer.next())\n        .withFailMessage(\n          \"Codepoint U+%04X should not terminate input early (expecting IDENTIFIER)\",\n          codepoint,\n        )\n        .isEqualTo(Token.IDENTIFIER)\n      assertThat(lexer.next()).isEqualTo(Token.EOF)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/test/kotlin/org/pkl/parser/ParserComparisonTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser\n\nimport java.nio.file.Path\nimport kotlin.io.path.Path\nimport kotlin.io.path.extension\nimport kotlin.io.path.pathString\nimport kotlin.io.path.readText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.SoftAssertions\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.parallel.Execution\nimport org.junit.jupiter.api.parallel.ExecutionMode\nimport org.pkl.commons.walk\n\n@Execution(ExecutionMode.CONCURRENT)\nclass ParserComparisonTest {\n\n  @Test\n  fun compareSnippetTests() {\n    SoftAssertions.assertSoftly { softly ->\n      getSnippets()\n        .parallelStream()\n        .map { Pair(it.pathString, it.readText()) }\n        .forEach { (path, snippet) ->\n          try {\n            compare(snippet, path, softly)\n          } catch (e: GenericParserError) {\n            softly.fail(\"path: $path. Message: ${e.message}\", e)\n          } catch (e: ParserError) {\n            softly.fail(\"path: $path. Message: ${e.message}\", e)\n          }\n        }\n    }\n  }\n\n  fun getSnippets(): List<Path> {\n    return Path(\"../pkl-core/src/test/files/LanguageSnippetTests/input\")\n      .walk()\n      .filter { path ->\n        val pathStr = path.toString().replace(\"\\\\\", \"/\")\n        path.extension == \"pkl\" &&\n          !exceptions.any { pathStr.endsWith(it) } &&\n          !regexExceptions.any { it.matches(pathStr) }\n      }\n      .toList()\n  }\n\n  fun compare(code: String, path: String? = null, softly: SoftAssertions? = null) {\n    val (sexp, genSexp) = renderBoth(code)\n    when {\n      (path != null && softly != null) ->\n        softly.assertThat(genSexp).`as`(\"path: $path\").isEqualTo(sexp)\n      else -> assertThat(genSexp).`as`(\"path: $path\").isEqualTo(sexp)\n    }\n  }\n\n  fun renderBoth(code: String): Pair<String, String> =\n    Pair(renderCode(code), renderGenericCode(code))\n\n  companion object {\n    private fun renderCode(code: String): String {\n      val parser = Parser()\n      val mod = parser.parseModule(code)\n      val renderer = SexpRenderer()\n      return renderer.render(mod)\n    }\n\n    private fun renderGenericCode(code: String): String {\n      val parser = GenericParser()\n      val mod = parser.parseModule(code)\n      val renderer = GenericSexpRenderer(code)\n      return renderer.render(mod)\n    }\n\n    // tests that are not syntactically valid Pkl\n    private val exceptions =\n      setOf(\n        \"stringError1.pkl\",\n        \"annotationIsNotExpression2.pkl\",\n        \"amendsRequiresParens.pkl\",\n        \"errors/binopDifferentLine.pkl\",\n        \"errors/parser18.pkl\",\n        \"errors/nested1.pkl\",\n        \"errors/invalidCharacterEscape.pkl\",\n        \"errors/invalidUnicodeEscape.pkl\",\n        \"errors/unterminatedUnicodeEscape.pkl\",\n        \"errors/keywordNotAllowedHere1.pkl\",\n        \"errors/keywordNotAllowedHere2.pkl\",\n        \"errors/keywordNotAllowedHere3.pkl\",\n        \"errors/keywordNotAllowedHere4.pkl\",\n        \"errors/moduleWithHighMinPklVersionAndParseErrors.pkl\",\n        \"errors/underscore.pkl\",\n        \"errors/shebang.pkl\",\n        \"errors/emptyParenthesizedTypeAnnotation.pkl\",\n        \"notAUnionDefault.pkl\",\n        \"multipleDefaults.pkl\",\n        \"modules/invalidModule1.pkl\",\n        \"singleBacktick.pkl\",\n      )\n\n    private val regexExceptions =\n      setOf(\n        Regex(\".*/errors/delimiters/.*\"),\n        Regex(\".*/errors/parser\\\\d+\\\\.pkl\"),\n        Regex(\".*/parser/.*\"),\n      )\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/test/kotlin/org/pkl/parser/SexpRenderer.kt",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser\n\nimport org.pkl.parser.syntax.*\nimport org.pkl.parser.syntax.Annotation\nimport org.pkl.parser.syntax.Expr.*\nimport org.pkl.parser.syntax.Expr.ModuleExpr\nimport org.pkl.parser.syntax.ObjectMember.*\nimport org.pkl.parser.syntax.Parameter.TypedIdentifier\nimport org.pkl.parser.syntax.Type.*\n\n@Suppress(\"MemberVisibilityCanBePrivate\")\nclass SexpRenderer {\n  private var tab = \"\"\n  private var buf = StringBuilder()\n\n  fun render(mod: Module): String {\n    renderModule(mod)\n    val res = buf.toString()\n    reset()\n    return res\n  }\n\n  fun renderModule(mod: Module) {\n    buf.append(tab)\n    buf.append(\"(module\")\n    val oldTab = increaseTab()\n    if (mod.decl !== null) {\n      buf.append('\\n')\n      renderModuleDeclaration(mod.decl!!)\n    }\n    for (imp in mod.imports) {\n      buf.append('\\n')\n      renderImport(imp)\n    }\n    for (entry in sortModuleEntries(mod)) {\n      buf.append('\\n')\n      when (entry) {\n        is Class -> renderClass(entry)\n        is TypeAlias -> renderTypeAlias(entry)\n        is ClassProperty -> renderClassPropertyEntry(entry)\n        is ClassMethod -> renderClassMethod(entry)\n      }\n    }\n    tab = oldTab\n    buf.append(')')\n  }\n\n  fun renderModuleDeclaration(decl: ModuleDecl) {\n    buf.append(tab)\n    buf.append(\"(moduleHeader\")\n    val oldTab = increaseTab()\n    if (decl.docComment !== null) {\n      buf.append('\\n')\n      renderDocComment()\n    }\n    for (ann in decl.annotations) {\n      buf.append('\\n')\n      renderAnnotation(ann)\n    }\n    for (mod in decl.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    if (decl.name !== null) {\n      buf.append('\\n')\n      renderQualifiedIdent(decl.name!!)\n    }\n    if (decl.extendsOrAmendsDecl !== null) {\n      buf.append('\\n')\n      renderExtendsOrAmendsClause(decl.extendsOrAmendsDecl!!)\n    }\n    tab = oldTab\n    buf.append(')')\n  }\n\n  fun renderExtendsOrAmendsClause(clause: ExtendsOrAmendsClause) {\n    buf.append(tab)\n    buf.append(\"(extendsOrAmendsClause\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderStringConstant(clause.url)\n    tab = oldTab\n    buf.append(')')\n  }\n\n  fun renderImport(imp: ImportClause) {\n    buf.append(tab)\n    if (imp.isGlob) {\n      buf.append(\"(importGlobClause\")\n    } else {\n      buf.append(\"(importClause\")\n    }\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderStringConstant(imp.importStr)\n    if (imp.alias !== null) {\n      buf.append('\\n')\n      buf.append(tab)\n      buf.append(\"(identifier)\")\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderClass(clazz: Class) {\n    buf.append(tab)\n    buf.append(\"(clazz\")\n    val oldTab = increaseTab()\n    if (clazz.docComment !== null) {\n      buf.append('\\n')\n      renderDocComment()\n    }\n    for (ann in clazz.annotations) {\n      buf.append('\\n')\n      renderAnnotation(ann)\n    }\n    for (mod in clazz.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    val tparList = clazz.typeParameterList\n    if (tparList !== null) {\n      buf.append('\\n')\n      renderTypeParameterList(tparList)\n    }\n    if (clazz.superClass !== null) {\n      buf.append('\\n')\n      renderType(clazz.superClass!!)\n    }\n    if (clazz.body !== null) {\n      buf.append('\\n')\n      renderClassBody(clazz.body!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderClassBody(classBody: ClassBody) {\n    buf.append(tab)\n    buf.append(\"(classBody\")\n    val oldTab = increaseTab()\n    for (entry in sortClassEntries(classBody)) {\n      buf.append('\\n')\n      when (entry) {\n        is ClassProperty -> renderClassPropertyEntry(entry)\n        is ClassMethod -> renderClassMethod(entry)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderTypeAlias(`typealias`: TypeAlias) {\n    buf.append(tab)\n    buf.append(\"(typeAlias\")\n    val oldTab = increaseTab()\n    if (`typealias`.docComment !== null) {\n      buf.append('\\n')\n      renderDocComment()\n    }\n    for (ann in `typealias`.annotations) {\n      buf.append('\\n')\n      renderAnnotation(ann)\n    }\n    for (mod in `typealias`.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    val tparList = `typealias`.typeParameterList\n    if (tparList !== null) {\n      buf.append('\\n')\n      renderTypeParameterList(tparList)\n    }\n    buf.append('\\n')\n    renderType(`typealias`.type)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderClassPropertyEntry(classEntry: ClassProperty) {\n    buf.append(tab)\n    buf.append(\"(classProperty\")\n    val oldTab = increaseTab()\n    if (classEntry.docComment !== null) {\n      buf.append('\\n')\n      renderDocComment()\n    }\n    for (ann in classEntry.annotations) {\n      buf.append('\\n')\n      renderAnnotation(ann)\n    }\n    for (mod in classEntry.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    classEntry.typeAnnotation?.let { typeAnnotation ->\n      buf.append('\\n')\n      renderTypeAnnotation(typeAnnotation)\n    }\n    classEntry.expr?.let { expr ->\n      buf.append('\\n')\n      renderExpr(expr)\n    }\n    classEntry.bodyList?.let { bodyList ->\n      for (body in bodyList) {\n        buf.append('\\n')\n        renderObjectBody(body)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderClassMethod(classMethod: ClassMethod) {\n    buf.append(tab)\n    buf.append(\"(classMethod\")\n    val oldTab = increaseTab()\n    if (classMethod.docComment !== null) {\n      buf.append('\\n')\n      renderDocComment()\n    }\n    for (ann in classMethod.annotations) {\n      buf.append('\\n')\n      renderAnnotation(ann)\n    }\n    for (mod in classMethod.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    val tparList = classMethod.typeParameterList\n    if (tparList !== null) {\n      buf.append('\\n')\n      renderTypeParameterList(tparList)\n    }\n    buf.append('\\n')\n    renderParameterList(classMethod.parameterList)\n    if (classMethod.typeAnnotation !== null) {\n      buf.append('\\n')\n      renderTypeAnnotation(classMethod.typeAnnotation!!)\n    }\n    if (classMethod.expr != null) {\n      buf.append('\\n')\n      renderExpr(classMethod.expr!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderDocComment() {\n    buf.append(tab)\n    buf.append(\"(docComment)\")\n  }\n\n  fun renderAnnotation(ann: Annotation) {\n    buf.append(tab)\n    buf.append(\"(annotation\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderType(ann.type)\n    if (ann.body !== null) {\n      buf.append('\\n')\n      renderObjectBody(ann.body!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderQualifiedIdent(name: QualifiedIdentifier) {\n    buf.append(tab)\n    buf.append(\"(qualifiedIdentifier\")\n    val oldTab = increaseTab()\n    for (i in name.identifiers.indices) {\n      buf.append('\\n')\n      buf.append(tab)\n      buf.append(\"(identifier)\")\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderObjectBody(body: ObjectBody) {\n    buf.append(tab)\n    buf.append(\"(objectBody\")\n    val oldTab = increaseTab()\n    for (par in body.parameters) {\n      buf.append('\\n')\n      renderParameter(par)\n    }\n    for (member in body.members) {\n      buf.append('\\n')\n      renderMember(member)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderParameterList(parList: ParameterList) {\n    buf.append(tab)\n    buf.append(\"(parameterList\")\n    val oldTab = increaseTab()\n    for (par in parList.parameters) {\n      buf.append('\\n')\n      renderParameter(par)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderParameter(par: Parameter) {\n    buf.append(tab)\n    if (par is TypedIdentifier) {\n      buf.append(\"(parameter\")\n      val oldTab = increaseTab()\n      buf.append('\\n')\n      buf.append(tab)\n      buf.append(\"(identifier)\")\n      if (par.typeAnnotation !== null) {\n        buf.append('\\n')\n        renderTypeAnnotation(par.typeAnnotation!!)\n      }\n      buf.append(')')\n      tab = oldTab\n    } else {\n      buf.append(\"(parameter)\")\n    }\n  }\n\n  fun renderArgumentList(argumentList: ArgumentList) {\n    buf.append(tab)\n    buf.append(\"(argumentList\")\n    val oldTab = increaseTab()\n    for (arg in argumentList.arguments) {\n      buf.append('\\n')\n      renderExpr(arg)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderExpr(expr: Expr) {\n    when (expr) {\n      is ThisExpr -> {\n        buf.append(tab)\n        buf.append(\"(thisExpr)\")\n      }\n      is OuterExpr -> {\n        buf.append(tab)\n        buf.append(\"(outerExpr)\")\n      }\n      is ModuleExpr -> {\n        buf.append(tab)\n        buf.append(\"(moduleExpr)\")\n      }\n      is NullLiteralExpr -> {\n        buf.append(tab)\n        buf.append(\"(nullExpr)\")\n      }\n      is BoolLiteralExpr -> {\n        buf.append(tab)\n        buf.append(\"(boolLiteralExpr)\")\n      }\n      is IntLiteralExpr -> {\n        buf.append(tab)\n        buf.append(\"(intLiteralExpr)\")\n      }\n      is FloatLiteralExpr -> {\n        buf.append(tab)\n        buf.append(\"(floatLiteralExpr)\")\n      }\n      is SingleLineStringLiteralExpr -> renderSingleLineStringLiteral(expr)\n      is MultiLineStringLiteralExpr -> renderMultiLineStringLiteral(expr)\n      is ThrowExpr -> renderThrowExpr(expr)\n      is TraceExpr -> renderTraceExpr(expr)\n      is ImportExpr -> renderImportExpr(expr)\n      is ReadExpr -> renderReadExpr(expr)\n      is UnqualifiedAccessExpr -> renderUnqualifiedAccessExpr(expr)\n      is QualifiedAccessExpr -> renderQualifiedAccessExpr(expr)\n      is SuperAccessExpr -> renderSuperAccessExpr(expr)\n      is SuperSubscriptExpr -> renderSuperSubscriptExpr(expr)\n      is SubscriptExpr -> renderSubscriptExpr(expr)\n      is IfExpr -> renderIfExpr(expr)\n      is LetExpr -> renderLetExpr(expr)\n      is FunctionLiteralExpr -> renderFunctionLiteralExpr(expr)\n      is ParenthesizedExpr -> renderParenthesizedExpr(expr)\n      is NewExpr -> renderNewExpr(expr)\n      is AmendsExpr -> renderAmendsExpr(expr)\n      is NonNullExpr -> renderNonNullExpr(expr)\n      is UnaryMinusExpr -> renderUnaryMinusExpr(expr)\n      is LogicalNotExpr -> renderLogicalNotExpr(expr)\n      is BinaryOperatorExpr -> renderBinaryOpExpr(expr)\n      is TypeCheckExpr -> renderTypeCheckExpr(expr)\n      is TypeCastExpr -> renderTypeCastExpr(expr)\n    }\n  }\n\n  fun renderSingleLineStringLiteral(expr: SingleLineStringLiteralExpr) {\n    buf.append(tab)\n    buf.append(\"(singleLineStringLiteralExpr\")\n    val oldTab = increaseTab()\n    for (part in expr.parts) {\n      if (part is StringPart.StringInterpolation) {\n        buf.append('\\n')\n        renderExpr(part.expr)\n      } else {\n        buf.append('\\n').append(tab)\n        buf.append(\"(stringChars)\")\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderMultiLineStringLiteral(expr: MultiLineStringLiteralExpr) {\n    buf.append(tab)\n    buf.append(\"(multiLineStringLiteralExpr\")\n    val oldTab = increaseTab()\n    // render only interpolated expressions because\n    // the new parser parses string differently\n    for (part in expr.parts) {\n      if (part is StringPart.StringInterpolation) {\n        buf.append('\\n')\n        renderExpr(part.expr)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderThrowExpr(expr: ThrowExpr) {\n    buf.append(tab)\n    buf.append(\"(throwExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderTraceExpr(expr: TraceExpr) {\n    buf.append(tab)\n    buf.append(\"(traceExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderReadExpr(expr: ReadExpr) {\n    val name =\n      when (expr.readType) {\n        ReadType.READ -> \"(readExpr\"\n        ReadType.GLOB -> \"(readGlobExpr\"\n        ReadType.NULL -> \"(readNullExpr\"\n      }\n    buf.append(tab)\n    buf.append(name)\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderImportExpr(expr: ImportExpr) {\n    buf.append(tab)\n    val name = if (expr.isGlob) \"(importGlobExpr\" else \"(importExpr\"\n    buf.append(name)\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderStringConstant(expr.importStr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderUnqualifiedAccessExpr(expr: UnqualifiedAccessExpr) {\n    buf.append(tab)\n    buf.append(\"(unqualifiedAccessExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    if (expr.argumentList !== null) {\n      buf.append('\\n')\n      renderArgumentList(expr.argumentList!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderUnqualifiedAccessExprOfQualified(expr: QualifiedAccessExpr) {\n    buf.append(tab)\n    buf.append(\"(unqualifiedAccessExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    if (expr.argumentList !== null) {\n      buf.append('\\n')\n      renderArgumentList(expr.argumentList!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderQualifiedAccessExpr(expr: QualifiedAccessExpr) {\n    buf.append(tab)\n    buf.append(if (expr.isNullable) \"(nullableQualifiedAccessExpr\" else \"(qualifiedAccessExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append('\\n')\n    renderUnqualifiedAccessExprOfQualified(expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderSuperAccessExpr(expr: SuperAccessExpr) {\n    buf.append(tab)\n    buf.append(\"(superAccessExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    if (expr.argumentList !== null) {\n      buf.append('\\n')\n      renderArgumentList(expr.argumentList!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderSuperSubscriptExpr(expr: SuperSubscriptExpr) {\n    buf.append(tab)\n    buf.append(\"(superSubscriptExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.arg)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderSubscriptExpr(expr: SubscriptExpr) {\n    buf.append(tab)\n    buf.append(\"(subscriptExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append('\\n')\n    renderExpr(expr.arg)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderIfExpr(expr: IfExpr) {\n    buf.append(tab)\n    buf.append(\"(ifExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.cond)\n    buf.append('\\n')\n    renderExpr(expr.then)\n    buf.append('\\n')\n    renderExpr(expr.els)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderLetExpr(expr: LetExpr) {\n    buf.append(tab)\n    buf.append(\"(letExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderParameter(expr.parameter)\n    buf.append('\\n')\n    renderExpr(expr.bindingExpr)\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderFunctionLiteralExpr(expr: FunctionLiteralExpr) {\n    buf.append(tab)\n    buf.append(\"(functionLiteralExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderParameterList(expr.parameterList)\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderParenthesizedExpr(expr: ParenthesizedExpr) {\n    buf.append(tab)\n    buf.append(\"(parenthesizedExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderNewExpr(expr: NewExpr) {\n    buf.append(tab)\n    buf.append(\"(newExpr\")\n    val oldTab = increaseTab()\n    if (expr.type != null) {\n      buf.append('\\n')\n      renderType(expr.type!!)\n    }\n    buf.append('\\n')\n    renderObjectBody(expr.body)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderAmendsExpr(expr: AmendsExpr) {\n    buf.append(tab)\n    buf.append(\"(amendsExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append('\\n')\n    renderObjectBody(expr.body)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderNonNullExpr(expr: NonNullExpr) {\n    buf.append(tab)\n    buf.append(\"(nonNullExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderUnaryMinusExpr(expr: UnaryMinusExpr) {\n    buf.append(tab)\n    buf.append(\"(unaryMinusExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderLogicalNotExpr(expr: LogicalNotExpr) {\n    buf.append(tab)\n    buf.append(\"(logicalNotExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderBinaryOpExpr(expr: BinaryOperatorExpr) {\n    buf.append(tab)\n    val name =\n      when (expr.op) {\n        Operator.POW -> \"(exponentiationExpr\"\n        Operator.MULT,\n        Operator.DIV,\n        Operator.INT_DIV,\n        Operator.MOD -> \"(multiplicativeExpr\"\n        Operator.PLUS,\n        Operator.MINUS -> \"(additiveExpr\"\n        Operator.LT,\n        Operator.GT,\n        Operator.LTE,\n        Operator.GTE -> \"(comparisonExpr\"\n        Operator.IS,\n        Operator.AS -> \"(typeTestExpr\"\n        Operator.EQ_EQ,\n        Operator.NOT_EQ -> \"(equalityExpr\"\n        Operator.AND -> \"(logicalAndExpr\"\n        Operator.OR -> \"(logicalOrExpr\"\n        Operator.PIPE -> \"(pipeExpr\"\n        Operator.NULL_COALESCE -> \"(nullCoalesceExpr\"\n        else -> throw RuntimeException(\"Should never receive a dot operator here\")\n      }\n    buf.append(name)\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.left)\n    buf.append('\\n')\n    renderExpr(expr.right)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderTypeCheckExpr(expr: TypeCheckExpr) {\n    buf.append(tab)\n    buf.append(\"(typeCheckExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append('\\n')\n    renderType(expr.type)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderTypeCastExpr(expr: TypeCastExpr) {\n    buf.append(tab)\n    buf.append(\"(typeCastExpr\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(expr.expr)\n    buf.append('\\n')\n    renderType(expr.type)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderStringConstant(str: StringConstant) {\n    buf.append(tab)\n    buf.append(\"(stringChars)\")\n  }\n\n  fun renderTypeAnnotation(typeAnnotation: TypeAnnotation) {\n    buf.append(tab)\n    buf.append(\"(typeAnnotation\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderType(typeAnnotation.type)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderType(type: Type) {\n    when (type) {\n      is UnknownType -> {\n        buf.append(tab)\n        buf.append(\"(unknownType)\")\n      }\n      is NothingType -> {\n        buf.append(tab)\n        buf.append(\"(nothingType)\")\n      }\n      is ModuleType -> {\n        buf.append(tab)\n        buf.append(\"(moduleType)\")\n      }\n      is StringConstantType -> renderStringConstantType(type)\n      is DeclaredType -> renderDeclaredType(type)\n      is ParenthesizedType -> renderParenthesizedType(type)\n      is NullableType -> renderNullableType(type)\n      is ConstrainedType -> renderConstrainedType(type)\n      is UnionType -> renderUnionType(type)\n      is FunctionType -> renderFunctionType(type)\n    }\n  }\n\n  fun renderStringConstantType(type: StringConstantType) {\n    buf.append(tab)\n    buf.append(\"(stringConstantType\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderStringConstant(type.str)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderDeclaredType(type: DeclaredType) {\n    buf.append(tab)\n    buf.append(\"(declaredType\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderQualifiedIdent(type.name)\n    if (type.args !== null) {\n      buf.append('\\n')\n      renderTypeArgumentList(type.args!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderTypeArgumentList(typeArgumentList: TypeArgumentList) {\n    buf.append(tab)\n    buf.append(\"(typeArgumentList\")\n    val oldTab = increaseTab()\n    for (arg in typeArgumentList.types) {\n      buf.append('\\n')\n      renderType(arg)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderParenthesizedType(type: ParenthesizedType) {\n    buf.append(tab)\n    buf.append(\"(parenthesizedType\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderType(type.type)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderNullableType(type: NullableType) {\n    buf.append(tab)\n    buf.append(\"(nullableType\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderType(type.type)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderConstrainedType(type: ConstrainedType) {\n    buf.append(tab)\n    buf.append(\"(constrainedType\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderType(type.type)\n    for (expr in type.exprs) {\n      buf.append('\\n')\n      renderExpr(expr)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderUnionType(type: UnionType) {\n    buf.append(tab)\n    buf.append(\"(unionType\")\n    val oldTab = increaseTab()\n    for (idx in type.types.indices) {\n      val typ = type.types[idx]\n      buf.append('\\n')\n      if (type.defaultIndex == idx) {\n        buf.append(tab)\n        buf.append(\"(defaultUnionType\")\n        val oldTab2 = increaseTab()\n        buf.append('\\n')\n        renderType(typ)\n        buf.append(')')\n        tab = oldTab2\n      } else {\n        renderType(typ)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderFunctionType(type: FunctionType) {\n    buf.append(tab)\n    buf.append(\"(functionType\")\n    val oldTab = increaseTab()\n    for (arg in type.args) {\n      buf.append('\\n')\n      renderType(arg)\n    }\n    buf.append('\\n')\n    renderType(type.ret)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderMember(member: ObjectMember) {\n    when (member) {\n      is ObjectElement -> renderObjectElement(member)\n      is ObjectProperty -> renderObjectProperty(member)\n      is ObjectMethod -> renderObjectMethod(member)\n      is MemberPredicate -> renderMemberPredicate(member)\n      is ObjectEntry -> renderObjectEntry(member)\n      is ObjectSpread -> renderObjectSpread(member)\n      is WhenGenerator -> renderWhenGenerator(member)\n      is ForGenerator -> renderForGenerator(member)\n    }\n  }\n\n  fun renderObjectElement(element: ObjectElement) {\n    buf.append(tab)\n    buf.append(\"(objectElement\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(element.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderObjectProperty(property: ObjectProperty) {\n    buf.append(tab)\n    buf.append(\"(objectProperty\")\n    val oldTab = increaseTab()\n    for (mod in property.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    buf.append('\\n')\n    buf.append(tab)\n    buf.append(\"(identifier)\")\n    if (property.typeAnnotation !== null) {\n      buf.append('\\n')\n      renderTypeAnnotation(property.typeAnnotation!!)\n    }\n    property.expr?.let {\n      buf.append('\\n')\n      renderExpr(it)\n    }\n    property.bodyList?.let { bodies ->\n      for (body in bodies) {\n        buf.append('\\n')\n        renderObjectBody(body)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderObjectMethod(method: ObjectMethod) {\n    buf.append(tab)\n    buf.append(\"(objectMethod\")\n    val oldTab = increaseTab()\n    for (mod in method.modifiers) {\n      buf.append('\\n')\n      renderModifier(mod)\n    }\n    buf.append('\\n').append(tab)\n    buf.append(\"(identifier)\")\n    val tparList = method.typeParameterList\n    if (tparList !== null) {\n      renderTypeParameterList(tparList)\n    }\n    buf.append('\\n')\n    renderParameterList(method.paramList)\n    if (method.typeAnnotation !== null) {\n      buf.append('\\n')\n      renderTypeAnnotation(method.typeAnnotation!!)\n    }\n    buf.append('\\n')\n    renderExpr(method.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderMemberPredicate(predicate: MemberPredicate) {\n    buf.append(tab)\n    buf.append(\"(memberPredicate\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(predicate.pred)\n    predicate.expr?.let { expr ->\n      buf.append('\\n')\n      renderExpr(expr)\n    }\n    predicate.bodyList?.let { bodyList ->\n      for (body in bodyList) {\n        buf.append('\\n')\n        renderObjectBody(body)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderObjectEntry(entry: ObjectEntry) {\n    buf.append(tab)\n    buf.append(\"(objectEntry\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(entry.key)\n    entry.value?.let { value ->\n      buf.append('\\n')\n      renderExpr(value)\n    }\n    entry.bodyList?.let { bodyList ->\n      for (body in bodyList) {\n        buf.append('\\n')\n        renderObjectBody(body)\n      }\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderObjectSpread(spread: ObjectSpread) {\n    buf.append(tab)\n    buf.append(\"(objectSpread\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(spread.expr)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderWhenGenerator(generator: WhenGenerator) {\n    buf.append(tab)\n    buf.append(\"(whenGenerator\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderExpr(generator.predicate)\n    buf.append('\\n')\n    renderObjectBody(generator.thenClause)\n    if (generator.elseClause !== null) {\n      buf.append('\\n')\n      renderObjectBody(generator.elseClause!!)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderForGenerator(generator: ForGenerator) {\n    buf.append(tab)\n    buf.append(\"(forGenerator\")\n    val oldTab = increaseTab()\n    buf.append('\\n')\n    renderParameter(generator.p1)\n    if (generator.p2 != null) {\n      buf.append('\\n')\n      renderParameter(generator.p2!!)\n    }\n    buf.append('\\n')\n    renderExpr(generator.expr)\n    buf.append('\\n')\n    renderObjectBody(generator.body)\n    buf.append(')')\n    tab = oldTab\n  }\n\n  fun renderTypeParameterList(typeParameterList: TypeParameterList) {\n    buf.append(tab)\n    buf.append(\"(typeParameterList\")\n    val oldTab = increaseTab()\n    for (tpar in typeParameterList.parameters) {\n      buf.append('\\n')\n      renderTypeParameter(tpar)\n    }\n    buf.append(')')\n    tab = oldTab\n  }\n\n  @Suppress(\"UNUSED_PARAMETER\")\n  fun renderTypeParameter(ignored: TypeParameter?) {\n    buf.append(tab)\n    buf.append(\"(typeParameter\\n\")\n    val oldTab = increaseTab()\n    buf.append(tab)\n    buf.append(\"(identifier))\")\n    tab = oldTab\n  }\n\n  @Suppress(\"UNUSED_PARAMETER\")\n  fun renderModifier(ignored: Modifier?) {\n    buf.append(tab)\n    buf.append(\"(modifier)\")\n  }\n\n  fun reset() {\n    tab = \"\"\n    buf = StringBuilder()\n  }\n\n  private fun increaseTab(): String {\n    val old = tab\n    tab += \"  \"\n    return old\n  }\n\n  companion object {\n    private fun sortModuleEntries(mod: Module): List<Node> {\n      val res = mutableListOf<Node>()\n      res += mod.classes\n      res += mod.typeAliases\n      res += mod.properties\n      res += mod.methods\n      res.sortWith(compareBy { it.span().charIndex })\n      return res\n    }\n\n    private fun sortClassEntries(body: ClassBody): List<Node> {\n      val res = mutableListOf<Node>()\n      res += body.properties\n      res += body.methods\n      res.sortWith(compareBy { it.span().charIndex })\n      return res\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-parser/src/test/kotlin/org/pkl/parser/SpanTest.kt",
    "content": "/*\n * Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.parser\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass SpanTest {\n\n  @Test\n  fun `endWith test`() {\n    var span1 = Span(10, 20)\n    var span2 = Span(20, 20)\n    assertThat(span1.endWith(span2)).isEqualTo(Span(10, 30))\n\n    span1 = Span(10, 20)\n    span2 = Span(0, 40)\n    assertThat(span1.endWith(span2)).isEqualTo(Span(10, 30))\n\n    span1 = Span(10, 30)\n    span2 = Span(20, 20)\n    assertThat(span1.endWith(span2)).isEqualTo(Span(10, 30))\n\n    span1 = Span(10, 30)\n    span2 = Span(20, 5)\n    assertThat(span1.endWith(span2)).isEqualTo(Span(10, 15))\n  }\n}\n"
  },
  {
    "path": "pkl-server/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ben-manes.caffeine:caffeine:2.9.3=swiftExportClasspathResolvable\ncom.google.errorprone:error_prone_annotations:2.28.0=swiftExportClasspathResolvable\nio.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation\nio.opentelemetry:opentelemetry-api:1.41.0=swiftExportClasspathResolvable\nio.opentelemetry:opentelemetry-context:1.41.0=swiftExportClasspathResolvable\nnet.bytebuddy:byte-buddy:1.17.7=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testImplementationDependenciesMetadata\norg.assertj:assertj-core:3.27.6=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.bouncycastle:bcpg-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcpkix-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcprov-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.bouncycastle:bcutil-jdk18on:1.80=kotlinBouncyCastleConfiguration\norg.checkerframework:checker-qual:3.43.0=swiftExportClasspathResolvable\norg.graalvm.polyglot:polyglot:25.0.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:abi-tools-api:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:abi-tools:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-build-tools-api:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-build-tools-impl:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-compiler-runner:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-client:2.2.20=kotlinBuildToolsApiClasspath\norg.jetbrains.kotlin:kotlin-daemon-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.2.20=kotlinKlibCommonizerClasspath\norg.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20=kotlinInternalAbiValidation\norg.jetbrains.kotlin:kotlin-native-prebuilt:2.0.21=kotlinNativeBundleConfiguration\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-script-runtime:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlin:kotlin-scripting-common:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-scripting-jvm:2.2.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=apiDependenciesMetadata,compileClasspath,implementationDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.jetbrains.kotlin:swift-export-embeddable:2.2.20=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3=swiftExportClasspathResolvable\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3=swiftExportClasspathResolvable\norg.jetbrains:annotations:13.0=compileClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinInternalAbiValidation,kotlinKlibCommonizerClasspath,runtimeClasspath,swiftExportClasspathResolvable,testCompileClasspath,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-api:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-engine:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.jupiter:junit-jupiter-params:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-commons:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-engine:1.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.junit.platform:junit-platform-launcher:1.14.0=testRuntimeClasspath\norg.junit:junit-bom:5.14.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=compileClasspath,implementationDependenciesMetadata,runtimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.opentest4j:opentest4j:1.3.0=testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=runtimeClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=runtimeClasspath,testRuntimeClasspath\nempty=annotationProcessor,compileOnlyDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,sourcesJar,testAnnotationProcessor,testApiDependenciesMetadata,testCompileOnlyDependenciesMetadata,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions\n"
  },
  {
    "path": "pkl-server/pkl-server.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  pklJavaLibrary\n  pklKotlinLibrary\n  pklNativeLifecycle\n}\n\ndependencies {\n  implementation(projects.pklCore)\n  implementation(libs.msgpack)\n  implementation(libs.truffleApi)\n\n  testImplementation(projects.pklCommonsTest)\n}\n\ntasks.test { exclude(\"**/NativeServerTest.*\") }\n\nprivate fun Test.configureNativeTest() {\n  testClassesDirs = files(tasks.test.get().testClassesDirs)\n  classpath = tasks.test.get().classpath\n  include(\"**/NativeServerTest.*\")\n}\n\nval testMacExecutableAarch64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:macExecutableAarch64\")\n    configureNativeTest()\n  }\n\nval testMacExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:macExecutableAmd64\")\n    configureNativeTest()\n  }\n\nval testLinuxExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:linuxExecutableAmd64\")\n    configureNativeTest()\n  }\n\nval testLinuxExecutableAarch64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:linuxExecutableAarch64\")\n    configureNativeTest()\n  }\n\nval testAlpineExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:alpineExecutableAmd64\")\n    configureNativeTest()\n  }\n\nval testWindowsExecutableAmd64 by\n  tasks.registering(Test::class) {\n    dependsOn(\":pkl-cli:windowsExecutableAmd64\")\n    configureNativeTest()\n  }\n\ntasks.testNativeMacOsAarch64 { dependsOn(testMacExecutableAarch64) }\n\ntasks.testNativeMacOsAmd64 { dependsOn(testMacExecutableAmd64) }\n\ntasks.testNativeLinuxAarch64 { dependsOn(testLinuxExecutableAarch64) }\n\ntasks.testNativeLinuxAmd64 { dependsOn(testLinuxExecutableAmd64) }\n\ntasks.testNativeAlpineLinuxAmd64 { dependsOn(testAlpineExecutableAmd64) }\n\ntasks.testNativeWindowsAmd64 { dependsOn(testWindowsExecutableAmd64) }\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/ClientLogger.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport org.pkl.core.Logger\nimport org.pkl.core.StackFrame\nimport org.pkl.core.messaging.MessageTransport\n\ninternal class ClientLogger(\n  private val evaluatorId: Long,\n  private val transport: MessageTransport,\n) : Logger {\n  override fun trace(message: String, frame: StackFrame) {\n    transport.send(LogMessage(evaluatorId, 0, message, frame.moduleUri))\n  }\n\n  override fun warn(message: String, frame: StackFrame) {\n    transport.send(LogMessage(evaluatorId, 1, message, frame.moduleUri))\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/ClientModuleKeyFactory.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.net.URI\nimport java.util.Optional\nimport org.pkl.core.externalreader.ExternalModuleResolver\nimport org.pkl.core.externalreader.ModuleReaderSpec\nimport org.pkl.core.messaging.*\nimport org.pkl.core.module.*\n\ninternal class ClientModuleKeyFactory(\n  private val readerSpecs: Collection<ModuleReaderSpec>,\n  transport: MessageTransport,\n  evaluatorId: Long,\n) : ModuleKeyFactory {\n  private val schemes = readerSpecs.map { it.scheme }\n\n  private val resolver: ExternalModuleResolver = ExternalModuleResolver.of(transport, evaluatorId)\n\n  override fun create(uri: URI): Optional<ModuleKey> =\n    when (uri.scheme) {\n      in schemes -> {\n        val readerSpec = readerSpecs.find { it.scheme == uri.scheme }!!\n        val moduleKey = ModuleKeys.externalResolver(uri, readerSpec, resolver)\n        Optional.of(moduleKey)\n      }\n      else -> Optional.empty()\n    }\n}\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/Server.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.net.URI\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.ExecutorService\nimport java.util.concurrent.Executors\nimport java.util.regex.Pattern\nimport kotlin.random.Random\nimport org.pkl.core.*\nimport org.pkl.core.evaluatorSettings.PklEvaluatorSettings\nimport org.pkl.core.externalreader.ExternalReaderProcess\nimport org.pkl.core.externalreader.ExternalResourceResolver\nimport org.pkl.core.externalreader.ModuleReaderSpec\nimport org.pkl.core.externalreader.ResourceReaderSpec\nimport org.pkl.core.http.HttpClient\nimport org.pkl.core.messaging.MessageTransport\nimport org.pkl.core.messaging.MessageTransports\nimport org.pkl.core.messaging.ProtocolException\nimport org.pkl.core.module.ModuleKeyFactories\nimport org.pkl.core.module.ModuleKeyFactory\nimport org.pkl.core.module.ModulePathResolver\nimport org.pkl.core.packages.PackageUri\nimport org.pkl.core.project.DeclaredDependencies\nimport org.pkl.core.resource.ResourceReader\nimport org.pkl.core.resource.ResourceReaders\nimport org.pkl.core.util.IoUtils\n\nclass Server(private val transport: MessageTransport) : AutoCloseable {\n  private val evaluators: MutableMap<Long, Evaluator> = ConcurrentHashMap()\n\n  // https://github.com/jano7/executor would be the perfect executor here\n  private val executor: ExecutorService = Executors.newSingleThreadExecutor()\n\n  // ExternalProcess instances with the same ExternalReader spec are shared per evaluator\n  private val externalReaderProcesses:\n    MutableMap<Long, MutableMap<ExternalReader, ExternalReaderProcess>> =\n    ConcurrentHashMap()\n\n  companion object {\n    fun stream(inputStream: InputStream, outputStream: OutputStream): Server =\n      Server(\n        MessageTransports.stream(\n          ServerMessagePackDecoder(inputStream),\n          ServerMessagePackEncoder(outputStream),\n          ::log,\n        )\n      )\n  }\n\n  /** Starts listening to incoming messages */\n  fun start() {\n    transport.start(\n      { message ->\n        when (message) {\n          is CloseEvaluator -> handleCloseEvaluator(message)\n          else -> throw ProtocolException(\"Unexpected incoming one-way message: $message\")\n        }\n      },\n      { message ->\n        when (message) {\n          is CreateEvaluatorRequest -> handleCreateEvaluator(message)\n          is EvaluateRequest -> handleEvaluate(message)\n          else -> throw ProtocolException(\"Unexpected incoming request message: $message\")\n        }\n      },\n    )\n  }\n\n  /**\n   * Stops listening to incoming messages, cancels pending evaluation requests, and releases\n   * resources held by this server.\n   */\n  override fun close() {\n    transport.closeQuietly()\n    for ((_, evaluator) in evaluators) {\n      // if currently in use, blocks until cancellation complete\n      evaluator.closeQuietly()\n    }\n    executor.shutdown()\n  }\n\n  private fun handleCreateEvaluator(message: CreateEvaluatorRequest) {\n    val evaluatorId = Random.nextLong()\n    val baseResponse = CreateEvaluatorResponse(message.requestId(), null, null)\n\n    val evaluator =\n      try {\n        createEvaluator(message, evaluatorId)\n      } catch (e: ProtocolException) {\n        transport.send(baseResponse.copy(error = e.message ?: \"\"))\n        return\n      }\n\n    evaluators[evaluatorId] = evaluator\n    transport.send(baseResponse.copy(evaluatorId = evaluatorId))\n  }\n\n  private fun handleEvaluate(msg: EvaluateRequest) {\n    val baseResponse = EvaluateResponse(msg.requestId(), msg.evaluatorId, null, null)\n\n    val evaluator = evaluators[msg.evaluatorId]\n    if (evaluator == null) {\n      transport.send(\n        baseResponse.copy(error = \"Evaluator with ID ${msg.evaluatorId} was not found.\")\n      )\n      return\n    }\n\n    executor.execute {\n      try {\n        val src = ModuleSource.create(msg.moduleUri, msg.moduleText)\n        val resp = evaluator.evaluateExpressionPklBinary(src, msg.expr ?: \"module\")\n        transport.send(baseResponse.copy(result = resp))\n      } catch (e: PklBugException) {\n        transport.send(baseResponse.copy(error = e.toString()))\n      } catch (e: PklException) {\n        transport.send(baseResponse.copy(error = e.message ?: \"\"))\n      }\n    }\n  }\n\n  private fun handleCloseEvaluator(message: CloseEvaluator) {\n    val evaluator = evaluators.remove(message.evaluatorId)\n    if (evaluator == null) {\n      log(\"Ignoring close request for unknown evaluator ID `${message.evaluatorId}`.\")\n      return\n    }\n    evaluator.close()\n\n    // close any running ExternalProcess instances for the closed evaluator\n    externalReaderProcesses[message.evaluatorId]?.values?.forEach { it.close() }\n  }\n\n  private fun buildDeclaredDependencies(\n    projectFileUri: URI,\n    dependencies: Map<String, Dependency>,\n    myPackageUri: URI?,\n  ): DeclaredDependencies {\n    val remoteDependencies = buildMap {\n      for ((key, dep) in dependencies) {\n        if (dep is RemoteDependency) {\n          put(\n            key,\n            org.pkl.core.packages.Dependency.RemoteDependency(\n              PackageUri(dep.packageUri),\n              dep.checksums,\n            ),\n          )\n        }\n      }\n    }\n    val localDependencies = buildMap {\n      for ((key, dep) in dependencies) {\n        if (dep is Project) {\n          val localDep =\n            buildDeclaredDependencies(dep.projectFileUri, dep.dependencies, dep.packageUri)\n          put(key, localDep)\n        }\n      }\n    }\n    return DeclaredDependencies(\n      remoteDependencies,\n      localDependencies,\n      projectFileUri,\n      myPackageUri?.let(::PackageUri),\n    )\n  }\n\n  private fun createEvaluator(message: CreateEvaluatorRequest, evaluatorId: Long): Evaluator {\n    val modulePaths = message.modulePaths ?: emptyList()\n    val resolver = ModulePathResolver(modulePaths)\n\n    try {\n      return with(EvaluatorBuilder.unconfigured()) {\n        setStackFrameTransformer(StackFrameTransformers.defaultTransformer)\n        color = false\n        httpClient =\n          with(HttpClient.builder()) {\n            message.http?.proxy?.let { proxy ->\n              setProxy(proxy.address, proxy.noProxy ?: listOf())\n              proxy.address?.let(IoUtils::setSystemProxy)\n              proxy.noProxy?.let { System.setProperty(\"http.nonProxyHosts\", it.joinToString(\"|\")) }\n            }\n            message.http?.caCertificates?.let(::addCertificates)\n            message.http?.rewrites?.let(::setRewrites)\n            buildLazily()\n          }\n        securityManager =\n          with(SecurityManagers.standardBuilder()) {\n            message.allowedModules?.let { patterns ->\n              setAllowedModules(patterns.map { Pattern.compile(it) })\n            }\n            message.allowedResources?.let { patterns ->\n              setAllowedResources(patterns.map { Pattern.compile(it) })\n            }\n            setRootDir(message.rootDir)\n            build()\n          }\n        logger = ClientLogger(evaluatorId, transport)\n        addModuleKeyFactories(createModuleKeyFactories(message, evaluatorId, resolver))\n        addResourceReaders(createResourceReaders(message, evaluatorId, resolver))\n        message.env?.let { environmentVariables = it }\n        message.properties?.let { externalProperties = it }\n        timeout = message.timeout\n        moduleCacheDir = message.cacheDir\n        message.project?.let { proj ->\n          val dependencies = buildDeclaredDependencies(proj.projectFileUri, proj.dependencies, null)\n          log(\"Got dependencies: $dependencies\")\n          setProjectDependencies(dependencies)\n        }\n        outputFormat = message.outputFormat\n        message.traceMode?.let { traceMode = it }\n        build()\n      }\n    } catch (e: IllegalArgumentException) {\n      throw ProtocolException(e.message ?: \"Failed to create an evalutor. $e\", e)\n    }\n  }\n\n  private fun createResourceReaders(\n    message: CreateEvaluatorRequest,\n    evaluatorId: Long,\n    modulePathResolver: ModulePathResolver,\n  ): List<ResourceReader> = buildList {\n    add(ResourceReaders.environmentVariable())\n    add(ResourceReaders.externalProperty())\n    add(ResourceReaders.file())\n    add(ResourceReaders.http())\n    add(ResourceReaders.https())\n    add(ResourceReaders.pkg())\n    add(ResourceReaders.projectpackage())\n    add(ResourceReaders.modulePath(modulePathResolver))\n    for ((scheme, spec) in message.externalResourceReaders ?: emptyMap()) {\n      add(\n        ResourceReaders.externalProcess(scheme, getExternalProcess(evaluatorId, spec), evaluatorId)\n      )\n    }\n    // add client-side resource readers last to ensure they win over builtin ones\n    for (readerSpec in message.clientResourceReaders ?: emptyList()) {\n      add(\n        ResourceReaders.externalResolver(\n          ResourceReaderSpec(\n            readerSpec.scheme,\n            readerSpec.hasHierarchicalUris,\n            readerSpec.isGlobbable,\n          ),\n          ExternalResourceResolver.of(transport, evaluatorId),\n        )\n      )\n    }\n  }\n\n  private fun createModuleKeyFactories(\n    message: CreateEvaluatorRequest,\n    evaluatorId: Long,\n    modulePathResolver: ModulePathResolver,\n  ): List<ModuleKeyFactory> = buildList {\n    // add client-side module key factory first to ensure it wins over builtin ones\n    if (message.clientModuleReaders?.isNotEmpty() == true) {\n      val readerSpecs =\n        message.clientModuleReaders.map {\n          ModuleReaderSpec(it.scheme, it.hasHierarchicalUris, it.isLocal, it.isGlobbable)\n        }\n      add(ClientModuleKeyFactory(readerSpecs, transport, evaluatorId))\n    }\n    for ((scheme, spec) in message.externalModuleReaders ?: emptyMap()) {\n      add(\n        ModuleKeyFactories.externalProcess(\n          scheme,\n          getExternalProcess(evaluatorId, spec),\n          evaluatorId,\n        )\n      )\n    }\n    add(ModuleKeyFactories.standardLibrary)\n    addAll(ModuleKeyFactories.fromServiceProviders())\n    add(ModuleKeyFactories.file)\n    add(ModuleKeyFactories.modulePath(modulePathResolver))\n    add(ModuleKeyFactories.pkg)\n    add(ModuleKeyFactories.projectpackage)\n    add(ModuleKeyFactories.http)\n    add(ModuleKeyFactories.genericUrl)\n  }\n\n  private fun getExternalProcess(evaluatorId: Long, spec: ExternalReader): ExternalReaderProcess =\n    externalReaderProcesses\n      .computeIfAbsent(evaluatorId) { ConcurrentHashMap() }\n      .computeIfAbsent(spec) {\n        ExternalReaderProcess.of(PklEvaluatorSettings.ExternalReader(it.executable, it.arguments))\n      }\n}\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/ServerMessagePackDecoder.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.io.InputStream\nimport java.net.URI\nimport java.nio.file.Path\nimport java.time.Duration\nimport org.msgpack.core.MessagePack\nimport org.msgpack.core.MessageUnpacker\nimport org.msgpack.value.Value\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.messaging.BaseMessagePackDecoder\nimport org.pkl.core.messaging.Message\nimport org.pkl.core.packages.Checksums\n\nclass ServerMessagePackDecoder(unpacker: MessageUnpacker) : BaseMessagePackDecoder(unpacker) {\n\n  constructor(stream: InputStream) : this(MessagePack.newDefaultUnpacker(stream))\n\n  override fun decodeMessage(msgType: Message.Type, map: Map<Value, Value>): Message? {\n    return when (msgType) {\n      Message.Type.CREATE_EVALUATOR_REQUEST ->\n        CreateEvaluatorRequest(\n          get(map, \"requestId\").asIntegerValue().asLong(),\n          unpackStringListOrNull(map, \"allowedModules\"),\n          unpackStringListOrNull(map, \"allowedResources\"),\n          unpackListOrNull(map, \"clientModuleReaders\") { unpackModuleReaderSpec(it)!! },\n          unpackListOrNull(map, \"clientResourceReaders\") { unpackResourceReaderSpec(it)!! },\n          unpackStringListOrNull(map, \"modulePaths\", Path::of),\n          unpackStringMapOrNull(map, \"env\"),\n          unpackStringMapOrNull(map, \"properties\"),\n          unpackLongOrNull(map, \"timeoutSeconds\", Duration::ofSeconds),\n          unpackStringOrNull(map, \"rootDir\", Path::of),\n          unpackStringOrNull(map, \"cacheDir\", Path::of),\n          unpackStringOrNull(map, \"outputFormat\"),\n          map.unpackProject(),\n          map.unpackHttp(),\n          unpackStringMapOrNull(map, \"externalModuleReaders\", ::unpackExternalReader),\n          unpackStringMapOrNull(map, \"externalResourceReaders\", ::unpackExternalReader),\n          unpackStringOrNull(map, \"traceMode\") { TraceMode.valueOf(it.uppercase()) },\n        )\n      Message.Type.CREATE_EVALUATOR_RESPONSE ->\n        CreateEvaluatorResponse(\n          unpackLong(map, \"requestId\"),\n          unpackLongOrNull(map, \"evaluatorId\"),\n          unpackStringOrNull(map, \"error\"),\n        )\n      Message.Type.CLOSE_EVALUATOR -> CloseEvaluator(unpackLong(map, \"evaluatorId\"))\n      Message.Type.EVALUATE_REQUEST ->\n        EvaluateRequest(\n          unpackLong(map, \"requestId\"),\n          unpackLong(map, \"evaluatorId\"),\n          URI(unpackString(map, \"moduleUri\")),\n          unpackStringOrNull(map, \"moduleText\"),\n          unpackStringOrNull(map, \"expr\"),\n        )\n      Message.Type.EVALUATE_RESPONSE ->\n        EvaluateResponse(\n          unpackLong(map, \"requestId\"),\n          unpackLong(map, \"evaluatorId\"),\n          unpackByteArray(map, \"result\"),\n          unpackStringOrNull(map, \"error\"),\n        )\n      Message.Type.LOG_MESSAGE ->\n        LogMessage(\n          unpackLong(map, \"evaluatorId\"),\n          unpackInt(map, \"level\"),\n          unpackString(map, \"message\"),\n          unpackString(map, \"frameUri\"),\n        )\n      else -> super.decodeMessage(msgType, map)\n    }\n  }\n\n  private fun Map<Value, Value>.unpackProject(): Project? {\n    val projMap = getNullable(this, \"project\")?.asMapValue()?.map() ?: return null\n    val projectFileUri = URI(unpackString(projMap, \"projectFileUri\"))\n    val dependencies = projMap.unpackDependencies(\"dependencies\")\n    return Project(projectFileUri, null, dependencies)\n  }\n\n  private fun Map<Value, Value>.unpackHttp(): Http? {\n    val httpMap = getNullable(this, \"http\")?.asMapValue()?.map() ?: return null\n    val proxy = httpMap.unpackProxy()\n    val caCertificates = getNullable(httpMap, \"caCertificates\")?.asBinaryValue()?.asByteArray()\n    val rewrites =\n      getNullable(httpMap, \"rewrites\")\n        ?.asMapValue()\n        ?.map()\n        ?.mapKeys { URI(it.key.asStringValue().asString()) }\n        ?.mapValues { URI(it.value.asStringValue().asString()) }\n    return Http(caCertificates, proxy, rewrites)\n  }\n\n  private fun Map<Value, Value>.unpackProxy(): Proxy? {\n    val proxyMap = getNullable(this, \"proxy\")?.asMapValue()?.map() ?: return null\n    val address = unpackString(proxyMap, \"address\")\n    val noProxy = unpackStringListOrNull(proxyMap, \"noProxy\")\n    return Proxy(URI(address), noProxy)\n  }\n\n  private fun Map<Value, Value>.unpackDependencies(name: String): Map<String, Dependency> {\n    val mapValue = get(this, name).asMapValue().map()\n    return mapValue.entries.associate { (key, value) ->\n      val dependencyName = key.asStringValue().asString()\n      val dependencyObj = value.asMapValue().map()\n      val type = unpackString(dependencyObj, \"type\")\n      val packageUri = URI(unpackString(dependencyObj, \"packageUri\"))\n      if (type == DependencyType.REMOTE.value) {\n        val checksums =\n          getNullable(dependencyObj, \"checksums\")?.asMapValue()?.map()?.let { obj ->\n            val sha256 = unpackString(obj, \"sha256\")\n            Checksums(sha256)\n          }\n        return@associate dependencyName to RemoteDependency(packageUri, checksums)\n      }\n      val dependencies = dependencyObj.unpackDependencies(\"dependencies\")\n      val projectFileUri = unpackString(dependencyObj, \"projectFileUri\")\n      dependencyName to Project(URI(projectFileUri), packageUri, dependencies)\n    }\n  }\n\n  private fun unpackExternalReader(map: Map<Value, Value>): ExternalReader =\n    ExternalReader(unpackString(map, \"executable\"), unpackStringListOrNull(map, \"arguments\"))\n}\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/ServerMessagePackEncoder.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.io.OutputStream\nimport java.nio.file.Path\nimport kotlin.io.path.pathString\nimport org.msgpack.core.MessagePack\nimport org.msgpack.core.MessagePacker\nimport org.pkl.core.messaging.BaseMessagePackEncoder\nimport org.pkl.core.messaging.Message\nimport org.pkl.core.packages.Checksums\n\nclass ServerMessagePackEncoder(packer: MessagePacker) : BaseMessagePackEncoder(packer) {\n\n  constructor(stream: OutputStream) : this(MessagePack.newDefaultPacker(stream))\n\n  private fun MessagePacker.packProject(project: Project) {\n    packMapHeader(2)\n    packKeyValue(\"projectFileUri\", project.projectFileUri.toString())\n    packString(\"dependencies\")\n    packDependencies(project.dependencies)\n  }\n\n  private fun MessagePacker.packHttp(http: Http) {\n    packMapHeader(0, http.caCertificates, http.proxy, http.rewrites)\n    http.caCertificates?.let { packKeyValue(\"caCertificates\", it) }\n    http.proxy?.let { proxy ->\n      packString(\"proxy\")\n      packMapHeader(0, proxy.address, proxy.noProxy)\n      packKeyValue(\"address\", proxy.address?.toString())\n      packKeyValue(\"noProxy\", proxy.noProxy)\n    }\n    http.rewrites?.let { rewrites ->\n      packString(\"rewrites\")\n      packMapHeader(rewrites.size)\n      for ((key, value) in rewrites) {\n        packString(key.toString())\n        packString(value.toString())\n      }\n    }\n  }\n\n  private fun MessagePacker.packDependencies(dependencies: Map<String, Dependency>) {\n    packMapHeader(dependencies.size)\n    for ((name, dep) in dependencies) {\n      packString(name)\n      if (dep is Project) {\n        packMapHeader(4)\n        packKeyValue(\"type\", dep.type.value)\n        packKeyValue(\"packageUri\", dep.packageUri.toString())\n        packKeyValue(\"projectFileUri\", dep.projectFileUri.toString())\n        packString(\"dependencies\")\n        packDependencies(dep.dependencies)\n      } else {\n        dep as RemoteDependency\n        packMapHeader(dep.checksums?.let { 3 } ?: 2)\n        packKeyValue(\"type\", dep.type.value)\n        packKeyValue(\"packageUri\", dep.packageUri.toString())\n        dep.checksums?.let { checksums ->\n          packString(\"checksums\")\n          packChecksums(checksums)\n        }\n      }\n    }\n  }\n\n  private fun MessagePacker.packChecksums(checksums: Checksums) {\n    packMapHeader(1)\n    packKeyValue(\"sha256\", checksums.sha256)\n  }\n\n  private fun packExternalReader(spec: ExternalReader) {\n    packMapHeader(1, spec.arguments)\n    packKeyValue(\"executable\", spec.executable)\n    spec.arguments?.let { packKeyValue(\"arguments\", it) }\n  }\n\n  override fun encodeMessage(msg: Message) {\n    when (msg.type()) {\n      Message.Type.CREATE_EVALUATOR_REQUEST -> {\n        msg as CreateEvaluatorRequest\n        packMapHeader(\n          1,\n          msg.allowedModules,\n          msg.allowedResources,\n          msg.clientModuleReaders,\n          msg.clientResourceReaders,\n          msg.modulePaths,\n          msg.env,\n          msg.properties,\n          msg.timeout,\n          msg.rootDir,\n          msg.cacheDir,\n          msg.outputFormat,\n          msg.project,\n          msg.http,\n          msg.externalModuleReaders,\n          msg.externalResourceReaders,\n          msg.traceMode,\n        )\n        packKeyValue(\"requestId\", msg.requestId())\n        packKeyValue(\"allowedModules\", msg.allowedModules)\n        packKeyValue(\"allowedResources\", msg.allowedResources)\n        if (msg.clientModuleReaders != null) {\n          packer.packString(\"clientModuleReaders\")\n          packer.packArrayHeader(msg.clientModuleReaders.size)\n          for (moduleReader in msg.clientModuleReaders) {\n            packModuleReaderSpec(moduleReader)\n          }\n        }\n        if (msg.clientResourceReaders != null) {\n          packer.packString(\"clientResourceReaders\")\n          packer.packArrayHeader(msg.clientResourceReaders.size)\n          for (resourceReader in msg.clientResourceReaders) {\n            packResourceReaderSpec(resourceReader)\n          }\n        }\n        packKeyValue(\"modulePaths\", msg.modulePaths, Path::toString)\n        packKeyValue(\"env\", msg.env)\n        packKeyValue(\"properties\", msg.properties)\n        packKeyValue(\"timeoutSeconds\", msg.timeout?.toSeconds())\n        packKeyValue(\"rootDir\", msg.rootDir?.pathString)\n        packKeyValue(\"cacheDir\", msg.cacheDir?.pathString)\n        packKeyValue(\"outputFormat\", msg.outputFormat)\n        if (msg.project != null) {\n          packer.packString(\"project\")\n          packer.packProject(msg.project)\n        }\n        if (msg.http != null) {\n          packer.packString(\"http\")\n          packer.packHttp(msg.http)\n        }\n        if (msg.externalModuleReaders != null) {\n          packer.packString(\"externalModuleReaders\")\n          packer.packMapHeader(msg.externalModuleReaders.size)\n          for ((scheme, spec) in msg.externalModuleReaders) {\n            packer.packString(scheme)\n            packExternalReader(spec)\n          }\n        }\n        if (msg.externalResourceReaders != null) {\n          packer.packString(\"externalResourceReaders\")\n          packer.packMapHeader(msg.externalResourceReaders.size)\n          for ((scheme, spec) in msg.externalResourceReaders) {\n            packer.packString(scheme)\n            packExternalReader(spec)\n          }\n        }\n        if (msg.traceMode != null) {\n          packKeyValue(\"traceMode\", msg.traceMode.toString())\n        }\n        return\n      }\n      Message.Type.CREATE_EVALUATOR_RESPONSE -> {\n        msg as CreateEvaluatorResponse\n        packMapHeader(1, msg.evaluatorId, msg.error)\n        packKeyValue(\"requestId\", msg.requestId())\n        packKeyValue(\"evaluatorId\", msg.evaluatorId)\n        packKeyValue(\"error\", msg.error)\n      }\n      Message.Type.CLOSE_EVALUATOR -> {\n        msg as CloseEvaluator\n        packer.packMapHeader(1)\n        packKeyValue(\"evaluatorId\", msg.evaluatorId)\n      }\n      Message.Type.EVALUATE_REQUEST -> {\n        msg as EvaluateRequest\n        packMapHeader(3, msg.moduleText, msg.expr)\n        packKeyValue(\"requestId\", msg.requestId())\n        packKeyValue(\"evaluatorId\", msg.evaluatorId)\n        packKeyValue(\"moduleUri\", msg.moduleUri.toString())\n        packKeyValue(\"moduleText\", msg.moduleText)\n        packKeyValue(\"expr\", msg.expr)\n      }\n      Message.Type.EVALUATE_RESPONSE -> {\n        msg as EvaluateResponse\n        packMapHeader(2, msg.result, msg.error)\n        packKeyValue(\"requestId\", msg.requestId())\n        packKeyValue(\"evaluatorId\", msg.evaluatorId)\n        msg.result?.let { packKeyValue(\"result\", it) }\n        packKeyValue(\"error\", msg.error)\n      }\n      Message.Type.LOG_MESSAGE -> {\n        msg as LogMessage\n        packer.packMapHeader(4)\n        packKeyValue(\"evaluatorId\", msg.evaluatorId)\n        packKeyValue(\"level\", msg.level)\n        packKeyValue(\"message\", msg.message)\n        packKeyValue(\"frameUri\", msg.frameUri)\n      }\n      else -> super.encodeMessage(msg)\n    }\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/ServerMessages.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.net.URI\nimport java.nio.file.Path\nimport java.time.Duration\nimport java.util.*\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.messaging.Message\nimport org.pkl.core.messaging.Messages\nimport org.pkl.core.packages.Checksums\n\ndata class CreateEvaluatorRequest(\n  private val requestId: Long,\n  val allowedModules: List<String>?,\n  val allowedResources: List<String>?,\n  val clientModuleReaders: List<Messages.ModuleReaderSpec>?,\n  val clientResourceReaders: List<Messages.ResourceReaderSpec>?,\n  val modulePaths: List<Path>?,\n  val env: Map<String, String>?,\n  val properties: Map<String, String>?,\n  val timeout: Duration?,\n  val rootDir: Path?,\n  val cacheDir: Path?,\n  val outputFormat: String?,\n  val project: Project?,\n  val http: Http?,\n  val externalModuleReaders: Map<String, ExternalReader>?,\n  val externalResourceReaders: Map<String, ExternalReader>?,\n  val traceMode: TraceMode?,\n) : Message.Client.Request {\n\n  override fun type(): Message.Type = Message.Type.CREATE_EVALUATOR_REQUEST\n\n  override fun requestId(): Long = requestId\n}\n\ndata class ExternalReader(val executable: String, val arguments: List<String>?)\n\ndata class Proxy(val address: URI?, val noProxy: List<String>?)\n\ndata class Http(\n  /** PEM-format CA certificates as raw bytes. */\n  val caCertificates: ByteArray?,\n  /** Proxy settings */\n  val proxy: Proxy?,\n  /** HTTP rewrites */\n  val rewrites: Map<URI, URI>?,\n) {\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (other !is Http) return false\n\n    if (caCertificates != null) {\n      if (other.caCertificates == null) return false\n      if (!caCertificates.contentEquals(other.caCertificates)) return false\n    } else if (other.caCertificates != null) return false\n    return Objects.equals(rewrites, other.rewrites) && Objects.equals(proxy, other.proxy)\n  }\n\n  override fun hashCode(): Int {\n    var result = caCertificates?.contentHashCode() ?: 0\n    result = 31 * result + (proxy?.hashCode() ?: 0)\n    result = 31 * result + (rewrites?.hashCode() ?: 0)\n    return result\n  }\n}\n\nenum class DependencyType(val value: String) {\n  LOCAL(\"local\"),\n  REMOTE(\"remote\"),\n}\n\nsealed interface Dependency {\n  val type: DependencyType\n  val packageUri: URI?\n}\n\ndata class RemoteDependency(override val packageUri: URI, val checksums: Checksums?) : Dependency {\n  override val type: DependencyType = DependencyType.REMOTE\n}\n\ndata class Project(\n  val projectFileUri: URI,\n  override val packageUri: URI?,\n  val dependencies: Map<String, Dependency>,\n) : Dependency {\n  override val type: DependencyType = DependencyType.LOCAL\n}\n\ndata class CreateEvaluatorResponse(\n  private val requestId: Long,\n  val evaluatorId: Long?,\n  val error: String?,\n) : Message.Server.Response {\n  override fun type(): Message.Type = Message.Type.CREATE_EVALUATOR_RESPONSE\n\n  override fun requestId(): Long = requestId\n}\n\ndata class CloseEvaluator(val evaluatorId: Long) : Message.Client.OneWay {\n  override fun type(): Message.Type = Message.Type.CLOSE_EVALUATOR\n}\n\ndata class EvaluateRequest(\n  private val requestId: Long,\n  val evaluatorId: Long,\n  val moduleUri: URI,\n  val moduleText: String?,\n  val expr: String?,\n) : Message.Client.Request {\n  override fun type(): Message.Type = Message.Type.EVALUATE_REQUEST\n\n  override fun requestId(): Long = requestId\n}\n\ndata class EvaluateResponse(\n  private val requestId: Long,\n  val evaluatorId: Long,\n  val result: ByteArray?,\n  val error: String?,\n) : Message.Server.Response {\n  override fun type(): Message.Type = Message.Type.EVALUATE_RESPONSE\n\n  override fun requestId(): Long = requestId\n\n  // override to use [ByteArray.contentEquals]\n  @Suppress(\"DuplicatedCode\")\n  override fun equals(other: Any?): Boolean {\n    if (this === other) return true\n    if (other !is EvaluateResponse) return false\n\n    return requestId == other.requestId &&\n      evaluatorId == other.evaluatorId &&\n      result.contentEquals(other.result) &&\n      error == other.error\n  }\n\n  // override to use [ByteArray.contentHashCode]\n  override fun hashCode(): Int {\n    var result1 = requestId.hashCode()\n    result1 = 31 * result1 + evaluatorId.hashCode()\n    result1 = 31 * result1 + result.contentHashCode()\n    result1 = 31 * result1 + error.hashCode()\n    return result1\n  }\n}\n\ndata class LogMessage(\n  val evaluatorId: Long,\n  val level: Int,\n  val message: String,\n  val frameUri: String,\n) : Message.Server.OneWay {\n  override fun type(): Message.Type = Message.Type.LOG_MESSAGE\n}\n"
  },
  {
    "path": "pkl-server/src/main/kotlin/org/pkl/server/Utils.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.util.concurrent.CompletableFuture\nimport java.util.concurrent.ExecutionException\nimport java.util.concurrent.Future\nimport org.msgpack.core.MessageBufferPacker\nimport org.msgpack.core.MessagePack\nimport org.pkl.core.messaging.Message\n\ninternal fun log(msg: String) {\n  if (System.getenv(\"PKL_DEBUG\") == \"1\") {\n    System.err.println(\"[pkl-server] $msg\")\n  }\n}\n\ninternal fun AutoCloseable.closeQuietly() {\n  try {\n    close()\n  } catch (e: Exception) {\n    log(e.message.orEmpty())\n  }\n}\n\ninternal val threadLocalBufferPacker: ThreadLocal<MessageBufferPacker> =\n  ThreadLocal.withInitial { MessagePack.newDefaultBufferPacker() }\n\nprivate val threadLocalEncoder: ThreadLocal<(Message) -> ByteArray> =\n  ThreadLocal.withInitial {\n    val packer = threadLocalBufferPacker.get()\n    val encoder = ServerMessagePackEncoder(packer);\n    { message: Message ->\n      packer.clear()\n      encoder.encode(message)\n      packer.toByteArray()\n    }\n  }\n\n@Suppress(\"unused\")\ninternal fun encode(message: Message): ByteArray {\n  return threadLocalEncoder.get()(message)\n}\n\n/**\n * This is like [Future.get], except it throws the actual exception given to\n * [CompletableFuture.completeExceptionally].\n *\n * [Future.get] will wrap any exception in [ExecutionException], which is kind of silly.\n */\n@Suppress(\"unused\")\nfun <T> Future<T>.getUnderlying(): T =\n  try {\n    get()\n  } catch (e: ExecutionException) {\n    throw e.cause!!\n  }\n"
  },
  {
    "path": "pkl-server/src/test/kotlin/org/pkl/server/AbstractServerTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.net.URI\nimport java.nio.file.Path\nimport java.util.concurrent.ExecutorService\nimport java.util.concurrent.Executors\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.outputStream\nimport kotlin.io.path.writeText\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.BeforeAll\nimport org.junit.jupiter.api.Disabled\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.msgpack.core.MessagePack\nimport org.pkl.commons.test.PackageServer\nimport org.pkl.core.messaging.Messages.*\nimport org.pkl.core.module.PathElement\n\nabstract class AbstractServerTest {\n\n  companion object {\n    /** Set to `true` to bypass messagepack serialization when running [JvmServerTest]. */\n    internal const val USE_DIRECT_TRANSPORT = false\n    lateinit var executor: ExecutorService\n\n    @BeforeAll\n    @JvmStatic\n    fun beforeAll() {\n      executor =\n        if (USE_DIRECT_TRANSPORT) {\n          createDirectExecutor()\n        } else {\n          Executors.newCachedThreadPool()\n        }\n    }\n\n    @AfterAll\n    @JvmStatic\n    fun afterAll() {\n      executor.shutdown()\n    }\n  }\n\n  abstract val client: TestTransport\n\n  private val blankCreateEvaluatorRequest =\n    CreateEvaluatorRequest(\n      requestId = 1,\n      http = null,\n      allowedModules = null,\n      allowedResources = null,\n      clientModuleReaders = null,\n      clientResourceReaders = null,\n      modulePaths = null,\n      env = null,\n      properties = null,\n      timeout = null,\n      rootDir = null,\n      cacheDir = null,\n      outputFormat = null,\n      project = null,\n      externalModuleReaders = null,\n      externalResourceReaders = null,\n      traceMode = null,\n    )\n\n  @Test\n  fun `create and close evaluator`() {\n    val evaluatorId = client.sendCreateEvaluatorRequest(123)\n    client.send(CloseEvaluator(evaluatorId))\n  }\n\n  @Test\n  fun `evaluate module`() {\n    val evaluatorId = client.sendCreateEvaluatorRequest()\n    val requestId = 234L\n\n    client.send(\n      EvaluateRequest(\n        requestId,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"\n        foo {\n          bar = \"bar\"\n        }\n      \"\"\"\n          .trimIndent(),\n        null,\n      )\n    )\n\n    val response = client.receive<EvaluateResponse>()\n    assertThat(response.error).isNull()\n    assertThat(response.result).isNotNull\n    assertThat(response.requestId()).isEqualTo(requestId)\n\n    val unpacker = MessagePack.newDefaultUnpacker(response.result)\n    val value = unpacker.unpackValue()\n    assertThat(value.isArrayValue)\n  }\n\n  @Test\n  fun `trace logs`() {\n    val evaluatorId = client.sendCreateEvaluatorRequest()\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"\n        foo = trace(1 + 2 + 3)\n      \"\"\"\n          .trimIndent(),\n        null,\n      )\n    )\n\n    val response = client.receive<LogMessage>()\n    assertThat(response.level).isEqualTo(0)\n    assertThat(response.message).isEqualTo(\"1 + 2 + 3 = 6\")\n\n    client.receive<EvaluateResponse>()\n  }\n\n  @Test\n  fun `warn logs`() {\n    val evaluatorId = client.sendCreateEvaluatorRequest()\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"\n        @Deprecated { message = \"use bar instead\" }\n        function foo() = 5\n\n        result = foo()\n      \"\"\"\n          .trimIndent(),\n        null,\n      )\n    )\n\n    val response = client.receive<LogMessage>()\n    assertThat(response.level).isEqualTo(1)\n    assertThat(response.message).contains(\"use bar instead\")\n\n    client.receive<EvaluateResponse>()\n  }\n\n  @Test\n  fun `read resource`() {\n    val reader = ResourceReaderSpec(\"bahumbug\", true, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = read(\"bahumbug:/foo.pkl\").text\"\"\",\n        \"res\",\n      )\n    )\n\n    val readResourceMsg = client.receive<ReadResourceRequest>()\n    assertThat(readResourceMsg.uri.toString()).isEqualTo(\"bahumbug:/foo.pkl\")\n    assertThat(readResourceMsg.evaluatorId).isEqualTo(evaluatorId)\n\n    client.send(\n      ReadResourceResponse(\n        readResourceMsg.requestId,\n        evaluatorId,\n        \"my bahumbug\".toByteArray(),\n        null,\n      )\n    )\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error).isNull()\n\n    val unpacker = MessagePack.newDefaultUnpacker(evaluateResponse.result)\n    val value = unpacker.unpackValue()\n    assertThat(value.asStringValue().asString()).isEqualTo(\"my bahumbug\")\n  }\n\n  @Disabled(\n    \"Unable to construct ReadResourceResponse with null contents due to Kotlin compiler bug\"\n  )\n  @Test\n  fun `read resource -- null contents and null error`() {\n    val reader = ResourceReaderSpec(\"bahumbug\", true, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        requestId = 1,\n        evaluatorId = evaluatorId,\n        moduleUri = URI(\"repl:text\"),\n        moduleText = \"\"\"res = read(\"bahumbug:/foo.pkl\").text\"\"\",\n        expr = \"res\",\n      )\n    )\n\n    val readResourceMsg = client.receive<ReadResourceRequest>()\n    assertThat(readResourceMsg.uri.toString()).isEqualTo(\"bahumbug:/foo.pkl\")\n    assertThat(readResourceMsg.evaluatorId).isEqualTo(evaluatorId)\n\n    client.send(ReadResourceResponse(readResourceMsg.requestId, evaluatorId, byteArrayOf(), null))\n    // for this test to be correct this should actually be:\n    // client.send(ReadResourceResponse(readResourceMsg.requestId, evaluatorId, null, null))\n    // this should be evaluated again once https://github.com/apple/pkl/issues/698 is addressed\n    // see conversation here https://github.com/apple/pkl/pull/660#discussion_r1819545811\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error).isNull()\n\n    val unpacker = MessagePack.newDefaultUnpacker(evaluateResponse.result)\n    val value = unpacker.unpackValue()\n    assertThat(value.asStringValue().asString()).isEqualTo(\"\")\n  }\n\n  @Test\n  fun `read resource error`() {\n    val reader = ResourceReaderSpec(\"bahumbug\", true, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = read(\"bahumbug:/foo.txt\").text\"\"\",\n        \"res\",\n      )\n    )\n\n    val readResourceMsg = client.receive<ReadResourceRequest>()\n\n    client.send(\n      ReadResourceResponse(\n        readResourceMsg.requestId,\n        evaluatorId,\n        byteArrayOf(),\n        \"cannot read my bahumbug\",\n      )\n    )\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error).contains(\"bahumbug:/foo.txt\")\n    assertThat(evaluateResponse.error).doesNotContain(\"org.pkl.core.PklBugException\")\n  }\n\n  @Test\n  fun `glob resource`() {\n    val reader = ResourceReaderSpec(\"bird\", true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"\n        res = read*(\"bird:/**.txt\").keys\n      \"\"\"\n          .trimIndent(),\n        \"res\",\n      )\n    )\n    val listResourcesRequest = client.receive<ListResourcesRequest>()\n    assertThat(listResourcesRequest.uri.toString()).isEqualTo(\"bird:/\")\n    client.send(\n      ListResourcesResponse(\n        listResourcesRequest.requestId,\n        listResourcesRequest.evaluatorId,\n        listOf(PathElement(\"foo.txt\", false), PathElement(\"subdir\", true)),\n        null,\n      )\n    )\n    val listResourcesRequest2 = client.receive<ListResourcesRequest>()\n    assertThat(listResourcesRequest2.uri.toString()).isEqualTo(\"bird:/subdir/\")\n    client.send(\n      ListResourcesResponse(\n        listResourcesRequest2.requestId,\n        listResourcesRequest2.evaluatorId,\n        listOf(PathElement(\"bar.txt\", false)),\n        null,\n      )\n    )\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n      - 6\n      - \n        - 'bird:/foo.txt'\n        - 'bird:/subdir/bar.txt'\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `glob resources -- null pathElements and null error`() {\n    val reader = ResourceReaderSpec(\"bird\", true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"\n        res = read*(\"bird:/**.txt\").keys\n      \"\"\"\n          .trimIndent(),\n        \"res\",\n      )\n    )\n    val listResourcesRequest = client.receive<ListResourcesRequest>()\n    client.send(\n      ListResourcesResponse(\n        listResourcesRequest.requestId,\n        listResourcesRequest.evaluatorId,\n        null,\n        null,\n      )\n    )\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n        - 6\n        - []\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `glob resource error`() {\n    val reader = ResourceReaderSpec(\"bird\", true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(resourceReaders = listOf(reader))\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"\n        res = read*(\"bird:/**.txt\").keys\n      \"\"\"\n          .trimIndent(),\n        \"res\",\n      )\n    )\n    val listResourcesRequest = client.receive<ListResourcesRequest>()\n    assertThat(listResourcesRequest.uri.toString()).isEqualTo(\"bird:/\")\n    client.send(\n      ListResourcesResponse(\n        listResourcesRequest.requestId,\n        listResourcesRequest.evaluatorId,\n        null,\n        \"didnt work\",\n      )\n    )\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error)\n      .isEqualTo(\n        \"\"\"\n      –– Pkl Error ––\n      I/O error resolving glob pattern `bird:/**.txt`.\n      IOException: didnt work\n\n      1 | res = read*(\"bird:/**.txt\").keys\n                ^^^^^^^^^^^^^^^^^^^^^\n      at text#res (repl:text)\n\n      1 | res\n          ^^^\n      at  (repl:text)\n      \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `read module`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = import(\"bird:/pigeon.pkl\").value\"\"\",\n        \"res\",\n      )\n    )\n\n    val readModuleMsg = client.receive<ReadModuleRequest>()\n    assertThat(readModuleMsg.uri.toString()).isEqualTo(\"bird:/pigeon.pkl\")\n    assertThat(readModuleMsg.evaluatorId).isEqualTo(evaluatorId)\n\n    client.send(ReadModuleResponse(readModuleMsg.requestId, evaluatorId, \"value = 5\", null))\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error).isNull()\n    val unpacker = MessagePack.newDefaultUnpacker(evaluateResponse.result)\n    val value = unpacker.unpackValue()\n    assertThat(value.asIntegerValue().asInt()).isEqualTo(5)\n  }\n\n  @Test\n  fun `read module -- null contents and null error`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        requestId = 1,\n        evaluatorId = evaluatorId,\n        moduleUri = URI(\"repl:text\"),\n        moduleText = \"\"\"res = import(\"bird:/pigeon.pkl\")\"\"\",\n        expr = \"res\",\n      )\n    )\n\n    val readModuleMsg = client.receive<ReadModuleRequest>()\n    assertThat(readModuleMsg.uri.toString()).isEqualTo(\"bird:/pigeon.pkl\")\n    assertThat(readModuleMsg.evaluatorId).isEqualTo(evaluatorId)\n\n    client.send(ReadModuleResponse(readModuleMsg.requestId, evaluatorId, null, null))\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error).isNull()\n    val unpacker = MessagePack.newDefaultUnpacker(evaluateResponse.result)\n    val value = unpacker.unpackValue().asArrayValue().list()\n    assertThat(value[0].asIntegerValue().asLong()).isEqualTo(0x1)\n    assertThat(value[1].asStringValue().asString()).isEqualTo(\"pigeon\")\n    assertThat(value[3].asArrayValue().list()).isEmpty()\n  }\n\n  @Test\n  fun `read module error`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = import(\"bird:/pigeon.pkl\").value\"\"\",\n        \"res\",\n      )\n    )\n\n    val readModuleMsg = client.receive<ReadModuleRequest>()\n    assertThat(readModuleMsg.uri.toString()).isEqualTo(\"bird:/pigeon.pkl\")\n    assertThat(readModuleMsg.evaluatorId).isEqualTo(evaluatorId)\n\n    client.send(\n      ReadModuleResponse(readModuleMsg.requestId, evaluatorId, null, \"Don't know where Pigeon is\")\n    )\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error).contains(\"Don't know where Pigeon is\")\n  }\n\n  @Test\n  fun `glob module`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = import*(\"bird:/**.pkl\").keys\"\"\",\n        \"res\",\n      )\n    )\n\n    val listModulesMsg = client.receive<ListModulesRequest>()\n    assertThat(listModulesMsg.uri.scheme).isEqualTo(\"bird\")\n    assertThat(listModulesMsg.uri.path).isEqualTo(\"/\")\n    client.send(\n      ListModulesResponse(\n        listModulesMsg.requestId,\n        evaluatorId,\n        listOf(\n          PathElement(\"birds\", true),\n          PathElement(\"majesticBirds\", true),\n          PathElement(\"Person.pkl\", false),\n        ),\n        null,\n      )\n    )\n    val listModulesMsg2 = client.receive<ListModulesRequest>()\n    assertThat(listModulesMsg2.uri.scheme).isEqualTo(\"bird\")\n    assertThat(listModulesMsg2.uri.path).isEqualTo(\"/birds/\")\n    client.send(\n      ListModulesResponse(\n        listModulesMsg2.requestId,\n        listModulesMsg2.evaluatorId,\n        listOf(PathElement(\"pigeon.pkl\", false), PathElement(\"parrot.pkl\", false)),\n        null,\n      )\n    )\n    val listModulesMsg3 = client.receive<ListModulesRequest>()\n    assertThat(listModulesMsg3.uri.scheme).isEqualTo(\"bird\")\n    assertThat(listModulesMsg3.uri.path).isEqualTo(\"/majesticBirds/\")\n    client.send(\n      ListModulesResponse(\n        listModulesMsg3.requestId,\n        listModulesMsg3.evaluatorId,\n        listOf(PathElement(\"barnOwl.pkl\", false), PathElement(\"elfOwl.pkl\", false)),\n        null,\n      )\n    )\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n      - 6\n      - \n        - 'bird:/Person.pkl'\n        - 'bird:/birds/parrot.pkl'\n        - 'bird:/birds/pigeon.pkl'\n        - 'bird:/majesticBirds/barnOwl.pkl'\n        - 'bird:/majesticBirds/elfOwl.pkl'\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `glob module -- null pathElements and null error`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = import*(\"bird:/**.pkl\").keys\"\"\",\n        \"res\",\n      )\n    )\n    val listModulesMsg = client.receive<ListModulesRequest>()\n    client.send(ListModulesResponse(listModulesMsg.requestId, evaluatorId, null, null))\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n      - 6\n      - []\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `glob module error`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"\"\"res = import*(\"bird:/**.pkl\").keys\"\"\",\n        \"res\",\n      )\n    )\n\n    val listModulesMsg = client.receive<ListModulesRequest>()\n    assertThat(listModulesMsg.uri.scheme).isEqualTo(\"bird\")\n    assertThat(listModulesMsg.uri.path).isEqualTo(\"/\")\n    client.send(ListModulesResponse(listModulesMsg.requestId, evaluatorId, null, \"nope\"))\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.error)\n      .isEqualTo(\n        \"\"\"\n      –– Pkl Error ––\n      I/O error resolving glob pattern `bird:/**.pkl`.\n      IOException: nope\n\n      1 | res = import*(\"bird:/**.pkl\").keys\n                ^^^^^^^^^^^^^^^^^^^^^^^\n      at text#res (repl:text)\n\n      1 | res\n          ^^^\n      at  (repl:text)\n      \n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `read and evaluate module path from jar`(@TempDir tempDir: Path) {\n    val jarFile = tempDir.resolve(\"resource1.jar\")\n    jarFile.outputStream().use { outStream ->\n      javaClass.getResourceAsStream(\"resource1.jar\")!!.use { inStream ->\n        inStream.copyTo(outStream)\n      }\n    }\n\n    val evaluatorId = client.sendCreateEvaluatorRequest(modulePaths = listOf(jarFile))\n\n    client.send(\n      EvaluateRequest(1, evaluatorId, URI(\"modulepath:/dir1/module.pkl\"), null, \"output.text\")\n    )\n\n    val response = client.receive<EvaluateResponse>()\n    assertThat(response.error).isNull()\n    val tripleQuote = \"\\\"\\\"\\\"\"\n    assertThat(response.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n      |\n        res1 {\n          uri = \"modulepath:/dir1/resource1.txt\"\n          text = $tripleQuote\n            content\n            \n            $tripleQuote\n          base64 = \"Y29udGVudAo=\"\n        }\n        res2 {\n          uri = \"modulepath:/dir1/resource1.txt\"\n          text = $tripleQuote\n            content\n            \n            $tripleQuote\n          base64 = \"Y29udGVudAo=\"\n        }\n        res3 {\n          ressy = \"the module2 output\"\n        }\n\n    \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `import triple-dot path`() {\n    val reader = ModuleReaderSpec(\"bird\", true, true, true)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"bird:/foo/bar/baz.pkl\"),\n        \"\"\"\n        import \".../buz.pkl\"\n        \n        res = buz.res\n      \"\"\"\n          .trimIndent(),\n        \"res\",\n      )\n    )\n    val readModuleRequest = client.receive<ReadModuleRequest>()\n    assertThat(readModuleRequest.uri).isEqualTo(URI(\"bird:/foo/buz.pkl\"))\n    client.send(\n      ReadModuleResponse(\n        readModuleRequest.requestId,\n        readModuleRequest.evaluatorId,\n        null,\n        \"not here\",\n      )\n    )\n\n    val readModuleRequest2 = client.receive<ReadModuleRequest>()\n    assertThat(readModuleRequest2.uri).isEqualTo(URI(\"bird:/buz.pkl\"))\n    client.send(\n      ReadModuleResponse(\n        readModuleRequest2.requestId,\n        readModuleRequest2.evaluatorId,\n        \"res = 1\",\n        null,\n      )\n    )\n\n    val evaluatorResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluatorResponse.result?.debugRendering).isEqualTo(\"1\")\n  }\n\n  @Test\n  fun `evaluate error`() {\n    val evaluatorId = client.sendCreateEvaluatorRequest()\n\n    client.send(EvaluateRequest(1, evaluatorId, URI(\"repl:text\"), \"\"\"foo = 1\"\"\", \"foo as String\"))\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.requestId()).isEqualTo(1)\n    assertThat(evaluateResponse.error).contains(\"Expected value of type\")\n  }\n\n  @Test\n  fun `evaluate client-provided module reader`() {\n    val reader = ModuleReaderSpec(\"bird\", true, false, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n\n    client.send(EvaluateRequest(1, evaluatorId, URI(\"bird:/pigeon.pkl\"), null, \"output.text\"))\n\n    val readModuleRequest = client.receive<ReadModuleRequest>()\n    assertThat(readModuleRequest.uri.toString()).isEqualTo(\"bird:/pigeon.pkl\")\n\n    client.send(\n      ReadModuleResponse(\n        readModuleRequest.requestId,\n        evaluatorId,\n        \"\"\"\n          firstName = \"Pigeon\"\n          lastName = \"Bird\"\n          fullName = firstName + \" \" + lastName\n        \"\"\"\n          .trimIndent(),\n        null,\n      )\n    )\n\n    val evaluateResponse = client.receive<EvaluateResponse>()\n    assertThat(evaluateResponse.result).isNotNull\n    assertThat(evaluateResponse.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n        |\n          firstName = \"Pigeon\"\n          lastName = \"Bird\"\n          fullName = \"Pigeon Bird\"\n\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `concurrent evaluations`() {\n    val reader = ModuleReaderSpec(\"bird\", true, false, false)\n    val evaluatorId = client.sendCreateEvaluatorRequest(moduleReaders = listOf(reader))\n    client.send(EvaluateRequest(1, evaluatorId, URI(\"bird:/pigeon.pkl\"), null, \"output.text\"))\n\n    client.send(EvaluateRequest(2, evaluatorId, URI(\"bird:/parrot.pkl\"), null, \"output.text\"))\n\n    // evaluation is single-threaded; `parrot.pkl` gets evaluated after `pigeon.pkl` completes.\n    val response11 = client.receive<ReadModuleRequest>()\n    assertThat(response11.uri.toString()).isEqualTo(\"bird:/pigeon.pkl\")\n\n    client.send(\n      ReadModuleResponse(\n        response11.requestId,\n        evaluatorId,\n        \"\"\"\n          firstName = \"Pigeon\"\n          lastName = \"Bird\"\n          fullName = firstName + \" \" + lastName\n        \"\"\"\n          .trimIndent(),\n        null,\n      )\n    )\n\n    val response12 = client.receive<EvaluateResponse>()\n    assertThat(response12.result).isNotNull\n    assertThat(response12.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n        |\n          firstName = \"Pigeon\"\n          lastName = \"Bird\"\n          fullName = \"Pigeon Bird\"\n\n      \"\"\"\n          .trimIndent()\n      )\n\n    val response21 = client.receive<ReadModuleRequest>()\n    assertThat(response21.uri.toString()).isEqualTo(\"bird:/parrot.pkl\")\n\n    client.send(\n      ReadModuleResponse(\n        response21.requestId,\n        evaluatorId,\n        \"\"\"\n          firstName = \"Parrot\"\n          lastName = \"Bird\"\n          fullName = firstName + \" \" + lastName\n        \"\"\"\n          .trimIndent(),\n        null,\n      )\n    )\n\n    val response22 = client.receive<EvaluateResponse>()\n    assertThat(response22.result).isNotNull\n    assertThat(response22.result?.debugRendering)\n      .isEqualTo(\n        \"\"\"\n        |\n          firstName = \"Parrot\"\n          lastName = \"Bird\"\n          fullName = \"Parrot Bird\"\n\n      \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `evaluate with project dependencies`(@TempDir tempDir: Path) {\n    val cacheDir = tempDir.resolve(\"cache\").createDirectories()\n    PackageServer.populateCacheDir(cacheDir)\n    val libDir = tempDir.resolve(\"lib/\").createDirectories()\n    libDir\n      .resolve(\"lib.pkl\")\n      .writeText(\n        \"\"\"\n      text = \"This is from lib\"\n    \"\"\"\n          .trimIndent()\n      )\n    libDir\n      .resolve(\"PklProject\")\n      .writeText(\n        \"\"\"\n      amends \"pkl:Project\"\n      \n      package {\n        name = \"lib\"\n        baseUri = \"package://localhost:0/lib\"\n        version = \"5.0.0\"\n        packageZipUrl = \"https://localhost:0/lib.zip\"\n      }\n    \"\"\"\n          .trimIndent()\n      )\n    val projectDir = tempDir.resolve(\"proj/\").createDirectories()\n    val module = projectDir.resolve(\"mod.pkl\")\n    module.writeText(\n      \"\"\"\n      import \"@birds/Bird.pkl\"\n      import \"@lib/lib.pkl\"\n      \n      res: Bird = new {\n        name = \"Birdie\"\n        favoriteFruit { name = \"dragonfruit\" }\n      }\n      \n      libContents = lib\n    \"\"\"\n        .trimIndent()\n    )\n    val dollar = '$'\n    projectDir\n      .resolve(\"PklProject.deps.json\")\n      .writeText(\n        \"\"\"\n      {\n        \"schemaVersion\": 1,\n        \"resolvedDependencies\": {\n          \"package://localhost:0/birds@0\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/birds@0.5.0\",\n            \"checksums\": {\n              \"sha256\": \"${dollar}skipChecksumVerification\"\n            }\n          },\n          \"package://localhost:0/fruit@1\": {\n            \"type\": \"remote\",\n            \"uri\": \"projectpackage://localhost:0/fruit@1.0.5\",\n            \"checksums\": {\n              \"sha256\": \"${dollar}skipChecksumVerification\"\n            }\n          },\n          \"package://localhost:0/lib@5\": {\n            \"type\": \"local\",\n            \"uri\": \"projectpackage://localhost:0/lib@5.0.0\",\n            \"path\": \"../lib\"\n          }\n        }\n      }\n\n    \"\"\"\n          .trimIndent()\n      )\n    val evaluatorId =\n      client.sendCreateEvaluatorRequest(\n        cacheDir = cacheDir,\n        project =\n          Project(\n            projectDir.resolve(\"PklProject\").toUri(),\n            null,\n            mapOf(\n              \"birds\" to RemoteDependency(URI(\"package://localhost:0/birds@0.5.0\"), null),\n              \"lib\" to\n                Project(\n                  libDir.toUri().resolve(\"PklProject\"),\n                  URI(\"package://localhost:0/lib@5.0.0\"),\n                  emptyMap(),\n                ),\n            ),\n          ),\n      )\n    client.send(EvaluateRequest(1, evaluatorId, module.toUri(), null, \"output.text\"))\n    val resp2 = client.receive<EvaluateResponse>()\n    assertThat(resp2.error).isNull()\n    assertThat(resp2.result).isNotNull()\n    assertThat(resp2.result?.debugRendering?.trim())\n      .isEqualTo(\n        \"\"\"\n        |\n          res {\n            name = \"Birdie\"\n            favoriteFruit {\n              name = \"dragonfruit\"\n            }\n          }\n          libContents {\n            text = \"This is from lib\"\n          }\n        \"\"\"\n          .trimIndent()\n      )\n  }\n\n  @Test\n  fun `http rewrites`() {\n    val evaluatorId =\n      client.sendCreateEvaluatorRequest(\n        http =\n          Http(\n            caCertificates = null,\n            proxy = null,\n            rewrites = mapOf(URI(\"https://example.com/\") to URI(\"https://example.example/\")),\n          )\n      )\n    client.send(\n      EvaluateRequest(\n        1,\n        evaluatorId,\n        URI(\"repl:text\"),\n        \"res = import(\\\"https://example.com/foo.pkl\\\")\",\n        \"output.text\",\n      )\n    )\n    val response = client.receive<EvaluateResponse>()\n    assertThat(response.error)\n      .contains(\n        \"request was rewritten: https://example.com/foo.pkl -> https://example.example/foo.pkl\"\n      )\n  }\n\n  @Test\n  fun `http rewrites -- invalid rule`() {\n    client.send(\n      blankCreateEvaluatorRequest.copy(\n        http =\n          Http(\n            caCertificates = null,\n            proxy = null,\n            rewrites = mapOf(URI(\"https://example.com\") to URI(\"https://example.example/\")),\n          )\n      )\n    )\n    val response = client.receive<CreateEvaluatorResponse>()\n    assertThat(response.error)\n      .contains(\"Rewrite rule must end with '/', but was 'https://example.com'\")\n  }\n\n  private fun TestTransport.sendCreateEvaluatorRequest(\n    requestId: Long = 123,\n    resourceReaders: List<ResourceReaderSpec> = listOf(),\n    moduleReaders: List<ModuleReaderSpec> = listOf(),\n    modulePaths: List<Path> = listOf(),\n    project: Project? = null,\n    cacheDir: Path? = null,\n    http: Http? = null,\n  ): Long {\n    val message =\n      CreateEvaluatorRequest(\n        123,\n        listOf(\".*\"),\n        listOf(\".*\"),\n        moduleReaders,\n        resourceReaders,\n        modulePaths,\n        mapOf(),\n        mapOf(),\n        null,\n        null,\n        cacheDir,\n        null,\n        project,\n        http,\n        null,\n        null,\n        null,\n      )\n\n    send(message)\n\n    val response = receive<CreateEvaluatorResponse>()\n    assertThat(response.requestId()).isEqualTo(requestId)\n    assertThat(response.evaluatorId).isNotNull\n    assertThat(response.error).isNull()\n\n    return response.evaluatorId!!\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/test/kotlin/org/pkl/server/JvmServerTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.io.PipedInputStream\nimport java.io.PipedOutputStream\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.BeforeEach\nimport org.pkl.core.messaging.MessageTransport\nimport org.pkl.core.messaging.MessageTransports\nimport org.pkl.core.util.Pair\n\nclass JvmServerTest : AbstractServerTest() {\n  private val transports: Pair<MessageTransport, MessageTransport> = run {\n    if (USE_DIRECT_TRANSPORT) {\n      MessageTransports.direct(::log)\n    } else {\n      val in1 =\n        PipedInputStream(10240) // use larger pipe size since large messages can be >1024 bytes\n      val out1 = PipedOutputStream(in1)\n      val in2 = PipedInputStream()\n      val out2 = PipedOutputStream(in2)\n      Pair.of(\n        MessageTransports.stream(\n          ServerMessagePackDecoder(in1),\n          ServerMessagePackEncoder(out2),\n          ::log,\n        ),\n        MessageTransports.stream(\n          ServerMessagePackDecoder(in2),\n          ServerMessagePackEncoder(out1),\n          ::log,\n        ),\n      )\n    }\n  }\n\n  override val client: TestTransport = TestTransport(transports.first)\n  private val server: Server = Server(transports.second)\n\n  @BeforeEach\n  fun beforeEach() {\n    executor.execute { server.start() }\n    executor.execute { client.start() }\n  }\n\n  @AfterEach\n  fun after() {\n    client.close()\n    server.close()\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/test/kotlin/org/pkl/server/NativeServerTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport org.junit.jupiter.api.AfterEach\nimport org.junit.jupiter.api.BeforeEach\nimport org.pkl.commons.test.Executables\nimport org.pkl.core.messaging.MessageTransports\n\nclass NativeServerTest : AbstractServerTest() {\n  private lateinit var server: Process\n  override lateinit var client: TestTransport\n\n  @BeforeEach\n  fun beforeEach() {\n    val executable = Executables.pkl.firstExistingNative.toString()\n    server = ProcessBuilder(executable, \"server\").start()\n    client =\n      TestTransport(\n        MessageTransports.stream(\n          ServerMessagePackDecoder(server.inputStream),\n          ServerMessagePackEncoder(server.outputStream),\n        ) { _ ->\n        }\n      )\n    executor.execute { client.start() }\n  }\n\n  @AfterEach\n  fun afterEach() {\n    client.close()\n    server.destroy()\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/test/kotlin/org/pkl/server/ServerMessagePackCodecTest.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.io.PipedInputStream\nimport java.io.PipedOutputStream\nimport java.net.URI\nimport java.nio.file.Path\nimport java.time.Duration\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.msgpack.core.MessagePack\nimport org.pkl.core.evaluatorSettings.TraceMode\nimport org.pkl.core.messaging.Message\nimport org.pkl.core.messaging.MessageDecoder\nimport org.pkl.core.messaging.MessageEncoder\nimport org.pkl.core.messaging.Messages\nimport org.pkl.core.packages.Checksums\n\nclass ServerMessagePackCodecTest {\n  private val encoder: MessageEncoder\n  private val decoder: MessageDecoder\n\n  init {\n    val inputStream =\n      PipedInputStream(10240) // use larger pipe size since large messages can be >1024 bytes\n    val outputStream = PipedOutputStream(inputStream)\n    encoder = ServerMessagePackEncoder(MessagePack.newDefaultPacker(outputStream))\n    decoder = ServerMessagePackDecoder(MessagePack.newDefaultUnpacker(inputStream))\n  }\n\n  private fun roundtrip(message: Message) {\n    encoder.encode(message)\n    val decoded = decoder.decode()\n    assertThat(decoded).isEqualTo(message)\n  }\n\n  @Test\n  fun `round-trip CreateEvaluatorRequest`() {\n    val resourceReader1 = Messages.ResourceReaderSpec(\"resourceReader1\", true, true)\n    val resourceReader2 = Messages.ResourceReaderSpec(\"resourceReader2\", true, false)\n    val moduleReader1 = Messages.ModuleReaderSpec(\"moduleReader1\", true, true, true)\n    val moduleReader2 = Messages.ModuleReaderSpec(\"moduleReader2\", true, false, false)\n    val externalReader = ExternalReader(\"external-cmd\", listOf(\"arg1\", \"arg2\"))\n    roundtrip(\n      CreateEvaluatorRequest(\n        requestId = 123,\n        allowedModules = listOf(\"pkl\", \"file\", \"https\"),\n        allowedResources = listOf(\"pkl\", \"file\", \"https\", \"resourceReader1\", \"resourceReader2\"),\n        clientResourceReaders = listOf(resourceReader1, resourceReader2),\n        clientModuleReaders = listOf(moduleReader1, moduleReader2),\n        modulePaths = listOf(Path.of(\"some/path.zip\"), Path.of(\"other/path.zip\")),\n        env = mapOf(\"KEY1\" to \"VALUE1\", \"KEY2\" to \"VALUE2\"),\n        properties = mapOf(\"property1\" to \"value1\", \"property2\" to \"value2\"),\n        timeout = Duration.ofSeconds(10),\n        rootDir = Path.of(\"root/dir\"),\n        cacheDir = Path.of(\"cache/dir\"),\n        outputFormat = \"pcf\",\n        project =\n          Project(\n            projectFileUri = URI(\"file:///dummy/PklProject\"),\n            packageUri = null,\n            dependencies =\n              mapOf(\n                \"foo\" to\n                  Project(\n                    projectFileUri = URI(\"file:///foo\"),\n                    packageUri = URI(\"package://localhost:0/foo@1.0.0\"),\n                    dependencies =\n                      mapOf(\n                        \"bar\" to\n                          Project(\n                            projectFileUri = URI(\"file:///bar\"),\n                            packageUri = URI(\"package://localhost:0/bar@1.1.0\"),\n                            dependencies = emptyMap(),\n                          )\n                      ),\n                  ),\n                \"baz\" to\n                  RemoteDependency(URI(\"package://localhost:0/baz@1.1.0\"), Checksums(\"abc123\")),\n              ),\n          ),\n        http =\n          Http(\n            proxy = Proxy(URI(\"http://foo.com:1234\"), listOf(\"bar\", \"baz\")),\n            caCertificates = byteArrayOf(1, 2, 3, 4),\n            rewrites = mapOf(URI(\"https://foo.com/\") to URI(\"https://bar.com/\")),\n          ),\n        externalModuleReaders = mapOf(\"external\" to externalReader, \"external2\" to externalReader),\n        externalResourceReaders = mapOf(\"external\" to externalReader),\n        traceMode = TraceMode.PRETTY,\n      )\n    )\n  }\n\n  @Test\n  fun `round-trip CreateEvaluatorResponse`() {\n    roundtrip(CreateEvaluatorResponse(requestId = 123, evaluatorId = 456, error = null))\n  }\n\n  @Test\n  fun `round-trip CloseEvaluator`() {\n    roundtrip(CloseEvaluator(evaluatorId = 123))\n  }\n\n  @Test\n  fun `round-trip EvaluateRequest`() {\n    roundtrip(\n      EvaluateRequest(\n        requestId = 123,\n        evaluatorId = 456,\n        moduleUri = URI(\"some/module.pkl\"),\n        moduleText = null,\n        expr = \"some + expression\",\n      )\n    )\n  }\n\n  @Test\n  fun `round-trip EvaluateResponse`() {\n    roundtrip(\n      EvaluateResponse(\n        requestId = 123,\n        evaluatorId = 456,\n        result = byteArrayOf(1, 2, 3, 4, 5),\n        error = null,\n      )\n    )\n  }\n\n  @Test\n  fun `round-trip LogMessage`() {\n    roundtrip(\n      LogMessage(\n        evaluatorId = 123,\n        level = 0,\n        message = \"Hello, world!\",\n        frameUri = \"file:///some/module.pkl\",\n      )\n    )\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/test/kotlin/org/pkl/server/TestTransport.kt",
    "content": "/*\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.util.concurrent.ArrayBlockingQueue\nimport java.util.concurrent.BlockingQueue\nimport org.assertj.core.api.Assertions.*\nimport org.pkl.core.messaging.Message\nimport org.pkl.core.messaging.MessageTransport\n\nclass TestTransport(private val delegate: MessageTransport) : AutoCloseable {\n  val incomingMessages: BlockingQueue<Message> = ArrayBlockingQueue(10)\n\n  fun start() {\n    delegate.start({ incomingMessages.put(it) }, { incomingMessages.put(it) })\n  }\n\n  override fun close() {\n    delegate.close()\n  }\n\n  fun send(message: Message.Client.OneWay) {\n    delegate.send(message)\n  }\n\n  fun send(message: Message.Client.Request) {\n    delegate.send(message) { incomingMessages.put(it) }\n  }\n\n  fun send(message: Message.Client.Response) {\n    delegate.send(message)\n  }\n\n  inline fun <reified T : Message> receive(): T {\n    val message = incomingMessages.take()\n    assertThat(message).isInstanceOf(T::class.java)\n    return message as T\n  }\n}\n"
  },
  {
    "path": "pkl-server/src/test/kotlin/org/pkl/server/TestUtils.kt",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.server\n\nimport java.util.concurrent.AbstractExecutorService\nimport java.util.concurrent.ExecutorService\nimport java.util.concurrent.TimeUnit\nimport org.msgpack.core.MessagePack\nimport org.msgpack.value.ImmutableValue\nimport org.pkl.commons.test.MessagePackDebugRenderer\n\nfun ByteArray.unpack(): ImmutableValue = MessagePack.newDefaultUnpacker(this).unpackValue()\n\nfun ByteArray.asInt(): Int = unpack().asIntegerValue().asInt()\n\nfun ByteArray.asString(): String = unpack().asStringValue().asString()\n\nval ByteArray.debugRendering: String\n  get() = MessagePackDebugRenderer(this).output\n\nfun createDirectExecutor(): ExecutorService =\n  object : AbstractExecutorService() {\n    override fun execute(command: Runnable) {\n      command.run()\n    }\n\n    override fun shutdown() {}\n\n    override fun shutdownNow(): MutableList<Runnable> {\n      throw UnsupportedOperationException(\"shutdownNow\")\n    }\n\n    override fun isShutdown(): Boolean {\n      throw UnsupportedOperationException(\"isShutdown\")\n    }\n\n    override fun isTerminated(): Boolean {\n      throw UnsupportedOperationException(\"isTerminated\")\n    }\n\n    override fun awaitTermination(timeout: Long, unit: TimeUnit): Boolean {\n      throw UnsupportedOperationException(\"awaitTermination\")\n    }\n  }\n"
  },
  {
    "path": "pkl-tools/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\ncom.github.ajalt.clikt:clikt-core-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-core:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-jvm:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown-jvm:5.0.3=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt-markdown:5.0.3=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.clikt:clikt:5.0.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath-jvm:3.6.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.colormath:colormath:3.6.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-core:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-ffm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm-jna:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-jvm:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown-jvm:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant-markdown:3.0.1=runtimeClasspath,testRuntimeClasspath\ncom.github.ajalt.mordant:mordant:3.0.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\ncom.palantir.javapoet:javapoet:0.7.0=runtimeClasspath,testRuntimeClasspath\ncom.squareup:kotlinpoet:1.6.0=runtimeClasspath,testRuntimeClasspath\nio.leangen.geantyref:geantyref:1.3.16=runtimeClasspath,testRuntimeClasspath\nnet.java.dev.jna:jna:5.14.0=runtimeClasspath,testRuntimeClasspath\norg.commonmark:commonmark-ext-gfm-tables:0.26.0=runtimeClasspath,testRuntimeClasspath\norg.commonmark:commonmark:0.26.0=runtimeClasspath,testRuntimeClasspath\norg.fusesource.jansi:jansi:2.4.2=runtimeClasspath,testRuntimeClasspath\norg.graalvm.polyglot:polyglot:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:collections:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:graal-sdk:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:jniutils:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:nativeimage:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.sdk:word:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-api:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-compiler:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.graalvm.truffle:truffle-runtime:25.0.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-reflect:2.2.20=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.20=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlin:kotlin-stdlib:2.2.20=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-html-jvm:0.11.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains:annotations:13.0=compileClasspath,testCompileClasspath\norg.jetbrains:annotations:23.0.0=runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown-jvm:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.jetbrains:markdown:0.7.3=runtimeClasspath,testRuntimeClasspath\norg.jline:jline-native:3.23.0=runtimeClasspath,testRuntimeClasspath\norg.jline:jline-reader:3.23.0=runtimeClasspath,testRuntimeClasspath\norg.jline:jline-terminal-jansi:3.23.0=runtimeClasspath,testRuntimeClasspath\norg.jline:jline-terminal:3.23.0=runtimeClasspath,testRuntimeClasspath\norg.msgpack:msgpack-core:0.9.8=runtimeClasspath,testRuntimeClasspath\norg.organicdesign:Paguro:3.10.3=runtimeClasspath,testRuntimeClasspath\norg.snakeyaml:snakeyaml-engine:2.10=runtimeClasspath,testRuntimeClasspath\nempty=annotationProcessor,fatJar,firstPartySourcesJars,placeholderAnnotationProcessor,placeholderCompileClasspath,placeholderRuntimeClasspath,shadow,signatures,testAnnotationProcessor\n"
  },
  {
    "path": "pkl-tools/pkl-tools.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport java.io.OutputStream\nimport java.nio.charset.StandardCharsets\nimport java.util.*\nimport kotlin.io.path.createDirectories\nimport kotlin.io.path.writeText\n\nplugins {\n  pklAllProjects\n  pklFatJar\n  signing\n}\n\nval placeholder: SourceSet by sourceSets.creating\n\nval firstPartySourcesJars by configurations.existing\n\n// Note: pkl-tools cannot (easily) contain pkl-config-kotlin\n// because pkl-tools ships with a shaded Kotlin stdlib.\ndependencies {\n  // Use scope `api` so that other subprojects\n  // can declare a normal project dependency on this project,\n  // which is desirable for IntelliJ integration.\n  // The published fat JAR doesn't declare any dependencies.\n  api(projects.pklCli)\n  api(projects.pklCodegenJava)\n  api(projects.pklCodegenKotlin)\n  api(projects.pklConfigJava)\n  api(projects.pklCore)\n  api(projects.pklDoc)\n  api(projects.pklCommons)\n\n  // used by `pklFatJar` plugin (ideally this would be inferred automatically)\n  firstPartySourcesJars(project(\":pkl-cli\", \"sourcesJar\"))\n  firstPartySourcesJars(project(\":pkl-codegen-java\", \"sourcesJar\"))\n  firstPartySourcesJars(project(\":pkl-codegen-kotlin\", \"sourcesJar\"))\n  firstPartySourcesJars(project(\":pkl-config-java\", \"sourcesJar\"))\n  firstPartySourcesJars(project(\":pkl-core\", \"sourcesJar\"))\n  firstPartySourcesJars(project(\":pkl-doc\", \"sourcesJar\"))\n}\n\n// TODO: need to figure out how to properly generate javadoc here.\n// For now, we'll include a placeholder javadoc jar.\nval javadocPlaceholder by tasks.registering(Javadoc::class) { source = placeholder.allJava }\n\njava { withJavadocJar() }\n\nval javadocJar by\n  tasks.existing(Jar::class) {\n    from(javadocPlaceholder)\n    archiveBaseName.set(\"pkl-tools-all\")\n    archiveClassifier.set(\"javadoc\")\n  }\n\ntasks.shadowJar {\n  dependsOn(\":pkl-doc:shadowJar\")\n  archiveBaseName.set(\"pkl-tools-all\")\n}\n\nprivate fun Exec.configureTestStartFatJar(launcher: Provider<JavaLauncher>) {\n  dependsOn(tasks.shadowJar)\n  group = \"verification\"\n\n  // placeholder output to satisfy up-to-date check\n  val outputFile = layout.buildDirectory.file(\"testStartFatJar/${name}.txt\")\n  outputs.file(outputFile)\n\n  inputs.files(tasks.shadowJar)\n  executable = launcher.get().executablePath.asFile.absolutePath\n  standardOutput = OutputStream.nullOutputStream()\n\n  argumentProviders.add(\n    CommandLineArgumentProvider {\n      buildList {\n        add(\"-cp\")\n        add(tasks.shadowJar.get().outputs.files.singleFile.absolutePath)\n        add(\"org.pkl.cli.Main\")\n        add(\"eval\")\n        add(\"-x\")\n        add(\"1 + 1\")\n        add(\"pkl:base\")\n      }\n    }\n  )\n\n  doLast {\n    outputFile.get().asFile.toPath().let { file ->\n      file.parent.createDirectories()\n      file.writeText(\"OK\")\n    }\n  }\n}\n\nval testStartFatJar by\n  tasks.registering(Exec::class) { configureTestStartFatJar(buildInfo.javaTestLauncher) }\n\ntasks.validateFatJar { dependsOn(testStartFatJar) }\n\nfor (jdkTarget in buildInfo.jdkTestRange) {\n  if (buildInfo.jdkToolchainVersion == jdkTarget) {\n    tasks.register(\"testStartFatJarJdk${jdkTarget.asInt()}\") {\n      group = \"verification\"\n      description = \"alias for testStartFatJar\"\n      dependsOn(testStartFatJar)\n    }\n  } else {\n    val task =\n      tasks.register(\"testStartFatJarJdk${jdkTarget.asInt()}\", Exec::class) {\n        enabled = buildInfo.isVersionEnabled(jdkTarget)\n        val launcher = project.javaToolchains.launcherFor { languageVersion = jdkTarget }\n        configureTestStartFatJar(launcher)\n      }\n    if (buildInfo.multiJdkTesting) {\n      tasks.validateFatJar { dependsOn(task) }\n    }\n  }\n}\n\npublishing {\n  publications {\n    named<MavenPublication>(\"fatJar\") {\n      // don't use `-all` suffix because this is the only JAR we publish\n      artifactId = \"pkl-tools\"\n      // add placeholder javadoc jar to publication\n      artifact(javadocJar)\n      pom {\n        url.set(\"https://github.com/apple/pkl/tree/main/pkl-tools\")\n        description.set(\n          \"Fat Jar containing pkl-cli, pkl-codegen-java, \" +\n            \"pkl-codegen-kotlin, pkl-config-java, pkl-core, pkl-doc, \" +\n            \"and their shaded third-party dependencies.\"\n        )\n        name.set(artifactId)\n        // keep in sync with pklPublishLibrary\n        licenses {\n          license {\n            name.set(\"The Apache Software License, Version 2.0\")\n            url.set(\"https://github.com/apple/pkl/blob/main/LICENSE.txt\")\n          }\n        }\n        developers {\n          developer {\n            id.set(\"pkl-authors\")\n            name.set(\"The Pkl Authors\")\n            email.set(\"pkl-oss@group.apple.com\")\n          }\n        }\n        scm {\n          connection.set(\"scm:git:git://github.com/apple/pkl.git\")\n          developerConnection.set(\"scm:git:ssh://github.com/apple/pkl.git\")\n          val buildInfo = project.extensions.getByType<BuildInfo>()\n          url.set(\"https://github.com/apple/pkl/tree/${buildInfo.commitish}\")\n        }\n        issueManagement {\n          system.set(\"GitHub Issues\")\n          url.set(\"https://github.com/apple/pkl/issues\")\n        }\n        ciManagement {\n          system.set(\"GitHub Actions\")\n          url.set(\"https://github.com/apple/pkl/actions\")\n        }\n      }\n    }\n  }\n}\n\nsigning {\n  // provided as env vars `ORG_GRADLE_PROJECT_signingKey` and `ORG_GRADLE_PROJECT_signingPassword`\n  // in CI.\n  val signingKey =\n    (findProperty(\"signingKey\") as String?)?.let {\n      Base64.getDecoder().decode(it).toString(StandardCharsets.US_ASCII)\n    }\n  val signingPassword = findProperty(\"signingPassword\") as String?\n  if (signingKey != null && signingPassword != null) {\n    useInMemoryPgpKeys(signingKey, signingPassword)\n  }\n  sign(publishing.publications[\"fatJar\"])\n}\n"
  },
  {
    "path": "pkl-tools/src/dummy/java/org/pkl/tools/Empty.java",
    "content": "/**\n * Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.pkl.tools;\n\n/**\n * This is an intentionally empty class.\n */\n// TODO: figure out how to generate javadoc for a shadow jar.\n@SuppressWarnings(\"unused\")\npublic final class Empty {\n  private Empty() {}\n}\n"
  },
  {
    "path": "settings-gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\nempty=incomingCatalogForLibs0\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "/*\n * Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nrootProject.name = \"pkl\"\n\ninclude(\"bench\")\n\ninclude(\"docs\")\n\ninclude(\"pkl-bom\")\n\ninclude(\"pkl-cli\")\n\ninclude(\"pkl-codegen-java\")\n\ninclude(\"pkl-codegen-kotlin\")\n\ninclude(\"pkl-commons\")\n\ninclude(\"pkl-commons-cli\")\n\ninclude(\"pkl-commons-test\")\n\ninclude(\"pkl-config-java\")\n\ninclude(\"pkl-config-kotlin\")\n\ninclude(\"pkl-core\")\n\ninclude(\"pkl-doc\")\n\ninclude(\"pkl-executor\")\n\ninclude(\"pkl-formatter\")\n\ninclude(\"pkl-gradle\")\n\ninclude(\"pkl-internal-intellij-plugin\")\n\ninclude(\"pkl-parser\")\n\ninclude(\"pkl-server\")\n\ninclude(\"pkl-tools\")\n\ninclude(\"stdlib\")\n\npluginManagement {\n  repositories {\n    mavenCentral()\n    gradlePluginPortal()\n  }\n}\n\nplugins { id(\"org.gradle.toolchains.foojay-resolver-convention\") version (\"1.0.0\") }\n\n@Suppress(\"UnstableApiUsage\") dependencyResolutionManagement { repositories { mavenCentral() } }\n\nif (\n  gradle.startParameter.taskNames.contains(\"updateDependencyLocks\") ||\n    gradle.startParameter.taskNames.contains(\"uDL\")\n) {\n  gradle.startParameter.isWriteDependencyLocks = true\n}\n\nfor (prj in rootProject.children) {\n  prj.buildFileName = \"${prj.name}.gradle.kts\"\n}\n\nenableFeaturePreview(\"TYPESAFE_PROJECT_ACCESSORS\")\n"
  },
  {
    "path": "stdlib/Benchmark.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A template for writing and running benchmarks.\n///\n/// To write benchmarks, amend this module and define [microbenchmarks],\n/// [outputBenchmarks], and/or [parserBenchmarks].\n/// To run benchmarks, evaluate the amended module.\n///\n/// Each benchmark run consists of *m* [iterations] of *n* repetitions.\n/// The number of repetitions is controlled indirectly via [iterationTime].\n///\n/// The reported metric is time per repetition.\n/// It is calculated as measured iteration time divided by number of repetitions.\n///\n/// Benchmarks are warmed up for approximately the same time they are measured.\n/// The goal is to measure steady state performance.\n///\n/// The benchmark [report] details benchmark [results][BenchmarkResult]\n/// and the [platform][_platform.Platform] that benchmarks were run on.\n/// By default, the report is rendered in *Pcf*.\n/// To render the report in a different format, override `output.renderer`.\n///\n/// Warning: Although this module is ready for initial use,\n/// benchmark results may be inaccurate or inconsistent.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.Benchmark\n\nimport \"pkl:platform\" as _platform\n\n/// The number of benchmark iterations to run.\n///\n/// This value can be [overridden][Benchmark.iterations] per benchmark.\niterations: UInt32 = 15\n\n/// The approximate time to spend on each benchmark iteration.\n///\n/// This value indirectly controls the number of repetitions per iteration.\n///\n/// This value can be [overridden][Benchmark.iterationTime] per benchmark.\niterationTime: Duration = 100.ms\n\n/// Whether to report detailed results such as [BenchmarkResult.samples].\n///\n/// This value can be [overridden][Benchmark.isVerbose] per benchmark.\nisVerbose: Boolean = false\n\n/// Benchmarks that measure the time taken to evaluate an expression.\n///\n/// Mapping keys are the benchmarks' descriptive names.\nmicrobenchmarks: Mapping<String, Microbenchmark> = new {\n  default {\n    iterations = module.iterations\n    iterationTime = module.iterationTime\n    isVerbose = module.isVerbose\n  }\n}\n\n/// Benchmarks that measure the time taken to render a module's output.\n///\n/// Mapping keys are the benchmarks' descriptive names.\noutputBenchmarks: Mapping<String, OutputBenchmark> = new {\n  default {\n    iterations = module.iterations\n    iterationTime = module.iterationTime\n    isVerbose = module.isVerbose\n  }\n}\n\n/// Benchmarks that measure the time taken to parse a module's source code into an abstract syntax tree.\n///\n/// Mapping keys are the benchmarks' descriptive names.\nparserBenchmarks: Mapping<String, ParserBenchmark> = new {\n  default {\n    iterations = module.iterations\n    iterationTime = module.iterationTime\n    isVerbose = module.isVerbose\n  }\n}\n\n/// The report containing benchmark results. Typically not configured from user code.\nreport: BenchmarkReport = new {\n  platform = _platform.current\n\n  when (!module.microbenchmarks.isEmpty) {\n    microbenchmarks {\n      for (name, benchmark in module.microbenchmarks) {\n        [name] = benchmark.run()\n      }\n    }\n  }\n\n  when (!module.outputBenchmarks.isEmpty) {\n    outputBenchmarks {\n      for (name, benchmark in module.outputBenchmarks) {\n        [name] = benchmark.run()\n      }\n    }\n  }\n\n  when (!module.parserBenchmarks.isEmpty) {\n    parserBenchmarks {\n      for (name, benchmark in module.parserBenchmarks) {\n        [name] = benchmark.run()\n      }\n    }\n  }\n}\n\n/// Common base class for benchmarks.\nabstract class Benchmark {\n  /// The number of benchmark iterations to run.\n  iterations: UInt32\n\n  /// The approximate time to spend on each benchmark iteration.\n  ///\n  /// This value indirectly controls the number of repetitions per iteration.\n  iterationTime: Duration\n\n  /// Whether to report detailed results such as [BenchmarkResult.samples].\n  isVerbose: Boolean\n\n  /// Runs this benchmark. Typically not called from user code.\n  abstract function run(): BenchmarkResult\n}\n\n/// The result of running a benchmark.\nclass BenchmarkResult {\n  /// The number of iterations run.\n  iterations: UInt32\n\n  /// The number of repetitions run per iteration.\n  repetitions: UInt\n\n  /// The average time that a repetition took to complete in each iteration,\n  /// calculated as measured iteration time divided by number of repetitions.\n  ///\n  /// This property is only set if [Benchmark.isVerbose] is [true].\n  samples: List<Duration>(length == iterations)?\n\n  /// The minimum of [samples].\n  min: Duration\n\n  /// The maximum of [samples].\n  max: Duration\n\n  /// The mean of [samples].\n  mean: Duration\n\n  /// The standard deviation of [samples].\n  stdev: Duration\n\n  /// The margin of error for [mean] at 99% confidence level.\n  error: Duration\n}\n\n/// A benchmark that measures the time taken to evaluate an expression.\nclass Microbenchmark extends Benchmark {\n  /// The expression to evaluate.\n  expression: Any\n\n  external function run(): BenchmarkResult\n}\n\n/// A benchmark that measures the time taken to render a module's output.\nclass OutputBenchmark extends Benchmark {\n  /// The module to evaluate.\n  sourceModule: Module\n\n  external function run(): BenchmarkResult\n}\n\n/// A benchmark that measures the time taken to parse a module's source code.\nclass ParserBenchmark extends Benchmark {\n  /// The module source code to parse.\n  @SourceCode { language = \"Pkl\" }\n  sourceText: String\n\n  /// The effective URI of [sourceText].\n  ///\n  /// If [sourceText] contains relative imports, set [sourceUri] so that these imports may be\n  /// resolved.\n  sourceUri: String = \"repl:text\"\n\n  external function run(): BenchmarkResult\n}\n\n/// The results of running a module's benchmarks.\nclass BenchmarkReport {\n  /// The results of the microbenchmarks that were run.\n  ///\n  /// Mapping keys are the benchmarks' descriptive names.\n  microbenchmarks: Mapping<String, BenchmarkResult>?\n\n  /// The results of the output benchmarks that were run.\n  ///\n  /// Mapping keys are the benchmarks' descriptive names.\n  outputBenchmarks: Mapping<String, BenchmarkResult>?\n\n  /// The results of the parser benchmarks that were run.\n  ///\n  /// Mapping keys are the benchmarks' descriptive names.\n  parserBenchmarks: Mapping<String, BenchmarkResult>?\n\n  /// The platform that benchmarks were run on.\n  platform: _platform.Platform\n}\n\noutput {\n  value = report\n\n  renderer = new PcfRenderer {\n    omitNullProperties = true\n    converters {\n      // round durations to two decimal places\n      [Duration] = (it: Duration) -> it.value.toFixed(2).toFloat().toDuration(it.unit)\n    }\n  }\n}\n"
  },
  {
    "path": "stdlib/Command.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2026 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Defines inputs and outputs for CLI commands implemented in Pkl.\n///\n/// Modules extending `pkl:Command` may configure [ModuleOutput.text], [ModuleOutput.bytes], and/or\n/// [ModuleOutput.files] of [output] to influence the effect of the command.\n///\n/// Command modules should override [options] and provide their own class declaring options:\n/// ```\n/// extends \"pkl:Command\"\n///\n/// options: Options\n///\n/// class Options {\n///   // ...\n/// }\n/// ```\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nopen module pkl.Command\n\nimport \"pkl:Command\"\nimport \"pkl:reflect\"\n\nlocal commandClass = reflect.Class(getClass())\n\n/// Command configuration.\nhidden command: CommandInfo = new {\n  name = // choose the name of the module if the command is a module or the class otherwise\n    if (commandClass.name == \"ModuleClass\") reflect.Module(module).name else commandClass.name\n  description = commandClass.docComment // works for both classes and module classes\n}\n\n/// Command line options.\n///\n/// This property is set by the runtime during command execution.\n/// It must not be amended or overridden by modules or classes extending [Command].\n///\n/// Command modules should override this property and provide their own options type.\n/// The properties of the specified type declare the command line flags and arguments accepted by\n/// the command.\n///\n/// Example:\n/// ```\n/// extends \"pkl:Command\"\n///\n/// options: Options\n///\n/// class Options {\n///   /// Maximum number of tries to attempt operation before giving up.\n///   `max-tries`: UInt = 3\n///\n///   /// Duration after which operation will be timed out.\n///   @Flag { convert = module.convertDuration; metavar = \"duration\" }\n///   `connection-timeout`: Duration = 30.s\n///\n///   /// Whether to use cache data locally.\n///   @BooleanFlag\n///   cache: Boolean = true\n///\n///   /// Log verbosity.\n///   @CountedFlag { shortName = \"v\" }\n///   verbose: Int\n///\n///   /// File paths to operate on.\n///   @Argument { completionCandidates = \"paths\" }\n///   path: Listing<String>\n/// }\n/// ```\nhidden options: Typed\n\n/// The value of the parent command with parsed options.\n///\n/// This property is set by the runtime during command execution.\n/// It must not be amended or overridden by modules or classes extending [Command].\n///\n/// The parent command is `null` for root commands.\nhidden parent: Command?\n\n/// The value of the root command with parsed options.\n///\n/// This property is set by the runtime during command execution.\n///\n/// The root command is `null` for root commands.\nhidden fixed root: Command? = parent?.root ?? parent\n\n/// Command configuration.\nclass CommandInfo {\n  /// The name of the subcommand.\n  ///\n  /// Default value: the name of the module or class extending [Command].\n  name: String\n\n  /// A description of the command; shown in its CLI help.\n  ///\n  /// Default value: the doc comment of the module or class extending [Command].\n  description: String?\n\n  /// Hide this command from CLI help.\n  hide: Boolean = false\n\n  /// If this command is executed, return an error and print CLI usage.\n  ///\n  /// Only applicable to commands with [subcommands].\n  ///\n  /// This is enabled by default when this command has [subcommands].\n  /// Overriding it to `false` will allow this command to be executed directly.\n  noOp: Boolean(implies(!subcommands.isEmpty)) = !subcommands.isEmpty\n\n  /// Child commands.\n  ///\n  /// Must have unique [name] values.\n  // NB: not using isDistinctBy constraint because the command runtime can give better errors\n  subcommands: Listing<Command>\n}\n\n/// Annotates [options] properties to configure them as named CLI flags.\n// NB: this should be a sealed class once Pkl supports them\nabstract class BaseFlag extends Annotation {\n  /// Abbreviated flag name.\n  shortName: Char?\n\n  /// Hide this option from CLI help.\n  hide: Boolean = false\n}\n\n/// Annotates an [options] property to configure it as a named CLI flag that accepts a value.\nclass Flag extends BaseFlag {\n  /// Text to use in place of the option value in CLI help.\n  ///\n  /// If not specified, the value is derived from the flag's type.\n  metavar: String?\n\n  /// Customize the behavior of parsing the raw option values.\n  ///\n  /// When the return value is an [Import] value or a [Pair] member, [List] or [Set] element\n  /// containing an [Import], the URI or glob URI specified by the value is imported and the value\n  /// is replaced with the value of the imported module(s).\n  ///\n  /// If no transform is provided, the raw flag value are parsed according to the option's type:\n  ///\n  /// | Type                       | Behavior |\n  /// | -------------------------- | -------- |\n  /// | [String]                   | Value is used verbatim |\n  /// | [Char]                     | Value is used verbatim; must be exactly one character |\n  /// | [Boolean]                  | True values: `true`, `t`, `1`, `yes`, `y`, `on`; False values: `false`, `f`, `0`, `no`, `n`, `off` |\n  /// | [Number]                   | Value is parsed as an [Int] if possible, otherwise parsed as [Float] |\n  /// | [Float]                    | Value is parsed as a [Float] |\n  /// | [Int]                      | Value is parsed as an [Int] |\n  /// | [Int8], [Int16], [Int32], [UInt], [UInt8], [UInt16], [UInt32] | Value is parsed as an [Int] and must be within the type's range |\n  /// | Union of [String] literals | Value is used verbatim; must match a member of the union |\n  /// | [Listing], [List], [Set]   | Element values are parsed based on the above primitive types |\n  /// | [Mapping], [Map], [Pair]   | Value is split into a [Pair] on the first `\"=\"` and each substring is parsed based on the above primitive types |\n  /// | Other types                | An error is thrown; `convert` should be defined explicitly |\n  convert: ((String) -> Any)?\n\n  /// Specifies whether the flag may be specified more than once.\n  ///\n  /// If not specified, this is determined based on the option's type.\n  /// Options with type [Listing], [List], [Set], [Mapping], or [Map] are mulitple by default.\n  /// Overriding this behavior generally requires setting [convert] and/or [transformAll].\n  multiple: Boolean?\n\n  /// Customize the behavior of turning all parsed flag values into the final option value.\n  ///\n  /// When the return value is an [Import] value or a [Pair] member, [List] or [Set] element\n  /// containing an [Import], the URI or glob URI specified by the value is imported and the value\n  /// is replaced with the value of the imported module(s).\n  ///\n  /// If no value is provided, all flag values are transformed according to the option's type:\n  ///\n  /// | Type              | Behavior |\n  /// | ----------------- | -------- |\n  /// | [Mapping], [Map]  | Each value must be a [Pair], each pair becomes an entry in the result. |\n  /// | [Listing], [List] | Result is all option values in the order specified |\n  /// | [Set]             | Result is all unique option values |\n  /// | Other types       | Result is the last value specified option value |\n  transformAll: ((List<Any>) -> Any)?\n\n  /// Specify how this flag should be completed in generated shell completions.\n  ///\n  /// If set to `\"paths\"`, the completion candidates will be local file paths. \n  /// If set to a [Listing], the completion candidates will be the specified literal strings.\n  ///\n  /// Options with a string literal union type use the members of the union as completion candidates\n  /// by default.\n  completionCandidates: \"paths\" | *Listing<String>(isDistinct)\n}\n\n/// Annotates [Boolean] [options] properties to configure them as named CLI flags that may be\n/// specified zero or one times.\n///\n/// Boolean flags produce a pair of flags in the form `--<name>`/`--no-<name>`.\n///\n/// Annotating a property with a type other than [Boolean] is an error.\nclass BooleanFlag extends BaseFlag\n\n/// Annotates [Integer] [options] properties to configure them as named CLI flags that may be\n/// specified zero or more times.\n///\n/// Counted flags produce a value equal to the number of times a flag is specified.\n///\n/// Annotating a property with a type other than [Int] is an error.\nclass CountedFlag extends BaseFlag\n\n/// Annotates an [options] property to configure it as a positional CLI argument.\nclass Argument extends Annotation {\n  /// Customize the behavior of turning the raw option values string into the final value.\n  ///\n  /// When the return value is an [Import] value or a [Pair] member, [List] or [Set] element\n  /// containing an [Import], the URI or glob URI specified by the value is imported and the value\n  /// is replaced with the value of the imported module(s).\n  ///\n  /// If no value is provided, each option value is transformed using the same rules as\n  /// [Flag.convert].\n  convert: ((String) -> Any)?\n\n  /// Specifies whether the argument may be specified more than once.\n  ///\n  /// If not specified, this is determined based on the option's type.\n  /// Options with type [Listing], [List], [Set], [Mapping], or [Map] are multiple by default.\n  /// Overriding this behavior generally requires setting [convert] and/or [transformAll].\n  ///\n  /// Only one argument per command may be multiple.\n  multiple: Boolean?\n\n  /// Customize the behavior of turning all parsed flag values into the final option value.\n  ///\n  /// When the return value is an [Import] value or a [Pair] member, [List] or [Set] element\n  /// containing an [Import], the URI or glob URI specified by the value is imported and the value\n  /// is replaced with the value of the imported module(s).\n  ///\n  /// If no value is provided, all option values are transformed using the same rules as\n  /// [Flag.transformAll].\n  transformAll: ((List<Any>) -> Any)?\n\n  /// Specify how this flag should be completed in generated shell completions.\n  ///\n  /// If set to `\"paths\"`, the completion candidates will be local file paths. \n  /// If set to a [Listing], the completion candidates will be the specified literal strings.\n  ///\n  /// Options with a string literal union type use the members of the union as completion candidates\n  /// by default.\n  completionCandidates: \"paths\" | *Listing<String>(isDistinct)\n}\n\n/// A value used in [Flag.convert] and [Argument.convert] to declare an option as a dynamic\n/// import.\nclass Import {\n  /// The absolute URI of the module to import.\n  uri: String\n\n  /// Whether [uri] should be interpreted as a glob pattern.\n  ///\n  /// When `false`, the replacement value is the value of the specified module.\n  /// When `true`, the replacement value is a [Mapping] from [String] keys to matched module values. \n  glob: Boolean = false\n}\n\nlocal const quantityRegex = Regex(#\"([0-9]+(?:\\.[0-9]+)?)\\.?([A-Za-z]+)\"#)\n\nlocal const function parseQuantity(value: String, typeName: String): Pair<Float, String> =\n  let (match = quantityRegex.matchEntire(value))\n    if (match == null)\n      throw(\"Unable to parse \\(typeName) from string '\\(value)'\")\n    else\n      Pair(match.groups[1].value.toFloat(), match.groups[2].value.toLowerCase())\n\n/// A convert function for [Duration] values.\n///\n/// For use with [Flag.convert] and [Argument.convert].\nhidden const convertDuration: (String) -> Duration = (value: String) ->\n  let (quantity = parseQuantity(value, \"Duration\"))\n  let (_unit = quantity.second)\n  let (unit = if (_unit is DurationUnit) _unit else null)\n    quantity.first.toDuration(unit ?? throw(\"Unable to parse DurationUnit from '\\(_unit)'\"))\n\n/// A convert function for [DataSize] values.\n///\n/// For use with [Flag.convert] and [Argument.convert].\nhidden const convertDataSize: (String) -> DataSize = (value: String) ->\n  let (quantity = parseQuantity(value, \"DataSize\"))\n  let (_unit = quantity.second)\n  let (unit = if (_unit is DataSizeUnit) _unit else null)\n    quantity.first.toDataSize(unit ?? throw(\"Unable to parse DataSizeUnit from '\\(_unit)'\"))\n"
  },
  {
    "path": "stdlib/DocPackageInfo.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Template for _doc-package-info.pkl_, the descriptor for a package.\n///\n/// _NOTE_: A doc package is a way to generate documentation for modules that are not published\n/// via the [Project.Package] mechanism.\n/// Packages published via the [Project.Package] mechanism can have their documentation\n/// generated directly by passing the resulting Package URI into Pkldoc. \n///\n/// A documentation package is a set of related modules that are versioned together.\n/// Each package must have a descriptor that\n/// * amends this template\n/// * is named _doc-package-info.pkl_\n/// * is passed to the _pkldoc_ command together with the modules to generate documentation for.\n///\n/// Each module to generate documentation must declare a module name that starts with a package [name].\n/// For example, the following are valid module declarations for package _com.example_:\n/// * `module com.example.Birds`\n/// * `module com.example.Birds.Parrot`\n///\n/// The part of the module name that comes after the package name\n/// must match the module's relative path in its source code repository.\n/// For example, module _com.example.Birds.Parrot_\n/// is expected to exist at path _Birds/Parrot.pkl_ within the package root.\n///\n/// A typical descriptor for a package looks as follows:\n///\n/// ```\n/// /// The overview documentation for this package.\n/// /// The first paragraph is the mandatory _summary_.\n/// /// Try to keep the summary short; a single sentence is common.\n/// ///\n/// /// Subsequent paragraphs are separated by an empty line and collapsed by default.\n/// /// They can use *Markdown syntax* and Pkldoc links such as [String].\n/// amends \"pkl:DocPackageInfo\"\n///\n/// name = \"com.example.Birds\"\n/// importUri = \"https://example.com/Birds\"\n/// authors { \"pigeon@example.com\" }\n/// sourceCode = \"https://github.com/apple/birds/\"\n/// sourceCodeUrlScheme = \"https://github.com/apple/birds/blob/\\(version)%{path}#L%{line}-%{endLine}\"\n/// issueTracker = \"https://github.com/apple/birds/issues\"\n/// version = \"1.7.0\"\n/// ```\n///\n/// To deprecate a package, deprecate its descriptor:\n///\n/// ```\n/// @Deprecated { message = \"Use `com.example.Birds.Parrot` instead\" }\n/// amends \"pkl:PackageInfo\"\n/// ```\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.DocPackageInfo\n\n// used by doc comments\nimport \"pkl:DocPackageInfo\"\nimport \"pkl:Project\"\nimport \"pkl:reflect\"\nimport \"pkl:semver\"\n\n/// The name of this package.\nname: PackageName\n\n/// The version of this package.\n///\n/// Use `\"0.0.0\"` for unversioned packages.\nversion: PackageVersion\n\n/// The import base URI for modules in this package.\n///\n/// Module import URIs are constructed from this URI as follows:\n/// `\"\\(importUri)\\(modulePath)\"` where `modulePath` is\n/// `moduleName.removePrefix(name).replaceAll(\".\", \"/\")`.\n/// For example, if package name is `foo.bar` and module name is `foo.bar.baz.qux`,\n/// then `modulePath` is `baz/qux`.\nimportUri: Uri(endsWith(\"/\"))\n\n/// The URI representing the package itself, if exists.\nuri: Uri?\n\n/// The authors' emails for this package.\n///\n/// Email addresses must adhere to\n/// [RFC5322 mailbox](https://www.rfc-editor.org/rfc/rfc5322#section-3.4) specification.\n///\n/// Example:\n/// ```\n/// email { \"Johnny Appleseed <johnny.appleseed@example.com>\" }\n/// ```\nauthors: Listing<String>\n\n/// The source code repository for this package.\n///\n/// Example:\n/// ```\n/// sourceCode = \"https://github.com/myorg/myproject\"\n/// ```\nsourceCode: Uri?\n\n/// The web URL of the source code for this package *version*.\n///\n/// The following placeholders are available:\n///\n/// - `%{path}`\n///   absolute file path of the file to open\n/// - `%{line}`\n///   start line number to navigate to\n/// - `%{endLine}`\n///   end line number to navigate to\n///\n/// The `%{path}` placeholder is derived from the module's name relative to the package name.\n/// The module's name is expected to be prefixed by the package name.\n/// In Pkl terms, `path` can be thought of as \n/// `\"/\" + moduleName.replaceFirst(packageName).replaceAll(\".\", \"/\") + \".pkl\"`.\n///\n/// For example, if package name is `foo.bar` and module name is `foo.bar.baz.qux`,\n/// then `%{path}` is `/baz/qux.pkl`.\n///\n/// Example:\n///\n/// ```\n/// sourceCodeUrlScheme = \"https://github.com/user/repo/blob/v\\(version)%{path}#L%{line}-L%{endLine}\"`\n/// ```\nsourceCodeUrlScheme: String?\n\n/// The web URL of the issue tracker for this package.\nissueTracker: Uri\n\n/// The packages depended on by this package.\n///\n/// Used to display package dependencies and to create documentation links.\n/// Set automatically for packages that are part of a docsite.\ndependencies: Listing<PackageDependency>(isDistinctBy((it) -> it.name))\n\n/// Any extra attributes to add to the documentation.\nextraAttributes: Mapping<String, String>\n\n/// A package depended on by this package.\nclass PackageDependency {\n  /// The name of the depended-on package.\n  name: PackageName\n\n  /// The version of the depended-on package.\n  ///\n  /// Use `\"0.0.0\"` for unversioned packages.\n  version: PackageVersion\n\n  /// The source code repository of the depended-upon package.\n  sourceCode: Uri(endsWith(\"/\"))\n\n  /// The source code scheme with placeholders.\n  ///\n  /// See [DocPackageInfo.sourceCodeUrlScheme] for more details.\n  sourceCodeUrlScheme: String?\n\n  /// The web URL of the Pkldoc page for the depended-on package *version*,\n  /// Only needs to be set if the depended-on package belongs to a different Pkldoc website.\n  documentation: Uri(endsWith(\"/\"))?\n}\n\n/// A package name.\ntypealias PackageName = String(!contains(\"/\"))\n\n/// A package version.\ntypealias PackageVersion = String(semver.isValid(this))\n\n@Unlisted\nfixed overview: String(!isBlank) =\n  moduleMirror.docComment\n    ?? throw(\n      \"\"\"\n      Missing overview documentation for package `\\(name)`.\n      To fix this problem, add a doc comment to `doc-package-info.pkl` (above `amends \"pkl:DocPackageInfo\"`).\n      \"\"\"\n    )\n\n@Unlisted\nfixed overviewImports: Map<String, Uri> = moduleMirror.imports\n\n@Unlisted\nfixed annotations: List<Annotation> = moduleMirror.annotations\n\nlocal moduleMirror = reflect.Module(this)\n"
  },
  {
    "path": "stdlib/DocsiteInfo.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Template for _docsite-info.pkl_, the descriptor for a Pkldoc website.\n///\n/// A website generated by Pkldoc can optionally have a descriptor that\n/// * amends this template\n/// * is named _docsite-info.pkl_\n/// * is passed to the _pkldoc_ command together with the modules to generate documentation for.\n///\n/// A typical descriptor looks as follows:\n/// ```\n/// /// The optional overview documentation displayed on the main page of the website.\n/// ///\n/// /// Subsequent paragraphs are separated by an empty line and collapsed by default.\n/// /// They can use *Markdown syntax* and Pkldoc links such as [String].\n/// amends \"pkl:DocsiteInfo\"\n///\n/// title = \"Title displayed in the header of each page\"\n/// ```\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.DocsiteInfo\n\nimport \"pkl:reflect\"\n\n/// The title of this Pkldoc website.\n///\n/// This is displayed in the header of each page.\ntitle: String?\n\n@Unlisted\nfixed overview: String? = moduleMirror.docComment\n\n@Unlisted\nfixed overviewImports: Map<String, Uri> = moduleMirror.imports\n\nlocal moduleMirror = reflect.Module(this)\n"
  },
  {
    "path": "stdlib/EvaluatorSettings.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Common settings for Pkl's own evaluator.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\n@Since { version = \"0.26.0\" }\nmodule pkl.EvaluatorSettings\n\n/// The external properties available to Pkl, read using the `prop:` scheme.\nexternalProperties: Mapping<String, String>?\n\n/// The environment variables available to Pkl, read using the `env:` scheme.\n///\n/// Example:\n/// ```\n/// env {\n///   [\"IS_PROD\"] = \"true\"\n/// }\n/// ```\nenv: Mapping<String, String>?\n\n/// The set of module URI patterns that can be imported.\n///\n/// Each element is a regular expression pattern that is tested against a module import.\n///\n/// Modules are imported either through an amends or extends clause, an import clause, or an\n/// import expression.\n///\n/// Example:\n/// ```\n/// allowedModules {\n///   \"https:\"\n///   \"file:\"\n///   \"package:\"\n///   \"projectpackage:\"\n/// }\n/// ```\nallowedModules: Listing<String(isRegex)>?\n\n/// The set of resource URI patterns that can be imported.\n///\n/// Each element is a regular expression pattern that is tested against a resource read.\n///\n/// Example:\n/// ```\n/// allowedResources {\n///   \"https:\"\n///   \"file:\"\n///   \"package:\"\n///   \"projectpackage:\"\n///   \"env:\"\n///   \"prop:\"\n/// }\n/// ```\nallowedResources: Listing<String(isRegex)>?\n\n/// When to format messages with ANSI color codes.\n///\n/// Possible values:\n///\n/// - `\"never\"`: Never format \n/// - `\"auto\"`: Format if the process' stdin, stdout, or stderr are connected to a console.\n/// - `\"always\"`: Always format\n@Since { version = \"0.27.0\" }\ncolor: (\"never\" | \"auto\" | \"always\")?\n\n/// Disables the file system cache for `package:` modules.\n///\n/// When caching is disabled, packages are loaded over the network and stored in memory.\nnoCache: Boolean?\n\n/// A collection of jars, zips, or directories to be placed into the module path.\n///\n/// Module path modules and resources may be read and imported using the `modulepath:` scheme.\nmodulePath: Listing<String>?\n\n/// The duration after which evaluation of a source module will be timed out.\n///\n/// Note that a timeout is treated the same as a program error in that any subsequent source modules will not be evaluated.\ntimeout: Duration?\n\n/// The directory where `package:` modules are cached.\nmoduleCacheDir: String?\n\n/// Restricts access to file-based modules and resources to those located under this directory.\nrootDir: String?\n\n/// Configuration of outgoing HTTP requests.\nhttp: Http?\n\n/// Configuration for external module reader processes.\n@Since { version = \"0.27.0\" }\nexternalModuleReaders: Mapping<String, ExternalReader>?\n\n/// Configuration for external resource reader processes.\n@Since { version = \"0.27.0\" }\nexternalResourceReaders: Mapping<String, ExternalReader>?\n\n/// Defines options for the formatting of calls to the trace() method.\n///\n/// Possible values:\n///\n/// - `\"compact\"`: All structures passed to trace() will be emitted on a single line.\n/// - `\"pretty\"`: All structures passed to trace() will be indented and emitted across multiple lines.\n@Since { version = \"0.30.0\" }\ntraceMode: (\"compact\" | \"pretty\")?\n\nlocal const hostnameRegex = Regex(#\"https?://([^/?#]*)\"#)\n\nlocal const hasNonEmptyHostname = (it: String) ->\n  let (hostname = hostnameRegex.findMatchesIn(it).getOrNull(0)?.groups?.getOrNull(1)?.value)\n    hostname != null && hostname.length > 0\n\n/// A key or value in [Http.rewrites].\n@Since { version = \"0.29.0\" }\ntypealias HttpRewrite = String(startsWith(Regex(\"https?://\")), endsWith(\"/\"), hasNonEmptyHostname)\n\n/// Settings that control how Pkl talks to HTTP(S) servers.\nclass Http {\n  /// Configuration of the HTTP proxy to use.\n  proxy: Proxy?\n\n  /// Replace outbound requests from one URL with another URL.\n  ///\n  /// Each key describes the prefix of a request, and each value describes the replacement prefix.\n  ///\n  /// This can be useful for setting up mirroring of packages, which are fetched over HTTPS.\n  ///\n  /// In the case of multiple matches, the longest prefix is used.\n  ///\n  /// The URL hostname is case-insensitive.\n  ///\n  /// A replacement only happens once when resolving URLs.\n  /// Therefore, the first replacement is the final URL that is used for the outbound request.\n  ///\n  /// In the following example, an original request for `https://pkg.pkl-lang.org/my/pkg@1.0.0` is\n  /// replaced with `https://my.internal.mirror/my/pkg@1.0.0`.\n  ///\n  /// This does not affect `3XX` status code redirect following.\n  ///\n  /// Example:\n  ///\n  /// ```\n  /// rewrites {\n  ///   [\"https://pkg.pkl-lang.org/\"] = \"https://my.internal.mirror/\"\n  /// }\n  /// ```\n  ///\n  /// Rewrite targets must satisfy the following:\n  ///\n  /// * It starts with either `http://`, or `https://`.\n  /// * It ends with `/`.\n  /// * It has a non-empty hostname.\n  ///\n  /// An rewrite target should also not contain a query string or fragment component\n  /// (not schematically enforced).\n  @Since { version = \"0.29.0\" }\n  rewrites: Mapping<HttpRewrite, HttpRewrite>?\n}\n\n/// Settings that control how Pkl talks to HTTP proxies.\nclass Proxy {\n  /// The proxy to use for HTTP(S) connections.\n  ///\n  /// Only HTTP proxies are supported.\n  /// The proxy address must start with `http://`, and can only contain a host and a port.\n  /// If a port is omitted, it defaults to port `80`.\n  ///\n  /// Proxy authentication is not supported.\n  ///\n  /// Example:\n  /// ```\n  /// address = \"http://my.proxy.example.com:5080\"\n  /// ```\n  address: Uri(startsWith(\"http://\"))?\n\n  /// Hosts to which all connections should bypass a proxy.\n  ///\n  /// Values can be either hostnames, or IP addresses.\n  /// IP addresses can optionally be provided using\n  /// [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation).\n  ///\n  /// The value `\"*\"` is a wildcard that disables proxying for all hosts.\n  ///\n  /// A hostname matches all subdomains.\n  /// For example, `example.com` matches `foo.example.com`, but not `fooexample.com`.\n  /// A hostname that is prefixed with a dot matches the hostname itself,\n  /// so `.example.com` matches `example.com`.\n  ///\n  /// Hostnames do not match their resolved IP addresses.\n  /// For example, the hostname `localhost` will not match `127.0.0.1`.\n  ///\n  /// Optionally, a port can be specified.\n  /// If a port is omitted, all ports are matched.\n  ///\n  /// Example:\n  ///\n  /// ```\n  /// noProxy {\n  ///   \"127.0.0.1\"\n  ///   \"169.254.0.0/16\"\n  ///   \"example.com\"\n  ///   \"localhost:5050\"\n  /// }\n  /// ```\n  noProxy: Listing<String>(isDistinct)\n}\n\n@Since { version = \"0.27.0\" }\nclass ExternalReader {\n  /// The external reader executable.\n  ///\n  /// Will be spawned with the same environment variables and working directory as the Pkl process.\n  /// Executable is resolved according to the operating system's process spawning rules.\n  /// On macOS, Linux, and Windows platforms, this may be:\n  ///\n  ///   * An absolute path\n  ///   * A relative path (to the current working directory)\n  ///   * The name of the executable, to be resolved against the `PATH` environment variable \n  executable: String\n\n  /// Additional command line arguments passed to the external reader process.\n  arguments: Listing<String>?\n}\n"
  },
  {
    "path": "stdlib/Project.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A manifest that defines the presence of a project.\n///\n/// A project is useful for defining [dependencies], and also for defining common evaluator\n/// [settings].\n///\n/// A project is a directory that contains a project file at its root.\n/// The project file is a file named `PklProject` exactly, that amends or embeds `\"pkl:Project\"`.\n///\n/// When evaluating from the CLI, the project directory can be specified explicitly using\n/// `--project-dir` flag, or is determined implicitly by walking up the working directory, looking\n/// for a directory containing a `PklProject` file.\n///\n/// When using the API libraries (e.g. _pkl-swift_, _pkl-go_ or _pkl-config-java_), the project must be\n/// explicitly stated via the evaluator builder.\n///\n/// ## Embedding [Project]\n///\n/// In a project file, instead of amending `pkl:Project`, it is possible simply set the\n/// `output.value` property of a module to an instance of [Project].\n/// This allows defining higher levels of abstraction that encapsulate an underlying [Project]\n/// definition.\n///\n/// When defining an abstraction, it is important to:\n///   1. Set the module's `output.value` to the underlying project output.\n///   2. Set [projectFileUri] to the enclosing module's URI.\n///      This is necessary to determine the correct project directory, as well as for resolving\n///      local project dependencies correctly.\n///\n///      The [newInstance()] helper method exists as a convenient way to set this when embedding\n///      project definitions.\n///\n/// Example:\n/// ```\n/// module MyTeamProject\n///\n/// import \"pkl:Project\"\n///\n/// /// The package name, to be prefixed with `myteam`.\n/// packageName: String\n///\n/// project: Project = (Project.newInstance(module)) {\n///   package {\n///     name = \"myteam.\\(packageName)\"\n///   }\n/// }\n///\n/// output {\n///   value = project\n/// }\n/// ``` \n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.Project\n\nimport \"pkl:EvaluatorSettings\" as EvaluatorSettingsModule\nimport \"pkl:Project\"\nimport \"pkl:reflect\"\nimport \"pkl:semver\"\n\n/// The details for the package represented by this project.\n///\n/// This section is used if publishing this project as a package.\npackage: Package?\n\n/// The tests of the project.\n///\n/// If set, allows running `pkl test` without specifying the paths to source modules.\n///\n/// Relative paths are resolved against PklProject's enclosing directory.\n///\n/// Glob imports can be useful for defining this property.\n///\n/// Example:\n///\n/// ```\n/// tests = import*(\"**.test.pkl\").keys.toListing()\n/// ```\ntests: Listing<String>(isDistinct)\n\n/// Tells if the project is a local module named `PklProject`, is not self, and has a [package] section\nlocal isValidLoadDependency = (it: Project) ->\n  isUriLocal(projectFileUri, it.projectFileUri)\n    && it.projectFileUri.endsWith(\"/PklProject\")\n    && it != module\n    && it.package != null\n\nlocal const function isUriLocal(uri1: Uri, uri2: Uri): Boolean =\n  // This is an imperfect check; should also check that the URIs have the same authority.\n  // We should improve this if/when there is a URI library in the stdlib.\n  uri1.substring(0, uri1.indexOf(\":\")) == uri2.substring(0, uri2.indexOf(\":\"))\n\n/// The dependencies of this project.\n///\n/// A dependency is a group of Pkl modules and file resources that can be imported within the\n/// project.\n/// Within the project, a dependency can be referenced via _dependency notation_, where the name\n/// is prefixed with the `@` character.\n///\n/// For example, given the following descriptor:\n///\n/// ```\n/// dependencies {\n///   [\"birds\"] {\n///     uri = \"package://example.com/birds@1.0.0\"\n///   }\n/// }\n/// ```\n///\n/// This enables the following snippet:\n///\n/// ```\n/// import \"@birds/canary.pkl\" // Import a module from the `birds` dependency\n///\n/// birdIndex = read(\"@birds/index.txt\") // Read a file from the `birds` dependency\n/// ```\n///\n/// A dependency's coordinates can either be specified in the form of a [RemoteDependency]\n/// descriptor, which gets fetched over the network, or an import of another PklProject file, which\n/// represents a package that exists locally.\n///\n/// Remote dependencies are fetched over HTTPS.\n/// When fetching a remote dependency, two HTTPS requests are made.\n/// Given dependency URI `package://example.com/foo@0.5.0`, the following requests are made:\n///\n///   1. `GET https://example.com/foo@0.5.0` to retrieve the metadata JSON file.\n///   2. Given the metadata JSON file, make a GET request to the package URI ZIP archive.\n///\n/// If this project is published as a package, these dependencies are included within the published\n/// package metadata.\n///\n/// ## Local project dependencies\n///\n/// A local project can alternatively be used as a dependency.\n/// This is useful when structuring a single repository that publishes multiple packages.\n///\n/// To specify a local project dependency, import the relative `PklProject` file.\n///\n/// The local project dependency must define its own [package].\n///\n/// Example:\n/// ```\n/// dependencies {\n///   [\"penguins\"] = import(\"../penguins/PklProject\")\n/// }\n/// ```\n///\n/// ## Resolving dependencies\n///\n/// Dependencies must be _resolved_ before they can be used.\n/// To resolve dependencies, run the CLI command `pkl project resolve`.\n/// This will generate a `PklProject.deps.json` file next to the `PklProject` file.\n///\n/// ### Minimum version selection\n///\n/// Pkl uses the\n/// [minimum version selection algorithm 1](https://research.swtch.com/vgo-mvs#algorithm_1)\n/// to resolve dependencies.\n/// A dependency is identified by its package URI, as well as its major semver number.\n///\n/// To determine the resolved dependencies of a project, the following algorithm is applied:\n///   1. Gather all dependencies, both direct and transitive.\n///   2. For each package's major version, determine the highest declared minor version.\n///   3. Write each resolved dependency to sibling file `PklProject.deps.json`.\ndependencies: Mapping<String(!contains(\"/\")), *RemoteDependency | Project(isValidLoadDependency)>\n\nlocal isFileBasedProject = projectFileUri.startsWith(\"file:\")\n\n/// If set, controls the base evaluator settings when running the evaluator.\n///\n/// These settings influence the behavior of the evaluator when running the `pkl eval`, `pkl test`,\n/// and `pkl repl` CLI commands.\n/// Command line flags passed to the CLI will override any settings defined here.\n///\n/// Other integrations can possibly ignore these evaluator settings.\n///\n/// Evaluator settings do not get published as part of a package.\n/// It is not possible for a package dependency to influence the evaluator settings of a project.\n///\n/// The following values can only be set if this is a file-based project.\n///\n///  - [modulePath][EvaluatorSettings.modulePath]\n///  - [rootDir][EvaluatorSettings.rootDir]\n///  - [moduleCacheDir][EvaluatorSettings.moduleCacheDir]\n///\n/// For each of these, relative paths are resolved against the project's enclosing directory.\nevaluatorSettings: EvaluatorSettingsModule(\n  (modulePath != null).implies(isFileBasedProject),\n  (rootDir != null).implies(isFileBasedProject),\n  (moduleCacheDir != null).implies(isFileBasedProject),\n)\n\n/// The URI of the PklProject file.\n///\n/// This value is used to resolve relative paths when importing another local project as a\n/// dependency.\nprojectFileUri: String = reflect.Module(module).uri\n\n/// Instantiates a project definition within the enclosing module.\n///\n/// This is a convenience method for setting [projectFileUri] to the enclosing module's URI.\n///\n/// Example:\n/// ```\n/// myProject: Project = (Project.newInstance(module)) {\n///   dependencies { /* etc */ }\n/// }\n/// ```\nfunction newInstance(enclosingModule: Module): Project = new {\n  projectFileUri = reflect.Module(enclosingModule).uri\n}\n\nlocal const hasVersion = (it: Uri) ->\n  let (versionSep = it.lastIndexOf(\"@\"))\n    if (versionSep == -1)\n      false\n    else\n      let (version = it.drop(versionSep + 1)) semver.parseOrNull(version) != null\n\ntypealias PackageUri = Uri(startsWith(\"package:\"), hasVersion)\n\nclass RemoteDependency {\n  /// The URI that this dependency is published to.\n  uri: PackageUri\n\n  /// The checksums of this package.\n  ///\n  /// If omitted, this is taken from the derived package coordinates.\n  checksums: Checksums?\n}\n\nclass Checksums {\n  /// The [SHA-256](https://en.wikipedia.org/wiki/SHA-2) checksum value of the dependency, in hexadecimal representation.\n  sha256: String\n}\n\n/// An email address, conformant to the\n/// [RFC5322 mailbox](https://www.rfc-editor.org/rfc/rfc5322#section-3.4) specification.\n///\n/// Can be in the form of an address spec, or a named address.\n///\n/// Examples:\n///   * `\"johnny.appleseed@example.com\"`\n///   * `\"Johnny Appleseed <johnny.appleseed@example.com>\"`\ntypealias EmailAddress = String(matches(Regex(#\".+@\\S+|.+<\\S+@\\S+>\"#)))\n\nclass Package {\n  /// The name of this package.\n  ///\n  /// The package name is only used for display purposes.\n  ///\n  /// Example:\n  /// ```\n  /// name = \"myproject\"\n  /// ```\n  name: String\n\n  /// The URI that the package is published to, without the version part.\n  ///\n  /// This, along with the version, determines the import path for modules and resources published\n  /// by this package.\n  ///\n  /// Example:\n  /// ```\n  /// baseUri = \"package://example.com/myproject\"\n  /// ```\n  baseUri: Uri(startsWith(\"package:\"))\n\n  /// The version of this package.\n  ///\n  /// Must adhere to semantic versioning.\n  ///\n  /// Example:\n  /// ```\n  /// version = \"1.5.0\"\n  /// ```\n  version: String(semver.isValid(this))\n\n  /// The HTTPS location for the zip archive for this package.\n  ///\n  /// Example:\n  /// ```\n  /// packageZipUrl = \"https://example.com/artifacts/myproject/\\(version).zip\"\n  /// ```\n  packageZipUrl: Uri(startsWith(\"https:\"))\n\n  /// The description of this package.\n  description: String?\n\n  /// The maintainers' emails for this package.\n  ///\n  /// Email addresses must adhere to\n  /// [RFC5322 mailbox](https://www.rfc-editor.org/rfc/rfc5322#section-3.4) specification.\n  ///\n  /// Example:\n  /// ```\n  /// email { \"Johnny Appleseed <johnny.appleseed@example.com>\" }\n  /// ```\n  authors: Listing<EmailAddress>\n\n  /// The website for this package.\n  ///\n  /// Example:\n  /// ```\n  /// website = \"https://example.com/myproject\"\n  /// ```\n  website: String?\n\n  /// The web URL of the Pkldoc documentation for this package.\n  documentation: Uri(!endsWith(\"/\"))?\n\n  /// The source code repository for this package.\n  ///\n  /// Example:\n  /// ```\n  /// sourceCode = \"https://github.com/myorg/myproject\"\n  /// ```\n  sourceCode: String?\n\n  /// The source code scheme for this package.\n  ///\n  /// This is used to transform stack frames for errors arising for this package.\n  ///\n  /// The following placeholders are available:\n  ///\n  /// - `%{path}`\n  ///   absolute file path of the file to open\n  /// - `%{line}`\n  ///   start line number to navigate to\n  /// - `%{endLine}`\n  ///   end line number to navigate to\n  /// - `%{column}`\n  ///   column number to navigate to\n  /// - `%{endColumn}`\n  ///   end column number to navigate to\n  ///\n  /// For example, if publishing to GitHub, assuming that the version gets published as a tag:\n  ///\n  /// ```\n  /// sourceCodeUrlScheme = \"\\(sourceCode)/blob/\\(version)%{path}#L%{line}-L%{endLine}\"\n  /// ```\n  sourceCodeUrlScheme: String?\n\n  /// The license associated with this package.\n  ///\n  /// If using a common license, use its [SPDX license identifier](https://spdx.org/licenses/).\n  ///\n  /// If using multiple common licenses, use a\n  /// [SPDX license expression syntax version 2.0 string](https://spdx.github.io/spdx-spec/v2.3/SPDX-license-expressions/).\n  /// For example: `\"Apache-2.0 or MIT\"`.\n  ///\n  /// If using an uncommon license, also provide its full text in the [licenseText] property.\n  ///\n  /// Example:\n  /// ```\n  /// license = \"Apache-2.0\"\n  /// ```\n  license: (CommonSpdxLicenseIdentifier | String)?\n\n  /// The full text of the license associated with this package.\n  licenseText: String?\n\n  /// The web URL of the issue tracker for this package.\n  issueTracker: String?\n\n  /// Paths to the tests that define the API of the package.\n  ///\n  /// These tests are run as part of the `pkl project package` command.\n  ///\n  /// Relative paths are resolved against PklProject's enclosing directory.\n  ///\n  /// Glob imports can be useful for defining this property.\n  ///\n  /// Example:\n  ///\n  /// ```\n  /// tests = import*(\"**.test.pkl\").keys.toListing()\n  /// ```\n  apiTests: Listing<String>(isDistinct)\n\n  /// Glob patterns describing the set of files to exclude from packaging.\n  ///\n  /// By default, the project manifest files are excluded, and any paths that start with a dot.\n  ///\n  /// Glob patterns follows the same glob rules as glob imports and reads.\n  exclude: Listing<String> = new {\n    \"PklProject\"\n    \"PklProject.deps.json\"\n    \".**\"\n  }\n\n  /// The effective package URI for the package represented by this project.\n  fixed uri: PackageUri = \"\\(baseUri)@\\(version)\"\n}\n\n@Deprecated { since = \"0.26.0\"; replaceWith = \"EvaluatorSettingsModule\" }\ntypealias EvaluatorSettings = EvaluatorSettingsModule\n\n/// Common software licenses in the [SPDX License List](https://spdx.org/licenses/).\ntypealias CommonSpdxLicenseIdentifier =\n  \"Apache-2.0\"\n    | \"MIT\"\n    | \"BSD-2-Clause\"\n    | \"BSD-3-Clause\"\n    | \"ISC\"\n    | \"GPL-3.0\"\n    | \"GPL-2.0\"\n    | \"MPL-2.0\"\n    | \"MPL-1.1\"\n    | \"MPL-1.0\"\n    | \"AGPL-1.0-only\"\n    | \"AGPL-1.0-or-later\"\n    | \"AGPL-3.0-only\"\n    | \"AGPL-3.0-or-later\"\n    | \"LGPL-2.0-only\"\n    | \"LGPL-2.0-or-later\"\n    | \"LGPL-2.1-only\"\n    | \"LGPL-2.1-or-later\"\n    | \"LGPL-3.0-only\"\n    | \"LGPL-3.0-or-later\"\n    | \"EPL-1.0\"\n    | \"EPL-2.0\"\n    | \"UPL-1.0\"\n    | \"BSL-1.0\"\n    | \"Unlicense\"\n\n@Unlisted\n@Since { version = \"0.27.0\" }\nfixed annotations: List<Annotation> = reflect.moduleOf(this).annotations\n"
  },
  {
    "path": "stdlib/analyze.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A library for statically analyzing Pkl modules.\n///\n/// These tools differentiate from [pkl:reflect][reflect] in that they parse Pkl modules, but do not\n/// execute any code within these modules.\n@Since { version = \"0.27.0\" }\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.analyze\n\n// used by doc comments\nimport \"pkl:reflect\"\n\n/// Given a set of Pkl module URIs, returns a graph of imports declared by these modules.\n///\n/// The resulting graph includes transitive imports.\nexternal function importGraph(moduleUris: Set<Uri>): ImportGraph\n\n/// The graph of imports declared (directly and transitively) by the modules passed to\n/// [importGraph()].\nclass ImportGraph {\n  /// The imports declared within a Pkl program.\n  ///\n  /// Each entry maps a module URI to the set of imports declared in that module.\n  ///\n  /// The set of all modules in the graph can be obtained via its [keys][Map.keys].\n  imports: Map<Uri, Set<Import>>\n\n  /// Mappings of modules from their in-language URI, to their resolved URI.\n  ///\n  /// A module's in-language URI is the form used within Pkl source code.\n  /// For example, modulepath-based modules have form `modulepath:/path/to/my/module.pkl`.\n  ///\n  /// A module's resolved URI is the form used to load the module's contents.\n  /// The same modulepath module might have form\n  /// `jar:file:///path/to/file.zip!/path/to/my/module.pkl` if Pkl run with\n  /// `--module-path /path/to/file.zip`.\n  ///\n  /// Dependency-notation imports, such as `\"@myPackage/myModule.pkl\"`, are represented as\n  /// in-language URIs with scheme `projectpackage:`.\n  /// In the case of local project dependencies, they will be local URIs resolved from the project\n  /// file URI (in normal cases, `file:` URIs).\n  resolvedImports: Map<Uri, Uri>(keys == imports.keys)\n}\n\n/// An import as declared inside a module.\nclass Import {\n  /// The absolute (in-language) URI of the import.\n  ///\n  /// Dependency notation URIs (such as `import \"@foo/bar\"`) are resolved to package URIs with\n  /// scheme `projectpackage:`.\n  uri: Uri\n}\n"
  },
  {
    "path": "stdlib/base.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Fundamental properties, methods, and classes for writing Pkl programs.\n///\n/// Members of this module are automatically available in every Pkl module.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.base\n\n// json, math, and yaml imports used for doc comments\nimport \"pkl:json\"\nimport \"pkl:jsonnet\"\nimport \"pkl:math\"\nimport \"pkl:pklbinary\"\nimport \"pkl:protobuf\"\nimport \"pkl:xml\"\nimport \"pkl:yaml\"\n\n/// The top type of the type hierarchy.\n///\n/// Every type is a subtype of [Any].\n///\n/// The following operators are supported for all values:\n///\n/// ```\n/// value1 == value2 // equality\n/// value1 != value2 // inequality\n/// value.member     // member access\n/// value?.member    // conditional member access; returns `value.member` if `value` is non-null and `null` otherwise\n/// value ?? default // null coalescing; returns `value` if `value` is non-null and `default` otherwise\n/// value!!          // non-null assertion; throws if `value` is `null`, and returns `value` otherwise\n/// value is String  // type test\n/// value as String  // type cast; throws an error unless `value is String`\n/// ```\nabstract external class Any {\n  /// Returns the class of [this].\n  external function getClass(): Class\n\n  /// Returns a string representation of [this].\n  ///\n  /// This method is used to convert the values of string interpolation expressions to strings.\n  external function toString(): String\n\n  /// Returns `this |> transform` if [this] is non-null, and [null] otherwise.\n  ///\n  /// This method is the complement of the `??` operator and the equivalent of an `Option` type's\n  /// `map` and `flatMap` methods.\n  external function ifNonNull<Result>(transform: (NonNull) -> Result): Result?\n}\n\n/// The type of [null] and null values created with [Null()].\n///\n/// All null values are pairwise equal according to `==`.\nexternal class Null extends Any\n\n/// A non-null value.\ntypealias NonNull = Any(!(this is Null))\n\n/// The runtime representation of a class.\nexternal class Class<out Type> extends Any {\n  /// The unqualified name of this class.\n  external simpleName: String\n}\n\n/// The runtime representation of a type alias.\nexternal class TypeAlias extends Any\n\n/// Base class for modules.\nabstract external class Module {\n  /// Returns the relative, descendent directory path between this module and [other].\n  ///\n  /// Throws if no such path exists.\n  ///\n  /// For example, if module `mod1` has path `/dir1/mod1.pkl`, and module `mod2` has path\n  /// `/dir1/dir2/dir3/mod2.pkl`, then `mod1.relativePathTo(mod2)` will return\n  /// `List(\"dir2\", \"dir3\")`.\n  ///\n  /// A common use case is to compute the directory path between a template located at the root of a\n  /// hierarchy (say `rootModule.pkl`) and the currently evaluated module (accessible via the\n  /// `module` keyword):\n  /// ```\n  /// import \"rootModule.pkl\" // self-import\n  /// path = rootModule.relativePathTo(module)\n  /// ```\n  external function relativePathTo(other: Module): List<String>\n\n  /// The output of this module.\n  ///\n  /// Defaults to all module properties rendered as either Pcf or the format specified on the\n  /// command line.\n  hidden output: ModuleOutput = new {\n    value = outer\n    renderer =\n      let (format = read?(\"prop:pkl.outputFormat\") ?? \"pcf\")\n        if (format == \"json\")\n          new JsonRenderer {}\n        else if (format == \"jsonnet\")\n          new jsonnet.Renderer {}\n        else if (format == \"pcf\")\n          new PcfRenderer {}\n        else if (format == \"plist\")\n          new PListRenderer {}\n        else if (format == \"properties\")\n          new PropertiesRenderer {}\n        else if (format == \"textproto\")\n          new protobuf.Renderer {}\n        else if (format == \"xml\")\n          new xml.Renderer {}\n        else if (format == \"yaml\")\n          new YamlRenderer {}\n        else if (format == \"pkl-binary\")\n          new pklbinary.Renderer {}\n        else\n          throw(\n            \"Unknown output format: `\\(format)`. Supported formats are `json`, `jsonnet`, `pcf`, `plist`, `properties`, `textproto`, `xml`, `yaml`, `pkl-binary`.\"\n          )\n    text =\n      if (renderer is ValueRenderer)\n        renderer.renderDocument(value)\n      else\n        throw(\"Unable to render text when renderer is a BytesRenderer\")\n    bytes =\n      if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n  }\n}\n\n/// Base class for annotation types.\nabstract class Annotation\n\n/// Indicates that the annotated member was introduced in [version].\nclass Since extends Annotation {\n  /// The version that the annotated member was introduced in.\n  version: String\n}\n\n/// Indicates that the annotated member is deprecated and will likely be removed in the future.\nclass Deprecated extends Annotation {\n  /// The version in which the annotated member became deprecated.\n  since: String?\n\n  /// A message explaining how to deal with the deprecation.\n  ///\n  /// The message may contain member links, should end with a period, and should not contain line\n  /// breaks.\n  ///\n  /// Example: `\"Use [String.codePoints] instead.\"`\n  message: String?\n\n  /// The code fragment to replace usages of the deprecated member with.\n  ///\n  /// Setting this property instructs tools to automatically replace usages of the deprecated\n  /// member.\n  /// For human instructions, use [message].\n  ///\n  /// Examples:\n  /// ```\n  /// // replace usages of a deprecated class or type alias with `Inventory`\n  /// replaceWith = \"Inventory\"\n  /// // replace usages of a deprecated property or method with `inventory`\n  /// replaceWith = \"inventory\"\n  /// // replace usages of a deprecated property or method with `store.inventory`\n  /// // and an import of `store`, which must resolve to an import of the current module\n  /// replaceWith = \"store.inventory\"\n  /// // replace usages of a deprecated property or method with `order(42)`\n  /// replaceWith = \"order(42)\"\n  /// // replace usages of a deprecated method (that has a parameter named `amount`) with `order(amount)`\n  /// replaceWith = \"order(amount)\"\n  /// ```\n  @SourceCode { language = \"PklExpr\" }\n  replaceWith: String?\n}\n\n/// Lists alternative names that the annotated member is known under.\n///\n/// The alternative names will be included in Pkldoc's search index.\nclass AlsoKnownAs extends Annotation {\n  /// The alternative names for the annotated member.\n  names: Listing<String>\n}\n\n/// Indicates that the annotated member should not be advertised by Pkldoc and other tools.\nclass Unlisted extends Annotation\n\n/// Indicates to Pkldoc that the annotated module is an example for how to use [subjects].\nclass DocExample extends Annotation {\n  /// The fully qualified names of the modules that are the subjects of the example.\n  subjects: Listing<String>\n}\n\n/// Indicates that the annotated property's string value contains source code written in [language].\nclass SourceCode extends Annotation {\n  /// The language that the source code is written in.\n  ///\n  /// Examples:\n  /// - `\"x = 42\"` is valid source code for language `\"Pkl\"`.\n  /// - `\"42\"` is valid source code for language `\"PklExpr\"`.\n  /// - `\"42\"` is valid source code for language `\"Pkl\"` with [prefix] `\"x = \"`.\n  language: \"Go\"\n    | \"HTML\"\n    | \"Java\"\n    | \"JavaScript\"\n    | \"Markdown\"\n    | \"Pkl\"\n    | \"PklExpr\"\n    | \"Python\"\n    | \"Ruby\"\n    | \"SQL\"\n    | \"Swift\"\n    | String\n\n  /// A source code prefix to help tools understand the source code.\n  ///\n  /// For example, an expression may not be considered valid unless wrapped in a statement.\n  prefix: String?\n\n  /// A source code suffix to help tools understand the source code.\n  ///\n  /// For example, an expression may not be considered valid unless wrapped in a statement.\n  suffix: String?\n}\n\n/// Metadata for a module.\n///\n/// To annotate a module, place the annotation\n/// before the `module`, `amends`, or `extends` keyword, whichever comes first.\n///\n/// ```\n/// @ModuleInfo { minPklVersion = \"1.2.3\"; author = \"author@apple.com\" }\n/// module myModule\n/// ```\n///\n/// All library modules should have a [ModuleInfo] annotation.\nclass ModuleInfo extends Annotation {\n  /// The minimum Pkl version required by this module.\n  ///\n  /// The expected format is `\"major.minor.patch\"`.\n  ///\n  /// This version constraint is enforced by the Pkl runtime.\n  minPklVersion: String(matches(Regex(#\"\\d{1,2}\\.\\d{1,2}\\.\\d{1,2}\"#)))\n}\n\n/// A representation of a rendered output.\nopen class FileOutput {\n  /// The value to render.\n  value: Any?\n\n  /// The renderer for [value].\n  renderer: BaseValueRenderer = new PcfRenderer {}\n\n  /// The textual rendered output.\n  text: String =\n    if (renderer is ValueRenderer)\n      renderer.renderDocument(value)\n    else\n      throw(\"unabled to render text when renderer is a BytesRenderer\")\n\n  /// The underlying byte output.\n  ///\n  /// If unset, defaults to the UTF-8 encoding of [text].\n  @Since { version = \"0.29.0\" }\n  bytes: Bytes =\n    if (renderer is BytesRenderer) renderer.renderDocument(value) else text.encodeToBytes(\"UTF-8\")\n}\n\n/// The contents and appearance of a module's output.\nclass ModuleOutput extends FileOutput {\n  /// The files to be produced by this module when rendering in multiple file output mode.\n  ///\n  /// Keys determine file paths, and may include subdirectories.\n  /// [FileOutput.text] determines file contents.\n  ///\n  /// Example:\n  /// ```\n  /// output {\n  ///   files {\n  ///     [\"foo/bar.yml\"] {\n  ///       value = new { bar = \"bar\" }\n  ///       renderer = new YamlRenderer {}\n  ///     }\n  ///   }\n  /// }\n  /// ```\n  ///\n  /// A file can be set to the `output` of another module.\n  /// For example:\n  /// ```\n  /// output {\n  ///   files {\n  ///     [\"foo.yml\"] = import(\"foo.pkl\").output\n  ///   }\n  /// }\n  /// ```\n  files: Mapping<String, FileOutput>?\n}\n\n/// Base class for rendering Pkl values in some output format.\n@Since { version = \"0.30.0\" }\nabstract class BaseValueRenderer {\n  /// Value converters to apply before values are rendered.\n  ///\n  /// A value converter is a function that converts a value to another value\n  /// immediately before the value is rendered (and after the value has been type-checked).\n  /// The converted value is then rendered by the renderer's hardwired rendering logic.\n  ///\n  /// When a converter returns a value of type [Object], [Collection], [Map], or [Pair],\n  /// converters are recursively applied to the returned value's components (object properties,\n  /// list elements, etc.).\n  ///\n  /// At most one converter is applied per value.\n  /// If multiple converters are applicable, a winner is chosen as follows:\n  /// - A converter with [String] key wins over a converter with [Class] key.\n  /// - Between multiple [String] key converters, the converter defined earlier\n  ///   (according to the mapping's definition order) wins.\n  /// - Between multiple [Class] key converters, the most specific class (according to class\n  ///   hierarchy) wins.\n  ///\n  /// A converter's key specifies which values the converter should be applied to.\n  /// A converter with [Class] key is applied to values of that class, including values of its\n  /// subclasses.\n  /// A converter with [String] key is applied to values whose path matches the *path spec*\n  /// described by the string.\n  ///\n  /// Path specs can have the following components:\n  /// - `^` matches the top-level value passed to `renderDocument()` or `renderValue()` (often the\n  ///    module object)\n  /// - `pigeon` matches property `pigeon` at any hierarchy level\n  /// - `[pigeon]` matches map(ping) entry with String key `\"pigeon\"` at any hierarchy level\n  /// - `*` matches any property\n  /// - `[*]` matches any list(ing) element or map(ping) entry\n  ///\n  /// Here are some examples of valid property paths:\n  /// - `\"server\"`\n  /// - `\"server.timeout\"`\n  /// - `\"^server.timeout\"` (matches `server.timeout`, but not `racks[12345].server.timeout`)\n  /// - `\"racks[12345].server\"`\n  /// - `\"racks[*].server`\n  ///\n  /// Paths are matched against path specs component-wise in reverse order.\n  /// For example, paths `server.timeout` and `racks[*].server.timeout`\n  /// both match path spec `server.timeout`, whereas path `server.timeout.millis` does not.\n  converters: Mapping<Class | String, (unknown) -> Any>\n\n  /// Customizations for [ConvertProperty] annotation behaviors.\n  ///\n  /// This property is consulted to transform [ConvertProperty] annotation values.\n  /// This can be used to customize or override the conversion behavior for a specific renderer.\n  /// If multiple entries match the annotation's class, the most specific class (according to class\n  /// hierarchy) wins.\n  ///\n  /// See [ConvertProperty] for detailed information.\n  @Since { version = \"0.31.0\" }\n  convertPropertyTransformers: Mapping<Class, Mixin<ConvertProperty>>\n\n  /// The file extension associated with this output format,\n  /// or [null] if this format does not have an extension.\n  extension: String?\n}\n\n/// Conversion to be applied to properties when rendered through [BaseValueRenderer].\n///\n/// During rendering, the annotation's [render] function is called.\n/// The function must return a [Pair] of the converted property name and value.\n///\n/// Multiple [ConvertProperty] annotations can apply per property, and the output of one\n/// annotation's [render] function is used as input to the next.\n/// Annotations are applied the order as declared on the property.\n/// If the annotated property is overriding a parent property, the parent property's annotations are\n/// applied first.\n///\n/// These conversions can coexist with [BaseValueRenderer.converters], and applies first.\n///\n/// These conversions only affect rendering of class properties.\n/// Applying this to other types of members does not impact rendering.\n///\n/// These conversions can be overriden with [BaseValueRenderer.convertPropertyTransformers].\n///\n/// Example:\n///\n/// ```\n/// // convert duration to the number of seconds\n/// @ConvertProperty {\n///   render = (property, _) -> Pair(property.key, property.value.toUnit(\"s\"))\n/// }\n/// timeout: Duration\n/// ```\n///\n/// [ConvertProperty] can be subclassed to define re-usable property converters.\n/// The conversion defined in the previous example can be rewritten as:\n///\n/// ```\n/// class ConvertDuration extends ConvertProperty {\n///   unit: DurationUnit\n///\n///   render = (property: Pair<String, Duration>, _) -> Pair(property.key, property.value.toUnit(unit))\n/// }\n///\n/// @ConvertDuration { unit = \"s\" }\n/// timeout: Duration\n/// ```\n@Since { version = \"0.31.0\" }\nopen class ConvertProperty extends Annotation {\n  /// Function called by [BaseValueRenderer] types during rendering to transform property\n  /// names and values.\n  render: (Pair<String, Any>, BaseValueRenderer) -> Pair<String, Any>\n}\n\n/// Base class for rendering Pkl values in some textual output format.\n///\n/// A renderer's output is guaranteed to be well-formed unless [RenderDirective] is part of the\n/// input.\nabstract class ValueRenderer extends BaseValueRenderer {\n  /// Renders [value] as a complete document.\n  ///\n  /// Some renderers impose restrictions on which types of values can be rendered as document.\n  ///\n  /// A typical implementation of this method renders a document header/footer\n  /// and otherwise delegates to [renderValue()].\n  abstract function renderDocument(value: Any): String\n\n  /// Renders [value].\n  abstract function renderValue(value: Any): String\n}\n\n/// Base class for rendering Pkl values in some binary output format.\n///\n/// A renderer's output is guaranteed to be well-formed unless [RenderDirective] is part of the\n/// input.\n@Since { version = \"0.30.0\" }\nabstract class BytesRenderer extends BaseValueRenderer {\n  /// Renders [value] as a complete document.\n  ///\n  /// Some renderers impose restrictions on which types of values can be rendered as document.\n  ///\n  /// A typical implementation of this method renders a document header/footer\n  /// and otherwise delegates to [renderValue()].\n  abstract function renderDocument(value: Any): Bytes\n\n  /// Renders [value].\n  abstract function renderValue(value: Any): Bytes\n}\n\n/// Renders values as Pcf, a static subset of Pkl.\nclass PcfRenderer extends ValueRenderer {\n  extension = \"pcf\"\n\n  /// The characters to use for indenting output.\n  /// Defaults to two spaces.\n  indent: String = \"  \"\n\n  /// Whether to skip rendering properties whose value is [null].\n  omitNullProperties: Boolean = false\n\n  /// Whether to use custom string delimiters for string values.\n  ///\n  /// If [true], custom string delimiters (such as `#\"...\"#`) are preferred\n  /// over escaping quotes and backslashes.\n  useCustomStringDelimiters: Boolean = false\n\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n}\n\n/// Directs a [ValueRenderer] to output [text] as-is in place of this directive.\n///\n/// [RenderDirective] is an escape hatch for exceptional cases.\n/// It gives full control over how a value is rendered\n/// without having to manipulate `output.text` as a whole.\n/// It is the user's responsibility to ensure that the resulting output is well-formed.\n///\n/// Example:\n/// ```\n/// name = \"Pigeon\"\n/// hobby = \"singing\"\n///\n/// output {\n///   renderer = new JsonRenderer {\n///     converters {\n///       // render String values without quotes (not valid JSON)\n///       [String] = (str) -> new RenderDirective { text = str }\n///     }\n///   }\n/// }\n/// ```\n///\n/// Output:\n/// ```\n/// {\n///   \"name\": Pigeon\n///   \"hobby\": singing\n/// }\n/// ```\nclass RenderDirective {\n  /// The text to output as-is (without escaping or quoting).\n  text: String\n\n  /// The bytes to output as-is (without escaping or quoting).\n  ///\n  /// Only used by [BytesRenderer], ignored by [ValueRenderer].\n  @Since { version = \"0.30.0\" }\n  bytes: Bytes = text.encodeToBytes(\"UTF-8\")\n}\n\n/// Directs [PcfRenderer] to output additional text [before] and/or [after] rendering a [value].\nclass PcfRenderDirective {\n  /// The text to output before rendering [value].\n  before: String?\n\n  /// The value to render.\n  value: Any\n\n  /// The text to output after rendering [value].\n  after: String?\n}\n\n/// Renders values as JSON.\n///\n/// The [json.Property] annotation can be used to change how a property name renders into JSON.\n///\n/// Example:\n/// ```\n/// import \"pkl:json\"\n///\n/// @json.Property { name = \"wing_span\" }\n/// wingSpan: Int\n/// ```\nclass JsonRenderer extends ValueRenderer {\n  extension = \"json\"\n\n  /// The characters to use for indenting output.\n  indent: String = \"  \"\n\n  /// Whether to omit JSON object fields whose value is `null`.\n  omitNullProperties: Boolean = true\n\n  /// Renders [value] as a JSON document.\n  ///\n  /// Every JSON value is a valid JSON document.\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n}\n\n/// Renders values as YAML.\n///\n/// To render a YAML stream, set [isStream] to [true].\n///\n/// The [yaml.Property] annotation can be used to change how a property name renders into YAML.\n///\n/// Example:\n/// ```\n/// import \"pkl:yaml\"\n///\n/// @yaml.Property { name = \"wing_span\" }\n/// wingSpan: Int\n/// ```\nclass YamlRenderer extends ValueRenderer {\n  extension = \"yaml\"\n\n  /// The YAML version used by consumers of the rendered documents.\n  ///\n  /// - `\"compat\"` - YAML 1.1 _or_ 1.2 (default)\n  /// - `\"1.1\"` - YAML 1.1\n  /// - `\"1.2\"` - YAML 1.2 (Core schema)\n  ///\n  /// At present, the mode only affects which String values are quoted in YAML.\n  /// For example, `x = \"yes\"` is rendered as `x: 'yes'` in modes `\"compat\"` and `\"1.1\"`,\n  /// and as `x: yes` in mode `\"1.2\"`.\n  mode: \"compat\" | \"1.1\" | \"1.2\" = \"compat\"\n\n  /// The number of spaces to use for indenting output.\n  indentWidth: Int(this > 1) = 2\n\n  /// Whether to skip rendering properties whose value is [null].\n  omitNullProperties: Boolean = true\n\n  /// If [true], [renderDocument] expects an argument of type [Listing] or [Collection]\n  /// and renders it as YAML stream.\n  isStream: Boolean = false\n\n  /// Renders [value] as a YAML document.\n  ///\n  /// Every YAML value is a valid YAML document.\n  external function renderDocument(value: Any): String\n\n  /// Renders [value] as YAML value.\n  external function renderValue(value: Any): String\n}\n\n/// Renders values as\n/// [XML property lists](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/UnderstandXMLPlist/UnderstandXMLPlist.html).\n///\n/// XML property lists do not support [null] values.\n/// This renderer handles [null] values as follows:\n/// - Object and map properties whose value is [null] are skipped.\n/// - [null] values occurring in a list or set result in an error.\nclass PListRenderer extends ValueRenderer {\n  extension = \"plist\"\n\n  /// The characters to use for indenting output.\n  indent: String = \"  \"\n\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n}\n\n/// Renders values as\n/// [Java Properties](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html).\n///\n/// Pkl object properties and keys of type [Boolean], [String], [Int], and [Float]\n/// are flattened into dot-separated Java property keys.\n///\n/// Pkl values of type [Boolean], [String], [Int], and [Float] are rendered as Java property values.\n///\n/// To render Pkl values of other types, convert them to one of the above types with [converters].\n///\n/// Example:\n/// ```\n/// person {\n///   name = \"Pigeon\"\n///   age = 42\n///   hobbies = List(\"surfing\", \"fire making\")\n/// }\n///\n/// output {\n///   renderer = new PropertiesRenderer {\n///     converters {\n///       // render lists as comma-separated values\n///       [List] = (it) -> it.join(\",\")\n///     }\n///   }\n/// }\n/// ```\n///\n/// The above example produces the following output:\n/// ```\n/// person.name = Pigeon\n/// person.age = 42\n/// person.hobbies = surfing,fire making\n/// ```\nclass PropertiesRenderer extends ValueRenderer {\n  extension = \"properties\"\n\n  /// Whether to skip rendering properties whose value is [null].\n  omitNullProperties: Boolean = true\n\n  /// Whether to render characters outside the printable US-ASCII charset range as\n  /// [Unicode escapes](https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.3).\n  restrictCharset: Boolean = false\n\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n}\n\n/// An external (file, HTTP, etc.) resource.\n///\n/// Usually, a [Resource] is obtained via a `read()` expression, such as `read(\"some/file\")`.\n///\n/// When created directly, either of [bytes] or [base64] can be set, and the other will be\n/// computed in terms of the set value.\nclass Resource {\n  /// The URI of this resource.\n  uri: Uri\n\n  /// The text content of this resource.\n  text: String\n\n  /// The content of this resource in Base64 encoding.\n  base64: String = bytes.base64\n\n  /// The bytes of this resource.\n  @Since { version = \"0.29.0\" }\n  hidden bytes: Bytes = base64.base64DecodedBytes\n\n  /// The [MD5](https://en.wikipedia.org/wiki/MD5)\n  /// hash of this resource as hexadecimal string.\n  ///\n  /// MD5 is cryptographically broken and should not be used for secure applications.\n  @Deprecated { since = \"0.29.0\"; message = \"Use bytes.md5 instead\" }\n  hidden fixed md5: String = bytes.md5\n\n  /// The [SHA-1](https://en.wikipedia.org/wiki/SHA-1)\n  /// hash of this resource as hexadecimal string.\n  ///\n  /// SHA-1 is cryptographically broken and should not be used for secure applications.\n  @Deprecated { since = \"0.29.0\"; message = \"Use bytes.sha1 instead\" }\n  hidden fixed sha1: String = bytes.sha1\n\n  /// The [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n  /// cryptographic hash of this resource as hexadecimal string.\n  @Deprecated { since = \"0.29.0\"; message = \"Use bytes.sha256 instead\" }\n  hidden fixed sha256: String = bytes.sha256\n\n  /// The first 64 bits of the [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n  /// cryptographic hash of this resource.\n  @Deprecated { since = \"0.29.0\"; message = \"Use bytes.sha256Int instead\" }\n  hidden fixed sha256Int: Int = bytes.sha256Int\n}\n\n/// Common base class of [Int] and [Float].\n///\n/// ## Arithmetic Operators\n/// ```\n/// -a     // negation\n/// a + b  // addition\n/// a - b  // subtraction\n/// a * b  // multiplication\n/// a / b  // division\n/// a ~/ b // integer division\n/// a % b  // remainder\n/// a ** b // exponentiation\n/// ```\n///\n/// ## Comparison Operators\n/// ```\n/// a == b // equality\n/// a != b // inequality\n/// a < b  // less than\n/// a > b  // greater than\n/// a <= b // less than or equal\n/// a >= b // greater than or equal\n/// ```\n///\n/// ## Number vs. Float\n/// To allow transparent use of [Float] and [Int],\n/// use [Number] instead of [Float] in type annotations.\nabstract external class Number extends Any {\n  /// A [Duration] with value [this] and unit `\"ns\"` (nanoseconds).\n  abstract ns: Duration\n\n  /// A [Duration] with value [this] and unit `\"us\"` (microseconds).\n  abstract us: Duration\n\n  /// A [Duration] with value [this] and unit `\"ms\"` (milliseconds).\n  abstract ms: Duration\n\n  /// A [Duration] with value [this] and unit `\"s\"` (seconds).\n  abstract s: Duration\n\n  /// A [Duration] with value [this] and unit `\"min\"` (minutes).\n  abstract min: Duration\n\n  /// A [Duration] with value [this] and unit `\"h\"` (hours).\n  abstract h: Duration\n\n  /// A [Duration] with value [this] and unit `\"d\"` (days).\n  abstract d: Duration\n\n  /// A [DataSize] with value [this] and unit `\"b\"` (bytes).\n  abstract b: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"kb\"` (kilobytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.kb == 1000.b\n  /// ```\n  abstract kb: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"mb\"` (megabytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.mb == 1000.kb\n  /// ```\n  abstract mb: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"gb\"` (gigabytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.gb == 1000.mb\n  /// ```\n  abstract gb: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"tb\"` (terabytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.tb == 1000.gb\n  /// ```\n  abstract tb: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"pb\"` (petabytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.pb == 1000.tb\n  /// ```\n  abstract pb: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"kib\"` (kibibytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.kib == 1024.b\n  /// ```\n  abstract kib: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"mib\"` (mebibytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.mib == 1024.kib\n  /// ```\n  abstract mib: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"gib\"` (gibibytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.gib == 1024.mib\n  /// ```\n  abstract gib: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"tib\"` (tebibytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.tib == 1024.gib\n  /// ```\n  abstract tib: DataSize\n\n  /// A [DataSize] with value [this] and unit `\"pib\"` (pebibytes).\n  ///\n  /// Facts:\n  /// ```\n  /// 1.pib == 1024.tib\n  /// ```\n  abstract pib: DataSize\n\n  /// The sign of this number.\n  ///\n  /// Returns `0` for `0`, `0.0`, `-0.0`, and [NaN],\n  /// `1` for positive numbers (including [Infinity]),\n  /// and `-1` for negative numbers (including `-`[Infinity]).\n  abstract sign: Number\n\n  /// The absolute value of this number.\n  ///\n  /// Facts:\n  /// ```\n  /// 42.abs == 42\n  /// -42.abs == 42\n  /// 0.0.abs == 0.0\n  /// (-0.0).abs == 0.0\n  /// Infinity.abs == Infinity\n  /// (-Infinity).abs == Infinity\n  /// NaN.abs == NaN\n  /// ```\n  abstract abs: Number\n\n  /// Rounds this number to the next mathematical integer towards [Infinity].\n  ///\n  /// If [this] is an [Int], returns [this].\n  /// If [this] is [NaN], [Infinity], -[Infinity], `0.0`, or `-0.0`, returns [this].\n  /// Otherwise, returns the smallest [Float] that is greater than or equal to [this]\n  /// and is equal to a mathematical integer.\n  abstract ceil: Number\n\n  /// Rounds this number to the next mathematical integer towards -[Infinity].\n  ///\n  /// If [this] is an [Int], returns [this].\n  /// If [this] is [NaN], [Infinity], -[Infinity], `0.0`, or `-0.0`, returns [this].\n  /// Otherwise, returns the largest [Float] that is less than or equal to [this]\n  /// and is equal to a mathematical integer.\n  abstract floor: Number\n\n  /// Rounds this number to the nearest mathematical integer, breaking ties in favor\n  /// of the even integer.\n  ///\n  /// If [this] is an [Int], returns [this].\n  /// If [this] is [NaN], [Infinity], -[Infinity], `0.0`, or `-0.0`, returns [this].\n  /// Otherwise, return the [Float] that is nearest to [this] and is equal to a\n  /// mathematical integer. If two mathematical integers are equally near, returns\n  /// the even integer.\n  abstract function round(): Number\n  // https://github.com/julialang/julia/issues/8750#issue-46387044\n\n  /// Rounds this number to the next mathematical integer towards zero.\n  ///\n  /// If [this] is an [Int], returns [this].\n  /// If [this] is [NaN], [Infinity], -[Infinity], `0.0`, or `-0.0`, returns [this].\n  /// If [this] is less than zero, returns the smallest [Float] that is greater than or equal to\n  /// [this] and is equal to a mathematical integer.\n  /// Otherwise, returns the largest [Float] that is less than or equal to [this]\n  /// and is equal to a mathematical integer.\n  abstract function truncate(): Number\n\n  /// Converts this number to an [Int].\n  ///\n  /// If [this] is an [Int], returns [this].\n  /// If [this] is [NaN], [Infinity], or -[Infinity], throws an error.\n  /// Otherwise, returns the [Int] representation for `this.truncate()`.\n  /// If `this.truncate()` is not representable in (that is, too large for) [Int], throws an error.\n  abstract function toInt(): Int\n\n  /// Converts this number to a [Float].\n  ///\n  /// If [this] is a [Float], returns [this].\n  /// Otherwise, returns the [Float] representation for [this].\n  /// If [this] is not representable in [Float], returns the [Float] nearest to [this].\n  abstract function toFloat(): Float\n\n  /// Converts this number to its decimal string representation.\n  abstract function toString(): String\n\n  /// Converts this number to a decimal fixed-point representation with [fractionDigits] digits\n  /// after the decimal point.\n  abstract function toFixed(fractionDigits: Int(this.isBetween(0, 20))): String\n\n  /// Converts this number to a duration with [this] value and the given [unit].\n  abstract function toDuration(unit: DurationUnit): Duration\n\n  /// Converts this number to a data size with [this] value and the given [unit].\n  abstract function toDataSize(unit: DataSizeUnit): DataSize\n\n  /// Tells if this number is greater than or equal to zero.\n  ///\n  /// Facts:\n  /// ```\n  /// 0.isPositive\n  /// (-0).isPositive\n  /// 0.0.isPositive\n  /// (-0.0).isPositive\n  /// 3.isPositive\n  /// 3.14.isPositive\n  /// Infinity.isPositive\n  ///\n  /// !(-3).isPositive\n  /// !(-3.14).isPositive\n  /// !(-Infinity).isPositive\n  /// !NaN.isPositive\n  /// ```\n  abstract isPositive: Boolean\n\n  /// Tells if this number is neither [NaN] nor [isInfinite].\n  abstract isFinite: Boolean\n\n  /// Tells if this number is [Infinity] or -[Infinity].\n  abstract isInfinite: Boolean\n\n  /// Tells if this number is [NaN].\n  ///\n  /// Always use this method when testing for [NaN].\n  /// Note that `x == NaN` is *not* a correct way to test for [NaN] because `NaN != NaN` as per the\n  /// IEEE spec.\n  abstract isNaN: Boolean\n\n  /// Tells if this number is not 0.\n  abstract isNonZero: Boolean\n\n  /// Tells if this number is greater than or equal to [start] and less than or equal to\n  /// [inclusiveEnd].\n  ///\n  /// Facts:\n  /// ```\n  /// 3.2.isBetween(2.6, 4)\n  /// 3.2.isBetween(2.6, 3.2)\n  /// 3.2.isBetween(3.2, 4)\n  /// !3.2.isBetween(1, 3.1)\n  /// ```\n  abstract function isBetween(start: Number, inclusiveEnd: Number): Boolean\n}\n\n/// A 64-bit signed integer.\n///\n/// The following operators are supported for [Number]s:\n/// ```\n/// -a     // negation\n/// a + b  // addition\n/// a - b  // subtraction\n/// a * b  // multiplication\n/// a / b  // division\n/// a ~/ b // truncating division\n/// a % b  // remainder\n/// a ** b // exponentiation\n/// ```\nexternal class Int extends Number {\n  external ns: Duration\n  external us: Duration\n  external ms: Duration\n  external s: Duration\n  external min: Duration\n  external h: Duration\n  external d: Duration\n\n  external b: DataSize\n\n  external kb: DataSize\n  external mb: DataSize\n  external gb: DataSize\n  external tb: DataSize\n  external pb: DataSize\n\n  external kib: DataSize\n  external mib: DataSize\n  external gib: DataSize\n  external tib: DataSize\n  external pib: DataSize\n\n  external sign: Int\n\n  external abs: Int\n\n  external ceil: Int\n\n  external floor: Int\n\n  external function round(): Int\n\n  external function truncate(): Int\n\n  external function toInt(): Int\n\n  external function toFloat(): Float\n\n  external function toString(): String\n\n  /// Converts this number to a string representation in the given radix.\n  ///\n  /// Digits above 9 are converted to lowercase letters `a` to `z`.\n  /// To pad the resulting string with zeros, use [String.padStart()].\n  ///\n  /// Facts:\n  /// ```\n  /// (-1).toRadixString(20) == \"-1\"\n  /// 42.toRadixString(16) == \"2a\"\n  /// ```\n  external function toRadixString(radix: Int(this.isBetween(2, 36))): String\n\n  external function toFixed(fractionDigits: Int(this.isBetween(0, 20))): String\n\n  external function toDuration(unit: DurationUnit): Duration\n\n  external function toDataSize(unit: DataSizeUnit): DataSize\n\n  /// Shifts this integer left by [n] bits.\n  external function shl(n: Int): Int\n\n  /// Shifts this integer right by [n] bits, preserving the sign bit.\n  external function shr(n: Int): Int\n\n  /// Shifts this integer right by [n] bits, setting the sign bit to zero.\n  ///\n  /// This operation is known as *unsigned right shift*.\n  external function ushr(n: Int): Int\n\n  /// Bitwise AND of this integer and [n].\n  external function and(n: Int): Int\n\n  /// Bitwise OR of this integer and [n].\n  external function or(n: Int): Int\n\n  /// Bitwise XOR of this integer and [n].\n  external function xor(n: Int): Int\n\n  /// Bitwise NOT (inverse) of this integer.\n  external inv: Int\n\n  external isPositive: Boolean\n\n  external isFinite: Boolean\n\n  external isInfinite: Boolean\n\n  external isNaN: Boolean\n\n  /// Tells if this integer is evenly divisible by two.\n  external isEven: Boolean\n\n  /// Tells if this number is not [isEven].\n  external isOdd: Boolean\n\n  external isNonZero: Boolean\n\n  external function isBetween(start: Number, inclusiveEnd: Number): Boolean\n\n  /// Returns the Unicode character with code point [this].\n  ///\n  /// Throws if [this] is not a valid code point.\n  external function toChar(): Char\n}\n\n/// An [Int] value in range [math.minInt8]..[math.maxInt8].\ntypealias Int8 = Int(isBetween(-128, 127))\n\n/// An [Int] value in range [math.minInt16]..[math.maxInt16].\ntypealias Int16 = Int(isBetween(-32768, 32767))\n\n/// An [Int] value in range [math.minInt32]..[math.maxInt32].\ntypealias Int32 = Int(isBetween(-2147483648, 2147483647))\n\n/// An [Int] value in range `0`..[math.maxUInt8].\ntypealias UInt8 = Int(isBetween(0, 255))\n\n/// An [Int] value in range `0`..[math.maxUInt16].\ntypealias UInt16 = Int(isBetween(0, 65535))\n\n/// An [Int] value in range `0`..[math.maxUInt32].\ntypealias UInt32 = Int(isBetween(0, 4294967295))\n\n/// An [Int] value in range `0`..[math.maxUInt].\n///\n/// Note that [math.maxUInt] is equal to [math.maxInt],\n/// not `maxInt * 2 + 1` as one might expect.\n/// That is, [UInt] has half the range of [Int].\ntypealias UInt = Int(isPositive)\n\n/// A value that can be compared to another value of the same type with `<`, `>`, `<=`, and `>=`.\ntypealias Comparable = String | Number | Duration | DataSize\n\n/// A 64-bit floating-point number conforming to the IEEE 754 binary64 format.\n///\n/// The following binary operators are supported for [Number]s:\n/// ```\n/// -a     // negative\n/// a + b  // addition\n/// a - b  // subtraction\n/// a * b  // multiplication\n/// a / b  // division\n/// a ~/ b // integer division\n/// a % b  // remainder\n/// a ** b // exponentiation\n/// ```\n///\n/// Tip: To allow transparent use of [Float] and [Int],\n/// use [Number] instead of [Float] in type annotations.\nexternal class Float extends Number {\n  external ns: Duration\n  external us: Duration\n  external ms: Duration\n  external s: Duration\n  external min: Duration\n  external h: Duration\n  external d: Duration\n\n  external b: DataSize\n\n  external kb: DataSize\n  external mb: DataSize\n  external gb: DataSize\n  external tb: DataSize\n  external pb: DataSize\n\n  external kib: DataSize\n  external mib: DataSize\n  external gib: DataSize\n  external tib: DataSize\n  external pib: DataSize\n\n  external sign: Float\n\n  external abs: Float\n\n  external ceil: Float\n\n  external floor: Float\n\n  external function round(): Float\n\n  external function truncate(): Float\n\n  external function toInt(): Int\n\n  external function toFloat(): Float\n\n  external function toString(): String\n\n  external function toFixed(fractionDigits: Int(this.isBetween(0, 20))): String\n\n  external function toDuration(unit: DurationUnit): Duration\n\n  external function toDataSize(unit: DataSizeUnit): DataSize\n\n  external isPositive: Boolean\n\n  external isFinite: Boolean\n\n  external isInfinite: Boolean\n\n  external isNaN: Boolean\n\n  external isNonZero: Boolean\n\n  external function isBetween(start: Number, inclusiveEnd: Number): Boolean\n}\n\n/// The [Float] value that is not a number (NaN).\nexternal const NaN: Float\n\n/// The [Float] value that is positive Infinity. For negative infinity, use -[Infinity].\nexternal const Infinity: Float\n\n/// A boolean value, either [true] or [false].\n///\n/// The following operators are supported for booleans:\n/// ```\n/// !bool          // logical negation\n/// bool1 && bool2 // logical conjunction\n/// bool1 || bool2 // logical disjunction\n/// ```\nexternal class Boolean extends Any {\n  /// Tells if exactly one of [this] and [other] is [true] (exclusive or).\n  ///\n  /// Facts:\n  /// ```\n  /// !true.xor(true)\n  /// true.xor(false)\n  /// false.xor(true)\n  /// !false.xor(false)\n  /// ```\n  external function xor(other: Boolean): Boolean\n\n  /// Tells if [this] implies [other] (logical consequence).\n  ///\n  /// *Note*: This function does not short-circuit; [other] is always evaluated.\n  ///\n  /// Facts:\n  /// ```\n  /// true.implies(true)\n  /// !true.implies(false)\n  /// false.implies(true)\n  /// false.implies(false)\n  /// ```\n  external function implies(other: Boolean): Boolean\n}\n\n/// A Unicode character (code point).\ntypealias Char = String(length == 1)\n\n/// A sequence of Unicode characters (code points).\n///\n/// The following operators are supported for strings:\n/// ```\n/// str[3]      // subscript\n/// str1 + str2 // concatenation\n/// ```\nexternal class String extends Any {\n  /// The number of characters in this string.\n  ///\n  /// *Note*: The runtime complexity of this operation is `O(n)`.\n  ///\n  /// Facts:\n  /// ```\n  /// \"\".length == 0\n  /// \"abc\".length == 3\n  /// ```\n  @AlsoKnownAs { names { \"size\"; \"count\" } }\n  external length: Int\n\n  /// The index of the last character in this string (same as `length - 1`).\n  ///\n  /// Returns `-1` for an empty string.\n  ///\n  /// *Note*: The runtime complexity of this operation is `O(n)`.\n  ///\n  /// Facts:\n  /// ```\n  /// \"\".lastIndex == -1\n  /// \"abc\".lastIndex == 2\n  /// ```\n  external lastIndex: Int\n\n  /// Tells whether this string is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// \"\".isEmpty\n  /// !(\"   \".isEmpty)\n  /// !(\"abc\".isEmpty)\n  /// ```\n  external isEmpty: Boolean\n\n  /// Tells whether this string is not empty.\n  ///\n  /// Facts:\n  /// ```\n  /// !\"\".isNotEmpty\n  /// \"abc\".isNotEmpty\n  /// ```\n  @Since { version = \"0.31.0\" }\n  external isNotEmpty: Boolean\n\n  /// Tells if all characters in this string have Unicode property \"White_Space\".\n  ///\n  /// Facts:\n  /// ```\n  /// \"\".isBlank\n  /// \"   \".isBlank\n  /// \"\\t\\n\\r\".isBlank\n  /// !(\"abc\".isBlank)\n  /// ```\n  external isBlank: Boolean\n\n  /// Tells if at least one character is not Unicode \"White_Space\".\n  ///\n  /// Facts:\n  /// ```\n  /// !\"\".isNotBlank\n  /// !\"   \".isNotBlank\n  /// \"\\t\\n\\r\".isNotBlank\n  /// \"abc\".isNotBlank\n  /// ```\n  @Since { version = \"0.31.0\" }\n  external isNotBlank: Boolean\n\n  /// Tells if this string is a valid regular expression according to [Regex].\n  external isRegex: Boolean\n\n  /// Tells if this is a valid base64-encoded string.\n  ///\n  /// Facts:\n  /// ```\n  /// \"AQIDBA==\".isBase64\n  /// !\"hello there\".isBase64\n  /// ```\n  @Since { version = \"0.29.0\" }\n  external isBase64: Boolean\n\n  /// The [MD5](https://en.wikipedia.org/wiki/MD5)\n  /// hash of this string's UTF-8 byte sequence\n  /// as hexadecimal string.\n  ///\n  /// MD5 is cryptographically broken and should not be used for secure applications.\n  external md5: String\n\n  /// The [SHA-1](https://en.wikipedia.org/wiki/SHA-1)\n  /// hash of this string's UTF-8 byte sequence.\n  ///\n  /// SHA-1 is cryptographically broken and should not be used for secure applications.\n  external sha1: String\n\n  /// The [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n  /// cryptographic hash of this string's UTF-8 byte sequence\n  /// as hexadecimal string.\n  external sha256: String\n\n  /// The first 64 bits of the [SHA-256](https://en.wikipedia.org/wiki/SHA-2)\n  /// cryptographic hash of this string's UTF-8 byte sequence.\n  external sha256Int: Int\n\n  /// The Base64 encoding of this string's UTF-8 byte sequence.\n  external base64: String\n\n  /// The inverse of [base64].\n  ///\n  /// Facts:\n  /// ```\n  /// \"abc\".base64.base64Decoded == \"abc\"\n  /// ```\n  external base64Decoded: String\n\n  /// Converts this base64-format string into [Bytes].\n  ///\n  /// Facts:\n  /// ```\n  /// \"AQIDBA==\".base64DecodedBytes = Bytes(1, 2, 3, 4)\n  /// ```\n  @Since { version = \"0.29.0\" }\n  external base64DecodedBytes: Bytes\n\n  /// The Unicode characters in this string.\n  ///\n  /// Facts:\n  /// ```\n  /// \"abc\".chars == List(\"a\", \"b\", \"c\")\n  /// ```\n  external chars: List<Char>(this.length == length)\n\n  /// The Unicode code points in this string.\n  ///\n  /// Facts:\n  /// ```\n  /// \"abc\".codePoints == List(0x61, 0x62, 0x63)\n  /// ```\n  external codePoints: List<Int(isBetween(0, 0x10FFFF))>(this.length == length)\n\n  /// Returns the character at [index], or [null] if [index] is out of range.\n  ///\n  /// Facts:\n  /// ```\n  /// \"abcde\".getOrNull(-1) == null\n  /// \"abcde\".getOrNull(0) == \"a\"\n  /// \"abcde\".getOrNull(2) == \"c\"\n  /// \"abcde\".getOrNull(4) == \"e\"\n  /// \"abcde\".getOrNull(5) == null\n  /// ```\n  external function getOrNull(index: Int): Char?\n\n  /// Returns the substring from [start] until [exclusiveEnd].\n  ///\n  /// Throws if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n  /// [start]..[length].\n  ///\n  /// Facts:\n  /// ```\n  /// \"abcde\".substring(0, 0) == \"\"\n  /// \"abcde\".substring(0, 1) == \"a\"\n  /// \"abcde\".substring(1, 4) == \"bcd\"\n  /// \"abcde\".substring(4, 5) == \"e\"\n  /// \"abcde\".substring(5, 5) == \"\"\n  /// ```\n  external function substring(start: Int, exclusiveEnd: Int): String\n\n  /// Returns the substring from [start] until [exclusiveEnd].\n  ///\n  /// Returns [null] if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n  /// [start]..[length].\n  ///\n  /// Facts:\n  /// ```\n  /// \"abcde\".substringOrNull(0, 0) == \"\"\n  /// \"abcde\".substringOrNull(0, 1) == \"a\"\n  /// \"abcde\".substringOrNull(1, 4) == \"bcd\"\n  /// \"abcde\".substringOrNull(4, 5) == \"e\"\n  /// \"abcde\".substringOrNull(5, 5) == \"\"\n  ///\n  /// \"abcde\".substringOrNull(-1, 3) == null\n  /// \"abcde\".substringOrNull(0, 6) == null\n  /// \"abcde\".substringOrNull(3, 2) == null\n  /// ```\n  external function substringOrNull(start: Int, exclusiveEnd: Int): String?\n\n  /// Concatenates [count] copies of this string.\n  ///\n  /// Facts:\n  /// ```\n  /// \"abc\".repeat(0) == \"\"\n  /// \"abc\".repeat(1) == \"abc\"\n  /// \"abc\".repeat(3) == \"abcabcabc\"\n  /// ```\n  external function repeat(count: UInt): String\n\n  /// Tells whether this string contains [pattern].\n  external function contains(pattern: String | Regex): Boolean\n\n  /// Tells whether this string matches [regex] in its entirety.\n  @AlsoKnownAs { names { \"test\" } }\n  external function matches(regex: Regex): Boolean\n\n  /// Tells whether this string starts with [pattern].\n  external function startsWith(pattern: String | Regex): Boolean\n\n  /// Tells whether this string ends with [pattern].\n  external function endsWith(pattern: String | Regex): Boolean\n\n  /// Returns the zero-based index of the first occurrence of [pattern]\n  /// in this string.\n  ///\n  /// Throws if [pattern] does not occur in this string.\n  external function indexOf(pattern: String | Regex): Int\n\n  /// Returns the zero-based index of the first occurrence of [pattern]\n  /// in this string, or [null] if [pattern] does not occur in this string.\n  external function indexOfOrNull(pattern: String | Regex): Int?\n\n  /// Returns the zero-based index of the last occurrence of [pattern]\n  /// in this string.\n  ///\n  /// Throws if [pattern] does not occur in this string.\n  external function lastIndexOf(pattern: String | Regex): Int\n\n  /// Returns the zero-based index of the last occurrence of [pattern]\n  /// in this string, or [null] if [pattern] does not occur in this string.\n  external function lastIndexOfOrNull(pattern: String | Regex): Int?\n\n  /// Returns the first [n] characters of this string.\n  ///\n  /// Returns [this] if [n] is greater than or equal to [length].\n  @AlsoKnownAs { names { \"limit\" } }\n  external function take(n: Int): String\n\n  /// Returns the longest prefix of this string that satisfies [predicate].\n  external function takeWhile(predicate: (String) -> Boolean): String\n\n  /// Returns the last [n] characters of this string.\n  ///\n  /// Returns [this] if [n] is greater than or equal to [length].\n  external function takeLast(n: Int): String\n\n  /// Returns the longest suffix of this string that satisfies [predicate].\n  external function takeLastWhile(predicate: (String) -> Boolean): String\n\n  /// Removes the first [n] characters of this string.\n  ///\n  /// Returns the empty string if [n] is greater than or equal to [length].\n  @AlsoKnownAs { names { \"skip\" } }\n  external function drop(n: Int): String\n\n  /// Removes the longest prefix of this string that satisfies [predicate].\n  @AlsoKnownAs { names { \"skipWhile\" } }\n  external function dropWhile(predicate: (String) -> Boolean): String\n\n  /// Removes the last [n] characters of this string.\n  ///\n  /// Returns the empty string if [n] is greater than or equal to [length].\n  @AlsoKnownAs { names { \"skipLast\" } }\n  external function dropLast(n: Int): String\n\n  /// Removes the longest suffix of this string that satisfies [predicate].\n  @AlsoKnownAs { names { \"skipLastWhile\" } }\n  external function dropLastWhile(predicate: (String) -> Boolean): String\n\n  /// Replaces the first occurrence of [pattern] in this string with [replacement].\n  ///\n  /// Returns this string unchanged if [pattern] does not occur in this string.\n  external function replaceFirst(pattern: String | Regex, replacement: String): String\n\n  /// Replaces the last occurrence of [pattern] in this string with [replacement].\n  ///\n  /// Returns this string unchanged if [pattern] does not occur in this string.\n  external function replaceLast(pattern: String | Regex, replacement: String): String\n\n  /// Replaces all occurrences of [pattern] in this string with [replacement].\n  ///\n  /// Returns this string unchanged if [pattern] does not occur in this string.\n  external function replaceAll(pattern: String | Regex, replacement: String): String\n\n  /// Replaces the first occurrence of [pattern] in this string with the return value of [mapper].\n  ///\n  /// Returns this string unchanged if [pattern] does not occur in this string.\n  external function replaceFirstMapped(\n    pattern: String | Regex,\n    mapper: (RegexMatch) -> String,\n  ): String\n\n  /// Replaces the last occurrence of [pattern] in this string with the return value of [mapper].\n  ///\n  /// Returns this string unchanged if [pattern] does not occur in this string.\n  external function replaceLastMapped(\n    pattern: String | Regex,\n    mapper: (RegexMatch) -> String,\n  ): String\n\n  /// Replaces all occurrences of [pattern] in this string with the return value of [mapper].\n  ///\n  /// Returns this string unchanged if [pattern] does not occur in this string.\n  external function replaceAllMapped(\n    pattern: String | Regex,\n    mapper: (RegexMatch) -> String,\n  ): String\n\n  /// Replaces the characters between [start] and [exclusiveEnd] with [replacement].\n  ///\n  /// Inserts [replacement] at index [start] if `start == exclusiveEnd`.\n  external function replaceRange(start: Int, exclusiveEnd: Int, replacement: String): String\n\n  /// Performs a locale-independent character-by-character conversion of this string to uppercase.\n  external function toUpperCase(): String\n\n  /// Performs a locale-independent character-by-character conversion of this string to lowercase.\n  external function toLowerCase(): String\n\n  /// Reverses the order of characters in this string.\n  external function reverse(): String\n\n  /// Removes any leading and trailing characters with Unicode property \"White_Space\" from this\n  /// string.\n  @AlsoKnownAs { names { \"strip\" } }\n  external function trim(): String\n\n  /// Removes any leading characters with Unicode property \"White_Space\" from this string.\n  @AlsoKnownAs { names { \"stripLeft\"; \"stripStart\"; \"stripLeading\"; \"trimLeft\"; \"trimLeading\" } }\n  external function trimStart(): String\n\n  /// Removes any trailing characters with Unicode property \"White_Space\" from this string.\n  @AlsoKnownAs { names { \"stripRight\"; \"stripEnd\"; \"stripTrailing\"; \"trimRight\"; \"trimTrailin\" } }\n  external function trimEnd(): String\n\n  /// Increases the length of this string to [width] by adding leading [char]s.\n  ///\n  /// Returns this string unchanged if its length is already equal to or greater than [width].\n  @AlsoKnownAs { names { \"padLeft\" } }\n  external function padStart(width: Int, char: Char)\n\n  /// Increases the length of this string to [width] by adding trailing [char]s.\n  ///\n  /// Returns this string unchanged if its length is already equal to or greater than [width].\n  @AlsoKnownAs { names { \"padRight\" } }\n  external function padEnd(width: Int, char: Char)\n\n  /// Splits this string around matches of [pattern].\n  external function split(pattern: String | Regex): List<String>\n\n  /// Splits this string matches of [pattern], up to [limit] substrings.\n  ///\n  /// Returns a [List] with at most [limit] elements.\n  /// If the limit has been reached, the last entry will contain the un-split remainder of this\n  /// string.\n  ///\n  /// Facts:\n  /// ```\n  /// \"a.b.c\".splitLimit(\".\", 2) == List(\"a\", \"b.c\")\n  /// \"a.b.c\".splitLimit(\".\", 1) == List(\"a.b.c\")\n  /// \"a.b.c\".splitLimit(\".\", 50) == List(\"a\", \"b\", \"c\")\n  /// \"a.b:c\".splitLimit(Regex(\"[.:]\"), 3) == List(\"a\", \"b\", \"c\")\n  /// ```\n  @Since { version = \"0.27.0\" }\n  external function splitLimit(pattern: String | Regex, limit: Int(this > 0)): List<String>\n\n  /// Converts the first character of this string to title case.\n  ///\n  /// Facts:\n  /// ```\n  /// \"pigeon\".capitalize() == \"Pigeon\"\n  /// \"pigeon bird\".capitalize() == \"Pigeon bird\"\n  /// \"\".capitalize() == \"\"\n  /// ```\n  external function capitalize(): String\n\n  /// Converts the first character of this string to lower case.\n  ///\n  /// Facts:\n  /// ```\n  /// \"Pigeon\".decapitalize() == \"pigeon\"\n  /// \"Pigeon Bird\".decapitalize() == \"pigeon Bird\"\n  /// \"\".decapitalize() == \"\"\n  /// ```\n  external function decapitalize(): String\n\n  /// Parses this string as a signed decimal (base 10) integer.\n  ///\n  /// Throws if this string cannot be parsed as a signed decimal integer,\n  /// or if the integer is too large to fit into [Int].\n  external function toInt(): Int\n\n  /// Parses this string as a signed decimal (base 10) integer.\n  ///\n  /// Returns [null] if this string cannot be parsed as a signed decimal integer,\n  /// or if the integer is too large to fit into [Int].\n  external function toIntOrNull(): Int?\n\n  /// Parses this string as a floating point number.\n  ///\n  /// Throws if this string cannot be parsed as a floating point number.\n  external function toFloat(): Float\n\n  /// Parses this string as a floating point number.\n  ///\n  /// Returns [null] if this string cannot be parsed as a floating point number.\n  external function toFloatOrNull(): Float?\n\n  /// Parses `\"true\"` to [true] and `\"false\"` to [false] (case-insensitive).\n  ///\n  /// Throws if this string is neither `\"true\"` nor `\"false\"` (case-insensitive).\n  external function toBoolean(): Boolean\n\n  /// Parses `\"true\"` to [true] and `\"false\"` to [false] (case-insensitive).\n  ///\n  /// Returns [null] if this string is neither `\"true\"` nor `\"false\"` (case-insensitive).\n  external function toBooleanOrNull(): Boolean?\n\n  /// Returns the bytes of this string, encoded using [charset]. \n  ///\n  /// Facts:\n  /// ```\n  /// \"Parrot\".encodeToBytes(\"UTF-8\") == Bytes(80, 97, 114, 114, 111, 116)\n  /// ```\n  @Since { version = \"0.29.0\" }\n  external function encodeToBytes(charset: Charset): Bytes\n}\n\n/// An identifier for a [character encoding](https://en.wikipedia.org/wiki/Character_encoding).\n///\n/// * `\"UTF-8\"`: <https://en.wikipedia.org/wiki/UTF-8>\n/// * `\"UTF-16\"`: <https://en.wikipedia.org/wiki/UTF-16>\n/// * `\"ISO-8859-1\"` (also known as latin1): <https://en.wikipedia.org/wiki/ISO/IEC_8859-1> \n@Since { version = \"0.29.0\" }\ntypealias Charset = \"UTF-8\" | \"UTF-16\" | \"ISO-8859-1\"\n\n/// A string representing a [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier).\ntypealias Uri = String\n\n/// Constructs a regular expression described by [pattern].\n///\n/// Throws if [pattern] is not a valid regular expression.\n///\n/// To test if [pattern] is a valid regular expression, use [String.isRegex].\nexternal const function Regex(pattern: String): Regex\n\n/// A regular expression to match strings against.\nexternal class Regex {\n  /// The pattern string of this regular expression.\n  ///\n  /// Facts:\n  /// ```\n  /// Regex(\"some pattern string\").pattern == \"some pattern string\"\n  /// ```\n  external pattern: String\n\n  /// The number of capturing groups in this regular expression.\n  ///\n  /// Returns zero if this regular expression does not have any capturing groups.\n  ///\n  /// Facts:\n  /// ```\n  /// Regex(#\"abc\"#).groupCount == 0\n  /// Regex(#\"a(\\s*)b(\\s*)c\"#).groupCount == 2 // `()` denotes a capturing group\n  /// Regex(#\"a(?:\\s*)bc\"#).groupCount == 0    // `(?:)` denotes a non-capturing group\n  /// ```\n  external groupCount: Int\n\n  /// Finds all matches of this regular expression in [input].\n  @AlsoKnownAs { names { \"match\" } }\n  external function findMatchesIn(input: String): List<RegexMatch>\n\n  /// Matches this regular expression against the entire [input].\n  external function matchEntire(input: String): RegexMatch?\n}\n\n/// A match of a regular expression in a string.\nclass RegexMatch {\n  /// The string value of this match.\n  value: String\n\n  /// The start index of this match.\n  start: Int\n\n  /// The exclusive end index of this match.\n  end: Int\n\n  /// The capturing group matches within this match.\n  ///\n  /// If [this] is already a capturing group match, returns the empty list.\n  /// Otherwise, returns a list of length `regex.groupCount + 1`,\n  /// where `groups[0]` contains the entire match (for consistency with other regex APIs),\n  /// and `groups[1]` to `groups[regex.groupCount]` contain capturing group matches.\n  /// If a capturing group did not produce a match, the corresponding [RegexMatch] element is [null].\n  groups: List<RegexMatch?>\n\n  /// Returns [value].\n  function toString(): String = value\n}\n\n/// The unit of a [Duration].\ntypealias DurationUnit = \"ns\" | \"us\" | \"ms\" | \"s\" | \"min\" | \"h\" | \"d\"\n\n/// A quantity of elapsed time, represented as a [value] (e.g. `30.5`) and [unit] (e.g. `min`).\nexternal class Duration extends Any {\n  /// The value of this duration.\n  ///\n  /// Returns [Int] if possible and [Float] otherwise.\n  ///\n  /// Facts:\n  /// ```\n  /// 1.min.value == 1\n  /// 2.2.h.value == 2.2\n  /// ```\n  external value: Number\n\n  /// An [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Durations) representation of this\n  /// duration.\n  ///\n  /// The ISO representation has the format `[-]PT{hours}H{minutes}M{seconds}S`, where\n  ///\n  /// - negative durations have a leading minus sign,\n  /// - `{hours}` and `{minutes}` are positive integers,\n  /// - `{seconds}` is a positive integer or a positive decimal with decimal point (`.`),\n  /// - zero-valued components are omitted, and\n  /// - durations with length zero are represented as `PT0S`.\n  ///\n  /// Facts:\n  /// ```\n  /// 1.5.h.isoString == \"PT1H30M\"\n  /// -1.5.h.isoString == \"-PT1H30M\"\n  /// 1.23.s.isoString == \"PT1.23S\"\n  /// 0.ms.isoString == \"PT0S\"\n  /// ```\n  external isoString: String(matches(Regex(#\"-?PT(\\d+H)?(\\d+M)?(\\d+([.]\\d+)?S)?\"#)))\n\n  /// The unit of this duration.\n  ///\n  /// Facts:\n  /// ```\n  /// 1.min.unit == \"min\"\n  /// 2.2.h.unit == \"h\"\n  /// ```\n  external unit: DurationUnit\n\n  /// Tells if this duration has a value of zero or greater.\n  ///\n  /// Facts:\n  /// ```\n  /// 2.min.isPositive\n  /// !(-2.min.isPositive)\n  /// ```\n  external isPositive: Boolean\n\n  /// Tells if this duration is greater than or equal to [start] and less than or equal to\n  /// [inclusiveEnd].\n  ///\n  /// Facts:\n  /// ```\n  /// 3.min.isBetween(120.s, 4.min)\n  /// 3.min.isBetween(180.s, 4.min)\n  /// 3.min.isBetween(120.s, 3.min)\n  /// !3.min.isBetween(1.min, 2.min)\n  /// ```\n  external function isBetween(start: Duration, inclusiveEnd: Duration): Boolean\n\n  /// Returns the equivalent duration with the given unit.\n  ///\n  /// Facts:\n  /// ```\n  /// 60.min.toUnit(\"h\") == 1.h\n  /// 1.h.toUnit(\"min\") == 60.min\n  /// ```\n  external function toUnit(unit: DurationUnit): Duration\n}\n\n/// The unit of a [DataSize].\ntypealias DataSizeUnit =\n  \"b\" | \"kb\" | \"kib\" | \"mb\" | \"mib\" | \"gb\" | \"gib\" | \"tb\" | \"tib\" | \"pb\" | \"pib\"\n\n/// A quantity of binary data, represented as a [value] (e.g. `30.5`) and [unit] (e.g. `mb`).\nexternal class DataSize extends Any {\n  /// The value of this data size.\n  ///\n  /// Returns [Int] if possible and [Float] otherwise.\n  ///\n  /// Facts:\n  /// ```\n  /// 1.mb.value == 1\n  /// 2.2.mib.value == 2.2\n  /// ```\n  external value: Number\n\n  /// The unit of this data size.\n  ///\n  /// Facts:\n  /// ```\n  /// 1.mb.unit == \"mb\"\n  /// 2.2.mib.unit == \"mib\"\n  /// ```\n  external unit: DataSizeUnit\n\n  /// Tells if this data size has a value of zero or greater.\n  ///\n  /// Facts:\n  /// ```\n  /// 2.mb.isPositive\n  /// !(-2.mb.isPositive)\n  /// ```\n  external isPositive: Boolean\n\n  /// Tells if this data size is greater than or equal to [start] and less than or equal to\n  /// [inclusiveEnd].\n  ///\n  /// Facts:\n  /// ```\n  /// 3.kb.isBetween(2000.b, 4.kb)\n  /// 3.kb.isBetween(3000.b, 4.kb)\n  /// 3.kb.isBetween(2000.b, 3.kb)\n  /// !3.kb.isBetween(1.kb, 2.kb)\n  /// ```\n  external function isBetween(start: DataSize, inclusiveEnd: DataSize)\n\n  /// Returns the equivalent data size with the given unit.\n  ///\n  /// Facts:\n  /// ```\n  /// 1000.kb.toUnit(\"mb\") == 1.mb\n  /// 1.mb.toUnit(\"kb\") == 1000.kb\n  /// ```\n  external function toUnit(unit: DataSizeUnit): DataSize\n\n  /// Tells if this data size has a binary unit, for example `mib`.\n  ///\n  /// Returns [true] for unit `b` (bytes).\n  external isBinaryUnit: Boolean\n\n  /// Tells if this data size has a decimal unit, for example `mb`.\n  ///\n  /// Returns [true] for unit `b` (bytes).\n  external isDecimalUnit: Boolean\n\n  /// Returns the equivalent data size with a binary unit.\n  ///\n  /// Returns this data size unchanged if it already has a binary unit.\n  ///\n  /// Facts:\n  /// ```\n  /// 1024.kb.toBinaryUnit() == 1000.kib\n  /// 1024.mb.toBinaryUnit() == 1000.mib\n  ///\n  /// 1000.kib.toBinaryUnit() == 1000.kib\n  /// 1000.b.toBinaryUnit() == 1000.b\n  /// ```\n  external function toBinaryUnit(): DataSize\n\n  /// Returns the equivalent data size with a decimal unit.\n  ///\n  /// Returns this data size unchanged if it already has a decimal unit.\n  ///\n  /// Facts:\n  /// ```\n  /// 1000.kib.toDecimalUnit() == 1024.kb\n  /// 1000.mib.toDecimalUnit() == 1024.mb\n  ///\n  /// 1000.kb.toDecimalUnit() == 1000.kb\n  /// 1000.b.toDecimalUnit() == 1000.b\n  /// ```\n  external function toDecimalUnit(): DataSize\n}\n\n/// A composite value containing members (properties, elements, entries).\n///\n/// ```\n/// obj = new {\n///   name = \"Pigeon\" // property\n///   \"Hello\"       // element\n///   [\"two\"] = 2   // entry\n/// }\n///\n/// obj.name   // \"Pigeon\"\n/// obj[0]     // \"Hello\"\n/// obj[\"two\"] // 2\n/// ```\n///\n/// An object can be *amended* to create variants of itself.\n/// This is similar to inheritance in prototype-oriented programming.\n///\n/// ```\n/// pigeon = new { name = \"Pigeon\"; age = 42 }\n/// barnOwl = (pigeon) { name = \"Barn Owl\" } // override property `name`\n/// oldPigeon = (pigeon) { age = 84 } // override property `age`\n/// ```\n///\n/// Object members may reference other members:\n///\n/// ```\n/// thresholds = new { lower = 10; upper = lower + 5 }\n/// ```\n///\n/// Object members are dynamically bound.\n/// This is similar to how computed cells in a spreadsheet work.\n///\n/// ```\n/// thresholds = new { lower = 10; upper = lower + 5 }\n/// thresholds2 = new { lower = 7 } // thresholds2.upper == 12\n/// ```\n///\n/// Objects have memberwise equality and hash code.\n///\n/// To arbitrarily manipulate an object, convert it to a [Collection].\n/// If necessary, the manipulated [Collection] can be converted back to an [Object].\n///\n/// ```\n/// pigeon = new { name = \"Pigeon\"; age = 42 }\n/// manipulated = pigeon.toMap().mapKeys((key, value) -> key.reverse())\n/// manipulated.toDynamic() // new { eman = \"Pigeon\"; ega = 42 }\n/// ```\nabstract external class Object extends Any\n\n/// Base class for objects whose members are described by a class definition.\n///\n/// User-defined classes (that is, classes without `external` modifier) implicitly extend this\n/// class.\nabstract class Typed extends Object {\n  /// Tells if this object has a property with the given [name].\n  external function hasProperty(name: String): Boolean\n\n  /// Returns the value of the property with the given [name].\n  ///\n  /// Throws if a property with this name does not exist.\n  external function getProperty(name: String): unknown\n\n  /// Returns the value of the property with the given [name].\n  ///\n  /// Returns [null] if a property with this name does not exist.\n  external function getPropertyOrNull(name: String): unknown?\n\n  /// Converts this object to a [Dynamic] object.\n  external function toDynamic(): Dynamic\n\n  /// Converts this object to a [Map].\n  external function toMap(): Map<String, unknown>\n}\n\n/// An object that can contain arbitrary properties, elements, and entries.\n///\n/// Example:\n/// ```\n/// obj = new Dynamic {\n///   propertyName = \"propertyValue\"\n///   \"element\"\n///   [\"entryKey\"] = \"entryValue\"\n/// }\n/// ```\n///\n/// Unlike a [Typed] object, a dynamic object does not have an associated class describing its\n/// shape.\nclass Dynamic extends Object {\n  /// The function used to compute the default value for an object element or entry given its key.\n  hidden default: (unknown) -> Any = (_) -> new Dynamic {}\n\n  /// Returns the number of elements in this object.\n  external function length(): Int\n\n  /// Tells if this object has a property with the given [name].\n  external function hasProperty(name: String): Boolean\n\n  /// Returns the value of the property with the given [name].\n  ///\n  /// Throws if a property with this name does not exist.\n  external function getProperty(name: String): unknown\n\n  /// Returns the value of the property with the given [name].\n  ///\n  /// Returns [null] if a property with this name does not exist.\n  external function getPropertyOrNull(name: String): unknown\n\n  /// Converts the properties and/or entries of this dynamic object to a [Map].\n  external function toMap(): Map<unknown, unknown>\n\n  /// Converts the elements of this dynamic object to a [List].\n  external function toList(): List<unknown>\n\n  /// Converts this object to a typed object of class [clazz].\n  ///\n  /// Conforms to the semantics of the following manual conversion:\n  /// ```\n  /// class Person { name: String; age: Int }\n  /// dynamic = new Dynamic { name = \"Pigeon\"; age = 42 }\n  /// function toTyped(dynamic: Dynamic): Person = new {\n  ///   name = dynamic.getPropertyOrNull(\"name\") ?? super.name\n  ///   age = dynamic.getPropertyOrNull(\"age\") ?? super.age\n  /// }\n  /// ```\n  ///\n  /// Notable behavior:\n  /// - Elements and entries of [this] are ignored.\n  /// - Properties of [this] that have no corresponding property in [clazz] are ignored.\n  /// - [clazz] properties that have no corresponding property in [this] have their defaults\n  ///   preserved.\n  /// - [clazz] properties that have neither a default nor a corresponding property in [this]\n  ///   throw an \"undefined property\" error (only) when accessed.\n  ///\n  /// Throws if [clazz] is abstract or not a subclass of [Typed].\n  external function toTyped<Type>(clazz: Class<Type>): Type(this is Typed)\n}\n\n/// An object containing an ordered sequence of elements.\n///\n/// This class is the object equivalent of [List].\nclass Listing<out Element> extends Object {\n  /// The function used to compute the default value for a listing element given its index.\n  hidden default: (Int) -> Element = (_) -> new Dynamic {}\n\n  /// The number of elements in this listing.\n  external length: Int\n\n  /// Tells if this listing is empty, that is, has zero elements.\n  external isEmpty: Boolean\n\n  /// Tells if this listing is not empty, that is, it has at least one element.\n  @Since { version = \"0.31.0\" }\n  external isNotEmpty: Boolean\n\n  /// The index of the last element in this listing (same as `length - 1`).\n  ///\n  /// Returns `-1` for an empty list.\n  @Since { version = \"0.27.0\" }\n  external lastIndex: Int\n\n  /// Returns the element at [index].\n  ///\n  /// Returns [null] if [index] is outside the bounds of this listing.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 3 ; 9 ; 6 }.getOrNull(0) == 3\n  /// new Listing { 3 ; 9 ; 6 }.getOrNull(1) == 9\n  /// new Listing { 3 ; 9 ; 6 }.getOrNull(2) == 6\n  /// new Listing { 3 ; 9 ; 6 }.getOrNull(-1) == null\n  /// new Listing { 3 ; 9 ; 6 }.getOrNull(3) == null\n  /// new Listing { 3 ; 9 ; 6 }.getOrNull(99) == null\n  /// ```\n  @Since { version = \"0.27.0\" }\n  external function getOrNull(index: Int): Element?\n\n  /// Returns the element at [index].\n  ///\n  /// Returns [default] applied to [index] if [index] is outside the bounds of this listing.\n  ///\n  /// This is equivalent to `getOrNull(index) ?? default.apply(index)`.\n  @Since { version = \"0.29.0\" }\n  external function getOrDefault(index: Int): Element\n\n  /// Tells if this listing has no duplicate elements.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 1; 2; 3 }.isDistinct\n  /// !new Listing { 1; 2; 1 }.isDistinct\n  /// ```\n  @AlsoKnownAs { names { \"isUnique\" } }\n  external isDistinct: Boolean\n\n  /// Tells if this listing has no elements that are duplicates after applying [selector].\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { \"a\"; \"ab\"; \"abc\" }.isDistinctBy((it) -> it.length)\n  /// !new Listing { \"a\"; \"ab\"; \"c\" }.isDistinctBy((it) -> it.length)\n  /// ```\n  @AlsoKnownAs { names { \"isUniqueBy\" } }\n  external function isDistinctBy(selector: (Element) -> Any): Boolean\n\n  /// Removes duplicate elements from this listing, preserving the first occurrence.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 1; 2; 3 }.distinct == new Listing { 1; 2; 3 }\n  /// new Listing { 1; 2; 1 }.distinct == new Listing { 1; 2 }\n  /// ```\n  @AlsoKnownAs { names { \"unique\" } }\n  external distinct: Listing<Element>\n\n  /// The first element in this listing.\n  ///\n  /// Throws if this listing is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 1 ; 2 ; 3 }.first == 1\n  /// import(\"pkl:test\").catch(() -> new Listing {}.first)\n  /// ```\n  @Since { version = \"0.27.0\" }\n  external first: Element\n\n  /// Same as [first] but returns [null] if this listing is empty.\n  @Since { version = \"0.27.0\" }\n  external firstOrNull: Element?\n\n  /// The last element in this listing.\n  ///\n  /// Throws if this listing is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 1 ; 2 ; 3 }.last == 3\n  /// import(\"pkl:test\").catch(() -> new Listing {}.last)\n  /// ```\n  @Since { version = \"0.27.0\" }\n  external last: Element\n\n  /// Same as [last] but returns [null] if this listing is empty.\n  @Since { version = \"0.27.0\" }\n  external lastOrNull: Element?\n\n  /// The single element in this listing.\n  ///\n  /// Throws if this listing does not have exactly one element.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 1 }.single == 1\n  /// import(\"pkl:test\").catch(() -> new Listing {}.single)\n  /// import(\"pkl:test\").catch(() -> new Listing { 1 ; 2 ; 3 }.single)\n  /// ```\n  @Since { version = \"0.27.0\" }\n  external single: Element\n\n  /// Same as [single] but returns [null] if this collection is empty or has more than one element.\n  @Since { version = \"0.27.0\" }\n  external singleOrNull: Element?\n\n  /// Removes elements that are duplicates after applying [selector] from this listing, preserving\n  /// the first occurrence.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { \"a\"; \"ab\"; \"abc\" }.distinctBy((it) -> it.length) == new Listing { \"a\"; \"ab\"; \"abc\" }\n  /// new Listing { \"a\"; \"ab\"; \"c\" }.distinctBy((it) -> it.length) == new Listing { \"a\"; \"ab\" }\n  /// ```\n  @AlsoKnownAs { names { \"uniqueBy\" } }\n  external function distinctBy(selector: (Element) -> Any): Listing<Element>\n\n  /// Tells if [predicate] holds for every element of this listing.\n  ///\n  /// Returns [true] for an empty listing.\n  @Since { version = \"0.27.0\" }\n  external function every(predicate: (Element) -> Boolean): Boolean\n\n  /// Tells if [predicate] holds for at least one element of this listing.\n  ///\n  /// Returns [false] for an empty listing.\n  @Since { version = \"0.27.0\" }\n  external function any(predicate: (Element) -> Boolean): Boolean\n\n  /// Tests if [element] is contained in this listing.\n  ///\n  /// Facts:\n  /// ```\n  /// new Listing { 1 ; 2 ; 3 }.contains(1)\n  /// new Listing { 1 ; 2 ; 3 }.contains(2)\n  /// new Listing { 1 ; 2 ; 3 }.contains(3)\n  /// !new Listing { 1 ; 2 ; 3 }.contains(4)\n  /// ```\n  @Since { version = \"0.27.0\" }\n  external function contains(element: Element): Boolean\n\n  /// Folds this listing in iteration order using [operator], starting with [initial].\n  external function fold<Result>(initial: Result, operator: (Result, Element) -> Result): Result\n\n  /// Folds this listing in iteration order using [operator], starting with [initial].\n  ///\n  /// The first parameter of [operator] is the zero-based index of the current element.\n  external function foldIndexed<Result>(\n    initial: Result,\n    operator: (Int, Result, Element) -> Result,\n  ): Result\n\n  /// Converts the elements of this listing to strings and concatenates them inserting [separator]\n  /// between elements.\n  external function join(separator: String): String\n\n  /// Converts this listing to a [List].\n  external function toList(): List<Element>\n\n  /// Converts this listing to a [Set].\n  external function toSet(): Set<Element>\n}\n\n/// An object containing an ordered sequence of key-value pairs.\n///\n/// This class is the object equivalent of [Map].\n///\n/// To retrieve a value given its key, use subscript notation (`object[key]`),\n/// which throws an error if no value is associated with the given key, or the `getOrNull` method.\n/* Note: [Key] can be co-variant as long as [getOrNull], [containsKey], and similar methods admit keys of type [Any]. */\nclass Mapping<out Key, out Value> extends Object {\n  /// The function used to compute the default value for a mapping entry given its key.\n  hidden default: (Key) -> Value = (_) -> new Dynamic {}\n\n  /// Tells if this mapping is empty, that is, has zero entries.\n  external isEmpty: Boolean\n\n  /// Tells whether this mapping is not empty, that is, it has at least one entry.\n  @Since { version = \"0.31.0\" }\n  external isNotEmpty: Boolean\n\n  /// The number of entries in this mapping.\n  external length: Int\n\n  /// The keys contained in this mapping.\n  external keys: Set<Key>\n\n  /// Tells if this mapping contains [key].\n  external function containsKey(key: Any): Boolean\n\n  /// Tells if this mapping contains an entry with the given [value].\n  @Since { version = \"0.27.0\" }\n  external function containsValue(value: Any): Boolean\n\n  /// Returns the value associated with [key] or [null] if this mapping does not contain [key].\n  ///\n  /// This is the nullable equivalent of the subscript operator (`object[key]`).\n  external function getOrNull(key: Any): Value?\n\n  /// Returns the value associated with [key] or [default] applied to [key] if this mapping does\n  /// not contain [key].\n  ///\n  /// This is equivalent to `getOrNull(key) ?? default.apply(key)`.\n  @Since { version = \"0.29.0\" }\n  external function getOrDefault(key: Any): Value\n\n  /// Folds the entries of this mapping in iteration order using [operator], starting with\n  /// [initial].\n  external function fold<Result>(initial: Result, operator: (Result, Key, Value) -> Result): Result\n\n  /// Tells if [predicate] holds for every entry of this mapping.\n  ///\n  /// Returns [true] for an empty mapping.\n  @Since { version = \"0.27.0\" }\n  external function every(predicate: (Key, Value) -> Boolean): Boolean\n\n  /// Tells if [predicate] holds for at least one entry of this mapping.\n  ///\n  /// Returns [false] for an empty mapping.\n  @Since { version = \"0.27.0\" }\n  external function any(predicate: (Key, Value) -> Boolean): Boolean\n\n  /// Converts this mapping to a [Map].\n  external function toMap(): Map<Key, Value>\n}\n\n/// Base class for function literals (also known as *lambda expressions*).\nabstract external class Function<out Result> extends Any {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function applyToList(argumentList: List<Any>): Result\n}\n\n/// A function literal with zero parameters.\nexternal class Function0<out Result> extends Function<Result> {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function apply(): Result\n}\n\n/// A function literal with one parameter.\nexternal class Function1<in Param1, out Result> extends Function<Result> {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function apply(p1: Param1): Result\n}\n\n/// A function literal with two parameters.\nexternal class Function2<in Param1, in Param2, out Result> extends Function<Result> {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function apply(p1: Param1, p2: Param2): Result\n}\n\n/// A function literal with three parameters.\nexternal class Function3<in Param1, in Param2, in Param3, out Result> extends Function<Result> {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function apply(p1: Param1, p2: Param2, p3: Param3): Result\n}\n\n/// A function literal with four parameters.\nexternal class Function4<in Param1, in Param2, in Param3, in Param4, out Result>\n  extends Function<Result> {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function apply(p1: Param1, p2: Param2, p3: Param3, p4: Param4): Result\n}\n\n/// A function literal with five parameters.\nexternal class Function5<in Param1, in Param2, in Param3, in Param4, in Param5, out Result>\n  extends Function<Result> {\n  @AlsoKnownAs { names { \"call\"; \"invoke\" } }\n  external function apply(p1: Param1, p2: Param2, p3: Param3, p4: Param4, p5: Param5): Result\n}\n\n/// An anonymous function used to apply the same modification to different objects.\n///\n/// Even though mixins are regular [Function]s, they are best created with object syntax:\n/// ```\n/// withNamePigeon = new Mixin<Person> { name = \"Pigeon\" }  // explicit type\n/// withNamePigeon: Mixin<Person> = new { name = \"Pigeon\" } // inferred type\n/// ```\n///\n/// To apply a mixin to an object, use the `|>` (pipe) operator:\n/// ```\n/// pigeon = person |> withNamePigeon\n/// ```\n///\n/// Like all object-returning functions, mixins can be amended:\n/// ```\n/// withNamePigeonAndAge42 = (withNamePigeon) { age = 42 }\n/// pigeon42 = person |> withNamePigeonAndAge42\n/// ```\ntypealias Mixin<Type> = (Type) -> Type\n\n/// Throws an error indicating that the requested value is undefined.\nexternal const function Undefined(): nothing\n\n/// Throws an error indicating that the requested functionality has not yet been implemented.\nconst function TODO(): nothing = throw(\"TODO\")\n\n/// Creates a null value that turns into [defaultValue] when amended.\nexternal const function Null(defaultValue: Object | Function<Object>): Null\n\n/// Constructs a [Pair].\nexternal const function Pair<First, Second>(first: First, second: Second): Pair<First, Second>\n\n/// An ordered pair of elements.\n///\n/// To construct a [Pair], use method [Pair()].\nexternal class Pair<out First, out Second> extends Any {\n  /// The first element of this pair.\n  external first: First\n\n  /// The second element of this pair.\n  external second: Second\n\n  /// Alias for [first].\n  external key: First\n\n  /// Alias for [second].\n  external value: Second\n}\n\n/// Common base class for [List] and [Set].\n///\n/// The following operators are supported for all collections:\n/// ```\n/// coll1 + coll2  // concatenation; result type is `Set` if `coll1` is a set and `List` otherwise\n/// ```\n///\n/// Additionally, the following operators are supported for [List]s:\n/// ```\n/// coll[3]    // subscript\n/// ```\nabstract external class Collection<out Element> extends Any {\n  /// The number of elements in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).length == 3\n  /// List().length == 0\n  /// ```\n  @AlsoKnownAs { names { \"size\"; \"count\" } }\n  abstract length: Int\n\n  /// Tells whether this collection is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// !List(1, 2, 3).isEmpty\n  /// List().isEmpty\n  /// ```\n  abstract isEmpty: Boolean\n\n  /// Tells whether this collection is not empty.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).isNotEmpty\n  /// !List().isNotEmpty\n  /// ```\n  @Since { version = \"0.31.0\" }\n  abstract isNotEmpty: Boolean\n\n  /// The first element in this collection.\n  ///\n  /// Throws if this collection is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).first == 1\n  /// import(\"pkl:test\").catch(() -> List().first)\n  /// ```\n  @AlsoKnownAs { names { \"head\" } }\n  abstract first: Element\n\n  /// Same as [first] but returns [null] if this collection is empty.\n  @AlsoKnownAs { names { \"head\" } }\n  abstract firstOrNull: Element?\n\n  /// The tail of this collection.\n  ///\n  /// Throws if this collection is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).rest == List(2, 3)\n  /// import(\"pkl:test\").catch(() -> List().rest)\n  /// ```\n  @AlsoKnownAs { names { \"tail\" } }\n  abstract rest: Collection<Element>\n\n  /// Same as [rest] but returns [null] if this collection is empty.\n  @AlsoKnownAs { names { \"tail\" } }\n  abstract restOrNull: Collection<Element>?\n\n  /// The last element in this collection.\n  ///\n  /// Throws if this collection is empty.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).last == 3\n  /// import(\"pkl:test\").catch(() -> List().last)\n  /// ```\n  abstract last: Element\n\n  /// Same as [last] but returns [null] if this collection is empty.\n  abstract lastOrNull: Element?\n\n  /// The single element in this collection.\n  ///\n  /// Throws if this collection has zero or more than one element.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1).single == 1\n  /// throws(() -> List().single)\n  /// throws(() -> List(1, 2, 3).single)\n  /// ```\n  abstract single: Element\n\n  /// Same as [single] but returns [null] if this collection is empty or has more than one element.\n  abstract singleOrNull: Element?\n\n  /// Tests if [element] is contained in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).contains(1)\n  /// List(1, 2, 3).contains(2)\n  /// List(1, 2, 3).contains(3)\n  /// !List(1, 2, 3).contains(4)\n  /// ```\n  // TODO: add containsAll\n  abstract function contains(element: Element): Boolean\n\n  /// Tests if this collection starts with the elements in [coll].\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).startsWith(List(1, 2))\n  /// List(1, 2, 3).startsWith(List())\n  /// !List(1, 2, 3).startsWith(List(2, 3))\n  /// ```\n  abstract function startsWith(coll: Collection<Any>): Boolean\n\n  /// Tests if this collection ends with the elements in [coll].\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).endsWith(List(2, 3))\n  /// List(1, 2, 3).endsWith(List())\n  /// !List(1, 2, 3).endsWith(List(1, 2))\n  /// ```\n  abstract function endsWith(coll: Collection<Any>): Boolean\n\n  /// Splits this collection into two at split point [index].\n  ///\n  /// If [index] is zero or [length], one of the two collections is empty.\n  /// Throws if [index] is outside range `0`..[length].\n  abstract function split(index: Int): Pair<Collection<Element>, Collection<Element>>\n\n  /// Same as [split()] but returns [null] if [index] is outside range `0`..[length].\n  abstract function splitOrNull(index: Int): Pair<Collection<Element>, Collection<Element>>?\n\n  abstract function partition(\n    predicate: (Element) -> Boolean,\n  ): Pair<Collection<Element>, Collection<Element>>\n\n  /// The zero-based index of the first occurrence of [element] in this collection.\n  ///\n  /// Throws if this collection does not contains [element].\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).indexOf(2) == 1\n  /// List(1, 2, 2).indexOf(2) == 1\n  /// import(\"pkl:test\").catch(() -> List(1, 2, 3).indexOf(4))\n  /// ```\n  abstract function indexOf(element: Any): Int\n\n  /// Same as [indexOf()] but returns [null] if this collection does not contain [element].\n  abstract function indexOfOrNull(element: Any): Int?\n\n  /// The zero-based index of the last occurrence of [element] in this collection.\n  ///\n  /// Throws if this collection does not contain [element].\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).lastIndexOf(2) == 1\n  /// List(1, 2, 2).lastIndexOf(2) == 2\n  /// import(\"pkl:test\").catch(() -> List(1, 2, 3).lastIndexOf(4))\n  /// ```\n  abstract function lastIndexOf(element: Any): Int\n\n  /// Same as [lastIndexOf()] but returns [null] if this collection does not contain [element].\n  abstract function lastIndexOfOrNull(element: Any): Int?\n\n  /// The first element for which [predicate] returns [true].\n  ///\n  /// Throws if [predicate] does not hold for any element in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(5, 6, 7).find((n) -> n.isEven) == 6\n  /// List(4, 6, 7).find((n) -> n.isEven) == 4\n  /// import(\"pkl:test\").catch(() -> List(5, 7, 9).find((n) -> n.isEven))\n  /// ```\n  abstract function find(predicate: (Element) -> Boolean): Element\n\n  /// Same as [find()] but returns [null] if [predicate] does not hold for any element in this\n  /// collection.\n  abstract function findOrNull(predicate: (Element) -> Boolean): Element?\n\n  /// The last element for which [predicate] returns [true].\n  ///\n  /// Throws if [predicate] does not hold for any element in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(5, 6, 7).findLast((n) -> n.isEven) == 6\n  /// List(4, 6, 8).findLast((n) -> n.isEven) == 8\n  /// List(5, 7, 9).findLast((n) -> n.isEven) == null\n  /// ```\n  abstract function findLast(predicate: (Element) -> Boolean): Any\n\n  /// Same as [findLast()] but returns [null] if [predicate] does not hold for any element in this\n  /// collection.\n  abstract function findLastOrNull(predicate: (Element) -> Boolean): Element?\n\n  /// The index of the first element for which [predicate] returns [true].\n  ///\n  /// Throws  if [predicate] does not hold for any element in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(5, 6, 7).findIndex((n) -> n.isEven) == 1\n  /// List(4, 6, 8).findIndex((n) -> n.isEven) == 0\n  /// import(\"pkl:test\").catch(() -> List(5, 7, 9).findLast((n) -> n.isEven))\n  /// ```\n  @AlsoKnownAs { names { \"indexWhere\" } }\n  abstract function findIndex(predicate: (Element) -> Boolean): Int\n\n  /// Same as [findIndex()] but returns [null] if [predicate] does not hold for any element in this\n  /// collection.\n  @AlsoKnownAs { names { \"indexWhere\" } }\n  abstract function findIndexOrNull(predicate: (Element) -> Boolean): Int?\n\n  /// The index of the last element for which [predicate] returns [true].\n  ///\n  /// Throws if [predicate] does not hold for any element in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(5, 6, 7).findLastIndex((n) -> n.isEven) == 1\n  /// List(4, 6, 8).findLastIndex((n) -> n.isEven) == 2\n  /// import(\"pkl:test\").catch(() -> List(5, 7, 9).findLastIndex((n) -> n.isEven))\n  /// ```\n  @AlsoKnownAs { names { \"lastIndexWhere\" } }\n  abstract function findLastIndex(predicate: (Element) -> Boolean): Int\n\n  /// Same as [findLastIndex()] but returns [null] if [predicate] does not hold for any element in\n  /// this collection.\n  @AlsoKnownAs { names { \"lastIndexWhere\" } }\n  abstract function findLastIndexOrNull(predicate: (Element) -> Boolean): Int?\n\n  /// The number of elements for which [predicate] returns [true].\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).count((n) -> n.isEven) == 1\n  /// List(1, 2, 3).count((n) -> n.isOdd) == 2\n  /// List(1, 2, 3).count((n) -> n > 9) == 0\n  /// ```\n  abstract function count(predicate: (Element) -> Boolean): Int\n\n  /// Tests whether [predicate] holds for every element in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 3, 3).every((n) -> n.isOdd)\n  /// List().every((n) -> n.isOdd)\n  /// !List(1, 2, 3).every((n) -> n.isOdd)\n  /// ```\n  @AlsoKnownAs { names { \"all\"; \"forall\" } }\n  abstract function every(predicate: (Element) -> Boolean): Boolean\n\n  /// Tests whether [predicate] holds for at least one element in this collection.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).any((n) -> n.isEven)\n  /// !List(1, 2, 3).any((n) -> n.isEven)\n  /// !List().any((n) -> n.isEven)\n  /// ```\n  @AlsoKnownAs { names { \"exists\" } }\n  abstract function any(predicate: (Element) -> Boolean): Boolean\n\n  /// Retains elements for which [predicate] holds.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).filter((n) -> n.isOdd) == List(1, 3)\n  /// List(1, 2, 3).filter((n) -> n.isEven) == List(2)\n  /// List(1, 2, 3).filter((n) -> n > 9) == List()\n  /// ```\n  @AlsoKnownAs { names { \"findAll\"; \"where\" } }\n  abstract function filter(predicate: (Element) -> Boolean): Collection<Element>\n\n  /// Retains non-null elements.\n  ///\n  /// Shorthand for `filter((it) -> it != null)`.\n  abstract function filterNonNull(): Collection<Element(this != null)>\n\n  /// Retains elements for which [predicate] holds.\n  ///\n  /// [predicate] takes two arguments: the index of the element, and the element itself.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).filterIndexed((i, n) -> i.isOdd) == List(2)\n  /// List(1, 2, 3).filterIndexed((i, n) -> i.isEven) == List(1, 3)\n  /// List(1, 2, 3).filterIndexed((i, n) -> i.isOdd && n > 2) == List()\n  /// List(1, 2, 3).filterIndexed((i, n) -> i.isEven && n > 2) == List(3)\n  /// ```\n  @AlsoKnownAs { names { \"findAll\"; \"where\" } }\n  abstract function filterIndexed(predicate: (Int, Element) -> Boolean): Collection<Element>\n\n  /// Retains elements whose class is a subclass of [clazz].\n  ///\n  /// Shorthand for `filter((it) -> it is X)`.\n  ///\n  /// Facts:\n  /// ```\n  /// List(42, \"Pigeon\", true, \"Parrot\").filterIsInstance(String) == List(\"Pigeon\", \"Parrot\")\n  /// ```\n  @AlsoKnownAs { names { \"whereType\" } }\n  abstract function filterIsInstance<Type>(clazz: Class<Type>): Collection<Type>\n\n  /// Transforms this collection by applying [transform] to each element.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).map((n) -> n * 2) == List(2, 4, 6)\n  /// List(1, 2, 3).map((n) -> n.isEven) == List(false, true, false)\n  /// ```\n  abstract function map<Result>(transform: (Element) -> Result): Collection<Result>\n\n  /// Transforms this collection by applying [transform] to each element.\n  ///\n  /// [transform] takes two arguments: the index of the element, and the element itself.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).mapIndexed((i, n) -> n * i) == List(0, 2, 6)\n  /// List(1, 2, 3).mapIndexed((i, n) -> i.isOdd && n.isEven) == List(false, true, false)\n  /// ```\n  abstract function mapIndexed<Result>(transform: (Int, Element) -> Result): Collection<Result>\n\n  /// Transforms this collection by applying [transform] to each element and removing resulting\n  /// [null] elements.\n  ///\n  /// Equivalent to `map(transform).filterNonNull()`.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).mapNonNull((n) -> if (n.isOdd) null else n + 2) == List(4)\n  /// ```\n  @AlsoKnownAs { names { \"filterMap\" } }\n  abstract function mapNonNull<Result>(\n    transform: (Element) -> Result,\n  ): Collection<Result(this != null)>\n\n  /// Transforms this collection by applying [transform] to each element and removing resulting\n  /// [null] elements.\n  ///\n  /// [transform] takes two arguments: the index of the element, and the element itself.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3, 4).mapNonNullIndexed((i, n) -> if (n.isOdd) null else n * i) == List(2, 12)\n  /// List(1, 2, 3, 4, null).mapNonNullIndexed((i, n) -> if (n?.isOdd ?? true) null else n * i) == List(2, 12)\n  /// ```\n  @Since { version = \"0.29.0\" }\n  abstract function mapNonNullIndexed<Result>(\n    transform: (Int, Element) -> Result,\n  ): Collection<Result(this != null)>\n\n  /// Applies a collection-generating [transform] to each element in this collection\n  /// and concatenates the resulting collections.\n  ///\n  /// Throws if [transform] produces a non-collection value.\n  abstract function flatMap<Result>(transform: (Element) -> Collection<Result>): Collection<Result>\n\n  /// Applies a collection-generating [transform] to each element in this collection\n  /// and concatenates the resulting collections.\n  ///\n  /// [transform] takes two arguments: the index of the element, and the element itself.\n  ///\n  /// Throws if [transform] produces a non-collection value.\n  abstract function flatMapIndexed<Result>(\n    transform: (Int, Element) -> Collection<Result>,\n  ): Collection<Result>\n\n  /// Concatenates the elements in this collection, each of which must itself be a collection.\n  ///\n  /// Throws if any element is not a collection.\n  /* Note: Can't specify return type precisely. */\n  abstract function flatten(): Collection\n\n  /// Adds [element] to this collection.\n  ///\n  /// For [List], [element] is appended.\n  abstract function add<Other>(element: Other): Collection<Element | Other>\n\n  /// Returns the first [n] elements in this collection.\n  @AlsoKnownAs { names { \"limit\" } }\n  abstract function take(n: Int): Collection<Element>\n\n  /// Returns the last [n] elements in this collection.\n  abstract function takeLast(n: Int): Collection<Element>\n\n  /// Returns the longest prefix of this collection that satisfies [predicate].\n  abstract function takeWhile(predicate: (Element) -> Boolean): Collection<Element>\n\n  /// Returns the longest suffix of this collection that satisfies [predicate].\n  abstract function takeLastWhile(predicate: (Element) -> Boolean): Collection<Element>\n\n  /// Removes the first [n] elements in this collection.\n  @AlsoKnownAs { names { \"skip\" } }\n  abstract function drop(n: Int): Collection<Element>\n\n  /// Removes the last [n] elements in this collection.\n  @AlsoKnownAs { names { \"skipLast\" } }\n  abstract function dropLast(n: Int): Collection<Element>\n\n  /// Removes the longest prefix of this collection that satisfies [predicate].\n  @AlsoKnownAs { names { \"skipWhile\" } }\n  abstract function dropWhile(predicate: (Element) -> Boolean): Collection<Element>\n\n  /// Removes the longest suffix of this collection that satisfies [predicate].\n  @AlsoKnownAs { names { \"skipLastWhile\" } }\n  abstract function dropLastWhile(predicate: (Element) -> Boolean): Collection<Element>\n\n  /// Folds this collection in iteration order using [operator], starting with [initial].\n  abstract function fold<Result>(initial: Result, operator: (Result, Element) -> Result): Result\n\n  /// Folds this collection in reverse iteration order using [operator], starting with [initial].\n  @AlsoKnownAs { names { \"foldRight\" } }\n  abstract function foldBack<Result>(initial: Result, operator: (Element, Result) -> Result): Result\n\n  /// Folds this collection in iteration order using [operator], starting with [initial].\n  ///\n  /// The first parameter of [operator] is the zero-based index of the current element.\n  abstract function foldIndexed<Result>(\n    initial: Result,\n    operator: (Int, Result, Element) -> Result,\n  ): Result\n\n  /// Folds this collection in iteration order using [operator], starting with the first element.\n  ///\n  /// Throws if this collection is empty.\n  abstract function reduce<Result>(operator: (Element | Result, Element) -> Result): Result\n\n  /// Same as [reduce()] but returns [null] if this collection is empty.\n  abstract function reduceOrNull<Result>(operator: (Element | Result, Element) -> Result): Result?\n\n  /// Groups the elements in this collection according to keys returned by [selector].\n  abstract function groupBy<Key>(selector: (Element) -> Key): Map<Key, Collection<Element>>\n\n  /// Concatenates this collection [n] times.\n  abstract function repeat(n: UInt): Collection<Element>\n\n  /// Returns the first element in this collection that is less than or equal to any other element.\n  ///\n  /// Shorthand for `minWith((a, b) -> a < b)`.\n  ///\n  /// Throws if this collection is empty, or if any two elements cannot be compared with `<`.\n  abstract min: Element\n\n  /// Same as [min] but returns [null] if this collection is empty.\n  abstract minOrNull: Element?\n\n  /// Returns the first element in this collection that is less than or equal to any other element\n  /// after applying [selector].\n  ///\n  /// Shorthand for `minWith((a, b) -> selector.apply(a) < selector.apply(b))`.\n  ///\n  /// Throws if this collection is empty or if any two elements cannot be compared with `<`.\n  abstract function minBy(selector: (Element) -> Comparable): Element\n\n  /// Same as [minBy()] but returns [null] if this collection is empty.\n  abstract function minByOrNull(selector: (Element) -> Comparable): Element?\n\n  /// Returns the first element in this collection that is less than or equal to any other element\n  /// according to [comparator].\n  ///\n  /// [comparator] should return [true] if its first argument is less than its second argument, and\n  /// [false] otherwise.\n  ///\n  /// Throws if this collection is empty.\n  abstract function minWith(comparator: (Element, Element) -> Boolean): Element\n\n  /// Same as [minWith()] but returns [null] if this collection is empty.\n  abstract function minWithOrNull(comparator: (Element, Element) -> Boolean): Element?\n\n  /// Returns the first element in this collection that is greater than or equal to any other\n  /// element.\n  ///\n  /// Shorthand for `maxWith((a, b) -> a < b)`.\n  ///\n  /// Throws if this collection is empty, or if any two elements cannot be compared with `<`.\n  abstract max: Element\n\n  /// Same as [max] but returns [null] if this collection empty.\n  abstract maxOrNull: Element\n\n  /// Returns the first element in this collection that is greater than or equal to any other\n  /// element after applying [selector].\n  ///\n  /// Shorthand for `maxWith((a, b) -> selector.apply(a) < selector.apply(b))`.\n  ///\n  /// Throws if this collection is empty, or if any two elements cannot be compared with `<` after\n  /// applying [selector].\n  abstract function maxBy(selector: (Element) -> Comparable): Element\n\n  /// Same as [maxBy()] but returns [null] if this collection is empty.\n  abstract function maxByOrNull(selector: (Element) -> Comparable): Element?\n\n  /// Returns the first element in this collection that is greater than or equal to any other\n  /// element according to [comparator].\n  ///\n  /// [comparator] should return [true] if its first argument is less than its second argument, and\n  /// [false] otherwise.\n  ///\n  /// Throws if this collection is empty.\n  abstract function maxWith(comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int): Element\n\n  /// Same as [maxWith()] but returns [null] if this collection is empty.\n  abstract function maxWithOrNull(\n    comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int,\n  ): Element?\n\n  /// Sorts this collection of [Comparable] elements in ascending order.\n  ///\n  /// Shorthand for `sortWith((a, b) -> a < b)`.\n  ///\n  /// Throws if any two elements in this collection cannot be compared with `<`.\n  abstract function sort(): List<Element>\n\n  /// Sorts this collection in ascending order after applying [selector].\n  ///\n  /// Shorthand for `sortWith((a, b) -> selector.apply(a) < selector.apply(b))`.\n  ///\n  /// Throws if any two elements in this collection cannot be compared with `<` after applying\n  /// [selector].\n  abstract function sortBy(selector: (Element) -> Comparable): Collection<Element>\n\n  /// Sorts this collection according to [comparator].\n  ///\n  /// [comparator] should return [true] if its first argument\n  /// comes before its second argument in the sort order, and [false] otherwise.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).sortWith((a, b) -> a > b)) == List(3, 2, 1)\n  /// ```\n  abstract function sortWith(\n    comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int,\n  ): Collection<Element>\n\n  /// Reverses the order of elements in this collection.\n  abstract function reverse(): Collection<Element>\n\n  /// Returns a collection that combines corresponding elements of [this] and [coll] in pairs.\n  ///\n  /// The returned collection's length is the minimum of `this.length` and `coll.length`.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).zip(List(4, 5, 6)) == List(Pair(1, 4), Pair(2, 5), Pair(3, 6))\n  /// List(1, 2, 3).zip(List(4, 5, 6, 7, 8)) == List(Pair(1, 4), Pair(2, 5), Pair(3, 6))\n  /// ```\n  abstract function zip<Other>(coll: Collection<Other>): Collection<Pair<Element, Other>>\n\n  /// Converts the elements of this collection to strings and concatenates them inserting\n  /// [separator] between elements.\n  abstract function join(separator: String): String\n\n  /// Converts this collection to a list.\n  ///\n  /// Returns this collection if it already is a list.\n  abstract function toList(): List<Element>\n\n  /// Converts this collection to a set.\n  ///\n  /// Returns this collection if it already is a set.\n  abstract function toSet(): Set<Element>\n\n  /// Converts this collection to a map by extracting a key and value from each element using the\n  /// given functions.\n  abstract function toMap<Key, Value>(\n    keyExtractor: (Element) -> Key,\n    valueExtractor: (Element) -> Value,\n  ): Map<Key, Value>\n\n  /// Converts this collection to a [Listing].\n  abstract function toListing(): Listing<Element>\n\n  /// Converts this collection to a [Dynamic] object.\n  abstract function toDynamic(): Dynamic\n}\n\n/// Constructs an [IntSeq] with the given [start], [end], and step 1.\n///\n/// To set a step other than 1, use method [IntSeq.step()].\nexternal const function IntSeq(start: Int, end: Int): IntSeq\n\n/// A finite arithmetic sequence of integers.\n///\n/// A sequence has a [start], [end], and [step].\n/// It is either ascending ([step] > 0) or descending ([step] < 0).\n/// The default [step] is 1.\n///\n/// The members of a sequence are defined as:\n///\n/// - seq(0) = [start] + 0 * [step]\n/// - seq(1) = [start] + 1 * [step]\n/// - seq(2) = [start] + 2 * [step]\n/// - etc. where seq(n) <= [end] if [step] > 0, and seq(n) >= [end] if [step] < 0\n///\n/// ## Construction\n///\n/// To construct a sequence, use method [IntSeq()]:\n/// ```\n/// ascending = IntSeq(2, 5)\n/// empty = IntSeq(5, 2)\n/// ```\n///\n/// To set a step other than 1, use method [step()]:\n/// ```\n/// descending = IntSeq(5, 2).step(-2)\n/// ```\n///\n/// ## Iteration\n///\n/// To iterate over a sequence, use method [map()]:\n/// ```\n/// numbers = IntSeq(2, 5).map((n) -> n * 2)\n/// ```\n///\n/// A sequence can also be iterated over in a *for-generator*:\n/// ```\n/// numbers {\n///   for (n in IntSeq(2, 5)) {\n///     n * 2\n///   }\n/// }\n/// ```\n///\n/// ## Equality\n///\n/// Two sequences are equal if and only if they contain the same members in the same order.\n///\n/// Facts:\n/// ```\n/// IntSeq(2, 5) == IntSeq(2, 5)\n/// IntSeq(2, -3) == IntSeq(2, -2) // both empty\n/// IntSeq(2, 5).step(2) == IntSeq(2, 4).step(2)\n/// ```\nexternal class IntSeq extends Any {\n  /// The start of this sequence.\n  ///\n  /// Facts:\n  /// ```\n  /// IntSeq(2, 5).start == 2\n  /// ```\n  external start: Int\n\n  /// The inclusive end of this sequence.\n  ///\n  /// Note that [end] may or may not be a member of this sequence.\n  ///\n  /// Facts:\n  /// ```\n  /// IntSeq(2, 5).start == 5\n  /// ```\n  external end: Int\n\n  /// The common difference of successive members of this sequence.\n  ///\n  /// Facts:\n  /// ```\n  /// IntSeq(5, 2).step == 1\n  /// IntSeq(5, 2).step(-2).step == -2\n  /// ```\n  external step: Int(isNonZero)\n\n  /// Changes [step] to [newValue].\n  ///\n  /// Facts:\n  /// ```\n  /// IntSeq(5, 2).step == 1\n  /// IntSeq(5, 2).step(-2).step == -2\n  /// ```\n  external function step(newValue: Int(isNonZero)): IntSeq\n\n  /// Folds this sequence in iteration order using [operator], starting with [initial].\n  external function fold<Result>(initial: Result, operator: (Result, Int) -> Result): Result\n\n  /// Applies [mapper] to each member of this sequence and returns the resulting values as a list.\n  ///\n  /// Facts:\n  /// ```\n  /// IntSeq(2, 5).map((it) -> it) == List(2, 3, 4, 5)\n  /// IntSeq(5, 2).map((it) -> it) == List()\n  /// IntSeq(5, 2).step(-1).map((it) -> it * 2) == List(10, 8, 6, 4)\n  /// ```\n  external function map<Result>(mapper: (Int) -> Result): List<Result>\n\n  /// Converts the elements of this sequence to a [List].\n  external function toList(): List<Int>\n\n  /// Converts the elements of this sequence to a [Listing].\n  external function toListing(): Listing<Int>\n}\n\n/// A variable number of method arguments of type [Type].\n///\n/// The purpose of this class is to document methods that accept a variable number of arguments.\n/// Only standard library methods can accept a variable number of arguments.\nexternal class VarArgs<Type>\n\n/// Creates a list containing the given [elements].\n///\n/// This method accepts any number of arguments.\n///\n/// Facts:\n/// ```\n/// List().isEmpty\n/// List(\"one\", \"two\", \"three\").contains(\"two\")\n/// ```\nexternal const function List<Element>(elements: VarArgs<Element>): List<Element>\n\n/// An indexed sequence of elements.\n///\n/// The following operators are supported for lists:\n/// ```\n/// list[3]       // subscript\n/// list1 + list2 // concatenation\n/// ```\nexternal class List<out Element> extends Collection<Element> {\n  external length: Int\n\n  external isEmpty: Boolean\n\n  @Since { version = \"0.31.0\" }\n  external isNotEmpty: Boolean\n\n  /// The index of the last element in this list (same as `length - 1`).\n  ///\n  /// Returns `-1` for an empty list.\n  external lastIndex: Int\n\n  /// Returns the element at [index].\n  ///\n  /// Returns [null] if [index] is outside the bounds of this list.\n  ///\n  /// Facts:\n  /// ```\n  /// List(3, 9, 6).getOrNull(0) == 3\n  /// List(3, 9, 6).getOrNull(1) == 9\n  /// List(3, 9, 6).getOrNull(2) == 6\n  /// List(3, 9, 6).getOrNull(-1) == null\n  /// List(3, 9, 6).getOrNull(3) == null\n  /// List(3, 9, 6).getOrNull(99) == null\n  /// ```\n  external function getOrNull(index: Int): Element?\n\n  /// Returns the sublist from [start] until [exclusiveEnd].\n  ///\n  /// Throws if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n  /// [start]..[length].\n  ///\n  /// Facts:\n  /// ```\n  /// List(3, 9, 6).sublist(0, 1) == List(3)\n  /// List(3, 9, 6).sublist(0, 2) == List(3, 9)\n  /// List(3, 9, 6).sublist(1, 3) == List(9, 6)\n  /// List(3, 9, 6).sublist(0, 3) == List(3, 9, 6)\n  /// List(3, 9, 6).sublist(-1, 2) // error\n  /// List(3, 9, 6).sublist(1, 4)  // error\n  /// List(3, 9, 6).sublist(9, 99) // error\n  /// ```\n  external function sublist(start: Int, exclusiveEnd: Int): List<Element>\n\n  /// Returns the sublist from [start] until [exclusiveEnd].\n  ///\n  /// Returns [null] if [start] is outside range `0`..[length] or [exclusiveEnd] is outside range\n  /// [start]..[length].\n  ///\n  /// Facts:\n  /// ```\n  /// List(3, 9, 6).sublistOrNull(0, 1) == List(3)\n  /// List(3, 9, 6).sublistOrNull(0, 2) == List(3, 9)\n  /// List(3, 9, 6).sublistOrNull(1, 3) == List(9, 6)\n  /// List(3, 9, 6).sublistOrNull(0, 3) == List(3, 9, 6)\n  /// List(3, 9, 6).sublistOrNull(-1, 2) == null\n  /// List(3, 9, 6).sublistOrNull(1, 4) == null\n  /// List(3, 9, 6).sublistOrNull(9, 99) == null\n  /// ```\n  external function sublistOrNull(start: Int, exclusiveEnd: Int): List<Element>?\n\n  external first: Element\n  external firstOrNull: Element?\n\n  external rest: List<Element>\n  external restOrNull: List<Element>?\n\n  external last: Element\n  external lastOrNull: Element?\n\n  external single: Element\n  external singleOrNull: Element?\n\n  external function contains(element: Any): Boolean\n  external function startsWith(coll: Collection<Any>): Boolean\n  external function endsWith(coll: Collection<Any>): Boolean\n\n  external function split(index: Int): Pair<List<Element>, List<Element>>\n  external function splitOrNull(index: Int): Pair<List<Element>, List<Element>>?\n  external function partition(predicate: (Element) -> Boolean): Pair<List<Element>, List<Element>>\n\n  external function filter(predicate: (Element) -> Boolean): List<Element>\n  external function filterNonNull(): List<Element(this != null)>\n  external function map<Result>(transform: (Element) -> Result): List<Result>\n  external function mapNonNull<Result>(transform: (Element) -> Result): List<Result(this != null)>\n  external function flatMap<Result>(transform: (Element) -> Collection<Result>): List<Result>\n\n  external function filterIndexed(predicate: (Int, Element) -> Boolean): List<Element>\n  external function mapIndexed<Result>(transform: (Int, Element) -> Result): List<Result>\n\n  @Since { version = \"0.29.0\" }\n  external function mapNonNullIndexed<Result>(\n    transform: (Int, Element) -> Result,\n  ): List<Result(this != null)>\n  external function flatMapIndexed<Result>(\n    transform: (Int, Element) -> Collection<Result>,\n  ): List<Result>\n\n  external function filterIsInstance<Type>(clazz: Class<Type>): List<Type>\n\n  /// Tells whether this list contains no duplicate elements.\n  ///\n  /// Equivalent to `length == toSet().length`.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).isDistinct\n  /// !List(1, 2, 1).isDistinct\n  /// ```\n  @AlsoKnownAs { names { \"isUnique\" } }\n  external isDistinct: Boolean\n\n  /// Tells whether this list contains no duplicate elements after applying [selector].\n  ///\n  /// Facts:\n  /// ```\n  /// List(\"a\", \"b\", \"abc\").isDistinctBy((it) -> it.length)\n  /// !List(\"a\", \"ab\", \"c\").isDistinctBy((it) -> it.length)\n  /// ```\n  @AlsoKnownAs { names { \"isUniqueBy\" } }\n  external function isDistinctBy(selector: (Element) -> Any): Boolean\n\n  /// Removes duplicate elements from this list, preserving the first occurrence of each element.\n  ///\n  /// Equivalent to `toSet().toList()`.\n  ///\n  /// Facts:\n  /// ```\n  /// List(1, 2, 3).distinct == List(1, 2, 3)\n  /// List(1, 2, 1).distinct == List(1, 2)\n  /// ```\n  @AlsoKnownAs { names { \"unique\" } }\n  external distinct: List<Element>\n\n  /// Removes elements that are duplicates after applying [selector] from this list, preserving the\n  /// first occurrence.\n  ///\n  /// Facts:\n  /// ```\n  /// List(\"a\", \"b\", \"abc\").distinctBy((it) -> it.length) == List(\"a\", \"b\", \"abc\")\n  /// List(\"a\", \"ab\", \"c\").distinctBy((it) -> it.length) == List(\"a\", \"ab\")\n  /// ```\n  @AlsoKnownAs { names { \"uniqueBy\" } }\n  external function distinctBy(selector: (Element) -> Any): List<Element>\n\n  external function flatten(): List\n\n  external function every(predicate: (Element) -> Boolean): Boolean\n  external function any(predicate: (Element) -> Boolean): Boolean\n\n  external function add<Other>(element: Other): List<Element | Other>\n\n  /// Replaces the element at [index] with [replacement].\n  ///\n  /// Throws if [index] is outside the bounds of this list.\n  external function replace<Other>(index: Int, replacement: Other): List<Element | Other>\n\n  /// Replaces the element at [index] with [replacement].\n  ///\n  /// Returns [null] if [index] is outside the bounds of this list.\n  external function replaceOrNull<Other>(index: Int, replacement: Other): List<Element | Other>?\n\n  /// Replaces the elements between indices [range] and [exclusiveEnd] with [replacement].\n  ///\n  /// Throws if [range] or [exclusiveEnd] is outside the bounds of this list.\n  external function replaceRange<Other>(\n    start: Int,\n    exclusiveEnd: Int,\n    replacement: Collection<Other>,\n  ): List<Element | Other>\n\n  /// Replaces the elements between indices [range] and [exclusiveEnd] with [replacement].\n  ///\n  /// Returns [null] if [range] or [exclusiveEnd] is outside the bounds of this list.\n  external function replaceRangeOrNull<Other>(\n    start: Int,\n    exclusiveEnd: Int,\n    replacement: Collection<Other>,\n  ): List<Element | Other>?\n\n  external function find(predicate: (Element) -> Boolean): Element\n  external function findOrNull(predicate: (Element) -> Boolean): Element?\n\n  external function findLast(predicate: (Element) -> Boolean): Element\n  external function findLastOrNull(predicate: (Element) -> Boolean): Element?\n\n  external function findIndex(predicate: (Element) -> Boolean): Int\n  external function findIndexOrNull(predicate: (Element) -> Boolean): Int?\n\n  external function findLastIndex(predicate: (Element) -> Boolean): Int\n  external function findLastIndexOrNull(predicate: (Element) -> Boolean): Int?\n\n  external function indexOf(element: Any): Int\n  external function indexOfOrNull(element: Any): Int?\n\n  external function lastIndexOf(element: Any): Int\n  external function lastIndexOfOrNull(element: Any): Int?\n\n  external function count(predicate: (Element) -> Boolean): Int\n\n  external function take(n: Int): List<Element>\n  external function takeWhile(predicate: (Element) -> Boolean): List<Element>\n  external function takeLast(n: Int): List<Element>\n  external function takeLastWhile(predicate: (Element) -> Boolean): List<Element>\n\n  external function drop(n: Int): List<Element>\n  external function dropWhile(predicate: (Element) -> Boolean): List<Element>\n  external function dropLast(n: Int): List<Element>\n  external function dropLastWhile(predicate: (Element) -> Boolean): List<Element>\n\n  external function fold<Result>(initial: Result, operator: (Result, Element) -> Result): Result\n  external function foldBack<Result>(initial: Result, operator: (Element, Result) -> Result): Result\n  external function foldIndexed<Result>(\n    initial: Result,\n    operator: (Int, Result, Element) -> Result,\n  ): Result\n\n  external function reduce<Result>(operator: (Element | Result, Element) -> Result): Result\n  external function reduceOrNull<Result>(operator: (Element | Result, Element) -> Result): Result?\n\n  external function groupBy<Key>(selector: (Element) -> Key): Map<Key, List<Element>>\n\n  external function repeat(n: Int): List<Element>\n\n  external min: Element\n  external minOrNull: Element\n\n  external function minBy(selector: (Element) -> Comparable): Element\n  external function minByOrNull(selector: (Element) -> Comparable): Element?\n\n  external function minWith(comparator: (Element, Element) -> Boolean): Element\n  external function minWithOrNull(comparator: (Element, Element) -> Boolean): Element?\n\n  external max: Element\n  external maxOrNull: Element?\n\n  external function maxBy(selector: (Element) -> Comparable): Element\n  external function maxByOrNull(selector: (Element) -> Comparable): Element?\n\n  external function maxWith(comparator: (Element, Element) -> Boolean): Element\n  external function maxWithOrNull(comparator: (Element, Element) -> Boolean): Element?\n\n  external function sort(): List<Element>\n  external function sortBy(selector: (Element) -> Comparable): List<Element>\n  external function sortWith(comparator: (Element, Element) -> Boolean): List<Element>\n\n  external function reverse(): List<Element>\n\n  external function zip<Other>(coll: Collection<Other>): List<Pair<Element, Other>>\n\n  external function join(separator: String): String\n\n  external function toList(): List<Element>\n\n  external function toSet(): Set<Element>\n\n  external function toMap<Key, Value>(\n    keyExtractor: (Element) -> Key,\n    valueExtractor: (Element) -> Value,\n  ): Map<Key, Value>\n\n  external function toListing(): Listing<Element>\n\n  external function toDynamic(): Dynamic\n\n  /// Converts this list to [Bytes].\n  ///\n  /// Throws a type error if any of its elements are not [UInt8].\n  @Since { version = \"0.29.0\" }\n  external function toBytes(): Bytes\n}\n\n/// Creates a set containing the given [elements].\n///\n/// This method accepts any number of arguments.\n///\n/// Facts:\n/// ```\n/// Set().isEmpty\n/// Set(\"one\", \"two\", \"three\").contains(\"two\")\n/// ```\nexternal const function Set<Element>(elements: VarArgs<Element>): Set<Element>\n\n/// A collection of unique elements.\n///\n/// Sets retain the order of elements when constructed, which affects the how they are iterated\n/// over.\n/// However, ordering does not affect equality between two sets.\n///\n/// The following operators are supported for sets:\n/// ```\n/// set1 + set2  // union\n/// ```\nexternal class Set<out Element> extends Collection<Element> {\n  external length: Int\n\n  external isEmpty: Boolean\n\n  @Since { version = \"0.31.0\" }\n  external isNotEmpty: Boolean\n\n  external first: Element\n  external firstOrNull: Element?\n\n  external rest: Set<Element>\n  external restOrNull: Set<Element>?\n\n  external last: Element\n  external lastOrNull: Element?\n\n  external single: Element\n  external singleOrNull: Element?\n\n  external function contains(element: Any): Boolean\n  external function startsWith(coll: Collection<Any>): Boolean\n  external function endsWith(coll: Collection<Any>): Boolean\n\n  external function split(index: Int): Pair<Set<Element>, Set<Element>>\n  external function splitOrNull(index: Int): Pair<Set<Element>, Set<Element>>?\n  external function partition(predicate: (Element) -> Boolean): Pair<Set<Element>, Set<Element>>\n\n  external function filter(predicate: (Element) -> Boolean): Set<Element>\n  external function filterNonNull(): Set<Element(this != null)>\n  external function map<Result>(transform: (Element) -> Result): Set<Result>\n  external function mapNonNull<Result>(transform: (Element) -> Result): Set<Result(this != null)>\n  external function flatMap<Result>(transform: (Element) -> Collection<Result>): Set<Result>\n\n  external function filterIndexed(predicate: (Int, Element) -> Boolean): Set<Element>\n  external function mapIndexed<Result>(transform: (Int, Element) -> Result): Set<Result>\n\n  @Since { version = \"0.29.0\" }\n  external function mapNonNullIndexed<Result>(\n    transform: (Int, Element) -> Result,\n  ): Set<Result(this != null)>\n  external function flatMapIndexed<Result>(\n    transform: (Int, Element) -> Collection<Result>,\n  ): Set<Result>\n\n  external function filterIsInstance<Type>(clazz: Class<Type>): Set<Type>\n\n  external function flatten(): Set\n\n  external function every(predicate: (Element) -> Boolean): Boolean\n  external function any(predicate: (Element) -> Boolean): Boolean\n\n  external function add<Other>(element: Other): Set<Element | Other>\n\n  external function find(predicate: (Element) -> Boolean): Element\n  external function findOrNull(predicate: (Element) -> Boolean): Element?\n\n  external function findLast(predicate: (Element) -> Boolean): Element\n  external function findLastOrNull(predicate: (Element) -> Boolean): Element?\n\n  external function count(predicate: (Element) -> Boolean): Int\n\n  external function take(n: Int): Set<Element>\n  external function takeWhile(predicate: (Element) -> Boolean): Set<Element>\n  external function takeLast(n: Int): Set<Element>\n  external function takeLastWhile(predicate: (Element) -> Boolean): Set<Element>\n\n  external function drop(n: Int): Set<Element>\n  external function dropWhile(predicate: (Element) -> Boolean): Set<Element>\n  external function dropLast(n: Int): Set<Element>\n  external function dropLastWhile(predicate: (Element) -> Boolean): Set<Element>\n\n  external function fold<Result>(initial: Result, operator: (Result, Element) -> Result): Result\n  external function foldBack<Result>(initial: Result, operator: (Element, Result) -> Result): Result\n  external function foldIndexed<Result>(\n    initial: Result,\n    operator: (Int, Result, Element) -> Result,\n  ): Result\n\n  external function reduce<Result>(operator: (Element | Result, Element) -> Result): Result\n  external function reduceOrNull<Result>(operator: (Element | Result, Element) -> Result): Result?\n\n  external function groupBy<Key>(selector: (Element) -> Key): Map<Key, Set<Element>>\n\n  external function repeat(n: Int): List<Element>\n\n  external min: Element\n  external minOrNull: Element\n\n  external function minBy(selector: (Element) -> Int): Element\n  external function minByOrNull(selector: (Element) -> Int): Element?\n\n  external function minWith(comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int): Element\n  external function minWithOrNull(\n    comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int,\n  ): Element?\n\n  external max: Element\n  external maxOrNull: Element?\n\n  external function maxBy(selector: (Element) -> Int): Element\n  external function maxByOrNull(selector: (Element) -> Int): Element?\n\n  external function maxWith(comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int): Element\n  external function maxWithOrNull(\n    comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int,\n  ): Element?\n\n  external function sort(): List<Element>\n  external function sortBy(selector: (Element) -> Comparable): List<Element>\n  external function sortWith(\n    comparator: (Element, Element) -> Boolean | /*Deprecated*/ Int,\n  ): List<Element>\n\n  external function reverse(): List<Element>\n\n  external function zip<Other>(coll: Collection<Other>): Set<Pair<Element, Other>>\n\n  external function join(separator: String): String\n\n  external function toList(): List<Element>\n\n  external function toSet(): Set<Element>\n\n  external function toMap<Key, Value>(\n    keyExtractor: (Element) -> Key,\n    valueExtractor: (Element) -> Value,\n  ): Map<Key, Value>\n\n  external function toListing(): Listing<Element>\n\n  external function toDynamic(): Dynamic\n\n  /// The intersection of this set and [other].\n  external function intersect(other: Set): Set<Element>\n\n  /// The difference of this set and [other].\n  external function difference(other: Set): Set<Element>\n}\n\n/// Creates a map containing the given alternating [keysAndValues].\n///\n/// This method accepts any even number of arguments.\n/// Facts:\n/// ```\n/// Map().isEmpty\n/// Map(\"name\", \"Pigeon\", \"age\", 42).keys == Set(\"name\", \"age\")\n/// Map(\"name\", \"Pigeon\", \"age\", 42).values == Set(\"Pigeon\", 42)\n/// ```\nexternal const function Map<Key, Value>(keysAndValues: VarArgs<Key | Value>): Map<Key, Value>\n\n/// A mapping from keys to values.\n///\n/// Maps retain the order of entries when constructed, which affects the how they are iterated\n/// over.\n/// However, ordering of entries does not affect equality between two maps.\n///\n/// The following operators are supported for maps:\n/// ```\n/// map[key]     // subscript; similar to `getOrNull` but throws if key not found\n/// map1 + map2  // merge; if both maps have an entry with the same key, the entry in map2 wins\n/// ```\n/* Note: [Key] can be co-variant as long as [getOrNull], [containsKey], and similar methods admit keys of type [Any]. */\nexternal class Map<out Key, out Value> extends Any {\n  /// The number of entries in this map.\n  external length: Int\n\n  /// Tells whether this map is empty.\n  external isEmpty: Boolean\n\n  /// Tells whether this map not empty.\n  @Since { version = \"0.31.0\" }\n  external isNotEmpty: Boolean\n\n  /// Returns the value for [key].\n  ///\n  /// Returns [null] if this map does not contain [key].\n  external function getOrNull(key: Any): Value?\n\n  /// The keys contained in this map.\n  external keys: Set<Key>\n\n  /// The values contained in this map.\n  external values: List<Value>\n\n  /// The entries contained in this map.\n  external entries: List<Pair<Key, Value>>\n\n  /// Tells if this map contains an entry with the given key.\n  external function containsKey(key: Any): Boolean\n\n  /// Tells if this map contains an entry with the given value.\n  external function containsValue(value: Any): Boolean\n\n  /// Adds or updates [key] to [value].\n  external function put<NewKey, NewValue>(\n    key: NewKey,\n    value: NewValue,\n  ): Map<NewKey | Key, NewValue | Value>\n\n  /// Removes the map entry with the given key.\n  ///\n  /// Returns this map unchanged if it does not contain an entry with the given key.\n  external function remove(key: Any): Map<Key, Value>\n\n  /// Removes all entries for which [predicate] does not hold.\n  external function filter(predicate: (Key, Value) -> Boolean): Map<Key, Value>\n\n  /// Folds the entries of this map in iteration order using [operator], starting with [initial].\n  external function fold<Result>(initial: Result, operator: (Result, Key, Value) -> Result): Result\n\n  /// Transforms the entries of this map using [transform].\n  external function map<NewKey, NewValue>(\n    transform: (Key, Value) -> Pair<NewKey, NewValue>,\n  ): Map<NewKey, NewValue>\n\n  /// Transforms the keys of this map using [transform].\n  external function mapKeys<NewKey>(transform: (Key, Value) -> NewKey): Map<NewKey, Value>\n\n  /// Transforms the values of this map using [transform].\n  external function mapValues<NewValue>(transform: (Key, Value) -> NewValue): Map<Key, NewValue>\n\n  /// Applies a map-generating [transform] to each map entry and concatenates the resulting maps.\n  external function flatMap<NewKey, NewValue>(\n    transform: (Key, Value) -> Map<NewKey, NewValue>,\n  ): Map<NewKey, NewValue>\n\n  /// Tells if [predicate] holds for every entry of this map.\n  ///\n  /// Returns [true] for an empty map.\n  external function every(predicate: (Key, Value) -> Boolean): Boolean\n\n  /// Tells if [predicate] holds for at least one entry of this map.\n  ///\n  /// Returns [false] for an empty map.\n  external function any(predicate: (Key, Value) -> Boolean): Boolean\n\n  /// Returns this map.\n  external function toMap(): Map\n\n  /// Converts this map to a [Dynamic] object.\n  external function toDynamic(): Dynamic\n\n  /// Converts this map to a typed object of class [clazz].\n  ///\n  /// Conforms to the semantics of the following manual conversion:\n  /// ```\n  /// class Person { name: String; age: Int }\n  /// map = Map(name, \"Pigeon\", age, 42)\n  /// function toTyped(map: Map): Person = new {\n  ///   name = map.getOrNull(\"name\") ?? super.name\n  ///   age = map.getOrNull(\"age\") ?? super.age\n  /// }\n  /// ```\n  ///\n  /// Notable behavior:\n  /// - Entries of [this] that have no corresponding property in [clazz] are ignored.\n  /// - [clazz] properties that have no corresponding entry in [this] have their defaults preserved.\n  /// - [clazz] properties that have neither a default nor a corresponding entry in [this]\n  ///   throw an \"undefined property\" error (only) when accessed.\n  ///\n  /// Throws if [clazz] is abstract or not a subclass of [Typed].\n  external function toTyped<Type>(clazz: Class<Type>): Type(this is Typed)\n\n  /// Converts this map to a [Mapping].\n  external function toMapping(): Mapping<Key, Value>\n}\n\n/// Creates [Bytes] from the given numbers.\n///\n/// Examples:\n/// ```\n/// bytes = Bytes(0x1, 0x2, 0x3, 0x4)\n/// ```\n@Since { version = \"0.29.0\" }\nexternal const function Bytes(values: VarArgs<UInt8>): Bytes\n\n/// A sequence of [UInt8] values.\n///\n/// Bytes can hold up to [math.maxInt] amount of bytes.\n///\n/// The following operators are supported for [Bytes]:\n/// ```\n/// bytes1 + bytes2  // concatenation\n/// bytes[3]         // subscript\n/// ```\n///\n/// For other list-like procedures, convert this into a [List] using [toList()].\n@Since { version = \"0.29.0\" }\nexternal class Bytes extends Any {\n  /// The length of these bytes.\n  external length: Int\n\n  /// The number of bytes as [DataSize].\n  external size: DataSize\n\n  /// The bytes in base64 encoding.\n  external base64: String(isBase64)\n\n  /// The bytes in hexadecimal encoding.\n  external hex: String\n\n  /// The [MD5](https://en.wikipedia.org/wiki/MD5) hash of these bytes as hexadecimal string.\n  ///\n  /// MD5 is cryptographically broken and should not be used for secure applications.\n  external md5: String\n\n  /// The [SHA-1](https://en.wikipedia.org/wiki/SHA-1) hash of these bytes as hexadecimal string.\n  ///\n  /// SHA-1 is cryptographically broken and should not be used for secure applications.\n  external sha1: String\n\n  /// The [SHA-256](https://en.wikipedia.org/wiki/SHA-2) cryptographic hash of these bytes as\n  /// hexadecimal string.\n  external sha256: String\n\n  /// The first 64 bits of the [SHA-256](https://en.wikipedia.org/wiki/SHA-2) cryptographic hash of\n  /// these bytes.\n  external sha256Int: Int\n\n  /// Returns the element at [index].\n  ///\n  /// Returns [null] if [index] is outside the bounds of these Bytes.\n  ///\n  /// Facts:\n  /// ```\n  /// Bytes(3, 9, 6).getOrNull(0) == 3\n  /// Bytes(3, 9, 6).getOrNull(1) == 9\n  /// Bytes(3, 9, 6).getOrNull(2) == 6\n  /// Bytes(3, 9, 6).getOrNull(-1) == null\n  /// Bytes(3, 9, 6).getOrNull(3) == null\n  /// Bytes(3, 9, 6).getOrNull(99) == null\n  /// ```\n  external function getOrNull(index: Int): UInt8?\n\n  /// Converts these bytes into a string using the given [charset].\n  ///\n  /// Throws if these bytes are invalid according to the given [charset].\n  external function decodeToString(charset: Charset): String\n\n  /// Converts these bytes into a [List].\n  external function toList(): List<UInt8>\n}\n"
  },
  {
    "path": "stdlib/doc-package-info.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// The Pkl standard library.\n///\n/// The standard library is a set of Pkl modules versioned and distributed together with the language.\n///\n/// To import a standard library module, use `import \"pkl:<identifier>\"`.\n/// For example, `import \"pkl:json\"` imports the `pkl.json` module.\n///\n/// The `pkl.base` module defines the most fundamental properties, methods, and classes for using Pkl.\n/// Its members are automatically available in every module and hence it does not need to be imported.\n///\n/// The default module allowlist (`--allowed-modules`) grants access to all standard library modules.\namends \"pkl:DocPackageInfo\"\n\nimport \"pkl:release\"\n\nlocal current = release.current\n\nname = \"pkl\"\nversion = (current.version) { build = null }.toString()\nimportUri = \"pkl:/\"\nauthors {\n  \"pkl-oss@group.apple.com\"\n}\nsourceCode =\n  let (commitish = if (current.version.isNormal()) current.version else current.commitId)\n    \"https://github.com/apple/pkl/blob/\\(commitish)/stdlib/\"\nissueTracker = \"https://github.com/apple/pkl/issues\"\n"
  },
  {
    "path": "stdlib/gradle.lockfile",
    "content": "# This is a Gradle generated file for dependency locking.\n# Manual edits can break the build and are not advised.\n# This file is expected to be part of source control.\nempty=signatures\n"
  },
  {
    "path": "stdlib/json.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A JSON parser.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.json\n\n/// Annotate properties of classes and modules with this class to override how a [JsonRenderer]\n/// interprets a property's name.\n@Since { version = \"0.31.0\" }\nclass Property extends ConvertProperty {\n  /// The new name to use for the annotated property when rendered by [JsonRenderer].\n  name: String\n\n  render = (prop, renderer) -> if (renderer is JsonRenderer) Pair(name, prop.value) else prop\n}\n\n/// A JSON parser.\n///\n/// JSON values are mapped to Pkl values as follows:\n///\n/// | JSON type   | Pkl type                                                |\n/// | ----------- | ------------------------------------------------------- |\n/// | null        | [Null]                                                  |\n/// | Boolean     | [Boolean]                                               |\n/// | Number      | [Number]                                                |\n/// | String      | [String]                                                |\n/// | Array       | [Listing]                                               |\n/// | Object      | [Dynamic] or [Mapping] depending on [Parser.useMapping] |\n///\n/// The element order of JSON arrays and objects is maintained.\nclass Parser {\n  /// Determines what the parser produces when parsing JSON objects.\n  ///\n  /// If [true], they turn into a [Mapping].\n  /// Otherwise, they turn into a [Dynamic].\n  ///\n  /// If [useMapping] is [false], JSON object properties named \"default\" will be shadowed by the\n  /// built-in [Dynamic.default] property.\n  useMapping: Boolean = false\n\n  /// Value converters to apply to parsed values.\n  ///\n  /// For further information see [PcfRenderer.converters].\n  converters: Mapping<Class | String(!isEmpty), (unknown) -> unknown>\n\n  /// Parses [source] as a JSON document.\n  ///\n  /// Throws if an error occurs during parsing.\n  ///\n  /// If [source] is a [Resource], the resource URI is included in parse error messages.\n  external function parse(source: Resource | String): Value\n}\n\n/// Pkl representation of a JSON value.\ntypealias Value = Null | Boolean | Number | String | Listing | Dynamic | Mapping\n"
  },
  {
    "path": "stdlib/jsonnet.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A [Jsonnet](https://jsonnet.org) renderer.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.jsonnet\n\n/// Constructs an [ImportStr].\nfunction ImportStr(_path: String): ImportStr = new { path = _path }\n\n/// Constructs an [ExtVar].\nfunction ExtVar(_name: String): ExtVar = new { name = _name }\n\n/// Renders values as [Jsonnet](https://jsonnet.org).\n///\n/// Pkl values are mapped to Jsonnet values as follows:\n///\n/// | Pkl type       | Jsonnet type    |\n/// | -------------- | --------------- |\n/// | [Null]         | null            |\n/// | [Boolean]      | boolean         |\n/// | [Int]          | number          |\n/// | [Float]        | number          |\n/// | [String]       | string          |\n/// | [List]         | array           |\n/// | [Set]          | array           |\n/// | [Map]          | object          |\n/// | [Listing]      | array           |\n/// | [Mapping]      | object          |\n/// | [Dynamic]      | object or array |\n/// | [Typed]        | object          |\n///\n/// Some Pkl types, such as [Duration] and [DataSize], don't have a Jsonnet equivalent.\n/// To render values of such types, define _output converters_ (see [Renderer.converters]).\n///\n/// The output is formatted according to _jsonnetfmt_.\n/// To render an `importstr` construct, use [ImportStr()].\n/// To render an `std.extVar()` call, use [ExtVar()].\n///\n/// Example:\n/// ```\n/// import \"pkl:jsonnet\"\n///\n/// server {\n///   name = \"Pigeon\"\n///   port = jsonnet.ExtVar(\"port\")\n///   message = jsonnet.ImportStr(\"/etc/motd\")\n///   timeout = 5.min\n/// }\n///\n/// output {\n///   renderer = new jsonnet.Renderer {}\n///   converters {\n///     [Duration] = (it) -> it.value + it.unit\n///   }\n/// }\n/// ```\n///\n/// The [Property] annotation can be used to change how a property name renders into Jsonnet.\n///\n/// Example:\n/// ```\n/// import \"pkl:jsonnet\"\n///\n/// @jsonnet.Property { name = \"wing_span\" }\n/// wingSpan: Int\n/// ```\nclass Renderer extends ValueRenderer {\n  extension = \"jsonnet\"\n\n  /// The characters to use for indenting output.\n  ///\n  /// If empty (`\"\"`), renders everything on a single line.\n  ///\n  /// If non-empty, renders object fields and array elements on separate lines,\n  /// and strings containing newlines as `|||` multiline text blocks,\n  /// with the given leading line [indent].\n  indent: String | /*Deprecated*/ Null = \"  \"\n\n  /// Whether to omit Jsonnet object fields whose value is `null`.\n  omitNullProperties: Boolean = true\n\n  /// Renders [value] as a Jsonnet document.\n  ///\n  /// Every Jsonnet value is a valid Jsonnet document.\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n}\n\n/// Annotate properties of classes and modules with this class to override how a [Renderer]\n/// interprets a property's name.\n@Since { version = \"0.31.0\" }\nclass Property extends ConvertProperty {\n  /// The new name to use for the annotated property when rendered by [Renderer].\n  name: String\n\n  render = (prop, renderer) -> if (renderer is Renderer) Pair(name, prop.value) else prop\n}\n\n/// An `importstr` construct that, when evaluated by Jsonnet, returns the content of a UTF-8 text file.\n///\n/// To construct an [ImportStr], use method [ImportStr()].\nclass ImportStr {\n  /// The path of the file to import.\n  path: String\n}\n\n/// A `std.extVar()` call that, when evaluated by Jsonnet, returns the value of an external Jsonnet variable.\n///\n/// To construct an [ExtVar], use method [ExtVar()].\nclass ExtVar {\n  /// The external variable's name.\n  name: String\n}\n"
  },
  {
    "path": "stdlib/math.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Basic mathematical constants and functions.\n///\n/// Note that some mathematical functions, such as `sign()`, `abs()`, and `round()`,\n/// are directly defined in classes [Number], [Int], and [Float].\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.math\n\n/// The minimum [Int] value: `-9223372036854775808`.\nexternal minInt: Int\n\n/// The minimum [Int8] value: -128.\nexternal minInt8: Int8\n\n/// The minimum [Int16] value: -32768.\nexternal minInt16: Int16\n\n/// The minimum [Int32] value: -2147483648.\nexternal minInt32: Int32\n\n/// The maximum [Int] value: `9223372036854775807`.\nexternal maxInt: Int\n\n/// The maximum [Int8] value: 127.\nexternal maxInt8: Int8\n\n/// The maximum [Int16] value: 32767.\nexternal maxInt16: Int16\n\n/// The maximum [Int32] value: 2147483647.\nexternal maxInt32: Int32\n\n/// The maximum [UInt] value: 9223372036854775807.\n///\n/// Note that [maxUInt] is equal to [maxInt],\n/// not `maxInt * 2 + 1` as one might expect.\n/// That is, [UInt] has half the range of [Int].\nexternal maxUInt: UInt\n\n/// The maximum [UInt8] value: 255.\nexternal maxUInt8: UInt8\n\n/// The maximum [UInt16] value: 65535.\nexternal maxUInt16: UInt16\n\n/// The maximum [UInt32] value: 4294967295.\nexternal maxUInt32: UInt32\n\n/// The minimum finite [Float] value: `-1.7976931348623157e308`.\n///\n/// Operations whose value is less than [minFiniteFloat] return -[infinity].\nexternal minFiniteFloat: Float\n\n/// The maximum finite [Float] value: `1.7976931348623157e308`.\n///\n/// Operations whose value is greater than [maxFiniteFloat] return [infinity].\nexternal maxFiniteFloat: Float\n\n/// The minimum positive [Float] value that is greater than zero: `4.9e-324`.\nexternal minPositiveFloat: Float\n\n/// The number [e][1].\n///\n/// [1]: https://en.wikipedia.org/wiki/E_(mathematical_constant)\nexternal e: Float\n\n/// The number [π][1].\n///\n/// [1]: https://en.wikipedia.org/wiki/Pi\nexternal pi: Float\n\n/// Returns e raised to the power of [exponent].\n///\n/// [1]: https://en.wikipedia.org/wiki/Exponential_function\nexternal function exp(exponent: Number): Float\n\n/// Returns the [square root][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Square_root\nexternal function sqrt(x: Number): Float\n\n/// Returns the [cube root][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Cube_root\nexternal function cbrt(x: Number): Float\n\n/// Returns the [natural logarithm][1] (base e logarithm) of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Natural_logarithm\nexternal function log(x: Number): Float\n\n/// Returns the [base 2 logarithm][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Binary_logarithm\nexternal function log2(x: Number): Float\n\n/// Returns the [base 10 logarithm][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Common_logarithm\nexternal function log10(x: Number): Float\n\n/// Returns the [sine][1] of [angle] given in radians.\n///\n/// [1]: https://en.wikipedia.org/wiki/Sine\nexternal function sin(angle: Number): Float\n\n/// Returns the [cosine][1] of [angle] given in radians.\n///\n/// [1]: https://en.wikipedia.org/wiki/Trigonometric_functions///cosine\nexternal function cos(angle: Number): Float\n\n/// Returns the [tangent][1] of [angle] given in radians.\n///\n/// [1]: https://en.wikipedia.org/wiki/Tangent\nexternal function tan(angle: Number): Float\n\n/// Returns the [arcsine][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Inverse_trigonometric_functions\nexternal function asin(x: Number): Float\n\n/// Returns the [arccosine][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Inverse_trigonometric_functions\nexternal function acos(x: Number): Float\n\n/// Returns the [arctangent][1] of [x].\n///\n/// [1]: https://en.wikipedia.org/wiki/Inverse_trigonometric_functions\nexternal function atan(x: Number): Float\n\n/// Returns the [2-argument arctangent][1] of [x] and [y].\n///\n/// [1]: https://en.wikipedia.org/wiki/Atan2\n@Since { version = \"0.28.0\" }\nexternal function atan2(x: Number, y: Number): Float\n\n/// Returns the [greatest common divisor][1] of [x] and [y].\n///\n/// [1]: https://en.wikipedia.org/wiki/Greatest_common_divisor\nexternal function gcd(x: Int, y: Int): Int\n\n/// Returns the [least common multiple][1] of [x] and [y].\n///\n/// [1]: https://en.wikipedia.org/wiki/Least_common_multiple\nexternal function lcm(x: Int, y: Int): Int\n\n/// Returns `true` if [x] is a power of two.\nexternal function isPowerOfTwo(x: Number): Boolean\n\n/// Returns the minimum of [x] and [y].\nexternal function min(x: Number, y: Number): Number\n\n/// Returns the maximum of [x] and [y].\nexternal function max(x: Number, y: Number): Number\n"
  },
  {
    "path": "stdlib/pklbinary.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// APIs for working with `pkl-binary` encoding.\n///\n/// `pkl-binary` is a binary encoding of Pkl data.\n/// It can be used to encode all values, with the exception of [Function] types (lambda\n/// expressions).\n///\n/// `pkl-binary` encoding is useful for separating evaluation and data consumption into two\n/// separate steps.\n/// For example, applications can produce `pkl-binary` at build time, and deserialize this into\n/// code-generated structs at application runtime.\n///\n/// The `pkl-binary` format uses MessagePack encoding.\n/// Its specification is available at\n/// <https://pkl-lang.org/main/current/bindings-specification/binary-encoding.html>.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.pklbinary\n\n/// Render values as `pkl-binary`.\n///\n/// The `pkl-binary` renderer disables all [ConvertProperty] annotation converters by default\n/// because `pkl-binary` data is intended to closely represent native Pkl types and data.\n/// This behavior may be overridden for [ConvertProperty] or its subclasses by adding an entry to\n/// [Renderer.convertPropertyTransformers].\nclass Renderer extends BytesRenderer {\n  /// Renders [value] as `pkl-binary`.\n  external function renderValue(value: Any): Bytes\n\n  /// Renders [value] as `pkl-binary`.\n  ///\n  /// Every `pkl-binary` value is also a valid document.\n  external function renderDocument(value: Any): Bytes\n\n  convertPropertyTransformers {\n    // disable all property conversions by default\n    [ConvertProperty] {\n      render = (property, _) -> property\n    }\n  }\n}\n"
  },
  {
    "path": "stdlib/platform.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Information about the platform that the current program runs on.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.platform\n\n/// The platform that the current program runs on.\nexternal current: Platform\n\n/// The platform that a program runs on.\nclass Platform {\n  /// The language implementation of this platform.\n  language: Language\n\n  /// The language runtime of this platform.\n  runtime: Runtime\n\n  /// The virtual machine of this platform.\n  virtualMachine: VirtualMachine\n\n  /// The operating system of this platform.\n  operatingSystem: OperatingSystem\n\n  /// The processor of this platform.\n  processor: Processor\n}\n\n/// The language implementation of a platform.\nclass Language {\n  /// The version of this language implementation.\n  version: String\n}\n\n/// The language runtime of a platform.\nclass Runtime {\n  /// The name of this runtime.\n  name: String\n\n  /// The version of this runtime.\n  version: String\n}\n\n/// The virtual machine of a platform.\nclass VirtualMachine {\n  /// The name of this virtual machine.\n  name: String\n\n  /// The version of this virtual machine.\n  version: String\n}\n\n/// The operating system of a platform.\nclass OperatingSystem {\n  /// The name of this operating system.\n  name: \"macOS\" | \"Linux\" | \"Windows\" | String\n\n  /// The version of this operating system.\n  version: String\n}\n\n/// The processor of a platform.\nclass Processor {\n  /// The instruction set architecture of this processor.\n  architecture: String\n}\n"
  },
  {
    "path": "stdlib/protobuf.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A renderer for [Protocol Buffers](https://developers.google.com/protocol-buffers).\n/// Note: This module is _experimental_ and not ready for production use.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.protobuf\n\nimport \"pkl:reflect\"\n\n/// A renderer for [Protocol Buffers](https://developers.google.com/protocol-buffers).\n/// Note: This class is _experimental_ and not ready for production use.\n///\n/// As of this release, only Protocol Buffers' text format is supported.\n///\n/// The [Property] annotation can be used to change how a property name renders into Protobuf.\n///\n/// Example:\n/// ```\n/// import \"pkl:protobuf\"\n///\n/// @protobuf.Property { name = \"wing_span\" }\n/// wingSpan: Int\n/// ```\nclass Renderer extends ValueRenderer {\n  /// The characters to use for indenting output.\n  ///\n  /// Defaults to two spaces.\n  indent: String = \"  \"\n\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n\n  /// Returns the canonical name for [type].\n  external function renderType(type: reflect.Type): String\n}\n\n/// Annotate properties of classes and modules with this class to override how a [Renderer]\n/// interprets a property's name.\n@Since { version = \"0.31.0\" }\nclass Property extends ConvertProperty {\n  /// The new name to use for the annotated property when rendered by [Renderer].\n  name: String\n\n  render = (prop, renderer) -> if (renderer is Renderer) Pair(name, prop.value) else prop\n}\n"
  },
  {
    "path": "stdlib/reflect.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A mirror-based reflection library.\n///\n/// The `pkl:reflect` module enables *introspection*,\n/// the subset of reflection by which a program can examine its own structure.\n///\n/// The API design is based on the concept of [mirrors](https://en.wikipedia.org/wiki/Mirror_(programming)).\n///\n/// With the help of this module, advanced tools can be written entirely in Pkl:\n///\n/// - Documentation generators (such as *Pkldoc*)\n/// - Code generators (such as *pkl-codegen-java* and *pkl-codegen-kotlin*)\n/// - Domain-specific schema validators\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.reflect\n\nimport \"pkl:base\"\n\n/// A mirror for the [Any] type.\nconst anyType: DeclaredType = DeclaredType(Class(Any))\n\n/// A mirror for the [Boolean] type.\nconst booleanType: DeclaredType = DeclaredType(Class(Boolean))\n\n/// A mirror for the [Int] type.\nconst intType: DeclaredType = DeclaredType(Class(Int))\n\n/// A mirror for the [Int8] type.\nconst int8Type: DeclaredType = DeclaredType(TypeAlias(Int8))\n\n/// A mirror for the [Int16] type.\nconst int16Type: DeclaredType = DeclaredType(TypeAlias(Int16))\n\n/// A mirror for the [Int32] type.\nconst int32Type: DeclaredType = DeclaredType(TypeAlias(Int32))\n\n/// A mirror for the [UInt] type.\nconst uintType: DeclaredType = DeclaredType(TypeAlias(UInt))\n\n/// A mirror for the [UInt8] type.\nconst uint8Type: DeclaredType = DeclaredType(TypeAlias(UInt8))\n\n/// A mirror for the [UInt16] type.\nconst uint16Type: DeclaredType = DeclaredType(TypeAlias(UInt16))\n\n/// A mirror for the [UInt32] type.\nconst uint32Type: DeclaredType = DeclaredType(TypeAlias(UInt32))\n\n/// A mirror for the [Float] type.\nconst floatType: DeclaredType = DeclaredType(Class(Float))\n\n/// A mirror for the [String] type.\nconst stringType: DeclaredType = DeclaredType(Class(String))\n\n/// A mirror for the [Duration] type.\nconst durationType: DeclaredType = DeclaredType(Class(Duration))\n\n/// A mirror for the [DataSize] type.\nconst dataSizeType: DeclaredType = DeclaredType(Class(DataSize))\n\n/// A mirror for the `Pair<unknown, unknown>` type.\nconst pairType: DeclaredType = DeclaredType(Class(Pair))\n\n/// A mirror for the `List<unknown>` type.\nconst listType: DeclaredType = DeclaredType(Class(List))\n\n/// A mirror for the `Set<unknown>` type.\nconst setType: DeclaredType = DeclaredType(Class(Set))\n\n/// A mirror for the `Map<unknown, unknown>` type.\nconst mapType: DeclaredType = DeclaredType(Class(Map))\n\n/// A mirror for the [Object] type.\nconst objectType: DeclaredType = DeclaredType(Class(Object))\n\n/// A mirror for the [Dynamic] type.\nconst dynamicType: DeclaredType = DeclaredType(Class(Dynamic))\n\n/// A mirror for the [Typed] type.\nconst typedType: DeclaredType = DeclaredType(Class(Typed))\n\n/// A mirror for the `Listing<unknown>` type.\nconst listingType: DeclaredType = DeclaredType(Class(Listing))\n\n/// A mirror for the `Mapping<unknown, unknown>` type.\nconst mappingType: DeclaredType = DeclaredType(Class(Mapping))\n\n/// A mirror for the `Bytes` type.\n@Since { version = \"0.29.0\" }\nconst bytesType: DeclaredType = DeclaredType(Class(Bytes))\n\n/// A mirror for the `module` type.\nexternal const moduleType: ModuleType\n\n/// A mirror for the `unknown` type.\nexternal const unknownType: UnknownType\n\n/// A mirror for the `nothing` type.\nexternal const nothingType: NothingType\n\n/// Returns a mirror for [mod].\n///\n/// When a module is amended like an object, it is no longer a module.\n/// In this case, [Module()] throws.\n/// In the following example, `barnOwl` is such an object, created by amending the module `pigeon.pkl`.\n///\n/// ```\n/// barnOwl = (import(\"pigeon.pkl\")) {\n///   name = \"Barn Owl\"\n/// }\n/// ```\nexternal const function Module(mod: base.Module): Module\n\n/// Returns a mirror [mod] if it is a module, and otherwise its closest parent that is a module.\n///\n/// When a module is amended like an object, it is no longer a module.\n/// In this case, [moduleOf()] returns a mirror of the closest parent that is.\n/// In the following example, `barnOwl` is such an object, created by amending the module `pigeon.pkl`.\n///\n/// ```\n/// barnOwl = (import(\"pigeon.pkl\")) {\n///   name = \"Barn Owl\"\n/// }\n/// ```\nexternal const function moduleOf(mod: base.Module): Module\n\n/// Returns a mirror for [clazz].\nexternal const function Class(clazz: base.Class): Class\n\n/// Returns a mirror for [typeAlias].\nexternal const function TypeAlias(typeAlias: base.TypeAlias): TypeAlias\n\n/// Returns a mirror for the declared type for [referent].\nexternal const function DeclaredType(referent: TypeDeclaration): DeclaredType\n\n/// Returns a mirror for the function type with the given [parameterTypes] and [returnType].\nexternal const function FunctionType(parameterTypes: List<Type>, returnType: Type): FunctionType\n\n/// Returns a mirror for the string literal type for [value].\nexternal const function StringLiteralType(value: String): StringLiteralType\n\n/// Returns a mirror for the union of [memberTypes].\nexternal const function UnionType(memberTypes: List<Type>): UnionType\n\n/// Returns a mirror for a type variable for [referent].\nexternal const function TypeVariable(referent: TypeParameter): TypeVariable\n\n/// A program declaration.\nabstract external class Declaration {\n  /// The source location of this declaration.\n  location: SourceLocation\n\n  /// The documentation comment for this declaration, if any.\n  docComment: String?\n\n  /// The annotations attached to this declaration.\n  annotations: List<Annotation>\n\n  /// The modifiers of this declaration.\n  modifiers: Set<Modifier>\n\n  /// The name of this declaration.\n  name: String\n}\n\n/// A module declaration.\nexternal class Module extends Declaration {\n  hidden reflectee: base.Module\n\n  /// The URI of this module.\n  uri: String\n\n  /// The class of this module.\n  moduleClass: Class(isSubclassOf(Class(base.Module)))\n\n  /// The module amended or extended by this module, if any.\n  supermodule: Module?\n\n  /// Tells whether this module amends another module (namely [supermodule]).\n  ///\n  /// [false] if [supermodule] is [null].\n  isAmend: Boolean\n\n  /// The imports declared in this module.\n  ///\n  /// Map keys are the identifiers by which imports are accessed within this module.\n  /// Map values are the URIs of the imported modules.\n  ///\n  /// Does not cover import expressions.\n  imports: Map<String, Uri>\n\n  /// The classes declared in this module.\n  ///\n  /// Does not contain [moduleClass].\n  classes: Map<String, Class>\n\n  /// The type aliases declared in this module.\n  typeAliases: Map<String, TypeAlias>\n}\n\n/// A class or type alias declaration.\nabstract external class TypeDeclaration extends Declaration {\n  /// The class or type alias reflected upon.\n  abstract hidden reflectee: base.Class | base.TypeAlias\n\n  /// The module enclosing this type declaration.\n  ///\n  /// If this type declaration is a module class, [enclosingDeclaration] is the corresponding module instance.\n  hidden enclosingDeclaration: Module\n\n  /// The type parameters of this type declaration.\n  abstract typeParameters: List<TypeParameter>\n}\n\n/// A class declaration.\nexternal class Class extends TypeDeclaration {\n  /// The class reflected upon.\n  reflectee: base.Class\n\n  /// The type parameters of this class.\n  ///\n  /// Only standard library classes can have type parameters.\n  typeParameters: List<TypeParameter>\n\n  /// The superclass of this class.\n  ///\n  /// All classes except [Any] have a superclass.\n  superclass: Class?\n\n  /// The supertype of this class.\n  ///\n  /// All classes except [Any] have a supertype.\n  supertype: Type?\n\n  /// The properties declared in this class.\n  ///\n  /// Does not include properties declared in superclasses.\n  properties: Map<String, Property>\n\n  /// The properties declared in this class and all superclasses.\n  @Since { version = \"0.30.0\" }\n  allProperties: Map<String, Property>\n\n  /// The methods declared in this class.\n  ///\n  /// Does not include methods declared in superclasses.\n  methods: Map<String, Method>\n\n  /// The methods declared in this class and all superclasses.\n  @Since { version = \"0.30.0\" }\n  allMethods: Map<String, Method>\n\n  /// Tells if this class is a subclass of [other].\n  ///\n  /// Every class is a subclass of itself.\n  external function isSubclassOf(other: Class): Boolean\n}\n\n/// A type alias declaration.\nexternal class TypeAlias extends TypeDeclaration {\n  /// The type alias reflected upon.\n  hidden reflectee: base.TypeAlias\n\n  /// The type parameters of this type alias declaration.\n  typeParameters: List<TypeParameter>\n\n  /// The type that this type alias stands for.\n  referent: Type\n}\n\n/// A property declaration.\nexternal class Property extends Declaration {\n  /// The declared type of this property.\n  hidden type: Type\n\n  /// The (explicit or implicit) default value of this property.\n  ///\n  /// [null] if this property does not have a default value.\n  hidden defaultValue: Any\n\n  /// The modifiers of this property, merged with any from the containing class's superclasses.\n  @Since { version = \"0.30.0\" }\n  allModifiers: Set<Modifier>\n\n  /// The annotations of this module, appended with any from the containing class's superclasses.\n  ///\n  /// Annotations are ordered starting with the current class and walking up the class hierarchy.\n  @Since { version = \"0.30.0\" }\n  allAnnotations: List<Annotation>\n}\n\n/// A method declaration.\nexternal class Method extends Declaration {\n  /// The type parameters of this method.\n  ///\n  /// Only standard library methods can have type parameters.\n  typeParameters: List<TypeParameter>\n\n  /// The parameters of this method.\n  parameters: Map<String, MethodParameter>\n\n  /// The return type of this method.\n  hidden returnType: Type\n}\n\n/// A method parameter.\nexternal class MethodParameter {\n  /// The name of this method parameter.\n  name: String\n\n  /// The type of this method parameter.\n  hidden type: Type\n}\n\n/// A type parameter of a generic type or method declaration.\n///\n/// Example: `T` on the left-hand side of `typealias StringMapping<T> = Mapping<String, T>`.\nexternal class TypeParameter {\n  /// The name of this type parameter.\n  name: String\n\n  /// The variance of this type parameter.\n  ///\n  /// [null] if this type parameter is invariant.\n  variance: Variance?\n}\n\n/// A modifier of a [Declaration].\ntypealias Modifier = \"abstract\" | \"external\" | \"hidden\" | \"open\" | \"fixed\" | \"const\"\n\n/// The variance of a [TypeParameter].\n///\n/// An \"in\" type parameter is contravariant.\n/// An \"out\" type parameter is covariant.\ntypealias Variance = \"in\" | \"out\"\n\n/// A type as it occurs, say, in a type annotation.\nabstract external class Type {\n  /// The corresponding nullable type, or [this] if [this] is already a nullable type.\n  external nullable: NullableType\n}\n\n/// A declared type such as `String` or `Listing<String>`.\n///\n/// Use [DeclaredType()] to create an instance of this class.\n/// For common standard library classes, this module offers predefined type mirrors\n/// ([intType], [stringType], [listType], etc.).\n///\n/// If this type's [referent] has type parameters, the corresponding [typeArguments] default to [unknownType].\n/// To override this default, use [withTypeArgument()] or [withTypeArguments()].\n///\n/// Examples:\n/// ```\n/// import \"pkl:reflect\"\n///\n/// class Person\n/// pigeon: Person\n/// people: List<Person>\n///\n/// personClass = reflect.Class(Person)\n/// personType = reflect.DeclaredType(personClass)\n/// reflect.Module(this).properties[\"pigeon\"].type == personType\n/// reflect.Module(this).properties[\"people\"].type == listType.withTypeArgument(personType)\n/// ```\nexternal class DeclaredType extends Type {\n  /// The type declaration that this type refers to.\n  referent: TypeDeclaration\n\n  /// The type arguments of this type.\n  typeArguments: List<Type>(length == referent.typeParameters.length)\n\n  /// Returns a declared type with the same [referent] and the given [typeArgument].\n  external function withTypeArgument(typeArgument: Type): DeclaredType\n\n  /// Returns a declared type with the same [referent] and the given [typeArguments].\n  external function withTypeArguments(typeArguments: List<Type>): DeclaredType\n}\n\n/// A string literal type such as `\"Pigeon\"`.\n///\n/// Use [StringLiteralType()] to create an instance of this class.\nexternal class StringLiteralType extends Type {\n  /// The string value represented by this type.\n  value: String\n}\n\n/// A union type such as `String|Int`.\n///\n/// Use [UnionType()] to create an instance of this class.\nexternal class UnionType extends Type {\n  /// The members of this union type.\n  members: List<Type>\n}\n\n/// A nullable type such as `String?`.\n///\n/// Use [Type.nullable] to create an instance of this class.\nexternal class NullableType extends Type {\n  /// The member of this nullable type.\n  member: Type\n}\n\n/// A function type such as `(String, Int) -> Duration`.\n///\n/// Use [FunctionType()] to create an instance of this class.\nexternal class FunctionType extends Type {\n  /// The parameter types of this function type.\n  parameterTypes: List<Type>\n\n  /// The return type of this function type.\n  returnType: Type\n}\n\n/// The `module` type.\n///\n/// [moduleType] is an instance of this class.\nclass ModuleType extends Type\n\n/// The `unknown` type.\n///\n/// [unknownType] is an instance of this class.\nclass UnknownType extends Type\n\n/// The `nothing` type.\n///\n/// [nothingType] is an instance of this class.\nclass NothingType extends Type\n\n/// A type variable that refers to a type parameter of a generic type or method declaration.\n///\n/// Example: `T` on the right-hand side of `typealias StringMapping<T> = Mapping<String, T>`.\nexternal class TypeVariable extends Type {\n  referent: TypeParameter\n}\n\n/// A source location within a module.\nexternal class SourceLocation {\n  /// The 1-based line number of this source location.\n  line: UInt\n\n  /// The 1-based column number of this source location.\n  column: UInt\n\n  /// The display URI of this source location.\n  displayUri: String\n}\n"
  },
  {
    "path": "stdlib/release.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Information about the Pkl release that the current program runs on.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.release\n\nimport \"pkl:semver\"\n\n/// The Pkl release that the current program runs on.\nexternal current: Release\n\n/// A Pkl release.\nclass Release {\n  /// The version of this release.\n  version: semver.Version\n\n  /// The output of `pkl --version` for this release.\n  versionInfo: String\n\n  /// The Git commit ID of this release.\n  commitId: String\n\n  /// The source code of this release.\n  sourceCode: SourceCode\n\n  /// The documentation of this release.\n  documentation: Documentation\n\n  /// The standard library of this release.\n  standardLibrary: StandardLibrary\n}\n\n/// The source code of a Pkl release.\nclass SourceCode {\n  /// The homepage of this source code.\n  homepage: Uri(endsWith(\"/\"))\n}\n\n/// The documentation of a Pkl release.\nclass Documentation {\n  /// The homepage of this documentation.\n  homepage: Uri(endsWith(\"/\"))\n}\n\n/// The standard library of a Pkl release.\nclass StandardLibrary {\n  /// The module URIs of this standard library.\n  modules: Set<Uri(startsWith(\"pkl:\"))>\n}\n"
  },
  {
    "path": "stdlib/semver.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Parsing, comparison, and manipulation of [semantic version](https://semver.org/spec/v2.0.0.html) numbers.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.semver\n\n/// Tells whether [version] is a valid semantic version number.\nfunction isValid(version: String) = parseOrNull(version) != null\n\n/// Parses [version] as a semantic version number.\n///\n/// Throws if [version] is not a valid semantic version number.\n///\n/// Examples:\n/// ```\n/// semver.Version(\"1.2.3\")\n/// semver.Version(\"1.2.3-alpha\")\n/// semver.Version(\"1.2.3+456\")\n/// semver.Version(\"1.2.3-alpha+456\")\n/// ```\nfunction Version(version: String): Version =\n  parseOrNull(version) ?? throw(\"`\\(version)` is not a valid semantic version number.\")\n\n/// Parses [version] as a semantic version number.\n///\n/// Returns [null] if [version] is not a valid semantic version number.\n///\n/// Facts:\n/// ```\n/// semver.parseOrNull(\"1.2.3\") == semver.Version(\"1.2.3\")\n/// semver.parseOrNull(\"1.2.3-alpha+456\") == semver.Version(\"1.2.3-alpha+456\")\n/// semver.parseOrNull(\"1\") == null\n/// ```\nfunction parseOrNull(version: String): Version? =\n  let (groups = versionRegex.matchEntire(version)?.groups)\n    if (groups == null)\n      null\n    else\n      new Version {\n        major = groups[1].value.toInt()\n        minor = groups[2].value.toInt()\n        patch = groups[3].value.toInt()\n        preRelease = groups[4]?.value\n        build = groups[5]?.value\n      }\n\n/// A version comparator for use with methods such as [List.minWith()].\ncomparator: (Version, Version) -> Boolean = (v1: Version, v2: Version) -> v1.isLessThan(v2)\n\n/// A [semantic version](https://semver.org/spec/v2.0.0.html).\n///\n/// To test if two versions are equal according to semantic versioning rules, use [equals()] instead of `==`.\nclass Version {\n  /// Major version zero (0.y.z) is for initial development.\n  /// Anything MAY change at any time.\n  /// The public API SHOULD NOT be considered stable.\n  ///\n  /// Version 1.0.0 defines the public API.\n  /// The way in which the version number is incremented after this release is dependent on this public API and how it changes.\n  ///\n  /// Major version X (X.y.z | X > 0) MUST be incremented if any backwards incompatible changes are introduced to the public API.\n  /// It MAY also include minor and patch level changes.\n  /// Patch and minor version MUST be reset to 0 when major version is incremented.\n  major: UInt\n\n  /// Minor version Y (x.Y.z | x > 0) MUST be incremented if new, backwards compatible functionality is introduced to the public API.\n  /// It MUST be incremented if any public API functionality is marked as deprecated.\n  /// It MAY be incremented if substantial new functionality or improvements are introduced within the private code.\n  /// It MAY include patch level changes.\n  /// Patch version MUST be reset to 0 when minor version is incremented.\n  minor: UInt\n\n  /// Patch version Z (x.y.Z | x > 0) MUST be incremented if only backwards compatible bug fixes are introduced.\n  /// A bug fix is defined as an internal change that fixes incorrect behavior.\n  patch: UInt\n\n  /// A pre-release version MAY be denoted by appending a hyphen and a series of dot separated identifiers immediately following the patch version.\n  /// Identifiers MUST comprise only ASCII alphanumerics and hyphens `[0-9A-Za-z-]`.\n  /// Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes.\n  /// Pre-release versions have a lower precedence than the associated normal version.\n  /// A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version.\n  ///\n  /// Examples:\n  /// - `\"1.0.0-alpha\"`\n  /// - `\"1.0.0-alpha.1\"`\n  /// - `\"1.0.0-0.3.7\"`\n  /// - `\"1.0.0-x.7.z.92\"`\n  /// - `\"1.0.0-x-y-z.–\"`\n  preRelease: String(\n    matches(\n      Regex(\n        #\"(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*\"#,\n      ),\n    ),\n  )?\n\n  hidden fixed preReleaseIdentifiers: List<Int | String> =\n    if (preRelease == null) List() else preRelease.split(\".\").map((it) -> it.toIntOrNull() ?? it)\n\n  /// Build metadata MAY be denoted by appending a plus sign and a series of dot separated identifiers immediately following the patch or pre-release version.\n  /// Identifiers MUST comprise only ASCII alphanumerics and hyphens `[0-9A-Za-z-]`.\n  /// Identifiers MUST NOT be empty.\n  /// Build metadata MUST be ignored when determining version precedence.\n  /// Thus two versions that differ only in the build metadata, have the same precedence.\n  ///\n  /// Examples:\n  /// - `\"1.0.0-alpha+001\"\n  /// - `\"1.0.0+20130313144700\"`\n  /// - `\"1.0.0-beta+exp.sha.5114f85\"`\n  /// - `\"1.0.0+21AF26D3—-117B344092BD\"`\n  ///\n  /// Note: Unlike `==`, [equals()] and comparison methods such as [isLessThan()] ignore [build].\n  build: String(matches(Regex(#\"[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*\"#)))?\n\n  hidden fixed buildIdentifiers: List<String> = if (build == null) List() else build.split(\".\")\n\n  /// Tells whether this version is equal to [other] according to semantic versioning rules.\n  ///\n  /// Facts:\n  /// ```\n  /// semver.Version(\"1.0.0\").equals(semver.Version(\"1.0.0\"))\n  /// !(semver.Version(\"1.0.0\").equals(semver.Version(\"1.0.1\")))\n  /// semver.Version(\"1.0.0-alpha+001\").equals(semver.Version(\"1.0.0-alpha+999\"))\n  /// ```\n  ///\n  /// Note: `version1.equals(version2)` differs from `version1 == version2` in that it ignores [build].\n  function equals(other: Version): Boolean =\n    major == other.major\n      && minor == other.minor\n      && patch == other.patch\n      && preRelease == other.preRelease\n\n  /// Tells whether this version is less than [other] according to semantic versioning rules.\n  ///\n  /// Facts:\n  /// ```\n  /// semver.Version(\"1.0.0\").isLessThan(semver.Version(\"2.0.0\"))\n  /// semver.Version(\"2.0.0\").isLessThan(semver.Version(\"2.1.0\"))\n  /// semver.Version(\"2.1.0\").isLessThan(semver.Version(\"2.1.1\"))\n  ///\n  /// semver.Version(\"1.0.0-alpha\").isLessThan(\"1.0.0\")\n  ///\n  /// semver.Version(\"1.0.0-alpha\").isLessThan(semver.Version(\"1.0.0-alpha.1\"))\n  /// semver.Version(\"1.0.0-alpha.1\").isLessThan(semver.Version(\"1.0.0-alpha.beta\"))\n  /// semver.Version(\"1.0.0-alpha.beta\").isLessThan(semver.Version(\"1.0.0-beta\"))\n  /// semver.Version(\"1.0.0-beta\").isLessThan(semver.Version(\"1.0.0-beta.2\"))\n  /// semver.Version(\"1.0.0-beta.2\").isLessThan(semver.Version(\"1.0.0-beta.11\"))\n  /// semver.Version(\"1.0.0-beta.11\").isLessThan(semver.Version(\"1.0.0-rc.1\"))\n  /// semver.Version(\"1.0.0-rc.1\").isLessThan(semver.Version(\"1.0.0\"))\n  /// ```\n  function isLessThan(other: Version): Boolean =\n    major < other.major\n      || major == other.major && minor < other.minor\n      || major == other.major && minor == other.minor && patch < other.patch\n      || major == other.major\n        && minor == other.minor\n        && patch == other.patch\n        && isPreReleaseLessThan(other)\n\n  /// Tells whether this version is less than or equal to [other] according to semantic versioning rules.\n  function isLessThanOrEquals(other: Version): Boolean = isLessThan(other) || equals(other)\n\n  /// Tells whether this version is greater than [other] according to semantic versioning rules.\n  function isGreaterThan(other: Version): Boolean = other.isLessThan(this)\n\n  /// Tells whether this version is greater than or equal to [other] according to semantic versioning rules.\n  function isGreaterThanOrEquals(other: Version): Boolean = other.isLessThanOrEquals(this)\n\n  /// A normal version number MUST take the form X.Y.Z where X, Y, and Z are non-negative integers, and MUST NOT contain leading zeroes.\n  function isNormal(): Boolean = preRelease == null && build == null\n\n  /// Tells if this version has a non-zero [major] and no [preRelease].\n  function isStable(): Boolean = major > 0 && preRelease == null\n\n  /// Strips [preRelease] and [build] from this version.\n  function toNormal(): Version = (this) { preRelease = null; build = null }\n\n  function toString() =\n    \"\\(major).\\(minor).\\(patch)\\(if (preRelease != null) \"-\\(preRelease)\" else \"\")\\(if (build != null) \"+\\(build)\" else \"\")\"\n\n  local function isPreReleaseLessThan(other: Version): Boolean =\n    if (preRelease == null)\n      false\n    else if (other.preRelease == null)\n      true\n    else if (preRelease == other.preRelease)\n      false\n    else\n      let (\n        result =\n          preReleaseIdentifiers\n            .zip(other.preReleaseIdentifiers)\n            .fold(null, (result, next) ->\n              if (result != null)\n                result\n              else if (next.first == next.second)\n                null\n              else if (next.first.getClass() == next.second.getClass())\n                next.first < next.second\n              else\n                next.first is Int\n            )\n      )\n        if (result != null)\n          result\n        else\n          preReleaseIdentifiers.length < other.preReleaseIdentifiers.length\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nlocal versionRegex =\n  Regex(\n    #\"(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?\"#,\n  )\n"
  },
  {
    "path": "stdlib/settings.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Configuration settings for Pkl itself.\n///\n/// Every settings file must amend this module.\n/// Unless CLI commands and build tool plugins are explicitly configured with a settings file,\n/// they will use `~/.pkl/settings.pkl` or the defaults specified in this module.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.settings\n\nimport \"pkl:EvaluatorSettings\"\n\n/// The editor for viewing and editing Pkl files.\neditor: Editor = System\n\n/// Settings for controlling how Pkl makes HTTP(S) requests.\n@Since { version = \"0.26.0\" }\nhttp: EvaluatorSettings.Http?\n\n/// The editor associated with `file:` URLs ending in `.pkl`.\nhidden System: Editor = new {\n  urlScheme = \"%{url}, line %{line}\"\n}\n\n/// The [IntelliJ IDEA](https://www.jetbrains.com/idea) editor.\nhidden Idea: Editor = new {\n  urlScheme = \"idea://open?file=%{path}&line=%{line}\"\n}\n\n/// The [GoLand](https://www.jetbrains.com/go/) editor.\nhidden GoLand: Editor = new {\n  urlScheme = \"goland://open?file=%{path}&line=%{line}\"\n}\n\n/// The [TextMate](https://macromates.com) editor.\nhidden TextMate: Editor = new {\n  urlScheme = \"txmt://open?url=%{url}&line=%{line}&column=%{column}\"\n}\n\n/// The [Sublime Text](https://www.sublimetext.com) editor.\nhidden Sublime: Editor = new {\n  urlScheme = \"subl://open?url=%{url}&line=%{line}&column=%{column}\"\n}\n\n/// The [Atom](https://atom.io) editor.\nhidden Atom: Editor = new {\n  urlScheme = \"atom://open?url=%{url}&line=%{line}&column=%{column}\"\n}\n\n/// The [Visual Studio Code](https://code.visualstudio.com) editor.\nhidden VsCode: Editor = new {\n  urlScheme = \"vscode://file/%{path}:%{line}:%{column}\"\n}\n\n/// An editor for viewing and editing Pkl files.\nclass Editor {\n  /// The URL scheme for opening files in this editor.\n  /// The following placeholders are supported:\n  /// - `%{url}`\n  ///   file URL of the file to open\n  /// - `%{path}`\n  ///   absolute file path of the file to open\n  /// - `%{line}`\n  ///   start line number to navigate to\n  /// - `%{endLine}`\n  ///   end line number to navigate to\n  /// - `%{column}`\n  ///   start column number to navigate to\n  /// - `%{endColumn}`\n  ///   end column number to navigate to\n  urlScheme: String\n}\n"
  },
  {
    "path": "stdlib/shell.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// Utilities for generating shell scripts.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.shell\n\n/// Escapes [str] by enclosing it in single quotes.\n///\n/// Also handles single quotes occurring within [str].\nfunction escapeWithSingleQuotes(str: String): String =\n  let (\n    processChar = (acc, ch) ->\n      if (acc.isEmpty)\n        List(List(ch))\n      else if (acc.last.last != \"'\" && ch != \"'\")\n        acc.replace(acc.lastIndex, acc.last.add(ch))\n      else\n        acc.add(List(ch))\n  )\n  let (grouped = str.chars.fold(List(), processChar))\n    grouped.map((chSeq) -> if (chSeq == List(\"'\")) #\"\\'\"# else \"'\\(chSeq.join(\"\"))'\").join(\"\")\n"
  },
  {
    "path": "stdlib/stdlib.gradle.kts",
    "content": "/*\n * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nplugins {\n  pklAllProjects\n  base\n  `maven-publish`\n  pklPublishLibrary\n  pklSpotlessFormat\n  signing\n}\n\n// create and publish a self-contained stdlib archive\n// purpose is to provide non-jvm tools/projects with a versioned stdlib\nval stdlibZip by\n  tasks.registering(Zip::class) {\n    destinationDirectory.set(layout.buildDirectory.dir(\"libs\"))\n    archiveBaseName.set(\"pkl-stdlib\")\n    archiveVersion.set(project.version as String)\n    into(\"org/pkl/stdlib\") {\n      from(projectDir)\n      include(\"*.pkl\")\n    }\n  }\n\ntasks.assemble { dependsOn(stdlibZip) }\n\npublishing {\n  publications {\n    create<MavenPublication>(\"stdlib\") {\n      artifactId = \"pkl-stdlib\"\n      artifact(stdlibZip.flatMap { it.archiveFile })\n      pom {\n        description.set(\"Standard library for the Pkl programming language\")\n        url.set(\"https://github.com/apple/pkl/tree/main/stdlib\")\n      }\n    }\n  }\n}\n\nsigning { sign(publishing.publications[\"stdlib\"]) }\n"
  },
  {
    "path": "stdlib/test.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A template for writing tests.\n///\n/// To write tests, amend this module and define [facts] or [examples] (or both).\n/// To run tests, use the `pkl test` command to evaluate the amended module.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nopen module pkl.test\n\n/// Named groups of boolean expressions that are expected to evaluate to [true].\n///\n/// If an expression evaluates to [false], it is reported as a test failure.\n///\n/// Example:\n/// ```\n/// // for brevity, code under test is defined here\n/// function multiply(a, b) = a * b\n///\n/// facts {\n///   [\"multiply numbers\"] {\n///     multiply(3, 5) == 15\n///     multiple(3, 0) == 1 // will be reported as a test failure\n///   }\n///   // more facts here\n/// }\n/// ```\nfacts: Mapping<String, Listing<Boolean>>?\n\n/// Named groups of expressions whose results are expected to match results stored in _$filename-expected.pcf_.\n///\n/// If _$filename-expected.pcf_ does not exist, it is generated based on the examples' actual results.\n/// After verifying the contents of this file, it should be added to version control.\n///\n/// If _$filename-expected.pcf_ does exist, its results are compared one-by-one to actual results.\n/// If an actual result does not compare equal (according to `==`) to its expected result,\n/// it is reported as a test failure, and _$filename-actual.pcf_ is generated to aid with debugging.\n///\n/// Example:\n/// ```\n/// // for brevity, code under test is defined here\n/// local function createPigeon(_age) = new {\n///   name = \"Pigeon\"\n///   age = _age\n/// }\n///\n/// examples {\n///   [\"create Pigeons\"] {\n///     createPigeon(21)\n///     createPigeon(42)\n///   }\n///   // more examples here\n/// }\n/// ```\n///\n/// When the above code is evaluated for the first time, the following `$filename-expected.pcf` is generated:\n/// ```\n/// examples {\n///   [\"create Pigeons\"] {\n///     new {\n///       name = \"Pigeon\"\n///       age = 21\n///     }\n///     new {\n///       name = \"Pigeon\"\n///       age = 42\n///     }\n///   }\n/// }\n/// ```\n///\n/// To update expected results after making changes,\n/// delete _$filename-expected.pcf_ and evaluate the test module again.\nexamples: Mapping<String, Listing<unknown>>?\n\n/// Applies [fun] and returns the error thrown.\n///\n/// Throws if [fun] did not throw an error.\nexternal const function catch(fun: () -> Any): String\n\n/// Applies [fun] and returns the error thrown.\n///\n/// Returns [null] if [fun] did not throw an error.\nexternal const function catchOrNull(fun: () -> Any): String?\n"
  },
  {
    "path": "stdlib/xml.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// An XML renderer.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.xml\n\n/// Renders values as XML.\n///\n/// Values are rendered as follows depending on their type:\n///\n/// - `Int`, `Float`, `Boolean`, `String`: XML text node\n/// - `List`, `Set`, `Listing`: sequence of XML text nodes or XML elements (depending on element types)\n/// - `Map<String, ?>`, `Mapping<String, ?>`, `Typed`: sequence of XML elements (`null` values are skipped)\n/// - `Dynamic`: sequence of XML text nodes and/or XML elements (depending on member types; `null` value are skipped)\n///\n/// For more control over XML rendering, use [Element()], [Inline], [Comment], and [CData].\n/// These DOM-style objects can be used exclusively or mixed and matched with \"normal\" Pkl objects.\n///\n/// To set the name and attributes of the XML document's root element,\n/// use [rootElementName] and [rootElementAttributes].\n///\n/// The [Property] annotation can be used to change how a property name renders into XML.\n///\n/// Example:\n/// ```\n/// import \"pkl:xml\"\n///\n/// @xml.Property { name = \"wing_span\" }\n/// wingSpan: Int\n/// ```\nclass Renderer extends ValueRenderer {\n  extension = \"xml\"\n\n  /// The characters to use for indenting output.\n  indent: String = \"  \"\n\n  /// The XML version to use.\n  xmlVersion: *\"1.0\" | \"1.1\"\n\n  /// The name of the XML document's root element.\n  rootElementName: String(!isEmpty) = \"root\"\n\n  /// The attributes of the XML document's root element.\n  rootElementAttributes: Mapping<String(!isEmpty), String | Boolean | Int | Float>\n\n  external function renderDocument(value: Any): String\n\n  external function renderValue(value: Any): String\n}\n\n/// Annotate properties of classes and modules with this class to override how a [Renderer]\n/// interprets a property's name.\n@Since { version = \"0.31.0\" }\nclass Property extends ConvertProperty {\n  /// The new name to use for the annotated property when rendered by [Renderer].\n  name: String\n\n  render = (prop, renderer) -> if (renderer is Renderer) Pair(name, prop.value) else prop\n}\n\n/// Creates an XML element with the given name.\n///\n/// Use this method to directly define an XML element\n/// instead of relying on the default rendering of Pkl values.\n///\n/// To define the XML element's attributes, set the [attributes] property of the `Element` object:\n/// ```\n/// order = xml.Element(\"order\") {\n///   attributes {\n///     [\"date\"] = \"2020-03-21\"\n///   }\n/// }\n/// ```\n///\n/// To define the XML element's content, add child values (normally also called \"elements\") to the `Element` object:\n/// ```\n/// order = (xml.Element(\"order\")) {       // element with one child\n///   (xml.Element(\"item\")) {              // element with two children\n///     (xml.Element(\"name\")) { \"banana\" } // element with one child\n///     (xml.Element(\"quantity\")) { 42 }   // element with one child\n///   }\n/// }\n/// ```\nfunction Element(_name: String(!isEmpty)): Dynamic = new {\n  _isXmlElement = true\n  name = _name\n  attributes = new Mapping {}\n  isBlockFormat = true\n}\n\n/// Creates an [Inline] directive for [_value].\nfunction Inline(_value: Object | Collection | Map): Inline = new { value = _value }\n\n/// Inlines the members of [value] into the enclosing XML element,\n/// without rendering an XML element for [value] itself.\nclass Inline {\n  value: Object | Collection | Map\n}\n\n/// Creates an XML [Comment] with the given [_text].\nfunction Comment(_text: String): Comment = new { text = _text }\n\n/// An XML comment.\nclass Comment {\n  text: String(!contains(\"--\"))\n  isBlockFormat: Boolean = true\n}\n\n/// Creates an XML [CData] section with the given [_text].\nfunction CData(_text: String): CData = new { text = _text }\n\n/// An XML CDATA section.\nclass CData {\n  text: String\n}\n"
  },
  {
    "path": "stdlib/yaml.pkl",
    "content": "//===----------------------------------------------------------------------===//\n// Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//===----------------------------------------------------------------------===//\n\n/// A YAML 1.2 compliant YAML parser.\n@ModuleInfo { minPklVersion = \"0.32.0\" }\nmodule pkl.yaml\n\n/// Annotate properties of classes and modules with this class to override how a [YamlRenderer]\n/// interprets a property's name.\n@Since { version = \"0.31.0\" }\nclass Property extends ConvertProperty {\n  /// The new name to use for the annotated property when rendered by [YamlRenderer].\n  name: String\n\n  render = (prop, renderer) -> if (renderer is YamlRenderer) Pair(name, prop.value) else prop\n}\n\n/// A YAML parser.\n///\n/// YAML values are mapped to Pkl values as follows:\n///\n/// | YAML type   | Pkl type                                                |\n/// | ----------- | ------------------------------------------------------- |\n/// | !!null      | [Null]                                                  |\n/// | !!bool      | [Boolean]                                               |\n/// | !!int       | [Int]                                                   |\n/// | !!float     | [Float]                                                 |\n/// | !!string    | [String]                                                |\n/// | !!seq       | [Listing]                                               |\n/// | !!set       | [Listing]                                               |\n/// | !!map       | [Dynamic] or [Mapping] depending on [Parser.useMapping] |\n/// | !!binary    | [Bytes]                                                 |\n/// | !!timestamp | [String]                                                |\n///\n/// The element order of YAML sequences, sets, and mappings is maintained.\n/// YAML binary values are mapped to their original (base64) string representation.\n/// YAML timestamp values are mapped to their original string representation.\n///\n/// If the parser encounters a YAML type not listed above, it fails with an error.\n///\n/// Known limitations:\n/// - [Merge keys](https://yaml.org/type/merge.html) are not supported.\n/// - Comments are not retained.\nclass Parser {\n  /// The YAML version used by producers of the parsed documents.\n  ///\n  /// - `\"compat\"` - YAML 1.1 _or_ 1.2 (default)\n  /// - `\"1.1\"` - YAML 1.1\n  /// - `\"1.2\"` - YAML 1.2 (Core schema)\n  mode: \"compat\" | \"1.1\" | \"1.2\" = \"compat\"\n\n  /// Determines what the parser produces when parsing YAML `!!map` types.\n  ///\n  /// If [true], they turn into a [Mapping].\n  /// Otherwise, they turn into a [Dynamic].\n  ///\n  /// If [useMapping] is [false], map properties named `default` will be shadowed by the\n  /// built-in [Dynamic.default] property.\n  useMapping: Boolean = false\n\n  /// Value converters to apply to parsed values.\n  ///\n  /// For further information see [PcfRenderer.converters].\n  converters: Mapping<Class | String(!isEmpty), (unknown) -> unknown>\n\n  /// The maximum number of aliases for collection nodes.\n  ///\n  /// Limiting the number of collection aliases prevents\n  /// [billion laughs attacks](https://en.wikipedia.org/wiki/Billion_laughs_attack).\n  maxCollectionAliases: Int32(isPositive) = 50\n\n  /// Parses the single YAML document contained in [source].\n  ///\n  /// Throws if an error occurs during parsing, or if [source] contains multiple YAML documents.\n  ///\n  /// If [source] is a [Resource], the resource URI is included in parse error messages.\n  external function parse(source: Resource | String): Value\n\n  /// Parses all YAML documents contained in [source].\n  ///\n  /// Throws if an error occurs during parsing.\n  ///\n  /// If [source] is a [Resource], the resource URI is included in parse error messages.\n  external function parseAll(source: Resource | String): List<Value>\n}\n\n/// Pkl representation of a YAML value.\ntypealias Value = Null | Boolean | Number | String | Bytes | Listing | Dynamic | Mapping\n"
  }
]